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

Added preferences language feature.

Martin Edenhofer 12 лет назад
Родитель
Сommit
3bdc401931

+ 68 - 0
app/assets/javascripts/app/controllers/_profile/language.js.coffee

@@ -0,0 +1,68 @@
+class App.ProfileLanguage extends App.Controller
+  events:
+    'submit form': 'update'
+
+  constructor: ->
+    super
+    return if !@authenticate()
+    @render()
+
+  render: =>
+
+    html = $( App.view('profile/language')() )
+
+    configure_attributes = [
+      { name: 'locale', display: '', tag: 'select', null: false, class: 'input span4', options: { de: 'Deutsch', en: 'English (United States)', 'en-CA': 'English (Canada)', 'en-GB': 'English (United Kingdom)' }, default: App.i18n.get()  },
+    ]
+
+    @form = new App.ControllerForm(
+      el:        html.find('.language_item')
+      model:     { configure_attributes: configure_attributes }
+      autofocus: false
+    )
+    @html html
+
+  update: (e) =>
+    e.preventDefault()
+    params = @formParam(e.target)
+    error = @form.validate(params)
+    if error
+      @formValidate( form: e.target, errors: error )
+      return false
+
+    @formDisable(e)
+
+    # get data
+    @locale = params['locale']
+    App.Com.ajax(
+      id:   'preferences'
+      type: 'PUT'
+      url:  'api/users/preferences'
+      data: JSON.stringify(params)
+      processData: true
+      success: @success
+      error:   @error
+    )
+
+  success: (data, status, xhr) =>
+    App.Collection.find(
+      'User',
+      App.Session.get( 'id' ),
+      =>
+        App.i18n.set( @locale )
+        App.Event.trigger( 'ui:rerender' )
+        @notify(
+          type: 'success'
+          msg:  App.i18n.translateContent( 'Successfully!' )
+        )
+      ,
+      true,
+    )
+
+  error: (xhr, status, error) =>
+    @render()
+    data = JSON.parse( xhr.responseText )
+    @notify(
+      type: 'error'
+      msg:  App.i18n.translateContent( data.message )
+    )

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

@@ -13,7 +13,7 @@ class App.ChatWidget extends App.Controller
     @messageLog = []
 
     # rebuild chat widget
-    App.Event.bind 'ajax:auth', (user) =>
+    App.Event.bind 'auth', (user) =>
       if !user
         @messageLog = []
         @el.html('')

+ 2 - 6
app/assets/javascripts/app/controllers/logout.js.coffee

@@ -1,7 +1,4 @@
-$ = jQuery.sub()
-
 class Index extends App.Controller
-
   constructor: ->
     super
     @signout()
@@ -11,13 +8,12 @@ class Index extends App.Controller
     # remove remote session
     App.Auth.logout()
 
-    # remoce local session
+    # remove local session
     @Session.init()
-    App.Event.trigger 'ajax:auth'
+    App.Event.trigger( 'ui:rerender' )
 
     # redirect to login 
     @navigate 'login'
 
 App.Config.set( 'logout', Index, 'Routes' )
-
 App.Config.set( 'Logout', { prio: 1800, parent: '#current_user', name: 'Sign out', target: '#logout', divider: true, role: [ 'Agent', 'Customer' ] }, 'NavBarRight' )

+ 12 - 7
app/assets/javascripts/app/controllers/navigation.js.coffee

@@ -5,12 +5,16 @@ class App.Navigation extends App.Controller
     super
     @render()
 
+    # rerender view
+    App.Event.bind 'ui:rerender', (data) =>
+      @render()
+
     # update selected item
     App.Event.bind 'navupdate', (data) =>
-      @update(arguments[0])
+      @update( arguments[0] )
 
     # rebuild nav bar with given user data
-    App.Event.bind 'ajax:auth', (user) =>
+    App.Event.bind 'auth', (user) =>
       @log 'Navigation', 'notice', 'navbar rebuild', user
 
       if !_.isEmpty( user )
@@ -21,19 +25,20 @@ class App.Navigation extends App.Controller
         cache = App.Store.get( 'update_recent_viewed' )
         @recent_viewed_build( cache ) if cache
 
-      @render(user)
+      @render()
 
     # rebuild ticket overview data
     App.Event.bind 'navupdate_ticket_overview', (data) =>
       @ticket_overview_build(data)
-      @render( App.Session.all() )
+      @render()
 
-    # rebuild recent viewd data
+    # rebuild recent viewed data
     App.Event.bind 'update_recent_viewed', (data) =>
       @recent_viewed_build(data)
-      @render( App.Session.all() )
+      @render()
 
-  render: (user) ->
+  render: () ->
+    user      = App.Session.all()
     nav_left  = @getItems( navbar: @Config.get( 'NavBar' ) )
     nav_right = @getItems( navbar: @Config.get( 'NavBarRight' ) )
 

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

@@ -9,7 +9,7 @@ class Index extends App.ControllerLevel2
 
     @menu = [
       { name: 'Password',       'target': 'password', controller: App.ProfilePassword, params: {} },
-      { name: 'Language',       'target': 'language', controller: App.ProfileLinkedAccounts, params: { area: 'Ticket::Number' } },
+      { name: 'Language',       'target': 'language', controller: App.ProfileLanguage, params: {} },
       { name: 'Link Accounts',  'target': 'accounts', controller: App.ProfileLinkedAccounts, params: { area: 'Ticket::Number' } },
 #      { name: 'Notifications',  'target': 'notify',   controller: App.SettingsArea, params: { area: 'Ticket::Number' } },
     ] 

