Splited into separate files.
This commit is contained in:
parent
58dc1db5dc
commit
35d7a46ab6
4 changed files with 251 additions and 231 deletions
|
@ -22,6 +22,9 @@
|
||||||
|
|
||||||
#not_used= require_tree ./lib
|
#not_used= require_tree ./lib
|
||||||
#= require_self
|
#= require_self
|
||||||
|
#= require ./lib/ajax.js.coffee
|
||||||
|
#= require ./lib/auth.js.coffee
|
||||||
|
#= require ./lib/i18n.js.coffee
|
||||||
#= require_tree ./models
|
#= require_tree ./models
|
||||||
#= require_tree ./controllers
|
#= require_tree ./controllers
|
||||||
#= require_tree ./views
|
#= require_tree ./views
|
||||||
|
@ -54,236 +57,6 @@ Config2.set( 'a', 123)
|
||||||
console.log '1112222', Config2.get( 'a')
|
console.log '1112222', Config2.get( 'a')
|
||||||
###
|
###
|
||||||
|
|
||||||
class App.Com
|
|
||||||
_instance = undefined # Must be declared here to force the closure on the class
|
|
||||||
@ajax: (args) -> # Must be a static method
|
|
||||||
if _instance == undefined
|
|
||||||
_instance ?= new _Singleton
|
|
||||||
|
|
||||||
_instance.ajax(args)
|
|
||||||
_instance
|
|
||||||
|
|
||||||
# The actual Singleton class
|
|
||||||
class _Singleton
|
|
||||||
defaults:
|
|
||||||
contentType: 'application/json'
|
|
||||||
dataType: 'json'
|
|
||||||
processData: false
|
|
||||||
headers: {'X-Requested-With': 'XMLHttpRequest'}
|
|
||||||
cache: false
|
|
||||||
async: true
|
|
||||||
|
|
||||||
queue_list: {}
|
|
||||||
pending: false
|
|
||||||
|
|
||||||
constructor: (@args) ->
|
|
||||||
|
|
||||||
ajax: (params, defaults) ->
|
|
||||||
if params['id']
|
|
||||||
if @queue_list[ params['id'] ]
|
|
||||||
@queue_list[ params['id'] ].abort()
|
|
||||||
@queue_list[ params['id'] ] = $.ajax($.extend({}, @defaults, defaults, params))
|
|
||||||
else
|
|
||||||
$.ajax($.extend({}, @defaults, defaults, params))
|
|
||||||
|
|
||||||
console.log('AJAX', params['url'] )
|
|
||||||
|
|
||||||
class App.Auth
|
|
||||||
|
|
||||||
@login: (params) ->
|
|
||||||
console.log 'login(...)', params
|
|
||||||
App.Com.ajax(
|
|
||||||
id: 'login',
|
|
||||||
# params,
|
|
||||||
type: 'POST',
|
|
||||||
url: '/signin',
|
|
||||||
data: JSON.stringify(params.data),
|
|
||||||
success: params.success,
|
|
||||||
error: params.error,
|
|
||||||
)
|
|
||||||
|
|
||||||
@loginCheck: ->
|
|
||||||
console.log 'loginCheck(...)'
|
|
||||||
App.Com.ajax(
|
|
||||||
id: 'login_check',
|
|
||||||
async: false,
|
|
||||||
type: 'GET',
|
|
||||||
url: '/signshow',
|
|
||||||
success: (data, status, xhr) =>
|
|
||||||
console.log 'logincheck:success', data
|
|
||||||
|
|
||||||
# if session is not valid
|
|
||||||
if data.error
|
|
||||||
|
|
||||||
# update config
|
|
||||||
for key, value of data.config
|
|
||||||
window.Config[key] = value
|
|
||||||
|
|
||||||
# empty session
|
|
||||||
window.Session = {}
|
|
||||||
|
|
||||||
# rebuild navbar with new navbar items
|
|
||||||
Spine.trigger 'navrebuild'
|
|
||||||
|
|
||||||
return false;
|
|
||||||
|
|
||||||
# set avatar
|
|
||||||
if !data.session.image
|
|
||||||
data.session.image = 'http://placehold.it/48x48'
|
|
||||||
|
|
||||||
# update config
|
|
||||||
for key, value of data.config
|
|
||||||
window.Config[key] = value
|
|
||||||
|
|
||||||
# store user data
|
|
||||||
for key, value of data.session
|
|
||||||
window.Session[key] = value
|
|
||||||
|
|
||||||
# refresh/load default collections
|
|
||||||
for key, value of data.default_collections
|
|
||||||
App[key].refresh( value, options: { clear: true } )
|
|
||||||
|
|
||||||
# rebuild navbar with new navbar items
|
|
||||||
Spine.trigger 'navrebuild', data.session
|
|
||||||
|
|
||||||
# rebuild navbar with updated ticket count of overviews
|
|
||||||
Spine.trigger 'navupdate_remote'
|
|
||||||
|
|
||||||
|
|
||||||
error: (xhr, statusText, error) =>
|
|
||||||
console.log 'loginCheck:error'#, error, statusText, xhr.statusCode
|
|
||||||
|
|
||||||
# empty session
|
|
||||||
window.Session = {}
|
|
||||||
)
|
|
||||||
|
|
||||||
@logout: ->
|
|
||||||
console.log 'logout(...)'
|
|
||||||
App.Com.ajax(
|
|
||||||
id: 'logout',
|
|
||||||
type: 'DELETE',
|
|
||||||
url: '/signout',
|
|
||||||
)
|
|
||||||
|
|
||||||
class App.i18n
|
|
||||||
|
|
||||||
constructor: ->
|
|
||||||
@locale = 'de'
|
|
||||||
@set( @locale )
|
|
||||||
window.T = @translate_content
|
|
||||||
window.Ti = @translate_inline
|
|
||||||
|
|
||||||
# $('.translation [contenteditable]')
|
|
||||||
$('body')
|
|
||||||
.delegate '.translation', 'focus', (e) =>
|
|
||||||
$this = $(e.target)
|
|
||||||
$this.data 'before', $this.html()
|
|
||||||
# console.log('11111current', $this.html())
|
|
||||||
return $this
|
|
||||||
# .delegate '.translation', 'blur keyup paste', (e) =>
|
|
||||||
.delegate '.translation', 'blur', (e) =>
|
|
||||||
$this = $(e.target)
|
|
||||||
source = $this.attr('data-text')
|
|
||||||
|
|
||||||
# get new translation
|
|
||||||
translation_new = $this.html()
|
|
||||||
translation_new = ('' + translation_new)
|
|
||||||
.replace(/<.+?>/g, '')
|
|
||||||
|
|
||||||
# set new translation
|
|
||||||
$this.html(translation_new)
|
|
||||||
|
|
||||||
# update translation
|
|
||||||
return if $this.data('before') is translation_new
|
|
||||||
console.log 'Translation Update', translation_new, $this.data 'before'
|
|
||||||
$this.data 'before', translation_new
|
|
||||||
|
|
||||||
# update runtime translation map
|
|
||||||
@map[ source ] = translation_new
|
|
||||||
|
|
||||||
# replace rest in page
|
|
||||||
$(".translation[data-text='#{source}']").html( translation_new )
|
|
||||||
|
|
||||||
# update permanent translation map
|
|
||||||
translation = App.Translation.findByAttribute( 'source', source )
|
|
||||||
if translation
|
|
||||||
translation.updateAttribute( 'target', translation_new )
|
|
||||||
else
|
|
||||||
translation = new App.Translation
|
|
||||||
translation.load(
|
|
||||||
locale: @locale,
|
|
||||||
source: source,
|
|
||||||
target: translation_new,
|
|
||||||
)
|
|
||||||
translation.save()
|
|
||||||
|
|
||||||
return $this
|
|
||||||
|
|
||||||
set: (locale) =>
|
|
||||||
@map = {}
|
|
||||||
App.Com.ajax(
|
|
||||||
id: 'i18n-set-' + locale,
|
|
||||||
type: 'GET',
|
|
||||||
url: '/translations/lang/' + locale,
|
|
||||||
async: false,
|
|
||||||
success: (data, status, xhr) =>
|
|
||||||
|
|
||||||
# load translation collection
|
|
||||||
for object in data
|
|
||||||
|
|
||||||
# set runtime lookup table
|
|
||||||
@map[ object[1] ] = object[2]
|
|
||||||
|
|
||||||
# load in collection if needed
|
|
||||||
App.Translation.refresh( { id: object[0], source: object[1], target: object[2], locale: @locale }, options: { clear: true } )
|
|
||||||
|
|
||||||
error: (xhr, statusText, error) =>
|
|
||||||
console.log 'error', error, statusText, xhr.statusCode
|
|
||||||
)
|
|
||||||
|
|
||||||
translate_inline: (string, args...) =>
|
|
||||||
@translate(string, args...)
|
|
||||||
|
|
||||||
translate_content: (string, args...) =>
|
|
||||||
translated = @translate(string, args...)
|
|
||||||
# replace = '<span class="translation" contenteditable="true" data-text="' + @escape(string) + '">' + translated + '<span class="icon-edit"></span>'
|
|
||||||
if window.Config['Translation']
|
|
||||||
replace = '<span class="translation" contenteditable="true" data-text="' + @escape(string) + '">' + translated + ''
|
|
||||||
# if !@_translated
|
|
||||||
# replace += '<span class="missing">XX</span>'
|
|
||||||
replace += '</span>'
|
|
||||||
else
|
|
||||||
translated
|
|
||||||
|
|
||||||
translate: (string, args...) =>
|
|
||||||
|
|
||||||
# return '' on undefined
|
|
||||||
return '' if string is undefined
|
|
||||||
|
|
||||||
# return translation
|
|
||||||
if @map[string] isnt undefined
|
|
||||||
@_translated = true
|
|
||||||
translated = @map[string]
|
|
||||||
else
|
|
||||||
@_translated = false
|
|
||||||
translated = string
|
|
||||||
|
|
||||||
# search %s
|
|
||||||
for arg in args
|
|
||||||
translated = translated.replace(/%s/, arg)
|
|
||||||
|
|
||||||
# escape
|
|
||||||
translated = @escape(translated)
|
|
||||||
|
|
||||||
# return translated string
|
|
||||||
return translated
|
|
||||||
|
|
||||||
escape: (string) ->
|
|
||||||
string = ('' + string)
|
|
||||||
.replace(/&/g, '&')
|
|
||||||
.replace(/</g, '<')
|
|
||||||
.replace(/>/g, '>')
|
|
||||||
.replace(/\x22/g, '"')
|
|
||||||
|
|
||||||
class App.Run extends Spine.Controller
|
class App.Run extends Spine.Controller
|
||||||
constructor: ->
|
constructor: ->
|
||||||
|
@ -308,7 +81,7 @@ class App.Run extends Spine.Controller
|
||||||
|
|
||||||
# bind to fill selected text into
|
# bind to fill selected text into
|
||||||
$(@el).bind('mouseup', =>
|
$(@el).bind('mouseup', =>
|
||||||
window.Session['UISeletion'] = @getSelected() + ''
|
window.Session['UISelection'] = @getSelected() + ''
|
||||||
)
|
)
|
||||||
|
|
||||||
# @ws = new WebSocket("ws://localhost:3001/");
|
# @ws = new WebSocket("ws://localhost:3001/");
|
||||||
|
|
48
app/assets/javascripts/app/lib/ajax.js.coffee
Normal file
48
app/assets/javascripts/app/lib/ajax.js.coffee
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
$ = jQuery.sub()
|
||||||
|
|
||||||
|
class App.Com
|
||||||
|
_instance = undefined # Must be declared here to force the closure on the class
|
||||||
|
@ajax: (args) -> # Must be a static method
|
||||||
|
if _instance == undefined
|
||||||
|
_instance ?= new _Singleton
|
||||||
|
|
||||||
|
_instance.ajax(args)
|
||||||
|
_instance
|
||||||
|
|
||||||
|
# The actual Singleton class
|
||||||
|
class _Singleton
|
||||||
|
defaults:
|
||||||
|
contentType: 'application/json'
|
||||||
|
dataType: 'json'
|
||||||
|
processData: false
|
||||||
|
headers: {'X-Requested-With': 'XMLHttpRequest'}
|
||||||
|
cache: false
|
||||||
|
async: true
|
||||||
|
|
||||||
|
queue_list: {}
|
||||||
|
count: 0
|
||||||
|
|
||||||
|
constructor: (@args) ->
|
||||||
|
|
||||||
|
ajax: (params, defaults) ->
|
||||||
|
data = $.extend({}, @defaults, defaults, params)
|
||||||
|
@count++
|
||||||
|
@_show_spinner()
|
||||||
|
# console.log( 'START', @count )
|
||||||
|
if params['id']
|
||||||
|
if @queue_list[ params['id'] ]
|
||||||
|
@queue_list[ params['id'] ].abort()
|
||||||
|
@queue_list[ params['id'] ] = $.ajax( data ).always( @_hide_spinner )
|
||||||
|
else
|
||||||
|
$.ajax( data ).always( @_hide_spinner )
|
||||||
|
|
||||||
|
console.log('AJAX', params['url'] )
|
||||||
|
|
||||||
|
_show_spinner: =>
|
||||||
|
$('.spinner').show()
|
||||||
|
|
||||||
|
_hide_spinner: =>
|
||||||
|
@count--
|
||||||
|
if @count == 0
|
||||||
|
$('.spinner').hide()
|
||||||
|
|
78
app/assets/javascripts/app/lib/auth.js.coffee
Normal file
78
app/assets/javascripts/app/lib/auth.js.coffee
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
$ = jQuery.sub()
|
||||||
|
|
||||||
|
class App.Auth
|
||||||
|
|
||||||
|
@login: (params) ->
|
||||||
|
console.log 'login(...)', params
|
||||||
|
App.Com.ajax(
|
||||||
|
id: 'login',
|
||||||
|
# params,
|
||||||
|
type: 'POST',
|
||||||
|
url: '/signin',
|
||||||
|
data: JSON.stringify(params.data),
|
||||||
|
success: params.success,
|
||||||
|
error: params.error,
|
||||||
|
)
|
||||||
|
|
||||||
|
@loginCheck: ->
|
||||||
|
console.log 'loginCheck(...)'
|
||||||
|
App.Com.ajax(
|
||||||
|
id: 'login_check',
|
||||||
|
async: false,
|
||||||
|
type: 'GET',
|
||||||
|
url: '/signshow',
|
||||||
|
success: (data, status, xhr) =>
|
||||||
|
console.log 'logincheck:success', data
|
||||||
|
|
||||||
|
# if session is not valid
|
||||||
|
if data.error
|
||||||
|
|
||||||
|
# update config
|
||||||
|
for key, value of data.config
|
||||||
|
window.Config[key] = value
|
||||||
|
|
||||||
|
# empty session
|
||||||
|
window.Session = {}
|
||||||
|
|
||||||
|
# rebuild navbar with new navbar items
|
||||||
|
Spine.trigger 'navrebuild'
|
||||||
|
|
||||||
|
return false;
|
||||||
|
|
||||||
|
# set avatar
|
||||||
|
if !data.session.image
|
||||||
|
data.session.image = 'http://placehold.it/48x48'
|
||||||
|
|
||||||
|
# update config
|
||||||
|
for key, value of data.config
|
||||||
|
window.Config[key] = value
|
||||||
|
|
||||||
|
# store user data
|
||||||
|
for key, value of data.session
|
||||||
|
window.Session[key] = value
|
||||||
|
|
||||||
|
# refresh/load default collections
|
||||||
|
for key, value of data.default_collections
|
||||||
|
App[key].refresh( value, options: { clear: true } )
|
||||||
|
|
||||||
|
# rebuild navbar with new navbar items
|
||||||
|
Spine.trigger 'navrebuild', data.session
|
||||||
|
|
||||||
|
# rebuild navbar with updated ticket count of overviews
|
||||||
|
Spine.trigger 'navupdate_remote'
|
||||||
|
|
||||||
|
|
||||||
|
error: (xhr, statusText, error) =>
|
||||||
|
console.log 'loginCheck:error'#, error, statusText, xhr.statusCode
|
||||||
|
|
||||||
|
# empty session
|
||||||
|
window.Session = {}
|
||||||
|
)
|
||||||
|
|
||||||
|
@logout: ->
|
||||||
|
console.log 'logout(...)'
|
||||||
|
App.Com.ajax(
|
||||||
|
id: 'logout',
|
||||||
|
type: 'DELETE',
|
||||||
|
url: '/signout',
|
||||||
|
)
|
121
app/assets/javascripts/app/lib/i18n.js.coffee
Normal file
121
app/assets/javascripts/app/lib/i18n.js.coffee
Normal file
|
@ -0,0 +1,121 @@
|
||||||
|
$ = jQuery.sub()
|
||||||
|
|
||||||
|
class App.i18n
|
||||||
|
|
||||||
|
constructor: ->
|
||||||
|
@locale = 'de'
|
||||||
|
@set( @locale )
|
||||||
|
window.T = @translate_content
|
||||||
|
window.Ti = @translate_inline
|
||||||
|
|
||||||
|
# $('.translation [contenteditable]')
|
||||||
|
$('body')
|
||||||
|
.delegate '.translation', 'focus', (e) =>
|
||||||
|
$this = $(e.target)
|
||||||
|
$this.data 'before', $this.html()
|
||||||
|
# console.log('11111current', $this.html())
|
||||||
|
return $this
|
||||||
|
# .delegate '.translation', 'blur keyup paste', (e) =>
|
||||||
|
.delegate '.translation', 'blur', (e) =>
|
||||||
|
$this = $(e.target)
|
||||||
|
source = $this.attr('data-text')
|
||||||
|
|
||||||
|
# get new translation
|
||||||
|
translation_new = $this.html()
|
||||||
|
translation_new = ('' + translation_new)
|
||||||
|
.replace(/<.+?>/g, '')
|
||||||
|
|
||||||
|
# set new translation
|
||||||
|
$this.html(translation_new)
|
||||||
|
|
||||||
|
# update translation
|
||||||
|
return if $this.data('before') is translation_new
|
||||||
|
console.log 'Translation Update', translation_new, $this.data 'before'
|
||||||
|
$this.data 'before', translation_new
|
||||||
|
|
||||||
|
# update runtime translation map
|
||||||
|
@map[ source ] = translation_new
|
||||||
|
|
||||||
|
# replace rest in page
|
||||||
|
$(".translation[data-text='#{source}']").html( translation_new )
|
||||||
|
|
||||||
|
# update permanent translation map
|
||||||
|
translation = App.Translation.findByAttribute( 'source', source )
|
||||||
|
if translation
|
||||||
|
translation.updateAttribute( 'target', translation_new )
|
||||||
|
else
|
||||||
|
translation = new App.Translation
|
||||||
|
translation.load(
|
||||||
|
locale: @locale,
|
||||||
|
source: source,
|
||||||
|
target: translation_new,
|
||||||
|
)
|
||||||
|
translation.save()
|
||||||
|
|
||||||
|
return $this
|
||||||
|
|
||||||
|
set: (locale) =>
|
||||||
|
@map = {}
|
||||||
|
App.Com.ajax(
|
||||||
|
id: 'i18n-set-' + locale,
|
||||||
|
type: 'GET',
|
||||||
|
url: '/translations/lang/' + locale,
|
||||||
|
async: false,
|
||||||
|
success: (data, status, xhr) =>
|
||||||
|
|
||||||
|
# load translation collection
|
||||||
|
for object in data
|
||||||
|
|
||||||
|
# set runtime lookup table
|
||||||
|
@map[ object[1] ] = object[2]
|
||||||
|
|
||||||
|
# load in collection if needed
|
||||||
|
App.Translation.refresh( { id: object[0], source: object[1], target: object[2], locale: @locale }, options: { clear: true } )
|
||||||
|
|
||||||
|
error: (xhr, statusText, error) =>
|
||||||
|
console.log 'error', error, statusText, xhr.statusCode
|
||||||
|
)
|
||||||
|
|
||||||
|
translate_inline: (string, args...) =>
|
||||||
|
@translate(string, args...)
|
||||||
|
|
||||||
|
translate_content: (string, args...) =>
|
||||||
|
translated = @translate(string, args...)
|
||||||
|
# replace = '<span class="translation" contenteditable="true" data-text="' + @escape(string) + '">' + translated + '<span class="icon-edit"></span>'
|
||||||
|
if window.Config['Translation']
|
||||||
|
replace = '<span class="translation" contenteditable="true" data-text="' + @escape(string) + '">' + translated + ''
|
||||||
|
# if !@_translated
|
||||||
|
# replace += '<span class="missing">XX</span>'
|
||||||
|
replace += '</span>'
|
||||||
|
else
|
||||||
|
translated
|
||||||
|
|
||||||
|
translate: (string, args...) =>
|
||||||
|
|
||||||
|
# return '' on undefined
|
||||||
|
return '' if string is undefined
|
||||||
|
|
||||||
|
# return translation
|
||||||
|
if @map[string] isnt undefined
|
||||||
|
@_translated = true
|
||||||
|
translated = @map[string]
|
||||||
|
else
|
||||||
|
@_translated = false
|
||||||
|
translated = string
|
||||||
|
|
||||||
|
# search %s
|
||||||
|
for arg in args
|
||||||
|
translated = translated.replace(/%s/, arg)
|
||||||
|
|
||||||
|
# escape
|
||||||
|
translated = @escape(translated)
|
||||||
|
|
||||||
|
# return translated string
|
||||||
|
return translated
|
||||||
|
|
||||||
|
escape: (string) ->
|
||||||
|
string = ('' + string)
|
||||||
|
.replace(/&/g, '&')
|
||||||
|
.replace(/</g, '<')
|
||||||
|
.replace(/>/g, '>')
|
||||||
|
.replace(/\x22/g, '"')
|
Loading…
Reference in a new issue