Browse Source

Improved recent viewed object feature (like online notification is implemented).

Martin Edenhofer 10 years ago
parent
commit
e9bceeeb8a

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

@@ -382,7 +382,7 @@ class App.Controller extends Spine.Controller
     App.Ajax.request(
       id:    "recent_view_#{object}_#{o_id}"
       type:  'POST'
-      url:   @Config.get('api_path') + '/recent_viewed'
+      url:   @Config.get('api_path') + '/recent_view'
       data:  JSON.stringify(params)
       processData: true
     )

+ 2 - 2
app/assets/javascripts/app/controllers/_dashboard/recent_viewed.js.coffee

@@ -6,9 +6,9 @@ class App.DashboardRecentViewed extends App.Controller
 
     # get data
     @ajax(
-      id:    'dashboard_recent_viewed',
+      id:    'dashboard_recent_view',
       type:  'GET',
-      url:   @apiPath + '/recent_viewed',
+      url:   @apiPath + '/recent_view',
       data:  {
         limit: 5,
       }

+ 29 - 17
app/assets/javascripts/app/controllers/navigation.js.coffee

@@ -21,16 +21,15 @@ class App.Navigation extends App.Controller
     @bind 'auth', (user) =>
       @log 'Navigation', 'notice', 'navbar rebuild', user
 
-      if !_.isEmpty( user )
-        cache = App.Store.get( 'update_recent_viewed' )
-        @recent_viewed_build( cache ) if cache
-
       @render()
 
-    # rebuild recent viewed data
-    @bind 'update_recent_viewed', (data) =>
-      @recent_viewed_build(data)
-      @renderPersonal()
+    # fetch new recent viewed after collection change
+    @bind 'RecentView::changed', =>
+      @delay(
+        => @fetchRecentView()
+        1000
+        'recent-view-changed'
+      )
 
     # bell on / bell off
     @bind 'bell', (data) =>
@@ -67,6 +66,7 @@ class App.Navigation extends App.Controller
     )
 
   renderPersonal: =>
+    @recentViewNavbarItemsRebuild()
     items = @getItems( navbar: @Config.get( 'NavBarRight' ) )
 
     # get open tabs to repopen on rerender
@@ -332,6 +332,16 @@ class App.Navigation extends App.Controller
     inordervalue = []
     for num in inorder
       inordervalue.push newlist[ num ]
+
+    # add differ to after recent viewed item
+    found = false
+    for value in inordervalue
+      if value.type is 'recentViewed'
+        found = true
+      if found && value.type isnt 'recentViewed'
+        value.divider = true
+        found = false
+
     return inordervalue
 
   sortit: (a,b) ->
@@ -347,12 +357,7 @@ class App.Navigation extends App.Controller
     @el.find('li').removeClass('active')
     @el.find("[href=\"#{url}\"]").parents('li').addClass('active')
 
-  recent_viewed_build: (data) =>
-
-    App.Store.write( 'update_recent_viewed', data )
-
-    # load assets
-    App.Collection.loadAssets( data.assets )
+  recentViewNavbarItemsRebuild: =>
 
     # remove old views
     NavBarRight = @Config.get( 'NavBarRight' ) || {}
@@ -363,13 +368,13 @@ class App.Navigation extends App.Controller
           delete NavBarRight[key]
 
     # add new views
-    items = data.recent_viewed || []
+    items = App.RecentView.search(sortBy: 'created_at', order: 'DESC' )
     items = @prepareForObjectList(items)
-    prio = 8000
+    prio = 80
     for item in items
       divider   = false
       navheader = false
-      if prio is 8000
+      if prio is 80
         divider   = true
         navheader = 'Recent Viewed'
 
@@ -381,8 +386,15 @@ class App.Navigation extends App.Controller
         target:    item.link
         divider:   divider
         navheader: navheader
+        type:      'recentViewed'
       }
 
     @Config.set( 'NavBarRight', NavBarRight )
 
+  fetchRecentView: =>
+    load = (items) =>
+      App.RecentView.refresh( items, { clear: true } )
+      @renderPersonal()
+    App.RecentView.fetchFull(load)
+
 App.Config.set( 'navigation', App.Navigation, 'Navigations' )

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

@@ -3,7 +3,11 @@ class App.OnlineNotificationWidget extends App.Controller
     super
 
     @bind 'OnlineNotification::changed', =>
-      @fetch()
+      @delay(
+        => @fetch()
+        1000
+        'online-notification-changed'
+      )
 
     # rebuild widget on auth
     @bind 'auth', (user) =>
@@ -23,7 +27,7 @@ class App.OnlineNotificationWidget extends App.Controller
 
   release: =>
     @stop()
-    App.Model.unsubscribe( @subscribeId )
+    App.OnlineNotification.unsubscribe( @subscribeId )
 
   access: ->
     return false if _.isEmpty( @Session.all() )
@@ -77,7 +81,6 @@ class App.OnlineNotificationWidget extends App.Controller
       @frontendTimeUpdate()
     )
 
-
   fetch: =>
     load = (items) =>
       App.OnlineNotification.refresh( items, { clear: true } )

+ 4 - 0
app/assets/javascripts/app/models/recent_view.js.coffee

@@ -0,0 +1,4 @@
+class App.RecentView extends App.Model
+  @configure 'RecentView', 'name'
+  @extend Spine.Model.Ajax
+  @url: @apiPath + '/recent_view'

+ 3 - 3
app/controllers/recent_viewed_controller.rb → app/controllers/recent_view_controller.rb

@@ -1,6 +1,6 @@
 # Copyright (C) 2012-2014 Zammad Foundation, http://zammad-foundation.org/
 
-class RecentViewedController < ApplicationController
+class RecentViewController < ApplicationController
   before_filter :authentication_check
 
 =begin
@@ -14,7 +14,7 @@ Response:
 }
 
 Test:
-curl http://localhost/api/v1/recent_viewed -v -u #{login}:#{password} -H "Content-Type: application/json" -X GET
+curl http://localhost/api/v1/recent_view -v -u #{login}:#{password} -H "Content-Type: application/json" -X GET
 
 =end
 
@@ -40,7 +40,7 @@ Response:
 {}
 
 Test:
-curl http://localhost/api/v1/recent_viewed -v -u #{login}:#{password} -H "Content-Type: application/json" -X POST -d '{"object": "Ticket","o_id": 123}'
+curl http://localhost/api/v1/recent_view -v -u #{login}:#{password} -H "Content-Type: application/json" -X POST -d '{"object": "Ticket","o_id": 123}'
 
 =end
 

+ 6 - 5
app/models/online_notification.rb

@@ -133,11 +133,12 @@ returns:
   end
 
   def notify_clients_after_change
-
-    puts "#{ self.class.name } changed " + self.created_at.to_s
-    Sessions.broadcast(
-      :event => 'OnlineNotification::changed',
-      :data => {}
+    Sessions.send_to(
+      self.user_id,
+      {
+        :event => 'OnlineNotification::changed',
+        :data => {}
+      }
     )
   end
 

+ 2 - 3
app/models/recent_view.rb

@@ -60,12 +60,11 @@ class RecentView < ApplicationModel
   end
 
   def notify_clients
-    data = RecentView.list_full( User.find(self.created_by_id), 10 )
     Sessions.send_to(
       self.created_by_id,
       {
-        :event      => 'update_recent_viewed',
-        :data       => data,
+        :event => 'RecentView::changed',
+        :data => {}
       }
     )
   end

+ 6 - 0
config/routes/recent_view.rb

@@ -0,0 +1,6 @@
+Zammad::Application.routes.draw do
+  api_path = Rails.configuration.api_path
+
+  match api_path + '/recent_view',     :to => 'recent_view#index', :via => :get
+  match api_path + '/recent_view',     :to => 'recent_view#create', :via => :post
+end

+ 0 - 6
config/routes/recent_viewed.rb

@@ -1,6 +0,0 @@
-Zammad::Application.routes.draw do
-  api_path = Rails.configuration.api_path
-
-  match api_path + '/recent_viewed',     :to => 'recent_viewed#index', :via => :get
-  match api_path + '/recent_viewed',     :to => 'recent_viewed#create', :via => :post
-end