diff --git a/app/assets/javascripts/app/controllers/_profile/language.js.coffee b/app/assets/javascripts/app/controllers/_profile/language.js.coffee
new file mode 100644
index 000000000..dbeebf6b9
--- /dev/null
+++ b/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 )
+ )
diff --git a/app/assets/javascripts/app/controllers/chat_widget.js.coffee b/app/assets/javascripts/app/controllers/chat_widget.js.coffee
index 035819015..8680b2b4d 100644
--- a/app/assets/javascripts/app/controllers/chat_widget.js.coffee
+++ b/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('')
diff --git a/app/assets/javascripts/app/controllers/logout.js.coffee b/app/assets/javascripts/app/controllers/logout.js.coffee
index 708a7557a..f5adda8e9 100644
--- a/app/assets/javascripts/app/controllers/logout.js.coffee
+++ b/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' )
diff --git a/app/assets/javascripts/app/controllers/navigation.js.coffee b/app/assets/javascripts/app/controllers/navigation.js.coffee
index e11839247..da1f7c1a2 100644
--- a/app/assets/javascripts/app/controllers/navigation.js.coffee
+++ b/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' ) )
diff --git a/app/assets/javascripts/app/controllers/profile.js.coffee b/app/assets/javascripts/app/controllers/profile.js.coffee
index 11e04369a..6ff5f66a3 100644
--- a/app/assets/javascripts/app/controllers/profile.js.coffee
+++ b/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' } },
]
diff --git a/app/assets/javascripts/app/lib/app_post/auth.js.coffee b/app/assets/javascripts/app/lib/app_post/auth.js.coffee
index 292910d2d..a70f0d846 100644
--- a/app/assets/javascripts/app/lib/app_post/auth.js.coffee
+++ b/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) ->
diff --git a/app/assets/javascripts/app/lib/app_post/i18n.js.coffee b/app/assets/javascripts/app/lib/app_post/i18n.js.coffee
index d5d5fef45..91bdc3655 100644
--- a/app/assets/javascripts/app/lib/app_post/i18n.js.coffee
+++ b/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,
diff --git a/app/assets/javascripts/app/lib/app_post/interface_handle.js.coffee b/app/assets/javascripts/app/lib/app_post/interface_handle.js.coffee
index b9199352a..c282cbef8 100644
--- a/app/assets/javascripts/app/lib/app_post/interface_handle.js.coffee
+++ b/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 )
diff --git a/app/assets/javascripts/app/views/profile.jst.eco b/app/assets/javascripts/app/views/profile.jst.eco
deleted file mode 100644
index 64cd44a11..000000000
--- a/app/assets/javascripts/app/views/profile.jst.eco
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
- - <%- @T( 'Password' ) %>
- - <%- @T( 'Link Accounts' ) %>
- - <%- @T( 'Notifications' ) %>
-
-
-
\ No newline at end of file
diff --git a/app/assets/javascripts/app/views/profile/language.jst.eco b/app/assets/javascripts/app/views/profile/language.jst.eco
new file mode 100644
index 000000000..71a8bd42a
--- /dev/null
+++ b/app/assets/javascripts/app/views/profile/language.jst.eco
@@ -0,0 +1,6 @@
+
diff --git a/app/assets/javascripts/app/views/profile/linked_accounts.jst.eco b/app/assets/javascripts/app/views/profile/linked_accounts.jst.eco
new file mode 100644
index 000000000..ea55f0b7a
--- /dev/null
+++ b/app/assets/javascripts/app/views/profile/linked_accounts.jst.eco
@@ -0,0 +1,6 @@
+<%- @T( 'Link Accounts' ) %>
+
diff --git a/app/assets/javascripts/app/views/profile/password.jst.eco b/app/assets/javascripts/app/views/profile/password.jst.eco
index eb579d8c1..ef4c28171 100644
--- a/app/assets/javascripts/app/views/profile/password.jst.eco
+++ b/app/assets/javascripts/app/views/profile/password.jst.eco
@@ -1,7 +1,5 @@
-
\ No newline at end of file
diff --git a/app/controllers/channels_controller.rb b/app/controllers/channels_controller.rb
index a11c2b103..d9c9aec7e 100644
--- a/app/controllers/channels_controller.rb
+++ b/app/controllers/channels_controller.rb
@@ -92,6 +92,7 @@ curl http://localhost/api/channels.json -v -u #{login}:#{password}
=end
def index
+ return if is_not_role('Admin')
model_index_render(Channel, params)
end
@@ -114,6 +115,7 @@ curl http://localhost/api/channels/#{id}.json -v -u #{login}:#{password}
=end
def show
+ return if is_not_role('Admin')
model_show_render(Channel, params)
end
diff --git a/app/controllers/overviews_controller.rb b/app/controllers/overviews_controller.rb
index cdd5c155b..ae71c321a 100644
--- a/app/controllers/overviews_controller.rb
+++ b/app/controllers/overviews_controller.rb
@@ -50,6 +50,7 @@ curl http://localhost/api/overviews.json -v -u #{login}:#{password}
=end
def index
+ return if is_not_role('Admin')
model_index_render(Overview, params)
end
@@ -71,6 +72,7 @@ curl http://localhost/api/overviews/#{id}.json -v -u #{login}:#{password}
=end
def show
+ return if is_not_role('Admin')
model_show_render(Overview, params)
end
@@ -104,6 +106,7 @@ curl http://localhost/api/overviews.json -v -u #{login}:#{password} -H "Content-
=end
def create
+ return if is_not_role('Admin')
model_create_render(Overview, params)
end
@@ -137,6 +140,7 @@ curl http://localhost/api/overviews.json -v -u #{login}:#{password} -H "Content-
=end
def update
+ return if is_not_role('Admin')
model_update_render(Overview, params)
end
@@ -154,6 +158,7 @@ curl http://localhost/api/overviews.json -v -u #{login}:#{password} -H "Content-
=end
def destroy
+ return if is_not_role('Admin')
model_destory_render(Overview, params)
end
end
diff --git a/app/controllers/postmaster_filters_controller.rb b/app/controllers/postmaster_filters_controller.rb
index fb5d966f9..621085937 100644
--- a/app/controllers/postmaster_filters_controller.rb
+++ b/app/controllers/postmaster_filters_controller.rb
@@ -52,6 +52,7 @@ curl http://localhost/api/postmaster_filters.json -v -u #{login}:#{password}
=end
def index
+ return if is_not_role('Admin')
model_index_render(PostmasterFilter, params)
end
@@ -73,6 +74,7 @@ curl http://localhost/api/postmaster_filters/#{id}.json -v -u #{login}:#{passwor
=end
def show
+ return if is_not_role('Admin')
model_show_render(PostmasterFilter, params)
end
diff --git a/app/controllers/slas_controller.rb b/app/controllers/slas_controller.rb
index eeb025863..c1fea7447 100644
--- a/app/controllers/slas_controller.rb
+++ b/app/controllers/slas_controller.rb
@@ -45,6 +45,7 @@ curl http://localhost/api/slas.json -v -u #{login}:#{password}
=end
def index
+ return if is_not_role('Admin')
model_index_render(Sla, params)
end
@@ -66,6 +67,7 @@ curl http://localhost/api/slas/#{id}.json -v -u #{login}:#{password}
=end
def show
+ return if is_not_role('Admin')
model_show_render(Sla, params)
end
@@ -94,6 +96,7 @@ curl http://localhost/api/slas.json -v -u #{login}:#{password} -H "Content-Type:
=end
def create
+ return if is_not_role('Admin')
model_create_render(Sla, params)
end
@@ -122,6 +125,7 @@ curl http://localhost/api/slas.json -v -u #{login}:#{password} -H "Content-Type:
=end
def update
+ return if is_not_role('Admin')
model_update_render(Sla, params)
end
@@ -139,6 +143,7 @@ curl http://localhost/api/slas.json -v -u #{login}:#{password} -H "Content-Type:
=end
def destroy
+ return if is_not_role('Admin')
model_destory_render(Sla, params)
end
end
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index 8c0ca0903..71ff4dc0f 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -250,6 +250,7 @@ curl http://localhost/api/users/2.json -v -u #{login}:#{password} -H "Content-Ty
=end
def update
+ return if is_not_role('Admin')
user = User.find(params[:id])
begin
@@ -383,7 +384,7 @@ POST /api/users/password_change
Payload:
{
"password_old": "some_password_old",
- "password_new" "some_password_new"
+ "password_new": "some_password_new"
}
Response:
@@ -392,7 +393,7 @@ Response:
}
Test:
-curl http://localhost/api/users/password_change.json -v -u #{login}:#{password} -H "Content-Type: application/json" -X POST -d '{"password_old": "password_old", "password_new" "password_new"}'
+curl http://localhost/api/users/password_change.json -v -u #{login}:#{password} -H "Content-Type: application/json" -X POST -d '{"password_old": "password_old", "password_new": "password_new"}'
=end
@@ -418,4 +419,39 @@ curl http://localhost/api/users/password_change.json -v -u #{login}:#{password}
render :json => { :message => 'ok', :user_login => user.login }, :status => :ok
end
+=begin
+
+Resource:
+PUT /api/users/preferences.json
+
+Payload:
+{
+ "language": "de",
+ "notification": true
+}
+
+Response:
+{
+ :message => 'ok'
+}
+
+Test:
+curl http://localhost/api/users/preferences.json -v -u #{login}:#{password} -H "Content-Type: application/json" -X PUT -d '{"language": "de", "notifications": true}'
+
+=end
+
+ def preferences
+ if !current_user
+ render :json => { :message => 'No current user!' }, :status => :unprocessable_entity
+ return
+ end
+ if params[:user]
+ params[:user].each {|key, value|
+ current_user.preferences[key.to_sym] = value
+ }
+ end
+ current_user.save
+ render :json => { :message => 'ok' }, :status => :ok
+ end
+
end
diff --git a/config/routes/user.rb b/config/routes/user.rb
index 8073fd212..17373fa96 100644
--- a/config/routes/user.rb
+++ b/config/routes/user.rb
@@ -6,6 +6,7 @@ module ExtraRoutes
map.match '/api/users/password_reset', :to => 'users#password_reset_send', :via => :post
map.match '/api/users/password_reset_verify', :to => 'users#password_reset_verify', :via => :post
map.match '/api/users/password_change', :to => 'users#password_change', :via => :post
+ map.match '/api/users/preferences', :to => 'users#preferences', :via => :put
map.match '/api/users', :to => 'users#index', :via => :get
map.match '/api/users/:id', :to => 'users#show', :via => :get
map.match '/api/users', :to => 'users#create', :via => :post
diff --git a/db/seeds.rb b/db/seeds.rb
index 72defe176..e77744220 100644
--- a/db/seeds.rb
+++ b/db/seeds.rb
@@ -1745,14 +1745,14 @@ Translation.create_if_not_exists( :locale => 'de', :source => "Week", :target =>
Translation.create_if_not_exists( :locale => 'de', :source => "Follow up possible", :target => "Nachfrage möglich", :updated_by_id => 1, :created_by_id => 1 )
Translation.create_if_not_exists( :locale => 'de', :source => "Assign Follow Ups", :target => "Zuweisung bei Nachfrage", :updated_by_id => 1, :created_by_id => 1 )
Translation.create_if_not_exists( :locale => 'de', :source => "Signature", :target => "Signatur", :updated_by_id => 1, :created_by_id => 1 )
-Translation.create_if_not_exists( :locale => 'de', :source => "Change your password.", :target => "Ändern sie Ihr Passwort.", :updated_by_id => 1, :created_by_id => 1 )
+Translation.create_if_not_exists( :locale => 'de', :source => "Change your password.", :target => "Ändern Sie Ihr Passwort.", :updated_by_id => 1, :created_by_id => 1 )
Translation.create_if_not_exists( :locale => 'de', :source => "Current Password", :target => "Aktuelles Passwort", :updated_by_id => 1, :created_by_id => 1 )
Translation.create_if_not_exists( :locale => 'de', :source => "New Password", :target => "Neues Passwort", :updated_by_id => 1, :created_by_id => 1 )
Translation.create_if_not_exists( :locale => 'de', :source => "New Password (confirm)", :target => "Neues Passwort (bestätigen)", :updated_by_id => 1, :created_by_id => 1 )
Translation.create_if_not_exists( :locale => 'de', :source => "Language", :target => "Sprache", :updated_by_id => 1, :created_by_id => 1 )
-Translation.create_if_not_exists( :locale => 'de', :source => "", :target => "", :updated_by_id => 1, :created_by_id => 1 )
-Translation.create_if_not_exists( :locale => 'de', :source => "", :target => "", :updated_by_id => 1, :created_by_id => 1 )
-
+Translation.create_if_not_exists( :locale => 'de', :source => "Link Accounts", :target => "Verknüpfte Accounts", :updated_by_id => 1, :created_by_id => 1 )
+Translation.create_if_not_exists( :locale => 'de', :source => "Change your language.", :target => "Ändern Sie Ihr Sprache.", :updated_by_id => 1, :created_by_id => 1 )
+Translation.create_if_not_exists( :locale => 'de', :source => "Successfully!", :target => "Erfolgreich!", :updated_by_id => 1, :created_by_id => 1 )
#Translation.create_if_not_exists( :locale => 'de', :source => "", :target => "", :updated_by_id => 1, :created_by_id => 1 )
diff --git a/test/browser/ticket_create.rb b/test/browser/ticket_create.rb
index cff9c90e5..00c7e29bf 100644
--- a/test/browser/ticket_create.rb
+++ b/test/browser/ticket_create.rb
@@ -1,6 +1,6 @@
# encoding: utf-8
require 'browser_test_helper'
-
+
class TicketCreate < ActiveSupport::TestCase
test 'ticket create' do
tests = [
@@ -59,4 +59,4 @@ class TicketCreate < ActiveSupport::TestCase
]
browser_signle_test_with_login(tests)
end
-end
\ No newline at end of file
+end
diff --git a/test/browser_test_helper.rb b/test/browser_test_helper.rb
index adb5eeb69..852426f9d 100644
--- a/test/browser_test_helper.rb
+++ b/test/browser_test_helper.rb
@@ -7,7 +7,7 @@ class ActiveSupport::TestCase
# Add more helper methods to be used by all tests here...
def browser_login(data)
- all_tests = [
+ all_tests = [
{
:name => 'login',
:instance => data[:instance] || Watir::Browser.new,