From 8005d3aee5d8ba38a673e1f9f5a6d4e779464eae Mon Sep 17 00:00:00 2001 From: Martin Edenhofer Date: Tue, 27 Feb 2018 09:54:50 +0100 Subject: [PATCH] Added plugin mechanism to configure plugins if a form field in ticket create or ticket zoom has changed (ported group based signature and form dependencies to plugins). --- .../_application_controller.coffee | 38 +---- .../_application_controller_form.coffee | 6 + .../controllers/agent_ticket_create.coffee | 134 ++++++++---------- .../form_hander_signature.coffee | 38 +++++ .../agent_ticket_create/sidebar.coffee | 7 +- .../controllers/customer_ticket_create.coffee | 69 ++++----- .../controllers/organization_profile.coffee | 4 +- .../javascripts/app/controllers/search.coffee | 12 +- .../app/controllers/taskbar_widget.coffee | 4 +- .../app/controllers/ticket_overview.coffee | 6 +- .../app/controllers/ticket_zoom.coffee | 77 ++++++---- .../ticket_zoom/article_new.coffee | 2 +- .../ticket_zoom/attribute_bar.coffee | 4 +- .../form_hander_dependencies.coffee | 32 +++++ .../controllers/ticket_zoom/sidebar.coffee | 1 + .../ticket_zoom/sidebar_idoit.coffee | 4 +- .../ticket_zoom/sidebar_ticket.coffee | 41 +++--- .../ticket_zoom/taskbar_watcher.coffee | 6 +- .../app/controllers/ticket_zoom/title.coffee | 4 +- .../app/controllers/user_profile.coffee | 4 +- .../app/lib/app_post/task_manager.coffee | 16 ++- 21 files changed, 278 insertions(+), 231 deletions(-) create mode 100644 app/assets/javascripts/app/controllers/agent_ticket_create/form_hander_signature.coffee create mode 100644 app/assets/javascripts/app/controllers/ticket_zoom/form_hander_dependencies.coffee diff --git a/app/assets/javascripts/app/controllers/_application_controller.coffee b/app/assets/javascripts/app/controllers/_application_controller.coffee index b1c2ab1d3..b30d0683f 100644 --- a/app/assets/javascripts/app/controllers/_application_controller.coffee +++ b/app/assets/javascripts/app/controllers/_application_controller.coffee @@ -227,7 +227,7 @@ class App.Controller extends Spine.Controller App.Config.set('requested_url', location) if closeTab - App.TaskManager.remove(@task_key) + App.TaskManager.remove(@taskKey) # redirect to login @navigate '#login' @@ -547,32 +547,6 @@ class App.Controller extends Spine.Controller item.created_by = App.User.findNative(item.created_by_id) item - # central method, is getting called on every ticket form change - ticketFormChanges: (params, attribute, attributes, classname, form, ui) => - if @formMeta.dependencies && @formMeta.dependencies[attribute.name] - dependency = @formMeta.dependencies[attribute.name][ parseInt(params[attribute.name]) ] - if !dependency - dependency = @formMeta.dependencies[attribute.name][ params[attribute.name] ] - if dependency - for fieldNameToChange of dependency - filter = [] - if dependency[fieldNameToChange] - filter = dependency[fieldNameToChange] - - # find element to replace - for item in attributes - if item.name is fieldNameToChange - item['filter'] = {} - item['filter'][ fieldNameToChange ] = filter - item.default = params[item.name] - #if !item.default - # delete item['default'] - newElement = ui.formGenItem(item, classname, form) - - # replace new option list - if newElement - form.find('[name="' + fieldNameToChange + '"]').closest('.form-group').replaceWith(newElement) - stopPropagation: (e) -> e.stopPropagation() @@ -592,19 +566,19 @@ class App.Controller extends Spine.Controller @clearDelay(@initLoadingDoneDelay) renderScreenSuccess: (data) -> - App.TaskManager.touch(@task_key) if @task_key + App.TaskManager.touch(@taskKey) if @taskKey (data.el || @).html App.view('generic/error/success')(data) renderScreenError: (data) -> - App.TaskManager.touch(@task_key) if @task_key + App.TaskManager.touch(@taskKey) if @taskKey (data.el || @).html App.view('generic/error/generic')(data) renderScreenNotFound: (data) -> - App.TaskManager.touch(@task_key) if @task_key + App.TaskManager.touch(@taskKey) if @taskKey (data.el || @).html App.view('generic/error/not_found')(data) renderScreenUnauthorized: (data) -> - App.TaskManager.touch(@task_key) if @task_key + App.TaskManager.touch(@taskKey) if @taskKey (data.el || @).html App.view('generic/error/unauthorized')(data) locationVerify: (e) => @@ -901,7 +875,7 @@ class App.UpdateTastbar extends App.Controller update: (genericObject) => # update taskbar with new meta data - App.TaskManager.touch(@task_key) + App.TaskManager.touch(@taskKey) class App.ControllerWidgetPermanent extends App.Controller constructor: (params) -> diff --git a/app/assets/javascripts/app/controllers/_application_controller_form.coffee b/app/assets/javascripts/app/controllers/_application_controller_form.coffee index 91fdcbdb1..540175fce 100644 --- a/app/assets/javascripts/app/controllers/_application_controller_form.coffee +++ b/app/assets/javascripts/app/controllers/_application_controller_form.coffee @@ -6,6 +6,12 @@ class App.ControllerForm extends App.Controller if !@handlers @handlers = [] + + if @handlersConfig + for key, value of @handlersConfig + if value && value.run + @handlers.push value.run + @handlers.push @showHideToggle @handlers.push @requiredMandantoryToggle diff --git a/app/assets/javascripts/app/controllers/agent_ticket_create.coffee b/app/assets/javascripts/app/controllers/agent_ticket_create.coffee index 5b3ec5de1..2d5db5aac 100644 --- a/app/assets/javascripts/app/controllers/agent_ticket_create.coffee +++ b/app/assets/javascripts/app/controllers/agent_ticket_create.coffee @@ -28,9 +28,17 @@ class App.TicketCreate extends App.Controller @bindId = App.TicketCreateCollection.one(load) # rerender view, e. g. on langauge change - @bind 'ui:rerender', => + @bind('ui:rerender', => return if !@authenticateCheck() @render() + ) + + # listen to rerender sidebars + @bind('ui::ticket::sidebarRerender', (data) => + return if data.taskKey isnt @taskKey + return if !@sidebarWidget + @sidebarWidget.render(@params()) + ) release: => App.TicketCreateCollection.unbindById(@bindId) @@ -98,7 +106,7 @@ class App.TicketCreate extends App.Controller @$('.js-note').addClass('hide') @$(".js-note[data-type='#{type}']").removeClass('hide') - App.TaskManager.touch(@task_key) + App.TaskManager.touch(@taskKey) meta: => text = '' @@ -138,7 +146,7 @@ class App.TicketCreate extends App.Controller autosaveStart: => if !@autosaveLast - task = App.TaskManager.get(@task_key) + task = App.TaskManager.get(@taskKey) if task && !task.state task.state = {} @autosaveLast = task.state || {} @@ -149,12 +157,12 @@ class App.TicketCreate extends App.Controller if _.isEmpty(@autosaveLast) || !_.isEmpty(diff) @autosaveLast = data @log 'debug', 'form hash changed', diff, data - App.TaskManager.update(@task_key, { 'state': data }) + App.TaskManager.update(@taskKey, { 'state': data }) # check it task title in task need to be updated if @latestTitle isnt data.title @latestTitle = data.title - App.TaskManager.touch(@task_key) + App.TaskManager.touch(@taskKey) @el.on('change.local blur.local keyup.local paste.local input.local', 'form, .js-textarea', (e) => @delay(update, 250, 'ticket-create-form-update') @@ -173,7 +181,7 @@ class App.TicketCreate extends App.Controller # fetch split ticket data @ajax( - id: "ticket_split#{@task_key}" + id: "ticket_split#{@taskKey}" type: 'GET' url: "#{@apiPath}/ticket_split" data: @@ -214,8 +222,8 @@ class App.TicketCreate extends App.Controller params = @prefilledParams || {} if template && !_.isEmpty(template.options) params = template.options - else if App.TaskManager.get(@task_key) && !_.isEmpty(App.TaskManager.get(@task_key).state) - params = App.TaskManager.get(@task_key).state + else if App.TaskManager.get(@taskKey) && !_.isEmpty(App.TaskManager.get(@taskKey).state) + params = App.TaskManager.get(@taskKey).state if !_.isEmpty(params['form_id']) @formId = params['form_id'] @@ -226,40 +234,6 @@ class App.TicketCreate extends App.Controller form_id: @formId )) - signatureChanges = (params, attribute, attributes, classname, form, ui) => - if attribute && attribute.name is 'group_id' - signature = undefined - if params['group_id'] - group = App.Group.find(params['group_id']) - if group && group.signature_id - signature = App.Signature.find(group.signature_id) - - # check if signature need to be added - type = @$('[name="formSenderType"]').val() - - if signature isnt undefined && signature.body && type is 'email-out' - signatureFinished = App.Utils.replaceTags(signature.body, { user: App.Session.get(), config: App.Config.all() }) - - body = @$('[data-name=body]') - if App.Utils.signatureCheck(body.html() || '', signatureFinished) - - # if signature has changed, in case remove old signature - signature_id = @$('[data-signature=true]').data('signature-id') - if signature_id && signature_id.toString() isnt signature.id.toString() - - @$('[data-signature="true"]').remove() - - if !App.Utils.htmlLastLineEmpty(body) - body.append('

