diff --git a/app/assets/javascripts/app/controllers/layout_ref.js.coffee b/app/assets/javascripts/app/controllers/layout_ref.js.coffee index a86e4252b..ac92388cf 100644 --- a/app/assets/javascripts/app/controllers/layout_ref.js.coffee +++ b/app/assets/javascripts/app/controllers/layout_ref.js.coffee @@ -1289,6 +1289,7 @@ class slaRef extends App.ControllerContent 'click .js-activateColumn': 'activateColumn' 'click .js-activateRow': 'activateRow' 'click [data-type=new]': 'createNew' + 'click .js-toggle': 'toggleSla' constructor: -> super @@ -1297,6 +1298,13 @@ class slaRef extends App.ControllerContent render: -> @html App.view('layout_ref/sla')() + toggleSla: (e) => + sla = $(e.currentTarget).closest('.sla') + isInactive = sla.hasClass('is-inactive') + sla.toggleClass('is-inactive') + isInactive = !isInactive + sla.find('.js-toggle').text(if isInactive then 'Enable' else 'Disable') + activateColumn: (event) => checkbox = @$(event.currentTarget) columnName = checkbox.attr('data-target') diff --git a/app/assets/javascripts/app/views/layout_ref/sla.jst.eco b/app/assets/javascripts/app/views/layout_ref/sla.jst.eco index 119dae8f6..b770c07be 100644 --- a/app/assets/javascripts/app/views/layout_ref/sla.jst.eco +++ b/app/assets/javascripts/app/views/layout_ref/sla.jst.eco @@ -76,15 +76,93 @@ -
-

- Service-Level-Agreements, abgekürzt SLAs, unterstützen Sie gegenüber Kunden gewisse zeitliche Reaktionen einzuhalten. Somit können Sie z. B. sagen Kunden sollen immer nach spätestens 8 Stunden eine Reaktion von Ihnen bekommen. Falls es zu einer drohenden Unterschreitung oder einer Unterschreitung kommt, weißt Zammad Sie auf solche Ereignisse hin. -

-

- Es können Reaktionszeit (Zeit zwischen Erstellung eines Tickets und erster Reaktion eines Agenten), Aktualisierungszeit (Zeit zwischen Nachfrage eines Kunden und Reaktion eines Agenten) und Lösungszeit (Zeit zwischen Erstellung und schließen eines Tickets) definiert werden. -

-

- Drohenden Unterschreitungen oder Unterschreitungen werden in einer eigenen Ansicht in den Übersichten angezeigt. Zudem können E-Mail Benachrichtigungen konfiguriert werden. -

+
+
+

Filters

+ Where Organization equals to Deutsche Bank.
+ Where Priority is high. +
+
+ +
+
+

Repsonse Times

+
+
+
00:30 Stunden
+
+ + First Response Time +
+
+
+
01:00 Stunden
+
+ + Update Time +
+
+
+
48:00 Stunden
+
+ + Solution Time +
+
+
+
+
+

Business Hours in European Central Time

+ Mo-Tu 7am - 5pm, Fr 7am - 1pm +
+
+
Disable
+
Edit
+
+
+ +
+
+

Filters

+ Where Organization equals to Deutsche Bank.
+ Where Priority is high. +
+
+ +
+
+

Repsonse Times

+
+
+
00:30 Stunden
+
+ + First Response Time +
+
+
+
01:00 Stunden
+
+ + Update Time +
+
+
+
48:00 Stunden
+
+ + Solution Time +
+
+
+
+
+

Business Hours in European Central Time

