From fa8375fc98a60772473c2726f4aa94651070ed20 Mon Sep 17 00:00:00 2001 From: Stanislaw Adaszewski Date: Wed, 8 Apr 2020 17:56:07 +0200 Subject: [PATCH] Fix WBAccordion's state getting confused when navigating between pages. --- frontend/src/js/widget/wb-accordion.js | 71 ++++++++++---------------- 1 file changed, 27 insertions(+), 44 deletions(-) diff --git a/frontend/src/js/widget/wb-accordion.js b/frontend/src/js/widget/wb-accordion.js index d4bf2dd..b3e4109 100644 --- a/frontend/src/js/widget/wb-accordion.js +++ b/frontend/src/js/widget/wb-accordion.js @@ -4,7 +4,6 @@ class WBAccordion extends Component { constructor(...args) { super(...args); this.setupIds(); - console.log('WBAccordion() : domId=' + this.state.domId); } setupIds() { @@ -13,68 +12,52 @@ class WBAccordion extends Component { const { state } = this; state.headerDomIds = names.map(() => ('accordion-' + uuid.v4())); state.collapseDomIds = names.map(() => ('accordion-' + uuid.v4())); - state.isOpen = Array(names.length).fill(false); + state.collapseClass = Array(names.length).fill('collapse'); + state.ariaExpanded = Array(names.length).fill(false); + state.buttonClass = Array(names.length).fill('btn btn-link collapsed'); state.collapseElements = null; } - setupEvents() { - const { collapseDomIds, isOpen } = this.state; - const accordion = this; - const collapseElements = $(collapseDomIds.map(a => '#' + a).join(',')); - this.state.collapseElements = collapseElements; - collapseElements.on('hidden.bs.collapse shown.bs.collapse', function(ev) { - // console.log(this.id); - const el = this; - const idx = collapseDomIds.findIndex(a => (a === el.id)); - isOpen[idx] = (ev.type === 'shown'); - accordion.setState({ isOpen }); - }); - } - - removeEvents() { - const { collapseElements } = this.state; - collapseElements.off('hidden.bs.collapse shown.bs.collapse'); - } - - setup() { + componentWillReceiveProps(nextProps) { + this.props = nextProps; this.setupIds(); - this.setupEvents(); } - componentDidMount() { - console.log('WBAccordion.componentDidMount()'); - this.setupEvents(); + toggle(idx) { + const { ariaExpanded, collapseClass, buttonClass } = this.state; + const isOpen = ariaExpanded[idx]; + for (let i = 0; i < ariaExpanded.length; i++) { + ariaExpanded[i] = false; + collapseClass[i] = 'collapse'; + buttonClass[i] = 'btn btn-link collapsed'; + } + if (!isOpen) { + ariaExpanded[idx] = true; + collapseClass[idx] = 'collapse show'; + buttonClass[idx] = 'btn btn-link'; + } + this.setState({ ariaExpanded, collapseClass, buttonClass }); } - componentWillUnmount() { - console.log('WBAccordion.componentWillUnmount()'); - this.removeEvents(); - } - - componentWillReceiveProps(nextProps) { - console.log('WBAccordion.componentWillReceiveProps()'); - this.props = nextProps; - this.removeEvents(); - this.setupIds(); - this.setState({}); // render - this.setupEvents(); - } + render({ children, names, cardHeaderClass }, { domId, headerDomIds, + collapseDomIds, collapseClass, ariaExpanded, buttonClass }) { - render({ children, names, cardHeaderClass }, { domId, headerDomIds, collapseDomIds, isOpen }) { return (
{ children.map((_, i) => (
-
+

-

-
+
{ children[i] }