Просмотр исходного кода

Detach not shown task to deduce dom nodes and increase speed.

Martin Edenhofer 8 лет назад
Родитель
Сommit
6b81b791ed

+ 14 - 4
app/assets/javascripts/app/controllers/_application_controller.coffee

@@ -645,9 +645,19 @@ class App.ControllerPermanent extends App.Controller
 
     super
 
-    $('.content').addClass('hide')
     @navShow()
 
+class App.ControllerSubContent extends App.Controller
+  constructor: ->
+    if @requiredPermission
+      @permissionCheckRedirect(@requiredPermission)
+
+    super
+
+  show: =>
+    return if !@header
+    @title @header, true
+
 class App.ControllerContent extends App.Controller
   constructor: ->
     if @requiredPermission
@@ -655,10 +665,10 @@ class App.ControllerContent extends App.Controller
 
     super
 
-    $('.content').addClass('hide')
-    $('#content').removeClass('hide')
-    @navShow()
+    # hide tasks
     App.TaskManager.hideAll()
+    $('#content').removeClass('hide').removeClass('active')
+    @navShow()
 
 class App.ControllerModal extends App.Controller
   authenticateRequired: false

+ 88 - 59
app/assets/javascripts/app/controllers/_application_controller_generic.coffee

@@ -373,19 +373,65 @@ class App.ControllerTabs extends App.Controller
     @lastActiveTab = $(e.target).attr('href')
     @Config.set('lastTab', @lastActiveTab)
 
-class App.ControllerNavSidbar extends App.ControllerContent
+class App.ControllerNavSidbar extends App.Controller
   constructor: (params) ->
     super
 
-    @navupdate ''
-
     if @authenticateRequired
       @authenticateCheckRedirect()
 
-    @params = params
+    @user = App.User.find(App.Session.get('id'))
+
+    @render(true)
+
+    @bind('ui:rerender',
+      =>
+        @render(true)
+        @updateNavigation(true)
+    )
+
+  show: (params) =>
+    @navupdate ''
+    @shown = true
+    for key, value of params
+      if key isnt 'el' && key isnt 'shown' && key isnt 'match'
+        @[key] = value
+    @updateNavigation()
+    if @activeController && _.isFunction(@activeController.show)
+      @activeController.show(params)
+
+  hide: =>
+    @shown = false
+    if @activeController && _.isFunction(@activeController.hide)
+      @activeController.hide()
+
+  render: (force = false) =>
+    groups = @groupsSorted()
+    selectedItem = @selectedItem(groups)
+
+    @html App.view('generic/navbar_level2/index')(
+      className: @configKey
+    )
+    @$('.sidebar').html App.view('generic/navbar_level2/navbar')(
+      groups: groups
+      className: @configKey
+      selectedItem: selectedItem
+    )
+
+  updateNavigation: (force) =>
+    groups = @groupsSorted()
+    selectedItem = @selectedItem(groups)
+    return if !selectedItem
+    return if !force && @lastTarget && selectedItem.target is @lastTarget
+    @lastTarget = selectedItem.target
+    @$('.sidebar li').removeClass('active')
+    @$(".sidebar li a[href=\"#{selectedItem.target}\"]").parent().addClass('active')
+
+    @executeController(selectedItem)
+
+  groupsSorted: =>
 
     # get accessable groups
-    user = App.User.find(App.Session.get('id'))
     groups = App.Config.get(@configKey)
     groupsUnsorted = []
     for key, item of groups
@@ -395,13 +441,15 @@ class App.ControllerNavSidbar extends App.ControllerContent
         else
           match = false
           for permissionName in item.permission
-            if !match && user.permission(permissionName)
+            if !match && @user.permission(permissionName)
               match = true
               groupsUnsorted.push item
-    @groupsSorted = _.sortBy(groupsUnsorted, (item) -> return item.prio)
+    _.sortBy(groupsUnsorted, (item) -> return item.prio)
+
+  selectedItem: (groups) =>
 
     # get items of group
-    for group in @groupsSorted
+    for group in groups
       items = App.Config.get(@configKey)
       itemsUnsorted = []
       for key, item of items