') - signature = $("
#{signatureFinished}
") - App.Utils.htmlStrip(signature) - body.append(signature) - @$('[data-name=body]').replaceWith(body) - - # remove old signature - else - @$('[data-name="body"]').find('[data-signature=true]').remove() - App.Ticket.configure_attributes.push { name: 'cc' display: 'Cc' @@ -277,20 +251,22 @@ class App.TicketCreate extends App.Controller edit: {} } } + + handlers = @Config.get('TicketCreateFormHandler') + new App.ControllerForm( - el: @$('.ticket-form-top') - form_id: @formId - model: App.Ticket - screen: 'create_top' + el: @$('.ticket-form-top') + form_id: @formId + model: App.Ticket + screen: 'create_top' events: 'change [name=customer_id]': @localUserInfo - handlers: [ - @ticketFormChanges, - signatureChanges, - ] - filter: @formMeta.filter - autofocus: true - params: params + handlersConfig: handlers + filter: @formMeta.filter + formMeta: @formMeta + autofocus: true + params: params + taskKey: @taskKey ) new App.ControllerForm( @@ -299,35 +275,34 @@ class App.TicketCreate extends App.Controller model: App.TicketArticle screen: 'create_top' params: params + taskKey: @taskKey ) new App.ControllerForm( - el: @$('.ticket-form-middle') - form_id: @formId - model: App.Ticket - screen: 'create_middle' + el: @$('.ticket-form-middle') + form_id: @formId + model: App.Ticket + screen: 'create_middle' events: 'change [name=customer_id]': @localUserInfo - handlers: [ - @ticketFormChanges, - signatureChanges, - ] - filter: @formMeta.filter - params: params - noFieldset: true + handlersConfig: handlers + filter: @formMeta.filter + formMeta: @formMeta + params: params + noFieldset: true + taskKey: @taskKey ) new App.ControllerForm( - el: @$('.ticket-form-bottom') - form_id: @formId - model: App.Ticket - screen: 'create_bottom' + el: @$('.ticket-form-bottom') + form_id: @formId + model: App.Ticket + screen: 'create_bottom' events: 'change [name=customer_id]': @localUserInfo - handlers: [ - @ticketFormChanges, - signatureChanges, - ] - filter: @formMeta.filter - params: params + handlersConfig: handlers + filter: @formMeta.filter + formMeta: @formMeta + params: params + taskKey: @taskKey ) App.Ticket.configure_attributes.pop() @@ -351,7 +326,7 @@ class App.TicketCreate extends App.Controller el: @sidebar params: @formDefault sidebarState: @sidebarState - task_key: @task_key + taskKey: @taskKey query: @query ) @@ -361,7 +336,7 @@ class App.TicketCreate extends App.Controller App.User.full(@formDefault.customer_id, callback) # update taskbar with new meta data - App.TaskManager.touch(@task_key) + App.TaskManager.touch(@taskKey) localUserInfo: (e) => return if !@sidebarWidget @@ -387,11 +362,14 @@ class App.TicketCreate extends App.Controller e.preventDefault() @navigate '#' + params: => + params = @formParam(@$('.main form')) + submit: (e) => e.preventDefault() # get params - params = @formParam(e.target) + params = @params() # fillup params if !params.title @@ -500,7 +478,7 @@ class App.TicketCreate extends App.Controller timeout: 4000 # close ticket create task - App.TaskManager.remove(ui.task_key) + App.TaskManager.remove(ui.taskKey) # scroll to top ui.scrollTo() diff --git a/app/assets/javascripts/app/controllers/agent_ticket_create/form_hander_signature.coffee b/app/assets/javascripts/app/controllers/agent_ticket_create/form_hander_signature.coffee new file mode 100644 index 000000000..f5c2ad89e --- /dev/null +++ b/app/assets/javascripts/app/controllers/agent_ticket_create/form_hander_signature.coffee @@ -0,0 +1,38 @@ +class TicketCreateFormHanderSignature + + @run: (params, attribute, attributes, classname, form, ui) -> + return if !attribute + return if attribute.name isnt 'group_id' + signature = undefined + if params['group_id'] + group = App.Group.find(params['group_id']) + if group && group.signature_id + signature = App.Signature.find(group.signature_id) + + # check if signature need to be added + type = ui.el.closest('.content').find('[name="formSenderType"]').val() + if signature && signature.body && type is 'email-out' + signatureFinished = App.Utils.replaceTags(signature.body, { user: App.Session.get(), config: App.Config.all() }) + + currentBody = ui.el.closest('.content').find('[data-name=body]') + if !_.isEmpty(currentBody) + if App.Utils.signatureCheck(currentBody.html() || '', signatureFinished) + + # if signature has changed, in case remove old signature + signature_id = ui.el.closest('.content').find('[data-signature=true]').data('signature-id') + if signature_id && signature_id.toString() isnt signature.id.toString() + + ui.el.closest('.content').find('[data-signature="true"]').remove() + + if !App.Utils.htmlLastLineEmpty(currentBody) + currentBody.append('

