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 = ` -
+
+ - ${dateInputField(date, dateDataValue)} - ${timeInputField(time)} -
- `; + data-simple-format="true" + form="${formId}" + name="repository_cells[${columnId}]" + class="datetime" type="hidden" + data-default="${dateTime}" + v-model="date" + id="datetimePicker${formId}${columnId}" /> + +
+ + `; $cell.html(inputFields); - initCurrentTimeSelector($cell); - Inputmask('datetime', { - inputFormat: 'HH:MM', - placeholder: 'HH:mm', - clearIncomplete: true, - showMaskOnHover: true, - hourFormat: 24 - }).mask($cell.find('input[data-mask-type="time"]')); - - $cell.find('.calendar-input') - .datetimepicker({ ignoreReadonly: true, locale: 'en', format: formatJS }) - .on('dp.show', (e) => { - setDateTimePickerOpeningDirection(e); - }); - initChangeEvents($cell); + window.initDateTimePickerComponent(`#datetimePickerContainer${formId}${columnId}`); } function initDateTimeRangeEditMode(formId, columnId, $cell, mode, columnType) { - let $startSpan = $cell.find('span').first(); - let startDate = $startSpan.data('date'); - let startTime = getTimeOrDefault($startSpan, mode); - let startDatetime = getDateOrDefault($startSpan, mode); - let startDateDataValue = getDateOrDefault($startSpan, mode); - let $endSpan = $cell.find('span').last(); - let endDate = $endSpan.data('date'); - let endTime = getTimeOrDefault($endSpan, mode); - let endDatetime = getDateOrDefault($endSpan, mode); - let endDateDataValue = getDateOrDefault($endSpan, mode); + const $startSpan = $cell.find('span').first(); + const startDateTime = $startSpan.data('datetime') || ''; + const $endSpan = $cell.find('span').last(); + const endDateTime = $endSpan.data('datetime') || ''; - let inputFields = ` -
-
- ${dateInputField(startDate, startDatetime)} - ${timeInputField(startTime)} -
-
-
- ${dateInputField(endDate, endDatetime)} - ${timeInputField(endTime)} -
-
- `; + const inputFields = ` +
+ +
+ + +
+
+
+ + +
+
`; $cell.html(inputFields); - initCurrentTimeSelector($cell); - - 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); - }).on('dp.show', (e) => { - setDateTimePickerOpeningDirection(e); - }); - $cal2.on('dp.change', function(e) { - $cal1.data('DateTimePicker').maxDate(e.date); - }).on('dp.show', (e) => { - setDateTimePickerOpeningDirection(e); - }); - - initChangeEvents($cell); + window.initDateTimePickerComponent(`#datetimeStartPickerComtainer${formId}${columnId}`); + window.initDateTimePickerComponent(`#datetimeEndPickerComtainer${formId}${columnId}`); } return { diff --git a/app/assets/javascripts/repositories/renderers/edit_renderers.js b/app/assets/javascripts/repositories/renderers/edit_renderers.js index ab9884915..0f1e320ff 100644 --- a/app/assets/javascripts/repositories/renderers/edit_renderers.js +++ b/app/assets/javascripts/repositories/renderers/edit_renderers.js @@ -75,37 +75,37 @@ $.fn.dataTable.render.editRepositoryStatusValue = function(formId, columnId, cel $.fn.dataTable.render.editRepositoryDateTimeValue = function(formId, columnId, cell) { let $cell = $(cell.node()); - DateTimeHelper.initDateTimeEditMode(formId, columnId, $cell, '', 'RepositoryDateTimeValue'); + DateTimeHelper.initDateTimeEditMode(formId, columnId, $cell, 'datetime', 'RepositoryDateTimeValue'); }; $.fn.dataTable.render.editRepositoryDateValue = function(formId, columnId, cell) { let $cell = $(cell.node()); - DateTimeHelper.initDateTimeEditMode(formId, columnId, $cell, 'dateonly', 'RepositoryDateValue'); + DateTimeHelper.initDateTimeEditMode(formId, columnId, $cell, 'date', 'RepositoryDateValue'); }; $.fn.dataTable.render.editRepositoryTimeValue = function(formId, columnId, cell) { let $cell = $(cell.node()); - DateTimeHelper.initDateTimeEditMode(formId, columnId, $cell, 'timeonly', 'RepositoryTimeValue'); + DateTimeHelper.initDateTimeEditMode(formId, columnId, $cell, 'time', 'RepositoryTimeValue'); }; $.fn.dataTable.render.editRepositoryDateTimeRangeValue = function(formId, columnId, cell) { let $cell = $(cell.node()); - DateTimeHelper.initDateTimeRangeEditMode(formId, columnId, $cell, '', 'RepositoryDateTimeRangeValue'); + DateTimeHelper.initDateTimeRangeEditMode(formId, columnId, $cell, 'datetime', 'RepositoryDateTimeRangeValue'); }; $.fn.dataTable.render.editRepositoryDateRangeValue = function(formId, columnId, cell) { let $cell = $(cell.node()); - DateTimeHelper.initDateTimeRangeEditMode(formId, columnId, $cell, 'dateonly', 'RepositoryDateRangeValue'); + DateTimeHelper.initDateTimeRangeEditMode(formId, columnId, $cell, 'date', 'RepositoryDateRangeValue'); }; $.fn.dataTable.render.editRepositoryTimeRangeValue = function(formId, columnId, cell) { let $cell = $(cell.node()); - DateTimeHelper.initDateTimeRangeEditMode(formId, columnId, $cell, 'timeonly', 'RepositoryTimeRangeValue'); + DateTimeHelper.initDateTimeRangeEditMode(formId, columnId, $cell, 'time', 'RepositoryTimeRangeValue'); }; $.fn.dataTable.render.editRepositoryChecklistValue = 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 c4f834c04..3002856d8 100644 --- a/app/assets/javascripts/repositories/renderers/new_renderers.js +++ b/app/assets/javascripts/repositories/renderers/new_renderers.js @@ -78,27 +78,27 @@ $.fn.dataTable.render.newRepositoryNumberValue = function(formId, columnId, $cel }; $.fn.dataTable.render.newRepositoryDateTimeValue = function(formId, columnId, $cell) { - DateTimeHelper.initDateTimeEditMode(formId, columnId, $cell, '', 'RepositoryDateTimeValue'); + DateTimeHelper.initDateTimeEditMode(formId, columnId, $cell, 'datetime', 'RepositoryDateTimeValue'); }; $.fn.dataTable.render.newRepositoryTimeValue = function(formId, columnId, $cell) { - DateTimeHelper.initDateTimeEditMode(formId, columnId, $cell, 'timeonly', 'RepositoryTimeValue'); + DateTimeHelper.initDateTimeEditMode(formId, columnId, $cell, 'time', 'RepositoryTimeValue'); }; $.fn.dataTable.render.newRepositoryDateValue = function(formId, columnId, $cell) { - DateTimeHelper.initDateTimeEditMode(formId, columnId, $cell, 'dateonly', 'RepositoryDateValue'); + DateTimeHelper.initDateTimeEditMode(formId, columnId, $cell, 'date', 'RepositoryDateValue'); }; $.fn.dataTable.render.newRepositoryDateTimeRangeValue = function(formId, columnId, $cell) { - DateTimeHelper.initDateTimeRangeEditMode(formId, columnId, $cell, '', 'RepositoryDateTimeRangeValue'); + DateTimeHelper.initDateTimeRangeEditMode(formId, columnId, $cell, 'datetime', 'RepositoryDateTimeRangeValue'); }; $.fn.dataTable.render.newRepositoryDateRangeValue = function(formId, columnId, $cell) { - DateTimeHelper.initDateTimeRangeEditMode(formId, columnId, $cell, 'dateonly', 'RepositoryDateRangeValue'); + DateTimeHelper.initDateTimeRangeEditMode(formId, columnId, $cell, 'date', 'RepositoryDateRangeValue'); }; $.fn.dataTable.render.newRepositoryTimeRangeValue = function(formId, columnId, $cell) { - DateTimeHelper.initDateTimeRangeEditMode(formId, columnId, $cell, 'timeonly', 'RepositoryTimeRangeValue'); + DateTimeHelper.initDateTimeRangeEditMode(formId, columnId, $cell, 'time', 'RepositoryTimeRangeValue'); }; $.fn.dataTable.render.newRepositoryStockValue = function() { diff --git a/app/assets/javascripts/repositories/repository_datatable.js b/app/assets/javascripts/repositories/repository_datatable.js index 6fcf35f30..61a74a3e0 100644 --- a/app/assets/javascripts/repositories/repository_datatable.js +++ b/app/assets/javascripts/repositories/repository_datatable.js @@ -791,6 +791,7 @@ var RepositoryDatatable = (function(global) { fnInitComplete: function() { window.initActionToolbar(); window.actionToolbarComponent.setBottomOffset(68); + initHeaderTooltip(); disableCheckboxToggleOnCheckboxPreview(); diff --git a/app/assets/javascripts/repositories/validators/base_validator.js b/app/assets/javascripts/repositories/validators/base_validator.js index 951cdfe32..08199e19a 100644 --- a/app/assets/javascripts/repositories/validators/base_validator.js +++ b/app/assets/javascripts/repositories/validators/base_validator.js @@ -76,18 +76,7 @@ $.fn.dataTable.render.RepositoryNumberValueValidator = function($input) { }; $.fn.dataTable.render.RepositoryDateTimeValueValidator = function($input) { - let $container = $input.parents('.datetime-container'); - let $date = $container.find('input.date-part'); - let $time = $container.find('input.time-part'); - - if (($date.val() === '') === ($time.val() === '')) { - return true; - } - $container.find('.date-container') - .addClass('error') - .attr('data-error-text', I18n.t('repositories.table.date_time.errors.set_all_or_none')); - $container.find('.time-container').addClass('error'); - return false; + return true; }; $.fn.dataTable.render.RepositoryDateValueValidator = function() { @@ -99,11 +88,10 @@ $.fn.dataTable.render.RepositoryTimeValueValidator = function() { }; $.fn.dataTable.render.RepositoryDateTimeRangeValueValidator = function($input) { - let $container = $input.parents('.datetime-container'); - let $dateS = $container.find('.start-time input.date-part'); - let $timeS = $container.find('.start-time input.time-part'); - let $dateE = $container.find('.end-time input.date-part'); - let $timeE = $container.find('.end-time input.time-part'); + const $container = $input.parents('.datetime-container'); + const $dateS = $container.find('.datetime.start'); + const $dateE = $container.find('.datetime.end'); + const $submitField = $container.find('.column-range'); let isValid = true; let errorMessage; let startTime; @@ -111,14 +99,12 @@ $.fn.dataTable.render.RepositoryDateTimeRangeValueValidator = function($input) { let a = []; if ($input.val()) { - startTime = new Date(JSON.parse($input.val()).start_time); - endTime = new Date(JSON.parse($input.val()).end_time); + startTime = new Date($dateS.val()); + endTime = new Date($dateE.val()); } a.push($dateS.val() === ''); - a.push($timeS.val() === ''); a.push($dateE.val() === ''); - a.push($timeE.val() === ''); if (a.filter((v, i, arr) => arr.indexOf(v) === i).length > 1) { isValid = false; @@ -129,26 +115,35 @@ $.fn.dataTable.render.RepositoryDateTimeRangeValueValidator = function($input) { } if (isValid) { + const oldValue = $submitField.val(); + let newValue; + if ($dateS.val() && $dateE.val()) { + newValue = JSON.stringify({ start_time: $dateS.val(), end_time: $dateE.val() }); + } + if (oldValue !== newValue) { + $submitField.val(newValue); + } return true; } $container.find('.date-container').addClass('error'); - $container.find('.time-container').addClass('error'); $container.find('.date-container').first().attr('data-error-text', errorMessage); return false; }; $.fn.dataTable.render.RepositoryDateRangeValueValidator = function($input) { - let $container = $input.parents('.datetime-container'); - let $dateS = $container.find('.start-time input.date-part'); - let $dateE = $container.find('.end-time input.date-part'); + const $container = $input.parents('.datetime-container'); + const $dateS = $container.find('.datetime.start'); + const $dateE = $container.find('.datetime.end'); + const $submitField = $container.find('.column-range'); let isValid = true; let errorMessage; - let endTime; let startTime; + let endTime; + if ($input.val()) { - startTime = new Date(JSON.parse($input.val()).start_time); - endTime = new Date(JSON.parse($input.val()).end_time); + startTime = new Date($dateS.val()); + endTime = new Date($dateE.val()); } if (($dateS.val() === '') !== ($dateE.val() === '')) { @@ -160,6 +155,14 @@ $.fn.dataTable.render.RepositoryDateRangeValueValidator = function($input) { } if (isValid) { + const oldValue = $submitField.val(); + let newValue; + if ($dateS.val() && $dateE.val()) { + newValue = JSON.stringify({ start_time: $dateS.val(), end_time: $dateE.val() }); + } + if (oldValue !== newValue) { + $submitField.val(newValue); + } return true; } @@ -169,24 +172,40 @@ $.fn.dataTable.render.RepositoryDateRangeValueValidator = function($input) { }; $.fn.dataTable.render.RepositoryTimeRangeValueValidator = function($input) { - let $container = $input.parents('.datetime-container'); - let $timeS = $container.find('.start-time input.time-part'); - let $timeE = $container.find('.end-time input.time-part'); + const $container = $input.parents('.datetime-container'); + const $dateS = $container.find('.datetime.start'); + const $dateE = $container.find('.datetime.end'); + const $submitField = $container.find('.column-range'); let isValid = true; let errorMessage; + let startTime; + let endTime; - if (($timeS.val() === '') !== ($timeE.val() === '')) { + if ($input.val()) { + startTime = new Date($dateS.val()); + endTime = new Date($dateE.val()); + } + + if (($dateS.val() === '') !== ($dateE.val() === '')) { isValid = false; errorMessage = I18n.t('repositories.table.date_time.errors.set_all_or_none'); - } else if ($timeS.val() > $timeE.val()) { + } else if (endTime < startTime) { isValid = false; errorMessage = I18n.t('repositories.table.date_time.errors.not_valid_range'); } if (isValid) { + const oldValue = $submitField.val(); + let newValue; + if ($dateS.val() && $dateE.val()) { + newValue = JSON.stringify({ start_time: $dateS.val(), end_time: $dateE.val() }); + } + if (oldValue !== newValue) { + $submitField.val(newValue); + } return true; } - $container.find('.time-container').addClass('error'); - $container.find('.time-container').first().attr('data-error-text', errorMessage); + $container.find('.date-container').addClass('error'); + $container.find('.date-container').first().attr('data-error-text', errorMessage); return false; }; diff --git a/app/assets/javascripts/sitewide/date_time_picker.js b/app/assets/javascripts/sitewide/date_time_picker.js index 329a1b1ac..65d63a145 100644 --- a/app/assets/javascripts/sitewide/date_time_picker.js +++ b/app/assets/javascripts/sitewide/date_time_picker.js @@ -54,6 +54,11 @@ $(document).on('mousedown', '[data-toggle="clear-date-time-picker"]', function() { let dt = $(`#${$(this).data('target')}`); + if (dt.data('dateTimePicker')) { + dt.data('dateTimePicker').clearDate(); + return; + } + if (!dt.data('DateTimePicker')) dt.datetimepicker({ useCurrent: false }); dt.data('DateTimePicker').clear(); dt.val(''); diff --git a/app/assets/javascripts/sitewide/filter_dropdown.js b/app/assets/javascripts/sitewide/filter_dropdown.js index 7d9198cc8..cd6fd8f5b 100644 --- a/app/assets/javascripts/sitewide/filter_dropdown.js +++ b/app/assets/javascripts/sitewide/filter_dropdown.js @@ -131,6 +131,14 @@ var filterDropdown = (function() { }); } + function initDateTimePickerComponent() { + const dateTimePickers = document.querySelectorAll('.vue-date-time-picker-filter'); + dateTimePickers.forEach((dateTimePicker) => { + $((`#${dateTimePicker.id}`)).removeClass('vue-date-time-picker-filter'); + window.initDateTimePickerComponent(`#${dateTimePicker.id}`); + }); + } + return { init: function(filtersEnabledFunction) { $filterContainer = $('.filter-container'); @@ -138,6 +146,7 @@ var filterDropdown = (function() { preventDropdownClose(); initApplyButton(); initCloseButton(); + initDateTimePickerComponent(); initSearchField(filtersEnabledFunction); this.toggleFilterMark($filterContainer, filtersEnabled) return $filterContainer; diff --git a/app/assets/stylesheets/experiment/table.scss b/app/assets/stylesheets/experiment/table.scss index f31415f3f..b1ad753ac 100644 --- a/app/assets/stylesheets/experiment/table.scss +++ b/app/assets/stylesheets/experiment/table.scss @@ -467,21 +467,17 @@ .clear-date { cursor: pointer; left: calc(100% - 16px); - position: absolute; + margin-left: auto; + opacity: 0; text-align: center; - top: 0; - visibility: hidden; - width: 16px; + width: 24px; + } - &.open { - visibility: visible; - } + &:hover .clear-date { + opacity: 1; } .date-text { - display: block; - position: relative; - .alert-yellow { color: $brand-warning; margin-left: 4px; @@ -497,7 +493,7 @@ left: 0; position: absolute; top: 0; - width: calc(100% - 16px); + width: calc(100% - 24px); .calendar-due-date { opacity: 0; diff --git a/app/assets/stylesheets/my_modules/protocols/index.scss b/app/assets/stylesheets/my_modules/protocols/index.scss index e15166bc4..2fe153db3 100644 --- a/app/assets/stylesheets/my_modules/protocols/index.scss +++ b/app/assets/stylesheets/my_modules/protocols/index.scss @@ -248,6 +248,10 @@ top: 0; width: 100%; + .dp__input_wrap { + opacity: 0; + } + #calendarDueDate { opacity: 0; } diff --git a/app/assets/stylesheets/navigation/navigator.scss b/app/assets/stylesheets/navigation/navigator.scss index 1b595fd38..e6474e082 100644 --- a/app/assets/stylesheets/navigation/navigator.scss +++ b/app/assets/stylesheets/navigation/navigator.scss @@ -1,4 +1,13 @@ .sci--layout-navigation-navigator { + .handle-mr { + display: block !important; + height: 100%; + opacity: 0; + right: -2px; + top: 0; + } + + .menu-item:not(.active):hover { background-color: var(--sn-super-light-grey); diff --git a/app/assets/stylesheets/repositories.scss b/app/assets/stylesheets/repositories.scss index d6e3a79f1..d25bc7143 100644 --- a/app/assets/stylesheets/repositories.scss +++ b/app/assets/stylesheets/repositories.scss @@ -494,7 +494,7 @@ } .repository-edit-overlay--pagination { - bottom: 0; + bottom: .5rem; height: 5em; line-height: 5em; padding: .5em; diff --git a/app/assets/stylesheets/repository/repository_table.scss b/app/assets/stylesheets/repository/repository_table.scss index 5d96287ae..0258a6008 100644 --- a/app/assets/stylesheets/repository/repository_table.scss +++ b/app/assets/stylesheets/repository/repository_table.scss @@ -349,7 +349,28 @@ } .date-container { - width: 160px; + &.datetime { + width: 240px; + } + + &.time { + width: 120px; + } + + &.date { + width: 200px; + } + + &.error { + &::after { + color: $brand-danger; + content: attr(data-error-text); + font-size: 12px; + margin-top: -4px; + position: absolute; + top: 100%; + } + } } .time-container { diff --git a/app/assets/stylesheets/shared/datetime_picker.scss b/app/assets/stylesheets/shared/datetime_picker.scss index 0cd90c54b..188e66532 100644 --- a/app/assets/stylesheets/shared/datetime_picker.scss +++ b/app/assets/stylesheets/shared/datetime_picker.scss @@ -1,5 +1,202 @@ // scss-lint:disable SelectorDepth NestingDepth +.dp--menu-wrapper { + font-weight: normal; + + .dp__menu, + &.dp__menu { + border: 0; + box-shadow: 0px 4px 16px rgba(35, 31, 32, 0.15) + } + + .dp__action_buttons { + flex: 1; + gap: .5rem; + } + + .dp__active_date { + background-color: var(--sn-science-blue); + } + + .dp__calendar_header_separator { + display: none; + } + + .dp__month_year_wrap { + font-weight: bold; + } + + .dp__month_year_row { + margin-bottom: .5rem; + } + + .dp__menu_inner { + margin: 0 1rem; + padding: 1rem 0; + } + + .dp__time_picker_overlay_container { + padding-bottom: .5rem; + } + + .dp__button_bottom { + background-color: var(--sn-white); + margin-bottom: .5rem; + } + + .dp--tp-wrap { + border-top: 1px solid var(--sn-light-grey); + padding: .5rem 1rem; + + .dp__time_display { + margin: .5rem 0; + } + + .dp__button_bottom { + margin-bottom: 0; + } + } + + .dp__action_cancel { + color: var(--sn-blue); + } + + .dp__action_button { + margin-inline-start: 0; + white-space: nowrap; + } + + .dp__inner_nav { + border-radius: .25rem; + } + + .dp__tp_inline_btn_bar { + height: 2px; + } + + .dp__calendar_item { + display: flex; + justify-content: center; + } + + .dp__btn:hover { + .dp__tp_inline_btn_bar { + background-color: var(--sn-science-blue); + } + } + + .dp__overlay_container { + padding-bottom: .5rem; + } + + .dp--arrow-btn-nav { + display: flex; + height: 40px; + padding: 0; + width: 40px; + + .dp__inner_nav { + height: 40px; + padding: 0; + width: 40px; + } + } +} + +.dp__input_wrap { + .dp__input_icon { + height: 1.5rem; + left: .5rem; + } + + .dp__input { + height: 2.25rem; + line-height: unset; + } +} + +.dp__main.only-time { + .dp--tp-wrap { + border-top: none; + } + + .dp__overlay_container { + padding-bottom: 0; + } +} + +.dp__theme_light { + --dp-background-color: var(--sn-white); + --dp-text-color: var(--sn-black); + --dp-hover-color: var(--sn-super-light-grey); + --dp-hover-text-color: #212121; + --dp-hover-icon-color: #959595; + --dp-primary-color: var(--sn-blue); + --dp-primary-disabled-color: var(--sn-super-light-blue); + --dp-primary-text-color: var(--sn-white); + --dp-secondary-color: var(--sn-grey); + --dp-border-color: var(--sn-light-grey); + --dp-menu-border-color: var(--sn-light-grey); + --dp-border-color-hover: var(--sn-light-grey); + --dp-disabled-color: var(--sn-super-light-grey); + --dp-scroll-bar-background: var(--sn-white); + --dp-scroll-bar-color: var(--sn-grey); + --dp-success-color: var(--sn-blue); + --dp-success-color-disabled: var(--sn-super-light-blue); + --dp-icon-color: var(--sn-black); + --dp-danger-color: var(--sn-delete-red); + --dp-marker-color: var(--sn-delete-red-disabled); + --dp-tooltip-color: var(--sn-super-light-grey); + --dp-disabled-color-text: var(--sn-grey); + --dp-highlight-color: var(--sn-super-light-grey); + --dp-range-between-dates-background-color: var(--dp-hover-color, var(--sn-super-light-grey)); + --dp-range-between-dates-text-color: var(--dp-hover-text-color, var(--sn-black)); + --dp-range-between-border-color: var(--dp-hover-color, var(--sn-super-light-grey)); +} + +:root { + /*General*/ + --dp-font-family: inherit; /*Font family*/ + --dp-border-radius: .25rem; /*Configurable border-radius*/ + --dp-cell-border-radius: .25rem; /*Specific border radius for the calendar cell*/ + --dp-common-transition: all 0.1s ease-in; /*Generic transition applied on buttons and calendar cells*/ + + /*Sizing*/ + --dp-button-height: 2.5rem; /*Size for buttons in overlays*/ + --dp-month-year-row-height: 2.5rem; /*Height of the month-year select row*/ + --dp-month-year-row-button-size: 2.5rem; /*Specific height for the next/previous buttons*/ + --dp-button-icon-height: 1.5rem; /*Icon sizing in buttons*/ + --dp-cell-size: 1.875rem; /*Width and height of calendar cell*/ + --dp-cell-padding: 0rem; /*Padding in the cell*/ + --dp-common-padding: 1rem; /*Common padding used*/ + --dp-input-padding: .3em 2rem .3rem 1rem; /*Padding in the input*/ + --dp-menu-min-width: 276px; /*Adjust the min width of the menu*/ + --dp-action-row-padding: 0 1rem 1rem; /*Adjust padding for the action row*/ + --dp-action-buttons-padding: 0 .625rem; /*Adjust padding for the action buttons in action row*/ + --dp-action-button-height: 1.875rem; /*Adjust height for the action buttons in action row*/ + --dp-row-margin: 2px 0; /*Adjust the spacing between rows in the calendar*/ + --dp-calendar-header-cell-padding: .5rem; /*Adjust padding in calendar header cells*/ + --dp-two-calendars-spacing: .75rem; /*Space between multiple calendars*/ + --dp-overlay-col-padding: .25rem; /*Padding in the overlay column*/ + --dp-time-inc-dec-button-size: 1.5rem; /*Sizing for arrow buttons in the time picker*/ + --dp-menu-padding: 1rem; /*Menu padding*/ + --dp-input-icon-padding: 2rem; /*Padding on the left side of the input if icon is present*/ + + /*Font sizes*/ + --dp-font-size: .875rem; /*Default font-size*/ + --dp-preview-font-size: .75rem; /*Font size of the date preview in the action row*/ + --dp-time-font-size: 1.875rem; /*Font size in the time picker*/ + + /*Transitions*/ + --dp-animation-duration: 0.1s; /*Transition duration*/ + --dp-menu-appear-transition-timing: cubic-bezier(.4, 0, 1, 1); /*Timing on menu appear animation*/ + --dp-transition-timing: ease-out; /*Timing on slide animations*/ +} + + + +// Legacy + .bootstrap-datetimepicker-widget { .glyphicon-calendar { margin: 0; diff --git a/app/assets/stylesheets/shared/filter_dropdown.scss b/app/assets/stylesheets/shared/filter_dropdown.scss index e527cacba..fde85b818 100644 --- a/app/assets/stylesheets/shared/filter_dropdown.scss +++ b/app/assets/stylesheets/shared/filter_dropdown.scss @@ -79,11 +79,6 @@ } } - .datetime-picker-container { - display: inline-block; - width: 46%; - } - .connect-line { display: inline-block; margin: 0 11px; diff --git a/app/controllers/my_modules_controller.rb b/app/controllers/my_modules_controller.rb index b2fdc23d7..19ba3819f 100644 --- a/app/controllers/my_modules_controller.rb +++ b/app/controllers/my_modules_controller.rb @@ -475,11 +475,11 @@ class MyModulesController < ApplicationController if permitted_params[:started_on].present? permitted_params[:started_on] = - Time.zone.strptime(permitted_params[:started_on], I18n.backend.date_format.dup.gsub(/%-/, '%') + ' %H:%M') + Time.zone.strptime(permitted_params[:started_on], '%Y/%m/%d %H:%M') end if permitted_params[:due_date].present? permitted_params[:due_date] = - Time.zone.strptime(permitted_params[:due_date], I18n.backend.date_format.dup.gsub(/%-/, '%') + ' %H:%M') + Time.zone.strptime(permitted_params[:due_date], '%Y/%m/%d %H:%M') end permitted_params diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index e487264cc..f7afbf919 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -69,7 +69,6 @@ class ProjectsController < ApplicationController projects_cards_url: projects_cards_url, title_html: title_html, next_page: cards.next_page, - toolbar_html: render_to_string(partial: 'projects/index/toolbar'), cards_html: render_to_string( partial: 'projects/index/team_projects', locals: { cards: cards, view_mode: params[:view_mode] } diff --git a/app/helpers/sci_form_helper.rb b/app/helpers/sci_form_helper.rb index 9a82d9ed3..914b892fc 100644 --- a/app/helpers/sci_form_helper.rb +++ b/app/helpers/sci_form_helper.rb @@ -94,10 +94,28 @@ module SciFormHelper js_format end + def datetime_picker_format_date_only_vue + js_format = I18n.backend.date_format.dup + js_format.gsub!(/%-d/, 'd') + js_format.gsub!(/%d/, 'dd') + js_format.gsub!(/%-m/, 'M') + js_format.gsub!(/%m/, 'MM') + js_format.gsub!(/%b/, 'MMM') + js_format.gsub!(/%B/, 'MMMM') + js_format.gsub!('%Y', 'yyyy') + js_format + end + # Returns date and time format string for Bootstrap DateTimePicker def datetime_picker_format_full js_format = datetime_picker_format_date_only js_format << ' HH:mm' js_format end + + def datetime_picker_format_full_vue + js_format = datetime_picker_format_date_only_vue + js_format << ' HH:mm' + js_format + end end diff --git a/app/javascript/packs/application.js b/app/javascript/packs/application.js index 8e55b767e..682823548 100644 --- a/app/javascript/packs/application.js +++ b/app/javascript/packs/application.js @@ -10,6 +10,8 @@ require('jquery-ui/ui/effects/effect-slide'); require('hammerjs'); import 'bootstrap'; require('bootstrap-select/js/bootstrap-select'); +import '@vuepic/vue-datepicker/dist/main.css'; +import 'vue3-draggable-resizable/dist/Vue3DraggableResizable.css' window.bwipjs = require('bwip-js'); window.Decimal = require('decimal.js'); diff --git a/app/javascript/packs/application.scss b/app/javascript/packs/application.scss index 848cb108a..ddb003326 100644 --- a/app/javascript/packs/application.scss +++ b/app/javascript/packs/application.scss @@ -1 +1 @@ -@import "bootstrap-select/sass/bootstrap-select" +@import "bootstrap-select/sass/bootstrap-select"; diff --git a/app/javascript/packs/vue/action_toolbar.js b/app/javascript/packs/vue/action_toolbar.js index f2ba89a82..68f2a382a 100644 --- a/app/javascript/packs/vue/action_toolbar.js +++ b/app/javascript/packs/vue/action_toolbar.js @@ -1,20 +1,18 @@ /* global notTurbolinksPreview */ -import TurbolinksAdapter from 'vue-turbolinks'; -import Vue from 'vue/dist/vue.esm'; +import { createApp } from 'vue/dist/vue.esm-bundler.js'; import ActionToolbar from '../../vue/components/action_toolbar.vue'; - -Vue.use(TurbolinksAdapter); -Vue.prototype.i18n = window.I18n; +import { mountWithTurbolinks } from './helpers/turbolinks.js'; window.initActionToolbar = () => { if (window.actionToolbarComponent) return; + if (notTurbolinksPreview()) { - new Vue({ - el: '#actionToolbar', - components: { - ActionToolbar - } + const app = createApp({}); + app.component('ActionToolbar', ActionToolbar); + app.config.globalProperties.i18n = window.I18n; + mountWithTurbolinks(app, '#actionToolbar', () => { + window.actionToolbarComponent = null }); } } diff --git a/app/javascript/packs/vue/assign_items_to_task_modal.js b/app/javascript/packs/vue/assign_items_to_task_modal.js index e21c428ba..e51e5b0d0 100644 --- a/app/javascript/packs/vue/assign_items_to_task_modal.js +++ b/app/javascript/packs/vue/assign_items_to_task_modal.js @@ -1,22 +1,14 @@ -import TurbolinksAdapter from 'vue-turbolinks'; -import Vue from 'vue/dist/vue.esm'; -import AssignItemsToTaskModalContainer from '../../vue/assign_items_to_tasks_modal/container.vue'; -import PerfectScrollbar from 'vue2-perfect-scrollbar'; -import 'vue2-perfect-scrollbar/dist/vue2-perfect-scrollbar.css'; -Vue.use(TurbolinksAdapter); -Vue.use(PerfectScrollbar); -Vue.prototype.i18n = window.I18n; +import PerfectScrollbar from 'vue3-perfect-scrollbar'; +import { createApp } from 'vue/dist/vue.esm-bundler.js'; +import 'vue3-perfect-scrollbar/dist/vue3-perfect-scrollbar.css'; +import AssignItemsToTaskModalContainer from '../../vue/assign_items_to_tasks_modal/container.vue'; +import { mountWithTurbolinks } from './helpers/turbolinks.js'; function initAssignItemsToTaskModalComponent() { const container = $('.assign-items-to-task-modal-container'); if (container.length) { - window.AssignItemsToTaskModalComponentContainer = new Vue({ - el: '.assign-items-to-task-modal-container', - name: 'AssignItemsToTaskModalComponent', - components: { - 'assign-items-to-task-modal-container': AssignItemsToTaskModalContainer - }, + const app = createApp({ data() { return { visibility: false, @@ -39,6 +31,10 @@ function initAssignItemsToTaskModalComponent() { } } }); + app.component('AssignItemsToTaskModalContainer', AssignItemsToTaskModalContainer); + app.use(PerfectScrollbar); + app.config.globalProperties.i18n = window.I18n; + window.AssignItemsToTaskModalComponentContainer = mountWithTurbolinks(app, '.assign-items-to-task-modal-container'); } } diff --git a/app/javascript/packs/vue/directives/outside_click.js b/app/javascript/packs/vue/directives/outside_click.js deleted file mode 100644 index 6265c4adc..000000000 --- a/app/javascript/packs/vue/directives/outside_click.js +++ /dev/null @@ -1,34 +0,0 @@ -// Use this to register outside-click directive on a Vue component -// eslint-disable-next-line max-len -// eg v-click-outside="{handler: 'handlerToTrigger', exclude: [refs to ignore on click (eg 'searchInput', 'searchInputBtn')]}" -// eslint-enable-next-line max-len - -export default { - bind(el, binding, vnode) { - el._vueClickOutside_ = (e) => { - let clickedOnExcludedEl = false; - const { exclude } = binding.value; - exclude.forEach(refName => { - if (!clickedOnExcludedEl) { - const excludedEl = vnode.context.$refs[refName]; - if (!excludedEl) return; - - clickedOnExcludedEl = (excludedEl._isVue ? excludedEl.$el : excludedEl).contains(e.target); - } - }); - - if (!el.contains(e.target) && !clickedOnExcludedEl) { - const { handler } = binding.value; - vnode.context[handler](); - } - }; - - document.addEventListener('click', el._vueClickOutside_); - document.addEventListener('touchstart', el._vueClickOutside_); - }, - unbind(el) { - document.removeEventListener('click', el._vueClickOutside_); - document.removeEventListener('touchstart', el._vueClickOutside_); - el._vueClickOutside_ = null; - } -}; diff --git a/app/javascript/packs/vue/export_stock_consumption_modal.js b/app/javascript/packs/vue/export_stock_consumption_modal.js index aecb22792..06de24354 100644 --- a/app/javascript/packs/vue/export_stock_consumption_modal.js +++ b/app/javascript/packs/vue/export_stock_consumption_modal.js @@ -1,21 +1,15 @@ /* global notTurbolinksPreview */ - -import TurbolinksAdapter from 'vue-turbolinks'; -import Vue from 'vue/dist/vue.esm'; +import { createApp } from 'vue/dist/vue.esm-bundler.js'; import ExportStockConsumptionModal from '../../vue/repository_row/export_stock_consumption_modal.vue'; - -Vue.use(TurbolinksAdapter); -Vue.prototype.i18n = window.I18n; +import { mountWithTurbolinks } from './helpers/turbolinks.js'; window.initExportStockConsumptionModal = () => { if (window.exportStockConsumptionModalComponent) return; if (notTurbolinksPreview()) { - new Vue({ - el: '#exportStockConsumtionModal', - components: { - ExportStockConsumptionModal, - }, - }); + const app = createApp({}); + app.component('ExportStockConsumptionModal', ExportStockConsumptionModal); + app.config.globalProperties.i18n = window.I18n; + mountWithTurbolinks(app, '#exportStockConsumtionModal'); } }; diff --git a/app/javascript/packs/vue/helpers/turbolinks.js b/app/javascript/packs/vue/helpers/turbolinks.js new file mode 100644 index 000000000..259ceb4c8 --- /dev/null +++ b/app/javascript/packs/vue/helpers/turbolinks.js @@ -0,0 +1,15 @@ +function mountWithTurbolinks(app, target, callback = null) { + const originalHtml = document.querySelector(target).innerHTML; + + document.addEventListener('turbolinks:before-cache', () => { + app.unmount(); + if (document.querySelector(target)) { + document.querySelector(target).innerHTML = originalHtml; + } + if (callback) callback(); + }, { once: true }); + + return app.mount(target); +} + +export { mountWithTurbolinks }; diff --git a/app/javascript/packs/vue/label_template.js b/app/javascript/packs/vue/label_template.js index b2d70132f..135184800 100644 --- a/app/javascript/packs/vue/label_template.js +++ b/app/javascript/packs/vue/label_template.js @@ -1,17 +1,9 @@ -import TurbolinksAdapter from 'vue-turbolinks'; -import Vue from 'vue/dist/vue.esm'; +import { createApp } from 'vue/dist/vue.esm-bundler.js'; import LabelTemplateContainer from '../../vue/label_template/container.vue'; - -Vue.use(TurbolinksAdapter); -Vue.prototype.i18n = window.I18n; +import { mountWithTurbolinks } from './helpers/turbolinks.js'; window.initLabelTemplateComponent = () => { - - new Vue({ - el: '#labelTemplateContainer', - components: { - 'label-template-container': LabelTemplateContainer - }, + const app = createApp({ data() { return { labelTemplateUrl: $('#labelTemplateContainer').data('label-template-url'), @@ -21,6 +13,9 @@ window.initLabelTemplateComponent = () => { }; } }); + app.component('LabelTemplateContainer', LabelTemplateContainer); + app.config.globalProperties.i18n = window.I18n; + mountWithTurbolinks(app, '#labelTemplateContainer'); }; initLabelTemplateComponent(); diff --git a/app/javascript/packs/vue/legacy/datetime_picker.js b/app/javascript/packs/vue/legacy/datetime_picker.js new file mode 100644 index 000000000..490fec4f5 --- /dev/null +++ b/app/javascript/packs/vue/legacy/datetime_picker.js @@ -0,0 +1,79 @@ +import { createApp } from 'vue/dist/vue.esm-bundler.js'; +import DateTimePicker from '../../../vue/shared/date_time_picker.vue'; +import { mountWithTurbolinks } from '../helpers/turbolinks.js'; +/* +
+ + +
+*/ + +window.initDateTimePickerComponent = (id) => { + const app = createApp({ + data() { + return { + date: null, + onChange: null + }; + }, + mounted() { + if (this.$refs.input.dataset.default) { + const defaultDate = new Date(this.$refs.input.dataset.default.replace(/([^!\s])-/g, '$1/')); // Safari fix + this.date = this.formatDate(defaultDate); + this.$refs.vueDateTime.manualUpdate = true; + this.$refs.vueDateTime.datetime = defaultDate; + } else if (this.date) { + this.$refs.vueDateTime.manualUpdate = true; + this.$refs.vueDateTime.datetime = new Date(this.date); + } + + $(this.$refs.input).data('dateTimePicker', this); + $(this.$el.parentElement).parent().trigger('dp:ready'); + }, + methods: { + formatDate(date) { + if (this.$refs.input.dataset.simpleFormat) { + const y = date.getFullYear(); + const m = date.getMonth() + 1; + const d = date.getDate(); + const hours = date.getHours(); + const mins = date.getMinutes(); + return `${y}/${m}/${d} ${hours}:${mins}`; + } + return date.toISOString(); + }, + updateDate(date) { + this.date = this.formatDate(date); + this.$nextTick(() => { + if (this.onChange) this.onChange(date); + }); + + }, + setDate(date) { + this.date = this.formatDate(date); + this.$refs.vueDateTime.manualUpdate = true; + this.$refs.vueDateTime.datetime = date; + this.$nextTick(() => { + if (this.onChange) this.onChange(date); + }); + }, + clearDate() { + this.date = null; + this.$refs.vueDateTime.datetime = null; + this.$nextTick(() => { + if (this.onChange) this.onChange(null); + }); + } + } + }); + app.component('DateTimePicker', DateTimePicker); + app.config.globalProperties.i18n = window.I18n; + mountWithTurbolinks(app, id); +}; + +document.addEventListener('turbolinks:load', () => { + const dateTimePickers = document.querySelectorAll('.vue-date-time-picker'); + dateTimePickers.forEach((dateTimePicker) => { + window.initDateTimePickerComponent(`#${dateTimePicker.id}`); + }); +}) \ No newline at end of file diff --git a/app/javascript/packs/vue/navigation/breadcrumbs.js b/app/javascript/packs/vue/navigation/breadcrumbs.js index 0aa144294..e2cbd7bbc 100644 --- a/app/javascript/packs/vue/navigation/breadcrumbs.js +++ b/app/javascript/packs/vue/navigation/breadcrumbs.js @@ -1,17 +1,13 @@ -import TurbolinksAdapter from 'vue-turbolinks'; -import Vue from 'vue/dist/vue.esm'; + +import PerfectScrollbar from 'vue3-perfect-scrollbar'; +import { createApp } from 'vue/dist/vue.esm-bundler.js'; +import 'vue3-perfect-scrollbar/dist/vue3-perfect-scrollbar.css'; import Breadcrumbs from '../../../vue/navigation/breadcrumbs/breadcrumbs.vue'; -import PerfectScrollbar from 'vue2-perfect-scrollbar'; -import 'vue2-perfect-scrollbar/dist/vue2-perfect-scrollbar.css'; +import { mountWithTurbolinks } from '../helpers/turbolinks.js'; -Vue.use(TurbolinksAdapter); -Vue.use(PerfectScrollbar); -Vue.prototype.i18n = window.I18n; -window.breadcrumbsComponent = new Vue({ - el: '#breadcrumbs', - name: 'BreadcrumbsContainer', - components: { - breadcrumbs: Breadcrumbs - } -}); +const app = createApp({}); +app.component('Breadcrumbs', Breadcrumbs); +app.use(PerfectScrollbar); +app.config.globalProperties.i18n = window.I18n; +window.breadcrumbsComponent = mountWithTurbolinks(app, '#breadcrumbs'); diff --git a/app/javascript/packs/vue/navigation/navigator.js b/app/javascript/packs/vue/navigation/navigator.js index 92b487f43..3b3c7afad 100644 --- a/app/javascript/packs/vue/navigation/navigator.js +++ b/app/javascript/packs/vue/navigation/navigator.js @@ -1,19 +1,10 @@ - -import Vue from 'vue/dist/vue.esm'; +import PerfectScrollbar from 'vue3-perfect-scrollbar'; +import { createApp } from 'vue/dist/vue.esm-bundler.js'; +import 'vue3-perfect-scrollbar/dist/vue3-perfect-scrollbar.css'; import NavigatorContainer from '../../../vue/navigation/navigator.vue'; -import PerfectScrollbar from 'vue2-perfect-scrollbar'; -import 'vue2-perfect-scrollbar/dist/vue2-perfect-scrollbar.css'; - -Vue.use(PerfectScrollbar); - -Vue.prototype.i18n = window.I18n; function addNavigationNavigatorContainer() { - let navigator = new Vue({ - el: '#sciNavigationNavigatorContainer', - components: { - 'navigator-container': NavigatorContainer - }, + const app = createApp({ data() { return { reloadCurrentLevel: false, @@ -53,8 +44,10 @@ function addNavigationNavigatorContainer() { } } }); - - window.navigatorContainer = navigator + app.component('NavigatorContainer', NavigatorContainer); + app.use(PerfectScrollbar); + app.config.globalProperties.i18n = window.I18n; + window.navigatorContainer = app.mount('#sciNavigationNavigatorContainer'); } if (document.readyState !== 'loading') { diff --git a/app/javascript/packs/vue/navigation/top_menu.js b/app/javascript/packs/vue/navigation/top_menu.js index 30b71f63d..5b2d92e4d 100644 --- a/app/javascript/packs/vue/navigation/top_menu.js +++ b/app/javascript/packs/vue/navigation/top_menu.js @@ -1,21 +1,14 @@ - -import Vue from 'vue/dist/vue.esm'; +import PerfectScrollbar from 'vue3-perfect-scrollbar'; +import { createApp } from 'vue/dist/vue.esm-bundler.js'; +import 'vue3-perfect-scrollbar/dist/vue3-perfect-scrollbar.css'; import TopMenuContainer from '../../../vue/navigation/top_menu.vue'; -import PerfectScrollbar from 'vue2-perfect-scrollbar'; -import 'vue2-perfect-scrollbar/dist/vue2-perfect-scrollbar.css'; -import outsideClick from '../directives/outside_click'; - -Vue.use(PerfectScrollbar); -Vue.directive('click-outside', outsideClick); -Vue.prototype.i18n = window.I18n; function addNavigationTopMenuContainer() { - new Vue({ - el: '#sciNavigationTopMenuContainer', - components: { - 'top-menu-container': TopMenuContainer - } - }); + const app = createApp({}); + app.component('TopMenuContainer', TopMenuContainer); + app.use(PerfectScrollbar); + app.config.globalProperties.i18n = window.I18n; + app.mount('#sciNavigationTopMenuContainer'); } if (document.readyState !== 'loading') { diff --git a/app/javascript/packs/vue/open_vector_editor.js b/app/javascript/packs/vue/open_vector_editor.js index c8ca74ac9..145b99c8c 100644 --- a/app/javascript/packs/vue/open_vector_editor.js +++ b/app/javascript/packs/vue/open_vector_editor.js @@ -1,11 +1,8 @@ -import TurbolinksAdapter from 'vue-turbolinks'; -import Vue from 'vue/dist/vue.esm'; +import { createApp } from 'vue/dist/vue.esm-bundler.js'; import OpenVectorEditor from '../../vue/ove/OpenVectorEditor.vue'; +import { mountWithTurbolinks } from './helpers/turbolinks.js'; -Vue.use(TurbolinksAdapter); -Vue.prototype.i18n = window.I18n; - -new Vue({ - el: '#open-vector-editor', - components: { OpenVectorEditor } -}); +const app = createApp({}); +app.component('OpenVectorEditor', OpenVectorEditor); +app.config.globalProperties.i18n = window.I18n; +mountWithTurbolinks(app, '#open-vector-editor'); diff --git a/app/javascript/packs/vue/protocol.js b/app/javascript/packs/vue/protocol.js index 70003dfa0..08e28408a 100644 --- a/app/javascript/packs/vue/protocol.js +++ b/app/javascript/packs/vue/protocol.js @@ -1,21 +1,25 @@ /* global HelperModule */ -import TurbolinksAdapter from 'vue-turbolinks'; -import Vue from 'vue/dist/vue.esm'; +import PerfectScrollbar from 'vue3-perfect-scrollbar'; +import { createApp } from 'vue/dist/vue.esm-bundler.js'; import ProtocolContainer from '../../vue/protocol/container.vue'; -import PerfectScrollbar from 'vue2-perfect-scrollbar'; -import outsideClick from './directives/outside_click'; - - -Vue.use(PerfectScrollbar); -Vue.use(TurbolinksAdapter); -Vue.directive('click-outside', outsideClick); -Vue.prototype.i18n = window.I18n; -Vue.prototype.inlineEditing = window.inlineEditing; -Vue.prototype.ActiveStoragePreviews = window.ActiveStoragePreviews; +import { mountWithTurbolinks } from './helpers/turbolinks.js'; window.initProtocolComponent = () => { - Vue.prototype.dateFormat = $('#protocolContainer').data('date-format'); + const app = createApp({ + data() { + return { + protocolUrl: $('#protocolContainer').data('protocol-url'), + }; + }, + }); + app.component('ProtocolContainer', ProtocolContainer); + app.use(PerfectScrollbar); + app.config.globalProperties.i18n = window.I18n; + app.config.globalProperties.inlineEditing = window.inlineEditing; + app.config.globalProperties.ActiveStoragePreviews = window.ActiveStoragePreviews; + app.config.globalProperties.dateFormat = $('#protocolContainer').data('date-format'); + mountWithTurbolinks(app, '#protocolContainer'); $('.protocols-show').on('click', '#protocol-versions-modal .delete-draft', (e) => { const url = e.currentTarget.dataset.url; @@ -28,18 +32,6 @@ window.initProtocolComponent = () => { $('#deleteDraftModal form').on('ajax:error', function(_ev, data) { HelperModule.flashAlertMsg(data.responseJSON.message, 'danger'); }); - - new Vue({ - el: '#protocolContainer', - components: { - 'protocol-container': ProtocolContainer - }, - data() { - return { - protocolUrl: $('#protocolContainer').data('protocol-url') - }; - } - }); }; initProtocolComponent(); diff --git a/app/javascript/packs/vue/protocol_file_import_modal.js b/app/javascript/packs/vue/protocol_file_import_modal.js index 8e7acc245..c8ba7fcc7 100644 --- a/app/javascript/packs/vue/protocol_file_import_modal.js +++ b/app/javascript/packs/vue/protocol_file_import_modal.js @@ -1,18 +1,12 @@ -import TurbolinksAdapter from 'vue-turbolinks'; -import Vue from 'vue/dist/vue.esm'; +import { createApp } from 'vue/dist/vue.esm-bundler.js'; import ProtocolFileImportModal from '../../vue/protocol_import/file_import_modal.vue'; - - -Vue.use(TurbolinksAdapter); -Vue.prototype.i18n = window.I18n; +import { mountWithTurbolinks } from './helpers/turbolinks.js'; window.initProtocolFileImportModalComponent = () => { - new Vue({ - el: '#protocolFileImportModal', - components: { - 'protocol-file-import-modal': ProtocolFileImportModal - } - }); + const app = createApp({}); + app.component('ProtocolFileImportModal', ProtocolFileImportModal); + app.config.globalProperties.i18n = window.I18n; + mountWithTurbolinks(app, '#protocolFileImportModal'); }; initProtocolFileImportModalComponent(); diff --git a/app/javascript/packs/vue/repository_filter.js b/app/javascript/packs/vue/repository_filter.js index 9688583e3..10cbc6f01 100644 --- a/app/javascript/packs/vue/repository_filter.js +++ b/app/javascript/packs/vue/repository_filter.js @@ -1,11 +1,8 @@ /* global I18n */ -import TurbolinksAdapter from 'vue-turbolinks'; -import Vue from 'vue/dist/vue.esm'; +import { createApp } from 'vue/dist/vue.esm-bundler.js'; import FilterContainer from '../../vue/repository_filter/container.vue'; - -Vue.use(TurbolinksAdapter); -Vue.prototype.i18n = window.I18n; +import { mountWithTurbolinks } from './helpers/turbolinks.js'; const DEFAULT_FILTERS = [ { @@ -62,7 +59,6 @@ const DEFAULT_FILTERS = [ window.repositoryFilterObject = null; window.initRepositoryFilter = () => { - Vue.prototype.dateFormat = $('#filterContainer').data('date-format') const defaultColumns = [ { id: 'assigned', name: I18n.t('repositories.table.assigned_tasks'), data_type: 'RepositoryMyModuleValue' }, { id: 'row_id', name: I18n.t('repositories.table.id'), data_type: 'RepositoryTextValue' }, @@ -73,8 +69,7 @@ window.initRepositoryFilter = () => { { id: 'archived_on', name: I18n.t('repositories.table.archived_on'), data_type: 'RepositoryDateTimeValue' } ]; const defFilters = JSON.parse(JSON.stringify(DEFAULT_FILTERS)); - const repositoryFilterContainer = new Vue({ - el: '#filterContainer', + const app = createApp({ data: () => ({ filters: [], defaultFilters: DEFAULT_FILTERS, @@ -86,10 +81,19 @@ window.initRepositoryFilter = () => { }), created() { this.dataTableElement = $($('#filterContainer').data('datatable-id')); - }, - components: { - 'filter-container': FilterContainer + $.get($('#filterContainer').data('my-modules-url'), (data) => { + this.my_modules = data.data; + }); + + $.get($('#filterContainer').data('columns-url'), (data) => { + const combinedColumns = data.response.concat(defaultColumns); + this.columns = combinedColumns.sort((a, b) => a.name > b.name ? 1 : -1); + }); + + $.get($('#filterContainer').data('saved-filters-url'), (data) => { + this.savedFilters = data.data; + }); }, computed: { filtersJSON() { @@ -144,19 +148,10 @@ window.initRepositoryFilter = () => { } } }); - - $.get($('#filterContainer').data('my-modules-url'), (data) => { - repositoryFilterContainer.my_modules = data.data; - }); - - $.get($('#filterContainer').data('columns-url'), (data) => { - const combinedColumns = data.response.concat(defaultColumns); - repositoryFilterContainer.columns = combinedColumns.sort((a, b) => a.name > b.name ? 1 : -1); - }); - - $.get($('#filterContainer').data('saved-filters-url'), (data) => { - repositoryFilterContainer.savedFilters = data.data; - }); + app.component('FilterContainer', FilterContainer); + app.config.globalProperties.i18n = window.I18n; + app.config.globalProperties.dateFormat = $('#filterContainer').data('date-format'); + window.repositoryFilterObject = mountWithTurbolinks(app, '#filterContainer'); $('#filterContainer').on('click', (e) => { $('#filterContainer .dropdown-selector-container').removeClass('open') @@ -166,6 +161,4 @@ window.initRepositoryFilter = () => { $('#filtersDropdownButton').on('show.bs.dropdown', () => { $('#filtersColumnsDropdown, #savedFiltersContainer').removeClass('open'); }); - - window.repositoryFilterObject = repositoryFilterContainer; }; diff --git a/app/javascript/packs/vue/repository_item_sidebar.js b/app/javascript/packs/vue/repository_item_sidebar.js index 427572f8a..8a87ad977 100644 --- a/app/javascript/packs/vue/repository_item_sidebar.js +++ b/app/javascript/packs/vue/repository_item_sidebar.js @@ -1,11 +1,13 @@ /* global notTurbolinksPreview */ +import { createApp } from 'vue/dist/vue.esm-bundler.js'; import TurbolinksAdapter from 'vue-turbolinks'; import Vue from 'vue/dist/vue.esm'; import 'vue2-perfect-scrollbar/dist/vue2-perfect-scrollbar.css'; import PerfectScrollbar from 'vue2-perfect-scrollbar'; import RepositoryItemSidebar from '../../vue/repository_item_sidebar/RepositoryItemSidebar.vue'; import outsideClick from './directives/outside_click'; +import { mountWithTurbolinks } from './helpers/turbolinks.js'; Vue.use(TurbolinksAdapter); Vue.directive('click-outside', outsideClick); @@ -13,12 +15,10 @@ Vue.use(PerfectScrollbar); Vue.prototype.i18n = window.I18n; function initRepositoryItemSidebar() { - new Vue({ - el: '#repositoryItemSidebar', - components: { - RepositoryItemSidebar - } - }); + const app = createApp({}); + app.component('RepositoryItemSidebar', RepositoryItemSidebar); + app.config.globalProperties.i18n = window.I18n; + mountWithTurbolinks(app, '#repositoryItemSidebar'); } initRepositoryItemSidebar(); diff --git a/app/javascript/packs/vue/repository_print_modal.js b/app/javascript/packs/vue/repository_print_modal.js index e76fdeaf9..064ee2dc5 100644 --- a/app/javascript/packs/vue/repository_print_modal.js +++ b/app/javascript/packs/vue/repository_print_modal.js @@ -1,19 +1,11 @@ -import TurbolinksAdapter from 'vue-turbolinks'; -import Vue from 'vue/dist/vue.esm'; +import { createApp } from 'vue/dist/vue.esm-bundler.js'; import PrintModalContainer from '../../vue/repository_print_modal/container.vue'; - -Vue.use(TurbolinksAdapter); -Vue.prototype.i18n = window.I18n; +import { mountWithTurbolinks } from './helpers/turbolinks.js'; function initPrintModalComponent() { const container = $('.print-label-modal-container'); if (container.length) { - window.PrintModalComponent = new Vue({ - el: '.print-label-modal-container', - name: 'PrintModalComponent', - components: { - 'print-modal-container': PrintModalContainer - }, + const app = createApp({ data() { return { showModal: false, @@ -36,6 +28,9 @@ function initPrintModalComponent() { } } }); + app.component('PrintModalContainer', PrintModalContainer); + app.config.globalProperties.i18n = window.I18n; + mountWithTurbolinks(app, '.print-label-modal-container'); } } diff --git a/app/javascript/packs/vue/repository_search.js b/app/javascript/packs/vue/repository_search.js index 14eb2a225..7859450f9 100644 --- a/app/javascript/packs/vue/repository_search.js +++ b/app/javascript/packs/vue/repository_search.js @@ -1,16 +1,13 @@ -import TurbolinksAdapter from 'vue-turbolinks'; -import Vue from 'vue/dist/vue.esm'; +import { createApp } from 'vue/dist/vue.esm-bundler.js'; import RepositorySearchContainer from '../../vue/repository_search/container.vue'; +import { mountWithTurbolinks } from './helpers/turbolinks.js'; Vue.use(TurbolinksAdapter); Vue.prototype.i18n = window.I18n; window.initRepositorySearch = () => { - window.RepositorySearchComponent = new Vue({ - el: '#inventorySearchComponent', - name: 'RepositorySearchComponent', - components: { - 'repository_search_container': RepositorySearchContainer - } - }); + const app = createApp({}); + app.component('RepositorySearchContainer', RepositorySearchContainer); + app.config.globalProperties.i18n = window.I18n; + mountWithTurbolinks(app, '#inventorySearchComponent'); } diff --git a/app/javascript/packs/vue/results.js b/app/javascript/packs/vue/results.js index b16bbcbdf..fc0d84640 100644 --- a/app/javascript/packs/vue/results.js +++ b/app/javascript/packs/vue/results.js @@ -1,19 +1,11 @@ -import TurbolinksAdapter from 'vue-turbolinks'; -import Vue from 'vue/dist/vue.esm'; +import PerfectScrollbar from 'vue3-perfect-scrollbar'; +import { createApp } from 'vue/dist/vue.esm-bundler.js'; import Results from '../../vue/results/results.vue'; -import PerfectScrollbar from 'vue2-perfect-scrollbar'; -import outsideClick from './directives/outside_click'; +import { mountWithTurbolinks } from './helpers/turbolinks.js'; - -Vue.use(PerfectScrollbar); -Vue.use(TurbolinksAdapter); -Vue.directive('click-outside', outsideClick); -Vue.prototype.i18n = window.I18n; -Vue.prototype.ActiveStoragePreviews = window.ActiveStoragePreviews; - -new Vue({ - el: '#results', - components: { - Results - } -}); +const app = createApp({}); +app.component('Results', Results); +app.use(PerfectScrollbar); +app.config.globalProperties.i18n = window.I18n; +app.config.globalProperties.ActiveStoragePreviews = window.ActiveStoragePreviews; +mountWithTurbolinks(app, '#results'); diff --git a/app/javascript/packs/vue/share_task_container.js b/app/javascript/packs/vue/share_task_container.js index 5c463b8cf..a99cb2774 100644 --- a/app/javascript/packs/vue/share_task_container.js +++ b/app/javascript/packs/vue/share_task_container.js @@ -1,20 +1,14 @@ -import Vue from 'vue/dist/vue.esm'; +import PerfectScrollbar from 'vue3-perfect-scrollbar'; +import { createApp } from 'vue/dist/vue.esm-bundler.js'; +import 'vue3-perfect-scrollbar/dist/vue3-perfect-scrollbar.css'; import ShareLinkContainer from '../../vue/shareable_links/container.vue'; -import PerfectScrollbar from 'vue2-perfect-scrollbar'; -import 'vue2-perfect-scrollbar/dist/vue2-perfect-scrollbar.css'; - - -Vue.use(PerfectScrollbar); - -Vue.prototype.i18n = window.I18n; function initShareTaskContainer() { - new Vue({ - el: '.share-task-container', - components: { - 'share-task-container': ShareLinkContainer - } - }); + const app = createApp({}); + app.component('ShareLinkContainer', ShareLinkContainer); + app.use(PerfectScrollbar); + app.config.globalProperties.i18n = window.I18n; + app.mount('.share-task-container'); } initShareTaskContainer(); diff --git a/app/javascript/vue/assign_items_to_tasks_modal/container.vue b/app/javascript/vue/assign_items_to_tasks_modal/container.vue index aed6d0568..f1ed120c8 100644 --- a/app/javascript/vue/assign_items_to_tasks_modal/container.vue +++ b/app/javascript/vue/assign_items_to_tasks_modal/container.vue @@ -184,7 +184,7 @@ export default { this.$emit("close"); }); }, - beforeDestroy() { + beforeUnmount() { delete window.AssignItemsToTaskModalComponent; }, computed: { diff --git a/app/javascript/vue/components/action_toolbar.vue b/app/javascript/vue/components/action_toolbar.vue index 6564ac3f2..aa514b51a 100644 --- a/app/javascript/vue/components/action_toolbar.vue +++ b/app/javascript/vue/components/action_toolbar.vue @@ -111,7 +111,7 @@ this.$nextTick(this.setWidth); window.addEventListener('scroll', this.setLeftOffset); }, - beforeDestroy() { + beforeUnmount() { delete window.actionToolbarComponent; window.removeEventListener('scroll', this.setLeftOffset); }, diff --git a/app/javascript/vue/mixins/moduleNameObserver.js b/app/javascript/vue/mixins/moduleNameObserver.js index 66eb09545..afd67079d 100644 --- a/app/javascript/vue/mixins/moduleNameObserver.js +++ b/app/javascript/vue/mixins/moduleNameObserver.js @@ -14,7 +14,7 @@ export default { mounted() { this.observeChanges(); }, - beforeDestroy() { + beforeUnmount() { if (this.observer) { this.observer.disconnect(); } diff --git a/app/javascript/vue/mixins/stackableHeadersMixin.js b/app/javascript/vue/mixins/stackableHeadersMixin.js index f5ede8597..a76ce76a1 100644 --- a/app/javascript/vue/mixins/stackableHeadersMixin.js +++ b/app/javascript/vue/mixins/stackableHeadersMixin.js @@ -35,7 +35,7 @@ export default { this.handleTinyMCEOpened(e.detail.target); }); }, - beforeDestroy() { + beforeUnmount() { if (this.resizeObserver) { this.resizeObserver.disconnect(); } diff --git a/app/javascript/vue/navigation/breadcrumbs/breadcrumbs_dropdown.vue b/app/javascript/vue/navigation/breadcrumbs/breadcrumbs_dropdown.vue index c0b3aa507..8a01e9447 100644 --- a/app/javascript/vue/navigation/breadcrumbs/breadcrumbs_dropdown.vue +++ b/app/javascript/vue/navigation/breadcrumbs/breadcrumbs_dropdown.vue @@ -38,7 +38,7 @@ diff --git a/app/javascript/vue/shared/date_time_picker.vue b/app/javascript/vue/shared/date_time_picker.vue index 0aef7791a..c3ac6d5a2 100644 --- a/app/javascript/vue/shared/date_time_picker.vue +++ b/app/javascript/vue/shared/date_time_picker.vue @@ -1,36 +1,60 @@ diff --git a/app/views/experiments/_table_due_date.html.erb b/app/views/experiments/_table_due_date.html.erb index 525a583cf..2f0004a66 100644 --- a/app/views/experiments/_table_due_date.html.erb +++ b/app/views/experiments/_table_due_date.html.erb @@ -3,28 +3,18 @@
- <%= render partial: "experiments/table_due_date_label" , locals: { my_module: my_module, user: user } %> <% if due_date_editable %> -
- +
+ +
-
diff --git a/app/views/global_activities/_date_picker.html.erb b/app/views/global_activities/_date_picker.html.erb index 12b5e376f..cf9431b5e 100644 --- a/app/views/global_activities/_date_picker.html.erb +++ b/app/views/global_activities/_date_picker.html.erb @@ -1,14 +1,12 @@ -
- <% if label %> - - <% end %> - - - - <%= javascript_include_tag 'global_activities/date_picker' %> - +
+
+ <% selected_date = '' %> + <% selected_date = setDate if defined?(setDate) %> + <% selected_date = use_current %> + <% if label %> + + <% end %> + + +
diff --git a/app/views/label_templates/index.html.erb b/app/views/label_templates/index.html.erb index ee499e6c6..9f2ac4c16 100644 --- a/app/views/label_templates/index.html.erb +++ b/app/views/label_templates/index.html.erb @@ -4,11 +4,6 @@ <%= content_for :sidebar do %> <%= render partial: "/shared/sidebar/templates_sidebar", locals: {active: :label} %> <% end %> - - <% content_for :head do %> - - <% end %> - <%= stylesheet_link_tag 'datatables' %> diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 79d372aaf..2282e06e2 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -24,6 +24,7 @@ <%= javascript_include_tag 'application' %> <%= javascript_include_tag 'session_end' %> <%= javascript_include_tag 'sidebar_toggle' %> + <%= stylesheet_link_tag 'application_pack', media: 'all' %> <%= stylesheet_link_tag 'application', media: 'all' %> @@ -55,6 +56,8 @@ <%= stylesheet_link_tag 'tui_image_editor_styles' %> <%= javascript_include_tag 'vue_navigation_navigator' %> <%= javascript_include_tag 'vue_navigation_top_menu' %> + <%= javascript_include_tag 'vue_legacy_datetime_picker' %> + > diff --git a/app/views/my_modules/_due_date.html.erb b/app/views/my_modules/_due_date.html.erb index a23ba4f52..b5f8bc608 100644 --- a/app/views/my_modules/_due_date.html.erb +++ b/app/views/my_modules/_due_date.html.erb @@ -1,7 +1,9 @@ <%= form_with model: @my_module, url: my_module_path(@my_module, format: :json), data: { remote: :true }, builder: SciFormHelper::SciFormBuilder do |f| %> - <%= f.datetime_picker :due_date, - value: @my_module.due_date, - label: t('my_modules.due_date.label'), - clear: true, - time: true %> + +
+ + +
<% end %> diff --git a/app/views/my_modules/_module_header_due_date.html.erb b/app/views/my_modules/_module_header_due_date.html.erb index c2be5854e..d684f41d9 100644 --- a/app/views/my_modules/_module_header_due_date.html.erb +++ b/app/views/my_modules/_module_header_due_date.html.erb @@ -6,19 +6,12 @@ <% if due_date_editable %>
- - +
+ + +
+
- <% end %> diff --git a/app/views/my_modules/_module_header_start_date.html.erb b/app/views/my_modules/_module_header_start_date.html.erb index 72f2bcb90..093769830 100644 --- a/app/views/my_modules/_module_header_start_date.html.erb +++ b/app/views/my_modules/_module_header_start_date.html.erb @@ -6,18 +6,11 @@ <% if start_date_editable %>
- - +
+ + +
+
- <% end %> diff --git a/app/views/my_modules/modals/_new_modal.html.erb b/app/views/my_modules/modals/_new_modal.html.erb index 83cf26280..047b2bbe5 100644 --- a/app/views/my_modules/modals/_new_modal.html.erb +++ b/app/views/my_modules/modals/_new_modal.html.erb @@ -11,8 +11,8 @@ <%= f.hidden_field :view_mode, value: view_mode%>
+
- <%= text_field_tag 'my_module[name]', '', placeholder: t('experiments.canvas.new_my_module_modal.name_placeholder'), class: "sci-input-field" %>
@@ -20,21 +20,12 @@
-
- - - +
+ +
+ + +
@@ -44,7 +35,7 @@
<%= f.hidden_field :tag_ids%>
- + <%= select_tag 'module-tags-selector', options_for_select([]), data: { 'tags-create-url': project_create_tag_path(project_id: @experiment.project_id), @@ -58,7 +49,7 @@ <% if can_designate_users_to_new_task?(@experiment) %>
- + <%= select_tag 'my_module[user_ids]', options_for_select(users.map{ |user| [ diff --git a/app/views/projects/index/_header.html.erb b/app/views/projects/index/_header.html.erb index a3bf63d9b..0e0dfd026 100644 --- a/app/views/projects/index/_header.html.erb +++ b/app/views/projects/index/_header.html.erb @@ -20,5 +20,6 @@
+ <%= render partial: 'projects/index/toolbar' %>
diff --git a/app/views/protocols/index.html.erb b/app/views/protocols/index.html.erb index ea1ab4778..d25bc80b2 100644 --- a/app/views/protocols/index.html.erb +++ b/app/views/protocols/index.html.erb @@ -1,7 +1,3 @@ -<% content_for :head do %> - -<% end %> - <% provide(:head_title, t("protocols.index.head_title")) %> <% if current_team %> @@ -35,7 +31,7 @@ <% end %>
- diff --git a/app/views/reports/index.html.erb b/app/views/reports/index.html.erb index 95ea28429..c602a4766 100644 --- a/app/views/reports/index.html.erb +++ b/app/views/reports/index.html.erb @@ -1,7 +1,3 @@ -<% content_for :head do %> - -<% end %> - <%= stylesheet_link_tag 'datatables' %> <% if params[:preview_report_id] %> diff --git a/app/views/repositories/show.html.erb b/app/views/repositories/show.html.erb index af3e408b5..2b9a379eb 100644 --- a/app/views/repositories/show.html.erb +++ b/app/views/repositories/show.html.erb @@ -1,7 +1,3 @@ -<% content_for :head do %> - -<% end %> - <% provide(:head_title, t("libraries.show.head_title", library: @repository.name)) %> <%= stylesheet_link_tag 'datatables' %> <% provide(:container_class, "no-second-nav-container") %> diff --git a/app/views/shared/filter_dropdown/_datetime_search.html.erb b/app/views/shared/filter_dropdown/_datetime_search.html.erb index f757f3f61..a779c43cf 100644 --- a/app/views/shared/filter_dropdown/_datetime_search.html.erb +++ b/app/views/shared/filter_dropdown/_datetime_search.html.erb @@ -2,35 +2,18 @@
-
+
- - " - data-linked-max="#<%= "#{container_class}_to" %>" - data-toggle='date-time-picker' - class="form-control calendar-input from-date" - readonly - placeholder="<%= t('filters_modal.from_placeholder') %>" - data-date-format="<%= datetime_picker_format_full %>" - data-date-locale="<%= I18n.locale %>" - data-date-use-current="false" - value=""/> +
" class="vue-date-time-picker-filter grow"> + " /> + +
- - " - data-linked-min="#<%= "#{container_class}_from" %>" - class="form-control calendar-input to-date" - readonly - placeholder="<%= t('filters_modal.to_placeholder') %>" - data-date-format="<%= datetime_picker_format_full %>" - data-date-locale="<%= I18n.locale %>" - data-date-use-current="false" - data-date-orientation="left" - value=""/> +
" class="vue-date-time-picker-filter grow"> + " /> + +
diff --git a/app/views/users/settings/teams/index.html.erb b/app/views/users/settings/teams/index.html.erb index 79fe325f0..b332bac4f 100644 --- a/app/views/users/settings/teams/index.html.erb +++ b/app/views/users/settings/teams/index.html.erb @@ -1,6 +1,3 @@ -<% content_for :head do %> - -<% end %> <% provide(:head_title, t("users.settings.teams.head_title")) %> <% provide(:container_class, "no-second-nav-container") %> diff --git a/app/views/users/settings/teams/show.html.erb b/app/views/users/settings/teams/show.html.erb index 40bdd4f80..0831af7f0 100644 --- a/app/views/users/settings/teams/show.html.erb +++ b/app/views/users/settings/teams/show.html.erb @@ -1,7 +1,3 @@ -<% content_for :head do %> - -<% end %> - <% provide(:head_title, t("users.settings.teams.head_title")) %> <% provide(:container_class, "no-second-nav-container") %> diff --git a/config/webpack/webpack.config.js b/config/webpack/webpack.config.js index a88f5e251..c8c8e7c8e 100644 --- a/config/webpack/webpack.config.js +++ b/config/webpack/webpack.config.js @@ -44,7 +44,8 @@ const entryList = { vue_navigation_breadcrumbs: './app/javascript/packs/vue/navigation/breadcrumbs.js', vue_protocol_file_import_modal: './app/javascript/packs/vue/protocol_file_import_modal.js', vue_components_export_stock_consumption_modal: './app/javascript/packs/vue/export_stock_consumption_modal.js', - vue_components_manage_stock_value_modal: './app/javascript/packs/vue/manage_stock_value_modal.js' + vue_components_manage_stock_value_modal: './app/javascript/packs/vue/manage_stock_value_modal.js', + vue_legacy_datetime_picker: './app/javascript/packs/vue/legacy/datetime_picker.js', } // Engine pack loading based on https://github.com/rails/webpacker/issues/348#issuecomment-635480949 diff --git a/package.json b/package.json index 971ab1f7c..121b61a95 100644 --- a/package.json +++ b/package.json @@ -31,9 +31,13 @@ "@fortawesome/fontawesome-free": "^5.2.0", "@joeattardi/emoji-button": "^4.6.2", "@teselagen/ove": "^0.3.23", + "@vue/compiler-sfc": "^3.3.4", + "@vuepic/vue-datepicker": "^7.2.0", + "@vueuse/components": "^10.5.0", + "@vueuse/core": "^10.5.0", "ajv": "6.12.6", "autoprefixer": "10.4.14", - "axios": "^1.4.0", + "axios": "^1.6.0", "babel-loader": "^8.2.5", "babel-plugin-macros": "^3.1.0", "bootstrap": "^3.4.1", @@ -78,14 +82,11 @@ "tui-color-picker": "^2.2.0", "tui-image-editor": "github:scinote-eln/tui.image-editor#3_15_2_updated", "twemoji": "^12.1.4", - "vue": "^2.6.11", - "vue-loader": "^15.9.1", - "vue-resizable": "2.1.3", - "vue-template-compiler": "^2.6.12", - "vue-turbolinks": "^2.2.1", - "vue2-perfect-scrollbar": "^1.5.56", - "vue2-scrollspy": "^2.3.1", - "vuedraggable": "^2.24.3", + "vue": "^3.3.4", + "vue-loader": "^16.0.0", + "vue3-draggable-resizable": "^1.6.5", + "vue3-perfect-scrollbar": "^1.6.1", + "vuedraggable": "^4.1.0", "webpack": "^5.64.4", "webpack-cli": "^4.10.0", "webpack-manifest-plugin": "^1.3.2", diff --git a/public/images/calendar/calendar.svg b/public/images/calendar/calendar.svg new file mode 100644 index 000000000..60a23d753 --- /dev/null +++ b/public/images/calendar/calendar.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/images/calendar/clock.svg b/public/images/calendar/clock.svg new file mode 100644 index 000000000..8415544c2 --- /dev/null +++ b/public/images/calendar/clock.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/images/calendar/down.svg b/public/images/calendar/down.svg new file mode 100644 index 000000000..efb41bc1e --- /dev/null +++ b/public/images/calendar/down.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/images/calendar/navigate_before.svg b/public/images/calendar/navigate_before.svg new file mode 100644 index 000000000..a5c3025b0 --- /dev/null +++ b/public/images/calendar/navigate_before.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/images/calendar/navigate_next.svg b/public/images/calendar/navigate_next.svg new file mode 100644 index 000000000..719b44075 --- /dev/null +++ b/public/images/calendar/navigate_next.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/images/calendar/up.svg b/public/images/calendar/up.svg new file mode 100644 index 000000000..1304ef08b --- /dev/null +++ b/public/images/calendar/up.svg @@ -0,0 +1,3 @@ + + + diff --git a/yarn.lock b/yarn.lock index fb1bf95f3..85ec21830 100644 --- a/yarn.lock +++ b/yarn.lock @@ -321,7 +321,12 @@ chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.18.4", "@babel/parser@^7.20.7", "@babel/parser@^7.21.4": +"@babel/parser@^7.20.15", "@babel/parser@^7.21.3": + version "7.22.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.7.tgz#df8cf085ce92ddbdbf668a7f186ce848c9036cae" + integrity sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q== + +"@babel/parser@^7.20.7", "@babel/parser@^7.21.4": version "7.21.4" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.4.tgz#94003fdfc520bbe2875d4ae557b43ddb6d880f17" integrity sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw== @@ -955,6 +960,13 @@ dependencies: regenerator-runtime "^0.13.11" +"@babel/runtime@^7.21.0": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.2.tgz#062b0ac103261d68a966c4c7baf2ae3e62ec3885" + integrity sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg== + dependencies: + regenerator-runtime "^0.14.0" + "@babel/template@^7.18.10", "@babel/template@^7.20.7": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" @@ -1218,6 +1230,11 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== +"@jridgewell/sourcemap-codec@^1.4.15": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": version "0.3.17" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" @@ -1524,11 +1541,6 @@ resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== -"@tweenjs/tween.js@^17.2.0": - version "17.6.0" - resolved "https://registry.yarnpkg.com/@tweenjs/tween.js/-/tween.js-17.6.0.tgz#61bc86c372bcc5a9f744e661dd6ae16f5ee7d0ef" - integrity sha512-utSXj0WHi4qr/iyfFHGMJBaL+ixQ2N7BAmx1R5g8jBqykJfjBUQ0hKWwXf767hbALC3zOoOIofKYSDWu5n04JQ== - "@types/debug@^4.0.0": version "4.1.8" resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.8.tgz#cef723a5d0a90990313faec2d1e22aee5eecb317" @@ -1638,6 +1650,11 @@ resolved "https://registry.yarnpkg.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz#b6725d5f4af24ace33b36fafd295136e75509f43" integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA== +"@types/web-bluetooth@^0.0.18": + version "0.0.18" + resolved "https://registry.yarnpkg.com/@types/web-bluetooth/-/web-bluetooth-0.0.18.tgz#74bd1c8fd3a2058cb6fc76b188fcded50a83d866" + integrity sha512-v/ZHEj9xh82usl8LMR3GarzFY1IrbXJw5L4QfQhokjRV91q+SelFqxQWSep1ucXEZ22+dSTwLFkXeur25sPIbw== + "@types/yauzl@^2.9.1": version "2.10.1" resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.1.tgz#4e8f299f0934d60f36c74f59cb5a8483fd786691" @@ -1657,30 +1674,134 @@ dependencies: "@use-gesture/core" "10.2.27" -"@vue/compiler-sfc@2.7.14": - version "2.7.14" - resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-2.7.14.tgz#3446fd2fbb670d709277fc3ffa88efc5e10284fd" - integrity sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA== +"@vue/compiler-core@3.3.4": + version "3.3.4" + resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.3.4.tgz#7fbf591c1c19e1acd28ffd284526e98b4f581128" + integrity sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g== dependencies: - "@babel/parser" "^7.18.4" - postcss "^8.4.14" - source-map "^0.6.1" + "@babel/parser" "^7.21.3" + "@vue/shared" "3.3.4" + estree-walker "^2.0.2" + source-map-js "^1.0.2" -"@vue/component-compiler-utils@^3.1.0": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz#f9f5fb53464b0c37b2c8d2f3fbfe44df60f61dc9" - integrity sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ== +"@vue/compiler-dom@3.3.4": + version "3.3.4" + resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz#f56e09b5f4d7dc350f981784de9713d823341151" + integrity sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w== dependencies: - consolidate "^0.15.1" - hash-sum "^1.0.2" - lru-cache "^4.1.2" - merge-source-map "^1.1.0" - postcss "^7.0.36" - postcss-selector-parser "^6.0.2" - source-map "~0.6.1" - vue-template-es2015-compiler "^1.9.0" - optionalDependencies: - prettier "^1.18.2 || ^2.0.0" + "@vue/compiler-core" "3.3.4" + "@vue/shared" "3.3.4" + +"@vue/compiler-sfc@3.3.4", "@vue/compiler-sfc@^3.3.4": + version "3.3.4" + resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz#b19d942c71938893535b46226d602720593001df" + integrity sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ== + dependencies: + "@babel/parser" "^7.20.15" + "@vue/compiler-core" "3.3.4" + "@vue/compiler-dom" "3.3.4" + "@vue/compiler-ssr" "3.3.4" + "@vue/reactivity-transform" "3.3.4" + "@vue/shared" "3.3.4" + estree-walker "^2.0.2" + magic-string "^0.30.0" + postcss "^8.1.10" + source-map-js "^1.0.2" + +"@vue/compiler-ssr@3.3.4": + version "3.3.4" + resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz#9d1379abffa4f2b0cd844174ceec4a9721138777" + integrity sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ== + dependencies: + "@vue/compiler-dom" "3.3.4" + "@vue/shared" "3.3.4" + +"@vue/reactivity-transform@3.3.4": + version "3.3.4" + resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz#52908476e34d6a65c6c21cd2722d41ed8ae51929" + integrity sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw== + dependencies: + "@babel/parser" "^7.20.15" + "@vue/compiler-core" "3.3.4" + "@vue/shared" "3.3.4" + estree-walker "^2.0.2" + magic-string "^0.30.0" + +"@vue/reactivity@3.3.4": + version "3.3.4" + resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.3.4.tgz#a27a29c6cd17faba5a0e99fbb86ee951653e2253" + integrity sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ== + dependencies: + "@vue/shared" "3.3.4" + +"@vue/runtime-core@3.3.4": + version "3.3.4" + resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.3.4.tgz#4bb33872bbb583721b340f3088888394195967d1" + integrity sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA== + dependencies: + "@vue/reactivity" "3.3.4" + "@vue/shared" "3.3.4" + +"@vue/runtime-dom@3.3.4": + version "3.3.4" + resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz#992f2579d0ed6ce961f47bbe9bfe4b6791251566" + integrity sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ== + dependencies: + "@vue/runtime-core" "3.3.4" + "@vue/shared" "3.3.4" + csstype "^3.1.1" + +"@vue/server-renderer@3.3.4": + version "3.3.4" + resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.3.4.tgz#ea46594b795d1536f29bc592dd0f6655f7ea4c4c" + integrity sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ== + dependencies: + "@vue/compiler-ssr" "3.3.4" + "@vue/shared" "3.3.4" + +"@vue/shared@3.3.4": + version "3.3.4" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.3.4.tgz#06e83c5027f464eef861c329be81454bc8b70780" + integrity sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ== + +"@vuepic/vue-datepicker@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@vuepic/vue-datepicker/-/vue-datepicker-7.2.0.tgz#c47ffb6eb939f2b09188c8068fcd4d118b36b6b8" + integrity sha512-rJgQq/DpTr66zfwlkGtqGK7IZIKi3bAxMpik15qRHY8af1b4nWlZfRKyMV3Wmmaz7GsoVt4oJH+DBd9so1JhLg== + dependencies: + date-fns "^2.30.0" + date-fns-tz "^1.3.7" + +"@vueuse/components@^10.5.0": + version "10.5.0" + resolved "https://registry.yarnpkg.com/@vueuse/components/-/components-10.5.0.tgz#fdb8c20e3d9bf52a32be8c59dd389fa37acabd09" + integrity sha512-zWQZ8zkNBvX++VHfyiUaQ4otb+4PWI8679GR8FvdrNnj+01LXnqvrkyKd8yTCMJ9nHqwRRTJikS5fu4Zspn9DQ== + dependencies: + "@vueuse/core" "10.5.0" + "@vueuse/shared" "10.5.0" + vue-demi ">=0.14.6" + +"@vueuse/core@10.5.0", "@vueuse/core@^10.5.0": + version "10.5.0" + resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-10.5.0.tgz#04d1e6d26592bb997bb755a4830ea7583c3e8612" + integrity sha512-z/tI2eSvxwLRjOhDm0h/SXAjNm8N5ld6/SC/JQs6o6kpJ6Ya50LnEL8g5hoYu005i28L0zqB5L5yAl8Jl26K3A== + dependencies: + "@types/web-bluetooth" "^0.0.18" + "@vueuse/metadata" "10.5.0" + "@vueuse/shared" "10.5.0" + vue-demi ">=0.14.6" + +"@vueuse/metadata@10.5.0": + version "10.5.0" + resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-10.5.0.tgz#7501a88cf5cbf7a515a03f0b8bbe3cecf30cad11" + integrity sha512-fEbElR+MaIYyCkeM0SzWkdoMtOpIwO72x8WsZHRE7IggiOlILttqttM69AS13nrDxosnDBYdyy3C5mR1LCxHsw== + +"@vueuse/shared@10.5.0": + version "10.5.0" + resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-10.5.0.tgz#b3ac8c190a5dae41db5e1b60fe304a9b4247393c" + integrity sha512-18iyxbbHYLst9MqU1X1QNdMHIjks6wC7XTVf0KNOv5es/Ms6gjVFCAAWTVP2JStuGqydg3DT+ExpFORUEi9yhg== + dependencies: + vue-demi ">=0.14.6" "@webassemblyjs/ast@1.11.1": version "1.11.1" @@ -1957,7 +2078,7 @@ ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.0.0: +ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== @@ -2123,10 +2244,10 @@ axios@^0.21.1: dependencies: follow-redirects "^1.14.0" -axios@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.4.0.tgz#38a7bf1224cd308de271146038b551d725f0be1f" - integrity sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA== +axios@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.0.tgz#f1e5292f26b2fd5c2e66876adc5b06cdbd7d2102" + integrity sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg== dependencies: follow-redirects "^1.15.0" form-data "^4.0.0" @@ -2180,7 +2301,7 @@ babel-plugin-polyfill-regenerator@^0.4.1: dependencies: "@babel/helper-define-polyfill-provider" "^0.3.3" -babel-runtime@^6.11.6, babel-runtime@^6.26.0: +babel-runtime@^6.11.6: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" integrity sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g== @@ -2237,7 +2358,7 @@ bl@^4.0.3: inherits "^2.0.4" readable-stream "^3.4.0" -bluebird@3.7.2, bluebird@^3.1.1, bluebird@^3.7.2: +bluebird@3.7.2, bluebird@^3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== @@ -2496,6 +2617,14 @@ chalk@^2.3.0, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + change-emitter@^0.1.2: version "0.1.6" resolved "https://registry.yarnpkg.com/change-emitter/-/change-emitter-0.1.6.tgz#e8b2fe3d7f1ab7d69a32199aff91ea6931409515" @@ -2717,13 +2846,6 @@ console-control-strings@^1.0.0, console-control-strings@^1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== -consolidate@^0.15.1: - version "0.15.1" - resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.15.1.tgz#21ab043235c71a07d45d9aad98593b0dba56bab7" - integrity sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw== - dependencies: - bluebird "^3.1.1" - constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" @@ -2993,16 +3115,11 @@ cssstyle@^2.3.0: dependencies: cssom "~0.3.6" -csstype@^3.0.2: +csstype@^3.0.2, csstype@^3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== -csstype@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" - integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== - data-uri-to-buffer@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-6.0.1.tgz#540bd4c8753a25ee129035aebdedf63b078703c7" @@ -3017,16 +3134,23 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" +date-fns-tz@^1.3.7: + version "1.3.8" + resolved "https://registry.yarnpkg.com/date-fns-tz/-/date-fns-tz-1.3.8.tgz#083e3a4e1f19b7857fa0c18deea6c2bc46ded7b9" + integrity sha512-qwNXUFtMHTTU6CFSFjoJ80W8Fzzp24LntbjFFBgL/faqds4e5mo9mftoRLgr3Vi1trISsg4awSpYVsOQCRnapQ== + +date-fns@^2.30.0: + version "2.30.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" + integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== + dependencies: + "@babel/runtime" "^7.21.0" + dayjs@^1.10.4: version "1.11.9" resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.9.tgz#9ca491933fadd0a60a2c19f6c237c03517d71d1a" integrity sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA== -de-indent@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" - integrity sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg== - debug@4, debug@4.3.4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.3, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" @@ -3409,6 +3533,11 @@ estraverse@^5.2.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== +estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -3863,10 +3992,10 @@ hash-base@^3.0.0: readable-stream "^3.6.0" safe-buffer "^5.2.0" -hash-sum@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-1.0.2.tgz#33b40777754c6432573c120cc3808bbd10d47f04" - integrity sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA== +hash-sum@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-2.0.0.tgz#81d01bb5de8ea4a214ad5d6ead1b523460b0b45a" + integrity sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg== hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.7" @@ -3881,11 +4010,6 @@ hast-util-whitespace@^2.0.0: resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz#0ec64e257e6fc216c7d14c8a1b74d27d650b4557" integrity sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng== -he@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - history@^4.7.2: version "4.10.1" resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" @@ -4533,7 +4657,7 @@ loader-runner@^4.2.0: resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== -loader-utils@^1.0.2, loader-utils@^1.1.0: +loader-utils@^1.1.0: version "1.4.2" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.2.tgz#29a957f3a63973883eb684f10ffd3d151fec01a3" integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== @@ -4620,14 +4744,6 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3 dependencies: js-tokens "^3.0.0 || ^4.0.0" -lru-cache@^4.1.2: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -4647,6 +4763,13 @@ lru-cache@^7.14.1, lru-cache@^7.7.1: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== +magic-string@^0.30.0: + version "0.30.1" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.1.tgz#ce5cd4b0a81a5d032bd69aab4522299b2166284d" + integrity sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.15" + make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" @@ -4856,13 +4979,6 @@ memoize-one@^6.0.0: resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045" integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== -merge-source-map@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" - integrity sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw== - dependencies: - source-map "^0.6.1" - merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -5340,7 +5456,7 @@ nanoid@^2.1.0: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-2.1.11.tgz#ec24b8a758d591561531b4176a01e3ab4f0f0280" integrity sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA== -nanoid@^3.3.6: +nanoid@^3.3.4, nanoid@^3.3.6: version "3.3.6" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== @@ -6032,7 +6148,7 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@8.4.31, postcss@^8.4.14, postcss@^8.4.19: +postcss@8.4.31: version "8.4.31" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== @@ -6041,7 +6157,7 @@ postcss@8.4.31, postcss@^8.4.14, postcss@^8.4.19: picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^7.0.1, postcss@^7.0.36: +postcss@^7.0.1: version "7.0.39" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== @@ -6049,6 +6165,24 @@ postcss@^7.0.1, postcss@^7.0.36: picocolors "^0.2.1" source-map "^0.6.1" +postcss@^8.1.10: + version "8.4.26" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.26.tgz#1bc62ab19f8e1e5463d98cf74af39702a00a9e94" + integrity sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +postcss@^8.4.19: + version "8.4.21" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" + integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== + dependencies: + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -6059,11 +6193,6 @@ prettier@^1.13.7: resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== -"prettier@^1.18.2 || ^2.0.0": - version "2.8.7" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.7.tgz#bb79fc8729308549d28fe3a98fce73d2c0656450" - integrity sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw== - process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -6130,11 +6259,6 @@ prr@~1.0.1: resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== - psl@^1.1.33: version "1.9.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" @@ -6964,10 +7088,10 @@ socks@^2.6.2, socks@^2.7.1: ip "^2.0.0" smart-buffer "^4.2.0" -sortablejs@1.10.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/sortablejs/-/sortablejs-1.10.2.tgz#6e40364d913f98b85a14f6678f92b5c1221f5290" - integrity sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A== +sortablejs@1.14.0: + version "1.14.0" + resolved "https://registry.yarnpkg.com/sortablejs/-/sortablejs-1.14.0.tgz#6d2e17ccbdb25f464734df621d4f35d4ab35b3d8" + integrity sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w== source-list-map@^2.0.0: version "2.0.1" @@ -7110,6 +7234,13 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + supports-color@^8.0.0: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" @@ -7681,84 +7812,51 @@ vm-browserify@^1.1.2: resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== -vue-hot-reload-api@^2.3.0: - version "2.3.4" - resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz#532955cc1eb208a3d990b3a9f9a70574657e08f2" - integrity sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog== +vue-demi@>=0.14.6: + version "0.14.6" + resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.14.6.tgz#dc706582851dc1cdc17a0054f4fec2eb6df74c92" + integrity sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w== -vue-loader@^15.9.1: - version "15.10.1" - resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.10.1.tgz#c451c4cd05a911aae7b5dbbbc09fb913fb3cca18" - integrity sha512-SaPHK1A01VrNthlix6h1hq4uJu7S/z0kdLUb6klubo738NeQoLbS6V9/d8Pv19tU0XdQKju3D1HSKuI8wJ5wMA== +vue-loader@^16.0.0: + version "16.8.3" + resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-16.8.3.tgz#d43e675def5ba9345d6c7f05914c13d861997087" + integrity sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA== dependencies: - "@vue/component-compiler-utils" "^3.1.0" - hash-sum "^1.0.2" - loader-utils "^1.1.0" - vue-hot-reload-api "^2.3.0" - vue-style-loader "^4.1.0" + chalk "^4.1.0" + hash-sum "^2.0.0" + loader-utils "^2.0.0" -vue-resizable@2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/vue-resizable/-/vue-resizable-2.1.3.tgz#6c0bd7a4a8dd695e136be5c282270e9de35f3782" - integrity sha512-KhJimFgeZY+cgoYrXPuHiI5bVqVfDNGmKqBQSjCggaDJyGN3lZ9rCQShpmELfNe+qYh/W3sSE21ZVz6wrtiAKg== +vue3-draggable-resizable@^1.6.5: + version "1.6.5" + resolved "https://registry.yarnpkg.com/vue3-draggable-resizable/-/vue3-draggable-resizable-1.6.5.tgz#021b2c00bff2885ab4fa5981e03bf4f56f12cdac" + integrity sha512-31142E31fGNnq3HKqvmFLSsqIbhck7TyGuQWhUKrDw6DOcGAuRx4ddRjaxvT6fe7dgeKH53qAh+i0ZlWtPLl2g== -vue-style-loader@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/vue-style-loader/-/vue-style-loader-4.1.3.tgz#6d55863a51fa757ab24e89d9371465072aa7bc35" - integrity sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg== - dependencies: - hash-sum "^1.0.2" - loader-utils "^1.0.2" - -vue-template-compiler@^2.6.12: - version "2.7.14" - resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz#4545b7dfb88090744c1577ae5ac3f964e61634b1" - integrity sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ== - dependencies: - de-indent "^1.0.2" - he "^1.2.0" - -vue-template-es2015-compiler@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz#1ee3bc9a16ecbf5118be334bb15f9c46f82f5825" - integrity sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw== - -vue-turbolinks@^2.2.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/vue-turbolinks/-/vue-turbolinks-2.2.2.tgz#6b7b5c4120f5586907ef977be4b63a734bf8cd36" - integrity sha512-pPO2Fr+1UgdhUK9dc5OhjLSeYi5LZAm/VZBXOVQgLHCO31bRjAof/+W/e/6SHCbnb1xdZb1gW5T9MX0k9ejSAQ== - -vue2-perfect-scrollbar@^1.5.56: - version "1.5.56" - resolved "https://registry.yarnpkg.com/vue2-perfect-scrollbar/-/vue2-perfect-scrollbar-1.5.56.tgz#4aeef8d8894a26f2df3e08a71a637825d3a6ffd6" - integrity sha512-0ciZFj8kfMnsVkEi9BYf16HoybdN8bju8zj4Okwlrg9+rJp6i/PYXh+ZWsdeQn6jLDMi6CRSNEsaTsLPStIVHQ== +vue3-perfect-scrollbar@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/vue3-perfect-scrollbar/-/vue3-perfect-scrollbar-1.6.1.tgz#296e0e0c61a8f6278184f5b09bb45d137af92327" + integrity sha512-r9wfxlFwVyHXMPKG0PnR7fDfJPQ20KEVzKQfSU5by2WKYz2PwV0bTfyfejmEyZXsXL0O8VtSWtgxfPuFR2AGOg== dependencies: cssnano "^5.1.14" perfect-scrollbar "^1.5.5" postcss-import "^12.0.0" -vue2-scrollspy@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/vue2-scrollspy/-/vue2-scrollspy-2.3.1.tgz#7a2aba7ea53e020cdd47851c56594a41731e88f4" - integrity sha512-nynFYH9zwfXHfhopQyFT6uxe8Vgz9c46/NibJzI24h8FAHBnlzEe9EXNhUy+wcfr+BEa4Q22V5GvnigTtbmPaQ== +vue@^3.3.4: + version "3.3.4" + resolved "https://registry.yarnpkg.com/vue/-/vue-3.3.4.tgz#8ed945d3873667df1d0fcf3b2463ada028f88bd6" + integrity sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw== dependencies: - "@tweenjs/tween.js" "^17.2.0" - babel-runtime "^6.26.0" + "@vue/compiler-dom" "3.3.4" + "@vue/compiler-sfc" "3.3.4" + "@vue/runtime-dom" "3.3.4" + "@vue/server-renderer" "3.3.4" + "@vue/shared" "3.3.4" -vue@^2.6.11: - version "2.7.14" - resolved "https://registry.yarnpkg.com/vue/-/vue-2.7.14.tgz#3743dcd248fd3a34d421ae456b864a0246bafb17" - integrity sha512-b2qkFyOM0kwqWFuQmgd4o+uHGU7T+2z3T+WQp8UBjADfEv2n4FEMffzBmCKNP0IGzOEEfYjvtcC62xaSKeQDrQ== +vuedraggable@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/vuedraggable/-/vuedraggable-4.1.0.tgz#edece68adb8a4d9e06accff9dfc9040e66852270" + integrity sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww== dependencies: - "@vue/compiler-sfc" "2.7.14" - csstype "^3.1.0" - -vuedraggable@^2.24.3: - version "2.24.3" - resolved "https://registry.yarnpkg.com/vuedraggable/-/vuedraggable-2.24.3.tgz#43c93849b746a24ce503e123d5b259c701ba0d19" - integrity sha512-6/HDXi92GzB+Hcs9fC6PAAozK1RLt1ewPTLjK0anTYguXLAeySDmcnqE8IC0xa7shvSzRjQXq3/+dsZ7ETGF3g== - dependencies: - sortablejs "1.10.2" + sortablejs "1.14.0" w3c-hr-time@^1.0.2: version "1.0.2" @@ -8019,11 +8117,6 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== - yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"