Browse Source

Moved to new memory management, http://blog.alexmaccaw.com/jswebapps-memory-management

Martin Edenhofer 11 years ago
parent
commit
91d3bb8965

+ 7 - 1
app/assets/javascripts/app/controllers/_application_controller.js.coffee

@@ -9,10 +9,16 @@ class App.Controller extends Spine.Controller
 
     super
 
+    # apply to release controller on dom remove
+    @el.on('remove', @release)
+
     # create shortcuts
     @Config  = App.Config
     @Session = App.Session
 
+  release: =>
+    # release custom bindings after it got removed from dom
+
   # add @title methode to set title
   title: (name) ->
 #    $('html head title').html( @Config.get(product_name) + ' - ' + App.i18n.translateInline(name) )
@@ -206,7 +212,7 @@ class App.Controller extends Spine.Controller
     # remember requested url
     @Config.set( 'requested_url', window.location.hash )
 
-    # redirect to login  
+    # redirect to login
     @navigate '#login'
     return false
 

+ 5 - 17
app/assets/javascripts/app/controllers/_application_controller_generic.js.coffee

@@ -108,26 +108,11 @@ class App.ControllerGenericIndex extends App.ControllerContent
     # set title
     @title @pageData.title
 
-    # set nav bar    
+    # set nav bar
     @navupdate @pageData.navupdate
 
     # bind render after a change is done
-    App.Collection.observe(
-      level:       'page',
-      collections: [
-        {
-          collection: @genericObject,
-          event:      'refresh change',
-          callback:   @render,
-        },
-      ],
-    )
-    App.Event.bind(
-      @genericObject+ ':created ' + @genericObject + ':updated ' + @genericObject + ':destroy'
-      =>
-        App[ @genericObject ].fetch()
-      'page'
-    )
+    @subscribeId = App[ @genericObject ].subscribe(@render)
 
     App[ @genericObject ].bind 'ajaxError', (rec, msg) =>
       @log 'error', 'ajax', msg.status
@@ -143,6 +128,9 @@ class App.ControllerGenericIndex extends App.ControllerContent
     # fetch all
     App[ @genericObject ].fetch()
 
