From 2614e920453cc3e3042b04fc861875507dcb1793 Mon Sep 17 00:00:00 2001 From: Michael Cousins Date: Fri, 5 Jan 2024 10:58:07 -0500 Subject: [PATCH] APP-3126: clean up various interfaces for searchable select fixes (#458) --- .vscode/settings.json | 9 +- packages/core/.eslintrc.cjs | 9 + .../core/src/lib/floating/floating-style.ts | 12 +- .../core/src/lib/floating/floating.svelte | 16 +- packages/core/src/lib/icon/index.ts | 2 + packages/core/src/lib/index.ts | 14 +- packages/core/src/lib/input/index.ts | 3 +- packages/core/src/lib/input/input-state.ts | 8 + packages/core/src/lib/input/input.svelte | 48 ++--- packages/core/src/lib/input/text-input.svelte | 3 +- packages/core/src/lib/radio.svelte | 7 +- .../lib/select/__tests__/multiselect.spec.ts | 4 +- .../src/lib/select/__tests__/search.spec.ts | 175 +++++------------- .../__tests__/searchable-select.spec.ts | 4 +- .../lib/select/__tests__/select.spec.svelte | 4 +- packages/core/src/lib/select/index.ts | 6 + .../core/src/lib/select/multiselect.svelte | 16 +- packages/core/src/lib/select/search.ts | 85 ++++----- .../src/lib/select/searchable-select.svelte | 16 +- .../core/src/lib/select/select-input.svelte | 51 +++-- packages/core/src/lib/select/select.svelte | 18 +- 21 files changed, 236 insertions(+), 274 deletions(-) create mode 100644 packages/core/src/lib/icon/index.ts create mode 100644 packages/core/src/lib/input/input-state.ts create mode 100644 packages/core/src/lib/select/index.ts diff --git a/.vscode/settings.json b/.vscode/settings.json index cabf3fcc..6c242e3c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -22,5 +22,12 @@ ], "[svelte]": { "editor.defaultFormatter": "esbenp.prettier-vscode" - } + }, + "cSpell.words": [ + "activedescendant", + "combobox", + "listbox", + "radiobox", + "viamrobotics" + ] } diff --git a/packages/core/.eslintrc.cjs b/packages/core/.eslintrc.cjs index c172db4b..baa52fdb 100644 --- a/packages/core/.eslintrc.cjs +++ b/packages/core/.eslintrc.cjs @@ -22,6 +22,8 @@ module.exports = { rules: { // TODO(mc, 2023-12-15): remove overrides, fix issues '@typescript-eslint/no-non-null-assertion': 'warn', + // TODO(mc, 2024-01-03): move to base config? + 'multiline-comment-style': 'off', }, overrides: [ { @@ -37,5 +39,12 @@ module.exports = { '@typescript-eslint/no-unsafe-assignment': 'off', }, }, + // TODO(mc, 2024-01-03): remove when no-non-null-assertion errors fixed + { + files: ['**/__tests__/**'], + rules: { + '@typescript-eslint/no-non-null-assertion': 'off', + }, + }, ], }; diff --git a/packages/core/src/lib/floating/floating-style.ts b/packages/core/src/lib/floating/floating-style.ts index fb1f34ff..8b16d4dd 100644 --- a/packages/core/src/lib/floating/floating-style.ts +++ b/packages/core/src/lib/floating/floating-style.ts @@ -6,6 +6,7 @@ import { flip as flipMiddleware, shift as shiftMiddleware, arrow as arrowMiddleware, + size as sizeMiddleware, type Placement, type Side, type ComputePositionConfig, @@ -46,6 +47,7 @@ export interface State { offset?: number; flip?: boolean; shift?: number; + matchWidth?: boolean; auto?: boolean; } @@ -109,7 +111,7 @@ const calculateStyle = async (state: State): Promise => { }; const getConfig = (state: State): ComputePositionConfig => { - const { arrowElement, placement, offset, flip, shift } = state; + const { arrowElement, placement, offset, flip, shift, matchWidth } = state; return { placement: placement ?? 'top', @@ -122,6 +124,14 @@ const getConfig = (state: State): ComputePositionConfig => { }), shift !== undefined && shiftMiddleware({ padding: shift }), arrowElement && arrowMiddleware({ element: arrowElement }), + matchWidth && + sizeMiddleware({ + apply({ rects, elements }) { + Object.assign(elements.floating.style, { + width: `${rects.reference.width}px`, + }); + }, + }), ], }; }; diff --git a/packages/core/src/lib/floating/floating.svelte b/packages/core/src/lib/floating/floating.svelte index a898d9e3..275041eb 100644 --- a/packages/core/src/lib/floating/floating.svelte +++ b/packages/core/src/lib/floating/floating.svelte @@ -7,18 +7,26 @@ import { type FloatingPlacement, } from './floating-style'; -export { className as cx }; -export let referenceElement: FloatingReferenceElement; +export let referenceElement: FloatingReferenceElement | undefined; export let placement: FloatingPlacement = 'bottom-start'; export let offset = 0; +export let matchWidth = false; export let onClickOutside: ((target: Element) => unknown) | undefined = undefined; +let className: cx.Argument = undefined; +export { className as cx }; + const style = floatingStyle(); let floatingElement: HTMLElement | undefined; -let className: cx.Argument = undefined; -$: style.register({ referenceElement, floatingElement, placement, offset }); +$: style.register({ + referenceElement, + floatingElement, + placement, + offset, + matchWidth, +});
- - -