From 6c510e7a1f0748fcdc4de558c0c9c6f7c48d8dfa Mon Sep 17 00:00:00 2001 From: Hardik Pithva Date: Mon, 26 Oct 2020 14:59:33 +0100 Subject: [PATCH] fix(input-stepper): make use of prefix and suffix slots --- .../input-stepper/src/LionInputStepper.js | 100 +++++++++++++----- 1 file changed, 73 insertions(+), 27 deletions(-) diff --git a/packages/input-stepper/src/LionInputStepper.js b/packages/input-stepper/src/LionInputStepper.js index 42d09ddb0..918222363 100644 --- a/packages/input-stepper/src/LionInputStepper.js +++ b/packages/input-stepper/src/LionInputStepper.js @@ -34,8 +34,6 @@ export class LionInputStepper extends LionInput { type: Number, reflect: true, }, - __disableIncrementor: { attribute: false }, - __disableDecrementor: { attribute: false }, }; } @@ -50,8 +48,6 @@ export class LionInputStepper extends LionInput { super(); /** @param {string} modelValue */ this.parser = modelValue => parseFloat(modelValue); - this.__disableIncrementor = false; - this.__disableDecrementor = false; this.min = Infinity; this.max = Infinity; this.step = 1; @@ -103,6 +99,15 @@ export class LionInputStepper extends LionInput { } } + // @ts-ignore + get slots() { + return { + ...super.slots, + prefix: () => this.__getButtonNode(), + suffix: () => this.__getButtonNode(true), + }; + } + /** * Set aria labels and apply validators * @private @@ -149,8 +154,12 @@ export class LionInputStepper extends LionInput { */ __toggleSpinnerButtonsState() { const { min, max } = this.values; - this.__disableIncrementor = this.currentValue >= max && max !== Infinity; - this.__disableDecrementor = this.currentValue <= min && min !== Infinity; + const decrementButton = this.__getSlot('prefix'); + const incrementButton = this.__getSlot('suffix'); + const disableIncrementor = this.currentValue >= max && max !== Infinity; + const disableDecrementor = this.currentValue <= min && min !== Infinity; + decrementButton[disableDecrementor ? 'setAttribute' : 'removeAttribute']('disabled', 'true'); + incrementButton[disableIncrementor ? 'setAttribute' : 'removeAttribute']('disabled', 'true'); this.setAttribute('aria-valuenow', `${this.currentValue}`); this.dispatchEvent( new CustomEvent('user-input-changed', { @@ -159,6 +168,19 @@ export class LionInputStepper extends LionInput { ); } + /** + * Get slotted element + * @param {String} slotName - slot name + * @returns {HTMLButtonElement|Object} + */ + __getSlot(slotName) { + return ( + /** @type {HTMLElement[]} */ (Array.from(this.children)).find( + child => child.slot === slotName, + ) || {} + ); + } + /** * Increment the value based on given step or default step value is 1 * @private @@ -185,6 +207,24 @@ export class LionInputStepper extends LionInput { } } + /** + * Get the button node + * @param {Boolean} isIncrement flag to differentiate the template + * @returns {Element|null} + */ + __getButtonNode(isIncrement = false) { + const renderParent = document.createElement('div'); + /** @type {typeof LionInputStepper} */ (this.constructor).render( + isIncrement ? this._incrementorTemplate() : this._decrementorTemplate(), + renderParent, + { + scopeName: this.localName, + eventContext: this, + }, + ); + return renderParent.firstElementChild; + } + /** * Toggle +/- buttons on change * @override @@ -194,15 +234,6 @@ export class LionInputStepper extends LionInput { this.__toggleSpinnerButtonsState(); } - /** - * Override after template to none - * @override - */ - // eslint-disable-next-line class-methods-use-this - _inputGroupAfterTemplate() { - return html``; - } - /** * Override before template to none * @override @@ -213,43 +244,58 @@ export class LionInputStepper extends LionInput { } /** - * Override prefix template for the increment button - * @override + * Get the decrementor button sign template + * @returns {String|import('lit-element').TemplateResult} */ // eslint-disable-next-line class-methods-use-this - _inputGroupPrefixTemplate() { + _decrementorSignTemplate() { + return '-'; + } + + /** + * Get the incrementor button sign template + * @returns {String|import('lit-element').TemplateResult} + */ + // eslint-disable-next-line class-methods-use-this + _incrementorSignTemplate() { + return '+'; + } + + /** + * Get the increment button template + * @returns {import('lit-element').TemplateResult} + */ + _decrementorTemplate() { return html` `; } /** - * Override suffix template for the decrement button and add after slot - * @override + * Get the decrement button template + * @returns {import('lit-element').TemplateResult} */ - // eslint-disable-next-line class-methods-use-this - _inputGroupSuffixTemplate() { + _incrementorTemplate() { return html` - `; } }