Files
Christophe Bliard 97579306cd [68380] Save 'Working days only' value upon work package creation
https://community.openproject.org/wp/68380

This bug happened because we have to many different names for the same property:
- "Working days only" (UI)
- `ignoreNonWorkingDays` (frontend)
- `includeNonWorkingDays` (frontend)
- `ignore_non_working_days` (backend and database)
2025-10-15 18:09:09 +02:00

178 lines
4.2 KiB
Ruby

# frozen_string_literal: true
require_relative "edit_field"
class DateEditField < EditField
attr_accessor :milestone, :is_table
def initialize(context,
property_name,
selector: nil,
is_milestone: false,
is_table: false)
super(context, property_name, selector:)
self.milestone = is_milestone
self.is_table = is_table
end
def datepicker
@datepicker ||= ::Components::WorkPackageDatepicker.new modal_selector
end
delegate :focus_milestone_date,
:focus_start_date,
:focus_due_date,
:expect_milestone_date,
:expect_start_date,
:expect_due_date,
:set_milestone_date,
:set_start_date,
:set_due_date,
:expect_start_highlighted,
:expect_due_highlighted,
:expect_duration_highlighted,
:expect_duration,
:set_duration,
:duration_field,
:toggle_working_days_only,
:toggle_scheduling_mode,
:expect_manual_scheduling_mode,
:expect_automatic_scheduling_mode,
:enable_start_date,
:enable_due_date,
to: :datepicker
def modal_selector
'[data-test-selector="op-datepicker-modal"]'
end
def input_selector
if property_name == "combinedDate"
"input[name='work_package[start_date]']"
else
"input[name='work_package[#{property_name.underscore}]']"
end
end
def property_name
if milestone
# when displaying date picker for milestone, only one date is displayed,
# and the input field name is `start_date`.
"start_date"
else
super
end
end
def activate_start_date_within_modal
within_modal do
find('[data-test-selector="op-datepicker-modal--start-date-field"]').click
end
end
def activate_due_date_within_modal
within_modal do
find('[data-test-selector="op-datepicker-modal--due-date-field"]').click
end
end
def modal_element
page.find(modal_selector)
end
def within_modal(&)
page.within(modal_selector, &)
end
def input_element
# The date picker might not be opened but the input might still be visible,
# e.g. when the work package form is opened completely like on create
if active?
modal_element.find(input_selector)
else
page.find(".#{property_name} .op-input")
end
end
def click_to_open_datepicker
input_element.click
datepicker
end
def active?
page.has_selector?(modal_selector, wait: 1)
end
def expect_active!
expect(page)
.to have_selector(modal_selector, wait: 10),
"Expected date field '#{property_name}' to be active."
wait_for_network_idle
end
def expect_inactive!
expect(context).to have_selector(display_selector, wait: 10)
expect(page).to have_no_css("#{modal_selector} #{input_selector}")
end
def expect_calendar
within_modal do
expect(page).to have_css(".flatpickr-calendar")
end
end
def update(value, save: true, expect_failure: false)
# Retry to set attributes due to reloading the page after setting
# an attribute, which may cause an input not to open properly.
retry_block do
activate_edition
set_value value
save! if save
expect_state! open: expect_failure || !save
end
end
def set_value(value)
if value.is_a?(Array)
datepicker.enable_start_date_if_visible
datepicker.enable_due_date_if_visible
datepicker.clear!
datepicker.set_start_date value.first
datepicker.set_due_date value.last
datepicker.expect_start_date value.first
datepicker.expect_due_date value.last
else
set_active_date value
end
end
def expect_value(value)
expect(page).to have_css(".#{property_name} .op-input", value:)
end
def set_active_date(value)
datepicker.set_date value
end
def save!
submit_by_click
end
def submit_by_click
scroll_to_and_click action_button(I18n.t(:button_save))
end
def cancel_by_click
scroll_to_and_click action_button(I18n.t(:button_cancel))
end
def action_button(text)
page.find("#{modal_selector} [data-test-selector='op-datepicker-modal--action']", text:)
end
end