From 32a8214c59bd72c031165460a509f0291f20a75f Mon Sep 17 00:00:00 2001 From: Matthew Oliveira Date: Fri, 6 Dec 2024 14:20:34 -0500 Subject: [PATCH] fix(button): fix disable state of the button (#12151) ### Related Ticket(s) [ADCMS-6961](https://jsw.ibm.com/browse/ADCMS-6961) ### Description Fixes some odd icon logic left in the button component. The fix allows us to consistently re-render the correct CTA type icon whenever a change in the parent component may mean a different `` element is rendered. This allows for consistency across disable/active states. ### Testing instructions * Toggling disable knob and/or changing the `href` should maintain the expected icon and reflect the relevant state. * Change CTA type knob state to make sure it reflects the right value ### Changelog **Changed** - Fixed icon issues in the button component for disable state --- .../src/components/button/button.ts | 36 +++++++++++-------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/packages/web-components/src/components/button/button.ts b/packages/web-components/src/components/button/button.ts index f0fc96070f7..3ea0eb2a6c0 100644 --- a/packages/web-components/src/components/button/button.ts +++ b/packages/web-components/src/components/button/button.ts @@ -34,8 +34,8 @@ class C4DButton extends CTAMixin(StableSelectorMixin(CDSButton)) { @query('a') _linkNode; - @property() - iconDiv; + @query(`slot[name='icon']`) + iconSlot?: HTMLElement; @property() span; @@ -135,18 +135,26 @@ class C4DButton extends CTAMixin(StableSelectorMixin(CDSButton)) { updated(changedProperties) { super.updated(changedProperties); - - if (changedProperties.has('ctaType')) { - if (!this.iconDiv) { - this.iconDiv = this.shadowRoot?.querySelector("slot[name='icon']"); - } - - const { iconDiv } = this; - - iconDiv.querySelector('svg')?.remove(); - iconDiv.innerHTML = this._renderButtonIcon(); - iconDiv - ?.querySelector('svg') + const updateIconForProperties = [ + 'ctaType', + 'disabled', + 'tooltipText', + 'href', + ]; + const { iconSlot } = this; + + // Note that the parent may render a different + // based on changes to either disabled, tooltipText, or href, so we make + // sure to re-render the icon if any of those change, in addition to the + // ctaType. + if ( + iconSlot && + updateIconForProperties.some((prop) => changedProperties.has(prop)) + ) { + iconSlot.querySelector('svg')?.remove(); + iconSlot.innerHTML = this._renderButtonIcon(); + iconSlot + .querySelector('svg') ?.classList.add(`${prefix}--card__cta`, `${c4dPrefix}-ce--cta__icon`); } }