Improved websocket support.
This commit is contained in:
parent
15f4c57356
commit
ca73a740b6
6 changed files with 121 additions and 161 deletions
|
@ -8,8 +8,6 @@ class App.DashboardTicket extends App.Controller
|
|||
|
||||
constructor: ->
|
||||
super
|
||||
@tickets = []
|
||||
@tickets_count = 0
|
||||
@start_page = 1
|
||||
@navupdate '#'
|
||||
|
||||
|
@ -61,13 +59,7 @@ class App.DashboardTicket extends App.Controller
|
|||
@log 'refetch...', record
|
||||
@fetch()
|
||||
|
||||
# load user collection
|
||||
@loadCollection( type: 'User', data: data.users )
|
||||
|
||||
# load ticket collection
|
||||
@loadCollection( type: 'Ticket', data: data.tickets )
|
||||
|
||||
App.Store.write( @key, data )
|
||||
# App.Store.write( @key, data )
|
||||
|
||||
@render( data )
|
||||
|
||||
|
@ -75,7 +67,6 @@ class App.DashboardTicket extends App.Controller
|
|||
|
||||
@overview = data.overview
|
||||
@tickets_count = data.tickets_count
|
||||
@tickets = data.tickets
|
||||
@ticket_list = data.ticket_list
|
||||
|
||||
pages_total = parseInt( ( @tickets_count / @overview.view.d.per_page ) + 0.99999 ) || 1
|
||||
|
|
|
@ -20,9 +20,6 @@ class Index extends App.Controller
|
|||
@title ''
|
||||
@navupdate '#ticket/view/' + @view
|
||||
|
||||
@tickets = []
|
||||
@tickets_count = 0
|
||||
@start_page = 1
|
||||
@meta = {}
|
||||
@bulk = {}
|
||||
|
||||
|
@ -47,7 +44,6 @@ class Index extends App.Controller
|
|||
if cache
|
||||
@overview = cache.overview
|
||||
@tickets_count = cache.tickets_count
|
||||
@tickets = cache.tickets
|
||||
@ticket_list = cache.ticket_list
|
||||
@load(cache)
|
||||
|
||||
|
@ -66,7 +62,7 @@ class Index extends App.Controller
|
|||
# )
|
||||
|
||||
load: (data) =>
|
||||
|
||||
|
||||
# get meta data
|
||||
@overview = data.overview
|
||||
App.Overview.refresh( @overview, options: { clear: true } )
|
||||
|
@ -81,12 +77,6 @@ class Index extends App.Controller
|
|||
@log 'refetch...', record
|
||||
@fetch()
|
||||
|
||||
# load user collection
|
||||
@loadCollection( type: 'User', data: data.users )
|
||||
|
||||
# load ticket collection
|
||||
@loadCollection( type: 'Ticket', data: data.tickets )
|
||||
|
||||
@ticket_list_show = []
|
||||
for ticket_id in @ticket_list
|
||||
@ticket_list_show.push App.Ticket.find(ticket_id)
|
||||
|
@ -99,10 +89,6 @@ class Index extends App.Controller
|
|||
|
||||
# render page
|
||||
@render()
|
||||
|
||||
# refresh/load default collections
|
||||
# for key, value of data.default_collections
|
||||
# App[key].refresh( value, options: { clear: true } )
|
||||
|
||||
render: ->
|
||||
|
||||
|
@ -110,7 +96,7 @@ class Index extends App.Controller
|
|||
|
||||
# set page title
|
||||
@title @overview.meta.name
|
||||
|
||||
|
||||
# get total pages
|
||||
pages_total = parseInt( ( @tickets_count / @overview.view[@view_mode].per_page ) + 0.99999 ) || 1
|
||||
|
||||
|
@ -138,13 +124,13 @@ class Index extends App.Controller
|
|||
# html.find('li').removeClass('active')
|
||||
# html.find("[data-id=\"#{@start_page}\"]").parents('li').addClass('active')
|
||||
@html html
|
||||
|
||||
|
||||
# create table/overview
|
||||
table = ''
|
||||
if @view_mode is 'm'
|
||||
table = App.view('agent_ticket_view/detail')(
|
||||
overview: @overview,
|
||||
objects: @tickets,
|
||||
objects: @ticket_list_show,
|
||||
checkbox: true
|
||||
)
|
||||
table = $(table)
|
||||
|
@ -162,13 +148,13 @@ class Index extends App.Controller
|
|||
objects: @ticket_list_show,
|
||||
checkbox: true,
|
||||
)
|
||||
|
||||
|
||||
# append content table
|
||||
@el.find('.table-overview').append(table)
|
||||
|
||||
|
||||
# start user popups
|
||||
@userPopups()
|
||||
|
||||
|
||||
# start bulk action observ
|
||||
@el.find('.bulk-action').append( @bulk_form() )
|
||||
|
||||
|
@ -184,15 +170,6 @@ class Index extends App.Controller
|
|||
@el.find('.bulk-action').removeClass('hide')
|
||||
)
|
||||
|
||||
# set waypoint if not already at the end
|
||||
if @start_page < pages_total
|
||||
a = =>
|
||||
# alert('You have scrolled to an entry.')
|
||||
@start_page = @start_page + 1
|
||||
@fetch()
|
||||
|
||||
# $('footer').waypoint( a, { offset: '150%', triggerOnce: true } )
|
||||
|
||||
page: (e) =>
|
||||
e.preventDefault()
|
||||
id = $(e.target).data('id')
|
||||
|
@ -269,8 +246,6 @@ class Index extends App.Controller
|
|||
# refresh view after all tickets are proceeded
|
||||
if @bulk_count_index == @bulk_count
|
||||
|
||||
@tickets = []
|
||||
|
||||
# rebuild navbar with updated ticket count of overviews
|
||||
App.WebSocket.send( event: 'navupdate_ticket_overview' )
|
||||
|
||||
|
@ -448,7 +423,7 @@ class Router extends App.Controller
|
|||
cache = App.Store.get( @key )
|
||||
if cache
|
||||
@tickets_count = cache.tickets_count
|
||||
@tickets = cache.tickets
|
||||
@ticket_list = cache.ticket_list
|
||||
@redirect()
|
||||
else
|
||||
App.Com.ajax(
|
||||
|
@ -463,9 +438,9 @@ class Router extends App.Controller
|
|||
)
|
||||
|
||||
load: (data) =>
|
||||
@tickets = data.tickets
|
||||
@ticket_list = data.ticket_list
|
||||
@tickets_count = data.tickets_count
|
||||
App.Store.write( data )
|
||||
# App.Store.write( data )
|
||||
@redirect()
|
||||
|
||||
redirect: =>
|
||||
|
@ -475,17 +450,17 @@ class Router extends App.Controller
|
|||
|
||||
# redirect
|
||||
if @direction == 'next'
|
||||
if @tickets[ @position ] && @tickets[ @position ]
|
||||
if @ticket_list[ @position ] && @ticket_list[ @position ]
|
||||
Config['LastOverviewPosition']++
|
||||
@navigate 'ticket/zoom/' + @tickets[ @position ].id + '/nav/true'
|
||||
@navigate 'ticket/zoom/' + @ticket_list[ @position ] + '/nav/true'
|
||||
else
|
||||
@navigate 'ticket/zoom/' + @tickets[ @position - 1 ].id + '/nav/true'
|
||||
@navigate 'ticket/zoom/' + @ticket_list[ @position - 1 ] + '/nav/true'
|
||||
else
|
||||
if @tickets[ @position - 2 ] && @tickets[ @position - 2 ].id + '/nav/true'
|
||||
if @ticket_list[ @position - 2 ] && @ticket_list[ @position - 2 ] + '/nav/true'
|
||||
Config['LastOverviewPosition']--
|
||||
@navigate 'ticket/zoom/' + @tickets[ @position - 2 ].id + '/nav/true'
|
||||
@navigate 'ticket/zoom/' + @ticket_list[ @position - 2 ] + '/nav/true'
|
||||
else
|
||||
@navigate 'ticket/zoom/' + @tickets[ @position - 1 ].id + '/nav/true'
|
||||
@navigate 'ticket/zoom/' + @ticket_list[ @position - 1 ] + '/nav/true'
|
||||
|
||||
Config.Routes['ticket/view/:view/:position/:direction'] = Router
|
||||
Config.Routes['ticket/view/:view'] = Index
|
||||
|
|
|
@ -31,113 +31,10 @@
|
|||
#= require_tree ./models
|
||||
#= require_tree ./controllers
|
||||
#= require_tree ./views
|
||||
#= require ./lib/interface_handle.js.coffee
|
||||
|
||||
class App extends Spine.Controller
|
||||
@view: (name) ->
|
||||
JST["app/views/#{name}"]
|
||||
|
||||
###
|
||||
class App.Config extends Spine.Module
|
||||
constructor: ->
|
||||
super
|
||||
@config = {}
|
||||
|
||||
set: (key, value) =>
|
||||
@config[key] = value
|
||||
|
||||
get: (key) =>
|
||||
@config[key]
|
||||
|
||||
append: (key, value) =>
|
||||
if !@config[key]
|
||||
@config[key] = []
|
||||
|
||||
@config[key].push = value
|
||||
|
||||
|
||||
Config2 = new App.Config
|
||||
Config2.set( 'a', 123)
|
||||
console.log '1112222', Config2.get( 'a')
|
||||
###
|
||||
|
||||
class App.Run extends Spine.Controller
|
||||
constructor: ->
|
||||
super
|
||||
@log 'RUN app'
|
||||
@el = $('#app')
|
||||
|
||||
# create web socket connection
|
||||
App.WebSocket.connect()
|
||||
|
||||
# init of i18n
|
||||
new App.i18n
|
||||
|
||||
# start navigation controller
|
||||
new App.Navigation( el: @el.find('#navigation') );
|
||||
|
||||
# check if session already exists/try to get session data from server
|
||||
App.Auth.loginCheck()
|
||||
|
||||
# start notify controller
|
||||
new App.Notify( el: @el.find('#notify') );
|
||||
|
||||
# start content
|
||||
new App.Content( el: @el.find('#content') );
|
||||
|
||||
# bind to fill selected text into
|
||||
$(@el).bind('mouseup', =>
|
||||
window.Session['UISelection'] = @getSelected() + ''
|
||||
)
|
||||
|
||||
getSelected: ->
|
||||
text = '';
|
||||
if window.getSelection
|
||||
text = window.getSelection()
|
||||
else if document.getSelection
|
||||
text = document.getSelection()
|
||||
else if document.selection
|
||||
text = document.selection.createRange().text
|
||||
text
|
||||
|
||||
class App.Content extends Spine.Controller
|
||||
className: 'container'
|
||||
|
||||
constructor: ->
|
||||
super
|
||||
@log 'RUN content'#, @
|
||||
|
||||
for route, callback of Config.Routes
|
||||
do (route, callback) =>
|
||||
@route(route, (params) ->
|
||||
|
||||
# remember current controller
|
||||
Config['ActiveController'] = route
|
||||
|
||||
# send current controller
|
||||
params_only = {}
|
||||
for i of params
|
||||
if typeof params[i] isnt 'object'
|
||||
params_only[i] = params[i]
|
||||
App.WebSocket.send(
|
||||
action: 'active_controller',
|
||||
controller: route,
|
||||
params: params_only,
|
||||
)
|
||||
|
||||
# unbind in controller area
|
||||
@el.unbind()
|
||||
@el.undelegate()
|
||||
|
||||
# remove waypoints
|
||||
$('footer').waypoint('remove')
|
||||
|
||||
params.el = @el
|
||||
new callback( params )
|
||||
|
||||
# scroll to top
|
||||
# window.scrollTo(0,0)
|
||||
)
|
||||
|
||||
Spine.Route.setup()
|
||||
|
||||
window.App = App
|
90
app/assets/javascripts/app/lib/interface_handle.js.coffee
Normal file
90
app/assets/javascripts/app/lib/interface_handle.js.coffee
Normal file
|
@ -0,0 +1,90 @@
|
|||
|
||||
class App.Run extends App.Controller
|
||||
constructor: ->
|
||||
super
|
||||
@log 'RUN app'
|
||||
@el = $('#app')
|
||||
|
||||
# create web socket connection
|
||||
App.WebSocket.connect()
|
||||
|
||||
# init of i18n
|
||||
new App.i18n
|
||||
|
||||
# start navigation controller
|
||||
new App.Navigation( el: @el.find('#navigation') );
|
||||
|
||||
# check if session already exists/try to get session data from server
|
||||
App.Auth.loginCheck()
|
||||
|
||||
# bind new events
|
||||
Spine.bind 'loadCollection', (data) =>
|
||||
|
||||
# load collections
|
||||
if data.collections
|
||||
for key of data.collections
|
||||
|
||||
@log 'loadCollection', key, data.collections[key]
|
||||
@loadCollection( type: key, data: data.collections[key] )
|
||||
|
||||
# start notify controller
|
||||
new App.Notify( el: @el.find('#notify') );
|
||||
|
||||
# start content
|
||||
new App.Content( el: @el.find('#content') );
|
||||
|
||||
# bind to fill selected text into
|
||||
$(@el).bind('mouseup', =>
|
||||
window.Session['UISelection'] = @getSelected() + ''
|
||||
)
|
||||
|
||||
getSelected: ->
|
||||
text = '';
|
||||
if window.getSelection
|
||||
text = window.getSelection()
|
||||
else if document.getSelection
|
||||
text = document.getSelection()
|
||||
else if document.selection
|
||||
text = document.selection.createRange().text
|
||||
text
|
||||
|
||||
class App.Content extends Spine.Controller
|
||||
className: 'container'
|
||||
|
||||
constructor: ->
|
||||
super
|
||||
@log 'RUN content'#, @
|
||||
|
||||
for route, callback of Config.Routes
|
||||
do (route, callback) =>
|
||||
@route(route, (params) ->
|
||||
|
||||
# remember current controller
|
||||
Config['ActiveController'] = route
|
||||
|
||||
# send current controller
|
||||
params_only = {}
|
||||
for i of params
|
||||
if typeof params[i] isnt 'object'
|
||||
params_only[i] = params[i]
|
||||
App.WebSocket.send(
|
||||
action: 'active_controller',
|
||||
controller: route,
|
||||
params: params_only,
|
||||
)
|
||||
|
||||
# unbind in controller area
|
||||
@el.unbind()
|
||||
@el.undelegate()
|
||||
|
||||
# remove waypoints
|
||||
$('footer').waypoint('remove')
|
||||
|
||||
params.el = @el
|
||||
new callback( params )
|
||||
|
||||
# scroll to top
|
||||
# window.scrollTo(0,0)
|
||||
)
|
||||
|
||||
Spine.Route.setup()
|
|
@ -16,7 +16,7 @@ class App.WebSocket
|
|||
_instance.auth(args)
|
||||
|
||||
# The actual Singleton class
|
||||
class _Singleton extends Spine.Controller
|
||||
class _Singleton
|
||||
queue: []
|
||||
|
||||
constructor: (@args) ->
|
||||
|
@ -90,8 +90,13 @@ class _Singleton extends Spine.Controller
|
|||
|
||||
# fire event
|
||||
if item['event']
|
||||
console.log( "ws:onmessage event:" + item['event'] )
|
||||
Spine.trigger( item['event'], item['data'] )
|
||||
if typeof item['event'] is 'object'
|
||||
for event in item['event']
|
||||
console.log( "ws:onmessage event:" + event )
|
||||
Spine.trigger( event, item['data'] )
|
||||
else
|
||||
console.log( "ws:onmessage event:" + item['event'] )
|
||||
Spine.trigger( item['event'], item['data'] )
|
||||
|
||||
# bind to send messages
|
||||
Spine.bind 'ws:send', (data) =>
|
||||
|
|
|
@ -111,11 +111,13 @@ puts 'push overview ' + overview.meta[:url].to_s
|
|||
:data => {
|
||||
:overview => overview_data[:overview],
|
||||
:ticket_list => ticket_list,
|
||||
:tickets => tickets,
|
||||
:tickets_count => overview_data[:tickets_count],
|
||||
:users => users,
|
||||
:collections => {
|
||||
:User => users,
|
||||
:Ticket => tickets,
|
||||
}
|
||||
},
|
||||
:event => 'ticket_overview_rebuild',
|
||||
:event => [ 'loadCollection', 'ticket_overview_rebuild' ],
|
||||
:collection => 'ticket_overview_' + overview.meta[:url].to_s,
|
||||
})
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue