From c8a3951830b08376113ce5861ac6a7d507c7517d Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Bellet Date: Tue, 2 Feb 2021 16:12:45 +0100 Subject: [PATCH 01/27] add flatpickr add flatpick as a yarn package and import it into the appropriate files (both js and scss) --- app/assets/javascripts/admin/all.js | 17 +++++++++++++++++ app/assets/stylesheets/admin/all.scss | 3 +++ package.json | 4 +++- yarn.lock | 5 +++++ 4 files changed, 28 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/admin/all.js b/app/assets/javascripts/admin/all.js index dea5ac04a9..328a10b87b 100644 --- a/app/assets/javascripts/admin/all.js +++ b/app/assets/javascripts/admin/all.js @@ -24,6 +24,23 @@ //= require angular-rails-templates //= require lodash.underscore.js +// datetimepicker (fil, nb) +//= require flatpickr/dist/flatpickr.min +//= require flatpickr/dist/l10n/ar +//= require flatpickr/dist/l10n/cat +//= require flatpickr/dist/l10n/cy +//= require flatpickr/dist/l10n/de +//= require flatpickr/dist/l10n/es +//= require flatpickr/dist/l10n/fr +//= require flatpickr/dist/l10n/it +//= require flatpickr/dist/l10n/nl +//= require flatpickr/dist/l10n/pl +//= require flatpickr/dist/l10n/pt +//= require flatpickr/dist/l10n/ru +//= require flatpickr/dist/l10n/sv +//= require flatpickr/dist/l10n/tr +//= require shortcut-buttons-flatpickr/dist/shortcut-buttons-flatpickr.min + // spree //= require admin/spree/spree //= require admin/spree/spree-select2 diff --git a/app/assets/stylesheets/admin/all.scss b/app/assets/stylesheets/admin/all.scss index 9784acf9c1..c5138f8b06 100644 --- a/app/assets/stylesheets/admin/all.scss +++ b/app/assets/stylesheets/admin/all.scss @@ -12,6 +12,9 @@ *= require shared/textAngular *= require shared/ng-tags-input.min *= require select2 + *= require flatpickr/dist/flatpickr + *= require flatpickr/dist/themes/material_blue + *= require shortcut-buttons-flatpickr/dist/themes/light *= require_self */ diff --git a/package.json b/package.json index a2728cf9b5..f9bbe28259 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,8 @@ }, "license": "AGPL-3.0", "dependencies": { - "moment": "^2.29.1" + "flatpickr": "^4.6.9", + "moment": "^2.29.1", + "shortcut-buttons-flatpickr": "^0.3.1" } } diff --git a/yarn.lock b/yarn.lock index 299b19faf1..409d35b699 100644 --- a/yarn.lock +++ b/yarn.lock @@ -624,6 +624,11 @@ finalhandler@1.1.2: statuses "~1.5.0" unpipe "~1.0.0" +flatpickr@^4.6.9: + version "4.6.9" + resolved "https://registry.yarnpkg.com/flatpickr/-/flatpickr-4.6.9.tgz#9a13383e8a6814bda5d232eae3fcdccb97dc1499" + integrity sha512-F0azNNi8foVWKSF+8X+ZJzz8r9sE1G4hl06RyceIaLvyltKvDl6vqk9Lm/6AUUCi5HWaIjiUbk7UpeE/fOXOpw== + follow-redirects@^1.0.0: version "1.13.0" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.0.tgz#b42e8d93a2a7eea5ed88633676d6597bc8e384db" From 6cf172abc9f27607b7bf7b7e0b6b189c12177178 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Bellet Date: Fri, 15 Jan 2021 15:39:38 +0100 Subject: [PATCH 02/27] add flatpickr to order cycle and .datetimepicker Add your new date(time)picker on both order cycle and elements with class `.datetimepicker` set the right options to datetimepicker --- .../order_cycles/order_cycles.js.erb.coffee | 16 +--------------- app/assets/javascripts/admin/util.js.erb | 14 +++++++++++++- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/app/assets/javascripts/admin/order_cycles/order_cycles.js.erb.coffee b/app/assets/javascripts/admin/order_cycles/order_cycles.js.erb.coffee index 69735c4a33..72f560b414 100644 --- a/app/assets/javascripts/admin/order_cycles/order_cycles.js.erb.coffee +++ b/app/assets/javascripts/admin/order_cycles/order_cycles.js.erb.coffee @@ -3,21 +3,7 @@ angular.module('admin.orderCycles', ['ngTagsInput', 'admin.indexUtils', 'admin.e require: "ngModel" link: (scope, element, attrs, ngModel) -> $timeout -> - # using $parse instead of scope[attrs.datetimepicker] for cases - # where attrs.datetimepicker is 'foo.bar.lol' - $(element).datetimepicker( - Object.assign( - window.JQUERY_UI_DATETIME_PICKER_DEFAULTS, - { - onSelect: (dateText, inst) -> - scope.$apply(-> - element.val(dateText) - parsed = $parse(attrs.datetimepicker) - parsed.assign(scope, dateText) - ) - } - ) - ) + flatpickr(element, window.FLATPICKR_DATETIME_DEFAULT); .directive 'ofnOnChange', -> (scope, element, attrs) -> diff --git a/app/assets/javascripts/admin/util.js.erb b/app/assets/javascripts/admin/util.js.erb index 373dba4767..d903d40d1e 100644 --- a/app/assets/javascripts/admin/util.js.erb +++ b/app/assets/javascripts/admin/util.js.erb @@ -24,7 +24,19 @@ $(document).ready(function(){ stepMinute: 15 } ); - $('.datetimepicker').datetimepicker(window.JQUERY_UI_DATETIME_PICKER_DEFAULTS); + window.FLATPICKR_DATE_DEFAULT = { + dateFormat: "Y-m-d H:i", + locale: I18n.locale + } + window.FLATPICKR_DATETIME_DEFAULT = Object.assign( + {}, + window.FLATPICKR_DATE_DEFAULT, + { + enableTime: true, + time_24hr: true, + } + ); + flatpickr(".datetimepicker", window.FLATPICKR_DATETIME_DEFAULT); $('a.close').click(function(event){ event.preventDefault(); $(this).parent().slideUp(250); From 4d9289c45b7faced61986bdb4a3b03d2389bf56d Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Bellet Date: Fri, 15 Jan 2021 15:19:59 +0100 Subject: [PATCH 03/27] Render flatpickr `input` more enabled by default, `input[readonly]` is styled as disable one. Using flatpickr with these disable inputs need to be customized. By clinking on it, it opens the datepicker widget. --- app/assets/stylesheets/admin/datepicker.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/assets/stylesheets/admin/datepicker.scss b/app/assets/stylesheets/admin/datepicker.scss index 87dcf4b786..3fadd59049 100644 --- a/app/assets/stylesheets/admin/datepicker.scss +++ b/app/assets/stylesheets/admin/datepicker.scss @@ -1,6 +1,10 @@ input.datetimepicker { min-width: 12.9em; } +.container input[readonly].datetimepicker { + background-color: white; + cursor: pointer; +} img.ui-datepicker-trigger { margin-left: -1.75em; From 4f7f8b559a49ed204b1f753119aefd000ca7b375 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Bellet Date: Fri, 15 Jan 2021 15:31:10 +0100 Subject: [PATCH 04/27] localize flatpickr date format Flatpickr can format date. Use a localized dateFormat. --- app/assets/javascripts/admin/util.js.erb | 2 +- app/views/spree/admin/shared/_translations.html.erb | 3 +++ config/locales/en.yml | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/admin/util.js.erb b/app/assets/javascripts/admin/util.js.erb index d903d40d1e..f91c2b53f7 100644 --- a/app/assets/javascripts/admin/util.js.erb +++ b/app/assets/javascripts/admin/util.js.erb @@ -25,7 +25,7 @@ $(document).ready(function(){ } ); window.FLATPICKR_DATE_DEFAULT = { - dateFormat: "Y-m-d H:i", + dateFormat: Spree.translations.flatpickr_date_format, locale: I18n.locale } window.FLATPICKR_DATETIME_DEFAULT = Object.assign( diff --git a/app/views/spree/admin/shared/_translations.html.erb b/app/views/spree/admin/shared/_translations.html.erb index 5daa7234b3..0db2a03330 100644 --- a/app/views/spree/admin/shared/_translations.html.erb +++ b/app/views/spree/admin/shared/_translations.html.erb @@ -3,6 +3,9 @@ { :date_picker => Spree.t(:js_format, :scope => 'date_picker', :default => 'yy/mm/dd'), + :flatpickr_date_format => Spree.t(:flatpickr_date_format, + :scope => 'date_picker', + :default => 'Y-m-d H:i'), :abbr_day_names => I18n.t(:abbr_day_names, :scope => :date), :add => I18n.t(:add, scope: :actions), :are_you_sure_delete => Spree.t(:are_you_sure_delete), diff --git a/config/locales/en.yml b/config/locales/en.yml index ba57144201..f675e32d23 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -3595,6 +3595,7 @@ See the %{link} to find out more about %{sitename}'s features and to start using date_picker: format: ! '%Y-%m-%d' js_format: 'yy-mm-dd' + flatpickr_date_format: "Y-m-d H:i" orders: error_flash_for_unavailable_items: "An item in your cart has become unavailable. Please update the selected quantities." edit: From e06ea6ccd31ac2720322dfe3a52ea4e4a04c3e22 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Bellet Date: Fri, 15 Jan 2021 15:34:09 +0100 Subject: [PATCH 05/27] remove unused options as we use flatpickr, we don't need these options --- app/assets/javascripts/admin/util.js.erb | 25 ------------------- .../spree/admin/shared/_translations.html.erb | 5 +--- config/locales/en.yml | 2 -- 3 files changed, 1 insertion(+), 31 deletions(-) diff --git a/app/assets/javascripts/admin/util.js.erb b/app/assets/javascripts/admin/util.js.erb index f91c2b53f7..61ca9a3087 100644 --- a/app/assets/javascripts/admin/util.js.erb +++ b/app/assets/javascripts/admin/util.js.erb @@ -1,29 +1,4 @@ $(document).ready(function(){ - window.JQUERY_UI_DATE_PICKER_DEFAULTS = { - dateFormat: Spree.translations.date_picker, - dayNames: Spree.translations.abbr_day_names, - dayNamesMin: Spree.translations.abbr_day_names, - monthNames: Spree.translations.month_names, - prevText: Spree.translations.previous, - nextText: Spree.translations.next, - oneLine: true, - showOn: 'button', - buttonImage: "<%= asset_path 'datepicker/cal.gif' %>", - buttonImageOnly: true - } - - window.JQUERY_UI_DATETIME_PICKER_DEFAULTS = Object.assign( - {}, - window.JQUERY_UI_DATE_PICKER_DEFAULTS, - { - currentText: Spree.translations.datetime_ui_current_text, - closeText: Spree.translations.datetime_ui_close_text, - timeText: Spree.translations.datetime_ui_time_text, - timeFormat: 'HH:mm', - controlType: 'select', - stepMinute: 15 - } - ); window.FLATPICKR_DATE_DEFAULT = { dateFormat: Spree.translations.flatpickr_date_format, locale: I18n.locale diff --git a/app/views/spree/admin/shared/_translations.html.erb b/app/views/spree/admin/shared/_translations.html.erb index 0db2a03330..8711706cac 100644 --- a/app/views/spree/admin/shared/_translations.html.erb +++ b/app/views/spree/admin/shared/_translations.html.erb @@ -1,9 +1,6 @@