') + signature = $("
#{signatureFinished}
") + App.Utils.htmlStrip(signature) + currentBody.append(signature) + ui.el.closest('.content').find('[data-name=body]').replaceWith(currentBody) + + # remove old signature + else + ui.el.closest('.content').find('[data-name="body"]').find('[data-signature=true]').remove() + +App.Config.set('200-ticketFormSignature', TicketCreateFormHanderSignature, 'TicketCreateFormHandler') diff --git a/app/assets/javascripts/app/controllers/agent_ticket_create/sidebar.coffee b/app/assets/javascripts/app/controllers/agent_ticket_create/sidebar.coffee index 1d34f85d6..66f811ee3 100644 --- a/app/assets/javascripts/app/controllers/agent_ticket_create/sidebar.coffee +++ b/app/assets/javascripts/app/controllers/agent_ticket_create/sidebar.coffee @@ -23,9 +23,10 @@ class App.TicketCreateSidebar extends App.Controller for key in keys if !@sidebarBackends[key] || !@sidebarBackends[key].reload @sidebarBackends[key] = new sidebarBackends[key]( - params: @params - query: @query - taskGet: @taskGet + params: @params + query: @query + taskGet: @taskGet + taskKey: @taskKey ) else @sidebarBackends[key].reload( diff --git a/app/assets/javascripts/app/controllers/customer_ticket_create.coffee b/app/assets/javascripts/app/controllers/customer_ticket_create.coffee index 8170abf41..559c9da9a 100644 --- a/app/assets/javascripts/app/controllers/customer_ticket_create.coffee +++ b/app/assets/javascripts/app/controllers/customer_ticket_create.coffee @@ -24,6 +24,7 @@ class Index extends App.ControllerContent # set defaults defaults = template['options'] || {} + handlers = @Config.get('TicketCreateFormHandler') groupFilter = App.Config.get('customer_ticket_create_group_ids') if groupFilter @@ -37,48 +38,48 @@ class Index extends App.ControllerContent ) new App.ControllerForm( - el: @el.find('.ticket-form-top') - form_id: @form_id - model: App.Ticket - screen: 'create_top' - handlers: [ - @ticketFormChanges - ] - filter: @formMeta.filter - autofocus: true - params: defaults + el: @el.find('.ticket-form-top') + form_id: @form_id + model: App.Ticket + screen: 'create_top' + handlersConfig: handlers + filter: @formMeta.filter + formMeta: @formMeta + autofocus: true + params: defaults ) new App.ControllerForm( - el: @el.find('.article-form-top') - form_id: @form_id - model: App.TicketArticle - screen: 'create_top' - params: defaults + el: @el.find('.article-form-top') + form_id: @form_id + model: App.TicketArticle + screen: 'create_top' + filter: @formMeta.filter + formMeta: @formMeta + params: defaults + handlersConfig: handlers ) new App.ControllerForm( - el: @el.find('.ticket-form-middle') - form_id: @form_id - model: App.Ticket - screen: 'create_middle' - handlers: [ - @ticketFormChanges - ] - filter: @formMeta.filter - params: defaults - noFieldset: true + el: @el.find('.ticket-form-middle') + form_id: @form_id + model: App.Ticket + screen: 'create_middle' + filter: @formMeta.filter + formMeta: @formMeta + params: defaults + noFieldset: true + handlersConfig: handlers ) if !_.isEmpty(App.Ticket.attributesGet('create_bottom', false, true)) new App.ControllerForm( - el: @el.find('.ticket-form-bottom') - form_id: @form_id - model: App.Ticket - screen: 'create_bottom' - handlers: [ - @ticketFormChanges - ] - filter: @formMeta.filter - params: defaults + el: @el.find('.ticket-form-bottom') + form_id: @form_id + model: App.Ticket + screen: 'create_bottom' + handlersConfig: handlers + filter: @formMeta.filter + formMeta: @formMeta + params: defaults ) new App.ControllerDrox( diff --git a/app/assets/javascripts/app/controllers/organization_profile.coffee b/app/assets/javascripts/app/controllers/organization_profile.coffee index f8363e745..1386f2f8c 100644 --- a/app/assets/javascripts/app/controllers/organization_profile.coffee +++ b/app/assets/javascripts/app/controllers/organization_profile.coffee @@ -48,7 +48,7 @@ class App.OrganizationProfile extends App.Controller new Object( el: elLocal.find('.js-object-container') object_id: organization.id - task_key: @task_key + taskKey: @taskKey ) new ActionRow( @@ -135,7 +135,7 @@ class Object extends App.ObserverController render: (organization) => # update taskbar with new meta data - App.TaskManager.touch(@task_key) + App.TaskManager.touch(@taskKey) # get display data organizationData = [] diff --git a/app/assets/javascripts/app/controllers/search.coffee b/app/assets/javascripts/app/controllers/search.coffee index 67e9c009a..4c66dcf2f 100644 --- a/app/assets/javascripts/app/controllers/search.coffee +++ b/app/assets/javascripts/app/controllers/search.coffee @@ -15,12 +15,12 @@ class App.Search extends App.Controller # check authentication @authenticateCheckRedirect() - current = App.TaskManager.get(@task_key).state + current = App.TaskManager.get(@taskKey).state if current && current.query @query = current.query # update taskbar with new meta data - App.TaskManager.touch(@task_key) + App.TaskManager.touch(@taskKey) @throttledSearch = _.throttle @search, 200 @@ -66,7 +66,7 @@ class App.Search extends App.Controller # nothing render: -> - currentState = App.TaskManager.get(@task_key).state + currentState = App.TaskManager.get(@taskKey).state if !@query if currentState && currentState.query @query = currentState.query @@ -179,12 +179,12 @@ class App.Search extends App.Controller ) updateTask: => - current = App.TaskManager.get(@task_key).state + current = App.TaskManager.get(@taskKey).state return if !current current.query = @query current.model = @model - App.TaskManager.update(@task_key, { state: current }) - App.TaskManager.touch(@task_key) + App.TaskManager.update(@taskKey, { state: current }) + App.TaskManager.touch(@taskKey) updateFilledClass: -> @searchInput.toggleClass 'is-empty', !@searchInput.val() diff --git a/app/assets/javascripts/app/controllers/taskbar_widget.coffee b/app/assets/javascripts/app/controllers/taskbar_widget.coffee index f61dbc6b4..74f33b954 100644 --- a/app/assets/javascripts/app/controllers/taskbar_widget.coffee +++ b/app/assets/javascripts/app/controllers/taskbar_widget.coffee @@ -45,8 +45,8 @@ class App.TaskbarWidget extends App.CollectionController @queue.push ['destroy', tasks] @uIRunner() ) - @bind('taskCollectionOrderSet', (task_keys) => - @collectionOrderSet(task_keys) + @bind('taskCollectionOrderSet', (taskKeys) => + @collectionOrderSet(taskKeys) ) itemGet: (key) -> diff --git a/app/assets/javascripts/app/controllers/ticket_overview.coffee b/app/assets/javascripts/app/controllers/ticket_overview.coffee index 40f9b7a7e..7cf83f63e 100644 --- a/app/assets/javascripts/app/controllers/ticket_overview.coffee +++ b/app/assets/javascripts/app/controllers/ticket_overview.coffee @@ -1249,15 +1249,15 @@ class BulkForm extends App.Controller @html App.view('agent_ticket_view/bulk')() + handlers = @Config.get('TicketZoomFormHandler') + new App.ControllerForm( el: @$('#form-ticket-bulk') model: configure_attributes: @configure_attributes_ticket className: 'create' labelClass: 'input-group-addon' - handlers: [ - @ticketFormChanges - ] + handlersConfig: handlers params: {} filter: @formMeta.filter noFieldset: true diff --git a/app/assets/javascripts/app/controllers/ticket_zoom.coffee b/app/assets/javascripts/app/controllers/ticket_zoom.coffee index fd0c7a1ec..9ffcec817 100644 --- a/app/assets/javascripts/app/controllers/ticket_zoom.coffee +++ b/app/assets/javascripts/app/controllers/ticket_zoom.coffee @@ -59,6 +59,13 @@ class App.TicketZoom extends App.Controller @initSpoolSent = true ) + # listen to rerender sidebars + @bind('ui::ticket::sidebarRerender', (data) => + return if data.taskKey isnt @taskKey + return if !@sidebarWidget + @sidebarWidget.render(@formCurrent()) + ) + fetchMayBe: (data) => if @ticketUpdatedAtLastCall if new Date(data.updated_at).getTime() is new Date(@ticketUpdatedAtLastCall).getTime() @@ -155,7 +162,7 @@ class App.TicketZoom extends App.Controller # notify if ticket changed not by my self if @initFetched if newTicketRaw.updated_by_id isnt @Session.get('id') - App.TaskManager.notify(@task_key) + App.TaskManager.notify(@taskKey) @initFetched = true if !@doNotLog @@ -304,7 +311,7 @@ class App.TicketZoom extends App.Controller @positionPageHeaderStop() muteTask: => - App.TaskManager.mute(@task_key) + App.TaskManager.mute(@taskKey) shortcutNavigationStart: => @articlePager = @@ -391,7 +398,7 @@ class App.TicketZoom extends App.Controller render: (local) => # update taskbar with new meta data - App.TaskManager.touch(@task_key) + App.TaskManager.touch(@taskKey) if !@renderDone @renderDone = true @@ -414,7 +421,7 @@ class App.TicketZoom extends App.Controller object_id: @ticket_id overview_id: @overview_id el: elLocal.find('.js-ticketTitleContainer') - task_key: @task_key + taskKey: @taskKey ) new App.TicketZoomMeta( @@ -427,7 +434,7 @@ class App.TicketZoom extends App.Controller el: elLocal.find('.js-attributeBar') overview_id: @overview_id callback: @submit - task_key: @task_key + taskKey: @taskKey ) #if @shown # @attributeBar.start() @@ -441,7 +448,7 @@ class App.TicketZoom extends App.Controller formMeta: @formMeta form_id: @form_id defaults: @taskGet('article') - task_key: @task_key + taskKey: @taskKey ui: @ ) @@ -469,14 +476,14 @@ class App.TicketZoom extends App.Controller el: elLocal.find('.ticketZoom-header') ) - @sidebar = new App.TicketZoomSidebar( + @sidebarWidget = new App.TicketZoomSidebar( el: elLocal sidebarState: @sidebarState object_id: @ticket_id model: 'Ticket' query: @query taskGet: @taskGet - task_key: @task_key + taskKey: @taskKey formMeta: @formMeta markForm: @markForm tags: @tags @@ -486,12 +493,20 @@ class App.TicketZoom extends App.Controller # check if autolock is needed if @Config.get('ticket_auto_assignment') is true if @ticket.owner_id is 1 && @permissionCheck('ticket.agent') && @ticket.editable('full') - ticket_auto_assignment_selector = @Config.get('ticket_auto_assignment_selector') - if App.Ticket.selector(@ticket, ticket_auto_assignment_selector['condition']) - assign = => - @ticket.owner_id = App.Session.get('id') - @ticket.save() - @delay(assign, 800, "ticket-auto-assign-#{@ticket.id}") + userIdsIgnore = @Config.get('ticket_auto_assignment_user_ids_ignore') || [] + userIgnored = false + currentUserId = App.Session.get('id') + for userIdIgnore in userIdsIgnore + if userIdIgnore.toString() is currentUserId.toString() + userIgnored = true + break + if userIgnored is false + ticket_auto_assignment_selector = @Config.get('ticket_auto_assignment_selector') + if App.Ticket.selector(@ticket, ticket_auto_assignment_selector['condition']) + assign = => + @ticket.owner_id = App.Session.get('id') + @ticket.save() + @delay(assign, 800, "ticket-auto-assign-#{@ticket.id}") # render init content if elLocal @@ -503,8 +518,8 @@ class App.TicketZoom extends App.Controller ticket_article_ids: @ticket_article_ids ) - if @sidebar - @sidebar.reload( + if @sidebarWidget + @sidebarWidget.reload( tags: @tags links: @links ) @@ -747,13 +762,13 @@ class App.TicketZoom extends App.Controller ticket: ticket callback: tagAdd: (tag) => - return if !@sidebar - return if !@sidebar.reload - @sidebar.reload(tagAdd: tag, source: 'macro') + return if !@sidebarWidget + return if !@sidebarWidget.reload + @sidebarWidget.reload(tagAdd: tag, source: 'macro') tagRemove: (tag) => - return if !@sidebar - return if !@sidebar.reload - @sidebar.reload(tagRemove: tag) + return if !@sidebarWidget + return if !@sidebarWidget.reload + @sidebarWidget.reload(tagRemove: tag) ) # set defaults @@ -854,8 +869,8 @@ class App.TicketZoom extends App.Controller # reset form after save @reset() - if @sidebar - @sidebar.commit() + if @sidebarWidget + @sidebarWidget.commit() if taskAction is 'closeNextInOverview' if @overview_id @@ -868,7 +883,7 @@ class App.TicketZoom extends App.Controller next = list.tickets[current_position] if next # close task - App.TaskManager.remove(@task_key) + App.TaskManager.remove(@taskKey) # open task via task manager to get overview information App.TaskManager.execute( @@ -886,7 +901,7 @@ class App.TicketZoom extends App.Controller taskAction = 'closeTab' if taskAction is 'closeTab' - App.TaskManager.remove(@task_key) + App.TaskManager.remove(@taskKey) nextTaskUrl = App.TaskManager.nextTaskUrl() if nextTaskUrl @navigate nextTaskUrl @@ -943,8 +958,8 @@ class App.TicketZoom extends App.Controller @$('.tabsSidebar-tab[data-tab="ticket"]').removeClass('is-changed') taskGet: (area) => - return {} if !App.TaskManager.get(@task_key) - @localTaskData = App.TaskManager.get(@task_key).state || {} + return {} if !App.TaskManager.get(@taskKey) + @localTaskData = App.TaskManager.get(@taskKey).state || {} if area if !@localTaskData[area] @localTaskData[area] = {} @@ -955,18 +970,18 @@ class App.TicketZoom extends App.Controller taskUpdate: (area, data) => @localTaskData[area] = data - App.TaskManager.update(@task_key, { 'state': @localTaskData }) + App.TaskManager.update(@taskKey, { 'state': @localTaskData }) taskUpdateAll: (data) => @localTaskData = data - App.TaskManager.update(@task_key, { 'state': @localTaskData }) + App.TaskManager.update(@taskKey, { 'state': @localTaskData }) # reset task state taskReset: => @localTaskData = ticket: {} article: {} - App.TaskManager.update(@task_key, { 'state': @localTaskData }) + App.TaskManager.update(@taskKey, { 'state': @localTaskData }) class TicketZoomRouter extends App.ControllerPermanent requiredPermission: ['ticket.agent', 'ticket.customer'] diff --git a/app/assets/javascripts/app/controllers/ticket_zoom/article_new.coffee b/app/assets/javascripts/app/controllers/ticket_zoom/article_new.coffee index d8bc066ba..2795d7e46 100644 --- a/app/assets/javascripts/app/controllers/ticket_zoom/article_new.coffee +++ b/app/assets/javascripts/app/controllers/ticket_zoom/article_new.coffee @@ -519,7 +519,7 @@ class App.TicketZoomArticleNew extends App.Controller # detect current signature (use current group_id, if not set, use ticket.group_id) ticketCurrent = App.Ticket.fullLocal(@ticket_id) group_id = ticketCurrent.group_id - task = App.TaskManager.get(@task_key) + task = App.TaskManager.get(@taskKey) if task && task.state && task.state.ticket && task.state.ticket.group_id group_id = task.state.ticket.group_id group = App.Group.find(group_id) diff --git a/app/assets/javascripts/app/controllers/ticket_zoom/attribute_bar.coffee b/app/assets/javascripts/app/controllers/ticket_zoom/attribute_bar.coffee index 6c8de0b6e..a177d46cc 100644 --- a/app/assets/javascripts/app/controllers/ticket_zoom/attribute_bar.coffee +++ b/app/assets/javascripts/app/controllers/ticket_zoom/attribute_bar.coffee @@ -50,8 +50,8 @@ class App.TicketZoomAttributeBar extends App.Controller if @permissionCheck('ticket.agent') @taskbarWatcher = new App.TaskbarWatcher( - task_key: @task_key - el: localeEl.filter('.js-avatars') + taskKey: @taskKey + el: localeEl.filter('.js-avatars') ) @html localeEl diff --git a/app/assets/javascripts/app/controllers/ticket_zoom/form_hander_dependencies.coffee b/app/assets/javascripts/app/controllers/ticket_zoom/form_hander_dependencies.coffee new file mode 100644 index 000000000..6f68852a8 --- /dev/null +++ b/app/assets/javascripts/app/controllers/ticket_zoom/form_hander_dependencies.coffee @@ -0,0 +1,32 @@ +class TicketZoomFormHanderDependencies + + # central method, is getting called on every ticket form change + @run: (params, attribute, attributes, classname, form, ui) -> + return if !ui.formMeta + return if !ui.formMeta.dependencies + return if !ui.formMeta.dependencies[attribute.name] + dependency = ui.formMeta.dependencies[attribute.name][ parseInt(params[attribute.name]) ] + if !dependency + dependency = ui.formMeta.dependencies[attribute.name][ params[attribute.name] ] + if dependency + for fieldNameToChange of dependency + filter = [] + if dependency[fieldNameToChange] + filter = dependency[fieldNameToChange] + + # find element to replace + for item in attributes + if item.name is fieldNameToChange + item['filter'] = {} + item['filter'][ fieldNameToChange ] = filter + item.default = params[item.name] + #if !item.default + # delete item['default'] + newElement = ui.formGenItem(item, classname, form) + + # replace new option list + if newElement + form.find('[name="' + fieldNameToChange + '"]').closest('.form-group').replaceWith(newElement) + +App.Config.set('100-ticketFormChanges', TicketZoomFormHanderDependencies, 'TicketZoomFormHandler') +App.Config.set('100-ticketFormChanges', TicketZoomFormHanderDependencies, 'TicketCreateFormHandler') diff --git a/app/assets/javascripts/app/controllers/ticket_zoom/sidebar.coffee b/app/assets/javascripts/app/controllers/ticket_zoom/sidebar.coffee index 416d16742..78491dbdb 100644 --- a/app/assets/javascripts/app/controllers/ticket_zoom/sidebar.coffee +++ b/app/assets/javascripts/app/controllers/ticket_zoom/sidebar.coffee @@ -25,6 +25,7 @@ class App.TicketZoomSidebar extends App.ObserverController ticket: ticket query: @query taskGet: @taskGet + taskKey: @taskKey formMeta: @formMeta markForm: @markForm tags: @tags diff --git a/app/assets/javascripts/app/controllers/ticket_zoom/sidebar_idoit.coffee b/app/assets/javascripts/app/controllers/ticket_zoom/sidebar_idoit.coffee index a3a8aad7d..931a5d39c 100644 --- a/app/assets/javascripts/app/controllers/ticket_zoom/sidebar_idoit.coffee +++ b/app/assets/javascripts/app/controllers/ticket_zoom/sidebar_idoit.coffee @@ -18,7 +18,7 @@ class SidebarIdoit extends App.Controller changeObjects: => new App.IdoitObjectSelector( - task_key: @task_key + taskKey: @taskKey container: @el.closest('.content') callback: (objectIds, objectSelectorUi) => if @ticket && @ticket.id @@ -54,7 +54,7 @@ class SidebarIdoit extends App.Controller # ajax call to show items @ajax( - id: "idoit-#{@task_key}" + id: "idoit-#{@taskKey}" type: 'POST' url: "#{@apiPath}/integration/idoit" data: JSON.stringify(method: 'cmdb.objects', filter: ids: @objectIds) diff --git a/app/assets/javascripts/app/controllers/ticket_zoom/sidebar_ticket.coffee b/app/assets/javascripts/app/controllers/ticket_zoom/sidebar_ticket.coffee index 76bfeff9e..e25c1e833 100644 --- a/app/assets/javascripts/app/controllers/ticket_zoom/sidebar_ticket.coffee +++ b/app/assets/javascripts/app/controllers/ticket_zoom/sidebar_ticket.coffee @@ -12,6 +12,7 @@ class Edit extends App.ObserverController ticketState = App.TicketState.find(defaults.state_id).name taskState = @taskGet('ticket') + handlers = @Config.get('TicketZoomFormHandler') if !_.isEmpty(taskState) defaults = _.extend(defaults, taskState) @@ -20,29 +21,27 @@ class Edit extends App.ObserverController followUpPossible != 'new_ticket' || @permissionCheck('admin') || @permissionCheck('ticket.agent') new App.ControllerForm( - elReplace: @el - model: App.Ticket - screen: 'edit' - handlers: [ - @ticketFormChanges - ] - filter: @formMeta.filter - params: defaults - isDisabled: !ticket.editable() - #bookmarkable: true + elReplace: @el + model: App.Ticket + screen: 'edit' + handlersConfig: handlers + filter: @formMeta.filter + formMeta: @formMeta + params: defaults + isDisabled: !ticket.editable() + #bookmarkable: true ) else new App.ControllerForm( - elReplace: @el - model: App.Ticket - screen: 'edit' - handlers: [ - @ticketFormChanges - ] - filter: @formMeta.filter - params: defaults - isDisabled: ticket.editable() - #bookmarkable: true + elReplace: @el + model: App.Ticket + screen: 'edit' + handlersConfig: handlers + filter: @formMeta.filter + formMeta: @formMeta + params: defaults + isDisabled: ticket.editable() + #bookmarkable: true ) @markForm(true) @@ -137,7 +136,7 @@ class SidebarTicket extends App.Controller showTicketMerge: => new App.TicketMerge( ticket: @ticket - task_key: @task_key + taskKey: @taskKey container: @el.closest('.content') ) diff --git a/app/assets/javascripts/app/controllers/ticket_zoom/taskbar_watcher.coffee b/app/assets/javascripts/app/controllers/ticket_zoom/taskbar_watcher.coffee index 71962dffa..f1b59e42b 100644 --- a/app/assets/javascripts/app/controllers/ticket_zoom/taskbar_watcher.coffee +++ b/app/assets/javascripts/app/controllers/ticket_zoom/taskbar_watcher.coffee @@ -1,8 +1,8 @@ class App.TaskbarWatcher extends App.Controller constructor: -> super - @subscribeId = App.TaskManager.preferencesSubscribe(@task_key, @render) - App.TaskManager.preferencesTrigger(@task_key) + @subscribeId = App.TaskManager.preferencesSubscribe(@taskKey, @render) + App.TaskManager.preferencesTrigger(@taskKey) release: => return if !@subscribeId @@ -53,7 +53,7 @@ class App.TaskbarWatcher extends App.Controller start: => @intervalId = @interval( => - App.TaskManager.preferencesTrigger(@task_key) + App.TaskManager.preferencesTrigger(@taskKey) 5 * 60000 'ticket-watcher-interval' ) diff --git a/app/assets/javascripts/app/controllers/ticket_zoom/title.coffee b/app/assets/javascripts/app/controllers/ticket_zoom/title.coffee index 3840243c4..0952b6f18 100644 --- a/app/assets/javascripts/app/controllers/ticket_zoom/title.coffee +++ b/app/assets/javascripts/app/controllers/ticket_zoom/title.coffee @@ -28,9 +28,9 @@ class App.TicketZoomTitle extends App.ObserverController ticket.save() - App.TaskManager.mute(@task_key) + App.TaskManager.mute(@taskKey) # update taskbar with new meta data - App.TaskManager.touch(@task_key) + App.TaskManager.touch(@taskKey) App.Event.trigger('overview:fetch') diff --git a/app/assets/javascripts/app/controllers/user_profile.coffee b/app/assets/javascripts/app/controllers/user_profile.coffee index cc734eec4..5e2d7bc85 100644 --- a/app/assets/javascripts/app/controllers/user_profile.coffee +++ b/app/assets/javascripts/app/controllers/user_profile.coffee @@ -55,7 +55,7 @@ class App.UserProfile extends App.Controller new Object( el: elLocal.find('.js-object-container') object_id: user.id - task_key: @task_key + taskKey: @taskKey ) new ActionRow( @@ -153,7 +153,7 @@ class Object extends App.ObserverController render: (user) => # update taskbar with new meta data - App.TaskManager.touch(@task_key) + App.TaskManager.touch(@taskKey) # get display data userData = [] diff --git a/app/assets/javascripts/app/lib/app_post/task_manager.coffee b/app/assets/javascripts/app/lib/app_post/task_manager.coffee index d9b22e9fc..596c18f9c 100644 --- a/app/assets/javascripts/app/lib/app_post/task_manager.coffee +++ b/app/assets/javascripts/app/lib/app_post/task_manager.coffee @@ -281,6 +281,7 @@ class _taskManagerSingleton extends App.Controller @domStore[domKey] = { el: el } params_app['el'] = el params_app['task_key'] = params.key + params_app['taskKey'] = params.key if !params.show params_app['doNotLog'] = 1 @@ -555,18 +556,19 @@ class _taskManagerSingleton extends App.Controller @tasksToUpdate[task.key] = 'inProgress' taskUpdate = App.Taskbar.findByAttribute('key', task.key) if !taskUpdate - taskUpdate = new App.Taskbar + delete ui.tasksToUpdate[@key] + continue taskUpdate.load(task) if taskUpdate.isOnline() ui = @ taskUpdate.save( done: -> - if ui.tasksToUpdate[ @key ] is 'inProgress' - delete ui.tasksToUpdate[ @key ] + if ui.tasksToUpdate[@key] is 'inProgress' + delete ui.tasksToUpdate[@key] fail: -> ui.log 'error', "can't update task", @ - if ui.tasksToUpdate[ @key ] is 'inProgress' - delete ui.tasksToUpdate[ @key ] + if ui.tasksToUpdate[@key] is 'inProgress' + delete ui.tasksToUpdate[@key] ) taskDestroy: (task) -> @@ -584,13 +586,13 @@ class _taskManagerSingleton extends App.Controller # destroy task in backend delete @tasksToUpdate[task.key] + delete @tasksPreferences[task.key] # if task isnt already stored on backend return if !task.id + return if !App.Taskbar.exists(task.id) App.Taskbar.destroy(task.id) - delete @tasksPreferences[task.key] - tasksAutoCleanupDelay: => delay = => @tasksAutoCleanup()