Skip to content

Commit dd9d18f

Browse files
committed
Reuse Collapse controller for Accordion component
1 parent d31c4cd commit dd9d18f

10 files changed

+44
-100
lines changed

src/Toolkit/kits/bootstrap/accordion/assets/controllers/accordion_controller.js

Lines changed: 0 additions & 63 deletions
This file was deleted.

src/Toolkit/kits/bootstrap/accordion/templates/components/Accordion.html.twig

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@
1717
class="{{ style.apply({flush}, attributes.render('class')) }}"
1818
{{ attributes.defaults({
1919
id: _accordion_id,
20-
'data-controller': 'accordion',
21-
'data-accordion-always-open-value': _accordion_always_open ? 'true' : 'false',
2220
}) }}
2321
{{ attributes }}
2422
>

src/Toolkit/kits/bootstrap/accordion/templates/components/Accordion/Body.html.twig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<div
44
id="{{ _accordion_item_id }}-collapse"
55
class="accordion-collapse collapse{{ _accordion_item_is_open ? ' show' : '' }}"
6-
data-accordion-target="body"
6+
data-collapse-target="content"
77
>
88
<div class="{{ ('accordion-body ' ~ attributes.render('class'))|trim }}" {{ attributes }}>
99
{%- block content %}{% endblock -%}

src/Toolkit/kits/bootstrap/accordion/templates/components/Accordion/Header.html.twig

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
<button
1313
class="{{ style.apply({collapsed: not _accordion_item_is_open}, attributes.render('class')) }}"
1414
type="button"
15-
data-action="click->accordion#toggle"
16-
data-accordion-target="header"
15+
data-action="click->collapse#toggle"
16+
data-collapse-target="trigger"
1717
aria-expanded="{{ _accordion_item_is_open ? 'true' : 'false' }}"
1818
aria-controls="{{ _accordion_item_id }}-collapse"
1919
{{ attributes }}

src/Toolkit/kits/bootstrap/accordion/templates/components/Accordion/Item.html.twig

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@
66
{%- set _accordion_item_is_open = open -%}
77
<div
88
class="{{ ('accordion-item ' ~ attributes.render('class'))|trim }}"
9-
data-accordion-target="item"
9+
{{ attributes.defaults({
10+
'data-controller': 'collapse',
11+
'data-collapse-parent-value': not _accordion_always_open ? '#' ~ _accordion_id : '',
12+
}) }}
1013
{{ attributes }}
1114
>
1215
{%- block content %}{% endblock -%}

