diff --git a/package.json b/package.json index c9d9a78c4..4d76284f8 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "types": "", "scripts": { "start:storybook": "yarn tokens:generate && yarn compile:icons && yarn workspace @boiler/ui-library start:storybook", + "build:js-example-app": "yarn workspace @boiler/js-example-app build:dev", "start:js-example-app": "yarn workspace @boiler/js-example-app start:dev", "build:storybook": "yarn tokens:generate && yarn compile:icons && yarn workspace @boiler/ui-library build:storybook", "build:ui-library": "yarn tokens:generate && yarn compile:icons && yarn workspace @boiler/ui-library build && yarn workspace @boiler/ui-library compile", diff --git a/packages/js-example-app/src/index.server.ts b/packages/js-example-app/src/index.server.ts index 469e36378..d995c915e 100644 --- a/packages/js-example-app/src/index.server.ts +++ b/packages/js-example-app/src/index.server.ts @@ -61,14 +61,15 @@ export function* renderIndex() { aria-label="Select" select-id="selectId" name="select" + options=${JSON.stringify([ + { label: '--Please choose an option--', value: '' }, + { label: 'option 1', value: 'option1' }, + { label: 'option 2', value: 'option2' }, + { label: 'option 3', value: 'option3', disabled: true }, + { label: 'option 4', value: 'option4' }, + { label: 'option 5', value: 'option5', selected: true }, + ])} > - - - - - - - diff --git a/packages/ui-library/src/components/select/index.css.ts b/packages/ui-library/src/components/select/index.css.ts index 7790bd2aa..979284bc4 100644 --- a/packages/ui-library/src/components/select/index.css.ts +++ b/packages/ui-library/src/components/select/index.css.ts @@ -22,10 +22,6 @@ export const staticStyles = css` display: flex; } - slot { - display: none; - } - .blr-select-inner-container { flex-grow: 1; flex-shrink: 1; diff --git a/packages/ui-library/src/components/select/index.stories.ts b/packages/ui-library/src/components/select/index.stories.ts index 64a134151..5072fb324 100644 --- a/packages/ui-library/src/components/select/index.stories.ts +++ b/packages/ui-library/src/components/select/index.stories.ts @@ -37,6 +37,14 @@ const defaultParams: BlrSelectType = { arialabel: 'Select', selectId: 'selectId', name: 'select', + options: [ + { label: '--Please choose an option--', value: '' }, + { label: 'option 1', value: 'option1' }, + { label: 'option 2', value: 'option2' }, + { label: 'option 3', value: 'option3', disabled: true }, + { label: 'option 4', value: 'option4' }, + { label: 'option 5', value: 'option5', selected: true }, + ], }; export default { @@ -232,17 +240,7 @@ Select presents users with a list of options from which they can make a single s }, }; -const optionsAsChildren = html` - - - - - - - -`; - -export const BlrSelect = (params: BlrSelectType) => BlrSelectRenderFunction(params, optionsAsChildren); +export const BlrSelect = (params: BlrSelectType) => BlrSelectRenderFunction(params); BlrSelect.storyName = 'Select'; BlrSelect.args = defaultParams; @@ -293,33 +291,24 @@ export const SizeVariant = () => { return html` ${sharedStyles}
- ${BlrSelectRenderFunction( - { - ...defaultParams, - sizeVariant: 'sm', - label: 'Select SM', - labelAppendix: '', - }, - optionsAsChildren - )} - ${BlrSelectRenderFunction( - { - ...defaultParams, - sizeVariant: 'md', - label: 'Select MD', - labelAppendix: '', - }, - optionsAsChildren - )} - ${BlrSelectRenderFunction( - { - ...defaultParams, - sizeVariant: 'lg', - label: 'Select LG', - labelAppendix: '', - }, - optionsAsChildren - )} + ${BlrSelectRenderFunction({ + ...defaultParams, + sizeVariant: 'sm', + label: 'Select SM', + labelAppendix: '', + })} + ${BlrSelectRenderFunction({ + ...defaultParams, + sizeVariant: 'md', + label: 'Select MD', + labelAppendix: '', + })} + ${BlrSelectRenderFunction({ + ...defaultParams, + sizeVariant: 'lg', + label: 'Select LG', + labelAppendix: '', + })}
`; }; @@ -338,15 +327,12 @@ export const Disabled = () => { return html` ${sharedStyles}
- ${BlrSelectRenderFunction( - { - ...defaultParams, - disabled: true, - label: 'Disabled', - labelAppendix: '', - }, - optionsAsChildren - )} + ${BlrSelectRenderFunction({ + ...defaultParams, + disabled: true, + label: 'Disabled', + labelAppendix: '', + })}
`; }; @@ -365,15 +351,12 @@ export const Required = () => { return html` ${sharedStyles}
- ${BlrSelectRenderFunction( - { - ...defaultParams, - required: true, - label: 'Required', - labelAppendix: '', - }, - optionsAsChildren - )} + ${BlrSelectRenderFunction({ + ...defaultParams, + required: true, + label: 'Required', + labelAppendix: '', + })}
`; }; @@ -389,16 +372,13 @@ export const HasError = () => { return html` ${sharedStyles}
- ${BlrSelectRenderFunction( - { - ...defaultParams, - hasError: true, - errorMessageIcon: undefined, - label: 'Error', - labelAppendix: '', - }, - optionsAsChildren - )} + ${BlrSelectRenderFunction({ + ...defaultParams, + hasError: true, + errorMessageIcon: undefined, + label: 'Error', + labelAppendix: '', + })}
`; }; @@ -415,22 +395,16 @@ export const FormLabel = () => { return html` ${sharedStyles}
- ${BlrSelectRenderFunction( - { - ...defaultParams, - label: 'With Label', - labelAppendix: '(with Appendix)', - }, - optionsAsChildren - )} - ${BlrSelectRenderFunction( - { - ...defaultParams, - label: ' ', - labelAppendix: ' ', - }, - optionsAsChildren - )} + ${BlrSelectRenderFunction({ + ...defaultParams, + label: 'With Label', + labelAppendix: '(with Appendix)', + })} + ${BlrSelectRenderFunction({ + ...defaultParams, + label: ' ', + labelAppendix: ' ', + })}
`; }; @@ -446,24 +420,18 @@ export const Icon = () => { return html` ${sharedStyles}
- ${BlrSelectRenderFunction( - { - ...defaultParams, - icon: 'blrArrowUp', - label: 'With Icon', - labelAppendix: ' ', - }, - optionsAsChildren - )} - ${BlrSelectRenderFunction( - { - ...defaultParams, - icon: undefined, - label: 'Default Icon', - labelAppendix: ' ', - }, - optionsAsChildren - )} + ${BlrSelectRenderFunction({ + ...defaultParams, + icon: 'blrArrowUp', + label: 'With Icon', + labelAppendix: ' ', + })} + ${BlrSelectRenderFunction({ + ...defaultParams, + icon: undefined, + label: 'Default Icon', + labelAppendix: ' ', + })}
`; }; @@ -477,28 +445,22 @@ export const FormCaptionGroup = () => { return html` ${sharedStyles}
- ${BlrSelectRenderFunction( - { - ...defaultParams, - hasHint: true, - label: 'Hint message', - labelAppendix: ' ', - }, - optionsAsChildren - )} - ${BlrSelectRenderFunction( - { - ...defaultParams, - icon: undefined, - label: 'Hint and error message', - labelAppendix: '', - hasHint: true, - hasError: true, - errorMessage: "OMG it's an error", - errorMessageIcon: 'blrErrorFilled', - }, - optionsAsChildren - )} + ${BlrSelectRenderFunction({ + ...defaultParams, + hasHint: true, + label: 'Hint message', + labelAppendix: ' ', + })} + ${BlrSelectRenderFunction({ + ...defaultParams, + icon: undefined, + label: 'Hint and error message', + labelAppendix: '', + hasHint: true, + hasError: true, + errorMessage: "OMG it's an error", + errorMessageIcon: 'blrErrorFilled', + })}
`; }; diff --git a/packages/ui-library/src/components/select/index.test.ts b/packages/ui-library/src/components/select/index.test.ts index e493905d5..ea8e423ef 100644 --- a/packages/ui-library/src/components/select/index.test.ts +++ b/packages/ui-library/src/components/select/index.test.ts @@ -1,10 +1,7 @@ import '@boiler/ui-library'; - import { BlrSelectRenderFunction } from './renderFunction.js'; - import { fixture, expect } from '@open-wc/testing'; import { querySelectorAllDeep, querySelectorDeep } from 'query-selector-shadow-dom'; -import { html } from 'lit-html'; import { BlrSelectType } from './index.js'; const sampleParams: BlrSelectType = { @@ -19,21 +16,18 @@ const sampleParams: BlrSelectType = { selectId: 'Peter', errorMessageIcon: 'blrErrorFilled', theme: 'Light', + options: [ + { label: 'option 1', value: 'option1' }, + { label: 'option 2', value: 'option2' }, + { label: 'option 3', value: 'option3', disabled: true }, + { label: 'option 4', value: 'option4' }, + { label: 'option 5', value: 'option5', selected: true }, + ], }; -const optionsAsChildren = html` - - - - - - - -`; - describe('blr-select', () => { it('is having a select containing the right className', async () => { - const element = await fixture(BlrSelectRenderFunction(sampleParams, optionsAsChildren)); + const element = await fixture(BlrSelectRenderFunction(sampleParams)); const select = querySelectorDeep('select', element.getRootNode() as HTMLElement); const className = select?.className; @@ -100,11 +94,4 @@ describe('blr-select', () => { expect(className).to.contain('sm'); }); - - it('is rendering options inside slot', async () => { - const element = await fixture(BlrSelectRenderFunction({ ...sampleParams, sizeVariant: 'sm' }, optionsAsChildren)); - const options = querySelectorAllDeep('.blr-select-option', element?.getRootNode() as HTMLElement); - const optionsLength = optionsAsChildren.strings[0].trim().split('').filter(Boolean).length; - expect(options).to.be.lengthOf(optionsLength); - }); }); diff --git a/packages/ui-library/src/components/select/index.ts b/packages/ui-library/src/components/select/index.ts index e89202048..bd2a1f30f 100644 --- a/packages/ui-library/src/components/select/index.ts +++ b/packages/ui-library/src/components/select/index.ts @@ -25,6 +25,13 @@ import { import { LitElementCustom, ElementInterface } from '../../utils/lit/element.js'; +type Options = { + label: string; + value: string; + disabled?: boolean; + selected?: boolean; +}; + export type BlrSelectEventHandlers = { blrSelectedValueChange?: (event: BlrSelectedValueChangeEvent) => void; blrFocus?: (event: BlrFocusEvent) => void; @@ -53,7 +60,6 @@ export class BlrSelect extends LitElementCustom { @property() accessor required: boolean | undefined; @property() accessor blrBlur: HTMLElement['blur'] | undefined; @property() accessor blrFocus: HTMLElement['focus'] | undefined; - @property() accessor hasError: boolean | undefined; @property() accessor errorMessage: string | undefined; @property() accessor hintMessage: string | undefined; @@ -61,13 +67,10 @@ export class BlrSelect extends LitElementCustom { @property() accessor errorMessageIcon: SizelessIconType | undefined; @property() accessor hasHint: boolean | undefined; @property() accessor icon: SizelessIconType | undefined = 'blrChevronDown'; - @property() accessor theme: ThemeType = 'Light'; - + @property() accessor options!: Options[] | JSON; @state() protected accessor isFocused = false; - protected _optionElements: Element[] | undefined; - protected handleFocus = (event: FocusEvent) => { if (!this.disabled) { this.isFocused = true; @@ -82,20 +85,6 @@ export class BlrSelect extends LitElementCustom { } }; - // eslint-disable-next-line @typescript-eslint/no-unused-vars - protected firstUpdated(...args: Parameters): void { - if (!this._optionElements) { - this.handleSlotChange(); - } - } - - protected handleSlotChange() { - const slot = this.renderRoot?.querySelector('slot'); - - this._optionElements = slot?.assignedElements({ flatten: false }); - this.requestUpdate(); - } - protected handleChange(event: Event) { this.dispatchEvent( createBlrSelectedValueChangeEvent({ originalEvent: event, selectedValue: this._selectNode.value }) @@ -170,8 +159,6 @@ export class BlrSelect extends LitElementCustom { }); return html` - -
${this.hasLabel ? html` @@ -200,15 +187,15 @@ export class BlrSelect extends LitElementCustom { @focus=${this.handleFocus} @blur=${this.handleBlur} > - ${this._optionElements?.map((opt: Element) => { + ${(typeof this.options === 'string' ? JSON.parse(this.options) : this.options).map((opt: Options) => { return html` `; })} diff --git a/packages/ui-library/src/components/select/renderFunction.ts b/packages/ui-library/src/components/select/renderFunction.ts index 146ad7213..863294ed9 100644 --- a/packages/ui-library/src/components/select/renderFunction.ts +++ b/packages/ui-library/src/components/select/renderFunction.ts @@ -1,8 +1,7 @@ -import { TemplateResult } from 'lit-html'; import { BlrSelectType } from './index.js'; import { genericBlrComponentRenderer } from '../../utils/typesafe-generic-component-renderer.js'; export const TAG_NAME = 'blr-select'; -export const BlrSelectRenderFunction = (params: BlrSelectType, children?: TemplateResult<1>) => - genericBlrComponentRenderer(TAG_NAME, { ...params }, children); +export const BlrSelectRenderFunction = (params: BlrSelectType) => + genericBlrComponentRenderer(TAG_NAME, { ...params });