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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 95885780d4ac7c947e4561e821d4c3cb2f985a3a363738f7cdc7fc01a858fc11
4
- data.tar.gz: 35100ad72833ef5be786a40444f5af15c37866d0dc8dce4dee34232f04bfe0a5
3
+ metadata.gz: 3cc64fa3b021d92f3dd1e54f71c762404e3c7778a137f2eee3ca4a33d28c247b
4
+ data.tar.gz: aa3a45337cc8d43e1c47e884750418b198c2afde379cc74858a9c866b7aa0bec
5
5
  SHA512:
6
- metadata.gz: b1e7d220b352af1cd2e9fabf11902165c2d7d958608ea504f0b6a896fef336c3c8cd1e556090ab2db7dfa54c8812249fc5611c1a19820701c37c015c15b82a10
7
- data.tar.gz: 347641b6a36dac6f72f9344e8e6af0a81f0c80bf29dd1ce022e20db9a295db2141d540eb16d41cea92fc19f4a59345438712f9b958c802b3cc1f109bd2d5abbb
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 && this.modeValue === "range" && selectedEndStr) {
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 - set end
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 && mode == :range && selected_end_date
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"
@@ -1,3 +1,3 @@
1
1
  module MaquinaComponents
2
- VERSION = "0.8.0"
2
+ VERSION = "0.8.1"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: maquina-components
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mario Alberto Chávez