diff --git a/Gemfile b/Gemfile index 148efc6d3..35fa6f955 100644 --- a/Gemfile +++ b/Gemfile @@ -66,7 +66,7 @@ gem 'scenic', '~> 1.4' gem 'sdoc', '~> 1.0', group: :doc gem 'silencer' # Silence certain Rails logs gem 'sneaky-save', git: 'https://github.com/einzige/sneaky-save' -gem 'turbolinks', '~> 5.1.1' +gem 'turbolinks', '~> 5.2.0' gem 'underscore-rails' gem 'wicked_pdf' diff --git a/Gemfile.lock b/Gemfile.lock index e67559ab1..79d648afd 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -478,7 +478,7 @@ GEM pry (>= 0.10.4) psych (3.3.4) public_suffix (5.0.1) - puma (6.3.0) + puma (6.3.1) nio4r (~> 2.0) raabro (1.4.0) racc (1.7.1) @@ -644,8 +644,8 @@ GEM tilt (2.2.0) timecop (0.9.6) timeout (0.4.0) - turbolinks (5.1.1) - turbolinks-source (~> 5.1) + turbolinks (5.2.1) + turbolinks-source (~> 5.2) turbolinks-source (5.2.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) @@ -752,7 +752,7 @@ DEPENDENCIES puma rack-attack rack-cors - rails (~> 7.0.5.1) + rails (~> 7.0.5) rails-controller-testing rails_12factor rails_autolink (~> 1.1, >= 1.1.6) @@ -778,7 +778,7 @@ DEPENDENCIES sprockets-rails tailwindcss-rails (~> 2.0) timecop - turbolinks (~> 5.1.1) + turbolinks (~> 5.2.0) tzinfo-data uglifier (>= 1.3.0) underscore-rails diff --git a/app/assets/javascripts/application.js.erb b/app/assets/javascripts/application.js.erb index a95bcdcd8..232c61da7 100644 --- a/app/assets/javascripts/application.js.erb +++ b/app/assets/javascripts/application.js.erb @@ -1,5 +1,6 @@ // turbolinks MUST BE THE LAST inclusion +//= require moment //= require bootstrap-datetimepicker //= require bootstrap-colorselector //= require bootstrap-tagsinput.min diff --git a/app/assets/javascripts/jquery_bundle.js b/app/assets/javascripts/jquery_bundle.js index 0d50b3277..6a050fd23 100644 --- a/app/assets/javascripts/jquery_bundle.js +++ b/app/assets/javascripts/jquery_bundle.js @@ -1,2 +1 @@ - -//= require jquery.min +//= require jquery diff --git a/app/assets/javascripts/my_modules/results.js b/app/assets/javascripts/my_modules/results.js index 7f1202292..d08dac060 100644 --- a/app/assets/javascripts/my_modules/results.js +++ b/app/assets/javascripts/my_modules/results.js @@ -1,7 +1,8 @@ +/* eslint-disable no-unused-vars */ /* global Results ActiveStorage animateSpinner Comments ResultAssets FilePreviewModal TinyMCE getParam applyCreateWopiFileCallback initFormSubmitLinks textValidator - GLOBAL_CONSTANTS + GLOBAL_CONSTANTS ActiveStoragePreviews */ (function(global) { @@ -92,8 +93,9 @@ // Handle the error } else { let formData = new FormData(); + const assetId = form.find('#result_asset_attributes_id').val(); formData.append('result[name]', form.find('#result_name').val()); - formData.append('result[asset_attributes][id]', form.find('#result_asset_attributes_id').val()); + formData.append('result[asset_attributes][id]', assetId); formData.append('result[asset_attributes][signed_blob_id]', blob.signed_id); $.ajax({ @@ -102,7 +104,7 @@ data: formData, success: function(data) { animateSpinner(null, false); - $('.edit_result').parent().remove(); + $('.edit-result-asset').parent().remove(); $(data.html).prependTo('#results').promise().done(() => { $.each($('#results').find('.result'), function() { initFormSubmitLinks($(this)); @@ -113,13 +115,14 @@ ResultAssets.initNewResultAsset(); expandResult($(this)); }); + ActiveStoragePreviews.reloadPreview(`.asset[data-asset-id=${assetId}] .attachment-preview img`); }); $('#results-toolbar').show(); }, error: function(XHR) { animateSpinner(null, false); - $('.edit_result').renderFormErrors('result', XHR.responseJSON.errors); + $('.edit-result-asset').renderFormErrors('result', XHR.responseJSON.errors); }, processData: false, contentType: false diff --git a/app/assets/javascripts/navigation.js b/app/assets/javascripts/navigation.js index 9179dd5a3..baf922322 100644 --- a/app/assets/javascripts/navigation.js +++ b/app/assets/javascripts/navigation.js @@ -147,7 +147,6 @@ noRecentText.show(); } bindSystemNotificationAjax(); - SystemNotificationsMarkAsSeen(); } }); $('#count-system-notifications').hide(); diff --git a/app/assets/javascripts/projects/index.js b/app/assets/javascripts/projects/index.js index e9e194f0b..34df7ad5f 100644 --- a/app/assets/javascripts/projects/index.js +++ b/app/assets/javascripts/projects/index.js @@ -416,12 +416,12 @@ var ProjectsIndex = (function() { viewContainer.removeClass('no-results no-data'); viewContainer.find('.card, .projects-group, .no-results-container, .no-data-container').remove(); - if (viewContainer.find('.list').length) { + viewContainer.append(data.cards_html); + + if (viewContainer.hasClass('list')) { viewContainer.find('.table-header').show(); } - viewContainer.append(data.cards_html); - if (viewContainer.find('.no-results-container').length) { viewContainer.addClass('no-results'); } diff --git a/app/assets/javascripts/repositories/renderers/view_renderers.js b/app/assets/javascripts/repositories/renderers/view_renderers.js index b67fa7c29..364bf1aaf 100644 --- a/app/assets/javascripts/repositories/renderers/view_renderers.js +++ b/app/assets/javascripts/repositories/renderers/view_renderers.js @@ -5,7 +5,7 @@ $.fn.dataTable.render.RepositoryAssetValue = function(data) { if (asset.id) { return `
- ${asset.icon_html} +
{ var columnData = $(column).data('type') === 'RepositoryStockValue' ? 'stock' : String(columns.length); + const className = $(column).data('type') === 'RepositoryChecklistValue' ? 'checklist-column' : ''; columns.push({ + className: className, visible: true, searchable: true, data: columnData, diff --git a/app/assets/javascripts/results/result_assets.js b/app/assets/javascripts/results/result_assets.js index ab0b6bcbd..34a166a50 100644 --- a/app/assets/javascripts/results/result_assets.js +++ b/app/assets/javascripts/results/result_assets.js @@ -2,6 +2,20 @@ 'use strict'; global.ResultAssets = (function() { + // New asset callback + function createResultAssetCallback() { + $('.new-result-assets-buttons') + .on('click', '.save-result', (event) => { + DragNDropResults.processResult(event); // eslint-disable-line no-undef + }) + .on('click', '.cancel-new', () => { + DragNDropResults.destroyAll(); // eslint-disable-line no-undef + }); + + $('#new-result-assets-select').on('change', '#drag-n-drop-assets', function() { + DragNDropResults.init(this.files); // eslint-disable-line no-undef + }); + } // New result asset behaviour function initNewResultAsset() { $('#new-result-asset').on('click', function(event) { @@ -24,6 +38,7 @@ Results.initCancelFormButton($form, initNewResultAsset); Results.toggleResultEditButtons(false); dragNdropAssetsInit(); + createResultAssetCallback(); }, error: function(xhr, status, e) { $(this).renderFormErrors('result', xhr.responseJSON, true, e); @@ -34,6 +49,13 @@ }); } + // Save asset callback + function saveResultAssetCallback() { + $('.edit-result-assets-buttons').on('click', '.save-result', (event) => { + Results.processResult(event, Results.ResultTypeEnum.FILE); // eslint-disable-line no-undef + }); + } + function applyEditResultAssetCallback() { $('.edit-result-asset').off('ajax:success ajax:error').on('ajax:success', function(e, data) { var $result = $(this).closest('.result'); @@ -55,6 +77,7 @@ Results.toggleResultEditButtons(false); $('#result_name').focus(); + saveResultAssetCallback(); }).on('ajax:error', function(e, xhr, status, error) { animateSpinner(null, false); }); diff --git a/app/assets/javascripts/results/result_assets/edit.js b/app/assets/javascripts/results/result_assets/edit.js deleted file mode 100644 index 81d85d51e..000000000 --- a/app/assets/javascripts/results/result_assets/edit.js +++ /dev/null @@ -1,7 +0,0 @@ -/* global Results */ - -(function() { - $('.edit-result-assets-buttons').on('click', '.save-result', (event) => { - Results.processResult(event, Results.ResultTypeEnum.FILE); - }); -}()); diff --git a/app/assets/javascripts/results/result_assets/new.js b/app/assets/javascripts/results/result_assets/new.js deleted file mode 100644 index 7a1141703..000000000 --- a/app/assets/javascripts/results/result_assets/new.js +++ /dev/null @@ -1,15 +0,0 @@ -/* global DragNDropResults */ - -(function() { - $('.new-result-assets-buttons') - .on('click', '.save-result', (event) => { - DragNDropResults.processResult(event); - }) - .on('click', '.cancel-new', () => { - DragNDropResults.destroyAll(); - }); - - $('#new-result-assets-select').on('change', '#drag-n-drop-assets', function() { - DragNDropResults.init(this.files); - }); -}()); diff --git a/app/assets/javascripts/results/result_tables.js.erb b/app/assets/javascripts/results/result_tables.js.erb index 93450177e..b87e1df13 100644 --- a/app/assets/javascripts/results/result_tables.js.erb +++ b/app/assets/javascripts/results/result_tables.js.erb @@ -64,6 +64,20 @@ }); } + // Save result table callback + function newResultTableCallback() { + $('.new-result-tables-buttons .save-result').on('click', (event) => { + Results.processResult(event, Results.ResultTypeEnum.TABLE); + }); + } + + // Save result table callback + function saveResultTableCallback() { + $('.edit-result-tables-buttons .save-result').on('click', (event) => { + Results.processResult(event, Results.ResultTypeEnum.TABLE); + }); + } + // Apply ajax callback to form function _formAjaxResultTable($form, $prevResult) { $form.on('ajax:success', function(e, data) { @@ -111,6 +125,7 @@ Results.toggleResultEditButtons(false); $('#result_name').focus(); + saveResultTableCallback(); }); } @@ -137,6 +152,7 @@ Results.initCancelFormButton($form, initNewResultTable); Results.toggleResultEditButtons(false); $('#result_name').focus(); + newResultTableCallback(); }, error: function() { animateSpinner(null, false); diff --git a/app/assets/javascripts/results/result_tables/edit.js b/app/assets/javascripts/results/result_tables/edit.js deleted file mode 100644 index bc992e5eb..000000000 --- a/app/assets/javascripts/results/result_tables/edit.js +++ /dev/null @@ -1,7 +0,0 @@ -/* global Results */ - -(function() { - $('.edit-result-tables-buttons').on('click', '.save-result', (event) => { - Results.processResult(event, Results.ResultTypeEnum.TABLE); - }); -}()); diff --git a/app/assets/javascripts/results/result_tables/new.js b/app/assets/javascripts/results/result_tables/new.js deleted file mode 100644 index 01f57e0ac..000000000 --- a/app/assets/javascripts/results/result_tables/new.js +++ /dev/null @@ -1,7 +0,0 @@ -/* global Results */ - -(function() { - $('.new-result-tables-buttons').on('click', '.save-result', (event) => { - Results.processResult(event, Results.ResultTypeEnum.TABLE); - }); -}()); diff --git a/app/assets/javascripts/sitewide/active_storage_previews.js b/app/assets/javascripts/sitewide/active_storage_previews.js index 2a7ddb6bf..32697ae23 100644 --- a/app/assets/javascripts/sitewide/active_storage_previews.js +++ b/app/assets/javascripts/sitewide/active_storage_previews.js @@ -27,6 +27,12 @@ var ActiveStoragePreviews = (function() { showPreview: function(ev) { $(ev.target).css('opacity', 1); $(ev.target).parent().removeClass('processing'); + }, + reloadPreview: function(target) { + $(target) + .one('error', (event) => this.reCheckPreview(event)) + .one('load', (event) => this.showPreview(event)) + .trigger('error'); } }); }()); @@ -37,9 +43,9 @@ $(document).on('turbolinks:load', function() { .one('error', (event) => ActiveStoragePreviews.reCheckPreview(event)) .each(function() { if (this.complete) { - $(this).load(); + $(this).trigger('load'); } else if (this.error) { - $(this).error(); + $(this).trigger('error'); } }); }); diff --git a/app/assets/javascripts/sitewide/datatable_helpers.js b/app/assets/javascripts/sitewide/datatable_helpers.js index b6d86c17c..4313ec462 100644 --- a/app/assets/javascripts/sitewide/datatable_helpers.js +++ b/app/assets/javascripts/sitewide/datatable_helpers.js @@ -30,7 +30,7 @@ var DataTableHelpers = (function() { .removeClass('form-control input-sm') .css('margin', 0); $('.dataTables_filter').append(` - diff --git a/app/assets/javascripts/sitewide/image_editor.js b/app/assets/javascripts/sitewide/image_editor.js index b451b5a54..df60717bd 100644 --- a/app/assets/javascripts/sitewide/image_editor.js +++ b/app/assets/javascripts/sitewide/image_editor.js @@ -1,5 +1,6 @@ -/* global animateSpinner fabric PerfectScrollbar refreshProtocolStatusBar tui Uint8Array*/ -/* eslint-disable no-underscore-dangle */ +/* global animateSpinner fabric PerfectScrollbar refreshProtocolStatusBar tui Uint8Array ActiveStoragePreviews*/ +/* eslint-disable no-underscore-dangle no-unused-vars */ + var ImageEditorModal = (function() { @@ -364,9 +365,12 @@ var ImageEditorModal = (function() { contentType: false, processData: false, success: function(res) { - $(`.asset[data-asset-id=${data.id}] .image-container img`).replaceWith($(res.html).find('.image-container img')); - $(`.asset[data-asset-id=${data.id}] .attachment-preview img`).replaceWith($(res.html).find('attachment-preview img')); + $(`.asset[data-asset-id=${data.id}] .image-container img`) + .replaceWith($(res.html).find('.image-container img')); + $(`.asset[data-asset-id=${data.id}] .attachment-preview img`) + .replaceWith($(res.html).find('.attachment-preview img')); $(`.asset[data-asset-id=${data.id}]`).closest('.attachments').trigger('reorder'); + ActiveStoragePreviews.reloadPreview(`.asset[data-asset-id=${data.id}] .attachment-preview img`); closeEditor(); } }); diff --git a/app/assets/javascripts/sitewide/show_password.js b/app/assets/javascripts/sitewide/show_password.js index b4747578a..9b0727d98 100644 --- a/app/assets/javascripts/sitewide/show_password.js +++ b/app/assets/javascripts/sitewide/show_password.js @@ -5,7 +5,6 @@ function initShowPassword() { style=" cursor: pointer; z-index: 10; - top: ${$(e).position().top}px ">`).insertAfter(e); $(e).parent().addClass('right-icon'); }); diff --git a/app/assets/javascripts/system_notifications/index.js b/app/assets/javascripts/system_notifications/index.js deleted file mode 100644 index a285116f0..000000000 --- a/app/assets/javascripts/system_notifications/index.js +++ /dev/null @@ -1,45 +0,0 @@ -'use strict'; - -// update selected notiifcations -function SystemNotificationsMarkAsSeen() { - if ($('.system-notification[data-new="1"]').length > 0) { - $.post('/system_notifications/mark_as_seen'); - } -} - -function bindSystemNotificationAjax() { - var SystemNotificationModal = null; - var SystemNotificationModalBody = null; - var SystemNotificationModalTitle = null; - - SystemNotificationModal = $('#manage-module-system-notification-modal'); - SystemNotificationModalBody = SystemNotificationModal.find('.modal-body'); - SystemNotificationModalTitle = SystemNotificationModal.find('#manage-module-system-notification-modal-label'); - - $('.modal-system-notification') - .on('ajax:success', function(ev, data) { - var SystemNotification = $('.system-notification[data-system-notification-id=' + data.id + ']'); - SystemNotificationModalBody.html(data.modal_body); - SystemNotificationModalTitle.text(data.modal_title); - $('.dropdown.system-notifications').removeClass('open'); - // Open modal - SystemNotificationModal.modal('show'); - }); -} - -function initSystemNotificationsButton() { - $('.btn-more-system-notifications') - .on('ajax:success', function(e, data) { - $(data.html).insertAfter($('.system-notifications-container .system-notification').last()); - bindSystemNotificationAjax(); - if (data.more_url) { - $(this).attr('href', data.more_url); - } else { - $(this).remove(); - } - }); -} - -initSystemNotificationsButton(); -SystemNotificationsMarkAsSeen(); -bindSystemNotificationAjax(); diff --git a/app/assets/javascripts/system_notifications/system_notification_modal.js b/app/assets/javascripts/system_notifications/system_notification_modal.js deleted file mode 100644 index 7eb005749..000000000 --- a/app/assets/javascripts/system_notifications/system_notification_modal.js +++ /dev/null @@ -1 +0,0 @@ -$('#manage-module-system-notification-modal').modal('show'); diff --git a/app/assets/stylesheets/dashboard/current_tasks.scss b/app/assets/stylesheets/dashboard/current_tasks.scss index b0d5ddfaa..3942b8f03 100644 --- a/app/assets/stylesheets/dashboard/current_tasks.scss +++ b/app/assets/stylesheets/dashboard/current_tasks.scss @@ -17,11 +17,8 @@ .search-container { flex-basis: 36px; - .fa-search { - animation-timing-function: $timing-function-sharp; - color: $color-alto; - transition: .3s; - width: 26px; + .sn-icon { + position: absolute; } .task-search-field { @@ -36,10 +33,6 @@ border: $border-transparent; cursor: pointer; width: 36px; - - + .fa-search { - color: $color-volcano; - } } &:hover { @@ -50,10 +43,6 @@ border: $border-focus; cursor: auto; width: 200px; - - + .fa-search { - color: $color-alto; - } } diff --git a/app/assets/stylesheets/my_modules/protocols/index.scss b/app/assets/stylesheets/my_modules/protocols/index.scss index 044e5d155..00c52d9cb 100644 --- a/app/assets/stylesheets/my_modules/protocols/index.scss +++ b/app/assets/stylesheets/my_modules/protocols/index.scss @@ -617,12 +617,17 @@ } .status-label { - @include font-small; + @include font-button; flex-basis: 50%; - font-weight: 700; margin-right: .5em; text-align: right; + .status-title { + @include font-small; + color: var(--sn-grey); + margin-right: .2em; + } + .status-note { font-weight: normal; } diff --git a/app/assets/stylesheets/my_modules/status_flow.scss b/app/assets/stylesheets/my_modules/status_flow.scss index 3e9ba906c..42740920c 100644 --- a/app/assets/stylesheets/my_modules/status_flow.scss +++ b/app/assets/stylesheets/my_modules/status_flow.scss @@ -8,9 +8,15 @@ .dropdown-toggle { border: 0; color: $color-white; + padding: .5rem .5rem .5rem 1rem; text-align: left; width: 100%; + &.btn-not-started { + border: 1px solid var(--sn-sleepy-grey); + color: var(--sn-black); + } + .caret { margin: 8px 0; } @@ -67,6 +73,11 @@ white-space: nowrap; } + .btn-not-started { + border: 1px solid var(--sn-sleepy-grey); + color: var(--sn-black); + } + .error-message { @include font-small; color: $color-silver-chalice; @@ -126,6 +137,11 @@ line-height: 1em; padding: .5em; white-space: nowrap; + + &.btn-not-started { + border: 1px solid var(--sn-sleepy-grey); + color: var(--sn-black); + } } .status-comment { diff --git a/app/assets/stylesheets/navigation/notifications.scss b/app/assets/stylesheets/navigation/notifications.scss index b3326be31..5322db761 100644 --- a/app/assets/stylesheets/navigation/notifications.scss +++ b/app/assets/stylesheets/navigation/notifications.scss @@ -58,24 +58,6 @@ } } - .sci--navigation--notificaitons-flyout-tabs { - align-items: center; - display: flex; - flex-basis: 2.5rem; - flex-shrink: 0; - gap: 3rem; - } - - .sci--navigation--notificaitons-flyout-tab { - cursor: pointer; - padding: .5rem .625rem; - position: relative; - - &.active { - color: $brand-focus; - } - } - hr { margin: .625rem 0; } diff --git a/app/assets/stylesheets/projects.scss b/app/assets/stylesheets/projects.scss index 1031a8bcf..4c26552e4 100644 --- a/app/assets/stylesheets/projects.scss +++ b/app/assets/stylesheets/projects.scss @@ -967,6 +967,7 @@ li.module-hover { grid-column: 1 span; -webkit-box-orient: vertical; display: -webkit-box; + display: flex; -webkit-line-clamp: 2; } diff --git a/app/assets/stylesheets/protocols/tinymce_editor.scss b/app/assets/stylesheets/protocols/tinymce_editor.scss index 34539866f..77c96a071 100644 --- a/app/assets/stylesheets/protocols/tinymce_editor.scss +++ b/app/assets/stylesheets/protocols/tinymce_editor.scss @@ -49,8 +49,7 @@ padding: .1em 0; &:hover { - border: 1px solid $color-silver; - border-radius: 3px; + border: 1px solid transparent; } } } diff --git a/app/assets/stylesheets/report_index.scss b/app/assets/stylesheets/report_index.scss index d2875f12a..3772c18da 100644 --- a/app/assets/stylesheets/report_index.scss +++ b/app/assets/stylesheets/report_index.scss @@ -89,7 +89,7 @@ } } td:nth-child(4) { - min-width: min-content; + min-width: 60px; } } diff --git a/app/assets/stylesheets/reports_print.scss b/app/assets/stylesheets/reports_print.scss index 1dacc2a32..18ac71a92 100644 --- a/app/assets/stylesheets/reports_print.scss +++ b/app/assets/stylesheets/reports_print.scss @@ -42,24 +42,20 @@ div.print-report { .report-project-header-element { & > .report-element-body .project-name { color: $color-black; - white-space: nowrap; } &:hover > .report-element-body .project-name { color: $color-black; - white-space: nowrap; } } .report-module-element:hover { & > .report-element-body .module-name { color: $color-black; - white-space: nowrap; } &:hover > .report-element-body .module-name { color: $color-black; - white-space: nowrap; } } diff --git a/app/assets/stylesheets/repository/repository_table.scss b/app/assets/stylesheets/repository/repository_table.scss index 36a21c482..60a6dfcaa 100644 --- a/app/assets/stylesheets/repository/repository_table.scss +++ b/app/assets/stylesheets/repository/repository_table.scss @@ -81,17 +81,20 @@ } // Cells - td { - white-space: nowrap; + td.added-on, + td.asset-value-cell { overflow: hidden; text-overflow: ellipsis; + white-space: nowrap; } // Assigned .assigned-column { + overflow: unset; padding: 1px 8px; position: relative; + white-space: nowrap; .sn-icon.sn-icon-edit { line-height: 35px; @@ -170,6 +173,10 @@ } } + .checklist-column { + overflow: unset; + } + .item-name { padding: 2px 8px; @@ -414,6 +421,10 @@ } } } + + td { + overflow: visible; + } } } } diff --git a/app/assets/stylesheets/settings/teams.scss b/app/assets/stylesheets/settings/teams.scss index ce241cbb2..8af5034d5 100644 --- a/app/assets/stylesheets/settings/teams.scss +++ b/app/assets/stylesheets/settings/teams.scss @@ -29,6 +29,10 @@ } } + .team-share-permission:disabled { + cursor: not-allowed; + } + .team-description { display: inline-block; margin-top: 16px; diff --git a/app/assets/stylesheets/shared/datetime_picker.scss b/app/assets/stylesheets/shared/datetime_picker.scss index 88d52ba74..0cd90c54b 100644 --- a/app/assets/stylesheets/shared/datetime_picker.scss +++ b/app/assets/stylesheets/shared/datetime_picker.scss @@ -9,6 +9,10 @@ font-size: 13px; } + .datepicker thead th { + padding: 5px 5px !important; + } + .timepicker-picker { padding: 0 60px; diff --git a/app/assets/stylesheets/shared_styles/elements/input_fields.scss b/app/assets/stylesheets/shared_styles/elements/input_fields.scss index ae215be71..d350c77a2 100644 --- a/app/assets/stylesheets/shared_styles/elements/input_fields.scss +++ b/app/assets/stylesheets/shared_styles/elements/input_fields.scss @@ -50,6 +50,7 @@ } .sn-icon { + bottom: 6px; position: absolute; text-align: center; width: 25px; @@ -79,10 +80,11 @@ &.error { &::after { @include font-awesome; - top: 0; + bottom: 6px; position: absolute; right: 5px; text-align: center; + top: 6px; width: 25px; } } diff --git a/app/assets/stylesheets/shared_styles/elements/toggles.scss b/app/assets/stylesheets/shared_styles/elements/toggles.scss index 69dbbe300..360afcc2f 100644 --- a/app/assets/stylesheets/shared_styles/elements/toggles.scss +++ b/app/assets/stylesheets/shared_styles/elements/toggles.scss @@ -52,6 +52,12 @@ input[type="checkbox"].sci-toggle-checkbox { } } + &:focus + .sci-toggle-checkbox-label { + box-shadow: 0 0 0 4px var(--sn-science-blue-hover); + outline: 2px solid transparent; + outline-offset: 2px; + } + &.hidden + .sci-toggle-checkbox-label { display: none; } diff --git a/app/assets/stylesheets/steps/step_attachments.scss b/app/assets/stylesheets/steps/step_attachments.scss index 612b850b8..56bd1eec2 100644 --- a/app/assets/stylesheets/steps/step_attachments.scss +++ b/app/assets/stylesheets/steps/step_attachments.scss @@ -85,10 +85,6 @@ display: none; } } - - #wopi_file_edit_button { - margin-left: -8px; - } } .add-file-modal { diff --git a/app/assets/stylesheets/tailwind/buttons.css b/app/assets/stylesheets/tailwind/buttons.css index fe3950a4c..440afc803 100644 --- a/app/assets/stylesheets/tailwind/buttons.css +++ b/app/assets/stylesheets/tailwind/buttons.css @@ -83,9 +83,9 @@ } .btn.btn-shared { - background-color: var(--sn-white); - border: 1px solid var(--sn-coral); - color: var(--sn-coral); + background-color: var(--sn-science-blue); + border: 1px solid var(--sn-white); + color: var(--sn-white); } .btn.btn-secondary:hover, diff --git a/app/assets/stylesheets/tailwind/inputs.css b/app/assets/stylesheets/tailwind/inputs.css index 27055b4cc..f64561fa8 100644 --- a/app/assets/stylesheets/tailwind/inputs.css +++ b/app/assets/stylesheets/tailwind/inputs.css @@ -1,6 +1,6 @@ @layer components { .sci-input-container-v2 { - @apply relative h-[2.75rem] flex items-center; + @apply relative h-[2.5rem] flex items-center; } .sci-input-container-v2.input-sm { @@ -25,7 +25,7 @@ } .sci-input-container-v2 input:focus { - border-color: var(--sn-sleepy-grey); + border-color: var(--sn-science-blue); box-shadow: none; } diff --git a/app/controllers/label_templates_controller.rb b/app/controllers/label_templates_controller.rb index fbdbecbcf..cbc13c7c6 100644 --- a/app/controllers/label_templates_controller.rb +++ b/app/controllers/label_templates_controller.rb @@ -174,7 +174,7 @@ class LabelTemplatesController < ApplicationController end def load_label_templates - @label_templates = LabelTemplate.where(team_id: current_team.id) + @label_templates = LabelTemplate.enabled? ? current_team.label_templates : current_team.label_templates.default end def load_label_template diff --git a/app/controllers/reports_controller.rb b/app/controllers/reports_controller.rb index f33488b69..375335c03 100644 --- a/app/controllers/reports_controller.rb +++ b/app/controllers/reports_controller.rb @@ -323,12 +323,13 @@ class ReportsController < ApplicationController def load_wizard_vars @templates = Extends::REPORT_TEMPLATES - live_repositories = Repository.accessible_by_teams(current_team).active + live_repositories = Repository.accessible_by_teams(current_team).sort_by { |r| r.name.downcase } snapshots_of_deleted = RepositorySnapshot.left_outer_joins(:original_repository) .where(team: current_team) .where.not(original_repository: live_repositories) .select('DISTINCT ON ("repositories"."parent_id") "repositories".*') - @repositories = (live_repositories + snapshots_of_deleted).sort_by { |r| r.name.downcase } + .sort_by { |r| r.name.downcase } + @repositories = live_repositories + snapshots_of_deleted @visible_projects = current_team.projects .active .joins(experiments: :my_modules) diff --git a/app/controllers/system_notifications_controller.rb b/app/controllers/system_notifications_controller.rb deleted file mode 100644 index 34f85d872..000000000 --- a/app/controllers/system_notifications_controller.rb +++ /dev/null @@ -1,56 +0,0 @@ -# frozen_string_literal: true - -class SystemNotificationsController < ApplicationController - def show - current_user.user_system_notifications.mark_as_read(params[:id]) - render json: current_user.system_notifications.modals - .find_by_id(params[:id]) || {} - end - - # Update seen_at parameter for system notifications - def mark_as_seen - current_user.user_system_notifications.mark_as_seen - render json: { result: 'ok' } - rescue StandardError - render json: { result: 'failed' } - end - - # Update read_at parameter for system notifications - def mark_as_read - current_user.user_system_notifications.mark_as_read(params[:id]) - render json: { result: 'ok' } - rescue StandardError - render json: { result: 'failed' } - end - - def unseen_counter - render json: { - notificationNmber: current_user.user_system_notifications.unseen.count - } - end - - private - - def prepare_notifications - page = (params[:page] || 1).to_i - query = params[:search_queue] - per_page = Constants::ACTIVITY_AND_NOTIF_SEARCH_LIMIT - notifications = SystemNotification.last_notifications(current_user, query) - .page(page) - .per(per_page) - - unless notifications.blank? || notifications.last_page? - more_url = url_for( - system_notifications_url( - format: :json, - page: page + 1, - search_queue: query - ) - ) - end - @system_notifications = { - notifications: notifications, - more_notifications_url: more_url - } - end -end diff --git a/app/controllers/user_notifications_controller.rb b/app/controllers/user_notifications_controller.rb index 55c9cae81..214ccc033 100644 --- a/app/controllers/user_notifications_controller.rb +++ b/app/controllers/user_notifications_controller.rb @@ -13,44 +13,20 @@ class UserNotificationsController < ApplicationController UserNotification.where( notification_id: notifications.except(:select).where.not(type_of: 2).select(:id) ).seen_by_user(current_user) - - current_user.user_system_notifications.where( - system_notification_id: notifications.except(:select).where(type_of: 2).select(:id) - ).mark_as_seen end def unseen_counter render json: { - unseen: load_notifications.where(checked: false).size + unseen: load_notifications.where('user_notifications.checked = ?', false).size } end private def load_notifications - user_notifications = current_user.notifications - .select(:id, :type_of, :title, :message, :created_at, 'user_notifications.checked') - system_notifications = current_user.system_notifications - .select( - :id, - '2 AS type_of', - :title, - 'description AS message', - :created_at, - 'CASE WHEN seen_at IS NULL THEN false ELSE true END AS checked' - ) - notifications = - case params[:type] - when 'message' - user_notifications - when 'system' - Notification.from("(#{system_notifications.to_sql}) AS notifications") - else - Notification.from( - "((#{user_notifications.to_sql}) UNION ALL (#{system_notifications.to_sql})) AS notifications" - ) - end - notifications.order(created_at: :desc) + current_user.notifications + .select(:id, :type_of, :title, :message, :created_at, 'user_notifications.checked') + .order(created_at: :desc) end def notification_serializer(notifications) @@ -62,8 +38,7 @@ class UserNotificationsController < ApplicationController message: notification.message, created_at: I18n.l(notification.created_at, format: :full), today: notification.created_at.today?, - checked: notification.checked, - action_url: (system_notification_path(notification.id) if notification.type_of == 'system_message') + checked: notification.checked } end end diff --git a/app/controllers/users/sessions_controller.rb b/app/controllers/users/sessions_controller.rb index 9e45c2327..de1294447 100644 --- a/app/controllers/users/sessions_controller.rb +++ b/app/controllers/users/sessions_controller.rb @@ -2,7 +2,6 @@ class Users::SessionsController < Devise::SessionsController layout :session_layout - after_action :after_sign_in, only: %i(create authenticate_with_two_factor) before_action :remove_authenticate_mesasge_if_root_path, only: :new prepend_before_action :skip_timeout, only: :expire_in @@ -58,10 +57,6 @@ class Users::SessionsController < Devise::SessionsController @initial_page = stored_location_for(:user) end - def after_sign_in - flash[:system_notification_modal] = true - end - def authenticate_with_two_factor user = User.find_by(id: session[:otp_user_id]) diff --git a/app/datatables/team_users_datatable.rb b/app/datatables/team_users_datatable.rb index 324885b0c..18cea0be7 100644 --- a/app/datatables/team_users_datatable.rb +++ b/app/datatables/team_users_datatable.rb @@ -66,7 +66,7 @@ class TeamUsersDatatable < CustomDatatable '2': record.user_role.name, '3': I18n.l(record.created_at, format: :full_date), '4': record.user.active_status_str, - '5': ApplicationController.new.render_to_string( + '5': @view.controller.render_to_string( partial: 'users/settings/teams/user_dropdown', locals: { user_assignment: record, diff --git a/app/javascript/packs/application.js b/app/javascript/packs/application.js index 3ef4f2769..de0a5fe3e 100644 --- a/app/javascript/packs/application.js +++ b/app/javascript/packs/application.js @@ -9,7 +9,7 @@ require('jquery-ui/ui/widgets/droppable'); require('jquery-ui/ui/effects/effect-slide'); require('hammerjs'); import 'bootstrap'; -window.moment = require('moment'); +import './bootstrap.less'; require('bootstrap-select/js/bootstrap-select'); window.bwipjs = require('bwip-js'); @@ -37,3 +37,13 @@ $(document).on('click', '.btn', function() { $(this).blur(); }); +// Needed to support Turbolinks redirect_to responses as unsafe-inline is blocked by the CSP +$.ajaxSetup({ + converters: { + 'text script': function(text) { + $.globalEval(text, { nonce: document.querySelector('meta[name="csp-nonce"]').getAttribute('content') }); + return text; + } + } +}); + diff --git a/app/javascript/packs/bootstrap.less b/app/javascript/packs/bootstrap.less new file mode 100644 index 000000000..e0f9fb923 --- /dev/null +++ b/app/javascript/packs/bootstrap.less @@ -0,0 +1,140 @@ + +@import '~bootstrap/less/variables.less'; + +@color-white: #fff; +@color-concrete: #eaecf0; +@color-alto: #d0d5dd; +@color-silver-chalice: #98a2b3; +@color-volcano: #475467; +@color-black: #1d2939; + +@brand-primary: #104da9; +@brand-primary-hover: #2d5faa; +@brand-primary-press: #07244f; +@brand-primary-light: #7094cb; + +@brand-focus: #3b99fd; +@brand-focus-light: #f0f8ff; + +@brand-success: #5ec66f; +@brand-success-light: #cbefd7; + +@brand-danger: #ce0c24; +@brand-danger-hover: #ad0015; +@brand-danger-press: #801515; +@brand-danger-light: #f9c9c9; + +@brand-warning: #f0ad4e; +@brand-complementary: #ffcf26; +@brand-warning-light: #fbebd3; + +@gray-darker: @color-black; +@gray-dark: @color-black; +@gray: @color-black; +@gray-light: @color-volcano; +@gray-lighter: @color-concrete; + +@state-success-text: @brand-success; +@state-success-bg: @brand-success-light; +@state-info-text: @brand-focus; +@state-info-bg: @brand-focus-light; +@state-warning-text: @brand-warning; +@state-warning-bg: @brand-warning-light; +@state-danger-text: @brand-danger; +@state-danger-bg: @brand-danger-light; + +@alert-padding: 15px; +@alert-border-radius: @border-radius-base; +@alert-link-font-weight: bold; +@alert-success-bg: @brand-success-light; +@alert-success-text: @brand-success; +@alert-info-bg: @brand-focus-light; +@alert-info-text: @brand-focus; +@alert-warning-bg: @brand-warning-light; +@alert-warning-text: @brand-warning; +@alert-danger-bg: @brand-danger-light; +@alert-danger-text: @brand-danger; + +@padding-base-vertical: 6px; +@padding-base-horizontal: 12px; +@padding-large-vertical: 10px; +@padding-large-horizontal: 16px; +@padding-small-vertical: 5px; +@padding-small-horizontal: 10px; +@padding-xs-vertical: 1px; +@padding-xs-horizontal: 5px; +@line-height-large: 1.3333333; +@line-height-small: 1.5; +@border-radius-base: 4px; +@border-radius-large: 6px; +@border-radius-small: 3px; +@component-active-color: @color-white; +@component-active-bg: @brand-primary; +@caret-width-base: 4px; +@caret-width-large: 5px; + +@font-size-base: 14px; +@headings-font-weight: bold; + +@font-size-h1: 24px; +@font-size-h2: 18px; +@font-size-h3: @font-size-base; +@font-size-h4: @font-size-base; +@font-size-h5: @font-size-base; +@font-size-h6: 12px; + +@container-tablet: auto; +@container-sm: auto; +@container-desktop: auto; +@container-md: auto; +@container-large-desktop: auto; +@container-lg: auto; + +@import "~bootstrap/less/mixins.less"; + +// Reset and dependencies +@import "~bootstrap/less/normalize.less"; +@import "~bootstrap/less/print.less"; +@import "~bootstrap/less/glyphicons.less"; + +// Core CSS +@import "~bootstrap/less/scaffolding.less"; +@import "~bootstrap/less/type.less"; +@import "~bootstrap/less/code.less"; +@import "~bootstrap/less/grid.less"; +@import "~bootstrap/less/tables.less"; +@import "~bootstrap/less/forms.less"; + +// Components +@import "~bootstrap/less/component-animations.less"; +@import "~bootstrap/less/dropdowns.less"; +@import "~bootstrap/less/button-groups.less"; +@import "~bootstrap/less/input-groups.less"; +@import "~bootstrap/less/navs.less"; +@import "~bootstrap/less/navbar.less"; +@import "~bootstrap/less/breadcrumbs.less"; +@import "~bootstrap/less/pagination.less"; +@import "~bootstrap/less/pager.less"; +@import "~bootstrap/less/labels.less"; +@import "~bootstrap/less/badges.less"; +@import "~bootstrap/less/jumbotron.less"; +@import "~bootstrap/less/thumbnails.less"; +@import "~bootstrap/less/alerts.less"; +@import "~bootstrap/less/progress-bars.less"; +@import "~bootstrap/less/media.less"; +@import "~bootstrap/less/list-group.less"; +@import "~bootstrap/less/panels.less"; +@import "~bootstrap/less/responsive-embed.less"; +@import "~bootstrap/less/wells.less"; +@import "~bootstrap/less/close.less"; + +// Components w/ JavaScript +@import "~bootstrap/less/modals.less"; +@import "~bootstrap/less/tooltip.less"; +@import "~bootstrap/less/popovers.less"; +@import "~bootstrap/less/carousel.less"; + +// Utility classes +@import "~bootstrap/less/utilities.less"; +@import "~bootstrap/less/responsive-utilities.less"; + diff --git a/app/javascript/packs/bootstrap.scss b/app/javascript/packs/bootstrap.scss deleted file mode 100644 index 327bd375d..000000000 --- a/app/javascript/packs/bootstrap.scss +++ /dev/null @@ -1 +0,0 @@ -@import "~bootstrap/dist/css/bootstrap.css"; diff --git a/app/javascript/vue/navigation/notifications/notification_item.vue b/app/javascript/vue/navigation/notifications/notification_item.vue index d5862691d..0d9f05467 100644 --- a/app/javascript/vue/navigation/notifications/notification_item.vue +++ b/app/javascript/vue/navigation/notifications/notification_item.vue @@ -9,8 +9,7 @@
-
-
{{ i18n.t('nav.notifications.read_more') }} +
@@ -25,26 +24,12 @@ export default { switch(this.notification.type_of) { case 'deliver': return 'fa-truck'; - case 'system_message': - return 'fa-gift'; case 'assignment': return 'fa-list-alt'; case 'recent_changes': return 'fa-list-alt'; } } - }, - methods: { - showSystemNotification() { - $.get(this.notification.action_url, (data) => { - let systemNotificationModal = $('#manage-module-system-notification-modal'); - let systemNotificationModalBody = systemNotificationModal.find('.modal-body'); - let systemNotificationModalTitle = systemNotificationModal.find('#manage-module-system-notification-modal-label'); - systemNotificationModalBody.html(data.modal_body); - systemNotificationModalTitle.text(data.modal_title); - systemNotificationModal.modal('show'); - }); - } } } diff --git a/app/javascript/vue/navigation/notifications/notifications_flyout.vue b/app/javascript/vue/navigation/notifications/notifications_flyout.vue index b6aed228e..c5c1feb60 100644 --- a/app/javascript/vue/navigation/notifications/notifications_flyout.vue +++ b/app/javascript/vue/navigation/notifications/notifications_flyout.vue @@ -4,24 +4,6 @@ {{ i18n.t('nav.notifications.title') }}
-
-
- {{ i18n.t('nav.notifications.all') }} -
-
- {{ i18n.t('nav.notifications.message') }} -
-
- {{ i18n.t('nav.notifications.system') }} -
-

@@ -55,7 +37,6 @@ export default { data() { return { notifications: [], - activeTab: 'all', nextPage: 1, scrollBar: null, loadingPage: false @@ -66,8 +47,10 @@ export default { }, mounted() { let container = this.$refs.scrollContainer.$el - container.addEventListener('ps-y-reach-end', (e) => { - this.loadNotifications(); + container.addEventListener('ps-scroll-y', (e) => { + if (e.target.scrollTop + e.target.clientHeight >= e.target.scrollHeight - 20) { + this.loadNotifications(); + } }) }, computed: { @@ -82,17 +65,11 @@ export default { } }, methods: { - setActiveTab(selection) { - this.activeTab = selection; - this.nextPage = 1; - this.notifications = []; - this.loadNotifications(); - }, loadNotifications() { if (this.nextPage == null || this.loadingPage) return; this.loadingPage = true; - $.getJSON(this.notificationsUrl, { type: this.activeTab, page: this.nextPage }, (result) => { + $.getJSON(this.notificationsUrl, { page: this.nextPage }, (result) => { this.notifications = this.notifications.concat(result.notifications); this.nextPage = result.next_page; this.loadingPage = false; diff --git a/app/javascript/vue/repository_search/container.vue b/app/javascript/vue/repository_search/container.vue index 64745dc68..4c4caad78 100644 --- a/app/javascript/vue/repository_search/container.vue +++ b/app/javascript/vue/repository_search/container.vue @@ -3,7 +3,7 @@ class="flex items-center mr-3 flex-nowrap relative" v-click-outside="{handler: 'closeSearchInputs', exclude: ['searchInput', 'searchInputBtn', 'barcodeSearchInput', 'barcodeSearchInputBtn']}" > -
@@ -28,7 +28,7 @@
- diff --git a/app/javascript/vue/shareable_links/components/delete_shareable_link.vue b/app/javascript/vue/shareable_links/components/delete_shareable_link.vue index 8a9e37142..1831121eb 100644 --- a/app/javascript/vue/shareable_links/components/delete_shareable_link.vue +++ b/app/javascript/vue/shareable_links/components/delete_shareable_link.vue @@ -3,7 +3,7 @@ diff --git a/app/javascript/vue/shareable_links/components/shareable_link_modal.vue b/app/javascript/vue/shareable_links/components/shareable_link_modal.vue index 57b951291..eed78719a 100644 --- a/app/javascript/vue/shareable_links/components/shareable_link_modal.vue +++ b/app/javascript/vue/shareable_links/components/shareable_link_modal.vue @@ -19,6 +19,7 @@ type="button" class="close float-right !ml-auto" data-dismiss="modal" + tabindex="0" aria-label="Close" > @@ -32,6 +33,7 @@ v-model="sharedEnabled" id="checkbox" class="sci-toggle-checkbox" + tabindex="0" @change="checkboxChange" @keyup.enter="handleCheckboxEnter"/> @@ -40,6 +42,7 @@
",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="",le.option=!!xe.lastChild;var ke={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n",""]);var je=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function Me(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="
",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return R(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return R(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 0= 2.1.2 < 3" -iconv-lite@^0.6.2: +iconv-lite@^0.6.2, iconv-lite@^0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== @@ -4060,6 +4074,11 @@ ignore@^5.2.0: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== +image-size@~0.5.0: + version "0.5.5" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" + integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ== + immutability-helper@^2.7.1: version "2.9.1" resolved "https://registry.yarnpkg.com/immutability-helper/-/immutability-helper-2.9.1.tgz#71c423ba387e67b6c6ceba0650572f2a2a6727df" @@ -4372,6 +4391,11 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" +is-what@^3.14.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" + integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -4401,6 +4425,11 @@ jquery-autosize@^1.18.18: resolved "https://registry.yarnpkg.com/jquery-autosize/-/jquery-autosize-1.18.18.tgz#28fcdfd671cbf3ee661ca484c19ee7aaa65e825a" integrity sha512-Z2nzJEbchigrxqqqr026TMPdTZJ8syt2xeGMGkqCXbb1raI3J/X0LdiIhyIMcJ+nTjwTBf/p6bbRVP0vAuqd/w== +jquery-migrate@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/jquery-migrate/-/jquery-migrate-3.4.1.tgz#6a7114626b80e0d9e1cb77f170623efd85c5fc9c" + integrity sha512-6RaV23lLAYccu8MtLfy2sIxOvx+bulnWHm/pvffAi7KOzPk1sN9IYglpkl1ZNCj1FSgSNDPS2fSZ1hWsXc200Q== + jquery-mousewheel@^3.1.13: version "3.1.13" resolved "https://registry.yarnpkg.com/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz#06f0335f16e353a695e7206bf50503cb523a6ee5" @@ -4588,6 +4617,28 @@ klona@^2.0.4: resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22" integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== +less-loader@^11.1.3: + version "11.1.3" + resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-11.1.3.tgz#1bb62d6ca9bf00a177c02793b54baac40f9be694" + integrity sha512-A5b7O8dH9xpxvkosNrP0dFp2i/dISOJa9WwGF3WJflfqIERE2ybxh1BFDj5CovC2+jCE4M354mk90hN6ziXlVw== + +less@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/less/-/less-4.2.0.tgz#cbefbfaa14a4cd388e2099b2b51f956e1465c450" + integrity sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA== + dependencies: + copy-anything "^2.0.1" + parse-node-version "^1.0.1" + tslib "^2.3.0" + optionalDependencies: + errno "^0.1.1" + graceful-fs "^4.1.2" + image-size "~0.5.0" + make-dir "^2.1.0" + mime "^1.4.1" + needle "^3.1.0" + source-map "~0.6.0" + levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -4733,6 +4784,14 @@ lru-cache@^7.7.1: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== +make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + make-dir@^3.0.2, make-dir@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" @@ -4830,6 +4889,11 @@ mime-types@^2.1.12, mime-types@^2.1.27: dependencies: mime-db "1.52.0" +mime@^1.4.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" @@ -4997,6 +5061,15 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== +needle@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/needle/-/needle-3.2.0.tgz#07d240ebcabfd65c76c03afae7f6defe6469df44" + integrity sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ== + dependencies: + debug "^3.2.6" + iconv-lite "^0.6.3" + sax "^1.2.4" + negotiator@^0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" @@ -5331,6 +5404,11 @@ parse-json@^5.0.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" +parse-node-version@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" + integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== + parse5@6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" @@ -5420,6 +5498,11 @@ pify@^2.3.0: resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + pkg-dir@^4.1.0, pkg-dir@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" @@ -5800,6 +5883,11 @@ prop-types@^15.8.1: object-assign "^4.1.1" react-is "^16.13.1" +prr@~1.0.1: + version "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" @@ -6183,6 +6271,11 @@ sass@^1.63.6: immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + saxes@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" @@ -6230,7 +6323,7 @@ semver@7.3.2: resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== -semver@^5.5.0, semver@^5.5.1: +semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: version "5.7.2" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== @@ -6408,7 +6501,7 @@ source-map-support@~0.5.20: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -6782,6 +6875,11 @@ tslib@^2.0.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== +tslib@^2.3.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.1.tgz#fd8c9a0ff42590b25703c0acb3de3d3f4ede0410" + integrity sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig== + tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623"