src/Toolkit/kits/bootstrap/collapse/assets/controllers/collapse_controller.js

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,18 @@ import { Collapse } from 'bootstrap';
44
export default class extends Controller {
55
static targets = ['trigger', 'content'];
66

7+
static values = {
8+
parent: { type: String, default: '' },
9+
};
10+
711
connect() {
812
this._collapse = new Collapse(this.contentTarget, {
913
toggle: false,
14+
parent: this.parentValue ? document.querySelector(this.parentValue) : undefined,
1015
});
1116

12-
this.contentTarget.addEventListener('shown.bs.collapse', this._onShown.bind(this));
13-
this.contentTarget.addEventListener('hidden.bs.collapse', this._onHidden.bind(this));
17+
this.contentTarget.addEventListener('show.bs.collapse', this._onShown.bind(this));
18+
this.contentTarget.addEventListener('hide.bs.collapse', this._onHidden.bind(this));
1419

1520
// Sync initial state
1621
if (this.contentTarget.classList.contains('show')) {
@@ -19,8 +24,8 @@ export default class extends Controller {
1924
}
2025

2126
disconnect() {
22-
this.contentTarget.removeEventListener('shown.bs.collapse', this._onShown.bind(this));
23-
this.contentTarget.removeEventListener('hidden.bs.collapse', this._onHidden.bind(this));
27+
this.contentTarget.removeEventListener('show.bs.collapse', this._onShown.bind(this));
28+
this.contentTarget.removeEventListener('hide.bs.collapse', this._onHidden.bind(this));
2429
this._collapse?.dispose();
2530
}
2631

@@ -47,6 +52,7 @@ export default class extends Controller {
4752
_updateTriggers(expanded) {
4853
for (const trigger of this.triggerTargets) {
4954
trigger.setAttribute('aria-expanded', expanded ? 'true' : 'false');
55+
trigger.classList.toggle('collapsed', !expanded);
5056
}
5157
}
5258
}

src/Toolkit/tests/Functional/__snapshots__/ComponentsRenderingTest__testComponentRendering with data set Kit bootstrap, component accordion, code file Always open.html__1.html

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,16 @@
1515
</twig:Accordion>
1616
```
1717
- Rendered code (prettified for testing purposes, run "php vendor/bin/phpunit -d --update-snapshots" to update snapshots): -->
18-
<div class="accordion" id="always-open-accordion" data-controller="accordion" data-accordion-always-open-value="true">
19-
<div class="accordion-item" data-accordion-target="item">
18+
<div class="accordion" id="always-open-accordion">
19+
<div class="accordion-item" data-controller="collapse" data-collapse-parent-value="">
2020
<h2 class="accordion-header">
21-
<button class="accordion-button" type="button" data-action="click-&gt;accordion#toggle" data-accordion-target="header" aria-expanded="true" aria-controls="always-open-accordion-1-collapse">Accordion Item #1</button>
22-
</h2> <div id="always-open-accordion-1-collapse" class="accordion-collapse collapse show" data-accordion-target="body">
21+
<button class="accordion-button" type="button" data-action="click-&gt;collapse#toggle" data-collapse-target="trigger" aria-expanded="true" aria-controls="always-open-accordion-1-collapse">Accordion Item #1</button>
22+
</h2> <div id="always-open-accordion-1-collapse" class="accordion-collapse collapse show" data-collapse-target="content">
2323
<div class="accordion-body">This item stays open when other items are opened.</div>
24-
</div> </div> <div class="accordion-item" data-accordion-target="item">
24+
</div> </div> <div class="accordion-item" data-controller="collapse" data-collapse-parent-value="">
2525
<h2 class="accordion-header">
26-
<button class="accordion-button" type="button" data-action="click-&gt;accordion#toggle" data-accordion-target="header" aria-expanded="true" aria-controls="always-open-accordion-2-collapse">Accordion Item #2</button>
27-
</h2> <div id="always-open-accordion-2-collapse" class="accordion-collapse collapse show" data-accordion-target="body">
26+
<button class="accordion-button" type="button" data-action="click-&gt;collapse#toggle" data-collapse-target="trigger" aria-expanded="true" aria-controls="always-open-accordion-2-collapse">Accordion Item #2</button>
27+
</h2> <div id="always-open-accordion-2-collapse" class="accordion-collapse collapse show" data-collapse-target="content">
2828
<div class="accordion-body">This item also stays open independently.</div>
2929
</div> </div>
3030
</div>

src/Toolkit/tests/Functional/__snapshots__/ComponentsRenderingTest__testComponentRendering with data set Kit bootstrap, component accordion, code file Demo.html__1.html

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,25 +25,25 @@
2525
</twig:Accordion>
2626
```
2727
- Rendered code (prettified for testing purposes, run "php vendor/bin/phpunit -d --update-snapshots" to update snapshots): -->
28-
<div class="accordion" id="demo-accordion" data-controller="accordion" data-accordion-always-open-value="false">
29-
<div class="accordion-item" data-accordion-target="item">
28+
<div class="accordion" id="demo-accordion">
29+
<div class="accordion-item" data-controller="collapse" data-collapse-parent-value="#demo-accordion">
3030
<h2 class="accordion-header">
31-
<button class="accordion-button" type="button" data-action="click-&gt;accordion#toggle" data-accordion-target="header" aria-expanded="true" aria-controls="demo-accordion-1-collapse">Accordion Item #1</button>
32-
</h2> <div id="demo-accordion-1-collapse" class="accordion-collapse collapse show" data-accordion-target="body">
31+
<button class="accordion-button" type="button" data-action="click-&gt;collapse#toggle" data-collapse-target="trigger" aria-expanded="true" aria-controls="demo-accordion-1-collapse">Accordion Item #1</button>
32+
</h2> <div id="demo-accordion-1-collapse" class="accordion-collapse collapse show" data-collapse-target="content">
3333
<div class="accordion-body">
3434
<strong>This is the first item's accordion body.</strong> It is shown by default.
3535
</div>
36-
</div> </div> <div class="accordion-item" data-accordion-target="item">
36+
</div> </div> <div class="accordion-item" data-controller="collapse" data-collapse-parent-value="#demo-accordion">
3737
<h2 class="accordion-header">
38-
<button class="accordion-button collapsed" type="button" data-action="click-&gt;accordion#toggle" data-accordion-target="header" aria-expanded="false" aria-controls="demo-accordion-2-collapse">Accordion Item #2</button>
39-
</h2> <div id="demo-accordion-2-collapse" class="accordion-collapse collapse" data-accordion-target="body">
38+
<button class="accordion-button collapsed" type="button" data-action="click-&gt;collapse#toggle" data-collapse-target="trigger" aria-expanded="false" aria-controls="demo-accordion-2-collapse">Accordion Item #2</button>
39+
</h2> <div id="demo-accordion-2-collapse" class="accordion-collapse collapse" data-collapse-target="content">
4040
<div class="accordion-body">
4141
<strong>This is the second item's accordion body.</strong> It is hidden by default.
4242
</div>
43-
</div> </div> <div class="accordion-item" data-accordion-target="item">
43+
</div> </div> <div class="accordion-item" data-controller="collapse" data-collapse-parent-value="#demo-accordion">
4444
<h2 class="accordion-header">
45-
<button class="accordion-button collapsed" type="button" data-action="click-&gt;accordion#toggle" data-accordion-target="header" aria-expanded="false" aria-controls="demo-accordion-3-collapse">Accordion Item #3</button>
46-
</h2> <div id="demo-accordion-3-collapse" class="accordion-collapse collapse" data-accordion-target="body">
45+
<button class="accordion-button collapsed" type="button" data-action="click-&gt;collapse#toggle" data-collapse-target="trigger" aria-expanded="false" aria-controls="demo-accordion-3-collapse">Accordion Item #3</button>
46+
</h2> <div id="demo-accordion-3-collapse" class="accordion-collapse collapse" data-collapse-target="content">
4747
<div class="accordion-body">
4848
<strong>This is the third item's accordion body.</strong> It is hidden by default.
4949
</div>

src/Toolkit/tests/Functional/__snapshots__/ComponentsRenderingTest__testComponentRendering with data set Kit bootstrap, component accordion, code file Flush.html__1.html

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,16 @@
1515
</twig:Accordion>
1616
```
1717
- Rendered code (prettified for testing purposes, run "php vendor/bin/phpunit -d --update-snapshots" to update snapshots): -->
18-
<div class="accordion accordion-flush" id="flush-accordion" data-controller="accordion" data-accordion-always-open-value="false">
19-
<div class="accordion-item" data-accordion-target="item">
18+
<div class="accordion accordion-flush" id="flush-accordion">
19+
<div class="accordion-item" data-controller="collapse" data-collapse-parent-value="#flush-accordion">
2020
<h2 class="accordion-header">
21-
<button class="accordion-button" type="button" data-action="click-&gt;accordion#toggle" data-accordion-target="header" aria-expanded="true" aria-controls="flush-accordion-1-collapse">Accordion Item #1</button>
22-
</h2> <div id="flush-accordion-1-collapse" class="accordion-collapse collapse show" data-accordion-target="body">
21+
<button class="accordion-button" type="button" data-action="click-&gt;collapse#toggle" data-collapse-target="trigger" aria-expanded="true" aria-controls="flush-accordion-1-collapse">Accordion Item #1</button>
22+
</h2> <div id="flush-accordion-1-collapse" class="accordion-collapse collapse show" data-collapse-target="content">
2323
<div class="accordion-body">Flush accordion content for item #1.</div>
24-
</div> </div> <div class="accordion-item" data-accordion-target="item">
24+
</div> </div> <div class="accordion-item" data-controller="collapse" data-collapse-parent-value="#flush-accordion">
2525
<h2 class="accordion-header">
26-
<button class="accordion-button collapsed" type="button" data-action="click-&gt;accordion#toggle" data-accordion-target="header" aria-expanded="false" aria-controls="flush-accordion-2-collapse">Accordion Item #2</button>
27-
</h2> <div id="flush-accordion-2-collapse" class="accordion-collapse collapse" data-accordion-target="body">
26+
<button class="accordion-button collapsed" type="button" data-action="click-&gt;collapse#toggle" data-collapse-target="trigger" aria-expanded="false" aria-controls="flush-accordion-2-collapse">Accordion Item #2</button>
27+
</h2> <div id="flush-accordion-2-collapse" class="accordion-collapse collapse" data-collapse-target="content">
2828
<div class="accordion-body">Flush accordion content for item #2.</div>
2929
</div> </div>
3030
</div>

src/Toolkit/tests/Functional/__snapshots__/ComponentsRenderingTest__testComponentRendering with data set Kit bootstrap, component accordion, code file Usage.html__1.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@
1111
</twig:Accordion>
1212
```
1313
- Rendered code (prettified for testing purposes, run "php vendor/bin/phpunit -d --update-snapshots" to update snapshots): -->
14-
<div class="accordion" id="my-accordion" data-controller="accordion" data-accordion-always-open-value="false"><div class="accordion-item" data-accordion-target="item">
14+
<div class="accordion" id="my-accordion"><div class="accordion-item" data-controller="collapse" data-collapse-parent-value="#my-accordion">
1515
<h2 class="accordion-header">
16-
<button class="accordion-button" type="button" data-action="click-&gt;accordion#toggle" data-accordion-target="header" aria-expanded="true" aria-controls="my-accordion-1-collapse">Section title</button>
17-
</h2> <div id="my-accordion-1-collapse" class="accordion-collapse collapse show" data-accordion-target="body">
16+
<button class="accordion-button" type="button" data-action="click-&gt;collapse#toggle" data-collapse-target="trigger" aria-expanded="true" aria-controls="my-accordion-1-collapse">Section title</button>
17+
</h2> <div id="my-accordion-1-collapse" class="accordion-collapse collapse show" data-collapse-target="content">
1818
<div class="accordion-body">Section content goes here.</div>
1919
</div> </div></div>

0 commit comments

Comments
 (0)