From 8bcfebb88e8a8c4863ea7767d843872a5c99de73 Mon Sep 17 00:00:00 2001 From: Liam DeBeasi Date: Tue, 9 May 2023 13:55:26 -0400 Subject: [PATCH 01/13] feat(select): add label slot --- core/src/components.d.ts | 4 ++-- core/src/components/select/select.tsx | 12 ++++++++---- core/src/components/select/test/a11y/index.html | 3 +++ 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/core/src/components.d.ts b/core/src/components.d.ts index 55fabe7a3e6..f888b36dca7 100644 --- a/core/src/components.d.ts +++ b/core/src/components.d.ts @@ -2698,7 +2698,7 @@ export namespace Components { */ "justify": 'start' | 'end' | 'space-between'; /** - * The visible label associated with the select. + * The visible label associated with the select. Use this if you need to render a plaintext label. The `label` property will take priority over the `label` slot if both are used. */ "label"?: string; /** @@ -6772,7 +6772,7 @@ declare namespace LocalJSX { */ "justify"?: 'start' | 'end' | 'space-between'; /** - * The visible label associated with the select. + * The visible label associated with the select. Use this if you need to render a plaintext label. The `label` property will take priority over the `label` slot if both are used. */ "label"?: string; /** diff --git a/core/src/components/select/select.tsx b/core/src/components/select/select.tsx index 5931915cf31..094dea148be 100644 --- a/core/src/components/select/select.tsx +++ b/core/src/components/select/select.tsx @@ -32,9 +32,12 @@ import type { SelectChangeEventDetail, SelectInterface, SelectCompareFn } from ' /** * @virtualProp {"ios" | "md"} mode - The mode determines which platform styles to use. * + * @slot label - label - The label text to associate with the select. Use the "labelPlacement" property to control where the label is placed relative to the select. Use this if you need to render a label with custom HTML. + * * @part placeholder - The text displayed in the select when there is no value. * @part text - The displayed value of the select. * @part icon - The select icon container. + * */ @Component({ tag: 'ion-select', @@ -122,6 +125,10 @@ export class Select implements ComponentInterface { /** * The visible label associated with the select. + * + * Use this if you need to render a plaintext label. + * + * The `label` property will take priority over the `label` slot if both are used. */ @Prop() label?: string; @@ -696,13 +703,10 @@ export class Select implements ComponentInterface { private renderLabel() { const { label } = this; - if (label === undefined) { - return; - } return (
-
{this.label}
+ {label === undefined ? :
{label}
}
); } diff --git a/core/src/components/select/test/a11y/index.html b/core/src/components/select/test/a11y/index.html index fd7b9bd55f8..ca6d90befbd 100644 --- a/core/src/components/select/test/a11y/index.html +++ b/core/src/components/select/test/a11y/index.html @@ -15,6 +15,9 @@

Select - a11y

+ +
Slotted Label




From 186d759519c2dcb75ccc2a03374f9672cbd473a8 Mon Sep 17 00:00:00 2001 From: Liam DeBeasi Date: Tue, 9 May 2023 13:59:58 -0400 Subject: [PATCH 02/13] fix(select): label slot content is passed as default title for alert --- core/src/components/select/select.tsx | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/core/src/components/select/select.tsx b/core/src/components/select/select.tsx index 094dea148be..dd54e515c3d 100644 --- a/core/src/components/select/select.tsx +++ b/core/src/components/select/select.tsx @@ -573,7 +573,7 @@ export class Select implements ComponentInterface { * TODO FW-3194 * Remove legacyFormController logic. * Remove label and labelText vars - * Pass `this.label` instead of `labelText` + * Pass `this.labelText` instead of `labelText` * when setting the header. */ let label: HTMLElement | null; @@ -583,7 +583,7 @@ export class Select implements ComponentInterface { label = this.getLabel(); labelText = label ? label.textContent : null; } else { - labelText = this.label; + labelText = this.labelText; } const interfaceOptions = this.interfaceOptions; @@ -656,6 +656,22 @@ export class Select implements ComponentInterface { return Array.from(this.el.querySelectorAll('ion-select-option')); } + private get labelText() { + const { el, label } = this; + + if (label !== undefined) { + return label; + } + + const labelSlot = el.querySelector('[slot="label"]'); + + if (labelSlot !== null) { + return labelSlot.textContent; + } + + return; + } + private getText(): string { const selectedText = this.selectedText; if (selectedText != null && selectedText !== '') { From 8acbec52137593225ba4e9b64af9aa7d4d2a8d66 Mon Sep 17 00:00:00 2001 From: Liam DeBeasi Date: Tue, 9 May 2023 14:00:03 -0400 Subject: [PATCH 03/13] lint --- core/src/components/select/test/a11y/index.html | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/core/src/components/select/test/a11y/index.html b/core/src/components/select/test/a11y/index.html index ca6d90befbd..cd859593888 100644 --- a/core/src/components/select/test/a11y/index.html +++ b/core/src/components/select/test/a11y/index.html @@ -15,9 +15,7 @@

Select - a11y

- -
Slotted Label

+
Slotted Label




From 27d1cd180f3e8bc336ffd52a552a1e2503c58edc Mon Sep 17 00:00:00 2001 From: Liam DeBeasi Date: Wed, 10 May 2023 13:44:33 +0000 Subject: [PATCH 04/13] fix(select): slotted content can truncate --- core/src/components/select/select.scss | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/components/select/select.scss b/core/src/components/select/select.scss index ef32a431950..6c734c19f3a 100644 --- a/core/src/components/select/select.scss +++ b/core/src/components/select/select.scss @@ -294,7 +294,8 @@ button { * works on block-level elements. A flex item is * considered blockified (https://www.w3.org/TR/css-display-3/#blockify). */ -.label-text { +.label-text, +::slotted([slot="label"]) { text-overflow: ellipsis; white-space: nowrap; From 3bf0b70673fa21ea85328a28ef4d1af5e54f94b9 Mon Sep 17 00:00:00 2001 From: Liam DeBeasi Date: Fri, 12 May 2023 14:49:30 -0400 Subject: [PATCH 05/13] test(select): add tests to verify prop/slot behavior --- .../components/select/test/select.spec.tsx | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 core/src/components/select/test/select.spec.tsx diff --git a/core/src/components/select/test/select.spec.tsx b/core/src/components/select/test/select.spec.tsx new file mode 100644 index 00000000000..b2fee23d211 --- /dev/null +++ b/core/src/components/select/test/select.spec.tsx @@ -0,0 +1,54 @@ +import { newSpecPage } from '@stencil/core/testing'; + +import { Select } from '../select'; + +describe('ion-select', () => { + it('should render label prop if only prop provided', async () => { + const page = await newSpecPage({ + components: [Select], + html: ` + + `, + }); + + const select = page.body.querySelector('ion-select'); + + const propEl = select.shadowRoot.querySelector('.label-text'); + const slotEl = select.shadowRoot.querySelector('slot[name="label"]'); + + expect(propEl).not.toBe(null); + expect(slotEl).toBe(null); + }); + it('should render label slot if only slot provided', async () => { + const page = await newSpecPage({ + components: [Select], + html: ` +
Label Prop Slot
+ `, + }); + + const select = page.body.querySelector('ion-select'); + + const propEl = select.shadowRoot.querySelector('.label-text'); + const slotEl = select.shadowRoot.querySelector('slot[name="label"]'); + + expect(propEl).toBe(null); + expect(slotEl).not.toBe(null); + }); + it('should render label prop if both prop and slot provided', async () => { + const page = await newSpecPage({ + components: [Select], + html: ` +
Label Prop Slot
+ `, + }); + + const select = page.body.querySelector('ion-select'); + + const propEl = select.shadowRoot.querySelector('.label-text'); + const slotEl = select.shadowRoot.querySelector('slot[name="label"]'); + + expect(propEl).not.toBe(null); + expect(slotEl).toBe(null); + }); +}); From 45ea21d2261534f6f544cd14f723befa8975b5d3 Mon Sep 17 00:00:00 2001 From: Liam DeBeasi Date: Fri, 12 May 2023 14:51:33 -0400 Subject: [PATCH 06/13] test(select): verify alert header slot behavior --- .../select/test/label/select.e2e.ts | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/core/src/components/select/test/label/select.e2e.ts b/core/src/components/select/test/label/select.e2e.ts index 1989ffab301..80b63978cb8 100644 --- a/core/src/components/select/test/label/select.e2e.ts +++ b/core/src/components/select/test/label/select.e2e.ts @@ -282,7 +282,7 @@ configs({ modes: ['md'], directions: ['ltr'] }).forEach(({ title, screenshot, co }); configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config }) => { test.describe(title('select: alert label'), () => { - test('should use the label to set the default header in an alert', async ({ page }) => { + test('should use the label prop to set the default header in an alert', async ({ page }) => { await page.setContent( ` @@ -299,6 +299,26 @@ configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config }) => await select.click(); await ionAlertDidPresent.next(); + await expect(alert.locator('.alert-title')).toHaveText('My Alert'); + }); + test('should use the label slot to set the default header in an alert', async ({ page }) => { + await page.setContent( + ` + +
My Alert
+ A +
+ `, + config + ); + + const select = page.locator('ion-select'); + const alert = page.locator('ion-alert'); + const ionAlertDidPresent = await page.spyOnEvent('ionAlertDidPresent'); + + await select.click(); + await ionAlertDidPresent.next(); + await expect(alert.locator('.alert-title')).toHaveText('My Alert'); }); }); From 18858234e0ed29a40425c99bfebf22546ea6c3d5 Mon Sep 17 00:00:00 2001 From: Liam DeBeasi Date: Fri, 12 May 2023 15:05:10 -0400 Subject: [PATCH 07/13] fix(select): label is hidden if no content passed --- core/src/components/select/select.scss | 9 +++++++++ core/src/components/select/select.tsx | 11 ++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/core/src/components/select/select.scss b/core/src/components/select/select.scss index 6c734c19f3a..2128ca099e4 100644 --- a/core/src/components/select/select.scss +++ b/core/src/components/select/select.scss @@ -303,6 +303,15 @@ button { overflow: hidden; } +/** + * If no label text is placed into the slot + * then the element should be hidden otherwise + * there will be additional margins added. + */ +.label-text-wrapper-hidden { + display: none; +} + // Select Native Wrapper // ---------------------------------------------------------------- diff --git a/core/src/components/select/select.tsx b/core/src/components/select/select.tsx index dd54e515c3d..038afef56ec 100644 --- a/core/src/components/select/select.tsx +++ b/core/src/components/select/select.tsx @@ -721,12 +721,21 @@ export class Select implements ComponentInterface { const { label } = this; return ( -
+
{label === undefined ? :
{label}
}
); } + private get hasLabel() { + return this.label !== undefined || this.el.querySelector('[slot="label"]') !== null; + } + /** * Renders the border container * when fill="outline". From b1bb1f8603b8a6c917762d0fdeeba7adbafc907e Mon Sep 17 00:00:00 2001 From: Liam DeBeasi Date: Fri, 12 May 2023 15:07:59 -0400 Subject: [PATCH 08/13] clarify getters --- core/src/components/select/select.tsx | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/core/src/components/select/select.tsx b/core/src/components/select/select.tsx index 038afef56ec..fd3ac1f237a 100644 --- a/core/src/components/select/select.tsx +++ b/core/src/components/select/select.tsx @@ -656,6 +656,14 @@ export class Select implements ComponentInterface { return Array.from(this.el.querySelectorAll('ion-select-option')); } + /** + * Returns any plaintext associated with + * the label (either prop or slot). + * Note: This will not return any custom + * HTML. Use the `hasLabel` getter if you + * want to know if any slotted label content + * was passed. + */ private get labelText() { const { el, label } = this; @@ -732,6 +740,12 @@ export class Select implements ComponentInterface { ); } + /** + * Returns `true` if label content is provided + * either by a prop or a content. If you want + * to get the plaintext value of the label use + * the `labelText` getter instead. + */ private get hasLabel() { return this.label !== undefined || this.el.querySelector('[slot="label"]') !== null; } From 3974407839f285411f67b8dd00c82c2ef7be9adf Mon Sep 17 00:00:00 2001 From: Liam DeBeasi Date: Fri, 12 May 2023 15:09:03 -0400 Subject: [PATCH 09/13] test(select): verify header works with prop and slot --- .../select/test/label/select.e2e.ts | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/core/src/components/select/test/label/select.e2e.ts b/core/src/components/select/test/label/select.e2e.ts index 80b63978cb8..ba27433ef95 100644 --- a/core/src/components/select/test/label/select.e2e.ts +++ b/core/src/components/select/test/label/select.e2e.ts @@ -321,5 +321,25 @@ configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config }) => await expect(alert.locator('.alert-title')).toHaveText('My Alert'); }); + test.only('should use the label prop to set the default header in an alert if both prop and slot are set', async ({ page }) => { + await page.setContent( + ` + +
My Slot Alert
+ A +
+ `, + config + ); + + const select = page.locator('ion-select'); + const alert = page.locator('ion-alert'); + const ionAlertDidPresent = await page.spyOnEvent('ionAlertDidPresent'); + + await select.click(); + await ionAlertDidPresent.next(); + + await expect(alert.locator('.alert-title')).toHaveText('My Prop Alert'); + }); }); }); From 99006c42addd8ad997248c1cf095014fc46d8fc5 Mon Sep 17 00:00:00 2001 From: Liam DeBeasi Date: Fri, 12 May 2023 15:09:45 -0400 Subject: [PATCH 10/13] remove only --- core/src/components/select/test/label/select.e2e.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/src/components/select/test/label/select.e2e.ts b/core/src/components/select/test/label/select.e2e.ts index ba27433ef95..6351179bf16 100644 --- a/core/src/components/select/test/label/select.e2e.ts +++ b/core/src/components/select/test/label/select.e2e.ts @@ -321,7 +321,9 @@ configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config }) => await expect(alert.locator('.alert-title')).toHaveText('My Alert'); }); - test.only('should use the label prop to set the default header in an alert if both prop and slot are set', async ({ page }) => { + test('should use the label prop to set the default header in an alert if both prop and slot are set', async ({ + page, + }) => { await page.setContent( ` From 02a430a3f9efe156e1691b7f577fcffd14c044e9 Mon Sep 17 00:00:00 2001 From: Liam DeBeasi Date: Fri, 12 May 2023 15:19:57 -0400 Subject: [PATCH 11/13] fix(select): pass correct value to aria-label --- core/src/components/select/select.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/components/select/select.tsx b/core/src/components/select/select.tsx index fd3ac1f237a..4fb6fe5bdac 100644 --- a/core/src/components/select/select.tsx +++ b/core/src/components/select/select.tsx @@ -945,10 +945,10 @@ Developers can use the "legacy" property to continue using the legacy form marku } private get ariaLabel() { - const { placeholder, label, el, inputId, inheritedAttributes } = this; + const { placeholder, el, inputId, inheritedAttributes } = this; const displayValue = this.getText(); const { labelText } = getAriaLabel(el, inputId); - const definedLabel = label ?? inheritedAttributes['aria-label'] ?? labelText; + const definedLabel = this.labelText ?? inheritedAttributes['aria-label'] ?? labelText; /** * If developer has specified a placeholder From 3d1eda86d6b6958f248f55419ce88e837645c3f3 Mon Sep 17 00:00:00 2001 From: Liam DeBeasi Date: Mon, 15 May 2023 14:16:58 -0400 Subject: [PATCH 12/13] test(select): add screenshot for slot truncate --- .../components/select/test/label/select.e2e.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/core/src/components/select/test/label/select.e2e.ts b/core/src/components/select/test/label/select.e2e.ts index 6351179bf16..f9c0c570f0a 100644 --- a/core/src/components/select/test/label/select.e2e.ts +++ b/core/src/components/select/test/label/select.e2e.ts @@ -267,7 +267,7 @@ configs().forEach(({ title, screenshot, config }) => { configs({ modes: ['md'], directions: ['ltr'] }).forEach(({ title, screenshot, config }) => { test.describe(title('select: label overflow'), () => { - test('label should be truncated with ellipses', async ({ page }) => { + test('label property should be truncated with ellipses', async ({ page }) => { await page.setContent( ` @@ -278,6 +278,19 @@ configs({ modes: ['md'], directions: ['ltr'] }).forEach(({ title, screenshot, co const select = page.locator('ion-select'); expect(await select.screenshot()).toMatchSnapshot(screenshot(`select-label-truncate`)); }); + test('label slot should be truncated with ellipses', async ({ page }) => { + await page.setContent( + ` + +
Label Label Label Label Label
+
+ `, + config + ); + + const select = page.locator('ion-select'); + expect(await select.screenshot()).toMatchSnapshot(screenshot(`select-label-slot-truncate`)); + }); }); }); configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config }) => { From d297267f713a252464064073a724c043d26a1f64 Mon Sep 17 00:00:00 2001 From: ionitron Date: Mon, 15 May 2023 18:48:20 +0000 Subject: [PATCH 13/13] chore(): add updated snapshots --- ...-slot-truncate-md-ltr-Mobile-Chrome-linux.png | Bin 0 -> 9284 bytes ...slot-truncate-md-ltr-Mobile-Firefox-linux.png | Bin 0 -> 4023 bytes ...-slot-truncate-md-ltr-Mobile-Safari-linux.png | Bin 0 -> 8984 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 core/src/components/select/test/label/select.e2e.ts-snapshots/select-label-slot-truncate-md-ltr-Mobile-Chrome-linux.png create mode 100644 core/src/components/select/test/label/select.e2e.ts-snapshots/select-label-slot-truncate-md-ltr-Mobile-Firefox-linux.png create mode 100644 core/src/components/select/test/label/select.e2e.ts-snapshots/select-label-slot-truncate-md-ltr-Mobile-Safari-linux.png diff --git a/core/src/components/select/test/label/select.e2e.ts-snapshots/select-label-slot-truncate-md-ltr-Mobile-Chrome-linux.png b/core/src/components/select/test/label/select.e2e.ts-snapshots/select-label-slot-truncate-md-ltr-Mobile-Chrome-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..5acafac7d00300d0ae6e573f66f89293bfc1e592 GIT binary patch literal 9284 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 aZtdwd_HS_AxaWxm&>x(E8MYkbK>QDQ>_buj literal 0 HcmV?d00001 diff --git a/core/src/components/select/test/label/select.e2e.ts-snapshots/select-label-slot-truncate-md-ltr-Mobile-Safari-linux.png b/core/src/components/select/test/label/select.e2e.ts-snapshots/select-label-slot-truncate-md-ltr-Mobile-Safari-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..60b208fee5e4e248237427fce682ae9fac70a1c5 GIT binary patch literal 8984 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 O%J