diff --git a/app/assets/javascripts/app/controllers/_application_controller.js.coffee b/app/assets/javascripts/app/controllers/_application_controller.js.coffee index 3aa434c09..8dfc6e2c5 100644 --- a/app/assets/javascripts/app/controllers/_application_controller.js.coffee +++ b/app/assets/javascripts/app/controllers/_application_controller.js.coffee @@ -145,11 +145,11 @@ class App.Controller extends Spine.Controller all_attributes = [ { name: 'number', link: true, title: 'title' }, { name: 'title', link: true, title: 'title' }, - { name: 'customer', class: 'user-data', data: { id: true } }, + { name: 'customer', class: 'user-popover', data: { id: true } }, { name: 'ticket_state', translate: true, title: true }, { name: 'ticket_priority', translate: true, title: true }, { name: 'group', title: 'group' }, - { name: 'owner', class: 'user-data', data: { id: true } }, + { name: 'owner', class: 'user-popover', data: { id: true } }, { name: 'created_at', callback: @frontendTime }, { name: 'last_contact', callback: @frontendTime }, { name: 'last_contact_agent', callback: @frontendTime }, @@ -191,7 +191,7 @@ class App.Controller extends Spine.Controller if diff > 0 escalated = '-' if diff >= 0 - style = "class=\"label label-important\"" + style = "class=\"label label-danger\"" else if diff > -60 * 60 style = "class=\"label label-warning\"" else @@ -244,7 +244,7 @@ class App.Controller extends Spine.Controller el.unbind() # start customer info controller - new App.UserInfo( + new App.WidgetUser( el: el user_id: data.user_id callback: data.callback @@ -282,26 +282,26 @@ class App.Controller extends Spine.Controller ticketPopups: (position = 'right') -> # remove old popovers - $('.popover-inner').parent().remove() + $('.popover').remove() # show ticket popup ui = @ - $('.ticket-data').popover( - trigger: 'hover' - html: true - delay: { show: 500, hide: 1200 } -# placement: 'bottom' - placement: position + @el.find('.ticket-popover').popover( + trigger: 'hover' + container: 'body' + html: true + delay: { show: 500, hide: 1200 } + placement: position title: -> ticket_id = $(@).data('id') ticket = App.Ticket.retrieve( ticket_id ) - ticket.title + App.i18n.escape( ticket.title ) content: -> ticket_id = $(@).data('id') ticket = App.Ticket.retrieve( ticket_id ) ticket.humanTime = ui.humanTime(ticket.created_at) # insert data - App.view('ticket_info_small')( + App.view('popover/ticket')( ticket: ticket, ) ) @@ -309,19 +309,19 @@ class App.Controller extends Spine.Controller userPopups: (position = 'right') -> # remove old popovers - $('.popover-inner').parent().remove() + $('.popover').remove() # show user popup - $('.user-data').popover( - trigger: 'hover' - html: true - delay: { show: 500, hide: 1200 } -# placement: 'bottom' - placement: position + @el.find('.user-popover').popover( + trigger: 'hover' + container: 'body' + html: true + delay: { show: 500, hide: 1200 } + placement: position title: -> user_id = $(@).data('id') user = App.User.find( user_id ) - user.displayName() + App.i18n.escape( user.displayName() ) content: -> user_id = $(@).data('id') user = App.User.find( user_id ) @@ -346,7 +346,7 @@ class App.Controller extends Spine.Controller data.push item # insert data - App.view('user_info_small')( + App.view('popover/user')( user: user, data: data, ) @@ -355,24 +355,24 @@ class App.Controller extends Spine.Controller organizationPopups: (position = 'right') -> # remove old popovers - $('.popover-inner').parent().remove() + $('.popover').remove() # show organization popup - $('.organization-data').popover( - trigger: 'hover' - html: true - delay: { show: 500, hide: 1200 } -# placement: 'bottom' - placement: position + @el.find('.organization-popover').popover( + trigger: 'hover' + container: 'body' + html: true + delay: { show: 500, hide: 1200 } + placement: position title: -> organization_id = $(@).data('id') organization = App.Organization.find( organization_id ) - organization.name + App.i18n.escape( organization.name ) content: -> organization_id = $(@).data('id') organization = App.Organization.find( organization_id ) # insert data - App.view('organization_info_small')( + App.view('popover/organization')( organization: organization, ) ) @@ -380,7 +380,7 @@ class App.Controller extends Spine.Controller userTicketPopups: (data) -> # remove old popovers - $('.popover-inner').parent().remove() + $('.popover').remove() # get data tickets = {} @@ -400,11 +400,12 @@ class App.Controller extends Spine.Controller # show user popup controller = @ - $(data.selector).popover( - trigger: 'hover' - html: true - delay: { show: 500, hide: 5200 } - placement: data.position + @el.find(data.selector).popover( + trigger: 'hover' + container: 'body' + html: true + delay: { show: 500, hide: 5200 } + placement: data.position title: -> $(@).find('[title="*"]').val() @@ -417,7 +418,7 @@ class App.Controller extends Spine.Controller ticket.humanTime = controller.humanTime(ticket.created_at) # insert data - App.view('user_ticket_info_small')( + App.view('popover/user_ticket_list')( tickets: data, ) ) @@ -437,7 +438,7 @@ class App.ControllerContent extends App.Controller $('#content_permanent').hide() class App.ControllerModal extends App.Controller - className: 'modal hide fade', + className: 'modal fade', tag: 'div', events: @@ -484,11 +485,11 @@ class App.ControllerModal extends App.Controller data = $.extend({}, defaults, params) @el.modal(data) - @el.bind('hidden', => + @el.bind('hidden.bs.modal', => # navigate back to home page - if @pageData && @pageData.home - @navigate @pageData.home +# if @pageData && @pageData.home +# @navigate @pageData.home # navigate back if params && params.navigateBack diff --git a/app/assets/javascripts/app/controllers/_application_controller_form.js.coffee b/app/assets/javascripts/app/controllers/_application_controller_form.js.coffee index 937b9b719..99ed2711d 100644 --- a/app/assets/javascripts/app/controllers/_application_controller_form.js.coffee +++ b/app/assets/javascripts/app/controllers/_application_controller_form.js.coffee @@ -362,10 +362,10 @@ class App.ControllerForm extends App.Controller params: form_id: @form_id text: - uploadButton: '' + uploadButton: '' template: '
' + '
{dragZoneText}
' + - '
{uploadButtonText}
' + + '
{uploadButtonText}
' + '' + '
', classes: @@ -383,7 +383,8 @@ class App.ControllerForm extends App.Controller container = document.getElementById( attribute.id + "_tagsinput" ) if reorder $('#' + attribute.id + "_tagsinput" ).height( 20 ) - height = container.scrollHeight + height = container.scrollHeight || 45 + console.log('siteUpdate', height) $('#' + attribute.id + "_tagsinput" ).height( height - 16 ) onAddTag = => @@ -393,10 +394,9 @@ class App.ControllerForm extends App.Controller siteUpdate(true) $('#' + attribute.id + '_tagsinput').remove() - w = $('#' + attribute.id).width() h = $('#' + attribute.id).height() $('#' + attribute.id).tagsInput( - width: w + 'px' + width: '100%' # height: (h + 30 )+ 'px' onAddTag: onAddTag onRemoveTag: onRemoveTag @@ -1051,14 +1051,14 @@ class App.ControllerForm extends App.Controller if !_.isArray(name) name = [name] for key in name - el.find('[name="' + key + '"]').parents('.control-group').removeClass('hide') + el.find('[name="' + key + '"]').parents('.form-group').removeClass('hide') el.find('[name="' + key + '"]').removeClass('is-hidden') _hide: (name, el = @el) -> if !_.isArray(name) name = [name] for key in name - el.find('[name="' + key + '"]').parents('.control-group').addClass('hide') + el.find('[name="' + key + '"]').parents('.form-group').addClass('hide') el.find('[name="' + key + '"]').addClass('is-hidden') # sort attribute.options @@ -1347,18 +1347,18 @@ class App.ControllerForm extends App.Controller @validate: (data) -> # remove all errors - $(data.form).parents().find('.error').removeClass('error') + $(data.form).parents().find('.has-error').removeClass('has-error') $(data.form).parents().find('.help-inline').html('') # show new errors for key, msg of data.errors - $(data.form).parents().find('[name*="' + key + '"]').parents('div .control-group').addClass('error') + $(data.form).parents().find('[name*="' + key + '"]').parents('div .form-group').addClass('has-error') $(data.form).parents().find('[name*="' + key + '"]').parent().find('.help-inline').html(msg) # set autofocus - $(data.form).parents().find('.error').find('input, textarea').first().focus() + $(data.form).parents().find('.has-error').find('input, textarea').first().focus() # # enable form again -# if $(data.form).parents().find('.error').html() +# if $(data.form).parents().find('.has-error').html() # @formEnable(data.form) diff --git a/app/assets/javascripts/app/controllers/_application_controller_generic.js.coffee b/app/assets/javascripts/app/controllers/_application_controller_generic.js.coffee index 8acc101d1..e51b9a2b5 100644 --- a/app/assets/javascripts/app/controllers/_application_controller_generic.js.coffee +++ b/app/assets/javascripts/app/controllers/_application_controller_generic.js.coffee @@ -199,6 +199,26 @@ class DestroyConfirm extends App.ControllerModal @modalHide() @item.destroy() +class App.ControllerDrox extends App.Controller + constructor: (params) -> + super + + if params.data && ( params.data.text || params.data.html ) + @inline(params.data) + + inline: (data) -> + @html App.view('generic/drox')(data) + if data.text + @el.find('.drox-body').text(data.text) + if data.html + @el.find('.drox-body').html(data.html) + + template: (data) -> + drox = $( App.view('generic/drox')(data) ) + content = App.view(data.file)(data.params) + drox.find('.drox-body').append(content) + drox + class App.ControllerLevel2 extends App.ControllerContent events: 'click [data-toggle="tabnav"]': 'toggle', @@ -261,3 +281,66 @@ class App.ControllerTabs extends App.Controller new tab.controller( params ) @el.find('.tab-content .tab-pane:first').addClass('active') + +class App.ControllerNavSidbar extends App.ControllerContent + constructor: (params) -> + super + + # get groups + groups = App.Config.get(@configKey) + groupsUnsorted = [] + for key, value of groups + if !value.controller + groupsUnsorted.push value + + @groupsSorted = _.sortBy( groupsUnsorted, (item) -> return item.prio ) + + # get items of group + for group in @groupsSorted + items = App.Config.get(@configKey) + itemsUnsorted = [] + for key, value of items + if value.controller + if value.parent is group.target + itemsUnsorted.push value + + group.items = _.sortBy( itemsUnsorted, (item) -> return item.prio ) + + + # set active item + selectedItem = undefined + for group in @groupsSorted + if group.items + for item in group.items + if !@target && !selectedItem + item.active = true + selectedItem = item + else if @target && item.target is window.location.hash + item.active = true + selectedItem = item + else + item.active = false + + @render(selectedItem) + + if selectedItem + new selectedItem.controller( + el: @el.find('.main') + ) + + @bind( + 'ui:rerender' + => + @render(selectedItem, true) + ) + + render: (selectedItem, force) -> + if !$( '.' + @configKey )[0] || force + @html App.view('generic/navbar_l2')( + groups: @groupsSorted + className: @configKey + ) + if selectedItem + @el.find('li').removeClass('active') + @el.find('a[href="' + selectedItem.target + '"]').parent().addClass('active') + diff --git a/app/assets/javascripts/app/controllers/_application_controller_table.js.coffee b/app/assets/javascripts/app/controllers/_application_controller_table.js.coffee index b9e4dc504..3c1c9ff48 100644 --- a/app/assets/javascripts/app/controllers/_application_controller_table.js.coffee +++ b/app/assets/javascripts/app/controllers/_application_controller_table.js.coffee @@ -22,11 +22,11 @@ class App.ControllerTable extends App.Controller overview_extended: [ { name: 'number', link: true }, { name: 'title', link: true }, - { name: 'customer', class: 'user-data', data: { id: true } }, + { name: 'customer', class: 'user-popover', data: { id: true } }, { name: 'ticket_state', translate: true }, { name: 'ticket_priority', translate: true }, { name: 'group' }, - { name: 'owner', class: 'user-data', data: { id: true } }, + { name: 'owner', class: 'user-popover', data: { id: true } }, { name: 'created_at', callback: @frontendTime }, { name: 'last_contact', callback: @frontendTime }, { name: 'last_contact_agent', callback: @frontendTime }, @@ -127,10 +127,10 @@ class App.ControllerTable extends App.Controller # enable checkbox bulk selection if data.checkbox table.delegate('[name="bulk_all"]', 'click', (e) -> - if $(e.target).attr('checked') - $(e.target).parents().find('[name="bulk"]').attr( 'checked', true ); + if $(e.target).prop('checked') + $(e.target).parents().find('[name="bulk"]').prop( 'checked', true ); else - $(e.target).parents().find('[name="bulk"]').attr( 'checked', false ); + $(e.target).parents().find('[name="bulk"]').prop( 'checked', false ); ) return table diff --git a/app/assets/javascripts/app/controllers/_channel/facebook.js.coffee b/app/assets/javascripts/app/controllers/_channel/facebook.js.coffee index 27b59b39f..4041a968a 100644 --- a/app/assets/javascripts/app/controllers/_channel/facebook.js.coffee +++ b/app/assets/javascripts/app/controllers/_channel/facebook.js.coffee @@ -1,7 +1,4 @@ class App.ChannelFacebook extends App.Controller - events: - 'click [data-toggle="tabnav"]': 'toggle', - constructor: -> super diff --git a/app/assets/javascripts/app/controllers/_channel/twitter.js.coffee b/app/assets/javascripts/app/controllers/_channel/twitter.js.coffee index 363b2c7c0..b26961453 100644 --- a/app/assets/javascripts/app/controllers/_channel/twitter.js.coffee +++ b/app/assets/javascripts/app/controllers/_channel/twitter.js.coffee @@ -1,7 +1,4 @@ class App.ChannelTwitter extends App.Controller - events: - 'click [data-toggle="tabnav"]': 'toggle', - constructor: -> super @@ -9,8 +6,6 @@ class App.ChannelTwitter extends App.Controller @render() render: -> - @html App.view('channel/twitter')( head: 'some header' ) - diff --git a/app/assets/javascripts/app/controllers/_channel/web.js.coffee b/app/assets/javascripts/app/controllers/_channel/web.js.coffee index 4311d394b..b40c97ea4 100644 --- a/app/assets/javascripts/app/controllers/_channel/web.js.coffee +++ b/app/assets/javascripts/app/controllers/_channel/web.js.coffee @@ -10,4 +10,4 @@ class App.ChannelWeb extends App.ControllerTabs }, ] - @render() + @render() diff --git a/app/assets/javascripts/app/controllers/_dashboard/activity_stream.js.coffee b/app/assets/javascripts/app/controllers/_dashboard/activity_stream.js.coffee index 167e149b0..cf1d6c656 100644 --- a/app/assets/javascripts/app/controllers/_dashboard/activity_stream.js.coffee +++ b/app/assets/javascripts/app/controllers/_dashboard/activity_stream.js.coffee @@ -21,7 +21,7 @@ class App.DashboardActivityStream extends App.Controller type: 'GET' url: @apiPath + '/activity_stream' data: { - limit: 8 + limit: @limit || 8 } processData: true success: (data) => @@ -40,21 +40,23 @@ class App.DashboardActivityStream extends App.Controller render: (items) -> for item in items - if item.history_object is 'Ticket' - ticket = App.Ticket.find( item.o_id ) - item.link = '#ticket/zoom/' + ticket.id - item.title = ticket.title - item.type = 'Ticket' - item.updated_by_id = ticket.updated_by_id - item.updated_by = App.User.find( ticket.updated_by_id ) - else if item.history_object is 'Ticket::Article' + + item.link = '' + item.title = '???' + + if item.object is 'Ticket::Article' + item.object = 'Article' article = App.TicketArticle.find( item.o_id ) ticket = App.Ticket.find( article.ticket_id ) - item.link = '#ticket/zoom/' + ticket.id + '/' + article.id item.title = article.subject || ticket.title - item.type = 'Article' - item.updated_by_id = article.updated_by_id - item.updated_by = App.User.find( article.updated_by_id ) + item.link = article.uiUrl() + + if App[item.object] + object = App[item.object].find( item.o_id ) + item.link = object.uiUrl() + item.title = object.displayName() + + item.created_by = App.User.find( item.created_by_id ) html = App.view('dashboard/activity_stream')( head: 'Activity Stream', @@ -65,5 +67,7 @@ class App.DashboardActivityStream extends App.Controller @html html # start user popups - @userPopups('left') + @userPopups('right') + # update time + @frontendTimeUpdate() diff --git a/app/assets/javascripts/app/controllers/_default_navbar.js.coffee b/app/assets/javascripts/app/controllers/_default_navbar.js.coffee index 4c80707cd..317f4e168 100644 --- a/app/assets/javascripts/app/controllers/_default_navbar.js.coffee +++ b/app/assets/javascripts/app/controllers/_default_navbar.js.coffee @@ -9,6 +9,5 @@ App.Config.set( 'User', { role: [ 'Agent', 'Customer' ] }, 'NavBarRight' ) -App.Config.set( 'Admin', { prio: 10000, parent: '', name: 'Manage', target: '#admin', role: ['Admin'] }, 'NavBar' ) -App.Config.set( 'Setting', { prio: 20000, parent: '', name: 'Settings', target: '#settings', role: ['Admin'] }, 'NavBar' ) +App.Config.set( 'Admin', { prio: 10000, parent: '', name: 'Admin', target: '#manage', role: ['Admin'] }, 'NavBar' ) App.Config.set( 'Misc', { prio: 90000, parent: '', name: 'Tools', target: '#tools', child: true }, 'NavBar' ) diff --git a/app/assets/javascripts/app/controllers/_profile/language.js.coffee b/app/assets/javascripts/app/controllers/_profile/language.js.coffee index 836f2f474..ee378377f 100644 --- a/app/assets/javascripts/app/controllers/_profile/language.js.coffee +++ b/app/assets/javascripts/app/controllers/_profile/language.js.coffee @@ -1,4 +1,4 @@ -class App.ProfileLanguage extends App.Controller +class Index extends App.Controller events: 'submit form': 'update' @@ -66,3 +66,6 @@ class App.ProfileLanguage extends App.Controller type: 'error' msg: App.i18n.translateContent( data.message ) ) + +App.Config.set( 'Language', { prio: 1000, name: 'Language', parent: '#profile', target: '#profile/language', controller: Index }, 'NavBarProfile' ) + diff --git a/app/assets/javascripts/app/controllers/_profile/linked_accounts.js.coffee b/app/assets/javascripts/app/controllers/_profile/linked_accounts.js.coffee index 9b7447aa5..942cfccb1 100644 --- a/app/assets/javascripts/app/controllers/_profile/linked_accounts.js.coffee +++ b/app/assets/javascripts/app/controllers/_profile/linked_accounts.js.coffee @@ -1,4 +1,4 @@ -class App.ProfileLinkedAccounts extends App.Controller +class Index extends App.Controller events: 'click [data-type="remove"]': 'remove' @@ -75,3 +75,6 @@ class App.ProfileLinkedAccounts extends App.Controller type: 'error' msg: App.i18n.translateContent( data.message ) ) + +App.Config.set( 'LinkedAccounts', { prio: 3000, name: 'Linked Accunts', parent: '#profile', target: '#profile/linked', controller: Index }, 'NavBarProfile' ) + diff --git a/app/assets/javascripts/app/controllers/_profile/password.js.coffee b/app/assets/javascripts/app/controllers/_profile/password.js.coffee index 38b706c5e..abafaab68 100644 --- a/app/assets/javascripts/app/controllers/_profile/password.js.coffee +++ b/app/assets/javascripts/app/controllers/_profile/password.js.coffee @@ -1,4 +1,4 @@ -class App.ProfilePassword extends App.Controller +class Index extends App.Controller events: 'submit form': 'update' @@ -59,3 +59,6 @@ class App.ProfilePassword extends App.Controller type: 'error' msg: App.i18n.translateContent( data.message ) ) + +App.Config.set( 'Password', { prio: 2000, name: 'Password', parent: '#profile', target: '#profile/password', controller: Index }, 'NavBarProfile' ) + diff --git a/app/assets/javascripts/app/controllers/_settings/area.js.coffee b/app/assets/javascripts/app/controllers/_settings/area.js.coffee index 1eee559b2..04bbf6352 100644 --- a/app/assets/javascripts/app/controllers/_settings/area.js.coffee +++ b/app/assets/javascripts/app/controllers/_settings/area.js.coffee @@ -48,7 +48,7 @@ class App.SettingsAreaItem extends App.Controller ) new App.ControllerForm( - el: @el.find('#form-item'), + el: @el.find('.form-item'), model: { configure_attributes: @configure_attributes, className: '' }, autofocus: false, ) @@ -73,6 +73,7 @@ class App.SettingsAreaItem extends App.Controller } @setting['state'] = state + ui = @ @setting.save( success: => @@ -81,7 +82,7 @@ class App.SettingsAreaItem extends App.Controller msg: App.i18n.translateContent('Update successful!') timeout: 1500 } - + ui.render() # login check - App.Auth.loginCheck() +# App.Auth.loginCheck() ) diff --git a/app/assets/javascripts/app/controllers/agent_ticket_create.js.coffee b/app/assets/javascripts/app/controllers/agent_ticket_create.js.coffee index 93498db1a..63d89fbd1 100644 --- a/app/assets/javascripts/app/controllers/agent_ticket_create.js.coffee +++ b/app/assets/javascripts/app/controllers/agent_ticket_create.js.coffee @@ -191,15 +191,15 @@ class App.TicketCreate extends App.Controller @el.find('textarea').trigger('change') # show template UI - new App.TemplateUI( - el: @el.find('[data-id="ticket_template"]') + new App.WidgetTemplate( + el: @el.find('.ticket_template') template_id: template['id'] ) @formDefault = @formParam( @el.find('.ticket-create') ) # show text module UI - @textModule = new App.TextModuleUI( + @textModule = new App.WidgetTextModule( el: @el.find('.ticket-create').find('textarea') ) @@ -217,7 +217,7 @@ class App.TicketCreate extends App.Controller @userInfo( user_id: params.customer_id - el: @el.find('[data-id="customer_info"]') + el: @el.find('.customer_info') callback: callback ) diff --git a/app/assets/javascripts/app/controllers/agent_ticket_history.js.coffee b/app/assets/javascripts/app/controllers/agent_ticket_history.js.coffee index 6309a5e92..1d2767d67 100644 --- a/app/assets/javascripts/app/controllers/agent_ticket_history.js.coffee +++ b/app/assets/javascripts/app/controllers/agent_ticket_history.js.coffee @@ -9,6 +9,7 @@ class App.TicketHistory extends App.ControllerModal @fetch(@ticket_id) fetch: (@ticket_id) -> + # get data @ajax( id: 'ticket_history', @@ -19,18 +20,40 @@ class App.TicketHistory extends App.ControllerModal # load collections App.Event.trigger 'loadAssets', data.assets - # load history collections - App.History.deleteAll() - App.Collection.load( type: 'History', data: data.history ) # render page - @render() + @render(data.history) ) - render: -> + render: ( items, orderClass = '' ) -> + + for item in items + + item.link = '' + item.title = '???' + + if item.object is 'Ticket::Article' + item.object = 'Article' + article = App.TicketArticle.find( item.o_id ) + ticket = App.Ticket.find( article.ticket_id ) + item.title = article.subject || ticket.title + item.link = article.uiUrl() + + if App[item.object] + object = App[item.object].find( item.o_id ) + item.link = object.uiUrl() + item.title = object.displayName() + + item.created_by = App.User.find( item.created_by_id ) + + # set cache + @historyListCache = items @html App.view('agent_ticket_history')( - objects: App.History.search() + items: items + orderClass: orderClass + + @historyListCache ) @modalShow() @@ -43,25 +66,9 @@ class App.TicketHistory extends App.ControllerModal sortorder: (e) -> e.preventDefault() - isSorted = @el.find('.sorted') + isDown = @el.find('[data-type="sortorder"]').hasClass('down') - if isSorted.length - @sortstate = 'notsorted' - @html App.view('agent_ticket_history')( - objects: App.History.search() - state: @sortstate - ) + if isDown + @render( @historyListCache, 'up' ) else - @sortstate = 'sorted' - @html App.view('agent_ticket_history')( - objects: App.History.search().reverse() - state: @sortstate - ) - - @modalShow() - - # enable user popups - @userPopups() - - # show frontend times - @delay( @frontendTimeUpdate, 200, 'ui-time-update' ) + @render( @historyListCache.reverse(), 'down' ) diff --git a/app/assets/javascripts/app/controllers/agent_ticket_merge.js.coffee b/app/assets/javascripts/app/controllers/agent_ticket_merge.js.coffee index 8c5c4fee7..9e36d4a88 100644 --- a/app/assets/javascripts/app/controllers/agent_ticket_merge.js.coffee +++ b/app/assets/javascripts/app/controllers/agent_ticket_merge.js.coffee @@ -39,11 +39,11 @@ class App.TicketMerge extends App.ControllerModal overview_extended: [ { name: 'number', link: true }, { name: 'title', link: true }, -# { name: 'customer', class: 'user-data', data: { id: true } }, +# { name: 'customer', class: 'user-popover', data: { id: true } }, { name: 'ticket_state', translate: true }, # { name: 'ticket_priority', translate: true }, { name: 'group' }, -# { name: 'owner', class: 'user-data', data: { id: true } }, +# { name: 'owner', class: 'user-popover', data: { id: true } }, { name: 'created_at', callback: @humanTime }, # { name: 'last_contact', callback: @frontendTime }, # { name: 'last_contact_agent', callback: @frontendTime }, @@ -66,11 +66,11 @@ class App.TicketMerge extends App.ControllerModal overview_extended: [ { name: 'number', link: true }, { name: 'title', link: true }, -# { name: 'customer', class: 'user-data', data: { id: true } }, +# { name: 'customer', class: 'user-popover', data: { id: true } }, { name: 'ticket_state', translate: true }, # { name: 'ticket_priority', translate: true }, { name: 'group' }, -# { name: 'owner', class: 'user-data', data: { id: true } }, +# { name: 'owner', class: 'user-popover', data: { id: true } }, { name: 'created_at', callback: @humanTime }, # { name: 'last_contact', callback: @frontendTime }, # { name: 'last_contact_agent', callback: @frontendTime }, diff --git a/app/assets/javascripts/app/controllers/channel.js.coffee b/app/assets/javascripts/app/controllers/channel.js.coffee index fbd779725..50de9697a 100644 --- a/app/assets/javascripts/app/controllers/channel.js.coffee +++ b/app/assets/javascripts/app/controllers/channel.js.coffee @@ -1,30 +1,13 @@ -class Index extends App.ControllerLevel2 -# toggleable: true - toggleable: false +#App.Config.set( 'channels/:target', Index, 'Routes' ) +#App.Config.set( 'channels', Index, 'Routes' ) - menu: [ - { name: 'Web', target: 'web', controller: App.ChannelWeb }, - { name: 'Mail', target: 'email', controller: App.ChannelEmail }, - { name: 'Chat', target: 'chat', controller: App.ChannelChat }, - { name: 'Twitter', target: 'twitter', controller: App.ChannelTwitter }, - { name: 'Facebook', target: 'facebook', controller: App.ChannelFacebook }, - ] - page: { - title: 'Channels', - head: 'Channels', - sub_title: 'Management' - nav: '#channels', - } +#App.Config.set( 'Channels', { prio: 2500, name: 'Channels', target: '#channels', role: ['Admin'] }, 'NavBarLevel4' ) - constructor: -> - super +#App.Config.set( 'Channels', { prio: 2500, parent: '#admin', name: 'Channels', target: '#channels', role: ['Admin'] }, 'NavBar' ) - return if !@authenticate() +App.Config.set( 'Web', { prio: 1000, name: 'Web', parent: '#channels', target: '#channels/web', controller: App.ChannelWeb, role: ['Admin'] }, 'NavBarAdmin' ) +App.Config.set( 'Email', { prio: 2000, name: 'Email', parent: '#channels', target: '#channels/email', controller: App.ChannelEmail, role: ['Admin'] }, 'NavBarAdmin' ) +App.Config.set( 'Chat', { prio: 3000, name: 'Chat', parent: '#channels', target: '#channels/chat', controller: App.ChannelChat, role: ['Admin'] }, 'NavBarAdmin' ) +App.Config.set( 'Twitter', { prio: 4000, name: 'Twitter', parent: '#channels', target: '#channels/twitter', controller: App.ChannelTwitter, role: ['Admin'] }, 'NavBarAdmin' ) +App.Config.set( 'Facebook', { prio: 5000, name: 'Facebook', parent: '#channels', target: '#channels/facebook', controller: App.ChannelFacebook, role: ['Admin'] }, 'NavBarAdmin' ) - # render page - @render() - -App.Config.set( 'channels/:target', Index, 'Routes' ) -App.Config.set( 'channels', Index, 'Routes' ) - -App.Config.set( 'Channels', { prio: 2500, parent: '#admin', name: 'Channels', target: '#channels', role: ['Admin'] }, 'NavBar' ) \ No newline at end of file diff --git a/app/assets/javascripts/app/controllers/customer_ticket_create.js.coffee b/app/assets/javascripts/app/controllers/customer_ticket_create.js.coffee index 01e4e40d8..a6e1069dd 100644 --- a/app/assets/javascripts/app/controllers/customer_ticket_create.js.coffee +++ b/app/assets/javascripts/app/controllers/customer_ticket_create.js.coffee @@ -114,6 +114,13 @@ class Index extends App.ControllerContent # update textarea size @el.find('textarea').trigger('change') + new App.ControllerDrox( + el: @el.find('.sidebar') + data: + header: App.i18n.translateInline('What can you do here?') + html: App.i18n.translateInline('The way to communicate with us is this thing called "Ticket".') + ' ' + App.i18n.translateInline('Here you can create one.') + ) + cancel: -> @navigate '#' diff --git a/app/assets/javascripts/app/controllers/dashboard.js.coffee b/app/assets/javascripts/app/controllers/dashboard.js.coffee index f797d232e..009b71b1b 100644 --- a/app/assets/javascripts/app/controllers/dashboard.js.coffee +++ b/app/assets/javascripts/app/controllers/dashboard.js.coffee @@ -33,17 +33,17 @@ class Index extends App.ControllerContent activity_stream: { controller: App.DashboardActivityStream, params: { - limit: 8, - }, - }, - rss_atom: { - controller: App.DashboardRss, - params: { - head: 'Heise ATOM', - url: 'http://www.heise.de/newsticker/heise-atom.xml', - limit: 5, + limit: 20, }, }, +# rss_atom: { +# controller: App.DashboardRss, +# params: { +# head: 'Heise ATOM', +# url: 'http://www.heise.de/newsticker/heise-atom.xml', +# limit: 5, +# }, +# }, # rss_rdf: { # controller: App.DashboardRss, # params: { @@ -52,10 +52,9 @@ class Index extends App.ControllerContent # limit: 5, # }, # }, - - recent_viewed: { - controller: App.DashboardRecentViewed, - } +# recent_viewed: { +# controller: App.DashboardRecentViewed, +# } } } diff --git a/app/assets/javascripts/app/controllers/footer.js.coffee b/app/assets/javascripts/app/controllers/footer.js.coffee index 0772a27d5..5008873af 100644 --- a/app/assets/javascripts/app/controllers/footer.js.coffee +++ b/app/assets/javascripts/app/controllers/footer.js.coffee @@ -1,6 +1,4 @@ class App.Footer extends App.Controller - className: 'container' - constructor: -> super @render() @@ -12,4 +10,4 @@ class App.Footer extends App.Controller render: () -> @html App.view('footer')() -App.Config.set( 'footer', App.Footer, 'Footers' ) +#App.Config.set( 'footer', App.Footer, 'Footers' ) diff --git a/app/assets/javascripts/app/controllers/getting_started.js.coffee b/app/assets/javascripts/app/controllers/getting_started.js.coffee index a6da66198..8a80fbd27 100644 --- a/app/assets/javascripts/app/controllers/getting_started.js.coffee +++ b/app/assets/javascripts/app/controllers/getting_started.js.coffee @@ -142,8 +142,10 @@ class Index extends App.ControllerContent # type: 'success', # msg: 'Thanks for joining. Email sent to "' + @params.email + '". Please verify your email address.' - @el.find('.master_user').fadeOut('slow', => - @el.find('.agent_user').fadeIn() - ) + @el.find('.master_user').addClass('hide') + @el.find('.agent_user').removeClass('hide') +# @el.find('.master_user').fadeOut('slow', => +# @el.find('.agent_user').fadeIn() +# ) App.Config.set( 'getting_started', Index, 'Routes' ) diff --git a/app/assets/javascripts/app/controllers/groups.js.coffee b/app/assets/javascripts/app/controllers/groups.js.coffee index ab7a44436..c59309d8a 100644 --- a/app/assets/javascripts/app/controllers/groups.js.coffee +++ b/app/assets/javascripts/app/controllers/groups.js.coffee @@ -24,6 +24,4 @@ class Index extends App.ControllerContent }, ) -App.Config.set( 'groups', Index, 'Routes' ) - -App.Config.set( 'Group', { prio: 1500, parent: '#admin', name: 'Groups', target: '#groups', role: ['Admin'] }, 'NavBar' ) +App.Config.set( 'Group', { prio: 1500, name: 'Groups', parent: '#manage', target: '#manage/groups', controller: Index, role: ['Admin'] }, 'NavBarAdmin' ) \ No newline at end of file diff --git a/app/assets/javascripts/app/controllers/maintenance.js.coffee b/app/assets/javascripts/app/controllers/maintenance.js.coffee index bcb2a2e58..3faa20976 100644 --- a/app/assets/javascripts/app/controllers/maintenance.js.coffee +++ b/app/assets/javascripts/app/controllers/maintenance.js.coffee @@ -1,4 +1,4 @@ -class App.Maintenance extends App.ControllerContent +class Index extends App.ControllerContent events: 'submit form': 'sendMessage' @@ -23,5 +23,4 @@ class App.Maintenance extends App.ControllerContent ) @render() -App.Config.set( 'maintenance', App.Maintenance, 'Routes' ) -App.Config.set( 'maintenance', { prio: 3600, parent: '#admin', name: 'Maintenance Message', target: '#maintenance', role: ['Admin'] }, 'NavBar' ) +App.Config.set( 'Maintenance', { prio: 3600, name: 'Maintenance', parent: '#system', target: '#system/maintenance', controller: Index, role: ['Admin'] }, 'NavBarAdmin' ) \ No newline at end of file diff --git a/app/assets/javascripts/app/controllers/manage.js.coffee b/app/assets/javascripts/app/controllers/manage.js.coffee new file mode 100644 index 000000000..e0d0e0794 --- /dev/null +++ b/app/assets/javascripts/app/controllers/manage.js.coffee @@ -0,0 +1,16 @@ +class IndexRouter extends App.ControllerNavSidbar + configKey: 'NavBarAdmin' + +App.Config.set( 'manage', IndexRouter, 'Routes' ) +App.Config.set( 'manage/:target', IndexRouter, 'Routes' ) +App.Config.set( 'settings/:target', IndexRouter, 'Routes' ) +App.Config.set( 'channels/:target', IndexRouter, 'Routes' ) +App.Config.set( 'system/:target', IndexRouter, 'Routes' ) + + +App.Config.set( 'Manage', { prio: 1000, name: 'Manage', target: '#manage', role: ['Admin'] }, 'NavBarAdmin' ) +App.Config.set( 'Channels', { prio: 2500, name: 'Channels', target: '#channels', role: ['Admin'] }, 'NavBarAdmin' ) +App.Config.set( 'Settings', { prio: 7000, name: 'Settings', target: '#settings', role: ['Admin'] }, 'NavBarAdmin' ) +App.Config.set( 'System', { prio: 8000, name: 'System', target: '#system', role: ['Admin'] }, 'NavBarAdmin' ) + +App.Config.set( 'SystemObject', { prio: 1700, parent: '#system', name: 'Objects', target: '#system/objects', controller: true, role: ['Admin'] }, 'NavBarAdmin' ) diff --git a/app/assets/javascripts/app/controllers/navigation.js.coffee b/app/assets/javascripts/app/controllers/navigation.js.coffee index 38d4a29bc..f169532af 100644 --- a/app/assets/javascripts/app/controllers/navigation.js.coffee +++ b/app/assets/javascripts/app/controllers/navigation.js.coffee @@ -35,6 +35,13 @@ class App.Navigation extends App.Controller @recent_viewed_build(data) @render() + # bell on / bell off + @bind 'bell', (data) => + if data is 'on' + @el.find('.bell').addClass('show') + else + @el.find('.bell').removeClass('show') + render: () -> user = App.Session.all() nav_left = @getItems( navbar: @Config.get( 'NavBar' ) ) @@ -66,13 +73,13 @@ class App.Navigation extends App.Controller ) # start ticket popups - @ticketPopups('right') + @ticketPopups('left') # start user popups - @userPopups('right') + @userPopups('left') # start oorganization popups - @organizationPopups('right') + @organizationPopups('left') # set focus to search box if @searchFocus @@ -105,8 +112,8 @@ class App.Navigation extends App.Controller data = display: "##{ticket.number} - #{ticket.title} - #{ticket.humanTime}" id: ticket.id - class: "ticket-data" - url: "#ticket/zoom/#{ticket.id}" + class: "ticket-popover" + url: ticket.uiUrl() area.result.push data else if area.name is 'User' area.result = [] @@ -115,8 +122,8 @@ class App.Navigation extends App.Controller data = display: "#{user.displayName()}" id: user.id - class: "user-data" - url: "#users/#{user.id}" + class: "user-popover" + url: user.uiUrl() area.result.push data else if area.name is 'Organization' area.result = [] @@ -125,8 +132,8 @@ class App.Navigation extends App.Controller data = display: "#{organization.displayName()}" id: organization.id - class: "organization-data" - url: "#organizations/#{ticket.id}" + class: "organization-popover" + url: organization.uiUrl() area.result.push data if @result @@ -263,8 +270,8 @@ class App.Navigation extends App.Controller @el.find("[href=\"#{url}\"]").parents('li').addClass('active') ticket_overview_build: (data) => - App.Store.write( 'navupdate_ticket_overview', data ) + return # remove old views NavBar = @Config.get( 'NavBar' ) || {} @@ -313,11 +320,11 @@ class App.Navigation extends App.Controller ticket = App.Ticket.find( item.o_id ) prio++ NavBarRight['RecendViewed::' + ticket.id + '-' + prio ] = { - prio: prio, - parent: '#current_user', - name: item.recent_view_object + ' (' + ticket.title + ')', - target: '#ticket/zoom/' + ticket.id, - divider: divider, + prio: prio + parent: '#current_user' + name: item.recent_view_object + ' (' + ticket.title + ')' + target: ticket.uiUrl() + divider: divider navheader: navheader } diff --git a/app/assets/javascripts/app/controllers/organizations.js.coffee b/app/assets/javascripts/app/controllers/organizations.js.coffee index 976c19ed4..33dfa3860 100644 --- a/app/assets/javascripts/app/controllers/organizations.js.coffee +++ b/app/assets/javascripts/app/controllers/organizations.js.coffee @@ -1,10 +1,10 @@ class Index extends App.ControllerContent constructor: -> super - + # check authentication return if !@authenticate() - + new App.ControllerGenericIndex( el: @el, id: @id, @@ -24,7 +24,4 @@ class Index extends App.ControllerContent }, ) -App.Config.set( 'organizations', Index, 'Routes' ) - -App.Config.set( 'Organization', { prio: 2000, parent: '#admin', name: 'Organizations', target: '#organizations', role: ['Admin'] }, 'NavBar' ) - +App.Config.set( 'Organization', { prio: 2000, name: 'Organizations', parent: '#manage', target: '#manage/organizations', controller: Index, role: ['Admin'] }, 'NavBarAdmin' ) \ No newline at end of file diff --git a/app/assets/javascripts/app/controllers/overview.js.coffee b/app/assets/javascripts/app/controllers/overview.js.coffee index ed794fa39..cc39c3af4 100644 --- a/app/assets/javascripts/app/controllers/overview.js.coffee +++ b/app/assets/javascripts/app/controllers/overview.js.coffee @@ -1,10 +1,10 @@ class Index extends App.ControllerContent constructor: -> super - + # check authentication return if !@authenticate() - + new App.ControllerGenericIndex( el: @el, id: @id, @@ -24,6 +24,4 @@ class Index extends App.ControllerContent }, ) -App.Config.set( 'overviews', Index, 'Routes' ) -App.Config.set( 'Overview', { prio: 2300, parent: '#admin', name: 'Overviews', target: '#overviews', role: ['Admin'] }, 'NavBar' ) - +App.Config.set( 'Overview', { prio: 2300, name: 'Overviews', parent: '#manage', target: '#manage/overviews', controller: Index, role: ['Admin'] }, 'NavBarAdmin' ) \ No newline at end of file diff --git a/app/assets/javascripts/app/controllers/package.js.coffee b/app/assets/javascripts/app/controllers/package.js.coffee index bd9026aa2..0ffae1395 100644 --- a/app/assets/javascripts/app/controllers/package.js.coffee +++ b/app/assets/javascripts/app/controllers/package.js.coffee @@ -57,5 +57,4 @@ class Index extends App.ControllerContent @load() ) -App.Config.set( 'package', Index, 'Routes' ) -App.Config.set( 'Packages', { prio: 1800, parent: '#settings', name: 'Packages', target: '#package', role: ['Admin'] }, 'NavBar' ) +App.Config.set( 'Packages', { prio: 1000, name: 'Packages', parent: '#system', target: '#system/package', controller: Index, role: ['Admin'] }, 'NavBarAdmin' ) \ No newline at end of file diff --git a/app/assets/javascripts/app/controllers/profile.js.coffee b/app/assets/javascripts/app/controllers/profile.js.coffee index cacd6e70f..1de3787ce 100644 --- a/app/assets/javascripts/app/controllers/profile.js.coffee +++ b/app/assets/javascripts/app/controllers/profile.js.coffee @@ -1,32 +1,9 @@ -class Index extends App.ControllerLevel2 - toggleable: false -# toggleable: true +class Index extends App.ControllerNavSidbar + configKey: 'NavBarProfile' - constructor: -> - super - - return if !@authenticate() - - @menu = [ - { name: 'Password', 'target': 'password', controller: App.ProfilePassword, params: {} }, - { name: 'Language', 'target': 'language', controller: App.ProfileLanguage, params: {} }, - { name: 'Link Accounts', 'target': 'accounts', controller: App.ProfileLinkedAccounts, params: {} }, -# { name: 'Notifications', 'target': 'notify', controller: App.SettingsArea, params: { area: 'Ticket::Number' } }, - ] - @page = { - title: 'Profile', - head: 'Profile', - sub_title: 'Settings' - nav: '#profile', - } - - # render page - @render() - -# render: -> -# @html App.view('profile')() - - -App.Config.set( 'profile/:target', Index, 'Routes' ) App.Config.set( 'profile', Index, 'Routes' ) +App.Config.set( 'profile/:target', Index, 'Routes' ) + +App.Config.set( 'Profile', { prio: 1000, name: 'Profile', target: '#profile' }, 'NavBarProfile' ) + App.Config.set( 'Profile', { prio: 1700, parent: '#current_user', name: 'Profile', target: '#profile', role: [ 'Agent', 'Customer' ] }, 'NavBarRight' ) diff --git a/app/assets/javascripts/app/controllers/reset_password.js.coffee b/app/assets/javascripts/app/controllers/reset_password.js.coffee index e65b12ad3..ce5a8f75f 100644 --- a/app/assets/javascripts/app/controllers/reset_password.js.coffee +++ b/app/assets/javascripts/app/controllers/reset_password.js.coffee @@ -25,7 +25,7 @@ class Index extends App.ControllerContent { name: 'username', display: 'Enter your username or email address', tag: 'input', type: 'text', limit: 100, null: false, class: 'input span4', }, ] - @html App.view('reset_password')(params) + @html App.view('password/reset')(params) @form = new App.ControllerForm( el: @el.find('#form-password-item') @@ -98,7 +98,7 @@ class Verify extends App.ControllerContent { name: 'password', display: 'Password', tag: 'input', type: 'password', limit: 100, null: false, class: 'input span4', }, ] - @html App.view('reset_password_change')() + @html App.view('password/reset_change')() new App.ControllerForm( el: @el.find('#form-password-change') diff --git a/app/assets/javascripts/app/controllers/scheduler.js.coffee b/app/assets/javascripts/app/controllers/scheduler.js.coffee index 356554ae1..6df1cd7b1 100644 --- a/app/assets/javascripts/app/controllers/scheduler.js.coffee +++ b/app/assets/javascripts/app/controllers/scheduler.js.coffee @@ -13,11 +13,9 @@ class Index extends App.ControllerContent @render() render: -> - + @html App.view('scheduler')( head: 'some header' ) -App.Config.set( 'scheduler', Index, 'Routes' ) - -App.Config.set( 'Scheduler', { prio: 3500, parent: '#admin', name: 'Scheduler', target: '#scheduler', role: ['Admin'] }, 'NavBar' ) +App.Config.set( 'Scheduler', { prio: 2000, name: 'Schedulers', parent: '#manage', target: '#manage/schedulers', controller: Index, role: ['Admin'] }, 'NavBarAdmin' ) \ No newline at end of file diff --git a/app/assets/javascripts/app/controllers/session.js.coffee b/app/assets/javascripts/app/controllers/session.js.coffee index 40258c131..875ffd1ce 100644 --- a/app/assets/javascripts/app/controllers/session.js.coffee +++ b/app/assets/javascripts/app/controllers/session.js.coffee @@ -1,4 +1,5 @@ -class Session extends App.ControllerContent +class Index extends App.ControllerContent + divClass: 'lala' events: 'click [data-type="delete"]': 'destroy' @@ -11,7 +12,7 @@ class Session extends App.ControllerContent @interval( => @load() - 30000 + 45000 ) # fetch data, render view @@ -50,6 +51,4 @@ class Session extends App.ControllerContent @load() ) - -App.Config.set( 'session', Session, 'Routes' ) -App.Config.set( 'session', { prio: 3700, parent: '#admin', name: 'Sessions', target: '#session', role: ['Admin'] }, 'NavBar' ) +App.Config.set( 'Session', { prio: 3700, name: 'Sessions', parent: '#system', target: '#system/sessions', controller: Index, role: ['Admin'] }, 'NavBarAdmin' ) \ No newline at end of file diff --git a/app/assets/javascripts/app/controllers/settings.js.coffee b/app/assets/javascripts/app/controllers/settings.js.coffee index b4f51c0b0..ef76d01f3 100644 --- a/app/assets/javascripts/app/controllers/settings.js.coffee +++ b/app/assets/javascripts/app/controllers/settings.js.coffee @@ -1,78 +1,67 @@ -class Index extends App.ControllerLevel2 - toggleable: false -# toggleable: true - +class System extends App.ControllerTabs constructor: -> super return if !@authenticate() - # system - if @type is 'system' - @menu = [ - { name: 'Base', 'target': 'base', controller: App.SettingsArea, params: { area: 'System::Base' } }, - # { name: 'Language', 'target': 'language', controller: App.SettingsSystem, params: { area: 'System::Language' } }, - # { name: 'Log', 'target': 'log', controller: App.SettingsSystem, params: { area: 'System::Log' } }, - { name: 'Storage', 'target': 'storage', controller: App.SettingsArea, params: { area: 'System::Storage' } }, - ] - @page = { - title: 'System', - head: 'System', - sub_title: 'Settings' - nav: '#settings/system', - } - - # security - if @type is 'security' - @menu = [ - { name: 'Base', 'target': 'base', controller: App.SettingsArea, params: { area: 'Security::Base' } }, -# { name: 'Authentication', 'target': 'auth', controller: App.SettingsArea, params: { area: 'Security::Authentication' } }, - { name: 'Password', 'target': 'password', controller: App.SettingsArea, params: { area: 'Security::Password' } }, - { name: 'Third-Party Applications', 'target': 'third_party_auth', controller: App.SettingsArea, params: { area: 'Security::ThirdPartyAuthentication' } }, -# { name: 'Session', 'target': 'session', controller: '' }, - ] - @page = { - title: 'Security', - head: 'Security', - sub_title: 'Settings' - nav: '#settings/security', - } - - # import - if @type is 'import' - @menu = [ - { name: 'Base', 'target': 'base', controller: App.SettingsArea, params: { area: 'Import::Base' } }, - { name: 'OTRS', 'target': 'otrs', controller: App.SettingsArea, params: { area: 'Import::OTRS' } }, - ] - @page = { - title: 'Import', - head: 'Import', - sub_title: 'System' - nav: '#settings/import', - } - - # ticket - if @type is 'ticket' - @menu = [ - { name: 'Base', 'target': 'base', controller: App.SettingsArea, params: { area: 'Ticket::Base' } }, - { name: 'Number', 'target': 'number', controller: App.SettingsArea, params: { area: 'Ticket::Number' } }, -# { name: 'Sender Format', 'target': 'sender-format', controller: App.SettingsArea, params: { area: 'Ticket::SenderFormat' } }, - ] - @page = { - title: 'Ticket', - head: 'Ticket', - sub_title: 'Settings' - nav: '#settings/ticket', - } + @tabs = [ + { name: 'Base', 'target': 'base', controller: App.SettingsArea, params: { area: 'System::Base' } }, + # { name: 'Language', 'target': 'language', controller: App.SettingsSystem, params: { area: 'System::Language' } }, + # { name: 'Log', 'target': 'log', controller: App.SettingsSystem, params: { area: 'System::Log' } }, + { name: 'Storage', 'target': 'storage', controller: App.SettingsArea, params: { area: 'System::Storage' } }, + { name: 'Geo Services', 'target': 'geo', controller: App.SettingsArea, params: { area: 'System::Geo' } }, + ] # render page @render() -App.Config.set( 'settings/:type/:target', Index, 'Routes' ) -App.Config.set( 'settings/:type', Index, 'Routes' ) +class Security extends App.ControllerTabs + constructor: -> + super + + return if !@authenticate() + + @tabs = [ + { name: 'Base', 'target': 'base', controller: App.SettingsArea, params: { area: 'Security::Base' } }, +# { name: 'Authentication', 'target': 'auth', controller: App.SettingsArea, params: { area: 'Security::Authentication' } }, + { name: 'Password', 'target': 'password', controller: App.SettingsArea, params: { area: 'Security::Password' } }, + { name: 'Third-Party Applications', 'target': 'third_party_auth', controller: App.SettingsArea, params: { area: 'Security::ThirdPartyAuthentication' } }, +# { name: 'Session', 'target': 'session', controller: '' }, + ] + + @render() + +class Import extends App.ControllerTabs + constructor: -> + super + + return if !@authenticate() + + # import + @tabs = [ + { name: 'Base', 'target': 'base', controller: App.SettingsArea, params: { area: 'Import::Base' } }, + { name: 'OTRS', 'target': 'otrs', controller: App.SettingsArea, params: { area: 'Import::OTRS' } }, + ] + + @render() + +class Ticket extends App.ControllerTabs + constructor: -> + super + + return if !@authenticate() + + # ticket + @tabs = [ + { name: 'Base', 'target': 'base', controller: App.SettingsArea, params: { area: 'Ticket::Base' } }, + { name: 'Number', 'target': 'number', controller: App.SettingsArea, params: { area: 'Ticket::Number' } }, +# { name: 'Sender Format', 'target': 'sender-format', controller: App.SettingsArea, params: { area: 'Ticket::SenderFormat' } }, + ] + + @render() + +App.Config.set( 'SettingSystem', { prio: 1400, parent: '#settings', name: 'System', target: '#settings/system', controller: System, role: ['Admin'] }, 'NavBarAdmin' ) +App.Config.set( 'SettingSecurity', { prio: 1500, parent: '#settings', name: 'Security', target: '#settings/security', controller: Security, role: ['Admin'] }, 'NavBarAdmin' ) +App.Config.set( 'SettingImport', { prio: 1550, parent: '#settings', name: 'Import', target: '#settings/import', controller: Import, role: ['Admin'] }, 'NavBarAdmin' ) +App.Config.set( 'SettingTicket', { prio: 1600, parent: '#settings', name: 'Ticket', target: '#settings/ticket', controller: Ticket, role: ['Admin'] }, 'NavBarAdmin' ) -App.Config.set( 'System', { prio: 1400, parent: '#settings', name: 'System', target: '#settings/system', role: ['Admin'] }, 'NavBar' ) -App.Config.set( 'Security', { prio: 1500, parent: '#settings', name: 'Security', target: '#settings/security', role: ['Admin'] }, 'NavBar' ) -App.Config.set( 'Import', { prio: 1550, parent: '#settings', name: 'Import', target: '#settings/import', role: ['Admin'] }, 'NavBar' ) -App.Config.set( 'Ticket', { prio: 1600, parent: '#settings', name: 'Ticket', target: '#settings/ticket', role: ['Admin'] }, 'NavBar' ) -App.Config.set( 'Object', { prio: 1700, parent: '#settings', name: 'Objects', target: '#settings/objects', role: ['Admin'] }, 'NavBar' ) diff --git a/app/assets/javascripts/app/controllers/sla.js.coffee b/app/assets/javascripts/app/controllers/sla.js.coffee index 333eabe93..b046eff88 100644 --- a/app/assets/javascripts/app/controllers/sla.js.coffee +++ b/app/assets/javascripts/app/controllers/sla.js.coffee @@ -1,10 +1,10 @@ class Index extends App.ControllerContent constructor: -> super - + # check authentication return if !@authenticate() - + new App.ControllerGenericIndex( el: @el, id: @id, @@ -24,6 +24,4 @@ class Index extends App.ControllerContent }, ) -App.Config.set( 'slas', Index, 'Routes' ) -App.Config.set( 'Sla', { prio: 2900, parent: '#admin', name: 'SLAs', target: '#slas', role: ['Admin'] }, 'NavBar' ) - +App.Config.set( 'Sla', { prio: 2900, name: 'SLAs', parent: '#manage', target: '#manage/slas', controller: Index, role: ['Admin'] }, 'NavBarAdmin' ) \ No newline at end of file diff --git a/app/assets/javascripts/app/controllers/task_widget.js.coffee b/app/assets/javascripts/app/controllers/task_widget.js.coffee index 2622091ef..67e4cc959 100644 --- a/app/assets/javascripts/app/controllers/task_widget.js.coffee +++ b/app/assets/javascripts/app/controllers/task_widget.js.coffee @@ -215,19 +215,18 @@ class Taskbar extends App.Controller @navigate '#' resizeTasks: -> - width = $('#task .taskbar').width() - $('#task .taskbar-new').width() - 200 + width = $('#task .taskbar-items').width()# - $('#task .taskbar-new').width() - 200 task_count = App.TaskManager.all().length - task_size = ( width / task_count ) - ( task_count * 1.3 ) - + task_size = ( width / task_count ) - 40 elementsOversize = 0 elementsOversizeLeftTotal = 0 $('#task .task').each( (position, element) -> - width = $(element).parent().width() - if width > task_size + widthTask = $(element).width() + if widthTask > task_size elementsOversize++ else - elementsOversizeLeftTotal += task_size - width + elementsOversizeLeftTotal += task_size - widthTask ) addOversize = elementsOversizeLeftTotal / elementsOversize diff --git a/app/assets/javascripts/app/controllers/text_module.js.coffee b/app/assets/javascripts/app/controllers/text_module.js.coffee index 8ebc17bad..b6394d296 100644 --- a/app/assets/javascripts/app/controllers/text_module.js.coffee +++ b/app/assets/javascripts/app/controllers/text_module.js.coffee @@ -1,10 +1,10 @@ class Index extends App.ControllerContent constructor: -> super - + # check authentication return if !@authenticate() - + new App.ControllerGenericIndex( el: @el, id: @id, @@ -24,6 +24,4 @@ class Index extends App.ControllerContent }, ) -App.Config.set( 'text_modules', Index, 'Routes' ) -App.Config.set( 'TextModule', { prio: 2300, parent: '#admin', name: 'Text Modules', target: '#text_modules', role: ['Admin'] }, 'NavBar' ) - +App.Config.set( 'TextModule', { prio: 2300, name: 'TextModules', parent: '#manage', target: '#manage/text_modules', controller: Index, role: ['Admin'] }, 'NavBarAdmin' ) \ No newline at end of file diff --git a/app/assets/javascripts/app/controllers/ticket_customer.js.coffee b/app/assets/javascripts/app/controllers/ticket_customer.js.coffee index 47fef48a4..2d53e8191 100644 --- a/app/assets/javascripts/app/controllers/ticket_customer.js.coffee +++ b/app/assets/javascripts/app/controllers/ticket_customer.js.coffee @@ -37,7 +37,7 @@ class App.TicketCustomer extends App.ControllerModal @modalHide() # reload zoom view - @zoom.render() + @ui.render() # load user if not already exists App.User.retrieve( params['customer_id'], callback ) diff --git a/app/assets/javascripts/app/controllers/ticket_overview.js.coffee b/app/assets/javascripts/app/controllers/ticket_overview.js.coffee index 28f503f1b..d2afe8e7b 100644 --- a/app/assets/javascripts/app/controllers/ticket_overview.js.coffee +++ b/app/assets/javascripts/app/controllers/ticket_overview.js.coffee @@ -1,4 +1,29 @@ -class Index extends App.ControllerContent +class Index extends App.Controller + constructor: -> + super + + @render() + + render: -> + + @html App.view('agent_ticket_view')() + + if !@view + cache = App.Store.get( 'navupdate_ticket_overview' ) + if cache && cache[0] + @view = cache[0].link + + new Navbar( + el: @el.find('.sidebar') + view: @view + ) + + new Table( + el: @el.find('.main') + view: @view + ) + +class Table extends App.ControllerContent events: 'click [data-type=edit]': 'zoom' 'click [data-type=settings]': 'settings' @@ -128,7 +153,7 @@ class Index extends App.ControllerContent ] if @isRole('Customer') view_modes = [] - html = App.view('agent_ticket_view')( + html = App.view('agent_ticket_view/content')( overview: @overview view_modes: view_modes checkbox: checkbox @@ -137,6 +162,7 @@ class Index extends App.ControllerContent html = $(html) # html.find('li').removeClass('active') # html.find("[data-id=\"#{@start_page}\"]").parents('li').addClass('active') + @html html # create table/overview @@ -483,6 +509,50 @@ class Settings extends App.ControllerModal ) @modalHide() +class Navbar extends App.Controller + constructor: -> + super + + # rebuild ticket overview data + @bind 'navupdate_ticket_overview', (data) => + if !_.isEmpty(data) + App.Store.write( 'navupdate_ticket_overview', data ) + @render(data) + + cache = App.Store.get( 'navupdate_ticket_overview' ) + if cache + @render( cache ) + else + @render( [] ) + + # init fetch via ajax, all other updates on time via websockets + @ajax( + id: 'ticket_overviews', + type: 'GET', + url: @apiPath + '/ticket_overviews', + processData: true, + success: (data) => + App.Store.write( 'navupdate_ticket_overview', data ) + @render(data) + ) + + render: (dataOrig) -> + + data = _.clone(dataOrig) + + # add new views + for item in data + item.target = '#ticket_view/' + item.link + if item.link is @view + item.active = true + else + item.active = false + + @html App.view('agent_ticket_view/navbar')( + items: data + ) + + class Router extends App.Controller constructor: -> super @@ -535,8 +605,9 @@ class Router extends App.Controller else @navigate 'ticket/zoom/' + @ticket_ids[ @position - 1 ] + '/nav/true' +App.Config.set( 'ticket_view', Index, 'Routes' ) App.Config.set( 'ticket_view/:view', Index, 'Routes' ) -App.Config.set( 'ticket_view/:view/:position/:direction', Router, 'Routes' ) +#App.Config.set( 'ticket_view/:view/:position/:direction', Router, 'Routes' ) App.Config.set( 'TicketOverview', { prio: 1000, parent: '', name: 'Overviews', target: '#ticket_view', role: ['Agent', 'Customer'] }, 'NavBar' ) #App.Config.set( '', { prio: 1000, parent: '#ticket_view', name: 'My assigned Tickets (51)', target: '#ticket_view/my_assigned', role: ['Agent'] } diff --git a/app/assets/javascripts/app/controllers/ticket_zoom.js.coffee b/app/assets/javascripts/app/controllers/ticket_zoom.js.coffee index e18145b67..5ddbd9ee4 100644 --- a/app/assets/javascripts/app/controllers/ticket_zoom.js.coffee +++ b/app/assets/javascripts/app/controllers/ticket_zoom.js.coffee @@ -72,7 +72,7 @@ class App.TicketZoom extends App.Controller success: (data, status, xhr) => # check if ticket has changed - newTicketRaw = data.assets.tickets[ticket_id] + newTicketRaw = data.assets.Ticket[ticket_id] if @ticketUpdatedAtLastCall && !force # return if ticket hasnt changed @@ -140,7 +140,7 @@ class App.TicketZoom extends App.Controller @frontendTimeUpdate() @TicketTitle() - @TicketInfo() + @TicketWidgets() @TicketAction() @ArticleView() @@ -156,7 +156,7 @@ class App.TicketZoom extends App.Controller # show text module UI if !@isRole('Customer') - new App.TextModuleUI( + new App.WidgetTextModule( el: @el.find('textarea') data: ticket: @ticket @@ -177,13 +177,6 @@ class App.TicketZoom extends App.Controller el: @el.find('.ticket-title') ) - TicketInfo: => - # show ticket info - new TicketInfo( - ticket: @ticket - el: @el.find('.ticket-info') - ) - ArticleView: => # show article new ArticleView( @@ -203,15 +196,24 @@ class App.TicketZoom extends App.Controller ui: @ ) - TicketAction: => + TicketWidgets: => # show ticket action row - new TicketAction( + new TicketWidgets( ticket: @ticket task_key: @task_key - el: @el.find('.ticket-action') + el: @el.find('.ticket-widgets') ui: @ ) + TicketAction: => + # start action controller + if !@isRole('Customer') + new TicketActionRow( + el: @el.find('.ticket-action') + ticket: @ticket + ui: @ + ) + class TicketTitle extends App.Controller events: 'blur .ticket-title-update': 'update' @@ -221,7 +223,7 @@ class TicketTitle extends App.Controller @render() render: -> - @html App.view('ticket_zoom/ticket_title')( + @html App.view('ticket_zoom/title')( ticket: @ticket ) @@ -248,59 +250,58 @@ class TicketTitle extends App.Controller App.Event.trigger 'task:render' -class TicketInfo extends App.Controller +class TicketInfo extends App.ControllerDrox constructor: -> super @render() render: -> - @html App.view('ticket_zoom/ticket_info')( - ticket: @ticket + @html @template( + file: 'ticket_zoom/info' + header: '#' + @ticket.number + params: + ticket: @ticket ) -class TicketAction extends App.Controller - constructor: -> - super - @render() - - render: -> - - @html App.view('ticket_zoom/ticket_action')() - - # start customer info controller - if !@isRole('Customer') - new App.UserInfo( - el: @el.find('.customer_info') - user_id: @ticket.customer_id - ticket: @ticket - ) - - # start action controller - if !@isRole('Customer') - new TicketActionRow( - el: @el.find('.action_info') - ticket: @ticket - zoom: @ui - ) - # start tag controller if !@isRole('Customer') - new App.TagWidget( + new App.WidgetTag( el: @el.find('.tag_info') object_type: 'Ticket' object: @ticket ) +class TicketWidgets extends App.Controller + constructor: -> + super + @render() + + render: -> + + @html App.view('ticket_zoom/widgets')() + + # show ticket info + new TicketInfo( + ticket: @ticket + el: @el.find('.ticket_info') + ) + + # start customer info controller + if !@isRole('Customer') + new App.WidgetUser( + el: @el.find('.customer_info') + user_id: @ticket.customer_id + ticket: @ticket + ) + # start link info controller if !@isRole('Customer') - new App.LinkInfo( + new App.WidgetLink( el: @el.find('.link_info') object_type: 'Ticket' object: @ticket ) - - class Edit extends App.Controller events: 'click .submit': 'update' @@ -337,12 +338,12 @@ class Edit extends App.Controller @configure_attributes_article = [ { name: 'ticket_article_type_id', display: 'Type', tag: 'select', multiple: false, null: true, relation: 'TicketArticleType', filter: @edit_form, default: '9', translate: true, class: 'medium' }, + { name: 'internal', display: 'Visibility', tag: 'select', null: true, options: { true: 'internal', false: 'public' }, class: 'medium', item_class: '', default: false }, { name: 'to', display: 'To', tag: 'input', type: 'text', limit: 100, null: true, class: 'span7', hide: true }, { name: 'cc', display: 'Cc', tag: 'input', type: 'text', limit: 100, null: true, class: 'span7', hide: true }, # { name: 'subject', display: 'Subject', tag: 'input', type: 'text', limit: 100, null: true, class: 'span7', hide: true }, { name: 'in_reply_to', display: 'In Reply to', tag: 'input', type: 'text', limit: 100, null: true, class: 'span7', item_class: 'hide' }, { name: 'body', display: 'Text', tag: 'textarea', rows: 6, limit: 100, null: true, class: 'span7', item_class: '', upload: true }, - { name: 'internal', display: 'Visibility', tag: 'select', null: true, options: { true: 'internal', false: 'public' }, class: 'medium', item_class: '', default: false }, ] if @isRole('Customer') @configure_attributes_article = [ @@ -423,8 +424,9 @@ class Edit extends App.Controller if !@autosaveLast || ( diff && !_.isEmpty( diff ) ) @autosaveLast = currentData @log 'notice', 'form hash changed', diff, currentData - @el.find('.ticket-update').parent().addClass('form-changed') - @el.find('.ticket-update').parent().parent().find('.reset-message').show() + @el.find('.ticket-edit').addClass('form-changed') + @el.find('.ticket-edit').find('.reset-message').show() + @el.find('.ticket-edit').find('.reset-message').removeClass('hide') App.TaskManager.update( @task_key, { 'state': currentData }) @interval( update, 3000, 'autosave' ) @@ -604,11 +606,14 @@ class ArticleView extends App.Controller show_toogle: (e) -> e.preventDefault() - $(e.target).hide() + #$(e.target).hide() if $(e.target).next('div')[0] - $(e.target).next('div').show() - else - $(e.target).parent().next('div').show() + if $(e.target).next('div').hasClass('hide') + $(e.target).next('div').removeClass('hide') + $(e.target).text( App.i18n.translateContent('Fold in') ) + else + $(e.target).text( App.i18n.translateContent('See more') ) + $(e.target).next('div').addClass('hide') checkIfSignatureIsNeeded: (article_type) => @@ -703,9 +708,9 @@ class Article extends App.Controller if article_lines.length > preview preview_mode = true if article_lines[preview] is '' - article_lines.splice( preview, 0, '----SEEMORE----' ) + article_lines.splice( preview, 0, '-----SEEMORE-----' ) else - article_lines.splice( preview + 1, 0, '----SEEMORE----' ) + article_lines.splice( preview - 1, 0, '-----SEEMORE-----' ) @article['html'] = article_lines.join("\n") @article['html'] = window.linkify( @article['html'] ) notify = '' + App.i18n.translateContent('See more') + '' @@ -713,9 +718,9 @@ class Article extends App.Controller # preview mode if preview_mode @article_changed = false - @article['html'] = @article['html'].replace /^\n{0,10}----SEEMORE----\n/m, (match) => + @article['html'] = @article['html'].replace /^-----SEEMORE-----\n/m, (match) => @article_changed = true - notify + '
' + notify + '
' if @article_changed @article['html'] = @article['html'] + '
' @@ -724,11 +729,10 @@ class Article extends App.Controller @article_changed = false @article['html'] = @article['html'].replace /^\n{0,10}(--|__)/m, (match) => @article_changed = true - notify + '
' + match + notify + '
' + match if @article_changed @article['html'] = @article['html'] + '
' - actionRow: -> if @isRole('Customer') @article.actions = [] @@ -786,7 +790,7 @@ class TicketActionRow extends App.Controller @render() render: -> - @html App.view('ticket_action')() + @html App.view('ticket_zoom/actions')() history_dialog: (e) -> e.preventDefault() @@ -794,11 +798,11 @@ class TicketActionRow extends App.Controller merge_dialog: (e) -> e.preventDefault() - new App.TicketMerge( ticket_id: @ticket.id, task_key: @zoom.task_key ) + new App.TicketMerge( ticket_id: @ticket.id, task_key: @ui.task_key ) customer_dialog: (e) -> e.preventDefault() - new App.TicketCustomer( ticket_id: @ticket.id, zoom: @zoom ) + new App.TicketCustomer( ticket_id: @ticket.id, ui: @ui ) class TicketZoomRouter extends App.ControllerPermanent constructor: (params) -> diff --git a/app/assets/javascripts/app/controllers/trigger.js.coffee b/app/assets/javascripts/app/controllers/trigger.js.coffee index a3266e683..7733907c8 100644 --- a/app/assets/javascripts/app/controllers/trigger.js.coffee +++ b/app/assets/javascripts/app/controllers/trigger.js.coffee @@ -13,11 +13,13 @@ class Index extends App.ControllerContent @render() render: -> - + @html App.view('trigger')( head: 'some header' ) -App.Config.set( 'trigger', Index, 'Routes' ) +#App.Config.set( 'trigger', Index, 'Routes' ) +#App.Config.set( 'Trigger', { prio: 3000, parent: '#admin', name: 'Trigger', target: '#trigger', role: ['Admin'] }, 'NavBar' ) + +App.Config.set( 'Trigger', { prio: 3000, name: 'Triggers', target: '#manage/triggers', controller: Index, role: ['Admin'] }, 'NavBarLevel2' ) -App.Config.set( 'Trigger', { prio: 3000, parent: '#admin', name: 'Trigger', target: '#trigger', role: ['Admin'] }, 'NavBar' ) \ No newline at end of file diff --git a/app/assets/javascripts/app/controllers/users.js.coffee b/app/assets/javascripts/app/controllers/users.js.coffee index b6754b747..aff0e623c 100644 --- a/app/assets/javascripts/app/controllers/users.js.coffee +++ b/app/assets/javascripts/app/controllers/users.js.coffee @@ -1,4 +1,4 @@ -class Index extends App.ControllerContent +class Index extends App.Controller constructor: -> super @@ -6,26 +6,24 @@ class Index extends App.ControllerContent return if !@authenticate() new App.ControllerGenericIndex( - el: @el, - id: @id, - genericObject: 'User', - defaultSortBy: 'login', - ignoreObjectIDs: [1], - pageData: { - title: 'Users', - home: 'users', - object: 'User', - objects: 'Users', - navupdate: '#users', + el: @el + id: @id + genericObject: 'User' + defaultSortBy: 'login' + ignoreObjectIDs: [1] + pageData: + title: 'Users' + home: 'users' + object: 'User' + objects: 'Users' + navupdate: '#users' notes: [ 'Users are for any person in the system. Agents (Owners, Resposbiles, ...) and Customers.' - ], + ] buttons: [ # { name: 'List', 'data-type': '', class: 'active' }, - { name: 'New User', 'data-type': 'new', class: 'primary' }, - ], - } + { name: 'New User', 'data-type': 'new', class: 'primary' } + ] ) -App.Config.set( 'users', Index, 'Routes' ) -App.Config.set( 'User', { prio: 1000, parent: '#admin', name: 'Users', target: '#users', role: ['Admin'] }, 'NavBar' ) +App.Config.set( 'User', { prio: 1000, name: 'Users', parent: '#manage', target: '#manage/users', controller: Index, role: ['Admin'] }, 'NavBarAdmin' ) diff --git a/app/assets/javascripts/app/controllers/chat_widget.js.coffee b/app/assets/javascripts/app/controllers/widget/chat.js.coffee similarity index 95% rename from app/assets/javascripts/app/controllers/chat_widget.js.coffee rename to app/assets/javascripts/app/controllers/widget/chat.js.coffee index dcc3c02e5..802337153 100644 --- a/app/assets/javascripts/app/controllers/chat_widget.js.coffee +++ b/app/assets/javascripts/app/controllers/widget/chat.js.coffee @@ -1,4 +1,4 @@ -class App.ChatWidget extends App.Controller +class Widget extends App.Controller events: 'submit #chat_form': 'submitMessage' 'focusin [name=chat_message]': 'focusIn' @@ -130,6 +130,7 @@ class App.ChatWidget extends App.Controller 'chat-message-new' ) @el.find('#chat_content').show(100) + @el.find('#chat_content').removeClass('hide') @newMessage = false # hide @@ -142,6 +143,7 @@ class App.ChatWidget extends App.Controller hide: => @isShown = false @el.find('#chat_content').hide(100) + @el.find('#chat_content').addClass('hide') @el.find('#chat_toogle').html('♦'); focusIn: => @@ -171,7 +173,7 @@ class App.ChatWidget extends App.Controller shown = false if @isShown shown = true - @html App.view('chat_widget')( + @html App.view('widget/chat')( messages: @messageLog isShown: shown ) @@ -210,4 +212,4 @@ class App.ChatWidget extends App.Controller ) @render() -App.Config.set( 'chat', App.ChatWidget, 'Widgets' ) +App.Config.set( 'chat', Widget, 'Widgets' ) diff --git a/app/assets/javascripts/app/controllers/link_info_widget.js.coffee b/app/assets/javascripts/app/controllers/widget/link.js.coffee similarity index 83% rename from app/assets/javascripts/app/controllers/link_info_widget.js.coffee rename to app/assets/javascripts/app/controllers/widget/link.js.coffee index 1a07420b6..4231c9da1 100644 --- a/app/assets/javascripts/app/controllers/link_info_widget.js.coffee +++ b/app/assets/javascripts/app/controllers/widget/link.js.coffee @@ -1,14 +1,14 @@ -class App.LinkInfo extends App.Controller +class App.WidgetLink extends App.ControllerDrox events: 'click [data-type=add]': 'add', - 'click [data-type=edit]': 'edit', + 'click [data-type=edit]': 'toggle', 'click [data-type=remove]': 'remove', constructor: -> super @fetch() - fetch: () => + fetch: => # fetch item on demand # get data @ajax( @@ -27,9 +27,12 @@ class App.LinkInfo extends App.Controller App.Event.trigger 'loadAssets', data.assets @render() + + if _.isEmpty(data.links) + @toggle() ) - render: () => + render: => list = {} for item in @links @@ -43,8 +46,12 @@ class App.LinkInfo extends App.Controller list[ item['link_type'] ].push ticket # insert data - @html App.view('link/info')( - links: list, + @html @template( + file: 'link/info' + header: 'Links' + edit: true + params: + links: list ) # show edit mode once enabled @@ -58,15 +65,16 @@ class App.LinkInfo extends App.Controller # ) # enable/disable edit mode - edit: (e) => - e.preventDefault() + toggle: (e) => + if e + e.preventDefault() @edit_mode = true - if $(e.target).parent().parent().find('[data-type=add]').hasClass('hide') - $(e.target).parent().parent().find('[data-type=remove]').removeClass('hide') - $(e.target).parent().parent().find('[data-type=add]').removeClass('hide') + if @el.find('[data-type=add]').hasClass('hide') + @el.find('[data-type=remove]').removeClass('hide') + @el.find('[data-type=add]').removeClass('hide') else - $(e.target).parent().parent().find('[data-type=remove]').addClass('hide') - $(e.target).parent().parent().find('[data-type=add]').addClass('hide') + @el.find('[data-type=remove]').addClass('hide') + @el.find('[data-type=add]').addClass('hide') remove: (e) => e.preventDefault() diff --git a/app/assets/javascripts/app/controllers/maintenance_widget.js.coffee b/app/assets/javascripts/app/controllers/widget/maintenance.js.coffee similarity index 84% rename from app/assets/javascripts/app/controllers/maintenance_widget.js.coffee rename to app/assets/javascripts/app/controllers/widget/maintenance.js.coffee index e28b5e8a2..125a5f127 100644 --- a/app/assets/javascripts/app/controllers/maintenance_widget.js.coffee +++ b/app/assets/javascripts/app/controllers/widget/maintenance.js.coffee @@ -1,4 +1,4 @@ -class App.MaintenanceWidget extends App.Controller +class Widget extends App.Controller constructor: -> super @@ -31,4 +31,4 @@ class Message extends App.ControllerModal forceReload: message.reload ) -App.Config.set( 'maintenance', App.MaintenanceWidget, 'Widgets' ) +App.Config.set( 'maintenance', Widget, 'Widgets' ) diff --git a/app/assets/javascripts/app/controllers/widget/organization.js.coffee b/app/assets/javascripts/app/controllers/widget/organization.js.coffee new file mode 100644 index 000000000..1809536c9 --- /dev/null +++ b/app/assets/javascripts/app/controllers/widget/organization.js.coffee @@ -0,0 +1,78 @@ +class App.WidgetOrganization extends App.Controller + events: + 'focusout [data-type=update-org]': 'update', + 'click [data-type=edit-org]': 'edit' + + constructor: -> + super + + # show organization + callback = (organization) => + @render(organization) + if @callback + @callback(organization) + + # subscribe and reload data / fetch new data if triggered + @subscribeId = organization.subscribe(@render) + + App.Organization.retrieve( @organization_id, callback ) + + release: => + App.Organization.unsubscribe(@subscribeId) + + render: (organization) => + if !organization + organization = @u + + # get display data + organizationData = [] + for item2 in App.Organization.configure_attributes + item = _.clone( item2 ) + + # check if value for _id exists + itemNameValue = item.name + itemNameValueNew = itemNameValue.substr( 0, itemNameValue.length - 3 ) + if itemNameValueNew of organization + item.name = itemNameValueNew + + # add to show if value exists + if organization[item.name] || item.tag is 'textarea' + + # do not show name / already show via diplayName() + if item.name isnt 'name' + if item.info + organizationData.push item + + # insert userData + @html App.view('widget/organization')( + organization: organization + organizationData: organizationData + ) + + ### + @userTicketPopups( + selector: '.user-tickets' + user_id: user.id + position: 'right' + ) + ### + + update: (e) => + note = $(e.target).parent().find('[data-type=update]').val() + organization = App.Organization.find( @organization_id ) + if organization.note isnt note + organization.updateAttributes( note: note ) + @log 'notice', 'update', e, note, organization + + edit: (e) => + e.preventDefault() + new App.ControllerGenericEdit( + id: @organization_id, + genericObject: 'Organization', + pageData: { + title: 'Organizations', + object: 'Organization', + objects: 'Organizations', + }, + callback: @render + ) diff --git a/app/assets/javascripts/app/controllers/tag_widget.js.coffee b/app/assets/javascripts/app/controllers/widget/tag.js.coffee similarity index 89% rename from app/assets/javascripts/app/controllers/tag_widget.js.coffee rename to app/assets/javascripts/app/controllers/widget/tag.js.coffee index f6b1a2075..e67b48a0b 100644 --- a/app/assets/javascripts/app/controllers/tag_widget.js.coffee +++ b/app/assets/javascripts/app/controllers/widget/tag.js.coffee @@ -1,4 +1,4 @@ -class App.TagWidget extends App.Controller +class App.WidgetTag extends App.Controller constructor: -> super @load() @@ -6,6 +6,8 @@ class App.TagWidget extends App.Controller # update box size @bind 'ui:rerender:content', => @siteUpdate() + @bind 'ui:rerender:task', => + @siteUpdate() load: => @attribute_id = 'tags_' + @object.id + '_' + @object_type @@ -24,16 +26,16 @@ class App.TagWidget extends App.Controller render: (tags) => # insert data - @html App.view('tag_widget')( + @html App.view('widget/tag')( tags: tags || [], tag_id: @attribute_id ) @el.find('#' + @attribute_id ).tagsInput( - width: '150px' + width: '100%' defaultText: App.i18n.translateContent('add a Tag') onAddTag: @onAddTag onRemoveTag: @onRemoveTag -# height: '65px' + height: '45px' ) @delay @siteUpdate, 250 diff --git a/app/assets/javascripts/app/controllers/template_widget.js.coffee b/app/assets/javascripts/app/controllers/widget/template.js.coffee similarity index 89% rename from app/assets/javascripts/app/controllers/template_widget.js.coffee rename to app/assets/javascripts/app/controllers/widget/template.js.coffee index c24661ba1..c2da4003e 100644 --- a/app/assets/javascripts/app/controllers/template_widget.js.coffee +++ b/app/assets/javascripts/app/controllers/widget/template.js.coffee @@ -1,4 +1,4 @@ -class App.TemplateUI extends App.Controller +class App.WidgetTemplate extends App.ControllerDrox events: 'click [data-type=template_save]': 'create', 'click [data-type=template_select]': 'select', @@ -21,8 +21,11 @@ class App.TemplateUI extends App.Controller template = App.Template.find( @template_id ) # insert data - @html App.view('template_widget')( - template: template, + @html @template( + file: 'widget/template' + header: 'Templates' + params: + template: template ) new App.ControllerForm( el: @el.find('#form-template') @@ -54,6 +57,7 @@ class App.TemplateUI extends App.Controller e.preventDefault() # get params + form = @formParam( $('.ticket-create') ) params = @formParam(e.target) name = params['template_name'] # delete params['template_name'] @@ -62,10 +66,9 @@ class App.TemplateUI extends App.Controller if !template template = new App.Template - options = params template.load( name: params['template_name'] - options: options + options: form ) # validate form diff --git a/app/assets/javascripts/app/controllers/text_module_widget.js.coffee b/app/assets/javascripts/app/controllers/widget/text_module.js.coffee similarity index 98% rename from app/assets/javascripts/app/controllers/text_module_widget.js.coffee rename to app/assets/javascripts/app/controllers/widget/text_module.js.coffee index fdd23daf0..eca0d8b79 100644 --- a/app/assets/javascripts/app/controllers/text_module_widget.js.coffee +++ b/app/assets/javascripts/app/controllers/widget/text_module.js.coffee @@ -1,4 +1,4 @@ -class App.TextModuleUI extends App.Controller +class App.WidgetTextModule extends App.Controller constructor: -> super @@ -59,7 +59,7 @@ class App.TextModuleUI extends App.Controller return values -class App.TextModuleUIOld extends App.Controller +class App.WidgetTextModuleOld extends App.Controller events: 'click [data-type=save]': 'create', 'click [data-type=text_module_delete]': 'delete', @@ -191,7 +191,7 @@ class App.TextModuleUIOld extends App.Controller ) # insert data - @html App.view('text_module_widget')( + @html App.view('widget/text_module')( search: @search, ) diff --git a/app/assets/javascripts/app/controllers/user_info_widget.js.coffee b/app/assets/javascripts/app/controllers/widget/user.js.coffee similarity index 69% rename from app/assets/javascripts/app/controllers/user_info_widget.js.coffee rename to app/assets/javascripts/app/controllers/widget/user.js.coffee index 326da3233..9016b5023 100644 --- a/app/assets/javascripts/app/controllers/user_info_widget.js.coffee +++ b/app/assets/javascripts/app/controllers/widget/user.js.coffee @@ -1,7 +1,7 @@ -class App.UserInfo extends App.Controller +class App.WidgetUser extends App.ControllerDrox events: 'focusout [data-type=update]': 'update', - 'click [data-type=edit]': 'edit' + 'click [data-type=edit]': 'edit' constructor: -> super @@ -25,7 +25,7 @@ class App.UserInfo extends App.Controller user = @u # get display data - data = [] + userData = [] for item2 in App.User.configure_attributes item = _.clone( item2 ) @@ -36,25 +36,37 @@ class App.UserInfo extends App.Controller item.name = itemNameValueNew # add to show if value exists - if user[item.name] + if user[item.name] || item.tag is 'textarea' # do not show firstname and lastname / already show via diplayName() - if item.name isnt 'firstname' && item.name isnt 'lastname' && item.name isnt 'organization' + if item.name isnt 'firstname' && item.name isnt 'lastname' if item.info - data.push item + userData.push item - # insert data - @html App.view('user_info')( - user: user, - data: data, + # insert userData + @html @template( + file: 'widget/user' + header: 'Customer' + edit: true + params: + user: user + userData: userData ) @userTicketPopups( - selector: '.user-tickets', - user_id: user.id, + selector: '.user-tickets' + user_id: user.id + position: 'right' ) - # update changes + + if user.organization_id + @el.append('
') + new App.WidgetOrganization( + organization_id: user.organization_id + el: @el.find('.org-info') + ) + update: (e) => note = $(e.target).parent().find('[data-type=update]').val() user = App.User.find( @user_id ) diff --git a/app/assets/javascripts/app/index.js.coffee b/app/assets/javascripts/app/index.js.coffee index ad4042f9f..b2874c142 100644 --- a/app/assets/javascripts/app/index.js.coffee +++ b/app/assets/javascripts/app/index.js.coffee @@ -42,7 +42,9 @@ class App extends Spine.Controller # define linkify helper params.L = ( item ) -> - window.linkify( item ) + if item && typeof item is 'string' + return window.linkify( item ) + item # define config helper params.C = ( key ) -> @@ -56,4 +58,4 @@ class App extends Spine.Controller JST["app/views/#{name}"](params) template -window.App = App \ No newline at end of file +window.App = App diff --git a/app/assets/javascripts/app/lib/app_post/collection.js.coffee b/app/assets/javascripts/app/lib/app_post/collection.js.coffee index df2c55413..4c91a8ff1 100644 --- a/app/assets/javascripts/app/lib/app_post/collection.js.coffee +++ b/app/assets/javascripts/app/lib/app_post/collection.js.coffee @@ -25,18 +25,25 @@ class _collectionSingleton extends Spine.Module for type, collections of data if type is 'users' type = 'User' + throw "BREAK, users" if type is 'tickets' type = 'Ticket' + throw "BREAK, tickets" if type is 'ticket_article' type = 'TicketArticle' + throw "BREAK, ticket_article" if type is 'organization' type = 'Organization' + throw "BREAK, organization" if type is 'history_object' type = 'HistoryObject' + throw "BREAK, history_object" if type is 'history_type' type = 'HistoryType' + throw "BREAK, history_type" if type is 'history_attribute' type = 'HistoryAttribute' + throw "BREAK, history_attribute" @log 'debug', 'loadCollection:trigger', type, collections @load( localStorage: data.localStorage, type: type, data: collections ) diff --git a/app/assets/javascripts/app/lib/app_post/interface_handle.js.coffee b/app/assets/javascripts/app/lib/app_post/interface_handle.js.coffee index e46a890f0..49c372518 100644 --- a/app/assets/javascripts/app/lib/app_post/interface_handle.js.coffee +++ b/app/assets/javascripts/app/lib/app_post/interface_handle.js.coffee @@ -47,7 +47,7 @@ class App.Run extends App.Controller App.Event.trigger( event + ':ready') class App.Content extends App.Controller - className: 'container' + className: 'content' constructor: -> super diff --git a/app/assets/javascripts/app/lib/app_post/task_manager.js.coffee b/app/assets/javascripts/app/lib/app_post/task_manager.js.coffee index da9aa3a32..9aa54e6a5 100644 --- a/app/assets/javascripts/app/lib/app_post/task_manager.js.coffee +++ b/app/assets/javascripts/app/lib/app_post/task_manager.js.coffee @@ -147,7 +147,7 @@ class _taskManagerSingleton extends App.Controller # create div for permanent content if !$("#content_permanent")[0] - $('#app section').append('
') + $('#app section').append('
') # empty static content if task is shown if active @@ -208,6 +208,7 @@ class _taskManagerSingleton extends App.Controller worker = @worker( key ) if worker && worker.activate worker.activate() + App.Event.trigger('ui:rerender:task') # return if controller is already started return if @workersStarted[key] diff --git a/app/assets/javascripts/app/lib/bootstrap/bootstrap-button.js b/app/assets/javascripts/app/lib/bootstrap/bootstrap-button.js deleted file mode 100644 index ce4599164..000000000 --- a/app/assets/javascripts/app/lib/bootstrap/bootstrap-button.js +++ /dev/null @@ -1,105 +0,0 @@ -/* ============================================================ - * bootstrap-button.js v2.3.2 - * http://twitter.github.com/bootstrap/javascript.html#buttons - * ============================================================ - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* BUTTON PUBLIC CLASS DEFINITION - * ============================== */ - - var Button = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, $.fn.button.defaults, options) - } - - Button.prototype.setState = function (state) { - var d = 'disabled' - , $el = this.$element - , data = $el.data() - , val = $el.is('input') ? 'val' : 'html' - - state = state + 'Text' - data.resetText || $el.data('resetText', $el[val]()) - - $el[val](data[state] || this.options[state]) - - // push to event loop to allow forms to submit - setTimeout(function () { - state == 'loadingText' ? - $el.addClass(d).attr(d, d) : - $el.removeClass(d).removeAttr(d) - }, 0) - } - - Button.prototype.toggle = function () { - var $parent = this.$element.closest('[data-toggle="buttons-radio"]') - - $parent && $parent - .find('.active') - .removeClass('active') - - this.$element.toggleClass('active') - } - - - /* BUTTON PLUGIN DEFINITION - * ======================== */ - - var old = $.fn.button - - $.fn.button = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('button') - , options = typeof option == 'object' && option - if (!data) $this.data('button', (data = new Button(this, options))) - if (option == 'toggle') data.toggle() - else if (option) data.setState(option) - }) - } - - $.fn.button.defaults = { - loadingText: 'loading...' - } - - $.fn.button.Constructor = Button - - - /* BUTTON NO CONFLICT - * ================== */ - - $.fn.button.noConflict = function () { - $.fn.button = old - return this - } - - - /* BUTTON DATA-API - * =============== */ - - $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) { - var $btn = $(e.target) - if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') - $btn.button('toggle') - }) - -}(window.jQuery); \ No newline at end of file diff --git a/app/assets/javascripts/app/lib/bootstrap/bootstrap-collapse.js b/app/assets/javascripts/app/lib/bootstrap/bootstrap-collapse.js deleted file mode 100644 index 74a73a890..000000000 --- a/app/assets/javascripts/app/lib/bootstrap/bootstrap-collapse.js +++ /dev/null @@ -1,167 +0,0 @@ -/* ============================================================= - * bootstrap-collapse.js v2.3.2 - * http://twitter.github.com/bootstrap/javascript.html#collapse - * ============================================================= - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* COLLAPSE PUBLIC CLASS DEFINITION - * ================================ */ - - var Collapse = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, $.fn.collapse.defaults, options) - - if (this.options.parent) { - this.$parent = $(this.options.parent) - } - - this.options.toggle && this.toggle() - } - - Collapse.prototype = { - - constructor: Collapse - - , dimension: function () { - var hasWidth = this.$element.hasClass('width') - return hasWidth ? 'width' : 'height' - } - - , show: function () { - var dimension - , scroll - , actives - , hasData - - if (this.transitioning || this.$element.hasClass('in')) return - - dimension = this.dimension() - scroll = $.camelCase(['scroll', dimension].join('-')) - actives = this.$parent && this.$parent.find('> .accordion-group > .in') - - if (actives && actives.length) { - hasData = actives.data('collapse') - if (hasData && hasData.transitioning) return - actives.collapse('hide') - hasData || actives.data('collapse', null) - } - - this.$element[dimension](0) - this.transition('addClass', $.Event('show'), 'shown') - $.support.transition && this.$element[dimension](this.$element[0][scroll]) - } - - , hide: function () { - var dimension - if (this.transitioning || !this.$element.hasClass('in')) return - dimension = this.dimension() - this.reset(this.$element[dimension]()) - this.transition('removeClass', $.Event('hide'), 'hidden') - this.$element[dimension](0) - } - - , reset: function (size) { - var dimension = this.dimension() - - this.$element - .removeClass('collapse') - [dimension](size || 'auto') - [0].offsetWidth - - this.$element[size !== null ? 'addClass' : 'removeClass']('collapse') - - return this - } - - , transition: function (method, startEvent, completeEvent) { - var that = this - , complete = function () { - if (startEvent.type == 'show') that.reset() - that.transitioning = 0 - that.$element.trigger(completeEvent) - } - - this.$element.trigger(startEvent) - - if (startEvent.isDefaultPrevented()) return - - this.transitioning = 1 - - this.$element[method]('in') - - $.support.transition && this.$element.hasClass('collapse') ? - this.$element.one($.support.transition.end, complete) : - complete() - } - - , toggle: function () { - this[this.$element.hasClass('in') ? 'hide' : 'show']() - } - - } - - - /* COLLAPSE PLUGIN DEFINITION - * ========================== */ - - var old = $.fn.collapse - - $.fn.collapse = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('collapse') - , options = $.extend({}, $.fn.collapse.defaults, $this.data(), typeof option == 'object' && option) - if (!data) $this.data('collapse', (data = new Collapse(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.collapse.defaults = { - toggle: true - } - - $.fn.collapse.Constructor = Collapse - - - /* COLLAPSE NO CONFLICT - * ==================== */ - - $.fn.collapse.noConflict = function () { - $.fn.collapse = old - return this - } - - - /* COLLAPSE DATA-API - * ================= */ - - $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) { - var $this = $(this), href - , target = $this.attr('data-target') - || e.preventDefault() - || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 - , option = $(target).data('collapse') ? 'toggle' : $this.data() - $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed') - $(target).collapse(option) - }) - -}(window.jQuery); \ No newline at end of file diff --git a/app/assets/javascripts/app/lib/bootstrap/bootstrap-dropdown.js b/app/assets/javascripts/app/lib/bootstrap/bootstrap-dropdown.js deleted file mode 100644 index 6cc122113..000000000 --- a/app/assets/javascripts/app/lib/bootstrap/bootstrap-dropdown.js +++ /dev/null @@ -1,169 +0,0 @@ -/* ============================================================ - * bootstrap-dropdown.js v2.3.2 - * http://twitter.github.com/bootstrap/javascript.html#dropdowns - * ============================================================ - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* DROPDOWN CLASS DEFINITION - * ========================= */ - - var toggle = '[data-toggle=dropdown]' - , Dropdown = function (element) { - var $el = $(element).on('click.dropdown.data-api', this.toggle) - $('html').on('click.dropdown.data-api', function () { - $el.parent().removeClass('open') - }) - } - - Dropdown.prototype = { - - constructor: Dropdown - - , toggle: function (e) { - var $this = $(this) - , $parent - , isActive - - if ($this.is('.disabled, :disabled')) return - - $parent = getParent($this) - - isActive = $parent.hasClass('open') - - clearMenus() - - if (!isActive) { - if ('ontouchstart' in document.documentElement) { - // if mobile we we use a backdrop because click events don't delegate - $('