From db69830ffefd0bb888a16b6f6bced0515c7bba46 Mon Sep 17 00:00:00 2001 From: Martin Edenhofer Date: Tue, 6 Oct 2015 23:32:26 +0200 Subject: [PATCH 01/11] Use i18n meta infos. --- app/assets/javascripts/app/controllers/layout_ref.coffee | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/app/controllers/layout_ref.coffee b/app/assets/javascripts/app/controllers/layout_ref.coffee index 48753c140..32a48398f 100644 --- a/app/assets/javascripts/app/controllers/layout_ref.coffee +++ b/app/assets/javascripts/app/controllers/layout_ref.coffee @@ -1509,15 +1509,16 @@ class InputsRef extends App.ControllerContent # date picker @$('.js-datepicker3').datepicker( todayHighlight: true - startDate: new Date().toLocaleDateString('de-DE') # returns 25.09.2015 - format: 'dd.mm.yyyy', + startDate: new Date() + format: App.i18n.timeFormat().date container: @$('.js-datepicker3').parent() ) # date time picker @$('.js-datepicker4').datepicker( todayHighlight: true - startDate: new Date().toLocaleDateString('en-US') # returns 9/25/2015 + startDate: new Date() + format: App.i18n.timeFormat().date container: @$('.js-datepicker4').parent() ) @$('.js-timepicker4').timepicker() From 303b3c9769d343e67f736ec201ab76593bed1849 Mon Sep 17 00:00:00 2001 From: Martin Edenhofer Date: Tue, 6 Oct 2015 23:55:50 +0200 Subject: [PATCH 02/11] Fixed permanent task. --- .../app/controllers/layout_ref.coffee | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/app/assets/javascripts/app/controllers/layout_ref.coffee b/app/assets/javascripts/app/controllers/layout_ref.coffee index 0e4dac363..b9f3a172c 100644 --- a/app/assets/javascripts/app/controllers/layout_ref.coffee +++ b/app/assets/javascripts/app/controllers/layout_ref.coffee @@ -1675,7 +1675,7 @@ class PrimaryEmailRef extends App.ControllerContent App.Config.set( 'layout_ref/primary_email', PrimaryEmailRef, 'Routes' ) -class App.CustomerChatRef extends App.ControllerContent +class App.CustomerChatRef extends App.Controller @extend Spine.Events questions: [ @@ -1758,6 +1758,11 @@ class App.CustomerChatRef extends App.ControllerContent # @testChat @chatWindows[0], 100 @initQuiz() + show: (params) => + + # highlight navbar + @navupdate '#layout_ref/customer_chat' + testChat: (chat, count) -> for i in [0..count] text = @questions[Math.floor(Math.random() * @questions.length)].question @@ -1850,12 +1855,24 @@ class App.CustomerChatRef extends App.ControllerContent else @nextQuestion() +class CustomerChatRouter extends App.ControllerPermanent + constructor: (params) -> + super + # check authentication + return if !@authenticate() -App.Config.set( 'layout_ref/customer_chat', App.CustomerChatRef, 'Routes' ) + App.TaskManager.execute( + key: 'CustomerChatRef' + controller: 'CustomerChatRef' + params: {} + show: true + persistent: true + ) -App.Config.set( 'Chat', { prio: 300, parent: '', name: 'Customer Chat', target: '#layout_ref/customer_chat', switch: true, counter: true, role: ['Agent'], class: 'chat' }, 'NavBar' ) -# App.Config.set( 'Chat', { controller: 'CustomerChatRef', authentication: true }, 'permanentTask' ) +App.Config.set( 'layout_ref/customer_chat', CustomerChatRouter, 'Routes' ) +App.Config.set( 'CustomerChatRef', { controller: 'CustomerChatRef', authentication: true }, 'permanentTask' ) +App.Config.set( 'CustomerChatRef', { prio: 1200, parent: '', name: 'Customer Chat', target: '#layout_ref/customer_chat', switch: true, counter: true, role: ['Agent'], class: 'chat' }, 'NavBar' ) class chatWindowRef extends Spine.Controller From 783b34726080d4d61035a263ecd0f256f77bb726 Mon Sep 17 00:00:00 2001 From: Martin Edenhofer Date: Wed, 7 Oct 2015 07:32:28 +0200 Subject: [PATCH 03/11] Improve rerender of articles. --- .../ticket_zoom/article_view.coffee | 46 +++++++++++-------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/app/assets/javascripts/app/controllers/ticket_zoom/article_view.coffee b/app/assets/javascripts/app/controllers/ticket_zoom/article_view.coffee index 138f3cd14..3565dcd45 100644 --- a/app/assets/javascripts/app/controllers/ticket_zoom/article_view.coffee +++ b/app/assets/javascripts/app/controllers/ticket_zoom/article_view.coffee @@ -20,7 +20,7 @@ class App.TicketZoomArticleView extends App.Controller @el.append( all ) class ArticleViewItem extends App.Controller - hasChangedAttributes: ['from', 'to', 'cc', 'subject', 'body', 'internal', 'preferences'] + hasChangedAttributes: ['from', 'to', 'cc', 'subject', 'body', 'preferences'] elements: '.textBubble-content': 'textBubbleContent' @@ -59,7 +59,7 @@ class ArticleViewItem extends App.Controller App.TicketArticle.unsubscribe(@subscribeId) setHighlighter: => - return if !@el.is(':visible') + return if @el.is(':hidden') # use delay do no ui blocking #@highligher.loadHighlights(@ticket_article_id) d = => @@ -69,19 +69,19 @@ class ArticleViewItem extends App.Controller hasChanged: (article) => # if no last article exists, remember it and return true - if !@article_last_updated - @article_last_updated = {} + if !@articleAttributesLastUpdate + @articleAttributesLastUpdate = {} for item in @hasChangedAttributes - @article_last_updated[item] = article[item] + @articleAttributesLastUpdate[item] = article[item] return true # compare last and current article attributes - article_last_updated_check = {} + articleAttributesLastUpdateCheck = {} for item in @hasChangedAttributes - article_last_updated_check[item] = article[item] - diff = difference(@article_last_updated, article_last_updated_check) + articleAttributesLastUpdateCheck[item] = article[item] + diff = difference(@articleAttributesLastUpdate, articleAttributesLastUpdateCheck) return false if !diff || _.isEmpty( diff ) - @article_last_updated = article_last_updated_check + @articleAttributesLastUpdate = articleAttributesLastUpdateCheck true render: (article) => @@ -90,16 +90,22 @@ class ArticleViewItem extends App.Controller @article = App.TicketArticle.fullLocal( @ticket_article_id ) # set @el attributes - @el.addClass("ticket-article-item #{@article.sender.name.toLowerCase()}") - if @article.internal is true - @el.addClass('is-internal') - else - @el.removeClass('is-internal') - @el.attr('data-id', @article.id) - @el.attr('id', "article-#{@article.id}") + if !article + @el.addClass("ticket-article-item #{@article.sender.name.toLowerCase()}") + @el.attr('data-id', @article.id) + @el.attr('id', "article-#{@article.id}") + + # set internal change directly in dom, without rerender while article + if !article || ( @lastArticle && @lastArticle.internal isnt @article.internal ) + if @article.internal is true + @el.addClass('is-internal') + else + @el.removeClass('is-internal') # check if rerender is needed - return if !@hasChanged(@article) + if !@hasChanged(@article) + @lastArticle = @article.attributes() + return # prepare html body if @article.content_type is 'text/html' @@ -128,14 +134,16 @@ class ArticleViewItem extends App.Controller # set see more @shown = false - @setSeeMore() + a = => + @setSeeMore() + @delay( a, 50 ) # set highlighter @setHighlighter() # set see more options setSeeMore: => - return if !@el.is(':visible') + return if @el.is(':hidden') return if @shown @shown = true From 3b4a9ad3db4d365ff06cd27559bbefdb0f5091c7 Mon Sep 17 00:00:00 2001 From: Martin Edenhofer Date: Wed, 7 Oct 2015 07:35:30 +0200 Subject: [PATCH 04/11] Moved to new date picker. --- .../app/controllers/_ui_element/date.coffee | 204 +++++--------- .../controllers/_ui_element/datetime.coffee | 251 ++++++------------ .../app/views/generic/date.jst.eco | 19 +- .../app/views/generic/datetime.jst.eco | 25 +- .../app/views/layout_ref/inputs.jst.eco | 8 +- public/assets/tests/form-validation.js | 93 +++---- 6 files changed, 199 insertions(+), 401 deletions(-) diff --git a/app/assets/javascripts/app/controllers/_ui_element/date.coffee b/app/assets/javascripts/app/controllers/_ui_element/date.coffee index 8444f45f4..feae1ab1e 100644 --- a/app/assets/javascripts/app/controllers/_ui_element/date.coffee +++ b/app/assets/javascripts/app/controllers/_ui_element/date.coffee @@ -6,52 +6,36 @@ class App.UiElement.date attribute.nameRaw = attribute.name attribute.name = "{date}#{attribute.name}" - # get time object - if attribute.value - if typeof attribute.value is 'string' - time = new Date( Date.parse( "#{attribute.value}T00:00:00Z" ) ) - else - time = new Date( attribute.value ) - - # time items - year = time.getUTCFullYear() - month = time.getUTCMonth() + 1 - day = time.getUTCDate() - - # create element item = $( App.view('generic/date')( attribute: attribute - year: year - month: month - day: day ) ) - # start bindings - item.find('.js-today').bind('click', (e) => - e.preventDefault() - @setNewTime(item, attribute, 0, true) - @validation(item, attribute) - ) - item.find('.js-plus-day').bind('click', (e) => - e.preventDefault() - @setNewTime(item, attribute, 60 * 24, false, true) - @validation(item, attribute) - ) - item.find('.js-minus-day').bind('click', (e) => - e.preventDefault() - @setNewTime(item, attribute, -60 * 24, false, true) - @validation(item, attribute) - ) - item.find('.js-plus-week').bind('click', (e) => - e.preventDefault() - @setNewTime(item, attribute, 60 * 24 * 7, false, true) - @validation(item, attribute) - ) - item.find('.js-minus-week').bind('click', (e) => - e.preventDefault() - @setNewTime(item, attribute, -60 * 24 * 7, false, true) - @validation(item, attribute) + # apply date widgets + $.fn.datepicker.dates['custom'] = + days: [App.i18n.translateInline('Sunday'), App.i18n.translateInline('Monday'), App.i18n.translateInline('Tuesday'), App.i18n.translateInline('Wednesday'), App.i18n.translateInline('Thursday'), App.i18n.translateInline('Friday'), App.i18n.translateInline('Saturday'), App.i18n.translateInline('Sunday')], + daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], + daysMin: [App.i18n.translateInline('Su'), App.i18n.translateInline('Mo'), App.i18n.translateInline('Tu'), App.i18n.translateInline('We'), App.i18n.translateInline('Th'), App.i18n.translateInline('Fr'), App.i18n.translateInline('Sa'), App.i18n.translateInline('Su')], + months: [App.i18n.translateInline('January'), App.i18n.translateInline('February'), App.i18n.translateInline('March'), App.i18n.translateInline('April'), App.i18n.translateInline('May'), App.i18n.translateInline('June'), App.i18n.translateInline('July'), App.i18n.translateInline('August'), App.i18n.translateInline('September'), App.i18n.translateInline('October'), App.i18n.translateInline('November'), App.i18n.translateInline('December')], + monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], + today: App.i18n.translateInline('today'), + clear: App.i18n.translateInline('clear') + currentDate = undefined + if attribute.value + startDate = new Date(attribute.value) + item.find('.js-datepicker').datepicker( + autoclose: true + todayBtn: 'linked' + todayHighlight: true + #startDate: startDate + format: App.i18n.timeFormat().date + container: item + language: 'custom' ) + + # set initial date time + @setNewTimeInitial(item, attribute) + + # observer changes item.find('input').bind('keyup blur focus change', (e) => @setNewTime(item, attribute, 0) @validation(item, attribute, true) @@ -59,64 +43,42 @@ class App.UiElement.date item.bind('validate', (e) => @validation(item, attribute) ) - #setShadowTimestamp() - @setNewTime(item, attribute, 0) item - @format: (number) -> - if number isnt '' && Number(number) < 10 - number = "0#{Number(number)}" - number + @setNewTime: (item, attribute, tolerant = false) -> - @setNewTime: (item, attribute, diff, reset = false, tolerant = false) -> - - resetTimeToToday = => - time = new Date() - time.setMinutes( time.getMinutes() + diff ) - @setParams(item, attribute, time) - - return resetTimeToToday() if reset - - params = @getParams(item) - if params.year is '' && params.month is '' && params.day is '' - return if !tolerant - resetTimeToToday() - params = @getParams(item) - - time = new Date( Date.parse( "#{params.year}-#{@format(params.month)}-#{@format(params.day)}T00:00:00Z" ) ) - time.setMinutes( time.getMinutes() + diff ) - return if !time - @setParams(item, attribute, time) - - @setShadowTimestamp: (item, attribute, time) -> - timestamp = '' - if time - timestamp = time.toISOString().replace(/T\d\d:\d\d:\d\d\.\d\d\dZ$/, '') - item.find("[name=\"#{attribute.name}\"]").val(timestamp) - - @setParams: (item, attribute, time) -> - App.Log.debug 'UiElement.date.setParams', time.toString() - - if time.toString() is 'Invalid Date' - @setShadowTimestamp(item, attribute) + datetime = item.find('.js-datepicker').datepicker('getDate') + if !datetime || datetime.toString() is 'Invalid Date' + App.Log.debug 'UiElement.date.setNewTime', datetime + item.find("[name=\"#{attribute.name}\"]").val('') return - day = time.getDate() - month = time.getMonth()+1 - year = time.getFullYear() - item.find('[data-item=day]').val(day) - item.find('[data-item=month]').val(month) - item.find('[data-item=year]').val(year) - @setShadowTimestamp(item, attribute, time) + App.Log.debug 'UiElement.date.setNewTime', datetime + year = datetime.getFullYear() + month = datetime.getMonth() + 1 + day = datetime.getDate() + date = "#{App.Utils.formatTime(year)}-#{App.Utils.formatTime(month,2)}-#{App.Utils.formatTime(day,2)}" - @getParams: (item) -> - params = {} - params.day = item.find('[data-item=day]').val().trim() - params.month = item.find('[data-item=month]').val().trim() - params.year = item.find('[data-item=year]').val().trim() - App.Log.debug 'UiElement.date.getParams', params - params + if date is '' + item.find("[name=\"#{attribute.name}\"]").val('') + return + + App.Log.debug 'UiElement.date.setNewTime', date + item.find("[name=\"#{attribute.name}\"]").val(date) + + @setNewTimeInitial: (item, attribute) -> + App.Log.debug 'UiElement.date.setNewTimeInitial', timestamp + timestamp = item.find("[name=\"#{attribute.name}\"]").val() + return if !timestamp + + timeObject = new Date( Date.parse( timestamp ) ) + + hour = timeObject.getHours() + minute = timeObject.getMinutes() + + App.Log.debug 'UiElement.date.setNewTimeInitial', timestamp, timeObject + item.find('.js-datepicker').datepicker('setUTCDate', timeObject) @validation: (item, attribute, runtime) -> @@ -126,57 +88,21 @@ class App.UiElement.date item.find('.help-inline').html('') item.closest('.form-group').find('.help-inline').html('') - params = @getParams(item) + timestamp = item.find("[name=\"#{attribute.name}\"]").val() # check required attributes errors = {} - if !runtime && !attribute.null - if params.day is '' - errors.day = 'missing' - if params.month is '' - errors.month = 'missing' - if params.year is '' - errors.year = 'missing' - - # ranges - if params.day - daysInMonth = 31 - if params.month && params.year - daysInMonth = new Date(params.year, params.month, 0).getDate() - - if isNaN( Number(params.day) ) - errors.day = 'invalid' - else if Number(params.day) > daysInMonth || Number(params.day) < 1 - errors.day = 'invalid' - - if params.month - if isNaN( Number(params.month) ) - errors.month = 'invalid' - else if Number(params.month) > 12 || Number(params.month) < 1 - errors.month = 'invalid' - - if params.year - if isNaN( Number(params.year) ) - errors.year = 'invalid' - else if Number(params.year) > 2200 || Number(params.year) < 2001 - errors.year = 'invalid' + if !timestamp + if !attribute.null + errors[attribute.name] = 'missing' + else + timeObject = new Date( Date.parse( timestamp ) ) - #formGroup = item.closest('.form-group') - formGroup = item + formGroup = item.closest('.form-group') App.Log.debug 'UiElement.date.validation', errors - if !_.isEmpty(errors) + return if _.isEmpty(errors) - # if field is required, if not do not show error - if params.year is '' && params.day is '' && params.month is '' - return if attribute.null - item.closest('.form-group').addClass('has-error') - item.closest('.form-group').find('.help-inline').text( 'is required' ) - return - - # show invalid options - for key, value of errors - formGroup.addClass('has-error') - formGroup.find("[data-item=#{key}]").addClass('has-error') - - return + # show invalid options + for key, value of errors + formGroup.addClass('has-error') diff --git a/app/assets/javascripts/app/controllers/_ui_element/datetime.coffee b/app/assets/javascripts/app/controllers/_ui_element/datetime.coffee index ec3619cb2..e38f2217d 100644 --- a/app/assets/javascripts/app/controllers/_ui_element/datetime.coffee +++ b/app/assets/javascripts/app/controllers/_ui_element/datetime.coffee @@ -6,66 +6,39 @@ class App.UiElement.datetime attribute.nameRaw = attribute.name attribute.name = "{datetime}#{attribute.name}" - # get time object - if attribute.value - if typeof attribute.value is 'string' - time = new Date( Date.parse( attribute.value ) ) - else - time = new Date( attribute.value ) - - # time items - year = time.getFullYear() - month = time.getMonth() + 1 - day = time.getDate() - hour = time.getHours() - minute = time.getMinutes() - - # create element item = $( App.view('generic/datetime')( attribute: attribute - year: year - month: month - day: day - hour: hour - minute: minute ) ) - # start bindings - item.find('.js-today').bind('click', (e) => - e.preventDefault() - @setNewTime(item, attribute, 0, true) - @validation(item, attribute) - ) - item.find('.js-plus-hour').bind('click', (e) => - e.preventDefault() - @setNewTime(item, attribute, 60, false, true) - @validation(item, attribute) - ) - item.find('.js-minus-hour').bind('click', (e) => - e.preventDefault() - @setNewTime(item, attribute, -60, false, true) - @validation(item, attribute) - ) - item.find('.js-plus-day').bind('click', (e) => - e.preventDefault() - @setNewTime(item, attribute, 60 * 24, false, true) - @validation(item, attribute) - ) - item.find('.js-minus-day').bind('click', (e) => - e.preventDefault() - @setNewTime(item, attribute, -60 * 24, false, true) - @validation(item, attribute) - ) - item.find('.js-plus-week').bind('click', (e) => - e.preventDefault() - @setNewTime(item, attribute, 60 * 24 * 7, false, true) - @validation(item, attribute) - ) - item.find('.js-minus-week').bind('click', (e) => - e.preventDefault() - @setNewTime(item, attribute, -60 * 24 * 7, false, true) - @validation(item, attribute) + # apply date widgets + $.fn.datepicker.dates['custom'] = + days: [App.i18n.translateInline('Sunday'), App.i18n.translateInline('Monday'), App.i18n.translateInline('Tuesday'), App.i18n.translateInline('Wednesday'), App.i18n.translateInline('Thursday'), App.i18n.translateInline('Friday'), App.i18n.translateInline('Saturday'), App.i18n.translateInline('Sunday')], + daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], + daysMin: [App.i18n.translateInline('Su'), App.i18n.translateInline('Mo'), App.i18n.translateInline('Tu'), App.i18n.translateInline('We'), App.i18n.translateInline('Th'), App.i18n.translateInline('Fr'), App.i18n.translateInline('Sa'), App.i18n.translateInline('Su')], + months: [App.i18n.translateInline('January'), App.i18n.translateInline('February'), App.i18n.translateInline('March'), App.i18n.translateInline('April'), App.i18n.translateInline('May'), App.i18n.translateInline('June'), App.i18n.translateInline('July'), App.i18n.translateInline('August'), App.i18n.translateInline('September'), App.i18n.translateInline('October'), App.i18n.translateInline('November'), App.i18n.translateInline('December')], + monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], + today: App.i18n.translateInline('today'), + clear: App.i18n.translateInline('clear') + currentDate = undefined + if attribute.value + startDate = new Date(attribute.value) + item.find('.js-datepicker').datepicker( + autoclose: true + todayBtn: 'linked' + todayHighlight: true + #startDate: startDate + format: App.i18n.timeFormat().date + container: item + language: 'custom' ) + + # set initial date time + @setNewTimeInitial(item, attribute) + + # apply time widgets + item.find('.js-timepicker').timepicker() + + # observer changes item.find('input').bind('keyup blur focus change', (e) => @setNewTime(item, attribute, 0) @validation(item, attribute, true) @@ -73,70 +46,51 @@ class App.UiElement.datetime item.bind('validate', (e) => @validation(item, attribute) ) - #setShadowTimestamp() - @setNewTime(item, attribute, 0) item - @format: (number) -> - if number isnt '' && Number(number) < 10 - number = "0#{Number(number)}" - number + @setNewTime: (item, attribute, tolerant = false) -> - @setNewTime: (item, attribute, diff, reset = false, tolerant = false) -> - - resetTimeToToday = => - time = new Date() - time.setMinutes( time.getMinutes() + diff ) - @setParams(item, attribute, time) - - return resetTimeToToday() if reset - - params = @getParams(item) - if params.year is '' && params.month is '' && params.day is '' && params.hour is '' && params.minute is '' - return if !tolerant - resetTimeToToday() - params = @getParams(item) - - time = new Date( Date.parse( "#{params.year}-#{@format(params.month)}-#{@format(params.day)}T#{@format(params.hour)}:#{@format(params.minute)}:00Z" ) ) - time.setMinutes( time.getMinutes() + diff + time.getTimezoneOffset() ) - return if !time - @setParams(item, attribute, time) - - @setShadowTimestamp: (item, attribute, time) -> - timestamp = '' - if time - timestamp = time.toISOString().replace(/\d\d\.\d\d\dZ$/, '00.000Z') - item.find("[name=\"#{attribute.name}\"]").val(timestamp) - - @setParams: (item, attribute, time) -> - App.Log.debug 'UiElement.datetime.setParams', time.toString() - - if time.toString() is 'Invalid Date' - @setShadowTimestamp(item, attribute) + datetime = item.find('.js-datepicker').datepicker('getDate') + if !datetime || datetime.toString() is 'Invalid Date' + App.Log.debug 'UiElement.datetime.setNewTime', datetime + item.find("[name=\"#{attribute.name}\"]").val('') return - day = time.getDate() - month = time.getMonth()+1 - year = time.getFullYear() - hour = time.getHours() - minute = time.getMinutes() - item.find('[data-item=day]').val(day) - item.find('[data-item=month]').val(month) - item.find('[data-item=year]').val(year) - item.find('[data-item=hour]').val(hour) - item.find('[data-item=minute]').val(minute) - @setShadowTimestamp(item, attribute, time) + App.Log.debug 'UiElement.datetime.setNewTime', datetime + year = datetime.getFullYear() + month = datetime.getMonth() + 1 + day = datetime.getDate() + date = "#{App.Utils.formatTime(year)}-#{App.Utils.formatTime(month,2)}-#{App.Utils.formatTime(day,2)}" + time = item.find('.js-timepicker').val() - @getParams: (item) -> - params = {} - params.day = item.find('[data-item=day]').val().trim() - params.month = item.find('[data-item=month]').val().trim() - params.year = item.find('[data-item=year]').val().trim() - params.hour = item.find('[data-item=hour]').val().trim() - params.minute = item.find('[data-item=minute]').val().trim() - App.Log.debug 'UiElement.datetime.getParams', params - params + if date is '' || time is '' + item.find("[name=\"#{attribute.name}\"]").val('') + return + + timestamp = "#{date}T#{time}:00.000Z" + time = new Date( Date.parse(timestamp) ) + time.setMinutes( time.getMinutes() + time.getTimezoneOffset() ) + App.Log.debug 'UiElement.datetime.setNewTime', time.toString() + timestamp = time.toISOString().replace(/\d\d\.\d\d\dZ$/, '00.000Z') + item.find("[name=\"#{attribute.name}\"]").val(timestamp) + + @setNewTimeInitial: (item, attribute) -> + App.Log.debug 'UiElement.datetime.setNewTimeInitial', timestamp + timestamp = item.find("[name=\"#{attribute.name}\"]").val() + if !timestamp + item.find('.js-timepicker').val('08:00') + return + + timeObject = new Date( Date.parse( timestamp ) ) + + hour = timeObject.getHours() + minute = timeObject.getMinutes() + time = "#{App.Utils.formatTime(hour,2)}:#{App.Utils.formatTime(minute,2)}" + + App.Log.debug 'UiElement.datetime.setNewTimeInitial', timestamp, timeObject + item.find('.js-datepicker').datepicker('setUTCDate', timeObject) + item.find('.js-timepicker').val(time) @validation: (item, attribute, runtime) -> @@ -146,72 +100,21 @@ class App.UiElement.datetime item.find('.help-inline').html('') item.closest('.form-group').find('.help-inline').html('') - params = @getParams(item) + timestamp = item.find("[name=\"#{attribute.name}\"]").val() # check required attributes errors = {} - if !runtime && !attribute.null - if params.day is '' - errors.day = 'missing' - if params.month is '' - errors.month = 'missing' - if params.year is '' - errors.year = 'missing' - if params.hour is '' - errors.hour = 'missing' - if params.minute is '' - errors.minute = 'missing' + if !timestamp + if !attribute.null + errors[attribute.name] = 'missing' + else + timeObject = new Date( Date.parse( timestamp ) ) - # ranges - if params.day - daysInMonth = 31 - if params.month && params.year - daysInMonth = new Date(params.year, params.month, 0).getDate() - if isNaN( Number(params.day) ) - errors.day = 'invalid' - else if Number(params.day) > daysInMonth || Number(params.day) < 1 - errors.day = 'invalid' - - if params.month - if isNaN( Number(params.month) ) - errors.month = 'invalid' - else if Number(params.month) > 12 || Number(params.month) < 1 - errors.month = 'invalid' - - if params.year - if isNaN( Number(params.year) ) - errors.year = 'invalid' - else if Number(params.year) > 2200 || Number(params.year) < 2001 - errors.year = 'invalid' - - if params.hour - if isNaN( Number(params.hour) ) - errors.hour = 'invalid' - else if parseInt(params.hour) > 23 || parseInt(params.hour) < 0 - errors.hour = 'invalid' - - if params.minute - if isNaN( Number(params.minute) ) - errors.minute = 'invalid' - else if Number(params.minute) > 59 - errors.minute = 'invalid' - - #formGroup = item.closest('.form-group') - formGroup = item + formGroup = item.closest('.form-group') App.Log.debug 'UiElement.datetime.validation', errors - if !_.isEmpty(errors) + return if _.isEmpty(errors) - # if field is required, if not do not show error - if params.year is '' && params.day is '' && params.month is '' && params.hour is '' && params.minute is '' - return if attribute.null - item.closest('.form-group').addClass('has-error') - item.closest('.form-group').find('.help-inline').text( 'is required' ) - return - - # show invalid options - for key, value of errors - formGroup.addClass('has-error') - formGroup.find("[data-item=#{key}]").addClass('has-error') - - return + # show invalid options + for key, value of errors + formGroup.addClass('has-error') diff --git a/app/assets/javascripts/app/views/generic/date.jst.eco b/app/assets/javascripts/app/views/generic/date.jst.eco index 63471172b..1f2c7f2bf 100644 --- a/app/assets/javascripts/app/views/generic/date.jst.eco +++ b/app/assets/javascripts/app/views/generic/date.jst.eco @@ -1,15 +1,4 @@ -
- - - . - - . - -
-<% if !@attribute.disable_feature: %> - - <%- @T('today') %> | - -1 +1 <%- @T('day') %> | - -7 +7 <%- @T('days') %> - -<% end %> \ No newline at end of file +
+ + +
\ No newline at end of file diff --git a/app/assets/javascripts/app/views/generic/datetime.jst.eco b/app/assets/javascripts/app/views/generic/datetime.jst.eco index efa1686d4..2f62c75a7 100644 --- a/app/assets/javascripts/app/views/generic/datetime.jst.eco +++ b/app/assets/javascripts/app/views/generic/datetime.jst.eco @@ -1,19 +1,6 @@ -
- - - . - - . - - - : - -
-<% if !@attribute.disable_feature: %> - - <%- @T('now') %> | - -1 +1 <%- @T('hour') %> | - -1 +1 <%- @T('day') %> | - -7 +7 <%- @T('days') %> - -<% end %> \ No newline at end of file +
+ + +
<%- @T('at') %>
+ +
\ No newline at end of file diff --git a/app/assets/javascripts/app/views/layout_ref/inputs.jst.eco b/app/assets/javascripts/app/views/layout_ref/inputs.jst.eco index 1c9804267..0af7de2b5 100644 --- a/app/assets/javascripts/app/views/layout_ref/inputs.jst.eco +++ b/app/assets/javascripts/app/views/layout_ref/inputs.jst.eco @@ -12,14 +12,14 @@

