diff --git a/Gemfile.lock b/Gemfile.lock index a743b9f81..ec031f16a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -731,6 +731,7 @@ DEPENDENCIES fastimage figaro graphviz + grover httparty (~> 0.21.0) i18n-js (~> 3.6) image_processing diff --git a/app/assets/javascripts/experiments/show.js b/app/assets/javascripts/experiments/show.js index b6b482559..254dfdcf6 100644 --- a/app/assets/javascripts/experiments/show.js +++ b/app/assets/javascripts/experiments/show.js @@ -37,6 +37,7 @@ // Add and show modal $(experimentWrapper).append($.parseHTML(result.html)); $(newMyModuleModal).modal('show'); + window.initDateTimePickerComponent(`#date-time-picker-my-module`); $(newMyModuleModal).find("input[type='text']").focus(); // Remove modal when it gets closed diff --git a/app/assets/javascripts/experiments/table.js b/app/assets/javascripts/experiments/table.js index 20c61f367..0a775a72d 100644 --- a/app/assets/javascripts/experiments/table.js +++ b/app/assets/javascripts/experiments/table.js @@ -141,43 +141,32 @@ var ExperimnetTable = { let dateText = $(element).closest('.date-text'); let clearDate = $(element).closest('.datetime-container').find('.clear-date'); - $(element).on('dp.change', function() { - $.ajax({ - url: dueDateContainer.data('update-url'), - type: 'PATCH', - dataType: 'json', - data: { my_module: { due_date: $(element).val() } }, - success: function(result) { - dueDateContainer.find('#dueDateLabelContainer').html(result.table_due_date_label.html); - dateText.data('due-status', result.table_due_date_label.due_status); + $(`#calendarDueDateContainer${row.id}`).parent().on('dp:ready', () => { + $(element).data('dateTimePicker').onChange = () => { + $.ajax({ + url: dueDateContainer.data('update-url'), + type: 'PATCH', + dataType: 'json', + data: { my_module: { due_date: $(element).val() } }, + success: function(result) { + dueDateContainer.find('#dueDateLabelContainer').html(result.table_due_date_label.html); + dateText.data('due-status', result.table_due_date_label.due_status); - if ($(result.table_due_date_label.html).data('due-date')) { - clearDate.addClass('open'); + if ($(result.table_due_date_label.html).data('due-date')) { + clearDate.removeClass('tw-hidden'); + } else { + clearDate.addClass('tw-hidden'); + } } - } + }); + } + + clearDate.on('click', () => { + $(element).data('dateTimePicker').clearDate(); }); }); - $(element).on('dp.hide', function() { - dateText.attr('data-original-title', dateText.data('due-status')); - clearDate.removeClass('open'); - }); - - $(element).on('dp.show', function() { - var datePicker = $('.bootstrap-datetimepicker-widget.dropdown-menu')[0]; - - // show full datepicker menu for due date - if (datePicker.getBoundingClientRect().bottom > window.innerHeight) { - datePicker.scrollIntoView(false); - } else if (datePicker.getBoundingClientRect().top < 0) { - datePicker.scrollIntoView(); - } - - dateText.attr('data-original-title', '').tooltip('hide'); - if (dueDateContainer.find('.due-date-label').data('due-date')) { - clearDate.addClass('open'); - } - }); + window.initDateTimePickerComponent(`#calendarDueDateContainer${row.id}`); }); }, initMyModuleActions: function() { @@ -505,9 +494,9 @@ var ExperimnetTable = { } }, selectDate: function($field) { - var datePicker = $field.data('DateTimePicker'); - if (datePicker && datePicker.date()) { - return datePicker.date()._d.toUTCString(); + var datePicker = $field.data('dateTimePicker'); + if (datePicker && datePicker.date) { + return datePicker.date.toString(); } return null; }, @@ -748,9 +737,7 @@ ExperimnetTable.filters.push({ }, active: (value) => { return value; }, clearFilter: ($container) => { - if ($('.due-date-filter .from-date', $container).data('DateTimePicker')) { - $('.due-date-filter .from-date', $container).data('DateTimePicker').clear(); - } + $('.due-date-filter .from-date', $container).data('dateTimePicker')?.clearDate(); } }); @@ -763,9 +750,7 @@ ExperimnetTable.filters.push({ }, active: (value) => { return value; }, clearFilter: ($container) => { - if ($('.due-date-filter .to-date', $container).data('DateTimePicker')) { - $('.due-date-filter .to-date', $container).data('DateTimePicker').clear(); - } + $('.due-date-filter .to-date', $container).data('dateTimePicker')?.clearDate(); } }); @@ -778,9 +763,7 @@ ExperimnetTable.filters.push({ }, active: (value) => { return value; }, clearFilter: ($container) => { - if ($('.archived-on-filter .from-date', $container).data('DateTimePicker')) { - $('.archived-on-filter .from-date', $container).data('DateTimePicker').clear(); - } + $('.archived-on-filter .from-date', $container).data('dateTimePicker')?.clearDate(); } }); @@ -793,9 +776,7 @@ ExperimnetTable.filters.push({ }, active: (value) => { return value; }, clearFilter: ($container) => { - if ($('.archived-on-filter .to-date', $container).data('DateTimePicker')) { - $('.archived-on-filter .to-date', $container).data('DateTimePicker').clear(); - } + $('.archived-on-filter .to-date', $container).data('dateTimePicker')?.clearDate(); } }); diff --git a/app/assets/javascripts/global_activities/side_pane.js b/app/assets/javascripts/global_activities/side_pane.js index d741f6015..33486fe8a 100644 --- a/app/assets/javascripts/global_activities/side_pane.js +++ b/app/assets/javascripts/global_activities/side_pane.js @@ -26,13 +26,13 @@ var globalActivities = (function() { }; function GlobalActivitiesFiltersGetDates() { - var fromDate = $('#calendar-from-date').data('DateTimePicker').date(); - var toDate = $('#calendar-to-date').data('DateTimePicker').date(); + var fromDate = $('#calendar-from-date').data('dateTimePicker').$refs.vueDateTime.datetime; + var toDate = $('#calendar-to-date').data('dateTimePicker').$refs.vueDateTime.datetime; if (fromDate) { - fromDate = fromDate._d.date_to_string(); + fromDate = fromDate.date_to_string(); } if (toDate) { - toDate = toDate._d.date_to_string(); + toDate = toDate.date_to_string(); } return { from: fromDate, to: toDate }; } @@ -108,8 +108,8 @@ var globalActivities = (function() { $('.date-selector .date.clear').click(() => { updateRunning = true; - $('#calendar-from-date').data('DateTimePicker').clear(); - $('#calendar-to-date').data('DateTimePicker').clear(); + $('#calendar-from-date').data('dateTimePicker').clearDate(); + $('#calendar-to-date').data('dateTimePicker').clearDate(); $('.ga-side .date-selector.filter-block')[0].dataset.periodSelect = ''; resetHotButtonsBackgroundColor(); updateRunning = false; @@ -205,8 +205,8 @@ var globalActivities = (function() { var selectorsCount = $(projectFilter).length === 1 ? clearSelectors.length - 1 : 1; updateRunning = true; - $('#calendar-from-date').data('DateTimePicker').clear(); - $('#calendar-to-date').data('DateTimePicker').clear(); + $('#calendar-from-date').data('dateTimePicker').clearDate(); + $('#calendar-to-date').data('dateTimePicker').clearDate(); $('.ga-side .date-selector.filter-block')[0].dataset.periodSelect = ''; @@ -331,27 +331,18 @@ var globalActivities = (function() { }); }); - $('#calendar-to-date').on('dp.change', function(e) { - var dateContainer = $('.ga-side .date-selector.filter-block'); - if (!updateRunning) { - $('#calendar-from-date').data('DateTimePicker').minDate(e.date); - dateContainer[0].dataset.periodSelect = $('#calendar-to-date').val() + ' - ' + $('#calendar-from-date').val(); - GlobalActivitiesUpdateTopPaneTags(); - reloadActivities(); - toggleClearButtons(); - resetHotButtonsBackgroundColor(); - } - }); - - $('#calendar-from-date').on('dp.change', function(e) { - var dateContainer = $('.ga-side .date-selector.filter-block'); - if (!updateRunning) { - $('#calendar-to-date').data('DateTimePicker').maxDate(e.date); - dateContainer[0].dataset.periodSelect = $('#calendar-to-date').val() + ' - ' + $('#calendar-from-date').val(); - GlobalActivitiesUpdateTopPaneTags(); - reloadActivities(); - toggleClearButtons(); - resetHotButtonsBackgroundColor(); + $('.datetime-picker-container').on('dp:ready', function() { + $(this).find('.calendar-input').data('dateTimePicker').onChange = () => { + let dateContainer = $('.ga-side .date-selector.filter-block'); + if (!updateRunning) { + let toDate = $('#calendar-to-date').data('dateTimePicker').$refs.vueDateTime.datetime; + let fromDate = $('#calendar-from-date').data('dateTimePicker').$refs.vueDateTime.datetime; + dateContainer[0].dataset.periodSelect = (toDate ? toDate?.date_to_string() : '') + ' - ' + (fromDate ? fromDate.date_to_string() : ''); + GlobalActivitiesUpdateTopPaneTags(); + reloadActivities(); + toggleClearButtons(); + resetHotButtonsBackgroundColor(); + } } }); @@ -362,8 +353,8 @@ var globalActivities = (function() { $('.date-selector .hot-button').click(function() { var selectPeriod = this.dataset.period; var dateContainer = $('.ga-side .date-selector.filter-block'); - var fromDate = $('#calendar-from-date').data('DateTimePicker'); - var toDate = $('#calendar-to-date').data('DateTimePicker'); + var fromDate = $('#calendar-from-date').data('dateTimePicker'); + var toDate = $('#calendar-to-date').data('dateTimePicker'); var today = new Date(); var yesterday = new Date(new Date().setDate(today.getDate() - 1)); var weekDay = today.getDay(); @@ -375,26 +366,24 @@ var globalActivities = (function() { var lastMonthEnd = new Date(new Date().setDate(firstDay.getDate() - 1)); var lastMonthStart = new Date(lastMonthEnd.getFullYear(), lastMonthEnd.getMonth(), 1); updateRunning = true; - fromDate.minDate(new Date(1900, 1, 1)); - toDate.maxDate(new Date(3000, 1, 1)); if (selectPeriod === 'today') { - fromDate.date(today); - toDate.date(today); + fromDate.$refs.vueDateTime.datetime = today; + toDate.$refs.vueDateTime.datetime = today; } else if (selectPeriod === 'yesterday') { - fromDate.date(yesterday); - toDate.date(yesterday); + fromDate.$refs.vueDateTime.datetime = yesterday; + toDate.$refs.vueDateTime.datetime = yesterday; } else if (selectPeriod === 'this_week') { - fromDate.date(today); - toDate.date(monday); + fromDate.$refs.vueDateTime.datetime = today; + toDate.$refs.vueDateTime.datetime = monday; } else if (selectPeriod === 'last_week') { - fromDate.date(lastWeekEnd); - toDate.date(lastWeekStart); + fromDate.$refs.vueDateTime.datetime = lastWeekEnd; + toDate.$refs.vueDateTime.datetime = lastWeekStart; } else if (selectPeriod === 'this_month') { - fromDate.date(today); - toDate.date(firstDay); + fromDate.$refs.vueDateTime.datetime = today; + toDate.$refs.vueDateTime.datetime = firstDay; } else if (selectPeriod === 'last_month') { - fromDate.date(lastMonthEnd); - toDate.date(lastMonthStart); + fromDate.$refs.vueDateTime.datetime = lastMonthEnd; + toDate.$refs.vueDateTime.datetime = lastMonthStart; } updateRunning = false; dateContainer[0].dataset.periodSelect = this.innerHTML; diff --git a/app/assets/javascripts/my_modules.js b/app/assets/javascripts/my_modules.js index f154bc071..4db6aa550 100644 --- a/app/assets/javascripts/my_modules.js +++ b/app/assets/javascripts/my_modules.js @@ -56,9 +56,12 @@ // Bind ajax for editing due dates function initStartDatePicker() { - $('#calendarStartDate').on('dp.change', function() { - updateStartDate(); + $('.datetime-picker-container#start-date').on('dp:ready', () => { + $('#calendarStartDate').data('dateTimePicker').onChange = () => { + updateStartDate(); + }; }); + window.initDateTimePickerComponent('#calendarStartDateContainer'); } function updateDueDate() { @@ -82,9 +85,12 @@ // Bind ajax for editing due dates function initDueDatePicker() { - $('#calendarDueDate').on('dp.change', function() { - updateDueDate(); + $('.datetime-picker-container#due-date').on('dp:ready', () => { + $('#calendarDueDate').data('dateTimePicker').onChange = () => { + updateDueDate(); + }; }); + window.initDateTimePickerComponent('#calendarDueDateContainer'); } function initTagsSelector() { diff --git a/app/assets/javascripts/projects/canvas.js.erb b/app/assets/javascripts/projects/canvas.js.erb index 102931b1c..5cbcfa281 100644 --- a/app/assets/javascripts/projects/canvas.js.erb +++ b/app/assets/javascripts/projects/canvas.js.erb @@ -763,6 +763,8 @@ function bindEditDueDateAjax() { editDueDateModalBody.html(data.html); editDueDateModalTitle.text(data.title); + window.initDateTimePickerComponent('#date-time-picker'); + // Add listener to form inside modal editDueDateModalBody.find("form") .on("ajax:success", function(ev2, data2, status2) { diff --git a/app/assets/javascripts/projects/index.js b/app/assets/javascripts/projects/index.js index 7f063a0f1..e49f801f0 100644 --- a/app/assets/javascripts/projects/index.js +++ b/app/assets/javascripts/projects/index.js @@ -13,7 +13,6 @@ var ProjectsIndex = (function() { var projectsWrapper = '#projectsWrapper'; - var toolbarWrapper = '#toolbarWrapper'; var cardsWrapper = '#cardsWrapper'; var editProjectModal = '#edit-modal'; var moveToModal = '#move-to-modal'; @@ -448,22 +447,13 @@ var ProjectsIndex = (function() { data: { ...requestParams, ...{ page: 1 } }, success: function(data) { $(projectsWrapper).find('.projects-title').html(data.title_html); - $(toolbarWrapper).html(data.toolbar_html); - initProjectsViewModeSwitch(); + initCardData(viewContainer, data); selectedProjects.length = 0; selectedProjectFolders.length = 0; updateProjectsToolbar(); - initProjectsFilters(); - initSorting(); - - // set current sort item - if (projectsCurrentSort) { - $('#sortMenuDropdown a').removeClass('selected'); - $(`#sortMenuDropdown a[data-sort="${projectsCurrentSort}"]`).addClass('selected'); - } if (data.filtered) { $(projectsWrapper).find('.project-list-end-placeholder').remove(); @@ -546,11 +536,9 @@ var ProjectsIndex = (function() { } function selectDate($field) { - var datePicker = $field.data('DateTimePicker'); - if (datePicker && datePicker.date()) { - return datePicker.date()._d.toUTCString(); - } else if ($field.val()) { - return moment($field.val(), $field.data('dateFormat'))._d.toUTCString(); + let datePicker = $field.data('dateTimePicker'); + if (datePicker && datePicker.date) { + return datePicker.date.toString(); } return null; } @@ -576,32 +564,6 @@ var ProjectsIndex = (function() { projectsViewSearch = $textFilter.val(); } - function saveCurrentFilters() { - getFilterValues(); - - currentFilters = { - createdOnFromFilter: $createdOnFromFilter.val(), - createdOnToFilter: $createdOnToFilter.val(), - membersFilter: membersFilter, - lookInsideFolders: lookInsideFolders, - archivedOnFromFilter: $archivedOnFromFilter.val(), - archivedOnToFilter: $archivedOnToFilter.val(), - projectsViewSearch: projectsViewSearch - }; - } - - function loadCurrentFilters() { - if (!currentFilters) return; - - $createdOnFromFilter.val(currentFilters.createdOnFromFilter); - $createdOnToFilter.val(currentFilters.createdOnToFilter); - $foldersCB.attr('checked', !!currentFilters.lookInsideFolders); - dropdownSelector.setData($('.members-filter'), currentFilters.membersFilter); - $archivedOnFromFilter.val(currentFilters.archivedOnFromFilter); - $archivedOnToFilter.val(currentFilters.archivedOnToFilter); - $textFilter.val(currentFilters.projectsViewSearch); - } - function filtersEnabled() { getFilterValues(); @@ -640,7 +602,6 @@ var ProjectsIndex = (function() { }); $filterDropdown.on('filter:apply', function() { - saveCurrentFilters(); appliedFiltersMark(); loadCardsView(); }); @@ -650,12 +611,11 @@ var ProjectsIndex = (function() { currentFilters = null; dropdownSelector.clearData($membersFilter); - $createdOnFromFilter.val(''); - $createdOnToFilter.val(''); - $createdOnFromFilter.val(''); - $createdOnToFilter.val(''); - $archivedOnFromFilter.val(''); - $archivedOnToFilter.val(''); + + $createdOnFromFilter.data('dateTimePicker').clearDate(); + $createdOnToFilter.data('dateTimePicker').clearDate(); + $archivedOnFromFilter.data('dateTimePicker').clearDate(); + $archivedOnToFilter.data('dateTimePicker').clearDate(); $foldersCB.prop('checked', false); $textFilter.val(''); }); @@ -668,7 +628,6 @@ var ProjectsIndex = (function() { $('#folderSearchInfo').hide(); }); - loadCurrentFilters(); appliedFiltersMark(); } @@ -710,10 +669,12 @@ var ProjectsIndex = (function() { initArchiveRestoreToolbarButtons(); initEditButton(); initMoveButton(); - initProjectsViewModeSwitch(); initSelectAllCheckbox(); initArchiveRestoreButton(); loadCardsView(); + initProjectsViewModeSwitch(); + initProjectsFilters(); + initSorting(); AsyncDropdown.init($(projectsWrapper)); $(projectsWrapper).on('click', '.folder-card-selector', function() { diff --git a/app/assets/javascripts/projects/show.js b/app/assets/javascripts/projects/show.js index 854800866..887c1bd2a 100644 --- a/app/assets/javascripts/projects/show.js +++ b/app/assets/javascripts/projects/show.js @@ -132,9 +132,9 @@ } function selectDate($field) { - var datePicker = $field.data('DateTimePicker'); - if (datePicker && datePicker.date()) { - return datePicker.date()._d.toUTCString(); + let datePicker = $field.data('dateTimePicker'); + if (datePicker && datePicker.date) { + return datePicker.date.toString(); } return null; } @@ -186,12 +186,12 @@ // Clear filters $filterDropdown.on('filter:clear', function() { $(this).find('input').val(''); - if ($startedOnFromFilter.data('DateTimePicker')) $startedOnFromFilter.data('DateTimePicker').clear(); - if ($startedOnToFilter.data('DateTimePicker')) $startedOnToFilter.data('DateTimePicker').clear(); - if ($modifiedOnFromFilter.data('DateTimePicker')) $modifiedOnFromFilter.data('DateTimePicker').clear(); - if ($modifiedOnToFilter.data('DateTimePicker')) $modifiedOnToFilter.data('DateTimePicker').clear(); - if ($archivedOnFromFilter.data('DateTimePicker')) $archivedOnFromFilter.data('DateTimePicker').clear(); - if ($archivedOnToFilter.data('DateTimePicker')) $archivedOnToFilter.data('DateTimePicker').clear(); + $startedOnFromFilter.data('dateTimePicker').clearDate(); + $startedOnToFilter.data('dateTimePicker').clearDate(); + $modifiedOnFromFilter.data('dateTimePicker').clearDate(); + $modifiedOnToFilter.data('dateTimePicker').clearDate(); + $archivedOnFromFilter.data('dateTimePicker').clearDate(); + $archivedOnToFilter.data('dateTimePicker').clearDate(); }); } diff --git a/app/assets/javascripts/protocols/index.js b/app/assets/javascripts/protocols/index.js index f6498ef4e..73a88c9d6 100644 --- a/app/assets/javascripts/protocols/index.js +++ b/app/assets/javascripts/protocols/index.js @@ -47,9 +47,9 @@ var ProtocolsIndex = (function() { } function selectDate($field) { - var datePicker = $field.data('DateTimePicker'); - if (datePicker && datePicker.date()) { - return datePicker.date()._d.toUTCString(); + var datePicker = $field.data('dateTimePicker'); + if (datePicker && datePicker.date) { + return datePicker.date.toString(); } return null; } @@ -129,12 +129,12 @@ var ProtocolsIndex = (function() { dropdownSelector.clearData($accessByFilter); $(this).find('input').val(''); - if ($publishedOnFromFilter.data('DateTimePicker')) $publishedOnFromFilter.data('DateTimePicker').clear(); - if ($publishedOnToFilter.data('DateTimePicker')) $publishedOnToFilter.data('DateTimePicker').clear(); - if ($modifiedOnFromFilter.data('DateTimePicker')) $modifiedOnFromFilter.data('DateTimePicker').clear(); - if ($modifiedOnToFilter.data('DateTimePicker')) $modifiedOnToFilter.data('DateTimePicker').clear(); - if ($archivedOnFromFilter.data('DateTimePicker')) $archivedOnFromFilter.data('DateTimePicker').clear(); - if ($archivedOnToFilter.data('DateTimePicker')) $archivedOnToFilter.data('DateTimePicker').clear(); + $publishedOnFromFilter.data('dateTimePicker')?.clearDate(); + $publishedOnToFilter.data('dateTimePicker')?.clearDate(); + $modifiedOnFromFilter.data('dateTimePicker')?.clearDate(); + $modifiedOnToFilter.data('dateTimePicker')?.clearDate(); + $archivedOnFromFilter.data('dateTimePicker')?.clearDate(); + $archivedOnToFilter.data('dateTimePicker')?.clearDate(); $hasDraft.prop('checked', false); $textFilter.val(''); }); diff --git a/app/assets/javascripts/repositories/index.js b/app/assets/javascripts/repositories/index.js index 354dd74ea..2c56c38c0 100644 --- a/app/assets/javascripts/repositories/index.js +++ b/app/assets/javascripts/repositories/index.js @@ -105,6 +105,7 @@ }], fnInitComplete: function(e) { initActionToolbar(); + window.actionToolbarComponent.setReloadCallback(() => initRepositoriesDataTable('#repositoriesList', archived)); window.actionToolbarComponent.setBottomOffset(68); 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 4be902d54..9198d47cb 100644 --- a/app/assets/javascripts/repositories/renderers/columns/date_time_helper.js +++ b/app/assets/javascripts/repositories/renderers/columns/date_time_helper.js @@ -2,316 +2,90 @@ /* eslint-disable no-unused-vars */ var DateTimeHelper = (function() { - function isValidTimeStr(timeStr) { - return /^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$/.test(timeStr); - } - - function isValidDate(date) { - return (date instanceof Date) && !isNaN(date.getTime()); - } - - function addLeadingZero(value) { - return ('0' + value).slice(-2); - } - - function setDateTimePickerOpeningDirection(event) { - const element = $(event.target); - const dateTimePickerWidget = $('.bootstrap-datetimepicker-widget'); - - const windowHeight = element.closest('table').offset().top; - const inputTop = element.offset().top; - const pickerHeight = $('.bootstrap-datetimepicker-widget').outerHeight(); - - if (inputTop - windowHeight > pickerHeight) { - dateTimePickerWidget.addClass('top') - .removeClass('bottom') - .css({ - top: 'auto', - bottom: '36px', - }); - } else { - dateTimePickerWidget.addClass('bottom') - .removeClass('top') - .css({ - top: '36px', - bottom: 'auto', - }); - } - } - - function recalcTimestamp(date, timeStr) { - if (!isValidTimeStr(timeStr)) { - date.setHours(0); - date.setMinutes(0); - return date; - } - - date.setHours(timeStr.split(':')[0]); - date.setMinutes(timeStr.split(':')[1]); - return date; - } - - function stringDateTimeFormat(date, format) { - let y = date.getFullYear(); - let m = addLeadingZero(date.getMonth() + 1); - let d = addLeadingZero(date.getDate()); - let hours = addLeadingZero(date.getHours()); - let mins = addLeadingZero(date.getMinutes()); - - if (format === 'dateonly') { - return `${y}/${m}/${d}`; - } - return `${y}/${m}/${d} ${hours}:${mins}`; - } - - function insertHiddenField($container) { - let formId = $container.data('form-id'); - let columnId = $container.data('column-id'); - let dateStr = $container.find('input.date-part').data('selected-date'); - let timeStr = $container.find('input.time-part').val(); - let columnType = $container.data('type'); - let date = new Date(dateStr); - let value = ''; - let hiddenField; - - if (isValidDate(date) && isValidTimeStr(timeStr)) { - value = stringDateTimeFormat(recalcTimestamp(date, timeStr), 'full'); - } - - hiddenField = ` - `; - - $container.find('input.repository-cell-value').remove(); - $container.prepend(hiddenField); - } - - - function insertRangeHiddenField($container) { - let formId = $container.data('form-id'); - let columnId = $container.data('column-id'); - let columnType = $container.data('type'); - let $startContainer = $container.find('.start-time'); - let $endContainer = $container.find('.end-time'); - let startDate = new Date($startContainer.find('input.date-part').data('selected-date')); - let startTimeStr = $startContainer.find('input.time-part').val(); - let endDate = new Date($endContainer.find('input.date-part').data('selected-date')); - let endTimeStr = $endContainer.find('input.time-part').val(); - let hiddenField; - let value = ''; - - if (isValidDate(startDate) - && isValidTimeStr(startTimeStr) - && isValidDate(endDate) - && isValidTimeStr(endTimeStr)) { - let start = stringDateTimeFormat(recalcTimestamp(startDate, startTimeStr), 'full'); - let end = stringDateTimeFormat(recalcTimestamp(endDate, endTimeStr), 'full'); - value = JSON.stringify({ start_time: start, end_time: end }); - } - - hiddenField = ` - `; - - $container.find('input.repository-cell-value').remove(); - $container.prepend(hiddenField); - } - - function initChangeEvents($cell) { - $cell.find('input.time-part').on('change', function() { - let $input = $(this); - let $container = $input.closest('.datetime-container'); - - if ($container.hasClass('range-type')) { - insertRangeHiddenField($container); - } else { - insertHiddenField($container); - } - }); - - $cell.find('input.date-part').on('dp.change', function(e) { - let $input = $(this); - let date = e.date._d; - let $container = $input.closest('.datetime-container'); - - if (date !== undefined) { - $input.data('selected-date', stringDateTimeFormat(date, 'dateonly')); - } else { - $input.data('selected-date', ''); - } - - if ($container.hasClass('range-type')) { - insertRangeHiddenField($container); - } else { - insertHiddenField($container); - } - }); - } - - - function dateInputField(value, dateDataValue) { - return ` -
- `; - } - - function timeInputField(value) { - return ` - - `; - } - - function getDateOrDefault($span, mode) { - let dateStr = $span.data('date'); - let date; - if (mode === 'timeonly') { - // Set default date if no data in span - date = new Date(dateStr); - if (isValidDate(date)) { - dateStr = stringDateTimeFormat(new Date(date), 'dateonly'); - } else { - dateStr = stringDateTimeFormat(new Date(), 'dateonly'); - } - } - return dateStr; - } - - function getTimeOrDefault($span, mode) { - let timeStr = $span.data('time'); - - if ((mode === 'dateonly') && (!isValidTimeStr(timeStr))) { - timeStr = '00:00'; - } - return timeStr; - } - - function initCurrentTimeSelector($cell) { - $cell.find('.time-container .fa-clock').click(function() { - var inputField = $(this).prev(); - var d = new Date(); - var h = addLeadingZero(d.getHours()); - var m = addLeadingZero(d.getMinutes()); - inputField.val(h + ':' + m).change(); - }); + function placeholder(mode) { + if (mode === 'date') return formatJS; + if (mode === 'time') return 'HH:mm'; + return `${formatJS} HH:mm`; } function initDateTimeEditMode(formId, columnId, $cell, mode, columnType) { - let $span = $cell.find('span').first(); - let date = $span.data('date'); - let dateDataValue = getDateOrDefault($span, mode); - let time = getTimeOrDefault($span, mode); - let datetime = $span.data('datetime'); - let inputFields = ` -