123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448 |
- class App.Controller extends Spine.Controller
-
- # add @title methode to set title
- title: (name) ->
- # $('html head title').html( Config.product_name + ' - ' + Ti(name) )
- document.title = Config.product_name + ' - ' + Ti(name)
- # add @notify methode to create notification
- notify: (data) ->
- Spine.trigger 'notify', data
- # add @navupdate methode to update navigation
- navupdate: (url) ->
- Spine.trigger 'navupdate', url
- scrollTo: ( x = 0, y = 0 ) ->
- a = ->
- console.log('scollTo', x, y )
- window.scrollTo( x, y )
- @delay( a, 0 )
- reBind: (name, callback) =>
- Spine.one name, (data) =>
- @log 'rebind', name, data
- callback(data)
- @reBind(name, callback)
- isRole: (name) ->
- return false if !window.Session.roles
- for role in window.Session.roles
- return true if role.name is name
- return false
- # get all params of the form
- formParam: (form) ->
- App.ControllerForm.params(form)
- formDisable: (form) ->
- App.ControllerForm.disable(form)
- formEnable: (form) ->
- App.ControllerForm.enable(form)
- formValidate: (data) ->
- App.ControllerForm.validate(data)
- ###
- table = @table(
- header: ['Host', 'User', 'Adapter', 'Active'],
- overview: ['host', 'user', 'adapter', 'active'],
- model: App.Channel,
- objects: data,
- )
- table = @table(
- overview_extended: [
- { name: 'number', link: true },
- { name: 'title', link: true },
- { name: 'customer', class: 'user-data', data: { id: true } },
- { name: 'ticket_state', translate: true },
- { name: 'ticket_priority', translate: true },
- { name: 'group' },
- { name: 'owner', class: 'user-data', data: { id: true } },
- { name: 'created_at', callback: @frontendTime },
- { name: 'last_contact', callback: @frontendTime },
- { name: 'last_contact_agent', callback: @frontendTime },
- { name: 'last_contact_customer', callback: @frontendTime },
- { name: 'first_response', callback: @frontendTime },
- { name: 'close_time', callback: @frontendTime },
- ],
- model: App.Ticket,
- objects: tickets,
- )
- ###
- table: (data) ->
- overview = data.overview || data.model.configure_overview || []
- attributes = data.attributes || data.model.configure_attributes || {}
- header = data.header
- # define normal header
- if !header
- header = []
- for row in overview
- if attributes
- for attribute in attributes
- if row is attribute.name
- header.push( attribute.display )
- else
- rowWithoutId = row + '_id'
- if rowWithoutId is attribute.name
- header.push( attribute.display )
- dataTypesForCols = []
- for row in overview
- dataTypesForCols.push {
- name: row,
- link: true,
- }
- # extended table format
- if data.overview_extended
- if !header
- header = []
- for row in data.overview_extended
- for attribute in attributes
- if row.name is attribute.name
- header.push( attribute.display )
- else
- rowWithoutId = row.name + '_id'
- if rowWithoutId is attribute.name
- header.push( attribute.display )
- dataTypesForCols = data.overview_extended
- # generate content data
- objects = _.clone( data.objects )
- for object in objects
- # check if info for each col. is already there
- for row in dataTypesForCols
- # execute callback on content
- if row.callback
- object[row.name] = row.callback( object[row.name] )
- # lookup relation
- if !object[row.name]
- rowWithoutId = row.name + '_id'
- for attribute in attributes
- if rowWithoutId is attribute.name
- if attribute.relation && App[attribute.relation]
- record = App.Collection.find( attribute.relation, object[rowWithoutId] )
- object[row.name] = record.name
- @log 'table', 'header', header, 'overview', dataTypesForCols, 'objects', objects
- table = App.view('generic/table')(
- header: header,
- overview: dataTypesForCols,
- objects: objects,
- checkbox: data.checkbox,
- )
- # @log 'ttt', $(table).find('span')
- # $(table).find('span').bind('click', ->
- # console.log('----------click---------')
- # )
- # convert to jquery object
- table = $(table)
- # 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 );
- else
- $(e.target).parents().find('[name="bulk"]').attr( 'checked', false );
- )
- return table
- ticketTableAttributes: (attributes) =>
- all_attributes = [
- { name: 'number', link: true },
- { name: 'title', link: true },
- { name: 'customer', class: 'user-data', data: { id: true } },
- { name: 'ticket_state', translate: true },
- { name: 'ticket_priority', translate: true },
- { name: 'group' },
- { name: 'owner', class: 'user-data', data: { id: true } },
- { name: 'created_at', callback: @frontendTime },
- { name: 'last_contact', callback: @frontendTime },
- { name: 'last_contact_agent', callback: @frontendTime },
- { name: 'last_contact_customer', callback: @frontendTime },
- { name: 'first_response', callback: @frontendTime },
- { name: 'close_time', callback: @frontendTime },
- ]
- shown_all_attributes = []
- for all_attribute in all_attributes
- for attribute in attributes
- if all_attribute['name'] is attribute
- shown_all_attributes.push all_attribute
- break
- return shown_all_attributes
- # redirectToLogin: (data) ->
- #
- # human readable file size
- humanFileSize: (size) =>
- if size > ( 1024 * 1024 )
- size = Math.round( size / ( 1024 * 1024 ) ) + ' MBytes'
- else if size > 1024
- size = Math.round( size / 1024 ) + ' KBytes'
- else
- size = size + ' Bytes'
- return size
- # human readable time
- humanTime: (time) =>
- current = new Date()
- created = new Date(time)
- string = ''
- diff = ( current - created ) / 1000
- if diff >= 86400
- unit = Math.round( ( diff / 86400 ) )
- # if unit > 1
- # return unit + ' ' + T('days')
- # else
- # return unit + ' ' + T('day')
- string = unit + ' ' + T('d')
- if diff >= 3600
- unit = Math.round( ( diff / 3600 ) % 24 )
- # if unit > 1
- # return unit + ' ' + T('hours')
- # else
- # return unit + ' ' + T('hour')
- if string isnt ''
- string = string + ' ' + unit + ' ' + T('h')
- return string
- else
- string = unit + ' ' + T('h')
- if diff <= 86400
- unit = Math.round( ( diff / 60 ) % 60 )
- # if unit > 1
- # return unit + ' ' + T('minutes')
- # else
- # return unit + ' ' + T('minute')
- if string isnt ''
- string = string + ' ' + unit + ' ' + T('m')
- return string
- else
- string = unit + ' ' + T('m')
- return string
- userInfo: (data) =>
- # start customer info controller
- new App.UserInfo(
- el: data.el || $('#customer_info'),
- user_id: data.user_id,
- )
- authenticate: ->
- console.log 'authenticate', window.Session
-
- # return rtue if session exists
- return true if window.Session['id']
- # remember requested url
- window.Config['requested_url'] = window.location.hash
- # redirect to login
- @navigate '#login'
- return false
- frontendTime: (timestamp) ->
- '<span class="humanTimeFromNow" data-time="' + timestamp + '">?</span>'
- frontendTimeUpdate: ->
- update = =>
- ui = @
- $('.humanTimeFromNow').each( ->
- # console.log('rewrite frontendTimeUpdate', this)
- timestamp = $(this).data('time')
- time = ui.humanTime( timestamp )
- $(this).attr( 'title', Ts(timestamp) )
- $(this).text( time )
- )
- @interval( update, 30000, 'frontendTimeUpdate' )
- clearInterval: (interval_id) =>
- # check global var
- if !@intervalID
- @intervalID = {}
- clearInterval( @intervalID[interval_id] ) if @intervalID[interval_id]
- interval: (callback, interval, interval_id) =>
- # check global var
- if !@intervalID
- @intervalID = {}
- callback()
- # auto save
- every = (ms, cb) -> setInterval cb, ms
- # clear auto save
- clearInterval( @intervalID[interval_id] ) if @intervalID[interval_id]
- # request new data
- @intervalID[interval_id] = every interval, () =>
- callback()
- userPopups: (position = 'right') ->
- # remove old popovers
- $('.popover-inner').parent().remove()
- # show user popup
- $('.user-data').popover(
- delay: { show: 500, hide: 1200 },
- # placement: 'bottom',
- placement: position,
- title: ->
- user_id = $(@).data('id')
- user = App.Collection.find( 'User', user_id )
- user.realname
- content: ->
- user_id = $(@).data('id')
- user = App.Collection.find( 'User', user_id )
- # get display data
- data = []
- for item in App.User.configure_attributes
- if user[item.name]
- if item.name isnt 'firstname'
- if item.name isnt 'lastname'
- if item.info #&& ( @user[item.name] || item.name isnt 'note' )
- data.push item
- # insert data
- App.view('user_info_small')(
- user: user,
- data: data,
- )
- )
- userTicketPopups: (data) ->
- # remove old popovers
- $('.popover-inner').parent().remove()
- # get data
- tickets = {}
- App.Com.ajax(
- type: 'GET',
- url: '/api/ticket_customer',
- data: {
- customer_id: data.user_id,
- }
- processData: true,
- success: (data, status, xhr) =>
- tickets = data.tickets
- )
- if !data.position
- data.position = 'left'
- # show user popup
- controller = @
- $(data.selector).popover(
- delay: { show: 500, hide: 5200 },
- placement: data.position,
- title: ->
- $(@).find('[title="*"]').val()
- content: ->
- type = $(@).filter('[data-type]').data('type')
- data = tickets[type] || []
- # set human time
- for ticket in data
- ticket.humanTime = controller.humanTime(ticket.created_at)
- # insert data
- App.view('user_ticket_info_small')(
- tickets: data,
- )
- )
- ws_send: (data) ->
- Spine.trigger( 'ws:send', JSON.stringify(data) )
- class App.ControllerModal extends App.Controller
- className: 'modal hide fade',
- tag: 'div',
- events:
- 'submit form': 'submit',
- 'click .submit': 'submit',
- 'click .cancel': 'modalHide',
- 'click .close': 'modalHide',
- constructor: (options) ->
- # do not use @el, because it's inserted by js
- if options
- delete options.el
-
- # callbacks
- # @callback = {}
- # if options.success
- # @callback.success = options.success
- # if options.error
- # @callback.error = options.error
- super(options)
- modalShow: (params) =>
- defaults = {
- backdrop: true,
- keyboard: true,
- show: true,
- }
- data = $.extend({}, defaults, params)
- @el.modal(data)
- @el.bind('hidden', =>
- # navigate back to home page
- if @pageData && @pageData.home
- @navigate @pageData.home
- # navigate back
- if params && params.navigateBack
- window.history.back()
- # remove modal from dom
- $('.modal').remove();
- )
- modalHide: (e) =>
- if e
- e.preventDefault()
- @el.modal('hide')
- submit: (e) =>
- e.preventDefault()
- @log 'You need to implement your own "submit" method!'
- class App.ErrorModal extends App.ControllerModal
- constructor: ->
- super
- @render()
- render: ->
- @html App.view('error')(
- message: @message
- )
- @modalShow(
- backdrop: false,
- keyboard: false,
- )
|