+ 12 - 2
app/assets/javascripts/app/lib/app_post/auth.js.coffee

@@ -73,7 +73,8 @@ class App.Auth
       App.WebSocket.auth()
 
       # rebuild navbar with new navbar items
-      App.Event.trigger 'ajax:auth'
+      App.Event.trigger( 'auth' )
+      App.Event.trigger( 'ui:rerender' )
 
       return false;
 
@@ -89,6 +90,14 @@ class App.Auth
     for key, value of data.session
       App.Session.set( key, value )
 
+    # init of i18n
+    preferences = App.Session.get( 'preferences' )
+    if preferences && preferences.locale
+      locale = preferences.locale
+    if !locale
+      locale = window.navigator.userLanguage || window.navigator.language || 'en'
+    App.i18n.set( locale )
+
     # refresh default collections
     for key, value of data.default_collections
       App[key].refresh( value, options: { clear: true } )
@@ -97,7 +106,8 @@ class App.Auth
     App.WebSocket.auth()
 
     # rebuild navbar with user data
-    App.Event.trigger 'ajax:auth', data.session
+    App.Event.trigger( 'auth', data.session )
+    App.Event.trigger( 'ui:rerender' )
 
 
   @_logout: (data) ->

+ 16 - 5
app/assets/javascripts/app/lib/app_post/i18n.js.coffee

@@ -3,8 +3,8 @@ $ = jQuery.sub()
 class App.i18n
   _instance = undefined
 
-  @init: ->
-    _instance ?= new _Singleton
+  @init: ( args ) ->
+    _instance ?= new _Singleton( args )
 
   @translateContent: ( string, args... ) ->
     if _instance == undefined
@@ -21,18 +21,23 @@ class App.i18n
       _instance ?= new _Singleton
     _instance.timestamp( args )
 
-  @set: ( args ) ->
+  @get: ->
     if _instance == undefined
       _instance ?= new _Singleton
+    _instance.get()
+
+  @set: ( args ) ->
+    if _instance == undefined
+      _instance ?= new _Singleton( args )
     _instance.set( args )
 
 class _Singleton extends Spine.Module
   @include App.Log
 
-  constructor: ->
+  constructor: ( locale ) ->
     @map = {}
     @timestampFormat = 'yyyy-mm-dd HH:MM'
-    @set('de')
+
     # observe if text has been translated
     $('body')
       .delegate '.translation', 'focus', (e) =>
@@ -78,8 +83,14 @@ class _Singleton extends Spine.Module
 
         return $this
 
+  get: ->
+    @locale
+
   set: ( locale ) ->
+    if locale is 'en-US'
+      locale = 'en'
     @locale = locale
+
     @map = {}
     App.Com.ajax(
       id:    'i18n-set-' + locale,

+ 14 - 7
app/assets/javascripts/app/lib/app_post/interface_handle.js.coffee

@@ -10,15 +10,12 @@ class App.Run extends App.Controller
     # create web socket connection
     App.WebSocket.connect()
 
-    # init of i18n
-    App.i18n.init()
+    # check if session already exists/try to get session data from server
+    App.Auth.loginCheck()
 
     # 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') )
 
@@ -70,8 +67,18 @@ class App.Content extends App.Controller
           # remove waypoints
           $('footer').waypoint('remove')
 
-          params.el = @el
-          new callback( params )
+          # execute controller
+          controller = (params) =>
+            params.el = @el
+            new callback( params )
+          controller( params )
+
+          # rerender view on ui:rerender event
+          App.Event.bind(
+            'ui:rerender', =>
+              controller( params )
+            'page'
+          )
 
           # scroll to top / remember last screen position
 #          @scrollTo( 0, 0, 100 )

+ 0 - 21
app/assets/javascripts/app/views/profile.jst.eco

@@ -1,21 +0,0 @@
-<div class="page-header">
-  <h1><%- @T( 'Profile' ) %><small></small></h1>
-</div>
-<ul>
-  <li><%- @T( 'Password' ) %></li>
-  <li><%- @T( 'Link Accounts' ) %></li>
-  <li><%- @T( 'Notifications' ) %></li>
-  <li></li>
-</ul>
-    <div class="container">
-      <div class="row">
-        <div class="span12">
-          Link Accounts
-          <ul>
-            <li><a href="/auth/twitter">twitter</a></li>
-            <li><a href="/auth/facebook">facebook</a></li>
-            <li><a href="/auth/linked_in">linkedin</a></li>
-          </ul>
-        </div>
-      </div>
-    </div>

+ 6 - 0
app/assets/javascripts/app/views/profile/language.jst.eco

@@ -0,0 +1,6 @@
+<form class="">
+  <h2><%- @T( 'Language' ) %></h2>
+  <p><%- @T( 'Change your language.' ) %></p>
+  <div class="language_item"></div>
+  <button type="submit" class="btn"><%- @T( 'Submit' ) %></button>
+</form>

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