@@ -412,76 +460,57 @@ class App.ControllerNavSidbar extends App.ControllerContent
             else
               match = false
               for permissionName in item.permission
-                if !match && user && user.permission(permissionName)
+                if !match && @user && @user.permission(permissionName)
                   match = true
                   itemsUnsorted.push item
 
       group.items = _.sortBy(itemsUnsorted, (item) -> return item.prio)
 
-    # check last selected item
-    selectedItem = undefined
-    selectedItemMeta = App.Config.get("Runtime::#{@configKey}")
-    keepLastMenuFor = 1000 * 60 * 10
-    if selectedItemMeta && selectedItemMeta.date && new Date < new Date( selectedItemMeta.date.getTime() + keepLastMenuFor )
-      selectedItem = selectedItemMeta.selectedItem
-
     # set active item
-    for group in @groupsSorted
+    selectedItem = undefined
+    for group in groups
       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 if @target && window.location.hash.match(item.target)
+          if item.target.match("/#{@target}$")
             item.active = true
             selectedItem = item
           else
             item.active = false
 
-    @renderContainer(selectedItem)
-    @renderNavBar(selectedItem)
+    if !selectedItem
+      for group in groups
+        break if selectedItem
+        if group.items
+          for item in group.items
+            item.active = true
+            selectedItem = item
+            break
 
-    @bind(
-      'ui:rerender'
-      =>
-        @renderNavBar(selectedItem)
-    )
+    selectedItem
 
-  renderContainer: =>
-    return if $( ".#{@configKey}" )[0]
-    @html App.view('generic/navbar_level2/index')(
-      className: @configKey
-    )
-
-  renderNavBar: (selectedItem) =>
+  executeController: (selectedItem) =>
 
-    # remember latest selected item
-    selectedItemMeta =
-      selectedItem: selectedItem
-      date: new Date
-    App.Config.set("Runtime::#{@configKey}", selectedItemMeta)
+    if @activeController
+      @activeController.el.remove()
+      @activeController = undefined
 
