From 93b59f62be21943e28293fc8b964725740a53520 Mon Sep 17 00:00:00 2001 From: Anil Yanduri Date: Mon, 25 Aug 2025 13:10:23 +0530 Subject: [PATCH 1/4] feat: Update Ruby and Rails version requirements - Add Ruby >= 3.3.7 requirement - Update Rails dependency to >= 7.2 - Bump version to 4.0.0 - Update development dependencies to modern versions - Replace sass-rails with sassc-rails for better SCSS support --- .ruby-version | 2 +- Gemfile | 2 +- lib/recurring_select/version.rb | 2 +- recurring_select.gemspec | 14 ++++++++------ 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/.ruby-version b/.ruby-version index be94e6f5..86fb6504 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -3.2.2 +3.3.7 diff --git a/Gemfile b/Gemfile index a005be66..c340ea36 100644 --- a/Gemfile +++ b/Gemfile @@ -2,4 +2,4 @@ source "https://rubygems.org" gemspec gem "thin" -gem "rails", "~> 7.1.1" +gem "rails", "~> 7.2.0" diff --git a/lib/recurring_select/version.rb b/lib/recurring_select/version.rb index da46c1e5..2db9857e 100644 --- a/lib/recurring_select/version.rb +++ b/lib/recurring_select/version.rb @@ -1,3 +1,3 @@ module RecurringSelect - VERSION = "4.0.0.rc1" + VERSION = "4.0.0" end diff --git a/recurring_select.gemspec b/recurring_select.gemspec index 7b40b6b1..280824dd 100644 --- a/recurring_select.gemspec +++ b/recurring_select.gemspec @@ -14,14 +14,16 @@ Gem::Specification.new do |s| s.files = Dir["{app,config,db,lib}/**/*"] + ["MIT-LICENSE", "Rakefile", "README.md"] s.test_files = Dir["test/**/*"] - s.add_dependency "rails", ">= 6.1" + s.required_ruby_version = ">= 3.3.7" + + s.add_dependency "rails", ">= 7.2" s.add_dependency "ice_cube", ">= 0.11" - s.add_dependency "sass-rails", ">= 5.0" + s.add_dependency "sassc-rails", ">= 2.1" - s.add_development_dependency "bundler", ">= 1.3.5" - s.add_development_dependency "rspec-rails", ">= 2.14" - s.add_development_dependency "rspec", ">= 2.14" - s.add_development_dependency "rake", ">= 0.9.6" + s.add_development_dependency "bundler", ">= 2.0" + s.add_development_dependency "rspec-rails", ">= 7.0" + s.add_development_dependency "rspec", ">= 3.0" + s.add_development_dependency "rake", ">= 13.0" s.license = 'MIT' end From 5a6604a968ac2ccfec9c3ee359a3a04cc11e3a26 Mon Sep 17 00:00:00 2001 From: Anil Yanduri Date: Mon, 25 Aug 2025 13:10:23 +0530 Subject: [PATCH 2/4] chore: Update Rails test configuration for 7.2 - Rename rails-7.0 gemfile to rails-7.2 - Update Rails version in test gemfile to 7.2.0 - Remove deprecated cache format version configuration - Fix Rails 7.2 compatibility issues --- spec/gemfiles/rails-7.2 | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 spec/gemfiles/rails-7.2 diff --git a/spec/gemfiles/rails-7.2 b/spec/gemfiles/rails-7.2 new file mode 100644 index 00000000..1783f57c --- /dev/null +++ b/spec/gemfiles/rails-7.2 @@ -0,0 +1,5 @@ +source "https://rubygems.org" +gemspec path: File.expand_path("../../..", __FILE__) + +gem "thin" +gem "rails", "~> 7.2.0" From 1158d48d25b997310536880ee6f44a8de53232a5 Mon Sep 17 00:00:00 2001 From: Anil Yanduri Date: Mon, 25 Aug 2025 13:10:24 +0530 Subject: [PATCH 3/4] docs: Update changelog for version 4.0.0 - Document Ruby 3.3.7+ and Rails 7.2+ support - Add breaking changes for version requirements - Document SCSS dependency fix with sassc-rails - Add enhancement and fix entries --- CHANGELOG.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f4726054..78db54a4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,14 @@ -# 4.0.0 / upcoming +# 4.0.0 / 2025-08-25 + +* [BREAKING-CHANGE] Drop support for Rails < 7.2 +* [BREAKING-CHANGE] Drop support for Ruby < 3.3.7 +* [BREAKING-CHANGE] Replace sass-rails with sassc-rails for better SCSS compilation +* [ENHANCEMENT] Update to Rails 7.2.2.2 compatibility +* [ENHANCEMENT] Update development dependencies to latest versions +* [FIX] Fix SCSS compilation issues with modern Rails versions +* [FIX] Remove deprecated cache format version configuration + +# 4.0.0.rc1 / upcoming * [BREAKING-CHANGE] Drop support for Rails < 6.1 * [BREAKING-CHANGE] Drop support for Ruby < 3.0 From 89ea46919f210f05e3205024de8077bf790c6c58 Mon Sep 17 00:00:00 2001 From: Anil Yanduri Date: Mon, 25 Aug 2025 13:10:29 +0530 Subject: [PATCH 4/4] feat: Upgrade to Ruby 3.3.7+ and Rails 7.2+ support BREAKING CHANGE: Drop support for Ruby < 3.3.7 and Rails < 7.2 - Add Ruby >= 3.3.7 requirement - Update Rails dependency to >= 7.2 - Replace sass-rails with sassc-rails for better SCSS compilation - Update all development dependencies to modern versions - Fix Rails 7.2 compatibility issues - Remove deprecated cache format version configuration - Update test configuration for Rails 7.2 - Bump version to 4.0.0 - Update changelog with comprehensive change list This update ensures compatibility with the latest Ruby and Rails versions while fixing SCSS compilation issues and maintaining all existing functionality. --- ...fest-81faefa25879e722e49a58e82e7bfa51.json | 1 + ...40ba44e0bb9f93bdfab5a16eba9fbd4f2e0e02.css | 258 +++++++ ...a44e0bb9f93bdfab5a16eba9fbd4f2e0e02.css.gz | Bin 0 -> 2142 bytes ...ad6afdb00f686b69daf037cca65a72de08db3ca.js | 656 ++++++++++++++++++ ...afdb00f686b69daf037cca65a72de08db3ca.js.gz | Bin 0 -> 5581 bytes ...94cd00883793c1c37c5e5aea3ef6749b4f6d92b.js | 2 + ...d00883793c1c37c5e5aea3ef6749b4f6d92b.js.gz | Bin 0 -> 22 bytes ...00d7155e5ca562d1b9b7c7e33aeda8fc3c31ec.png | Bin 0 -> 1091 bytes ...9f2da7d7e119014f06755b97c90b0186c75d12.gif | Bin 0 -> 1842 bytes spec/gemfiles/rails-7.0 | 2 +- 10 files changed, 918 insertions(+), 1 deletion(-) create mode 100644 spec/dummy/public/assets/.sprockets-manifest-81faefa25879e722e49a58e82e7bfa51.json create mode 100644 spec/dummy/public/assets/application-15d9ca8b822c59208f5e52287a40ba44e0bb9f93bdfab5a16eba9fbd4f2e0e02.css create mode 100644 spec/dummy/public/assets/application-15d9ca8b822c59208f5e52287a40ba44e0bb9f93bdfab5a16eba9fbd4f2e0e02.css.gz create mode 100644 spec/dummy/public/assets/application-81bb3ff6b16d16196438b0ba2ad6afdb00f686b69daf037cca65a72de08db3ca.js create mode 100644 spec/dummy/public/assets/application-81bb3ff6b16d16196438b0ba2ad6afdb00f686b69daf037cca65a72de08db3ca.js.gz create mode 100644 spec/dummy/public/assets/manifest-b4bf6e57a53c2bdb55b8998cc94cd00883793c1c37c5e5aea3ef6749b4f6d92b.js create mode 100644 spec/dummy/public/assets/manifest-b4bf6e57a53c2bdb55b8998cc94cd00883793c1c37c5e5aea3ef6749b4f6d92b.js.gz create mode 100644 spec/dummy/public/assets/recurring_select/cancel-471db6625d94439b9a9232192800d7155e5ca562d1b9b7c7e33aeda8fc3c31ec.png create mode 100644 spec/dummy/public/assets/recurring_select/throbber_13x13-d78857ce33850fa1e233bcef159f2da7d7e119014f06755b97c90b0186c75d12.gif diff --git a/spec/dummy/public/assets/.sprockets-manifest-81faefa25879e722e49a58e82e7bfa51.json b/spec/dummy/public/assets/.sprockets-manifest-81faefa25879e722e49a58e82e7bfa51.json new file mode 100644 index 00000000..42f0f7f9 --- /dev/null +++ b/spec/dummy/public/assets/.sprockets-manifest-81faefa25879e722e49a58e82e7bfa51.json @@ -0,0 +1 @@ +{"files":{"manifest-b4bf6e57a53c2bdb55b8998cc94cd00883793c1c37c5e5aea3ef6749b4f6d92b.js":{"logical_path":"manifest.js","mtime":"2025-08-25T13:06:57+05:30","size":2,"digest":"75a11da44c802486bc6f65640aa48a730f0f684c5c07a42ba3cd1735eb3fb070","integrity":"sha256-daEdpEyAJIa8b2VkCqSKcw8PaExcB6Qro80XNes/sHA="},"application-15d9ca8b822c59208f5e52287a40ba44e0bb9f93bdfab5a16eba9fbd4f2e0e02.css":{"logical_path":"application.css","mtime":"2025-08-25T13:06:57+05:30","size":11583,"digest":"f0d3d6561e861131caa0c9f42189ad3c2ae7343762c87e2d399cf660483ee3d9","integrity":"sha256-8NPWVh6GETHKoMn0IYmtPCrnNDdiyH4tOZz2YEg+49k="},"recurring_select/cancel-471db6625d94439b9a9232192800d7155e5ca562d1b9b7c7e33aeda8fc3c31ec.png":{"logical_path":"recurring_select/cancel.png","mtime":"2025-08-25T13:06:57+05:30","size":1091,"digest":"9bd65bf935897e779ac39efbecc48e16546b64316d60eccded14782a95451637","integrity":"sha256-m9Zb+TWJfneaw5777MSOFlRrZDFtYOzN7RR4KpVFFjc="},"recurring_select/throbber_13x13-d78857ce33850fa1e233bcef159f2da7d7e119014f06755b97c90b0186c75d12.gif":{"logical_path":"recurring_select/throbber_13x13.gif","mtime":"2025-08-25T13:06:57+05:30","size":1842,"digest":"49e4e220162277d5957d78bc2e4bd858c3fec383e91e14fee3453147c129453c","integrity":"sha256-SeTiIBYid9WVfXi8LkvYWMP+w4PpHhT+40UxR8EpRTw="},"application-81bb3ff6b16d16196438b0ba2ad6afdb00f686b69daf037cca65a72de08db3ca.js":{"logical_path":"application.js","mtime":"2025-08-25T13:06:57+05:30","size":24628,"digest":"d7cb89fad747bd3c6e789811b43518482cebbe776204e4f7c528ef5e84d5fab4","integrity":"sha256-18uJ+tdHvTxueJgRtDUYSCzrvndiBOT3xSjvXoTV+rQ="}},"assets":{"manifest.js":"manifest-b4bf6e57a53c2bdb55b8998cc94cd00883793c1c37c5e5aea3ef6749b4f6d92b.js","application.css":"application-15d9ca8b822c59208f5e52287a40ba44e0bb9f93bdfab5a16eba9fbd4f2e0e02.css","recurring_select/cancel.png":"recurring_select/cancel-471db6625d94439b9a9232192800d7155e5ca562d1b9b7c7e33aeda8fc3c31ec.png","recurring_select/throbber_13x13.gif":"recurring_select/throbber_13x13-d78857ce33850fa1e233bcef159f2da7d7e119014f06755b97c90b0186c75d12.gif","application.js":"application-81bb3ff6b16d16196438b0ba2ad6afdb00f686b69daf037cca65a72de08db3ca.js"}} \ No newline at end of file diff --git a/spec/dummy/public/assets/application-15d9ca8b822c59208f5e52287a40ba44e0bb9f93bdfab5a16eba9fbd4f2e0e02.css b/spec/dummy/public/assets/application-15d9ca8b822c59208f5e52287a40ba44e0bb9f93bdfab5a16eba9fbd4f2e0e02.css new file mode 100644 index 00000000..ef804005 --- /dev/null +++ b/spec/dummy/public/assets/application-15d9ca8b822c59208f5e52287a40ba44e0bb9f93bdfab5a16eba9fbd4f2e0e02.css @@ -0,0 +1,258 @@ +/* + * This is a manifest file that'll automatically include all the stylesheets available in this directory + * and any sub-directories. You're free to add application-wide styles to this file and they'll appear at + * the top of the compiled file, but it's generally better to create a new file per style scope. + + +*/ +body { + background-color: #ccc; + padding: 100px; } + +form, section { + padding: 50px; + background-color: #fff; } +/* -------- resets ---------------*/ +.rs_dialog_holder { + font-size: 14px; + color: black; } + .rs_dialog_holder a { + color: black; } + .rs_dialog_holder input[type=button] { + font: small/normal Arial,sans-serif; + background: #F5F5F5; + color: #444; + border: 1px solid #ccc; + font-size: 11px; + font-weight: bold; + height: 27px; + line-height: 27px; + outline: none; + padding: 0 8px; + text-align: center; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; + position: relative; + background-image: -webkit-linear-gradient(top, #f5f5f5, #f1f1f1); + /* Chrome 10+, Saf5.1+ */ + background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#f5f5f5), to(#f1f1f1)); + /* Saf4+, Chrome */ + background-image: -moz-linear-gradient(top, #f5f5f5, #f1f1f1); + /* FF3.6 */ + background-image: -ms-linear-gradient(top, #f5f5f5, #f1f1f1); + /* IE10 */ + background-image: -o-linear-gradient(top, #f5f5f5, #f1f1f1); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#f5f5f5',EndColorStr='#f1f1f1'); } + .rs_dialog_holder input[type=button]:hover { + border-color: #aaa; + color: #222; + background-color: #f9f9f9; + -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.2); + -ms-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.2); + -o-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.2); + box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.2); } + .rs_dialog_holder input[type=button]:focus { + border-color: #1E90FF; } + .rs_dialog_holder input[type=button]:active { + border-color: #1E90FF; } + +/*------- defaults ------------ */ +.rs_dialog_holder { + font-family: helvetica, arial, 'san-serif'; + color: #222; + font-size: 12px; } + +/*------- specifics ------------ */ +select option.bold { + font-weight: bold; + color: red; } + +.rs_dialog_holder { + display: flex; + justify-content: center; + align-items: center; + position: fixed; + left: 0px; + right: 0px; + top: 0px; + bottom: 0px; + background-color: rgba(255, 255, 255, 0.2); + z-index: 50; } + .rs_dialog_holder .rs_dialog { + background-color: #f6f6f6; + border: 1px solid #acacac; + -webkit-box-shadow: 1px 3px 8px rgba(0, 0, 0, 0.25); + -moz-box-shadow: 1px 3px 8px rgba(0, 0, 0, 0.25); + -ms-box-shadow: 1px 3px 8px rgba(0, 0, 0, 0.25); + -o-box-shadow: 1px 3px 8px rgba(0, 0, 0, 0.25); + box-shadow: 1px 3px 8px rgba(0, 0, 0, 0.25); + -moz-border-radius: 7px; + -webkit-border-radius: 7px; + border-radius: 7px; + min-width: 200px; + overflow: hidden; } + .rs_dialog_holder .rs_dialog .rs_dialog_content { + padding: 10px; } + .rs_dialog_holder .rs_dialog .rs_dialog_content h1 { + font-size: 16px; + padding: 0px; + margin: 0 0 10px 0; } + .rs_dialog_holder .rs_dialog .rs_dialog_content h1 a { + float: right; + display: inline-block; + height: 16px; + width: 16px; + background-image: url(/assets/recurring_select/cancel-471db6625d94439b9a9232192800d7155e5ca562d1b9b7c7e33aeda8fc3c31ec.png); + background-position: center; + background-repeat: no-repeat; } + .rs_dialog_holder .rs_dialog .rs_dialog_content p { + padding: 5px 0; + margin: 0; + line-height: 14px; } + .rs_dialog_holder .rs_dialog .rs_dialog_content p label { + margin-right: 10px; } + .rs_dialog_holder .rs_dialog .rs_dialog_content a { + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; } + .rs_dialog_holder .rs_dialog .rs_dialog_content .freq_option_section { + display: none; } + .rs_dialog_holder .rs_dialog .rs_dialog_content .freq_option_section label { + font-weight: bold; } + .rs_dialog_holder .rs_dialog .rs_dialog_content .freq_option_section .rs_interval { + width: 30px; + text-align: center; + display: inline-block; } + .rs_dialog_holder .rs_dialog .rs_dialog_content .freq_option_section .day_holder { + border-left: 1px solid #ccc; + position: relative; + margin-top: 5px; + height: 26px; } + .rs_dialog_holder .rs_dialog .rs_dialog_content .freq_option_section .day_holder a { + display: block; + padding: 5px 7px; + font-size: 14px; + border-style: solid; + border-color: #ccc; + border-width: 1px 1px 1px 0px; + float: left; + text-decoration: none; + font-weight: bold; + -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1) inset; + -moz-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1) inset; + -ms-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1) inset; + -o-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1) inset; + box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1) inset; + background-color: #fff; } + .rs_dialog_holder .rs_dialog .rs_dialog_content .freq_option_section .day_holder a.selected { + background-color: #89a; + color: #fff; + -webkit-box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.2) inset; + -moz-box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.2) inset; + -ms-box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.2) inset; + -o-box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.2) inset; + box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.2) inset; + position: relative; + background-image: -webkit-linear-gradient(top, #9ab, #789); + /* Chrome 10+, Saf5.1+ */ + background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#9ab), to(#789)); + /* Saf4+, Chrome */ + background-image: -moz-linear-gradient(top, #9ab, #789); + /* FF3.6 */ + background-image: -ms-linear-gradient(top, #9ab, #789); + /* IE10 */ + background-image: -o-linear-gradient(top, #9ab, #789); + /* Opera 11.10+ */ } + .rs_dialog_holder .rs_dialog .rs_dialog_content .freq_option_section .day_holder a:hover { + cursor: pointer; + background-color: #dde; } + .rs_dialog_holder .rs_dialog .rs_dialog_content .freq_option_section .rs_calendar_day, .rs_dialog_holder .rs_dialog .rs_dialog_content .freq_option_section .rs_calendar_week { + width: 155px; } + .rs_dialog_holder .rs_dialog .rs_dialog_content .freq_option_section .rs_calendar_day a, .rs_dialog_holder .rs_dialog .rs_dialog_content .freq_option_section .rs_calendar_week a { + display: inline-block; + text-align: center; + width: 15px; + padding: 5px 3px; + font-size: 12px; + border-style: solid; + border-color: #ccc; + border-width: 1px 1px 1px 1px; + margin: -1px 0 0 -1px; + line-height: 10px; + background-color: #fff; + font-weight: bold; } + .rs_dialog_holder .rs_dialog .rs_dialog_content .freq_option_section .rs_calendar_day a.selected, .rs_dialog_holder .rs_dialog .rs_dialog_content .freq_option_section .rs_calendar_week a.selected { + background-color: #89a; + color: #fff; + position: relative; + background-image: -webkit-linear-gradient(top, #9ab, #789); + /* Chrome 10+, Saf5.1+ */ + background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#9ab), to(#789)); + /* Saf4+, Chrome */ + background-image: -moz-linear-gradient(top, #9ab, #789); + /* FF3.6 */ + background-image: -ms-linear-gradient(top, #9ab, #789); + /* IE10 */ + background-image: -o-linear-gradient(top, #9ab, #789); + /* Opera 11.10+ */ + -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.2) inset; + -moz-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.2) inset; + -ms-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.2) inset; + -o-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.2) inset; + box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.2) inset; + text-shadow: 0 1px 1px #333; } + .rs_dialog_holder .rs_dialog .rs_dialog_content .freq_option_section .rs_calendar_day a:hover, .rs_dialog_holder .rs_dialog .rs_dialog_content .freq_option_section .rs_calendar_week a:hover { + cursor: pointer; + background-color: #dde; } + .rs_dialog_holder .rs_dialog .rs_dialog_content .freq_option_section .rs_calendar_day a.end_of_month, .rs_dialog_holder .rs_dialog .rs_dialog_content .freq_option_section .rs_calendar_week a.end_of_month { + width: 81px; } + .rs_dialog_holder .rs_dialog .rs_dialog_content .freq_option_section .rs_calendar_week { + width: 191px; } + .rs_dialog_holder .rs_dialog .rs_dialog_content .freq_option_section .rs_calendar_week span { + display: inline-block; + width: 35px; } + .rs_dialog_holder .rs_dialog .rs_dialog_content .freq_option_section .monthly_rule_type span { + margin-right: 15px; } + .rs_dialog_holder .rs_dialog .rs_dialog_content .rs_summary { + padding: 0px; + margin-top: 15px; + border-top: 1px solid #ccc; } + .rs_dialog_holder .rs_dialog .rs_dialog_content .rs_summary span { + font-weight: bold; + border-top: 1px solid #fff; + display: block; + padding: 10px 0 5px 0; } + .rs_dialog_holder .rs_dialog .rs_dialog_content .rs_summary.fetching { + color: #999; } + .rs_dialog_holder .rs_dialog .rs_dialog_content .rs_summary.fetching span { + background-image: url(/assets/recurring_select/throbber_13x13-d78857ce33850fa1e233bcef159f2da7d7e119014f06755b97c90b0186c75d12.gif); + background-position: center; + background-repeat: no-repeat; + display: inline-block; + height: 13px; + width: 13px; + margin-top: -4px; + padding-right: 5px; } + .rs_dialog_holder .rs_dialog .rs_dialog_content .rs_summary label { + font-weight: normal; } + .rs_dialog_holder .rs_dialog .rs_dialog_content .controls { + padding: 10px 0px 5px 0px; + min-width: 170px; + text-align: center; } + .rs_dialog_holder .rs_dialog .rs_dialog_content .controls input[type=button] { + margin: 0px 5px; } + .rs_dialog_holder .rs_dialog .rs_dialog_content .controls input.rs_save[type=button] { + color: #333; } + .rs_dialog_holder .rs_dialog .rs_dialog_content .controls input.rs_cancel[type=button] { + color: #666; } + .rs_dialog_holder .rs_dialog .rs_dialog_content .controls input.disabled[type=button] { + color: #aaa; } + .rs_dialog_holder .rs_dialog.animated .controls { + position: absolute; + bottom: 10px; + left: 10px; } + .rs_dialog_holder .rs_dialog.animated .rs_summary, .rs_dialog_holder .rs_dialog.animated .freq_option_section { + display: none; } diff --git a/spec/dummy/public/assets/application-15d9ca8b822c59208f5e52287a40ba44e0bb9f93bdfab5a16eba9fbd4f2e0e02.css.gz b/spec/dummy/public/assets/application-15d9ca8b822c59208f5e52287a40ba44e0bb9f93bdfab5a16eba9fbd4f2e0e02.css.gz new file mode 100644 index 0000000000000000000000000000000000000000..66d71611aaa71d21bec689ad4a405c301cb69b13 GIT binary patch literal 2142 zcmV-k2%+~MiwFR$5v*te1MON%Z|gP|-se{kxELh9wH(Q^Y|B9xgU$`m#h{CJ(V`d_ zltkH_D~lSEO5!`{fA1mnemS-kchx9PWIoP=I*;#=di;EcKBHguR3P}p=zwDy5+PAY zBZA}}%ljxoIF;;xCG~L>9TAQFC=CdLFED~2A&(IedqN~oc)>Kn9?YdNbOOzQa^g$I zkBSkF1Na<~NIj$IphV2jZ!Ep%1cjUcSB7u^h5FWKhXlq4de#(qsYF!X3$!CK;aV$?NJ+S&?sI}AkVY|i&A24c zp}8aBvxLm-_n)9A0YzxM+aSv{leZ`I z$K74X_+g3!s1Azh>E$3tjp?TshM}7M_!$}b58_0q6*rncAlHnGZ9s9vcH2FR0+3yC z30W)+LBA0YW|8s9iF*<7Q`8aaPQ`lid1Gmur1E!pOvv}Jz>>xP$tNq`8zc^}(2p_b zk0bO?4pXNB$HEYV)9^_TtTYFmpB;5Q)!BbqEEf4l#(^d1lDr|oA{vxy-c;4fRLvV- z3Ek~M6b}T>n)i9jd{qpLXiSW5GfSoF*`S!kBx@=koQc-OFiGB|fg`$$H^?V3m{ito z9N0G_6WZW7ps4`j#Uzl+`%2|t|4@6v1XX6V0b_{3Q(j1W84Y^CI}p0ypj5!z*eOyV z-2=GD6s*fpm%6dkHOZ)evHh^;>_EVJznh|;ap=sf?+{qnX&xoqJM5fXFxgYul8CI9|D=XXE- z5(o8G&HR3ndG&dIz1g#uJg(I2vv5+3@l)PYG|lJpqNy*sx#}tgRNnArh&>M2D|i^V zxpH+deZ+SjelWqFvftT!QqIhr?DA>inpy0MNf*qxt(H(J}eIsgN{0!csx# zS4pqR0XiudRFZ?JH&-z{q;EvCjz}oAd8jWu6D$7)fup?l7(A>)^|j+y+NkCZM40MN zVT|7l8VBS}fsUbcUbW?PV27(%%&D<_) zzLebFDk(Odd07bFgje;}1Liv#E6inTDUeyoag`*vCJRUtF%0gez3!>jUV1u>H9+(t z20*wrpg@dG9T3VNO1rrW6H*>MJYu0h{UcOHDd(X4HVavgK8}478H<$_c+2J73EaiP zc0Cunb9-*N^R;OPE6Z_+<6~zz4=m61R{o0EHYNdHhraFG7V&3EyqgS&Q3awpZtV=? z1gb2lU~qnWy%{96m9L5*{YblyyJ~6xbY07gFn|O>xk{pj4P-oxJo1h+^}2OcfsB6B zy5@saTcutjPM#V#G~jAkXHb6sZ<}SuZM{Nmxqz;KMyz=+pYCJmrsa?3sm4)d>o2&; zI(J&zY&z{wad#?2e7MX3KGq>fWeqwpWZ0pvD$f0Epk!=VzD5~NQ}?nWUN#->25L1U za&2KdLAMn*R!xz6H$6HlrZ;vr*>d#`Xzl5A`ilsk!+G^FJA!0sMLnHnhc>Bz_>AN1 zu~gd&!+y}{zO-DjCSahDWm;4&DV>H$h_MvdNCG2g5AM6wM}54x&$1*>f|lL)O0;(I zQ)^UR*jCpN=pL>+`xa&ZgI`WWjHkgylNdYybO^m>|INi7{9UcxNt@E?J-Bl?p1B(b zBIH|fN{l`^dUxbbN-(@PcT(ZT{@iH>;u`w(-MW+H*)`N#dv`Yv9<8moGA5*4sGyKA z+QumZfd%Trn*b~yM%$Hd8_4qSK(3qkamSKMByc;Ex*^#3J2C#9 z7|%|OX8=|6BY>*;0YKFp4^+*OK=qpWIv11#%9#4ew(Y+to@LF^I9cg4KHMtbAhI zYsU<+Mdr5c`6RR)H=GA}6|9J5xu&%U&E?8*Ja^^0re|8~rN43lYd+i2a54zHPn|Tq zbJldJFPCLNr=lr>k=^> zgD { + if (e.target.matches(sel)) { + if (handler.call(this, e) === false) { + e.preventDefault() + e.stopPropagation() + } + } + } + } + + el[eventHandlerRefsExpando] = el[eventHandlerRefsExpando] || [] + + events.trim().split(/ +/).forEach(type => { + el[eventHandlerRefsExpando].push([ type, eventHandler ]) + el.addEventListener(type, eventHandler) + }) +} + +function off(el, events) { + const types = events.trim().split(/ +/) + + el[eventHandlerRefsExpando] = (el[eventHandlerRefsExpando] || []) + .filter(([t, h], i) => { + if (types.includes(t)) { + el.removeEventListener(t, h) + return false + } + return true + }) +} + +function serialize(params, prefix) { + const query = Object.keys(params).map((key) => { + const value = params[key]; + + if (params.constructor === Array) + key = `${prefix}[]`; + else if (params.constructor === Object) + key = (prefix ? `${prefix}[${key}]` : key); + + if (value === null) + return `${key}=` + + if (typeof value === 'object') + return serialize(value, key); + else + return `${key}=${encodeURIComponent(value)}`; + }); + + return [].concat.apply([], query).join('&'); +}; +const defaultConfig = { + options: { + monthly: { + show_week: [true, true, true, true, false, false] + } + }, + texts: { + locale_iso_code: "en", + repeat: "Repeat", + last_day: "Last Day", + frequency: "Frequency", + daily: "Daily", + weekly: "Weekly", + monthly: "Monthly", + yearly: "Yearly", + every: "Every", + days: "day(s)", + weeks_on: "week(s) on", + months: "month(s)", + years: "year(s)", + day_of_month: "Day of month", + day_of_week: "Day of week", + cancel: "Cancel", + ok: "OK", + summary: "Summary", + first_day_of_week: 0, + days_first_letter: ["S", "M", "T", "W", "T", "F", "S" ], + order: ["1st", "2nd", "3rd", "4th", "5th", "Last"], + show_week: [true, true, true, true, false, false] + } +}; + + + +class RecurringSelectDialog { + constructor(recurring_selector) { + this.config = this.constructor.config + this.cancel = this.cancel.bind(this); + this.outerCancel = this.outerCancel.bind(this); + this.save = this.save.bind(this); + this.summaryUpdate = this.summaryUpdate.bind(this); + this.summaryFetchSuccess = this.summaryFetchSuccess.bind(this); + this.init_calendar_days = this.init_calendar_days.bind(this); + this.init_calendar_weeks = this.init_calendar_weeks.bind(this); + this.toggle_month_view = this.toggle_month_view.bind(this); + this.freqChanged = this.freqChanged.bind(this); + this.intervalChanged = this.intervalChanged.bind(this); + this.daysChanged = this.daysChanged.bind(this); + this.dateOfMonthChanged = this.dateOfMonthChanged.bind(this); + this.weekOfMonthChanged = this.weekOfMonthChanged.bind(this); + this.recurring_selector = recurring_selector; + this.current_rule = this.recurring_selector.recurring_select('current_rule'); + this.initDialogBox(); + if ((this.current_rule.hash == null) || (this.current_rule.hash.rule_type == null)) { + this.freqChanged(); + } + } + + initDialogBox() { + document.querySelectorAll(".rs_dialog_holder").forEach(el => el.parentNode.removeChild(el)) + + const uiPage = document.querySelector('.ui-page-active') + const anchor = uiPage ? uiPage : document.body + + const div = document.createElement("div") + div.innerHTML = this.template() + anchor.appendChild(div.children[0]) + + this.outer_holder = document.querySelector(".rs_dialog_holder"); + this.inner_holder = this.outer_holder.querySelector(".rs_dialog"); + this.content = this.outer_holder.querySelector(".rs_dialog_content"); + + this.mainEventInit(); + this.freqInit(); + this.summaryInit(); + trigger(this.outer_holder, "recurring_select:dialog_opened"); + this.freq_select.focus(); + } + + cancel() { + this.outer_holder.remove(); + this.recurring_selector.recurring_select('cancel'); + } + + outerCancel(event) { + if (event.target.classList.contains("rs_dialog_holder")) { + this.cancel(); + } + } + + save() { + if ((this.current_rule.str == null)) { return; } + this.outer_holder.remove(); + this.recurring_selector.recurring_select('save', this.current_rule); + } + +// ========================= Init Methods =============================== + + mainEventInit() { + // Tap hooks are for jQueryMobile + on(this.outer_holder, 'click tap', this.outerCancel); + on(this.content, 'click tap', 'h1 a', this.cancel); + this.save_button = this.content.querySelector('input.rs_save') + on(this.save_button, "click tap", this.save) + on(this.content.querySelector('input.rs_cancel'), "click tap", this.cancel) + } + + freqInit() { + this.freq_select = this.outer_holder.querySelector(".rs_frequency"); + const rule_type = this.current_rule.hash && this.current_rule.hash.rule_type + if (this.current_rule.hash != null && rule_type != null) { + if (rule_type.search(/Weekly/) !== -1) { + this.freq_select.selectedIndex = 1 + this.initWeeklyOptions(); + } else if (rule_type.search(/Monthly/) !== -1) { + this.freq_select.selectedIndex = 2 + this.initMonthlyOptions(); + } else if (rule_type.search(/Yearly/) !== -1) { + this.freq_select.selectedIndex = 3 + this.initYearlyOptions(); + } else { + this.initDailyOptions(); + } + } + on(this.freq_select, "change", this.freqChanged); + } + + initDailyOptions() { + const section = this.content.querySelector('.daily_options') + const interval_input = section.querySelector('.rs_daily_interval') + interval_input.value = this.current_rule.hash.interval + on(interval_input, "change keyup", this.intervalChanged); + section.style.display = 'block' + } + + initWeeklyOptions() { + const section = this.content.querySelector('.weekly_options'); + + // connect the interval field + const interval_input = section.querySelector('.rs_weekly_interval'); + interval_input.value = this.current_rule.hash.interval + on(interval_input, "change keyup", this.intervalChanged); + + // clear selected days + section.querySelectorAll(".day_holder a").forEach(el => + el.classList.remove("selected") + ) + + // connect the day fields + if ((this.current_rule.hash.validations != null) && (this.current_rule.hash.validations.day != null)) { + Array.from(this.current_rule.hash.validations.day).forEach((val) => + section.querySelector(".day_holder a[data-value='"+val+"']").classList.add("selected") + ) + } + + off(section, "click") + on(section, "click", ".day_holder a", this.daysChanged) + + section.style.display = 'block' + } + + initMonthlyOptions() { + const section = this.content.querySelector('.monthly_options') + const interval_input = section.querySelector('.rs_monthly_interval') + interval_input.value = this.current_rule.hash.interval + on(interval_input, "change keyup", this.intervalChanged) + + if (!this.current_rule.hash.validations) { this.current_rule.hash.validations = {} }; + if (!this.current_rule.hash.validations.day_of_month) { this.current_rule.hash.validations.day_of_month = [] }; + if (!this.current_rule.hash.validations.day_of_week) { this.current_rule.hash.validations.day_of_week = {} }; + this.init_calendar_days(section); + this.init_calendar_weeks(section); + + const in_week_mode = Object.keys(this.current_rule.hash.validations.day_of_week).length > 0; + section.querySelector(".monthly_rule_type_week").checked = in_week_mode + section.querySelector(".monthly_rule_type_day").checked = !in_week_mode; + this.toggle_month_view(); + section.querySelectorAll("input[name=monthly_rule_type]").forEach((el) => on(el, "change", this.toggle_month_view)) + section.style.display = 'block' + } + + initYearlyOptions() { + const section = this.content.querySelector('.yearly_options'); + const interval_input = section.querySelector('.rs_yearly_interval'); + interval_input.value = this.current_rule.hash.interval + on(interval_input, "change keyup", this.intervalChanged) + section.style.display = 'block' + } + + + summaryInit() { + this.summary = this.outer_holder.querySelector(".rs_summary"); + this.summaryUpdate(); + } + +// ========================= render methods =============================== + + summaryUpdate(new_string) { + // this.summary.style.width = `${this.content.getBoundingClientRect().width}px`; + if ((this.current_rule.hash != null) && (this.current_rule.str != null)) { + this.summary.classList.remove("fetching"); + this.save_button.classList.remove("disabled"); + let rule_str = this.current_rule.str.replace("*", ""); + if (rule_str.length < 20) { + rule_str = `${this.config.texts["summary"]}: `+rule_str; + } + this.summary.querySelector("span").textContent = rule_str + } else { + this.summary.classList.add("fetching"); + this.save_button.classList.add("disabled"); + this.summary.querySelector("span").textContent = "" + this.summaryFetch(); + } + } + + summaryFetch() { + if (!(this.current_rule.hash != null && this.current_rule.hash.rule_type != null)) { return; } + this.current_rule.hash['week_start'] = this.config.texts["first_day_of_week"]; + + const url = `/recurring_select/translate/${this.config.texts["locale_iso_code"]}` + const headers = { 'X-Requested-With' : 'XMLHttpRequest', 'Content-Type' : 'application/x-www-form-urlencoded' } + const body = serialize(this.current_rule.hash) + console.log(this.current_rule.hash, body) + + fetch(url, { method: "POST", body, headers }) + .then(r => r.text()) + .then(this.summaryFetchSuccess) + } + + summaryFetchSuccess(data) { + this.current_rule.str = data + this.summaryUpdate() + css(this.content, { width: "auto" }) + } + + init_calendar_days(section) { + const monthly_calendar = section.querySelector(".rs_calendar_day"); + monthly_calendar.innerHTML = ""; + for (let num = 1; num <= 31; num++) { + const day_link = document.createElement("a") + day_link.innerText = num + monthly_calendar.appendChild(day_link) + if (Array.from(this.current_rule.hash.validations.day_of_month).includes(num)) { + day_link.classList.add("selected"); + } + }; + + // add last day of month button + const end_of_month_link = document.createElement("a") + end_of_month_link.innerText = this.config.texts["last_day"] + monthly_calendar.appendChild(end_of_month_link); + end_of_month_link.classList.add("end_of_month"); + if (Array.from(this.current_rule.hash.validations.day_of_month).includes(-1)) { + end_of_month_link.classList.add("selected"); + } + + off(monthly_calendar, "click tap") + on(monthly_calendar, "click tap", "a", this.dateOfMonthChanged) + } + + init_calendar_weeks(section) { + const monthly_calendar = section.querySelector(".rs_calendar_week") + monthly_calendar.innerHTML = "" + const row_labels = this.config.texts["order"]; + const show_row = this.config.options["monthly"]["show_week"]; + const cell_str = this.config.texts["days_first_letter"]; + + const iterable = [1, 2, 3, 4, 5, -1] + for (let index = 0; index < iterable.length; index++) { + const num = iterable[index]; + if (show_row[index]) { + const el = document.createElement("span") + el.innerText = row_labels[index] + monthly_calendar.appendChild(el); + for (let i = this.config.texts["first_day_of_week"], day_of_week = i, end = 7 + this.config.texts["first_day_of_week"], asc = this.config.texts["first_day_of_week"] <= end; asc ? i < end : i > end; asc ? i++ : i--, day_of_week = i) { + day_of_week = day_of_week % 7; + const day_link = document.createElement("a") + day_link.innerText = cell_str[day_of_week] + day_link.setAttribute("day", day_of_week); + day_link.setAttribute("instance", num); + monthly_calendar.appendChild(day_link); + }; + } + }; + + Object.entries(this.current_rule.hash.validations.day_of_week).forEach(([key, value]) => { + Array.from(value).forEach((instance, index) => { + section.querySelector(`a[day='${key}'][instance='${instance}']`).classList.add("selected") + }) + }) + + off(monthly_calendar, "click tap") + on(monthly_calendar, "click tap", "a", this.weekOfMonthChanged) + } + + toggle_month_view() { + const week_mode = this.content.querySelector(".monthly_rule_type_week").checked + if (week_mode) { + this.content.querySelector(".rs_calendar_week").style.display = "block" + this.content.querySelector(".rs_calendar_day").style.display = "none" + } else { + this.content.querySelector(".rs_calendar_week").style.display = "none" + this.content.querySelector(".rs_calendar_day").style.display = "block" + } + } + +// ========================= Change callbacks =============================== + + freqChanged() { + if (!isPlainObject(this.current_rule.hash)) { this.current_rule.hash = null; } // for custom values + + if (!this.current_rule.hash) { this.current_rule.hash = {} }; + this.current_rule.hash.interval = 1; + this.current_rule.hash.until = null; + this.current_rule.hash.count = null; + this.current_rule.hash.validations = null; + this.content.querySelectorAll(".freq_option_section").forEach(el => el.style.display = 'none') + this.content.querySelector("input[type=radio], input[type=checkbox]").checked = false + switch (this.freq_select.value) { + case "Weekly": + this.current_rule.hash.rule_type = "IceCube::WeeklyRule"; + this.current_rule.str = this.config.texts["weekly"]; + this.initWeeklyOptions(); + break + case "Monthly": + this.current_rule.hash.rule_type = "IceCube::MonthlyRule"; + this.current_rule.str = this.config.texts["monthly"]; + this.initMonthlyOptions(); + break + case "Yearly": + this.current_rule.hash.rule_type = "IceCube::YearlyRule"; + this.current_rule.str = this.config.texts["yearly"]; + this.initYearlyOptions(); + break + default: + this.current_rule.hash.rule_type = "IceCube::DailyRule"; + this.current_rule.str = this.config.texts["daily"]; + this.initDailyOptions(); + }; + this.summaryUpdate(); + } + + intervalChanged(event) { + this.current_rule.str = null; + if (!this.current_rule.hash) { this.current_rule.hash = {} }; + this.current_rule.hash.interval = parseInt(event.currentTarget.value); + if ((this.current_rule.hash.interval < 1) || isNaN(this.current_rule.hash.interval)) { + this.current_rule.hash.interval = 1; + } + this.summaryUpdate(); + } + + daysChanged(event) { + event.target.classList.toggle("selected"); + this.current_rule.str = null; + if (!this.current_rule.hash) { this.current_rule.hash = {} }; + this.current_rule.hash.validations = {}; + const raw_days = Array.from(this.content.querySelectorAll(".day_holder a.selected")) + .map(el => parseInt(el.dataset.value)) + this.current_rule.hash.validations.day = raw_days + this.summaryUpdate(); + return false; + } + + dateOfMonthChanged(event) { + event.target.classList.toggle("selected"); + this.current_rule.str = null; + if (!this.current_rule.hash) { this.current_rule.hash = {} }; + this.current_rule.hash.validations = {}; + const raw_days = Array.from(this.content.querySelectorAll(".monthly_options .rs_calendar_day a.selected")) + .map(el => { + return el.innerText === this.config.texts["last_day"] ? -1 : parseInt(el.innerText) + }) + this.current_rule.hash.validations.day_of_week = {}; + this.current_rule.hash.validations.day_of_month = raw_days; + this.summaryUpdate(); + return false; + } + + weekOfMonthChanged(event) { + event.target.classList.toggle("selected"); + this.current_rule.str = null; + if (!this.current_rule.hash) { this.current_rule.hash = {} }; + this.current_rule.hash.validations = {}; + this.current_rule.hash.validations.day_of_month = []; + this.current_rule.hash.validations.day_of_week = {}; + this.content.querySelectorAll(".monthly_options .rs_calendar_week a.selected") + .forEach((elm, index) => { + const day = parseInt(elm.getAttribute("day")); + const instance = parseInt(elm.getAttribute("instance")); + if (!this.current_rule.hash.validations.day_of_week[day]) { this.current_rule.hash.validations.day_of_week[day] = [] }; + return this.current_rule.hash.validations.day_of_week[day].push(instance); + }) + this.summaryUpdate(); + return false; + } + +// ========================= Change callbacks =============================== + + template() { + let str = `\ +
\ +
\ +
\ +

