From 041d3bb15ab108eea58e3bd428dccaef6d568365 Mon Sep 17 00:00:00 2001 From: Stanislaw Adaszewski Date: Wed, 8 Apr 2020 16:51:03 +0200 Subject: [PATCH] Started working on fixing WBAccordion --- frontend/src/js/widget/wb-accordion.js | 60 ++++++++++++++++++++++---- 1 file changed, 52 insertions(+), 8 deletions(-) diff --git a/frontend/src/js/widget/wb-accordion.js b/frontend/src/js/widget/wb-accordion.js index f2d4158..d4bf2dd 100644 --- a/frontend/src/js/widget/wb-accordion.js +++ b/frontend/src/js/widget/wb-accordion.js @@ -3,34 +3,78 @@ import { h, Component } from 'preact'; class WBAccordion extends Component { constructor(...args) { super(...args); + this.setupIds(); + console.log('WBAccordion() : domId=' + this.state.domId); + } + + setupIds() { this.state.domId = 'accordion-' + uuid.v4(); - this.state.headerDomIds = this.props.names.map(() => ('accordion-' + uuid.v4())); - this.state.collapseDomIds = this.props.names.map(() => ('accordion-' + uuid.v4())); - // console.log('WBAccordion() : domId=' + this.state.domId); + const { names } = this.props; + 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.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'); } - /* componentDidMount() { + setup() { + this.setupIds(); + this.setupEvents(); + } + + componentDidMount() { console.log('WBAccordion.componentDidMount()'); + this.setupEvents(); + } + + 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 }) { + render({ children, names, cardHeaderClass }, { domId, headerDomIds, collapseDomIds, isOpen }) { return (
{ children.map((_, i) => (

-

-
+
{ children[i] }