From e496b0c736a2803e453e969d16602ee36a43bfd2 Mon Sep 17 00:00:00 2001 From: "claude[bot]" <41898282+claude[bot]@users.noreply.github.com> Date: Fri, 16 Jan 2026 14:01:23 +0000 Subject: [PATCH 1/3] Fix week display format persisting after Turbo requests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Changed the date picker value from @chosen_date to @chosen_date.iso8601 to ensure proper ISO 8601 formatting (YYYY-MM-DD). This prevents the date from briefly displaying in the default Ruby Date format after Turbo requests and before flatpickr re-initializes. Fixes #439 Co-authored-by: Kasper Høglund --- app/views/time_regs/_date_picker.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/time_regs/_date_picker.html.erb b/app/views/time_regs/_date_picker.html.erb index 2f261fcc..2c63b6cd 100644 --- a/app/views/time_regs/_date_picker.html.erb +++ b/app/views/time_regs/_date_picker.html.erb @@ -1,5 +1,5 @@ <%= form_with url: root_path, method: :get, class: "flex items-stretch" do |form| %> - <%= form.text_field :date, value: @chosen_date, class: "flex text-sm md:text-base px-1 md:px-2 cursor-pointer border-none text-center hover:text-primary-600 z-10 focus:ring-0 font-medium", + <%= form.text_field :date, value: @chosen_date.iso8601, class: "flex text-sm md:text-base px-1 md:px-2 cursor-pointer border-none text-center hover:text-primary-600 z-10 focus:ring-0 font-medium", data: { controller: "flatpickr", flatpickr_auto_submit_value: true, From e4c52c1fb30c7b9ca6ee90359e72a2a9b55cab04 Mon Sep 17 00:00:00 2001 From: "claude[bot]" <41898282+claude[bot]@users.noreply.github.com> Date: Mon, 19 Jan 2026 10:30:51 +0000 Subject: [PATCH 2/3] Add data-turbo-permanent to date picker to prevent Turbo Morph from breaking flatpickr MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When Turbo Morph is enabled, it morphs the DOM instead of replacing it. Flatpickr creates an alternative input element that displays the formatted week text, but Turbo Morph replaces this element during page updates. By adding data-turbo-permanent with a unique id, we tell Turbo to skip morphing this element, preserving the flatpickr-enhanced DOM structure across page updates. Co-authored-by: Kasper Høglund --- app/views/time_regs/_date_picker.html.erb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/views/time_regs/_date_picker.html.erb b/app/views/time_regs/_date_picker.html.erb index 2c63b6cd..9cf638a7 100644 --- a/app/views/time_regs/_date_picker.html.erb +++ b/app/views/time_regs/_date_picker.html.erb @@ -1,6 +1,7 @@ <%= form_with url: root_path, method: :get, class: "flex items-stretch" do |form| %> - <%= form.text_field :date, value: @chosen_date.iso8601, class: "flex text-sm md:text-base px-1 md:px-2 cursor-pointer border-none text-center hover:text-primary-600 z-10 focus:ring-0 font-medium", + <%= form.text_field :date, id: "date_picker_input", value: @chosen_date.iso8601, class: "flex text-sm md:text-base px-1 md:px-2 cursor-pointer border-none text-center hover:text-primary-600 z-10 focus:ring-0 font-medium", data: { + turbo_permanent: true, controller: "flatpickr", flatpickr_auto_submit_value: true, flatpickr_fit_width_value: true, From b95b1cad363240e49ab2e661eea2af2cae0b1f1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20H=C3=B8glund?= Date: Mon, 19 Jan 2026 17:10:15 +0100 Subject: [PATCH 3/3] Fix datepicker reseting --- app/controllers/time_regs_controller.rb | 6 +++--- .../controllers/flatpickr_controller.js | 17 +++++++++++++++++ app/views/time_regs/_date_picker.html.erb | 1 - 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/app/controllers/time_regs_controller.rb b/app/controllers/time_regs_controller.rb index 28a970e3..837cc06b 100644 --- a/app/controllers/time_regs_controller.rb +++ b/app/controllers/time_regs_controller.rb @@ -54,7 +54,7 @@ def create authorize! @time_reg if @time_reg.save - redirect_back(fallback_location: time_regs_path, date: @time_reg.date_worked) + redirect_to time_regs_path(date: @time_reg.date_worked) else set_assigned_tasks render :new_modal, status: :unprocessable_entity, formats: [ :html, :turbo_stream ] @@ -64,7 +64,7 @@ def create def update authorize! @time_reg if @time_reg.update(time_reg_params.except(:project_id, :minutes_string)) - redirect_back(fallback_location: time_regs_path, date: @time_reg.date_worked) + redirect_to time_regs_path(date: @time_reg.date_worked) else set_assigned_tasks render :edit_modal, status: :unprocessable_entity, formats: [ :html, :turbo_stream ] @@ -74,7 +74,7 @@ def update def destroy authorize! @time_reg @time_reg.discard! - redirect_back(fallback_location: time_regs_path, date: @time_reg.date_worked) + redirect_to time_regs_path(date: @time_reg.date_worked) rescue ActiveRecord::RecordNotDestroyed flash[:alert] = "Unable to delete time registration" diff --git a/app/javascript/controllers/flatpickr_controller.js b/app/javascript/controllers/flatpickr_controller.js index dfd63cb0..deb9171b 100644 --- a/app/javascript/controllers/flatpickr_controller.js +++ b/app/javascript/controllers/flatpickr_controller.js @@ -29,6 +29,23 @@ export default class extends Flatpickr { connect() { super.connect(); this.updateWidth(); + + // Handle Turbo Morph by reinitializing flatpickr + document.addEventListener('turbo:morph', this.handleTurboMorph); + } + + disconnect() { + super.disconnect(); + document.removeEventListener('turbo:morph', this.handleTurboMorph); + } + + handleTurboMorph = () => { + // Reinitialize flatpickr after Turbo Morph + if (this.fp) { + this.fp.destroy(); + } + super.connect(); + this.updateWidth(); } change(selectedDates, dateStr, instance) { diff --git a/app/views/time_regs/_date_picker.html.erb b/app/views/time_regs/_date_picker.html.erb index 9cf638a7..dfc228ac 100644 --- a/app/views/time_regs/_date_picker.html.erb +++ b/app/views/time_regs/_date_picker.html.erb @@ -1,7 +1,6 @@ <%= form_with url: root_path, method: :get, class: "flex items-stretch" do |form| %> <%= form.text_field :date, id: "date_picker_input", value: @chosen_date.iso8601, class: "flex text-sm md:text-base px-1 md:px-2 cursor-pointer border-none text-center hover:text-primary-600 z-10 focus:ring-0 font-medium", data: { - turbo_permanent: true, controller: "flatpickr", flatpickr_auto_submit_value: true, flatpickr_fit_width_value: true,