fix(input-tel(-dropdown)): align with SlotMixin rerender functionality
This commit is contained in:
parent
bc2527030b
commit
ae06eb01f3
3 changed files with 30 additions and 41 deletions
|
|
@ -1,4 +1,4 @@
|
||||||
import { html, render, css } from 'lit';
|
import { html, css } from 'lit';
|
||||||
import { ref, createRef } from 'lit/directives/ref.js';
|
import { ref, createRef } from 'lit/directives/ref.js';
|
||||||
|
|
||||||
import { LionInputTel } from '@lion/ui/input-tel.js';
|
import { LionInputTel } from '@lion/ui/input-tel.js';
|
||||||
|
|
@ -99,6 +99,7 @@ export class LionInputTelDropdown extends LionInputTel {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
return {
|
return {
|
||||||
refs,
|
refs,
|
||||||
data: {
|
data: {
|
||||||
|
|
@ -155,7 +156,7 @@ export class LionInputTelDropdown extends LionInputTel {
|
||||||
css`
|
css`
|
||||||
/**
|
/**
|
||||||
* We need to align the height of the dropdown with the height of the text field.
|
* We need to align the height of the dropdown with the height of the text field.
|
||||||
* We target the HTMLDivElement 'this.__dropdownRenderParent' here. Its child,
|
* We target the HTMLDivElement (render wrapper from SlotMixin) here. Its child,
|
||||||
* [data-ref=dropdown], recieves a 100% height as well via inline styles (since we
|
* [data-ref=dropdown], recieves a 100% height as well via inline styles (since we
|
||||||
* can't target from shadow styles).
|
* can't target from shadow styles).
|
||||||
*/
|
*/
|
||||||
|
|
@ -171,7 +172,19 @@ export class LionInputTelDropdown extends LionInputTel {
|
||||||
get slots() {
|
get slots() {
|
||||||
return {
|
return {
|
||||||
...super.slots,
|
...super.slots,
|
||||||
prefix: () => this.__dropdownRenderParent,
|
prefix: () => {
|
||||||
|
const ctor = /** @type {typeof LionInputTelDropdown} */ (this.constructor);
|
||||||
|
// If the user locally overrode the templates, get those on the instance
|
||||||
|
// @ts-expect-error
|
||||||
|
const templates = this.templates || ctor.templates;
|
||||||
|
|
||||||
|
return {
|
||||||
|
template: templates.dropdown(this._templateDataDropdown),
|
||||||
|
afterRender: () => {
|
||||||
|
this.__syncRegionWithDropdown();
|
||||||
|
},
|
||||||
|
};
|
||||||
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -186,7 +199,6 @@ export class LionInputTelDropdown extends LionInputTel {
|
||||||
type: 'region',
|
type: 'region',
|
||||||
});
|
});
|
||||||
this.__createRegionMeta();
|
this.__createRegionMeta();
|
||||||
this._scheduleLightDomRender();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -195,6 +207,8 @@ export class LionInputTelDropdown extends LionInputTel {
|
||||||
_onPhoneNumberUtilReady() {
|
_onPhoneNumberUtilReady() {
|
||||||
super._onPhoneNumberUtilReady();
|
super._onPhoneNumberUtilReady();
|
||||||
this.__createRegionMeta();
|
this.__createRegionMeta();
|
||||||
|
// render dropdown (trigger render of prefix slot via SlotMixin)
|
||||||
|
this.requestUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -219,9 +233,6 @@ export class LionInputTelDropdown extends LionInputTel {
|
||||||
*/
|
*/
|
||||||
this._preferredCountriesLabel = '';
|
this._preferredCountriesLabel = '';
|
||||||
|
|
||||||
/** @type {HTMLDivElement} */
|
|
||||||
this.__dropdownRenderParent = document.createElement('div');
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Contains everything needed for rendering region options:
|
* Contains everything needed for rendering region options:
|
||||||
* region code, country code, display name according to locale, display name
|
* region code, country code, display name according to locale, display name
|
||||||
|
|
@ -259,9 +270,9 @@ export class LionInputTelDropdown extends LionInputTel {
|
||||||
updated(changedProperties) {
|
updated(changedProperties) {
|
||||||
super.updated(changedProperties);
|
super.updated(changedProperties);
|
||||||
|
|
||||||
if (changedProperties.has('_needsLightDomRender')) {
|
// if (changedProperties.has('_needsLightDomRender')) {
|
||||||
this.__renderDropdown();
|
// this.__renderDropdown();
|
||||||
}
|
// }
|
||||||
if (changedProperties.has('activeRegion')) {
|
if (changedProperties.has('activeRegion')) {
|
||||||
this.__syncRegionWithDropdown();
|
this.__syncRegionWithDropdown();
|
||||||
}
|
}
|
||||||
|
|
@ -326,6 +337,7 @@ export class LionInputTelDropdown extends LionInputTel {
|
||||||
if (prevActiveRegion !== this.activeRegion && !this.focused && this._phoneUtil) {
|
if (prevActiveRegion !== this.activeRegion && !this.focused && this._phoneUtil) {
|
||||||
const prevCountryCode = this._phoneUtil.getCountryCodeForRegionCode(prevActiveRegion);
|
const prevCountryCode = this._phoneUtil.getCountryCodeForRegionCode(prevActiveRegion);
|
||||||
const countryCode = this._phoneUtil.getCountryCodeForRegionCode(this.activeRegion);
|
const countryCode = this._phoneUtil.getCountryCodeForRegionCode(this.activeRegion);
|
||||||
|
|
||||||
if (this.value.includes(`+${prevCountryCode}`)) {
|
if (this.value.includes(`+${prevCountryCode}`)) {
|
||||||
this.modelValue = this._callParser(
|
this.modelValue = this._callParser(
|
||||||
this.value.replace(`+${prevCountryCode}`, `+${countryCode}`),
|
this.value.replace(`+${prevCountryCode}`, `+${countryCode}`),
|
||||||
|
|
@ -350,25 +362,6 @@ export class LionInputTelDropdown extends LionInputTel {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Abstract away rendering to light dom, so that we can rerender when needed
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
__renderDropdown() {
|
|
||||||
const ctor = /** @type {typeof LionInputTelDropdown} */ (this.constructor);
|
|
||||||
// If the user locally overrode the templates, get those on the instance
|
|
||||||
const templates = this.templates || ctor.templates;
|
|
||||||
render(
|
|
||||||
templates.dropdown(this._templateDataDropdown),
|
|
||||||
this.__dropdownRenderParent,
|
|
||||||
/** @type {RenderOptions} */ ({
|
|
||||||
scopeName: this.localName,
|
|
||||||
eventContext: this,
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
this.__syncRegionWithDropdown();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
|
|
@ -411,6 +404,7 @@ export class LionInputTelDropdown extends LionInputTel {
|
||||||
if (!this._allowedOrAllRegions?.length || !this.__namesForLocale) {
|
if (!this._allowedOrAllRegions?.length || !this.__namesForLocale) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.__regionMetaList = [];
|
this.__regionMetaList = [];
|
||||||
this.__regionMetaListPreferred = [];
|
this.__regionMetaListPreferred = [];
|
||||||
this._allowedOrAllRegions.forEach(regionCode => {
|
this._allowedOrAllRegions.forEach(regionCode => {
|
||||||
|
|
|
||||||
|
|
@ -71,6 +71,7 @@ export function runInputTelDropdownSuite({ klass } = { klass: LionInputTelDropdo
|
||||||
|
|
||||||
it('syncs value of dropdown on init if input has no value', async () => {
|
it('syncs value of dropdown on init if input has no value', async () => {
|
||||||
const el = await fixture(html` <${tag}></${tag}> `);
|
const el = await fixture(html` <${tag}></${tag}> `);
|
||||||
|
// await el.updateComplete;
|
||||||
expect(el.activeRegion).to.equal('GB');
|
expect(el.activeRegion).to.equal('GB');
|
||||||
expect(el.value).to.equal('+44');
|
expect(el.value).to.equal('+44');
|
||||||
expect(getDropdownValue(/** @type {DropdownElement} */ (el.refs.dropdown.value))).to.equal(
|
expect(getDropdownValue(/** @type {DropdownElement} */ (el.refs.dropdown.value))).to.equal(
|
||||||
|
|
@ -92,7 +93,7 @@ export function runInputTelDropdownSuite({ klass } = { klass: LionInputTelDropdo
|
||||||
it('syncs value of dropdown on init if input has no value does not influence interaction states', async () => {
|
it('syncs value of dropdown on init if input has no value does not influence interaction states', async () => {
|
||||||
const el = await fixture(html` <${tag}></${tag}> `);
|
const el = await fixture(html` <${tag}></${tag}> `);
|
||||||
// TODO find out why its get dirty again
|
// TODO find out why its get dirty again
|
||||||
// expect(el.dirty).to.be.false;
|
expect(el.dirty).to.be.false;
|
||||||
expect(el.prefilled).to.be.false;
|
expect(el.prefilled).to.be.false;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -245,10 +246,10 @@ export function runInputTelDropdownSuite({ klass } = { klass: LionInputTelDropdo
|
||||||
const { resolveLoaded } = mockPhoneUtilManager();
|
const { resolveLoaded } = mockPhoneUtilManager();
|
||||||
const el = await fixture(html` <${tag} .allowedRegions="${['DE']}"></${tag}> `);
|
const el = await fixture(html` <${tag} .allowedRegions="${['DE']}"></${tag}> `);
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
const spy = sinon.spy(el, '_scheduleLightDomRender');
|
const spy = sinon.spy(el, '__rerenderSlot');
|
||||||
resolveLoaded(undefined);
|
resolveLoaded(undefined);
|
||||||
await aTimeout(0);
|
await aTimeout(0);
|
||||||
expect(spy).to.have.been.calledOnce;
|
expect(spy).to.have.been.calledWith('prefix');
|
||||||
restorePhoneUtilManager();
|
restorePhoneUtilManager();
|
||||||
spy.restore();
|
spy.restore();
|
||||||
});
|
});
|
||||||
|
|
@ -323,6 +324,7 @@ export function runInputTelDropdownSuite({ klass } = { klass: LionInputTelDropdo
|
||||||
mimicUserChangingDropdown(el.refs.dropdown.value, 'BE');
|
mimicUserChangingDropdown(el.refs.dropdown.value, 'BE');
|
||||||
await el.updateComplete;
|
await el.updateComplete;
|
||||||
await el.updateComplete;
|
await el.updateComplete;
|
||||||
|
|
||||||
expect(el.value).to.equal('+32 612345678');
|
expect(el.value).to.equal('+32 612345678');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -305,20 +305,13 @@ export class LionInputTel extends LocalizeMixin(LionInput) {
|
||||||
// This should trigger a rerender in shadow dom
|
// This should trigger a rerender in shadow dom
|
||||||
this._phoneUtil = /** @type {AwesomePhoneNumber} */ (PhoneUtilManager.PhoneUtil);
|
this._phoneUtil = /** @type {AwesomePhoneNumber} */ (PhoneUtilManager.PhoneUtil);
|
||||||
// This should trigger a rerender in light dom
|
// This should trigger a rerender in light dom
|
||||||
this._scheduleLightDomRender();
|
// this._scheduleLightDomRender();
|
||||||
|
// this._scheduleSlotRenderFor('prefix');
|
||||||
// Format when libPhoneNumber is loaded
|
// Format when libPhoneNumber is loaded
|
||||||
this._calculateValues({ source: null });
|
this._calculateValues({ source: null });
|
||||||
this.__calculateActiveRegion();
|
this.__calculateActiveRegion();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This allows to hook into the update hook
|
|
||||||
* @protected
|
|
||||||
*/
|
|
||||||
_scheduleLightDomRender() {
|
|
||||||
this._needsLightDomRender += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue