Browse Source

Rewrite of overview index and list backend.

Martin Edenhofer 9 years ago
parent
commit
fb1a8987aa

+ 17 - 18
app/assets/javascripts/app/controllers/ticket_overview.coffee

@@ -23,6 +23,11 @@ class App.TicketOverview extends App.Controller
 
     @html elLocal
 
+    @bind 'overview:fetch', =>
+      update = =>
+        App.OverviewListCollection.fetch(@view)
+      @delay(update, 2800, 'overview:fetch')
+
   active: (state) =>
     @activeState = state
 
@@ -197,16 +202,16 @@ class Table extends App.Controller
     super
 
     if @view
-      @bindId = App.OverviewCollection.bind(@view, @render)
+      @bindId = App.OverviewListCollection.bind(@view, @render)
 
     # rerender view, e. g. on langauge change
     @bind 'ui:rerender', =>
       return if !@authenticate(true)
-      @render(App.OverviewCollection.get(@view))
+      @render(App.OverviewListCollection.get(@view))
 
   release: =>
     if @bindId
-      App.OverviewCollection.unbind(@bindId)
+      App.OverviewListCollection.unbind(@bindId)
 
   update: (params) =>
     for key, value of params
@@ -219,24 +224,20 @@ class Table extends App.Controller
 
     if @view
       if @bindId
-        App.OverviewCollection.unbind(@bindId)
-      @bindId = App.OverviewCollection.bind(@view, @render)
+        App.OverviewListCollection.unbind(@bindId)
+      @bindId = App.OverviewListCollection.bind(@view, @render)
 
   render: (data) =>
     return if !data
 
     # use cache
-    overview      = data.overview
-    tickets_count = data.tickets_count
-    ticket_ids    = data.ticket_ids
-
-    # use cache if no local change
-    App.Overview.refresh(overview, { clear: true })
+    overview = data.overview
+    tickets  = data.tickets
 
     # get ticket list
     ticket_list_show = []
-    for ticket_id in ticket_ids
-      ticket_list_show.push App.Ticket.fullLocal(ticket_id)
+    for ticket in tickets
+      ticket_list_show.push App.Ticket.fullLocal(ticket.id)
 
     # if customer and no ticket exists, show the following message only
     if !ticket_list_show[0] && @isRole('Customer')
@@ -622,8 +623,7 @@ class BulkForm extends App.Controller
             @hide()
 
             # fetch overview data again
-            App.OverviewIndexCollection.fetch()
-            App.OverviewCollection.fetch(@view)
+            App.Event.trigger('overview:fetch')
       )
     )
     @holder.find('.table-overview').find('[name="bulk"]:checked').prop('checked', false)
@@ -761,11 +761,10 @@ class App.OverviewSettings extends App.ControllerModal
 
         # fetch overview data again
         if @reload_needed
-          App.OverviewIndexCollection.fetch()
-          App.OverviewCollection.fetch(@overview.link)
+          App.OverviewListCollection.fetch(@overview.link)
         else
           App.OverviewIndexCollection.trigger()
-          App.OverviewCollection.trigger(@overview.link)
+          App.OverviewListCollection.trigger(@overview.link)
 
         # close modal
         @close()

+ 9 - 7
app/assets/javascripts/app/controllers/ticket_zoom.coffee

@@ -618,25 +618,25 @@ class App.TicketZoom extends App.Controller
           if @overview_id
             current_position = 0
             overview = App.Overview.find(@overview_id)
-            list = App.OverviewCollection.get(overview.link)
-            for ticket_id in list.ticket_ids
+            list = App.OverviewListCollection.get(overview.link)
+            for ticket in list.tickets
               current_position += 1
-              if ticket_id is @ticket_id
-                next = list.ticket_ids[current_position]
+              if ticket.id is @ticket_id
+                next = list.tickets[current_position]
                 if next
                   # close task
                   App.TaskManager.remove(@task_key)
 
                   # open task via task manager to get overview information
                   App.TaskManager.execute(
-                    key:        'Ticket-' + next
+                    key:        'Ticket-' + next.id
                     controller: 'TicketZoom'
                     params:
-                      ticket_id:   next
+                      ticket_id:   next.id
                       overview_id: @overview_id
                     show:       true
                   )
-                  @navigate "ticket/zoom/#{next}"
+                  @navigate "ticket/zoom/#{next.id}"
                   return
 
           # fallback, close task
@@ -658,6 +658,8 @@ class App.TicketZoom extends App.Controller
 
         # enable form
         @formEnable(e)
+
+        App.Event.trigger('overview:fetch')
     )
 
   bookmark: (e) ->

+ 13 - 13
app/assets/javascripts/app/controllers/ticket_zoom/overview_navigator.coffee

@@ -12,12 +12,12 @@ class App.TicketZoomOverviewNavigator extends App.Controller
       @delay(@render, 2600, 'overview-navigator')
 
     @overview = App.Overview.find(@overview_id)
-    @bindId = App.OverviewCollection.bind(@overview.link, lateUpdate, false)
+    @bindId = App.OverviewListCollection.bind(@overview.link, lateUpdate, false)
 
     @render()
 
   release: =>
-    App.OverviewCollection.unbind(@bindId)
+    App.OverviewListCollection.unbind(@bindId)
 
   render: =>
     if !@overview_id
@@ -25,17 +25,17 @@ class App.TicketZoomOverviewNavigator extends App.Controller
       return
 
     # get overview data
-    overview = App.OverviewCollection.get(@overview.link)
+    overview = App.OverviewListCollection.get(@overview.link)
     return if !overview
     current_position = 0
     found            = false
-    next             = false
-    previous         = false
-    for ticket_id in overview.ticket_ids
+    item_next        = false
+    item_previous    = false
+    for ticket in overview.tickets
       current_position += 1
-      next              = overview.ticket_ids[current_position]
-      previous          = overview.ticket_ids[current_position-2]
-      if ticket_id is @ticket_id
+      item_next         = overview.tickets[current_position]
+      item_previous     = overview.tickets[current_position-2]
+      if ticket.id is @ticket_id
         found = true
         break
 
@@ -44,10 +44,10 @@ class App.TicketZoomOverviewNavigator extends App.Controller
       return
 
     # get next/previous ticket
-    if next
-      next = App.Ticket.find(next)
-    if previous
-      previous = App.Ticket.find(previous)
+    if item_next
+      next = App.Ticket.find(item_next.id)
+    if item_previous
+      previous = App.Ticket.find(item_previous.id)
 
     @html App.view('ticket_zoom/overview_navigator')(
       title:            overview.overview.name

+ 2 - 0
app/assets/javascripts/app/controllers/ticket_zoom/title.coffee

@@ -53,5 +53,7 @@ class App.TicketZoomTitle extends App.Controller
       # update taskbar with new meta data
       @metaTaskUpdate()
 
+      App.Event.trigger('overview:fetch')
+
   release: =>
     App.Ticket.unsubscribe(@subscribeId)

+ 4 - 0
app/assets/javascripts/app/lib/app_post/_collection_base.coffee

@@ -44,6 +44,10 @@ class App._CollectionSingletonBase
         delete @callbacks[counter]
 
   fetch: =>
+    if App.WebSocket.support()
+      App.WebSocket.send(event: @event)
+      return
+
     return if @fetchActive
     @fetchActive = true
     App.Ajax.request(

+ 17 - 21
app/assets/javascripts/app/lib/app_post/overview_collection.coffee → app/assets/javascripts/app/lib/app_post/overview_list_collection.coffee

@@ -1,4 +1,4 @@
-class App.OverviewCollection
+class App.OverviewListCollection
   _instance = undefined # Must be declared here to force the closure on the class
 
   @get: (view) ->
@@ -35,18 +35,11 @@ class _Singleton
     @counter = 0
 
     # websocket updates
-    App.Event.bind 'ticket_overview_rebuild', (data) =>
-      if !@overview[data.view]
-        @overview[data.view] = {}
-
-      # proccess assets, delete them later
-      if data.assets
-        App.Collection.loadAssets( data.assets )
-      delete data.assets
-
-      @overview[data.view] = data
-
-      @callback(data.view, data)
+    App.Event.bind 'ticket_overview_list', (data) =>
+      if !@overview[data.overview.view]
+        @overview[data.overview.view] = {}
+      @overview[data.overview.view] = data
+      @callback(data.overview.view, data)
 
   get: (view) ->
     @overview[view]
@@ -70,6 +63,14 @@ class _Singleton
     delete @callbacks[counter]
 
   fetch: (view) =>
+    if App.WebSocket.support()
+      App.WebSocket.send(
+        event: 'ticket_overview_list'
+        view: view
+      )
+      return
+
+    App.OverviewIndexCollection.fetch()
     return if @fetchActive[view]
     @fetchActive[view] = true
     App.Ajax.request(
@@ -81,15 +82,10 @@ class _Singleton
       processData: true,
       success: (data) =>
         @fetchActive[view] = false
-
-        # proccess assets, delete them later
         if data.assets
-          App.Collection.loadAssets( data.assets )
-        delete data.assets
-
-        @overview[data.view] = data
-
-        @callback(view, data)
+          App.Collection.loadAssets(data.assets)
+        @overview[data.index.overview.view] = data.index
+        @callback(view, data.index)
       error: =>
         @fetchActive[view] = false
     )

+ 9 - 0
app/assets/javascripts/app/lib/app_post/websocket.coffee

@@ -30,6 +30,11 @@ class App.WebSocket
       _instance ?= new _webSocketSingleton
     _instance.spool()
 
+  @support: ->
+    if _instance == undefined
+      _instance ?= new _webSocketSingleton
+    _instance.support()
+
 # The actual Singleton class
 class _webSocketSingleton extends App.Controller
   @include App.LogInclude
@@ -103,6 +108,9 @@ class _webSocketSingleton extends App.Controller
   channel: ->
     @backend
 
+  support: ->
+    @supported
+
   send: (data) =>
     if @backend is 'ajax'
       @_ajaxSend(data)
@@ -180,6 +188,7 @@ class _webSocketSingleton extends App.Controller
   connect: =>
 
     if !window.WebSocket
+      @supported = false
       @backend = 'ajax'
       @log 'debug', 'no support of websocket, use ajax long polling'
       @_ajaxInit()

+ 26 - 64
app/controllers/ticket_overviews_controller.rb

@@ -10,80 +10,42 @@ class TicketOverviewsController < ApplicationController
 
     # get navbar overview data
     if !params[:view]
-      result = Ticket::Overviews.list(
-        current_user: current_user,
-      )
-      render json: result
-      return
-    end
-
-    # get real overview data
-    if params[:array]
-      overview = Ticket::Overviews.list(
-        view: params[:view],
-        current_user: current_user,
-        array: true,
-      )
-      tickets = []
-      overview[:tickets].each {|ticket_id|
-        data = { id: ticket_id }
-        tickets.push data
+      index_and_lists = Ticket::Overviews.index(current_user)
+      indexes = []
+      index_and_lists.each { |index|
+        assets = {}
+        overview = Overview.lookup(id: index[:overview][:id])
+        meta = {
+          name: overview.name,
+          prio: overview.prio,
+          link: overview.link,
+          count: index[:count],
+        }
+        indexes.push meta
       }
-
-      # return result
-      render json: {
-        overview: overview[:overview],
-        tickets: tickets,
-        tickets_count: overview[:tickets_count],
-      }
-      return
-    end
-    overview = Ticket::Overviews.list(
-      view: params[:view],
-      current_user: current_user,
-      array: true,
-    )
-    if !overview
-      render json: { error: "No such view #{params[:view]}!" }, status: :unprocessable_entity
+      render json: indexes
       return
     end
 
-    # get related users
-    assets = {}
-    overview[:ticket_ids].each {|ticket_id|
-      ticket = Ticket.lookup( id: ticket_id )
-      assets = ticket.assets(assets)
-    }
+    index_and_lists = Ticket::Overviews.index(current_user)
 
-    # get groups
-    group_ids = []
-    Group.where( active: true ).each { |group|
-      group_ids.push group.id
-    }
-    agents = {}
-    User.of_role('Agent').each { |user|
-      agents[ user.id ] = 1
-    }
-    groups_users = {}
-    group_ids.each {|group_id|
-      groups_users[ group_id ] = []
-      Group.find(group_id).users.each {|user|
-        next if !agents[ user.id ]
-        groups_users[ group_id ].push user.id
-        assets = user.assets( assets )
+    assets = {}
+    result = {}
+    index_and_lists.each { |index|
+      next if index[:overview][:view] != params[:view]
+
+      overview = Overview.lookup(id: index[:overview][:id])
+      assets = overview.assets(assets)
+      index[:tickets].each {|ticket_meta|
+        ticket = Ticket.lookup(id: ticket_meta[:id])
+        assets = ticket.assets(assets)
       }
+      result = index
     }
 
-    # return result
     render json: {
-      view: params[:view],
-      overview: overview[:overview],
-      ticket_ids: overview[:ticket_ids],
-      tickets_count: overview[:tickets_count],
-      bulk: {
-        group_id__owner_id: groups_users,
-      },
       assets: assets,
+      index: result,
     }
   end
 

+ 2 - 0
app/models/overview.rb

@@ -10,6 +10,8 @@ class Overview < ApplicationModel
   before_create   :fill_link
   before_update   :fill_link
 
+  latest_change_support
+
   private
 
   # fill link

+ 70 - 102
app/models/ticket/overviews.rb

@@ -3,10 +3,10 @@ module Ticket::Overviews
 
 =begin
 
-all overview by user
+all overviews by user
 
   result = Ticket::Overviews.all(
-    :current_user => User.find(123),
+    current_user: User.find(123),
   )
 
 returns
@@ -15,137 +15,105 @@ returns
 
 =end
 
-  def self.all (data)
+  def self.all(data)
 
     # get customer overviews
     if data[:current_user].role?('Customer')
-      role = Role.find_by( name: 'Customer' )
+      role = Role.find_by(name: 'Customer')
       overviews = if data[:current_user].organization_id && data[:current_user].organization.shared
-                    Overview.where( role_id: role.id, active: true )
+                    Overview.where(role_id: role.id, active: true)
                   else
-                    Overview.where( role_id: role.id, organization_shared: false, active: true )
+                    Overview.where(role_id: role.id, organization_shared: false, active: true)
                   end
       return overviews
     end
 
     # get agent overviews
-    return if !data[:current_user].role?( 'Agent' )
-    role = Role.find_by( name: 'Agent' )
-    Overview.where( role_id: role.id, active: true )
+    return if !data[:current_user].role?('Agent')
+    role = Role.find_by(name: 'Agent')
+    Overview.where(role_id: role.id, active: true)
   end
 
 =begin
 
-selected overview by user
-
-  result = Ticket::Overviews.list(
-    current_user: User.find(123),
-    view:         'some_view_url',
-  )
+  result = Ticket::Overviews.index(User.find(123))
 
 returns
 
-  result = {
-    tickets:       tickets,                # [ticket1, ticket2, ticket3]
-    tickets_count: tickets_count,          # count of tickets
-    overview:      overview_selected_raw,  # overview attributes
+ [
+  {
+    overview: {
+      id: 123,
+      updated_at: ...,
+    },
+    count: 3,
+    tickets: [
+      {
+        id: 1,
+        updated_at: ...,
+      },
+      {
+        id: 2,
+        updated_at: ...,
+      },
+      {
+        id: 3,
+        updated_at: ...,
+      }
+    ],
+  },
+  {
+    ...
   }
+ ]
 
 =end
 
-  def self.list (data)
-
-    overviews = all(data)
-    return if !overviews
-
-    # build up attributes hash
-    overview_selected     = nil
-    overview_selected_raw = nil
-
-    overviews.each { |overview|
-
-      # remember selected view
-      if data[:view] && data[:view] == overview.link
-        overview_selected     = overview
-        overview_selected_raw = Marshal.load( Marshal.dump(overview.attributes) )
-      end
-    }
-
-    if data[:view] && !overview_selected
-      raise "No such view '#{data[:view]}'"
-    end
+  def self.index(user)
+    overviews = Ticket::Overviews.all(
+      current_user: user,
+    )
 
     # get only tickets with permissions
-    access_condition = Ticket.access_condition( data[:current_user] )
-
-    # overview meta for navbar
-    if !overview_selected
-
-      # loop each overview
-      result = []
-      overviews.each { |overview|
+    access_condition = Ticket.access_condition(user)
 
-        query_condition, bind_condition = Ticket.selector2sql(overview.condition, data[:current_user])
+    list = []
+    overviews.each {|overview|
+      query_condition, bind_condition = Ticket.selector2sql(overview.condition, user)
 
-        # get count
-        count = Ticket.where( access_condition ).where( query_condition, *bind_condition ).count()
-
-        # get meta info
-        all = {
-          name: overview.name,
-          prio: overview.prio,
-          link: overview.link,
-        }
-
-        # push to result data
-        result.push all.merge( { count: count } )
-      }
-      return result
-    end
-
-    # get result list
-    if data[:array]
-      order_by = overview_selected[:order][:by].to_s + ' ' + overview_selected[:order][:direction].to_s
-      if overview_selected.group_by && !overview_selected.group_by.empty?
-        order_by = overview_selected.group_by + '_id, ' + order_by
+      order_by = "#{overview.order[:by]} #{overview.order[:direction]}"
+      if overview.group_by && !overview.group_by.empty?
+        order_by = "#{overview.group_by}_id, #{order_by}"
       end
 
-      query_condition, bind_condition = Ticket.selector2sql(overview_selected.condition, data[:current_user])
-
-      tickets = Ticket.select('id')
-                      .where( access_condition )
-                      .where( query_condition, *bind_condition )
-                      .order( order_by )
-                      .limit( 500 )
-
-      ticket_ids = []
-      tickets.each { |ticket|
-        ticket_ids.push ticket.id
+      ticket_result = Ticket.select('id, updated_at')
+                            .where(access_condition)
+                            .where(query_condition, *bind_condition)
+                            .order(order_by)
+                            .limit(500)
+
+      tickets = []
+      ticket_result.each { |ticket|
+        ticket_item = {
+          id: ticket.id,
+          updated_at: ticket.updated_at,
+        }
+        tickets.push ticket_item
       }
-
-      tickets_count = Ticket.where( access_condition ).where( query_condition, *bind_condition ).count()
-
-      return {
-        ticket_ids: ticket_ids,
-        tickets_count: tickets_count,
-        overview: overview_selected_raw,
+      count = Ticket.where(access_condition).where(query_condition, *bind_condition).count()
+      item = {
+        overview: {
+          id: overview.id,
+          view: overview.link,
+          updated_at: overview.updated_at,
+        },
+        tickets: tickets,
+        count: count,
       }
-    end
-
-    # get tickets for overview
-    data[:start_page] ||= 1
-    query_condition, bind_condition = Ticket.selector2sql(overview_selected.condition, data[:current_user])
-    tickets = Ticket.where( access_condition )
-                    .where( query_condition, *bind_condition )
-                    .order( overview_selected[:order][:by].to_s + ' ' + overview_selected[:order][:direction].to_s )
-
-    tickets_count = Ticket.where( access_condition ).where( query_condition, *bind_condition ).count()
 
-    {
-      tickets: tickets,
-      tickets_count: tickets_count,
-      overview: overview_selected_raw,
+      list.push item
     }
+    list
   end
 
 end

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