+ Mo-Tu 7am - 5pm, Fr 7am - 1pm +
+
+
Enable
+
Edit
+
\ No newline at end of file diff --git a/app/assets/stylesheets/zammad.css.scss b/app/assets/stylesheets/zammad.css.scss index 4da9c2340..0be48048a 100644 --- a/app/assets/stylesheets/zammad.css.scss +++ b/app/assets/stylesheets/zammad.css.scss @@ -16,7 +16,7 @@ body { font-family: "Fira Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; line-height: 1.45; font-weight: normal; - background: hsl(210,17%,98%); + background: hsl(210,14%,97%); height: 100%; color: hsl(198,19%,72%); word-wrap: break-word; @@ -5508,6 +5508,81 @@ output { } } +.sla { + background: white; + border: 1px solid hsl(199,44%,93%); + color: hsl(206,7%,28%); + display: flex; + flex-wrap: wrap; + padding: 20px; + box-shadow: 0 2px hsl(210,7%,94%); + + & + .sla { + margin-top: 17px; + } + + &.is-inactive { + box-shadow: none; + position: relative; + top: 2px; + + & > *:not(.sla-controls) { + opacity: 0.33; + } + } + + h3 { + color: hsl(0,0%,60%); + margin-top: 0; + } + + .arrow { + align-self: center; + margin: 25px 50px 0; + + .icon { + width: 15px; + height: 24px; + fill: hsl(198,17%,89%); + } + } + + .response-times-entry { + display: flex; + + .icon { + display: none; + vertical-align: middle; + margin-right: 3px; + + &:not(.icon-checkmark) { + } + } + + .response-time { + margin-right: 5px; + } + } + + .response-times-entry:not(:last-child) { + margin: 0 0 2px; + } + + .sla-businessHours { + flex-basis: 100%; + margin: 20px 0; + } + + .sla-controls { + flex-basis: 100%; + display: flex; + + .sla-edit { + margin-left: auto; + } + } +} + /* ---------------- diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 86a7e35a6..9ac15fd70 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -98,122 +98,98 @@ class ApplicationController < ActionController::Base def authentication_check_only(auth_param) logger.debug 'authentication_check' - session[:request_type] = 1 #logger.debug params.inspect #logger.debug session.inspect #logger.debug cookies.inspect - # check http basic auth - authenticate_with_http_basic do |username, password| - logger.debug 'http basic auth check' - session[:request_type] = 2 + # already logged in, early exit + if session.id && session[:user_id] + userdata = User.find( session[:user_id] ) + current_user_set(userdata) - userdata = User.authenticate( username, password ) - message = '' - if !userdata - message = 'authentication failed' - end + return { + auth: true + } + end - # return auth ok - if message == '' + error_message = 'authentication failed' - # remember user - session[:user_id] = userdata.id + # check logon session + if params['logon_session'] + logon_session = ActiveRecord::SessionStore::Session.where( session_id: params['logon_session'] ).first - # set basic auth user to current user + # set logon session user to current user + if logon_session + userdata = User.find( logon_session.data[:user_id] ) current_user_set(userdata) + + session[:persistent] = true + return { auth: true } end - # return auth not ok + error_message = 'no valid session, user_id' + end + + # check sso + sso_userdata = User.sso(params) + if sso_userdata + + current_user_set(sso_userdata) + + session[:persistent] = true + return { - auth: false, - message: message, + auth: true } end - # check logon session - if params['logon_session'] - logon_session = ActiveRecord::SessionStore::Session.where( session_id: params['logon_session'] ).first - if logon_session - userdata = User.find( logon_session.data[:user_id] ) - end + # check http basic auth + authenticate_with_http_basic do |username, password| + logger.debug "http basic auth check '#{username}'" - session[:request_type] = 3 + userdata = User.authenticate( username, password ) - # set logon session user to current user + next if !userdata + + # set basic auth user to current user current_user_set(userdata) return { auth: true } end - # check sso - if !session[:user_id] - - user = User.sso(params) - - # Log the authorizing user in. - if user - session[:user_id] = user.id - end - end - # check token if auth_param[:token_action] - authenticate_with_http_token do |token, options| - logger.debug 'token auth check' - session[:request_type] = 4 + authenticate_with_http_token do |token, _options| + logger.debug "token auth check #{token}" userdata = Token.check( action: auth_param[:token_action], name: token, ) - message = '' - if !userdata - message = 'authentication failed' - end + next if !userdata - # return auth ok - if message == '' + # set token user to current user + current_user_set(userdata) - # remember user - session[:user_id] = userdata.id - - # set token user to current user - current_user_set(userdata) - return { - auth: true - } - end - - # return auth not ok return { - auth: false, - message: message, + auth: true } end end - # return auth not ok (no session exists) - if !session[:user_id] - logger.debug 'no valid session, user_id' - message = 'no valid session, user_id' - return { - auth: false, - message: message, - } - end - + logger.debug error_message { - auth: true + auth: false, + message: error_message, } end - def authentication_check( auth_param = { basic_auth_promt: false } ) + def authentication_check( auth_param = {} ) result = authentication_check_only(auth_param) # check if basic_auth fallback is possible @@ -233,6 +209,9 @@ class ApplicationController < ActionController::Base return false end + # store current user id into the session + session[:user_id] = current_user.id + # return auth ok true end diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index f0d530207..079ad10d8 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -54,6 +54,10 @@ class SessionsController < ApplicationController # ) end + # sessions created via this + # controller are persistent + session[:persistent] = true + # return new session data render status: :created, json: { diff --git a/app/models/observer/session.rb b/app/models/observer/session.rb index cd051fb21..5a2f490ee 100644 --- a/app/models/observer/session.rb +++ b/app/models/observer/session.rb @@ -13,15 +13,17 @@ class Observer::Session < ActiveRecord::Observer check(record) end + # move the persistent attribute from the sub structure + # to the first level so it gets stored in the database + # column to make the cleanup lookup more performant def check(record) return if !record.data - return if record[:request_type] + return if record[:persistent] - # remember request type - return if !record.data['request_type'] + return if !record.data['persistent'] - record[:request_type] = record.data['request_type'] - record.data.delete('request_type') + record[:persistent] = record.data['persistent'] + record.data.delete('persistent') end end diff --git a/app/models/token.rb b/app/models/token.rb index 0d65900f2..54bdb3a68 100644 --- a/app/models/token.rb +++ b/app/models/token.rb @@ -21,7 +21,7 @@ class Token < ActiveRecord::Base return end - # return token if valid + # return token user token.user end diff --git a/contrib/icon-sprite.sketch b/contrib/icon-sprite.sketch index 56246c317..d8685df6d 100644 Binary files a/contrib/icon-sprite.sketch and b/contrib/icon-sprite.sketch differ diff --git a/db/migrate/20150623145511_session_changes.rb b/db/migrate/20150623145511_session_changes.rb new file mode 100644 index 000000000..4fd08afd3 --- /dev/null +++ b/db/migrate/20150623145511_session_changes.rb @@ -0,0 +1,24 @@ +class SessionChanges < ActiveRecord::Migration + def up + + ActiveRecord::SessionStore::Session.delete_all + + remove_index :sessions, :request_type + remove_column :sessions, :request_type + + add_column :sessions, :persistent, :boolean, null: true + add_index :sessions, :persistent + end + + def down + + ActiveRecord::SessionStore::Session.delete_all + + remove_index :sessions, :persistent + remove_column :sessions, :persistent + + add_column :sessions, :request_type, :integer, null: true + add_index :sessions, :request_type + end + +end diff --git a/lib/i_cal/ticket.rb b/lib/i_cal/ticket.rb index f58537177..0363845fc 100644 --- a/lib/i_cal/ticket.rb +++ b/lib/i_cal/ticket.rb @@ -56,6 +56,8 @@ module ICal::Ticket events_data = [] tickets.each do |ticket| + next if !ticket.pending_time + event_data = {} # rubocop:disable Rails/TimeZone @@ -86,6 +88,8 @@ module ICal::Ticket events_data = [] tickets.each do |ticket| + next if !ticket.escalation_time + event_data = {} # rubocop:disable Rails/TimeZone diff --git a/lib/session_helper.rb b/lib/session_helper.rb index f1081602e..7c74addf2 100644 --- a/lib/session_helper.rb +++ b/lib/session_helper.rb @@ -29,7 +29,7 @@ module SessionHelper def self.cleanup_expired # delete temp. sessions - ActiveRecord::SessionStore::Session.where('request_type IS NULL AND updated_at < ?', Time.zone.now - 1.days ).delete_all + ActiveRecord::SessionStore::Session.where('persistent IS NULL AND updated_at < ?', Time.zone.now - 1.days ).delete_all # web sessions older the x days ActiveRecord::SessionStore::Session.where('updated_at < ?', Time.zone.now - 90.days ).delete_all