+  release: =>
+    App[ @genericObject ].unsubscribe(@subscribeId)
+
   render: =>
 
     objects = App.Collection.all(

+ 3 - 6
app/assets/javascripts/app/controllers/agent_ticket_create.js.coffee

@@ -80,10 +80,7 @@ class App.TicketCreate extends App.Controller
     return true
 
   release: =>
-#    @clearInterval( @key, 'ticket_zoom' )
-    @el.remove()
     @clearInterval( @id, @auto_save_key )
-    @textModule.release()
 
   autosave: =>
     @auto_save_key = 'create' + @type + @id
@@ -203,15 +200,15 @@ class App.TicketCreate extends App.Controller
 
     # show template UI
     new App.TemplateUI(
-      el:          @el.find('[data-id="ticket_template"]'),
-      template_id: template['id'],
+      el:          @el.find('[data-id="ticket_template"]')
+      template_id: template['id']
     )
 
     @formDefault = @formParam( @el.find('.ticket-create') )
 
     # show text module UI
     @textModule = new App.TextModuleUI(
-      el: @el.find('.ticket-create')
+      el: @el.find('.ticket-create').find('textarea')
     )
 
   localUserInfo: (params) =>

+ 1 - 1
app/assets/javascripts/app/controllers/agent_ticket_history.js.coffee

@@ -34,7 +34,7 @@ class App.TicketHistory extends App.ControllerModal
         App.Collection.load( type: 'HistoryAttribute', data: data.history_attributes )
 
         # load history collections
-        App.Collection.deleteAll( 'History' )
+        App.History.deleteAll()
         App.Collection.load( type: 'History', data: data.history )
 
         # render page

+ 0 - 13
app/assets/javascripts/app/controllers/agent_ticket_view.js.coffee

@@ -86,19 +86,6 @@ class Index extends App.ControllerContent
       @log 'notice', 'refetch...', record
       @fetch()
 
-#    # bind render after a change is done
-#    App.Collection.observe(
-#      level:       'page',
-#      collections: [
-#        {
-#          collection: @genericObject,
-#          event:      'refresh change',
-#          callback:   @render,
-#        },
-#      ],
-#    )
-
-
     @ticket_list_show = []
     for ticket_id in @ticket_list
       @ticket_list_show.push App.Collection.find( 'Ticket', ticket_id )

+ 1 - 1
app/assets/javascripts/app/controllers/task_widget.js.coffee

@@ -1,6 +1,6 @@
 class App.TaskWidget extends App.Controller
   events:
-    'click    [data-type="close"]': 'remove'
+    'click [data-type="close"]': 'remove'
 
   constructor: ->
     super

+ 10 - 22
app/assets/javascripts/app/controllers/template_widget.js.coffee

@@ -6,22 +6,10 @@ class App.TemplateUI extends App.Controller
 
   constructor: ->
     super
+    @subscribeId = App.Template.subscribe(@render, initFetch: true )
 
-    # fetch item on demand
-    fetch_needed = 1
-    if App.Collection.count( 'Template' ) > 0
-      fetch_needed = 0
-      @render()
-
-    if fetch_needed
-      @reload()
-
-  reload: =>
-      App.Template.bind 'refresh', =>
-        @log 'notice', 'loading...'
-        @render()
-        App.Template.unbind 'refresh'
-      App.Collection.fetch( 'Template' )
+  release: =>
+    App.Template.unsubscribe(@subscribeId)
 
   render: =>
     @configure_attributes = [
@@ -30,16 +18,16 @@ class App.TemplateUI extends App.Controller
 
     template = {}
     if @template_id
-      template = App.Collection.find( 'Template', @template_id )
+      template = App.Template.find( @template_id )
 
     # insert data
     @html App.view('template_widget')(
       template: template,
     )
     new App.ControllerForm(
-      el: @el.find('#form-template'),
-      model: { configure_attributes: @configure_attributes, className: '' },
-      autofocus: false,
+      el:        @el.find('#form-template')
+      model:     { configure_attributes: @configure_attributes, className: '' }
+      autofocus: false
     )
 
   delete: (e) =>
@@ -47,9 +35,9 @@ class App.TemplateUI extends App.Controller
 
     # get params
     params = @formParam(e.target)
-    template = App.Collection.find( 'Template', params['template_id'] )
+    template = App.Template.find( params['template_id'] )
     if confirm('Sure?')
-      template.destroy() 
+      template.destroy()
       @template_id = undefined
       @render()
 
@@ -59,7 +47,7 @@ class App.TemplateUI extends App.Controller
     # get params
     params = @formParam(e.target)
 
-    template = App.Collection.find( 'Template', params['template_id'] )
+    template = App.Template.find( params['template_id'] )
     App.Event.trigger 'ticket_create_rerender', template.attributes()
 
   create: (e) =>

+ 16 - 29
app/assets/javascripts/app/controllers/text_module_widget.js.coffee

@@ -10,36 +10,23 @@ class App.TextModuleUI extends App.Controller
                           .text("(" + e.keywords + ")").end()
       element.append(template)
 
-    @el.find('textarea').sew(
-        values:         @reload()
-        token:          '::'
-        elementFactory: elementFactory
+    @el.parent().find('textarea').sew(
+      values:         @reload(@data)
+      token:          '::'
+      elementFactory: elementFactory
     )
 
-    App.TextModule.bind(
-      'refresh change'
-      =>
-       @reload()
-    )
-
-    # subscribe and reload data / fetch new data if triggered
-    @bindLevel = 'TextModule-' + Math.floor( Math.random() * 99999 )
-    App.Event.bind(
-      'TextModule:updated TextModule:created TextModule:destroy'
-      =>
-        App.TextModule.fetch()
-      @bindLevel
-    )
-
-    # fetch init collection
-    App.TextModule.fetch()
+    @subscribeId = App.TextModule.subscribe(@update, initFetch: true )
 
   release: =>
-    App.Event.unbindLevel(@bindLevel)
+    App.TextModule.unsubscribe(@subscribeId)
 
   reload: (data = false) =>
     if data
       @lastData = data
+    @update()
+
+  update: =>
     all = App.TextModule.all()
     values = [{val: '-', keywords: '-'}]
     ui = @lastData || @
@@ -51,7 +38,7 @@ class App.TextModuleUI extends App.Controller
           try
             key = eval (varString)
           catch error
-            console.log( "tag replacement: " + error )
+            #console.log( "tag replacement: " + error )
             key = ''
           return key
         )
@@ -62,10 +49,10 @@ class App.TextModuleUI extends App.Controller
       values.shift()
 
     # set new data
-    if @el.find('textarea')[0]
-      if $(@el.find('textarea')[0]).data()
-        if $(@el.find('textarea')[0]).data().plugin_sew
-          $(@el.find('textarea')[0]).data().plugin_sew.options.values = values
+    if @el[0]
+      if $(@el[0]).data()
+        if $(@el[0]).data().plugin_sew
+          $(@el[0]).data().plugin_sew.options.values = values
 
     return values
 
@@ -82,7 +69,7 @@ class App.TextModuleUIOld extends App.Controller
 
     # fetch item on demand
     fetch_needed = 1
-    if App.Collection.count( 'TextModule' ) > 0
+    if App.TextModule.count() > 0
       fetch_needed = 0
       @render()
 
@@ -94,7 +81,7 @@ class App.TextModuleUIOld extends App.Controller
         @log 'notice', 'loading....'
         @render()
         App.TextModule.unbind 'refresh'
-      App.Collection.fetch( 'TextModule' )
+      App.TextModule.fetch()
 
   render: =>
 

+ 31 - 22
app/assets/javascripts/app/controllers/ticket_zoom.js.coffee

@@ -58,25 +58,8 @@ class App.TicketZoom extends App.Controller
     return true
 
   release: =>
-    @textModule.release()
     App.Event.unbindLevel 'ticket-zoom-' + @ticket_id
     @clearInterval( @key, 'ticket_zoom' )
-    @el.remove()
-
-  autosave: =>
-    @auto_save_key = 'zoom' + @id
-
-    @autosaveLast = _.clone( @formDefault )
-    update = =>
-      currentData = @formParam( @el.find('.ticket-update') )
-      diff = difference( @autosaveLast, currentData )
-      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()
-        App.TaskManager.update( @task_key, { 'state': currentData })
-    @interval( update, 1500, @id,  @auto_save_key )
 
   fetch: (ticket_id, force) ->
 
@@ -156,7 +139,6 @@ class App.TicketZoom extends App.Controller
 
     # update taskbar with new meta data
     App.Event.trigger 'task:render'
-
     if !@renderDone
       @renderDone = true
       @html App.view('ticket_zoom')(
@@ -185,8 +167,8 @@ class App.TicketZoom extends App.Controller
 
     # show text module UI
     if !@isRole('Customer')
-      @textModule = new App.TextModuleUI(
-        el:   @el
+      new App.TextModuleUI(
+        el:   @el.find('textarea')
         data:
           ticket: @ticket
       )
@@ -235,6 +217,7 @@ class App.TicketZoom extends App.Controller
     # show ticket action row
     new TicketAction(
       ticket:     @ticket
+      task_key:   @task_key
       el:         @el.find('.ticket-action')
       ui:         @
     )
@@ -337,6 +320,9 @@ class Edit extends App.Controller
     super
     @render()
 
+  release: =>
+    @autosaveStop()
+
   render: ->
 
     ticket = App.Collection.find( 'Ticket', @ticket.id )
@@ -431,13 +417,32 @@ class Edit extends App.Controller
     @ui.formDefault = @formParam( @el.find('.ticket-update') )
 
     # start auto save
-    @ui.autosave()
+    @autosaveStart()
 
     # enable user popups
     @userPopups()
 
+  autosaveStop: =>
+    @clearInterval( @ticket.id,  @auto_save_key )
+
+  autosaveStart: =>
+    @auto_save_key = 'zoom' + @ticket.id
+
+    @autosaveLast = _.clone( @ui.formDefault )
+    update = =>
+      currentData = @formParam( @el.find('.ticket-update') )
+      diff = difference( @autosaveLast, currentData )
+      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()
+        App.TaskManager.update( @task_key, { 'state': currentData })
+    @interval( update, 1500, @ticket.id,  @auto_save_key )
+
   update: (e) =>
     e.preventDefault()
+    @autosaveStop()
     params = @formParam(e.target)
 
     ticket = App.Collection.find( 'Ticket', @ticket.id )
@@ -477,7 +482,10 @@ class Edit extends App.Controller
       attachmentTranslated = App.i18n.translateContent('Attachment')
       attachmentTranslatedRegExp = new RegExp( attachmentTranslated, 'i' )
       if params['body'].match(/attachment/i) || params['body'].match( attachmentTranslatedRegExp )
-        return if !confirm( App.i18n.translateContent('You use attachment in text but no attachment is attached. Do you want to continue?') )
+        if !confirm( App.i18n.translateContent('You use attachment in text but no attachment is attached. Do you want to continue?') )
+          return
+        else
+          @autosaveStart()
 
     ticket.load( ticket_update )
     @log 'notice', 'update ticket', ticket_update, ticket
@@ -489,6 +497,7 @@ class Edit extends App.Controller
     if errors
       @log 'error', 'update', errors
       @formEnable(e)
+      @autosaveStart()
 
     ticket.save(
       success: (r) =>

+ 10 - 1
app/assets/javascripts/app/controllers/user_info_widget.js.coffee

@@ -6,14 +6,23 @@ class App.UserInfo extends App.Controller
   constructor: ->
     super
 
+    # show user
     callback = (user) =>
       @render(user)
       if @callback
         @callback(user)
 
-    App.Collection.find( 'User', @user_id, callback )
+      # subscribe and reload data / fetch new data if triggered
+      @subscribeId = user.subscribe(@render)
+
+    App.User.retrieve( @user_id, callback )
+
+  release: =>
+    App.User.unsubscribe(@subscribeId)
 
   render: (user) =>
+    if !user
+      user = @u
 
     # get display data
     data = []

Some files were not shown because too many files changed in this diff