From b1728db7a0b2dd39c5d1866d384118fecc4e2adc Mon Sep 17 00:00:00 2001 From: aarondoet <42084688+aarondoet@users.noreply.github.com> Date: Tue, 3 Sep 2024 23:08:52 +0000 Subject: [PATCH 01/11] Add generics to Select component --- src/lib/forms/select/Select.svelte | 4 ++-- src/lib/forms/select/index.ts | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/lib/forms/select/Select.svelte b/src/lib/forms/select/Select.svelte index da4419f4..3cf7dd05 100644 --- a/src/lib/forms/select/Select.svelte +++ b/src/lib/forms/select/Select.svelte @@ -1,7 +1,7 @@ - diff --git a/src/lib/forms/select/index.ts b/src/lib/forms/select/index.ts index 04f551ea..1a8ce232 100644 --- a/src/lib/forms/select/index.ts +++ b/src/lib/forms/select/index.ts @@ -8,10 +8,10 @@ type SelectOptionType = { value: T; }; -interface SelectProps extends Omit { +interface SelectProps extends Omit { children?: Snippet; - items?: SelectOptionType[]; - value?: any; + items?: SelectOptionType[]; + value?: T; underline?: boolean; size?: 'sm' | 'md' | 'lg'; placeholder?: string; From a8111f7cafb7a42dde9c0df5dfea75a4cb2afb6f Mon Sep 17 00:00:00 2001 From: aarondoet <42084688+aarondoet@users.noreply.github.com> Date: Tue, 3 Sep 2024 23:10:50 +0000 Subject: [PATCH 02/11] Restrict generic type --- src/lib/forms/select/index.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lib/forms/select/index.ts b/src/lib/forms/select/index.ts index 1a8ce232..a8b7fdbf 100644 --- a/src/lib/forms/select/index.ts +++ b/src/lib/forms/select/index.ts @@ -8,7 +8,7 @@ type SelectOptionType = { value: T; }; -interface SelectProps extends Omit { +interface SelectProps extends Omit { children?: Snippet; items?: SelectOptionType[]; value?: T; @@ -17,10 +17,10 @@ interface SelectProps extends Omit { placeholder?: string; } -interface MultiSelectProps extends HTMLAttributes { +interface MultiSelectProps extends HTMLAttributes { children?: Snippet; items?: SelectOptionType[]; - value?: (string | number)[]; + value?: T[]; size?: 'sm' | 'md' | 'lg'; dropdownClass?: string; placeholder?: string; From 1aba285e5f60fbdce86a73cbd31d015ffb2f4e44 Mon Sep 17 00:00:00 2001 From: aarondoet <42084688+aarondoet@users.noreply.github.com> Date: Wed, 4 Sep 2024 00:36:27 +0000 Subject: [PATCH 03/11] Implement MultiSelect component --- src/lib/forms/select/MultiSelect.svelte | 123 ++++++++++++++++++++++++ src/lib/forms/select/index.ts | 11 ++- src/lib/forms/select/theme.ts | 13 +++ 3 files changed, 142 insertions(+), 5 deletions(-) create mode 100644 src/lib/forms/select/MultiSelect.svelte diff --git a/src/lib/forms/select/MultiSelect.svelte b/src/lib/forms/select/MultiSelect.svelte new file mode 100644 index 00000000..211b9aed --- /dev/null +++ b/src/lib/forms/select/MultiSelect.svelte @@ -0,0 +1,123 @@ + + + + + +{#snippet defaultChildren({ item, clear }: { item: SelectOptionType, clear: () => void })} + + {item.name} + +{/snippet} + +
show = !show} onfocusout={() => show = false} {onkeydown} tabindex="0" role="listbox" class={twMerge(multiSelectClass, selectCls({ size }), className)}> + {#if !selectedItems.length} + {placeholder} + {/if} + + {#each selectedItems as item (item.value)} + {@render children({ item, clear: () => clearOption(item) })} + {/each} + +
+ {#if selectedItems.length} + + {/if} +
+ +
+ + {#if show} +
(e.stopPropagation(), onclick?.(e))} role="presentation" class={multiSelectDropdown}> + {#each items as item (item.value)} +
selectOption(item)} role="presentation" class={twMerge(itemsClass, selectedItems.includes(item) && itemsSelectedClass, activeItem === item && activeItemClass)}> + {item.name} +
+ {/each} +
+ {/if} +
diff --git a/src/lib/forms/select/index.ts b/src/lib/forms/select/index.ts index a8b7fdbf..e15ea8ff 100644 --- a/src/lib/forms/select/index.ts +++ b/src/lib/forms/select/index.ts @@ -1,7 +1,7 @@ import Select from './Select.svelte'; import type { Snippet } from 'svelte'; import type { HTMLSelectAttributes, HTMLAttributes } from 'svelte/elements'; -import { select } from './theme'; +import { select, multiSelect } from './theme'; type SelectOptionType = { name: string | number; @@ -17,14 +17,15 @@ interface SelectProps extends Omit extends HTMLAttributes { - children?: Snippet; - items?: SelectOptionType[]; +interface MultiSelectProps extends Omit, "children" | "onclick"> { + children?: Snippet<[{ item: SelectOptionType, clear: () => void }]>; + items: SelectOptionType[]; value?: T[]; size?: 'sm' | 'md' | 'lg'; dropdownClass?: string; placeholder?: string; change?: (event: Event) => void; + onclick?: (event: MouseEvent & { currentTarget: EventTarget & HTMLDivElement }) => void; } -export { Select, select, type SelectProps, type SelectOptionType, type MultiSelectProps }; +export { Select, select, multiSelect, type SelectProps, type SelectOptionType, type MultiSelectProps }; diff --git a/src/lib/forms/select/theme.ts b/src/lib/forms/select/theme.ts index a987f3f0..b5369000 100644 --- a/src/lib/forms/select/theme.ts +++ b/src/lib/forms/select/theme.ts @@ -18,3 +18,16 @@ export const select = tv({ size: 'md' } }); + +export const multiSelect = tv({ + variants: { + size: { + sm: 'px-2 py-1 min-h-[2.4rem]', + md: 'px-3 py-1 min-h-[2.7rem]', + lg: 'px-4 py-2 min-h-[3.2rem]' + } + }, + defaultVariants: { + size: 'md' + } +}); From 9cd83157f9eba875dbd9be781f2b80d9b623d0cb Mon Sep 17 00:00:00 2001 From: aarondoet <42084688+aarondoet@users.noreply.github.com> Date: Wed, 4 Sep 2024 01:03:35 +0000 Subject: [PATCH 04/11] Fix MultiSelect types --- src/lib/forms/select/MultiSelect.svelte | 10 +++++----- src/lib/forms/select/index.ts | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/lib/forms/select/MultiSelect.svelte b/src/lib/forms/select/MultiSelect.svelte index 211b9aed..04e41fbc 100644 --- a/src/lib/forms/select/MultiSelect.svelte +++ b/src/lib/forms/select/MultiSelect.svelte @@ -1,11 +1,11 @@ - + + + {#snippet badge({ item, clear })} + + {item.name} + + {/snippet} + \ No newline at end of file diff --git a/src/routes/forms/select/md/setup.md b/src/routes/forms/select/md/setup.md index 92284d8c..19b06755 100644 --- a/src/routes/forms/select/md/setup.md +++ b/src/routes/forms/select/md/setup.md @@ -1,6 +1,6 @@ + \ No newline at end of file diff --git a/src/routes/forms/select/md/disabled-multiselect.md b/src/routes/forms/select/md/disabled-multiselect.md new file mode 100644 index 00000000..a6312377 --- /dev/null +++ b/src/routes/forms/select/md/disabled-multiselect.md @@ -0,0 +1,12 @@ + + \ No newline at end of file diff --git a/src/routes/forms/select/md/disabled-options-multiselect.md b/src/routes/forms/select/md/disabled-options-multiselect.md new file mode 100644 index 00000000..bae1bd11 --- /dev/null +++ b/src/routes/forms/select/md/disabled-options-multiselect.md @@ -0,0 +1,10 @@ + + \ No newline at end of file diff --git a/src/routes/forms/select/md/multiselect-preselect.md b/src/routes/forms/select/md/multiselect-preselect.md new file mode 100644 index 00000000..135554c3 --- /dev/null +++ b/src/routes/forms/select/md/multiselect-preselect.md @@ -0,0 +1,14 @@ + + \ No newline at end of file From 981aabd13b4ea52c84d4cd9408c9b649a462cc7b Mon Sep 17 00:00:00 2001 From: aarondoet <42084688+aarondoet@users.noreply.github.com> Date: Wed, 4 Sep 2024 01:59:17 +0000 Subject: [PATCH 08/11] Add disabled property to Select items --- src/lib/forms/select/Select.svelte | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/forms/select/Select.svelte b/src/lib/forms/select/Select.svelte index 3cf7dd05..06a617ef 100644 --- a/src/lib/forms/select/Select.svelte +++ b/src/lib/forms/select/Select.svelte @@ -12,8 +12,8 @@ {/if} {#if items} - {#each items as { value, name }} - + {#each items as { value, name, disabled }} + {/each} {/if} From e8cda77d64c1f0df2b6fe0c75cd723b1275cbbea Mon Sep 17 00:00:00 2001 From: aarondoet <42084688+aarondoet@users.noreply.github.com> Date: Wed, 4 Sep 2024 02:08:28 +0000 Subject: [PATCH 09/11] Remove over-restrictive typing --- src/lib/forms/select/MultiSelect.svelte | 6 +++--- src/lib/forms/select/Select.svelte | 2 +- src/lib/forms/select/index.ts | 4 ++-- src/routes/forms/select/+page.svelte | 10 +++++----- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/lib/forms/select/MultiSelect.svelte b/src/lib/forms/select/MultiSelect.svelte index bde343fc..fb71f527 100644 --- a/src/lib/forms/select/MultiSelect.svelte +++ b/src/lib/forms/select/MultiSelect.svelte @@ -1,4 +1,4 @@ -