Moved to own ticket sidebar to cover use cases.

This commit is contained in:
Martin Edenhofer 2015-04-05 22:55:44 +02:00
parent 1f08615675
commit 92014a7ded
2 changed files with 286 additions and 216 deletions

View file

@ -7,6 +7,7 @@ class App.TicketZoom extends App.Controller
events: events:
'click .js-submit': 'submit' 'click .js-submit': 'submit'
'click .js-bookmark': 'bookmark' 'click .js-bookmark': 'bookmark'
'click .js-reset': 'reset'
constructor: (params) -> constructor: (params) ->
super super
@ -287,184 +288,6 @@ class App.TicketZoom extends App.Controller
ui: @ ui: @
) )
editTicket = (el) =>
el.append('<form class="edit"></form>')
@editEl = el
reset = (e) =>
e.preventDefault()
@taskReset()
show(@ticket)
new Edit(
ticket: @ticket
el: @el.find('.ticket-edit')
#el: @el.find('.edit')
form_meta: @form_meta
form_id: @form_id
defaults: @taskGet('article')
ui: @
)
show = (ticket) =>
el.find('.edit').html('')
defaults = ticket.attributes()
task_state = @taskGet('ticket')
modelDiff = App.Utils.formDiff( task_state, defaults )
#if @isRole('Customer')
# delete defaults['state_id']
# delete defaults['state']
if !_.isEmpty( task_state )
defaults = _.extend( defaults, task_state )
new App.ControllerForm(
el: el.find('.edit')
model: App.Ticket
screen: 'edit'
params: App.Ticket.find(ticket.id)
handlers: [
@ticketFormChanges
]
filter: @form_meta.filter
params: defaults
#bookmarkable: true
)
#console.log('Ichanges', modelDiff, task_state, ticket.attributes())
#@markFormDiff( modelDiff )
# bind on reset link
@$('.js-reset').on(
'click'
(e) =>
reset(e)
)
@subscribeIdEdit = @ticket.subscribe(show)
show(@ticket)
if !@isRole('Customer')
el.append('<div class="tags"></div>')
new App.WidgetTag(
el: el.find('.tags')
object_type: 'Ticket'
object: @ticket
tags: @tags
)
el.append('<div class="links"></div>')
new App.WidgetLink(
el: el.find('.links')
object_type: 'Ticket'
object: @ticket
links: @links
)
showTicketHistory = =>
new App.TicketHistory(
ticket_id: @ticket.id
container: @el.closest('.content')
)
showTicketMerge = =>
new App.TicketMerge(
ticket: @ticket
task_key: @task_key
container: @el.closest('.content')
)
changeCustomer = (e, el) =>
new App.TicketCustomer(
ticket: @ticket
container: @el.closest('.content')
)
@sidebarItems = [
{
head: 'Ticket'
name: 'ticket'
icon: 'message'
callback: editTicket
}
]
if !@isRole('Customer')
@sidebarItems[0]['actions'] = [
{
name: 'ticket-history'
title: 'History'
callback: showTicketHistory
},
{
name: 'ticket-merge'
title: 'Merge'
callback: showTicketMerge
},
{
title: 'Change Customer'
name: 'customer-change'
callback: changeCustomer
},
]
if !@isRole('Customer')
editCustomer = (e, el) =>
new App.ControllerGenericEdit(
id: @ticket.customer_id
genericObject: 'User'
screen: 'edit'
pageData:
title: 'Users'
object: 'User'
objects: 'Users'
container: @el.closest('.content')
)
showCustomer = (el) =>
new App.WidgetUser(
el: el
user_id: @ticket.customer_id
)
@sidebarItems.push {
head: 'Customer'
name: 'customer'
icon: 'person'
actions: [
{
title: 'Change Customer'
name: 'customer-change'
callback: changeCustomer
},
{
title: 'Edit Customer'
name: 'customer-edit'
callback: editCustomer
},
]
callback: showCustomer
}
if @ticket.organization_id
editOrganization = (e, el) =>
new App.ControllerGenericEdit(
id: @ticket.organization_id,
genericObject: 'Organization'
pageData:
title: 'Organizations'
object: 'Organization'
objects: 'Organizations'
container: @el.closest('.content')
)
showOrganization = (el) =>
new App.WidgetOrganization(
el: el
organization_id: @ticket.organization_id
)
@sidebarItems.push {
head: 'Organization'
name: 'organization'
icon: 'group'
actions: [
{
title: 'Edit Organization'
name: 'organization-edit'
callback: editOrganization
},
]
callback: showOrganization
}
# rerender whole sidebar if customer or organization has changed # rerender whole sidebar if customer or organization has changed
if @ticketLastAttributes.customer_id isnt @ticket.customer_id || @ticketLastAttributes.organization_id isnt @ticket.organization_id if @ticketLastAttributes.customer_id isnt @ticket.customer_id || @ticketLastAttributes.organization_id isnt @ticket.organization_id
new App.WidgetAvatar( new App.WidgetAvatar(
@ -472,10 +295,15 @@ class App.TicketZoom extends App.Controller
user_id: @ticket.customer_id user_id: @ticket.customer_id
size: 50 size: 50
) )
new App.Sidebar( new TicketSidebar(
el: @el.find('.tabsSidebar') el: @el.find('.tabsSidebar')
sidebarState: @sidebarState sidebarState: @sidebarState
items: @sidebarItems ticket: @ticket
taskGet: @taskGet
task_key: @task_key
tags: @tags
links: @links
form_meta: @form_meta
) )
# show article # show article
@ -744,7 +572,7 @@ class App.TicketZoom extends App.Controller
ticket.article = undefined ticket.article = undefined
# reset form after save # reset form after save
@taskReset() @reset()
App.TaskManager.mute( @task_key ) App.TaskManager.mute( @task_key )
@ -754,6 +582,22 @@ class App.TicketZoom extends App.Controller
bookmark: (e) => bookmark: (e) =>
$(e.currentTarget).find('.bookmark.icon').toggleClass('filled') $(e.currentTarget).find('.bookmark.icon').toggleClass('filled')
reset: (e) =>
if e
e.preventDefault()
# reset task
@taskReset()
# reset edit ticket / reset new article
App.Event.trigger('ui::ticket::taskReset', { ticket_id: @ticket.id } )
# hide reset button
@$('.js-reset').addClass('hide')
# remove change flag on tab
@$('.tabsSidebar-tab[data-tab="ticket"]').removeClass('is-changed')
taskGet: (area) => taskGet: (area) =>
return {} if !App.TaskManager.get(@task_key) return {} if !App.TaskManager.get(@task_key)
@localTaskData = App.TaskManager.get(@task_key).state || {} @localTaskData = App.TaskManager.get(@task_key).state || {}
@ -773,26 +617,191 @@ class App.TicketZoom extends App.Controller
@localTaskData = data @localTaskData = data
App.TaskManager.update( @task_key, { 'state': @localTaskData }) App.TaskManager.update( @task_key, { 'state': @localTaskData })
# reset task state
taskReset: => taskReset: =>
# hide reset button
@$('.js-reset').addClass('hide')
# remove change flag on tab
@$('.tabsSidebar-tab[data-tab="ticket"]').removeClass('is-changed')
# reset task state
@localTaskData = @localTaskData =
ticket: {} ticket: {}
article: {} article: {}
App.TaskManager.update( @task_key, { 'state': @localTaskData }) App.TaskManager.update( @task_key, { 'state': @localTaskData })
@bind( class TicketSidebar extends App.Controller
'ui::ticket::taskReset' constructor: ->
(data) => super
if data.ticket_id is @ticket.id ticket = App.Ticket.fullLocal( @ticket.id )
@taskReset() @subscribeId = ticket.subscribe(@render)
) @render(ticket)
release: =>
App.Ticket.unsubscribe( @subscribeId )
render: (ticket) =>
editTicket = (el) =>
el.append('<form class="edit"></form>')
@editEl = el
show = (ticket) =>
el.find('.edit').html('')
defaults = ticket.attributes()
task_state = @taskGet('ticket')
modelDiff = App.Utils.formDiff( task_state, defaults )
#if @isRole('Customer')
# delete defaults['state_id']
# delete defaults['state']
if !_.isEmpty( task_state )
defaults = _.extend( defaults, task_state )
new App.ControllerForm(
el: el.find('.edit')
model: App.Ticket
screen: 'edit'
params: App.Ticket.find(ticket.id)
handlers: [
@ticketFormChanges
]
filter: @form_meta.filter
params: defaults
#bookmarkable: true
)
#console.log('Ichanges', modelDiff, task_state, ticket.attributes())
#@markFormDiff( modelDiff )
show(ticket)
@bind(
'ui::ticket::taskReset'
(data) =>
if data.ticket_id is ticket.id
show(ticket)
)
if !@isRole('Customer')
el.append('<div class="tags"></div>')
new App.WidgetTag(
el: el.find('.tags')
object_type: 'Ticket'
object: ticket
tags: @tags
)
el.append('<div class="links"></div>')
new App.WidgetLink(
el: el.find('.links')
object_type: 'Ticket'
object: ticket
links: @links
)
showTicketHistory = =>
new App.TicketHistory(
ticket_id: ticket.id
container: @el.closest('.content')
)
showTicketMerge = =>
new App.TicketMerge(
ticket: ticket
task_key: @task_key
container: @el.closest('.content')
)
changeCustomer = (e, el) =>
new App.TicketCustomer(
ticket: ticket
container: @el.closest('.content')
)
@sidebarItems = [
{
head: 'Ticket'
name: 'ticket'
icon: 'message'
callback: editTicket
}
]
if !@isRole('Customer')
@sidebarItems[0]['actions'] = [
{
name: 'ticket-history'
title: 'History'
callback: showTicketHistory
},
{
name: 'ticket-merge'
title: 'Merge'
callback: showTicketMerge
},
{
title: 'Change Customer'
name: 'customer-change'
callback: changeCustomer
},
]
if !@isRole('Customer')
editCustomer = (e, el) =>
new App.ControllerGenericEdit(
id: ticket.customer_id
genericObject: 'User'
screen: 'edit'
pageData:
title: 'Users'
object: 'User'
objects: 'Users'
container: @el.closest('.content')
)
showCustomer = (el) =>
new App.WidgetUser(
el: el
user_id: ticket.customer_id
)
@sidebarItems.push {
head: 'Customer'
name: 'customer'
icon: 'person'
actions: [
{
title: 'Change Customer'
name: 'customer-change'
callback: changeCustomer
},
{
title: 'Edit Customer'
name: 'customer-edit'
callback: editCustomer
},
]
callback: showCustomer
}
if ticket.organization_id
editOrganization = (e, el) =>
new App.ControllerGenericEdit(
id: ticket.organization_id,
genericObject: 'Organization'
pageData:
title: 'Organizations'
object: 'Organization'
objects: 'Organizations'
container: @el.closest('.content')
)
showOrganization = (el) =>
new App.WidgetOrganization(
el: el
organization_id: ticket.organization_id
)
@sidebarItems.push {
head: 'Organization'
name: 'organization'
icon: 'group'
actions: [
{
title: 'Edit Organization'
name: 'organization-edit'
callback: editOrganization
},
]
callback: showOrganization
}
new App.Sidebar(
el: @el
sidebarState: @sidebarState
items: @sidebarItems
)
class TicketTitle extends App.Controller class TicketTitle extends App.Controller
events: events:
@ -954,8 +963,6 @@ class Edit extends App.Controller
#'.recipient-list .list-arrow': 'recipientListArrow' #'.recipient-list .list-arrow': 'recipientListArrow'
events: events:
#'click .submit': 'update'
'click [data-type="reset"]': 'reset'
'click .visibility-toggle': 'toggleVisibility' 'click .visibility-toggle': 'toggleVisibility'
'click .pop-selectable': 'selectArticleType' 'click .pop-selectable': 'selectArticleType'
'click .pop-selected': 'showSelectableArticleType' 'click .pop-selected': 'showSelectableArticleType'
@ -1016,7 +1023,6 @@ class Edit extends App.Controller
open: 148 open: 148
closed: 20 closed: 20
@dragEventCounter = 0 @dragEventCounter = 0
@attachments = [] @attachments = []
@ -1042,6 +1048,13 @@ class Edit extends App.Controller
@setArticleType( 'email' ) @setArticleType( 'email' )
) )
@bind(
'ui::ticket::taskReset'
(data) =>
if data.ticket_id is @ticket.id
@render()
)
isIE10: -> isIE10: ->
Function('/*@cc_on return document.documentMode===10@*/')() Function('/*@cc_on return document.documentMode===10@*/')()
@ -1428,15 +1441,6 @@ class Edit extends App.Controller
element.empty() element.empty()
) )
reset: (e) =>
e.preventDefault()
# reset task
App.Event.trigger('ui::ticket::taskReset', { ticket_id: @ticket.id } )
# rerender edit area
@render()
class ArticleView extends App.Controller class ArticleView extends App.Controller
constructor: -> constructor: ->
super super

