lato_cms 3.0.12 → 3.0.13

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: 6fd8416ab840a11e364752d13f21440d8282862df78e4b4b67ef8f69432aa56b
4
- data.tar.gz: 544411ddd79120e75f9f3df5cf7136d9d0d940cd3ba15abb0720fbf95ec368f7
3
+ metadata.gz: d1b3de7e40dab4ee5574179d52307473705c2b084aa7a2a76d03dcd0fb0f3cef
4
+ data.tar.gz: 70cfbb74343f62265a02f93d8998d92995b8332f8bc16e9671b3ab4af63ef70b
5
5
  SHA512:
6
- metadata.gz: b0d6f6b71abf13818513d8921e6daa52254ea32209d9b0a44ff3b25f3d3d1e83e4dc90e262eeefba8f9ac08a7fe5bf65d518f6a3c638dfabcdfb072b238ba28d
7
- data.tar.gz: f899bc4fbe56254e67359839b79a29598ba0507d05704d7e8cb8cded33f0675f3499bb6aac33666b0b4f2b5eae8f18614e3b3b0f2f0c68fb00c4b22f136af7ba
6
+ metadata.gz: '054983638f6a1454267a5d7eed3574152eac784a03ff1905c357a42bcd3fa5a3093b4591a8308008925f2b1612e7eb2eeccf2b58916a6080550156bc1414540d'
7
+ data.tar.gz: 1767c5b3550717035094aa78c755bc8b0531cbec89d430421334c91e9fe2b96b9d0c9b9c5735e52fdd582906b82846d55cce21002b7ec32ad8de6aaac034a415
@@ -6,6 +6,44 @@ export default class extends Controller {
6
6
 
7
7
  connect () {
8
8
  this.refresh()
9
+
10
+ // Native validation skips hidden inputs: expand the item hosting an invalid
11
+ // field so the browser can focus it and show the error message.
12
+ this.onInvalid = (event) => this.expandItemFor(event.target)
13
+ this.element.addEventListener('invalid', this.onInvalid, true)
14
+ }
15
+
16
+ disconnect () {
17
+ this.element.removeEventListener('invalid', this.onInvalid, true)
18
+ }
19
+
20
+ expandItemFor (field) {
21
+ const item = field.closest('[data-lato-cms-repeater-target="item"]')
22
+ if (!item) return
23
+
24
+ this.collapseOthers(item)
25
+ this.setItemExpanded(item, true)
26
+ }
27
+
28
+ // Close every item except the given one (single-open accordion invariant).
29
+ collapseOthers (item) {
30
+ this.itemTargets.forEach((other) => {
31
+ if (other !== item) this.setItemExpanded(other, false)
32
+ })
33
+ }
34
+
35
+ // Bootstrap reads open state from the 'show' class, so toggling classes
36
+ // directly stays in sync with its lazily-created Collapse instances.
37
+ setItemExpanded (item, expanded) {
38
+ const collapse = item.querySelector('.collapse')
39
+ if (!collapse || collapse.classList.contains('show') === expanded) return
40
+
41
+ collapse.classList.toggle('show', expanded)
42
+ const toggle = item.querySelector('[data-bs-toggle="collapse"]')
43
+ if (toggle) {
44
+ toggle.classList.toggle('collapsed', !expanded)
45
+ toggle.setAttribute('aria-expanded', expanded.toString())
46
+ }
9
47
  }
10
48
 
11
49
  add () {
@@ -18,6 +56,8 @@ export default class extends Controller {
18
56
  .replaceAll('NEW_INDEX', this.itemTargets.length.toString())
19
57
 
20
58
  this.itemsTarget.insertAdjacentHTML('beforeend', html)
59
+ // The new item is rendered expanded: enforce single-open accordion behavior.
60
+ this.collapseOthers(this.itemTargets[this.itemTargets.length - 1])
21
61
  this.refresh()
22
62
  }
23
63
 
@@ -400,6 +400,19 @@ body.controller-pages.action-show {
400
400
  top: 4px;
401
401
  }
402
402
 
403
+ // ── Repeater items ─────────────────────────────────────────────────────────────
404
+
405
+ .lato-cms-repeater-item__toggle {
406
+ .bi-chevron-down {
407
+ display: inline-block;
408
+ transition: transform 0.2s ease;
409
+ }
410
+
411
+ &.collapsed .bi-chevron-down {
412
+ transform: rotate(-90deg);
413
+ }
414
+ }
415
+
403
416
  .controller-pages-show {
404
417
  .accordion-button {
405
418
  font-weight: 500;
@@ -7,18 +7,25 @@
7
7
  <%# Seed `min` empty items when the list is empty, so the minimum is met up front. %>
8
8
  <% item_ids = Array.new(min) { SecureRandom.uuid } if item_ids.blank? && min.positive? %>
9
9
 
10
+ <%# Accordion behavior (one item open at a time) hangs off the items container id. %>
11
+ <% items_container_id = "repeater-items-#{tc[:template_component_id]}" %>
12
+ <%# Expand only the first empty item: saved items start collapsed. %>
13
+ <% first_empty_id = item_ids.find { |id| fields_by_item[id].blank? } %>
14
+
10
15
  <div data-controller="lato-cms-repeater"
11
16
  data-lato-cms-repeater-min-value="<%= min %>"
12
17
  data-lato-cms-repeater-max-value="<%= max %>">
13
- <div data-lato-cms-repeater-target="items">
18
+ <div id="<%= items_container_id %>" data-lato-cms-repeater-target="items">
14
19
  <% item_ids.each_with_index do |item_id, item_index| %>
15
20
  <% item_fields = (fields_by_item[item_id] || []).index_by(&:base_field_id) %>
16
- <%= render 'lato_cms/pages/repeater_item', tc: tc, item_id: item_id, item_index: item_index, item_fields: item_fields %>
21
+ <%= render 'lato_cms/pages/repeater_item', tc: tc, item_id: item_id, item_index: item_index, item_fields: item_fields,
22
+ parent_id: items_container_id, expanded: item_id == first_empty_id %>
17
23
  <% end %>
18
24
  </div>
19
25
 
20
26
  <template data-lato-cms-repeater-target="template">
21
- <%= render 'lato_cms/pages/repeater_item', tc: tc, item_id: 'NEW_RECORD', item_index: 'NEW_INDEX', item_fields: {} %>
27
+ <%= render 'lato_cms/pages/repeater_item', tc: tc, item_id: 'NEW_RECORD', item_index: 'NEW_INDEX', item_fields: {},
28
+ parent_id: items_container_id, expanded: true %>
22
29
  </template>
23
30
 
24
31
  <button type="button" class="btn btn-sm btn-outline-primary" data-action="lato-cms-repeater#add" data-lato-cms-repeater-target="addButton">
@@ -1,28 +1,36 @@
1
+ <% collapse_id = "repeater-collapse-#{item_id}" %>
2
+
1
3
  <div class="card mb-3" data-lato-cms-repeater-target="item" data-repeater-item-id="<%= item_id %>">
2
4
  <input type="hidden" name="repeater_order[]" value="<%= item_id %>" data-lato-cms-repeater-target="orderInput">
3
5
 
4
- <div class="card-header d-flex justify-content-between align-items-center py-2">
5
- <strong class="small"><%= tc[:name] %> #<span data-lato-cms-repeater-target="position"><%= item_index.to_i + 1 %></span></strong>
6
- <button type="button" class="btn btn-sm btn-outline-danger" data-action="lato-cms-repeater#remove">
6
+ <div class="card-header d-flex justify-content-between align-items-center gap-2 py-2">
7
+ <button type="button" class="lato-cms-repeater-item__toggle btn btn-link p-0 flex-grow-1 text-start text-decoration-none text-body <%= 'collapsed' unless expanded %>"
8
+ data-bs-toggle="collapse" data-bs-target="#<%= collapse_id %>" aria-expanded="<%= expanded %>" aria-controls="<%= collapse_id %>">
9
+ <i class="bi bi-chevron-down me-2 small"></i>
10
+ <strong class="small"><%= tc[:name] %> #<span data-lato-cms-repeater-target="position"><%= item_index.to_i + 1 %></span></strong>
11
+ </button>
12
+ <button type="button" class="btn btn-sm btn-outline-danger flex-shrink-0" data-action="lato-cms-repeater#remove">
7
13
  <i class="bi bi-trash me-1"></i><%= t('lato_cms.repeater_remove_item') %>
8
14
  </button>
9
15
  </div>
10
16
 
11
- <div class="card-body pb-2">
12
- <% tc[:fields].each do |field_id, field_config| %>
13
- <% page_field = item_fields[field_id.to_s] %>
14
- <% input_name_prefix = "repeater_items[#{item_id}][#{field_id}]" %>
15
- <% dom_id_prefix = "repeater_items_#{item_id}_#{field_id}" %>
17
+ <div id="<%= collapse_id %>" class="collapse <%= 'show' if expanded %>" data-bs-parent="#<%= parent_id %>">
18
+ <div class="card-body pb-2">
19
+ <% tc[:fields].each do |field_id, field_config| %>
20
+ <% page_field = item_fields[field_id.to_s] %>
21
+ <% input_name_prefix = "repeater_items[#{item_id}][#{field_id}]" %>
22
+ <% dom_id_prefix = "repeater_items_#{item_id}_#{field_id}" %>
16
23
 
17
- <div class="mb-3">
18
- <%= lato_cms_render_field(
19
- field_id: field_id,
20
- field_config: field_config,
21
- page_field: page_field,
22
- input_name_prefix: input_name_prefix,
23
- dom_id_prefix: dom_id_prefix
24
- ) %>
25
- </div>
26
- <% end %>
24
+ <div class="mb-3">
25
+ <%= lato_cms_render_field(
26
+ field_id: field_id,
27
+ field_config: field_config,
28
+ page_field: page_field,
29
+ input_name_prefix: input_name_prefix,
30
+ dom_id_prefix: dom_id_prefix
31
+ ) %>
32
+ </div>
33
+ <% end %>
34
+ </div>
27
35
  </div>
28
36
  </div>
@@ -1,3 +1,3 @@
1
1
  module LatoCms
2
- VERSION = "3.0.12"
2
+ VERSION = "3.0.13"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lato_cms
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.12
4
+ version: 3.0.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gregorio Galante