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 +4 -4
- data/app/assets/javascripts/lato_cms/controllers/lato_cms_repeater_controller.js +40 -0
- data/app/assets/stylesheets/lato_cms/application.scss +13 -0
- data/app/views/lato_cms/pages/_repeater.html.erb +10 -3
- data/app/views/lato_cms/pages/_repeater_item.html.erb +26 -18
- data/lib/lato_cms/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: d1b3de7e40dab4ee5574179d52307473705c2b084aa7a2a76d03dcd0fb0f3cef
|
|
4
|
+
data.tar.gz: 70cfbb74343f62265a02f93d8998d92995b8332f8bc16e9671b3ab4af63ef70b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
-
<
|
|
6
|
-
|
|
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="
|
|
12
|
-
|
|
13
|
-
<%
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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>
|
data/lib/lato_cms/version.rb
CHANGED