A date

- +

A date time

-
-
- +
+
+
at
diff --git a/public/assets/tests/form-validation.js b/public/assets/tests/form-validation.js index 71f6c7aa9..71a0bf365 100644 --- a/public/assets/tests/form-validation.js +++ b/public/assets/tests/form-validation.js @@ -127,11 +127,10 @@ test( 'datetime validation check', function() { //equal( el.find('[data-name="datetime1"]').closest('.form-group').find('.help-inline').text(), '', 'check datetime1 error message') // set new values - el.find('[data-name="datetime1"] [data-item="day"]').val(1).trigger('blur') - el.find('[data-name="datetime1"] [data-item="month"]').val(1).trigger('blur') - el.find('[data-name="datetime1"] [data-item="year"]').val(2015).trigger('blur') - el.find('[data-name="datetime1"] [data-item="hour"]').val(12).trigger('blur') - el.find('[data-name="datetime1"] [data-item="minute"]').val(42).trigger('blur') + el.find('[data-name="datetime1"] [data-item="date"]').val('01/01/2015').trigger('blur') + el.find('[data-name="datetime1"] [data-item="date"]').datepicker('setDate') + el.find('[data-name="datetime1"] [data-item="time"]').val('12:42').trigger('blur') + el.find('[data-name="datetime1"] [data-item="time"]').trigger('change') // check params timeStamp = new Date( Date.parse('2015-01-01T12:42:00.000Z') ) @@ -151,16 +150,12 @@ test( 'datetime validation check', function() { equal( el.find('[data-name="datetime1"]').closest('.form-group').hasClass('has-error'), false, 'check datetime1 has-error') equal( el.find('[data-name="datetime1"]').closest('.form-group').find('.help-inline').text(), '', 'check datetime1 error message') - el.find('[data-name="datetime1"] [data-item="day"]').val('47').trigger('blur') - deepEqual( el.find('[data-name="datetime1"] [data-item="day"]').hasClass('has-error'), true ) - el.find('[data-name="datetime1"] [data-item="month"]').val('1').trigger('blur') - deepEqual( el.find('[data-name="datetime1"] [data-item="month"]').hasClass('has-error'), false ) - el.find('[data-name="datetime1"] [data-item="year"]').val('2015').trigger('blur') - deepEqual( el.find('[data-name="datetime1"] [data-item="year"]').hasClass('has-error'), false ) - el.find('[data-name="datetime1"] [data-item="hour"]').val('12').trigger('blur') - deepEqual( el.find('[data-name="datetime1"] [data-item="hour"]').hasClass('has-error'), false ) - el.find('[data-name="datetime1"] [data-item="minute"]').val('42').trigger('blur') - deepEqual( el.find('[data-name="datetime1"] [data-item="minute"]').hasClass('has-error'), false ) + el.find('[data-name="datetime1"] [data-item="date"]').val('').trigger('blur') + el.find('[data-name="datetime1"] [data-item="date"]').datepicker('setDate') + el.find('[data-name="datetime1"] [data-item="time"]').val('12:42').trigger('blur') + el.find('[data-name="datetime1"] [data-item="time"]').trigger('change') + + equal( el.find('[data-name="datetime1"]').closest('.form-group').hasClass('has-error'), true ) params = App.ControllerForm.params( el ) errors = form.validate(params) @@ -169,10 +164,9 @@ test( 'datetime validation check', function() { } deepEqual( errors, test_errors, 'validation errors check' ) App.ControllerForm.validate( { errors: errors, form: el } ) - equal( el.find('[data-name="datetime1"]').closest('.form-group').hasClass('has-error'), false, 'check datetime1 no has-error') - equal( el.find('[data-name="datetime1"] [data-item="day"]').hasClass('has-error'), true, 'check datetime1 no has-error') - equal( el.find('[data-name="datetime1"] [data-item="month"]').hasClass('has-error'), false, 'check datetime1 no has-error') - equal( el.find('[data-name="datetime1"]').closest('.form-group').find('.help-inline').text(), '', 'check datetime1 error message') + + equal( el.find('[data-name="datetime1"]').closest('.form-group').hasClass('has-error'), true, 'check datetime1 no has-error') + equal( el.find('[data-name="datetime1"]').closest('.form-group').find('.help-inline').text(), 'is required', 'check datetime1 error message') }); @@ -186,7 +180,7 @@ test( 'date validation check', function() { el: el, model: { configure_attributes: [ - { name: 'date1', display: 'Date1', tag: 'date', null: false, default: defaults['time1'] }, + { name: 'date2', display: 'Date2', tag: 'date', null: false, default: defaults['time1'] }, ], }, params: defaults, @@ -197,29 +191,29 @@ test( 'date validation check', function() { // check params params = App.ControllerForm.params( el ) test_params = { - date1: undefined, + date2: undefined, } deepEqual( params, test_params, 'params check' ) errors = form.validate(params) test_errors = { - date1: 'is required', + date2: 'is required', } deepEqual( errors, test_errors, 'validation errors check' ) App.ControllerForm.validate( { errors: errors, form: el } ) - equal( el.find('[data-name="date1"]').closest('.form-group').hasClass('has-error'), true, 'check date1 has-error') - equal( el.find('[data-name="date1"]').closest('.form-group').find('.help-inline').text(), 'is required', 'check date1 error message') + equal( el.find('[data-name="date2"]').closest('.form-group').hasClass('has-error'), true, 'check date2 has-error') + equal( el.find('[data-name="date2"]').closest('.form-group').find('.help-inline').text(), 'is required', 'check date2 error message') // set new values - el.find('[data-name="date1"] [data-item="day"]').val('1').trigger('blur') - el.find('[data-name="date1"] [data-item="month"]').val('1').trigger('blur') - el.find('[data-name="date1"] [data-item="year"]').val('2015').trigger('blur') + el.find('[data-name="date2"] [data-item="date"]').val('01/01/2015').trigger('blur') + el.find('[data-name="date2"] [data-item="date"]').datepicker('setDate') + el.find('[data-name="date2"] [data-item="date"]').trigger('change') // check params params = App.ControllerForm.params( el ) test_params = { - date1: '2015-01-01', + date2: '2015-01-01', } deepEqual( params, test_params, 'params check' ) @@ -228,37 +222,32 @@ test( 'date validation check', function() { test_errors = undefined deepEqual( errors, test_errors, 'validation errors check' ) App.ControllerForm.validate( { errors: errors, form: el } ) - equal( el.find('[data-name="date1"]').closest('.form-group').hasClass('has-error'), false, 'check date1 has-error') - equal( el.find('[data-name="date1"]').closest('.form-group').find('.help-inline').text(), '', 'check date1 error message') + equal( el.find('[data-name="date2"]').closest('.form-group').hasClass('has-error'), false, 'check date1 has-error') + equal( el.find('[data-name="date2"]').closest('.form-group').find('.help-inline').text(), '', 'check date1 error message') // set invalid values - el.find('[data-name="date1"] [data-item="day"]').val('47').trigger('blur') - deepEqual( el.find('[data-name="date1"] [data-item="day"]').hasClass('has-error'), true ) - el.find('[data-name="date1"] [data-item="month"]').val('1').trigger('blur') - deepEqual( el.find('[data-name="date1"] [data-item="month"]').hasClass('has-error'), false ) - el.find('[data-name="date1"] [data-item="year"]').val('2015').trigger('blur') - deepEqual( el.find('[data-name="date1"] [data-item="year"]').hasClass('has-error'), false ) + el.find('[data-name="date2"] [data-item="date"]').val('').trigger('blur') + el.find('[data-name="date2"] [data-item="date"]').datepicker('setDate') + el.find('[data-name="date2"] [data-item="date"]').trigger('change') + equal( el.find('[data-name="date2"]').closest('.form-group').hasClass('has-error'), true, 'check date2 has-error') // check params params = App.ControllerForm.params( el ) test_params = { - date1: undefined, + date2: undefined, } deepEqual( params, test_params, 'params check' ) // check errors errors = form.validate(params) test_errors = { - date1: 'is required', + date2: 'is required', } deepEqual( errors, test_errors, 'validation errors check' ) App.ControllerForm.validate( { errors: errors, form: el } ) - equal( el.find('[data-name="date1"]').closest('.form-group').hasClass('has-error'), false, 'check date1 no has-error') - equal( el.find('[data-name="date1"] [data-item="day"]').hasClass('has-error'), true, 'check date1 no has-error') - equal( el.find('[data-name="date1"] [data-item="month"]').hasClass('has-error'), false, 'check date1 no has-error') - equal( el.find('[data-name="date1"]').closest('.form-group').find('.help-inline').text(), '', 'check date1 error message') - + equal( el.find('[data-name="date2"]').closest('.form-group').hasClass('has-error'), true, 'check date2 has-error') + equal( el.find('[data-name="date2"]').closest('.form-group').find('.help-inline').text(), 'is required', 'check date2 error message') }); test( "datetime selector check", function() { @@ -284,10 +273,12 @@ test( "datetime selector check", function() { } deepEqual( params, test_params, 'params check' ) - el.find('.js-today').click() + timeStamp = new Date() + + el.find('.js-datepicker').datepicker('setDate', timeStamp) + el.find('.js-datepicker').trigger('blur') // check params - timeStamp = new Date() currentTime = timeStamp.toISOString() currentTime = currentTime.replace(/(\d\d\.\d\d\dZ)$/, '00.000Z') params = App.ControllerForm.params( el ) @@ -308,7 +299,7 @@ test( "date selector check", function() { el: el, model: { configure_attributes: [ - { name: 'date1', display: 'Datet1', tag: 'date', null: false, default: defaults['date1'] }, + { name: 'date3', display: 'Datet1', tag: 'date', null: false, default: defaults['date3'] }, ], }, params: defaults, @@ -317,11 +308,14 @@ test( "date selector check", function() { // check params params = App.ControllerForm.params( el ) test_params = { - date1: undefined, + date3: undefined, } deepEqual( params, test_params, 'params check' ) - el.find('.js-today').click() + timeStamp = new Date() + + el.find('.js-datepicker').datepicker('setDate', timeStamp) + el.find('.js-datepicker').trigger('blur') // check params format = function (number) { @@ -331,11 +325,10 @@ test( "date selector check", function() { return number } - timeStamp = new Date() currentTime = timeStamp.getFullYear() + '-' + format(timeStamp.getMonth()+1) + '-' + format(timeStamp.getDate()) params = App.ControllerForm.params( el ) test_params = { - date1: currentTime, + date3: currentTime, } deepEqual( params, test_params, 'params check' ) From f510b1441f2a0d2f0d75395e81cf6befc282a597 Mon Sep 17 00:00:00 2001 From: Martin Edenhofer Date: Wed, 7 Oct 2015 07:35:56 +0200 Subject: [PATCH 05/11] Disabled test menu entries per default. --- .../javascripts/app/controllers/_default_navbar.coffee | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/app/controllers/_default_navbar.coffee b/app/assets/javascripts/app/controllers/_default_navbar.coffee index df8a05fe9..9f9f77e62 100644 --- a/app/assets/javascripts/app/controllers/_default_navbar.coffee +++ b/app/assets/javascripts/app/controllers/_default_navbar.coffee @@ -15,5 +15,6 @@ App.Config.set( 'Admin', { prio: 9000, parent: '', name: 'Admin', translate: tru App.Config.set( 'New', { prio: 20000, parent: '', name: 'New', translate: true, target: '#new', class: 'add' }, 'NavBarRight' ) App.Config.set( 'Misc', { prio: 90000, parent: '', name: 'Tools', translate: true, target: '#tools', child: true, class: 'tools' }, 'NavBar' ) -App.Config.set( 'Misc1', { prio: 1600, parent: '#tools', name: 'Test 1', target: '#test1', role: [ 'Admin' ] }, 'NavBar' ) -App.Config.set( 'Misc2', { prio: 1700, parent: '#tools', name: 'Test 2', target: '#test2', role: [ 'Admin' ] }, 'NavBar' ) +# only for testing +#App.Config.set( 'Misc1', { prio: 1600, parent: '#tools', name: 'Test 1', target: '#test1', role: [ 'Admin' ] }, 'NavBar' ) +#App.Config.set( 'Misc2', { prio: 1700, parent: '#tools', name: 'Test 2', target: '#test2', role: [ 'Admin' ] }, 'NavBar' ) From 0bec67ec73e759188d8ff38862b8eba7e3f5554b Mon Sep 17 00:00:00 2001 From: Martin Edenhofer Date: Wed, 7 Oct 2015 07:37:53 +0200 Subject: [PATCH 06/11] Only use rw attributes for setting values. --- .../controllers/_ui_element/ticket_perform_action.coffee | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/app/controllers/_ui_element/ticket_perform_action.coffee b/app/assets/javascripts/app/controllers/_ui_element/ticket_perform_action.coffee index 13fa61550..3d4f54140 100644 --- a/app/assets/javascripts/app/controllers/_ui_element/ticket_perform_action.coffee +++ b/app/assets/javascripts/app/controllers/_ui_element/ticket_perform_action.coffee @@ -15,8 +15,11 @@ class App.UiElement.ticket_perform_action # ignore passwords and relations if row.type isnt 'password' && row.name.substr(row.name.length-4,4) isnt '_ids' - config = _.clone(row) - elements["#{groupKey}.#{config.name}"] = config + + # ignore readonly attributes + if !row.readonly + config = _.clone(row) + elements["#{groupKey}.#{config.name}"] = config [defaults, groups, elements] From 4a6d05e3429c212de3395822e49cf6e9ce9871d6 Mon Sep 17 00:00:00 2001 From: Martin Edenhofer Date: Wed, 7 Oct 2015 07:38:26 +0200 Subject: [PATCH 07/11] Removed overhead. --- app/assets/javascripts/app/models/postmaster_filter.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/app/models/postmaster_filter.coffee b/app/assets/javascripts/app/models/postmaster_filter.coffee index 36a88110b..30c2fa5b3 100644 --- a/app/assets/javascripts/app/models/postmaster_filter.coffee +++ b/app/assets/javascripts/app/models/postmaster_filter.coffee @@ -8,7 +8,7 @@ class App.PostmasterFilter extends App.Model { name: 'channel', display: 'Channel', type: 'input', readonly: 1 }, { name: 'match', display: 'Match all of the following', tag: 'postmaster_match' }, { name: 'perform', display: 'Perform action of the following', tag: 'postmaster_set' }, - { name: 'note', display: 'Note', tag: 'textarea', note: 'Notes are visible to agents only, never to customers.', limit: 250, null: true }, + { name: 'note', display: 'Note', tag: 'textarea', limit: 250, null: true }, { name: 'updated_at', display: 'Updated', tag: 'datetime', readonly: 1 }, { name: 'active', display: 'Active', tag: 'active', default: true }, { name: 'created_by_id', display: 'Created by', relation: 'User', readonly: 1 }, From f78b32639f10b98e8e1500876c14c3c2687e545b Mon Sep 17 00:00:00 2001 From: Martin Edenhofer Date: Wed, 7 Oct 2015 07:38:55 +0200 Subject: [PATCH 08/11] Only use rw attributes for setting values. --- .../javascripts/app/models/ticket.coffee | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/app/assets/javascripts/app/models/ticket.coffee b/app/assets/javascripts/app/models/ticket.coffee index ad27f02db..070a4d284 100644 --- a/app/assets/javascripts/app/models/ticket.coffee +++ b/app/assets/javascripts/app/models/ticket.coffee @@ -3,22 +3,22 @@ class App.Ticket extends App.Model @extend Spine.Model.Ajax @url: @apiPath + '/tickets' @configure_attributes = [ - { name: 'number', display: '#', tag: 'input', type: 'text', limit: 100, null: true, read_only: true, style: 'width: 68px' }, + { name: 'number', display: '#', tag: 'input', type: 'text', limit: 100, null: true, readonly: 1, style: 'width: 68px' }, { name: 'title', display: 'Title', tag: 'input', type: 'text', limit: 100, null: false }, { name: 'customer_id', display: 'Customer', tag: 'input', type: 'text', limit: 100, null: false, autocapitalize: false, relation: 'User' }, - { name: 'organization_id', display: 'Organization', tag: 'select', relation: 'Organization', tagreadonly: 1 }, + { name: 'organization_id', display: 'Organization', tag: 'select', relation: 'Organization', readonly: 1 }, { name: 'group_id', display: 'Group', tag: 'select', multiple: false, limit: 100, null: false, relation: 'Group', style: 'width: 10%', edit: true }, { name: 'owner_id', display: 'Owner', tag: 'select', multiple: false, limit: 100, null: true, relation: 'User', style: 'width: 12%', edit: true }, { name: 'state_id', display: 'State', tag: 'select', multiple: false, null: false, relation: 'TicketState', default: 'new', style: 'width: 12%', edit: true, customer: true }, { name: 'pending_time', display: 'Pending Time', tag: 'datetime', null: true, style: 'width: 130px' }, { name: 'priority_id', display: 'Priority', tag: 'select', multiple: false, null: false, relation: 'TicketPriority', default: '2 normal', style: 'width: 12%', edit: true, customer: true }, - { name: 'article_count', display: 'Article#', style: 'width: 12%' }, - { name: 'escalation_time', display: 'Escalation', tag: 'datetime', null: true, style: 'width: 130px', class: 'escalation' }, - { name: 'last_contact', display: 'Last contact', tag: 'datetime', null: true, style: 'width: 130px' }, - { name: 'last_contact_agent', display: 'Last contact (Agent)', tag: 'datetime', null: true, style: 'width: 130px' }, - { name: 'last_contact_customer', display: 'Last contact (Customer)', tag: 'datetime', null: true, style: 'width: 130px' }, - { name: 'first_response', display: 'First response', tag: 'datetime', null: true, style: 'width: 130px' }, - { name: 'close_time', display: 'Close time', tag: 'datetime', null: true, style: 'width: 130px' }, + { name: 'article_count', display: 'Article#', readonly: 1, style: 'width: 12%' }, + { name: 'escalation_time', display: 'Escalation', tag: 'datetime', null: true, readonly: 1, style: 'width: 130px', class: 'escalation' }, + { name: 'last_contact', display: 'Last contact', tag: 'datetime', null: true, readonly: 1, style: 'width: 130px' }, + { name: 'last_contact_agent', display: 'Last contact (Agent)', tag: 'datetime', null: true, readonly: 1, style: 'width: 130px' }, + { name: 'last_contact_customer', display: 'Last contact (Customer)', tag: 'datetime', null: true, readonly: 1, style: 'width: 130px' }, + { name: 'first_response', display: 'First response', tag: 'datetime', null: true, readonly: 1, style: 'width: 130px' }, + { name: 'close_time', display: 'Close time', tag: 'datetime', null: true, readonly: 1, style: 'width: 130px' }, { name: 'created_by_id', display: 'Created by', relation: 'User', readonly: 1 }, { name: 'created_at', display: 'Created at', tag: 'datetime', style: 'width: 130px', readonly: 1 }, { name: 'updated_by_id', display: 'Updated by', relation: 'User', readonly: 1 }, From e9da83bf4d9117f9dd9c79818dca374f7c863bc8 Mon Sep 17 00:00:00 2001 From: Martin Edenhofer Date: Wed, 7 Oct 2015 07:39:58 +0200 Subject: [PATCH 09/11] Improved code layout. --- .../browser/agent_ticket_overview_level1_test.rb | 16 ++++++++-------- test/browser_test_helper.rb | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/test/browser/agent_ticket_overview_level1_test.rb b/test/browser/agent_ticket_overview_level1_test.rb index 0de014fcc..e6c31d4bb 100644 --- a/test/browser/agent_ticket_overview_level1_test.rb +++ b/test/browser/agent_ticket_overview_level1_test.rb @@ -28,24 +28,24 @@ class AgentTicketOverviewLevel1Test < TestCase overview_create( browser: browser1, data: { - :name => name1, - :role => 'Agent', - :selector => { + name: name1, + role: 'Agent', + selector: { 'Priority' => '1 low', }, - :prio => 1000, + prio: 1000, 'order::direction' => 'down', } ) overview_create( browser: browser1, data: { - :name => name2, - :role => 'Agent', - :selector => { + name: name2, + role: 'Agent', + selector: { 'Priority' => '3 high', }, - :prio => 1001, + prio: 1001, 'order::direction' => 'down', } ) diff --git a/test/browser_test_helper.rb b/test/browser_test_helper.rb index 1ae05655a..9ab0c69cd 100644 --- a/test/browser_test_helper.rb +++ b/test/browser_test_helper.rb @@ -138,7 +138,7 @@ class TestCase < Test::Unit::TestCase end instance.find_elements( { css: '#login button' } )[0].click - sleep 4 + sleep 5 login = instance.find_elements( { css: '.user-menu .user a' } )[0].attribute('title') if login != params[:username] screenshot( browser: instance, comment: 'login_failed' ) From 7746e01734180c7cb0d24abc7c89fbfd186dedab Mon Sep 17 00:00:00 2001 From: Martin Edenhofer Date: Wed, 7 Oct 2015 07:40:17 +0200 Subject: [PATCH 10/11] Hide "more" per default. --- .../javascripts/app/views/ticket_zoom/article_view.jst.eco | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/app/views/ticket_zoom/article_view.jst.eco b/app/assets/javascripts/app/views/ticket_zoom/article_view.jst.eco index 61a1fb81c..80bf73eb6 100644 --- a/app/assets/javascripts/app/views/ticket_zoom/article_view.jst.eco +++ b/app/assets/javascripts/app/views/ticket_zoom/article_view.jst.eco @@ -42,7 +42,7 @@
<%- App.Utils.signatureIdentify( @article.html ) %> -
+
<%- @T('See more') %>
From 6f261af6e51aa33fad91251b447072bd614a53c5 Mon Sep 17 00:00:00 2001 From: Martin Edenhofer Date: Wed, 7 Oct 2015 08:10:10 +0200 Subject: [PATCH 11/11] Fixed unit test. --- public/assets/tests/form-validation.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/assets/tests/form-validation.js b/public/assets/tests/form-validation.js index 71a0bf365..6f3d5b840 100644 --- a/public/assets/tests/form-validation.js +++ b/public/assets/tests/form-validation.js @@ -280,7 +280,7 @@ test( "datetime selector check", function() { // check params currentTime = timeStamp.toISOString() - currentTime = currentTime.replace(/(\d\d\.\d\d\dZ)$/, '00.000Z') + currentTime = currentTime.replace(/(\d\d.\d\d.\d\d\.\d\d\dZ)$/, '07:00:00.000Z') params = App.ControllerForm.params( el ) test_params = { datetime1: currentTime,