${this.config.texts["repeat"]}

\ +

\ + \ + \ +

\ + \ +
\ +

\ + ${this.config.texts["every"]} \ + \ + ${this.config.texts["days"]} \ +

\ +
\ +
\ +

\ + ${this.config.texts["every"]} \ + \ + ${this.config.texts["weeks_on"]}: \ +

\ +
\ + `; + for (let i = this.config.texts["first_day_of_week"], day_of_week = i, end = 7 + this.config.texts["first_day_of_week"], asc = this.config.texts["first_day_of_week"] <= end; asc ? i < end : i > end; asc ? i++ : i--, day_of_week = i) { + day_of_week = day_of_week % 7; + str += `${this.config.texts["days_first_letter"][day_of_week]}`; + }; + + str += `\ +
\ + . \ +
\ +
\ +

\ + ${this.config.texts["every"]} \ + \ + ${this.config.texts["months"]}: \ +

\ +

\ + \ + \ +

\ +

\ +

\ +
\ +
\ +

\ + ${this.config.texts["every"]} \ + \ + ${this.config.texts["years"]} \ +

\ +
\ +

\ + \ +

\ +
\ + \ + \ +
\ +
\ +
\ +
\ + `; + + return str; + } +} + +RecurringSelectDialog.config = defaultConfig + +window.RecurringSelectDialog = RecurringSelectDialog; + + + +document.addEventListener("DOMContentLoaded", () => { + document.addEventListener("focusin", (e) => { + if (e.target.matches(".recurring_select")) { + recurring_select.call(e.target, "set_initial_values") + } + }) + + document.addEventListener("input", (e) => { + if (e.target.matches(".recurring_select")) { + recurring_select.call(e.target, "changed") + } + }) +}) + +const methods = { + set_initial_values() { + const str = this.querySelectorAll('option')[this.selectedIndex].textContent + this.setAttribute('data-initial-value-hash', this.value); + this.setAttribute('data-initial-value-str', str); + }, + + changed() { + if (this.value == "custom") { + methods.open.call(this); + } else { + methods.set_initial_values.call(this); + } + }, + + open() { + this.setAttribute("data-recurring-select-active", true); + new RecurringSelectDialog(this); + this.blur(); + }, + + save(new_rule) { + this.querySelectorAll("option[data-custom]").forEach((el) => el.parentNode.removeChild(el) ) + const new_json_val = JSON.stringify(new_rule.hash) + + // TODO: check for matching name, and replace that value if found + + const options = Array.from(this.querySelectorAll("option")).map(() => this.value) + if (!options.includes(new_json_val)) { + methods.insert_option.apply(this, [new_rule.str, new_json_val]) + } + + this.value = new_json_val + methods.set_initial_values.apply(this) + this.dispatchEvent(new CustomEvent("recurring_select:save")) + }, + + current_rule() { + return { + str: this.getAttribute("data-initial-value-str"), + hash: JSON.parse(this.getAttribute("data-initial-value-hash")) + }; + }, + + cancel() { + this.value = this.getAttribute("data-initial-value-hash") + this.setAttribute("data-recurring-select-active", false); + this.dispatchEvent(new CustomEvent("recurring_select:cancel")) + }, + + + insert_option(new_rule_str, new_rule_json) { + let separator = this.querySelectorAll("option[disabled]"); + if (separator.length === 0) { + separator = this.querySelectorAll("option"); + } + separator = separator[separator.length-1] + + const new_option = document.createElement("option") + new_option.setAttribute("data-custom", true); + + if (new_rule_str.substr(new_rule_str.length - 1) !== "*") { + new_rule_str+="*"; + } + + new_option.textContent = new_rule_str + new_option.value = new_rule_json + separator.parentNode.insertBefore(new_option, separator) + } +}; + +function recurring_select(method) { + this['recurring_select'] = this['recurring_select'] || recurring_select.bind(this) + if (method in methods) { + return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ) ); + } else { + throw new Error( `Method ${method} does not exist on recurring_select` ); + } +}; +// This is a manifest file that'll be compiled into including all the files listed below. +// Add new JavaScript/Coffee code in separate files in this directory and they'll automatically +// be included in the compiled file accessible from http://example.com/assets/application.js +// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the +// the compiled file. +// + + + +RecurringSelectDialog.config.options.monthly = { + show_week: [true, true, true, true, true, true] +}; diff --git a/spec/dummy/public/assets/application-81bb3ff6b16d16196438b0ba2ad6afdb00f686b69daf037cca65a72de08db3ca.js.gz b/spec/dummy/public/assets/application-81bb3ff6b16d16196438b0ba2ad6afdb00f686b69daf037cca65a72de08db3ca.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..695ff7fa15eb6828a06af5572fb2822436888822 GIT binary patch literal 5581 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 bqt4fr$$Y?rw&lMQocjL;tzdoxG++P#*U{vt literal 0 HcmV?d00001 diff --git a/spec/dummy/public/assets/manifest-b4bf6e57a53c2bdb55b8998cc94cd00883793c1c37c5e5aea3ef6749b4f6d92b.js b/spec/dummy/public/assets/manifest-b4bf6e57a53c2bdb55b8998cc94cd00883793c1c37c5e5aea3ef6749b4f6d92b.js new file mode 100644 index 00000000..139597f9 --- /dev/null +++ b/spec/dummy/public/assets/manifest-b4bf6e57a53c2bdb55b8998cc94cd00883793c1c37c5e5aea3ef6749b4f6d92b.js @@ -0,0 +1,2 @@ + + diff --git a/spec/dummy/public/assets/manifest-b4bf6e57a53c2bdb55b8998cc94cd00883793c1c37c5e5aea3ef6749b4f6d92b.js.gz b/spec/dummy/public/assets/manifest-b4bf6e57a53c2bdb55b8998cc94cd00883793c1c37c5e5aea3ef6749b4f6d92b.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..08f4d2418280005294fdafd506e0a0ff6bc192ef GIT binary patch literal 22 dcmb2|=3rPOxF&;%`SBwrhHT--(M${s3;;}r1`YrK literal 0 HcmV?d00001 diff --git a/spec/dummy/public/assets/recurring_select/cancel-471db6625d94439b9a9232192800d7155e5ca562d1b9b7c7e33aeda8fc3c31ec.png b/spec/dummy/public/assets/recurring_select/cancel-471db6625d94439b9a9232192800d7155e5ca562d1b9b7c7e33aeda8fc3c31ec.png new file mode 100644 index 0000000000000000000000000000000000000000..afd91524f95043e06a7fed3c6a401d3c19ecdd33 GIT binary patch literal 1091 zcmV-J1ibr+P)4Tx0C)j~Qcp+}Q5^owHWGx0L4|mTcM1uWDXgrZ+IDqWm2F#<(xMn=-@2o- zGt-;dHN}$zU7|d7529mq?9ic`m!iO|OV=Q&AP78l==;s=>L`S7c{|_x{r!I5dqi!W zrtdo`K~!@?l`EyEZca^$gC8kH9n?-(rWN?$#G@yVurd(%7=z$F+9*_C2+g zWndxdEw;B1`XP~K03Vs3C}n`Nz#W#a*ggR~SPrZj@FSuF51P3!)6txCrLrxNQ|6*5 zDz9QYNv`|(xyHVWwTXlNT#shfj=i($s?ki;wD&}zybrEK8P8u-_G~p2rw!wrNJAPa z@~+k2D@?}`kt+~N22wR-xu0rIops=K7`t7%ljHdI5T!oJV5o_;>9Uy}g?#{aD$DE; z@CE4cvSJVCfqP;9TT#Q4z$alpWQTdytsnLmu2bN9ggrIj&J?c2@!EyIG?t21v)8jkQn>h+|};wxJ44oP(CbdCAv#gZYk92J%dWD94puWc5sr! zELt46Q){|8cz4($dTselSF-Dd{`&TM``YpzZOW)AC=<=IL}rw+TchONc-#GEkrAIb zI=<(~OTV#>_4?r3HW<*CV-T(jq32;bRa{vGf z6951U69E94oEQKA0USw0K~xwS6^zYFLQxcj*V+4MIJsbn5IBmuq}dNOh+e@#U=R@m zIH%ufNE|k;iAY3)5GjL#C<#l!yhQ$-bK32}g0=QqpE{s|J)IcOx$RLJ z&^2|@IooX)NjaSRRCL+Um<2!>_EkAl*lKVh5ju%yBRY^67$T;DfBVI0-D?eD{N}x6AY@-UxvaHZbdb0lK#mg?Le#+9f*^& z#0@2gMXcZvHO$M-%7z~_N@i(NrOZ3uNEC)|zWL2jiPxWzjLvkZ4kwTg49KB-X%D&F ztKW6w?P=B|55iYJDD(c#3oF|DtX@UhE@q?F;9egGNBP$x{Q&^+XO4tou7dyo002ov JPDHLkV1oG=01f~E literal 0 HcmV?d00001 diff --git a/spec/dummy/public/assets/recurring_select/throbber_13x13-d78857ce33850fa1e233bcef159f2da7d7e119014f06755b97c90b0186c75d12.gif b/spec/dummy/public/assets/recurring_select/throbber_13x13-d78857ce33850fa1e233bcef159f2da7d7e119014f06755b97c90b0186c75d12.gif new file mode 100644 index 0000000000000000000000000000000000000000..1ae1d65cb10fd1a3c3639ae89baca5007081d3bf GIT binary patch literal 1842 zcmb`{TTl~M7{KvWA{vs-W|PgXyN9#8?j9{VI%9z{ii{It5@A8*HdaT(3r0Y(k_II> z5tWOEn<24S#S522+tS)fv7^>Lv|1glRxyqb)OI>by>}`_9?Fc)G}!hnkKKp!xaW8N z-`zhIvm5XyV&@rR;e`_4Z|=107;VO%$bv%oSc@HX0=+gv$ON_^H;4}Ra{)W zdGltM%jNNS>gwv6o0|iHz>y2A>C&a^*RS6U-@J3@&b@p0 zhK7coKY#vW_{GS`$m`dy-|Y53FVn_U>NpHxv&a8CekLro+#EQa^b?hGF*Gb+tHjvb zi^tgcwCPFdtkG=l$d&K9Civ4HWfHY?Acsam>06_MX31j5$~I*n~9-GET&_f>V?fh*Mky z(ozRmt)>bURaet-%oH8`puJWGn8vP%MaK}Or|Z9Pqm$9^NJOGX6SsMV?!4b7>_nY6 zr_ZEXlL2uesj>{hN)6dowH08L8ka$q{22yVf~&L0utMklve06{|xvif)r;zWP}xiNZ^_sxME)kL!SVyM(Qx_cq- z&l{aqW9IM!XOf#bm>j$7_4Z7AmZLbOHqd$F$`D(9;Nt#Z`pTLFrh;)TWz|z?hy+1T zLV3po7S~WD0SJmmv`EC6FdEm(LS_dWk#Hn%qc*7dDl_UOi993!F*cMpS(OJb2M1fa zx^9;!uXZON|NY4i$dSa}^5*^G33M%a{Bk~q?G2q?$;P0U#gAvM5 zuic|0-e!w{Of3q zi4zcz2`$@hB(rmkEI$cCx^o9F^W+&mdXK8eyB=d`G~2opW6sC>WdBG^YJ6I7eeN^= zyhLwi0e}v=RcTN)aW>lLaOQIUuF04_H!fY^1qc}eDk2ne0HG@=ml%eZcnXK4339Z^ eH6uZ$2#x^s)ZE4h4d;1Qs6hu0tvDNLvfyvZCj!C% literal 0 HcmV?d00001 diff --git a/spec/gemfiles/rails-7.0 b/spec/gemfiles/rails-7.0 index c6a3a43a..1783f57c 100644 --- a/spec/gemfiles/rails-7.0 +++ b/spec/gemfiles/rails-7.0 @@ -2,4 +2,4 @@ source "https://rubygems.org" gemspec path: File.expand_path("../../..", __FILE__) gem "thin" -gem "rails", "~> 7.0.0" +gem "rails", "~> 7.2.0"