maquina-components 0.8.0 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/javascript/controllers/calendar_controller.js +17 -4
- data/app/javascript/controllers/date_picker_controller.js +13 -0
- data/app/views/components/_calendar.html.erb +2 -1
- data/app/views/components/_date_picker.html.erb +4 -2
- data/app/views/components/calendar/_week.html.erb +3 -1
- data/lib/maquina_components/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 3cc64fa3b021d92f3dd1e54f71c762404e3c7778a137f2eee3ca4a33d28c247b
|
|
4
|
+
data.tar.gz: aa3a45337cc8d43e1c47e884750418b198c2afde379cc74858a9c866b7aa0bec
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 9568653a565de12c6a0485663fc48b7f31b75855da80a5cbbb118df5025ecae1a8e3bcf88eeaf43d86e42bd2c1f458b2dc4aebe9deff0e3e8276689a98a75185
|
|
7
|
+
data.tar.gz: cce7f348df9e0594b464366b492efbc76270698e44d76316bcd6c11e2aacf9d2c99c6c2dfda2b3cc40da07705c4480bc4cb0c43d2701bbb661a2645b0dfde283
|
|
@@ -14,6 +14,10 @@ export default class extends Controller {
|
|
|
14
14
|
weekStartsOn: { type: String, default: "sunday" },
|
|
15
15
|
disabledDates: Array,
|
|
16
16
|
showOutsideDays: { type: Boolean, default: true },
|
|
17
|
+
// false: a click on the selected day keeps it (single mode), and the start
|
|
18
|
+
// clicked again makes a one-day range (range mode), so a required date
|
|
19
|
+
// can't be emptied by a click
|
|
20
|
+
deselectable: { type: Boolean, default: true },
|
|
17
21
|
// Bounds of the caption's year select (caption_layout: :dropdown only)
|
|
18
22
|
startYear: Number,
|
|
19
23
|
endYear: Number
|
|
@@ -188,7 +192,10 @@ export default class extends Controller {
|
|
|
188
192
|
disabledDates.has(dateStr)
|
|
189
193
|
|
|
190
194
|
let dayState = null
|
|
191
|
-
if (isSelected &&
|
|
195
|
+
if (isSelected && isRangeEnd) {
|
|
196
|
+
// A one-day range
|
|
197
|
+
dayState = "selected"
|
|
198
|
+
} else if (isSelected && this.modeValue === "range" && selectedEndStr) {
|
|
192
199
|
dayState = "range-start"
|
|
193
200
|
} else if (isRangeEnd) {
|
|
194
201
|
dayState = "range-end"
|
|
@@ -242,6 +249,8 @@ export default class extends Controller {
|
|
|
242
249
|
|
|
243
250
|
handleSingleSelection(dateStr) {
|
|
244
251
|
if (this.selectedValue === dateStr) {
|
|
252
|
+
// Nothing changes, so nothing is dispatched
|
|
253
|
+
if (!this.deselectableValue) return
|
|
245
254
|
this.selectedValue = ""
|
|
246
255
|
} else {
|
|
247
256
|
this.selectedValue = dateStr
|
|
@@ -268,12 +277,13 @@ export default class extends Controller {
|
|
|
268
277
|
// Clicked before start - swap
|
|
269
278
|
this.selectedEndValue = this.selectedValue
|
|
270
279
|
this.selectedValue = dateStr
|
|
271
|
-
} else if (dateStr === selectedStr) {
|
|
280
|
+
} else if (dateStr === selectedStr && this.deselectableValue) {
|
|
272
281
|
// Clicked same date - clear
|
|
273
282
|
this.selectedValue = ""
|
|
274
283
|
this.selectedEndValue = ""
|
|
275
284
|
} else {
|
|
276
|
-
// Clicked after start
|
|
285
|
+
// Clicked after start, or the start again when not deselectable
|
|
286
|
+
// (a one-day range) - set end
|
|
277
287
|
this.selectedEndValue = dateStr
|
|
278
288
|
}
|
|
279
289
|
}
|
|
@@ -358,7 +368,10 @@ export default class extends Controller {
|
|
|
358
368
|
let state = null
|
|
359
369
|
|
|
360
370
|
if (this.modeValue === "range" && selectedStr && selectedEndStr) {
|
|
361
|
-
if (dateStr === selectedStr) {
|
|
371
|
+
if (dateStr === selectedStr && dateStr === selectedEndStr) {
|
|
372
|
+
// A one-day range
|
|
373
|
+
state = "selected"
|
|
374
|
+
} else if (dateStr === selectedStr) {
|
|
362
375
|
state = "range-start"
|
|
363
376
|
} else if (dateStr === selectedEndStr) {
|
|
364
377
|
state = "range-end"
|
|
@@ -128,6 +128,19 @@ export default class extends Controller {
|
|
|
128
128
|
})
|
|
129
129
|
}
|
|
130
130
|
|
|
131
|
+
/**
|
|
132
|
+
* Close the popover when the selected day is clicked again and stays
|
|
133
|
+
* selected (a non-deselectable calendar): the click confirms the date.
|
|
134
|
+
* Bound on the calendar, so it runs after the day's own selectDay; a click
|
|
135
|
+
* that picks a new day has already closed the popover in handleChange.
|
|
136
|
+
*/
|
|
137
|
+
confirmSelection(event) {
|
|
138
|
+
const day = event.target.closest("[data-calendar-part='day']")
|
|
139
|
+
if (day?.dataset.state === "selected" && this.popoverTarget.matches(":popover-open")) {
|
|
140
|
+
this.closePopover()
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
131
144
|
/**
|
|
132
145
|
* Handle calendar navigate event
|
|
133
146
|
* Can be used to fetch events for the new month
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<%# locals: (selected: nil, selected_end: nil, month: nil, year: nil, mode: :single, min_date: nil, max_date: nil, disabled_dates: [], show_outside_days: true, week_starts_on: :sunday, caption_layout: :label, years: nil, cell_size: nil, input_name: nil, input_name_end: nil, css_classes: "", **html_options) %>
|
|
1
|
+
<%# locals: (selected: nil, selected_end: nil, month: nil, year: nil, mode: :single, min_date: nil, max_date: nil, disabled_dates: [], show_outside_days: true, week_starts_on: :sunday, caption_layout: :label, years: nil, deselectable: true, cell_size: nil, input_name: nil, input_name_end: nil, css_classes: "", **html_options) %>
|
|
2
2
|
<%
|
|
3
3
|
# Dates may arrive as Date, Time or ISO strings
|
|
4
4
|
selected_date = calendar_to_date(selected)
|
|
@@ -61,6 +61,7 @@
|
|
|
61
61
|
"calendar-week-starts-on-value": week_starts_on,
|
|
62
62
|
"calendar-disabled-dates-value": disabled_dates_parsed.map(&:iso8601).presence,
|
|
63
63
|
"calendar-show-outside-days-value": show_outside_days,
|
|
64
|
+
"calendar-deselectable-value": (false unless deselectable),
|
|
64
65
|
"calendar-start-year-value": year_range&.first,
|
|
65
66
|
"calendar-end-year-value": year_range&.last
|
|
66
67
|
)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<%# locals: (selected: nil, selected_end: nil, mode: :single, min_date: nil, max_date: nil, disabled_dates: [], show_outside_days: true, week_starts_on: :sunday, caption_layout: :label, years: nil, placeholder: nil, input_name: nil, input_name_end: nil, id: nil, disabled: false, required: false, size: :default, full_width: false, css_classes: "", **html_options) %>
|
|
1
|
+
<%# locals: (selected: nil, selected_end: nil, mode: :single, min_date: nil, max_date: nil, disabled_dates: [], show_outside_days: true, week_starts_on: :sunday, caption_layout: :label, years: nil, placeholder: nil, input_name: nil, input_name_end: nil, id: nil, disabled: false, required: false, deselectable: nil, size: :default, full_width: false, css_classes: "", **html_options) %>
|
|
2
2
|
<%
|
|
3
3
|
# Deterministic ID for popover targeting: random ids break idiomorph
|
|
4
4
|
# matching across Turbo morphs
|
|
@@ -83,9 +83,11 @@
|
|
|
83
83
|
week_starts_on: week_starts_on,
|
|
84
84
|
caption_layout: caption_layout,
|
|
85
85
|
years: years,
|
|
86
|
+
# A required date can't be emptied by clicking it again
|
|
87
|
+
deselectable: deselectable.nil? ? !required : deselectable,
|
|
86
88
|
data: {
|
|
87
89
|
"date-picker-target": "calendar",
|
|
88
|
-
action: "calendar:change->date-picker#handleChange calendar:navigate->date-picker#handleNavigate"
|
|
90
|
+
action: "calendar:change->date-picker#handleChange calendar:navigate->date-picker#handleNavigate click->date-picker#confirmSelection"
|
|
89
91
|
} %>
|
|
90
92
|
</div>
|
|
91
93
|
<% end %>
|
|
@@ -20,7 +20,9 @@
|
|
|
20
20
|
(max_date && day > max_date) ||
|
|
21
21
|
disabled_dates.include?(day)
|
|
22
22
|
|
|
23
|
-
day_state = if is_selected &&
|
|
23
|
+
day_state = if is_selected && is_range_end
|
|
24
|
+
"selected" # a one-day range
|
|
25
|
+
elsif is_selected && mode == :range && selected_end_date
|
|
24
26
|
"range-start"
|
|
25
27
|
elsif is_range_end
|
|
26
28
|
"range-end"
|