-    @$('.sidebar').html App.view('generic/navbar_level2/navbar')(
-      groups:     @groupsSorted
-      className:  @configKey
+    @$('.main').append('<div>')
+    @activeController = new selectedItem.controller(
+      el: @$('.main div')
     )
-    if selectedItem
-      @$('li').removeClass('active')
-      @$("a[href=\"#{selectedItem.target}\"]").parent().addClass('active')
-      @executeController(selectedItem)
-
-  executeController: (selectedItem) =>
-
-    # in case of rerendering
-    if @activeController && @activeController.render
-      @activeController.render()
-      return
 
-    @params.el = @$('.main')
-    @activeController = new selectedItem.controller(@params)
+  setPosition: (position) =>
+    return if @shown
+    return if !position
+    if position.main
+      @$('.main').scrollTop(position.main)
+    if position.main
+      @$('.sidebar').scrollTop(position.sidebar)
+
+  currentPosition: =>
+    data =
+      main: @$('.main').scrollTop()
+      sidebar: @$('.sidebar').scrollTop()
 
 class App.GenericHistory extends App.ControllerModal
   buttonClose: true

+ 2 - 2
app/assets/javascripts/app/controllers/_channel/chat.coffee

@@ -1,5 +1,6 @@
-class App.ChannelChat extends App.ControllerContent
+class App.ChannelChat extends App.ControllerSubContent
   requiredPermission: 'admin.channel_chat'
+  header: 'Chat'
   events:
     'change .js-params': 'updateParams'
     'input .js-params': 'updateParams'
@@ -111,7 +112,6 @@ class App.ChannelChat extends App.ControllerContent
 
   constructor: ->
     super
-    @title 'Chat'
     if @Session.get('email')
       @previewUrl = "www.#{@Session.get('email').replace(/^.+?\@/, '')}"
 

+ 7 - 1
app/assets/javascripts/app/controllers/_channel/facebook.coffee

@@ -1,5 +1,6 @@
-class Index extends App.ControllerContent
+class Index extends App.ControllerSubContent
   requiredPermission: 'admin.channel_facebook'
+  header: 'Facebook'
   events:
     'click .js-new':       'new'
     'click .js-edit':      'edit'
@@ -66,6 +67,11 @@ class Index extends App.ControllerContent
     if @channel_id
       @edit(undefined, @channel_id)
 
+  show: (params) =>
+    for key, value of params
+      if key isnt 'el' && key isnt 'shown' && key isnt 'match'
+        @[key] = value
+
   configApp: =>
     external_credential = App.ExternalCredential.findByAttribute('name', 'facebook')
     contentInline = $(App.view('facebook/app_config')(

+ 2 - 2
app/assets/javascripts/app/controllers/_channel/form.coffee

@@ -1,6 +1,7 @@
 # coffeelint: disable=no_unnecessary_double_quotes
-class App.ChannelForm extends App.ControllerContent
+class App.ChannelForm extends App.ControllerSubContent
   requiredPermission: 'admin.channel_formular'
+  header: 'Form'
   events:
     'change form.js-params': 'updateParams'
     'keyup form.js-params': 'updateParams'
@@ -12,7 +13,6 @@ class App.ChannelForm extends App.ControllerContent
 
   constructor: ->
     super
-    @title 'Form'
     App.Setting.fetchFull(
       @render
       force: false

+ 6 - 1
app/assets/javascripts/app/controllers/_channel/twitter.coffee

@@ -1,4 +1,4 @@
-class Index extends App.ControllerContent
+class Index extends App.ControllerSubContent
   requiredPermission: 'admin.channel_twitter'
   events:
     'click .js-new':       'new'
@@ -66,6 +66,11 @@ class Index extends App.ControllerContent
     if @channel_id
       @edit(undefined, @channel_id)
 
+  show: (params) =>
+    for key, value of params
+      if key isnt 'el' && key isnt 'shown' && key isnt 'match'
+        @[key] = value
+
   configApp: =>
     external_credential = App.ExternalCredential.findByAttribute('name', 'twitter')
     contentInline = $(App.view('twitter/app_config')(

+ 2 - 2
app/assets/javascripts/app/controllers/_profile/avatar.coffee

@@ -1,5 +1,6 @@
-class Index extends App.ControllerContent
+class Index extends App.ControllerSubContent
   requiredPermission: 'user_preferences.avatar'
+  header: 'Avatar'
   elements:
     '.js-upload':      'fileInput'
     '.avatar-gallery': 'avatarGallery'
@@ -12,7 +13,6 @@ class Index extends App.ControllerContent
 
   constructor: ->
     super
-    @title 'Avatar', true
     @avatars = []
     @loadAvatarList()
 

+ 2 - 2
app/assets/javascripts/app/controllers/_profile/calendar_subscriptions.coffee

@@ -1,5 +1,6 @@
-class CalendarSubscriptions extends App.ControllerContent
+class CalendarSubscriptions extends App.ControllerSubContent
   requiredPermission: 'user_preferences.calendar+ticket.agent'
+  header: 'Calendar'
   elements:
     'input[type=checkbox]': 'options'
     'output': 'output'
@@ -11,7 +12,6 @@ class CalendarSubscriptions extends App.ControllerContent
 
   constructor: ->
     super
-    @title 'Calendar', true
 
     @translationTable =
       new_open: App.i18n.translatePlain('new & open')

+ 2 - 2
app/assets/javascripts/app/controllers/_profile/devices.coffee

@@ -1,11 +1,11 @@
-class Index extends App.ControllerContent
+class Index extends App.ControllerSubContent
   requiredPermission: 'user_preferences.device'
+  header: 'Devices'
   events:
     'click [data-type=delete]': 'delete'
 
   constructor: ->
     super
-    @title 'Devices', true
     @load()
     @interval(
       =>

+ 2 - 2
app/assets/javascripts/app/controllers/_profile/language.coffee

@@ -1,11 +1,11 @@
-class Index extends App.ControllerContent
+class Index extends App.ControllerSubContent
   requiredPermission: 'user_preferences.language'
+  header: 'Language'
   events:
     'submit form': 'update'
 
   constructor: ->
     super
-    @title 'Language', true
     @render()
 
   render: =>

Некоторые файлы не были показаны из-за большого количества измененных файлов