diff --git a/app/assets/javascripts/repositories/renderers/columns/date_time_helper.js b/app/assets/javascripts/repositories/renderers/columns/date_time_helper.js index 7d5742eb0..894abe365 100644 --- a/app/assets/javascripts/repositories/renderers/columns/date_time_helper.js +++ b/app/assets/javascripts/repositories/renderers/columns/date_time_helper.js @@ -41,7 +41,67 @@ var DateTimeHelper = (function() { return `${y}/${m}/${d} ${hours}:${mins}`; } - function insertHiddenField($input, date, timeStr, format) { + function findSecondRangeInput($input) { + let $container = $input.parent().parent(); + let $secondInput; + if ($input.parent().hasClass('start-time')) { + $secondInput = $container.find('.end-time input').first(); + } else { + $secondInput = $container.find('.start-time input').first(); + } + return $secondInput; + } + + function replaceForRangeHiddenField($container) { + let startTimeContainer = $container.find('.start-time') + let endTimeContainer = $container.find('.end-time') + let startTime = startTimeContainer.find('input[type=hidden]').val(); + let endTime = endTimeContainer.find('input[type=hidden]').val(); + let formId = startTimeContainer.find('input[type!=hidden]').data('form-id'); + let columnId = startTimeContainer.find('input[type!=hidden]').data('column-id'); + let json = {}; + let hiddenField; + let value; + + json.start_time = startTime; + json.end_time = endTime; + + if (startTime && endTime) { + value = JSON.stringify(json); + } else { + value = ''; + } + + hiddenField = ` + `; + + $container.find('.cell-range-container').html(hiddenField); + startTimeContainer.find('.cell-timestamp-container').html(''); + endTimeContainer.find('.cell-timestamp-container').html(''); + } + + function insertHiddenField($input) { + let fieldType = $input.data('datetime-part') + let $container = $input.parent().find('.cell-timestamp-container'); + let dateStr = $container.data('current-date'); + let columnType = $container.data('datetime-type'); + let timeStr; + + if (fieldType === 'time') { + timeStr = $input.val(); + } else if (fieldType === 'date') { + timeStr = $input.parent().find('input[data-mask-type=time]').val(); + } + + if (columnType === 'time' && !isValidDate(dateStr)) { + // new time without value for date + dateStr = stringDateTimeFormat(new Date(), 'dateonly'); + } + let date = new Date(dateStr); + let formId = $input.data('form-id'); let columnId = $input.data('column-id'); let hiddenFieldContainer = $input.parent().find('.cell-timestamp-container'); @@ -52,9 +112,9 @@ var DateTimeHelper = (function() { if (!hasDate) { // Date needs to be presence value = ''; - } else if (format === 'time' && !hasTime) { // Delete time value + } else if (columnType === 'time' && !hasTime) { // Delete time value value = ''; - } else if (format === 'datetime' && !hasTime) { // Delete date time value + } else if (columnType === 'datetime' && !hasTime) { // Delete date time value value = ''; } else { // create date time format @@ -72,29 +132,36 @@ var DateTimeHelper = (function() { function initChangeEvents($cell) { $cell.find('input[data-mask-type=time]').on('change', function() { - let timeStr = $(this).val(); - let $container = $(this).parent().find('.cell-timestamp-container'); - let dateStr = $container.data('current-date'); - let columnType = $container.data('datetime-type'); - if (columnType === 'time' && !isValidDate(dateStr)) { - // new time without value for date - dateStr = stringDateTimeFormat(new Date(), 'dateonly'); - } + let $input = $(this); + insertHiddenField($input); - insertHiddenField($(this), new Date(dateStr), timeStr, columnType); + if ($input.parent('.range-type').length) { + let $secondInput = findSecondRangeInput($input); + + insertHiddenField($secondInput); + replaceForRangeHiddenField($input.parent().parent()); + } }); $cell.find('.calendar-input').on('dp.change', function(e) { + let $input = $(this) let date = e.date._d; - let timeStr = $(this).parent().find('input[data-mask-type=time]').val(); - let $container = $(this).parent().find('.cell-timestamp-container'); + let $container = $input.parent().find('.cell-timestamp-container'); if (date !== undefined) { $container.data('current-date', stringDateTimeFormat(date, 'dateonly')); } else { $container.data('current-date', ''); } - insertHiddenField($(this), date, timeStr, $container.data('datetime-type')); + + insertHiddenField($input); + + if ($input.parent('.range-type').length) { + let $secondInput = findSecondRangeInput($input); + + insertHiddenField($secondInput); + replaceForRangeHiddenField($input.parent().parent()); + } }); } @@ -102,6 +169,7 @@ var DateTimeHelper = (function() { return ` @@ -111,7 +179,8 @@ var DateTimeHelper = (function() { function timeInputField(formId, columnId, value) { return ` +
+
+
+ ${dateInputField(formId, columnId, startDate)} + ${timeInputField(formId, columnId, startTime)} +
+
+
+ ${dateInputField(formId, columnId, endDate)} + ${timeInputField(formId, columnId, endTime)} +
+ + `; + + $cell.html(inputFields); + + Inputmask('datetime', { + inputFormat: 'HH:MM', + placeholder: 'HH:mm', + clearIncomplete: true, + showMaskOnHover: true, + hourFormat: 24 + }).mask($cell.find('input[data-mask-type="time"]')); + + let $cal1 = $cell.find('.calendar-input').first().datetimepicker({ ignoreReadonly: true, locale: 'en', format: formatJS }); + let $cal2 = $cell.find('.calendar-input').last().datetimepicker({ ignoreReadonly: true, locale: 'en', format: formatJS }); + + $cal1.on('dp.change', function(e) { + $cal2.data('DateTimePicker').minDate(e.date); + }); + $cal2.on('dp.change', function(e) { + $cal1.data('DateTimePicker').maxDate(e.date); + }); + + initChangeEvents($cell); + } + return { initDateEditMode: initDateEditMode, initTimeEditMode: initTimeEditMode, initDateTimeEditMode: initDateTimeEditMode, + initDateTimeRangeEditMode: initDateTimeRangeEditMode }; }()); diff --git a/app/assets/javascripts/repositories/renderers/edit_renderers.js b/app/assets/javascripts/repositories/renderers/edit_renderers.js index cb939fd3c..3094a6f1f 100644 --- a/app/assets/javascripts/repositories/renderers/edit_renderers.js +++ b/app/assets/javascripts/repositories/renderers/edit_renderers.js @@ -117,7 +117,17 @@ $.fn.dataTable.render.editRepositoryTimeValue = function(formId, columnId, cell) }; $.fn.dataTable.render.editRepositoryDateTimeRangeValue = function(formId, columnId, cell) { - return ''; + let $cell = $(cell.node()); + let $startSpan = $cell.find('span').first(); + let startDate = $startSpan.data('date'); + let startTime = $startSpan.data('time'); + let startDatetime = $startSpan.data('datetime'); + let $endSpan = $cell.find('span').last(); + let endDate = $endSpan.data('date'); + let endTime = $endSpan.data('time'); + let endDatetime = $endSpan.data('datetime'); + + DateTimeHelper.initDateTimeRangeEditMode(formId, columnId, $cell, startDate, startTime, startDatetime, endDate, endTime, endDatetime); }; $.fn.dataTable.render.editRepositoryDateRangeValue = function(formId, columnId, cell) { diff --git a/app/assets/javascripts/repositories/renderers/new_renderers.js b/app/assets/javascripts/repositories/renderers/new_renderers.js index f707debd9..fdc0833db 100644 --- a/app/assets/javascripts/repositories/renderers/new_renderers.js +++ b/app/assets/javascripts/repositories/renderers/new_renderers.js @@ -98,6 +98,20 @@ $.fn.dataTable.render.newRepositoryDateValue = function(formId, columnId, $cell) DateTimeHelper.initDateEditMode(formId, columnId, $cell, '', ''); }; +$.fn.dataTable.render.newRepositoryDateTimeRangeValue = function(formId, columnId, $cell) { + // let $cell = $(cell.node()); + // let $startSpan = $cell.find('span').first(); + // let startDate = $startSpan.data('date'); + // let startTime = $startSpan.data('time'); + // let startDatetime = $startSpan.data('datetime'); + // let $endSpan = $cell.find('span').last(); + // let endDate = $endSpan.data('date'); + // let endTime = $endSpan.data('time'); + // let endDatetime = $endSpan.data('datetime'); + + DateTimeHelper.initDateTimeRangeEditMode(formId, columnId, $cell, '', '', '', '', '', ''); +}; + $.fn.dataTable.render.newRepositoryCheckboxValue = function(formId, columnId) { return ''; }; diff --git a/app/assets/javascripts/repositories/renderers/view_renderers.js b/app/assets/javascripts/repositories/renderers/view_renderers.js index 62c1718da..ce1d72043 100644 --- a/app/assets/javascripts/repositories/renderers/view_renderers.js +++ b/app/assets/javascripts/repositories/renderers/view_renderers.js @@ -90,7 +90,12 @@ $.fn.dataTable.render.defaultRepositoryDateTimeRangeValue = function() { }; $.fn.dataTable.render.RepositoryDateTimeRangeValue = function(data) { - return data.value; + return `${data.value.start_time.formatted} - + ${data.value.end_time.formatted}`; }; $.fn.dataTable.render.defaultRepositoryDateRangeValue = function() { diff --git a/app/models/repository_cell.rb b/app/models/repository_cell.rb index 88d391216..d82e90701 100644 --- a/app/models/repository_cell.rb +++ b/app/models/repository_cell.rb @@ -70,21 +70,21 @@ class RepositoryCell < ApplicationRecord belongs_to :repository_date_time_range_value, (lambda do includes(:repository_cell) - .where(repository_cells: { value_type: 'RepositoryDateTimeRangeValue' }) + .where(repository_cells: { value_type: 'RepositoryDateTimeRangeValueBase' }) end), optional: true, foreign_key: :value_id, inverse_of: :repository_cell belongs_to :repository_date_range_value, (lambda do includes(:repository_cell) - .where(repository_cells: { value_type: 'RepositoryDateRangeValue' }) + .where(repository_cells: { value_type: 'RepositoryDateTimeRangeValueBase' }) end), optional: true, foreign_key: :value_id, inverse_of: :repository_cell belongs_to :repository_time_range_value, (lambda do includes(:repository_cell) - .where(repository_cells: { value_type: 'RepositoryTimeRangeValue' }) + .where(repository_cells: { value_type: 'RepositoryDateTimeRangeValueBase' }) end), optional: true, foreign_key: :value_id, inverse_of: :repository_cell diff --git a/app/models/repository_date_time_range_value.rb b/app/models/repository_date_time_range_value.rb index 73358fa3b..716eae496 100644 --- a/app/models/repository_date_time_range_value.rb +++ b/app/models/repository_date_time_range_value.rb @@ -2,8 +2,9 @@ class RepositoryDateTimeRangeValue < RepositoryDateTimeRangeValueBase def data_changed?(new_data) - st = Time.zone.parse(new_data[:start_time]) - et = Time.zone.parse(new_data[:end_time]) + data = JSON.parse(new_data).symbolize_keys + st = Time.zone.parse(data[:start_time]) + et = Time.zone.parse(data[:end_time]) st.to_i != start_time.to_i || et.to_i != end_time.to_i end @@ -12,9 +13,11 @@ class RepositoryDateTimeRangeValue < RepositoryDateTimeRangeValueBase end def self.new_with_payload(payload, attributes) + data = JSON.parse(payload).symbolize_keys + value = new(attributes) - value.start_time = Time.zone.parse(payload[:start_time]) - value.end_time = Time.zone.parse(payload[:end_time]) + value.start_time = Time.zone.parse(data[:start_time]) + value.end_time = Time.zone.parse(data[:end_time]) value end end diff --git a/app/models/repository_date_time_range_value_base.rb b/app/models/repository_date_time_range_value_base.rb index 08ddf5542..d1ce7ac94 100644 --- a/app/models/repository_date_time_range_value_base.rb +++ b/app/models/repository_date_time_range_value_base.rb @@ -16,8 +16,9 @@ class RepositoryDateTimeRangeValueBase < ApplicationRecord SORTABLE_VALUE_INCLUDE = :repository_date_time_range_value def update_data!(new_data, user) - self.start_time = Time.zone.parse(new_data[:start_time]) - self.end_time = Time.zone.parse(new_data[:end_time]) + data = JSON.parse(new_data).symbolize_keys + self.start_time = Time.zone.parse(data[:start_time]) + self.end_time = Time.zone.parse(data[:end_time]) self.last_modified_by = user save! end diff --git a/app/serializers/repository_datatable/repository_date_time_range_value_serializer.rb b/app/serializers/repository_datatable/repository_date_time_range_value_serializer.rb index d439c8270..6869084bb 100644 --- a/app/serializers/repository_datatable/repository_date_time_range_value_serializer.rb +++ b/app/serializers/repository_datatable/repository_date_time_range_value_serializer.rb @@ -3,7 +3,20 @@ module RepositoryDatatable class RepositoryDateTimeRangeValueSerializer < RepositoryBaseValueSerializer def value - I18n.l(object.start_time, format: :full_with_comma) + ' - ' + I18n.l(object.end_time, format: :full_with_comma) + { + start_time: { + formatted: I18n.l(object.start_time, format: :full_with_comma), + date_formatted: I18n.l(object.start_time, format: :full_date), + time_formatted: I18n.l(object.start_time, format: :time), + datetime: object.start_time.strftime('%Y/%m/%d %H:%M') + }, + end_time: { + formatted: I18n.l(object.end_time, format: :full_with_comma), + date_formatted: I18n.l(object.end_time, format: :full_date), + time_formatted: I18n.l(object.end_time, format: :time), + datetime: object.end_time.strftime('%Y/%m/%d %H:%M') + } + } end end end