View file

@ -17,7 +17,7 @@ class AgentTicketActionLevel6Test < TestCase
# #
# create new ticket with no attachment, attachment check should pop up # create new ticket with no attachment, attachment check should pop up
ticket1 = ticket_create( ticket_create(
:data => { :data => {
:customer => 'nico', :customer => 'nico',
:group => 'Users', :group => 'Users',
@ -50,8 +50,8 @@ class AgentTicketActionLevel6Test < TestCase
# check if ticket is shown # check if ticket is shown
location_check( :url => '#ticket/zoom/' ) location_check( :url => '#ticket/zoom/' )
sleep 2
ticket_number = @browser.find_elements( { :css => '.active .page-header .ticket-number' } )[0].text
# #
# attachment checks - update ticket # attachment checks - update ticket
@ -112,24 +112,90 @@ class AgentTicketActionLevel6Test < TestCase
# ticket customer change checks # ticket customer change checks
# #
# update customer, check if new customer is shown in side bar # use current session
browser1 = @browser
browser2 = browser_instance
login(
:browser => browser2,
:username => 'master@example.com',
:password => 'test',
:url => browser_url,
)
tasks_close_all(
:browser => browser2,
)
random = 'ticket-actions-6-test-' + rand(999999).to_s
user_email = random + '@example.com'
user_create(
:browser => browser2,
:data => {
:firstname => 'Action6 Firstname' + random,
:lastname => 'Action6 Lastname' + random,
:email => user_email,
:password => 'some-pass',
},
)
# update customer, check if new customer is shown in side bar
ticket_open_by_search(
:browser => browser2,
:number => ticket_number,
)
ticket_update(
:browser => browser2,
:data => {
:customer => user_email,
},
:do_not_submit => true,
)
# check if customer has changed in second browser # check if customer has changed in second browser
click( :browser => browser1, :css => '.active .tabsSidebar-tab[data-tab="customer"]')
watch_for(
:browser => browser1,
:css => '.active .tabsSidebar',
:value => user_email,
)
#
# modify customer
#
# modify customer
click( :browser => browser1, :css => '.active .sidebar[data-tab="customer"] .js-actions .dropdown-toggle')
click( :browser => browser1, :css => '.active .sidebar[data-tab="customer"] .js-actions [data-type="customer-edit"]')
sleep 2
set( :browser => browser1, :css => '.modal [name="address"]', :value => 'some new address' )
click( :browser => browser1, :css => '.modal .js-submit')
# verify is customer has chnaged other browser too
click( :browser => browser2, :css => '.active .tabsSidebar-tab[data-tab="customer"]')
watch_for(
:browser => browser2,
:css => '.active .sidebar[data-tab="customer"]',
:value => 'some new address',
)
# #
# ticket customer organization change checks # ticket customer organization change checks
# #
# change org of customer, check if org is shown in sidebar # change org of customer, check if org is shown in sidebar
click( :browser => browser1, :css => '.active .sidebar[data-tab="customer"] .js-actions .dropdown-toggle')
click( :browser => browser1, :css => '.active .sidebar[data-tab="customer"] .js-actions [data-type="customer-edit"]')
sleep 2
select( :browser => browser1, :css => '.modal [name="organization_id"]', :value => 'Zammad Foundation' )
click( :browser => browser1, :css => '.modal .js-submit')
# check if org has changed in second browser # check if org has changed in second browser
sleep 3
click( :browser => browser2, :css => '.active .tabsSidebar-tab[data-tab="organization"]')
watch_for(
:browser => browser2,
:css => '.active .sidebar[data-tab="organization"]',
:value => 'Zammad Foundation',
)
# #
# form change/reset checks # form change/reset checks