Skip to content

Commit 22f26e4

Browse files
committed
[MultiSelect(Field|Menu)] Improve actions with mode="immediate"
1 parent 3b9774c commit 22f26e4

File tree

7 files changed

+93
-10
lines changed

7 files changed

+93
-10
lines changed

.changeset/silent-geckos-listen.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'svelte-ux': patch
3+
---
4+
5+
[MultiSelect(Field|Menu)] Improve actions with mode="immediate"

packages/svelte-ux/src/lib/components/MultiSelect.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@
268268
class={cls(
269269
'actions',
270270
'flex items-center justify-end',
271-
mode === 'actions' && 'border-t border-surface-content/10 pt-2',
271+
'[&:not(:has(>:first-child))]:hidden border-t border-surface-content/10 pt-2',
272272
settingsClasses.actions,
273273
classes.actions
274274
)}

packages/svelte-ux/src/lib/components/MultiSelectField.svelte

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
// MultiSelectMenu props
2323
export let options: MultiSelectMenuProps['options'];
2424
export let value: MultiSelectMenuProps['value'];
25+
export let mode: MultiSelectMenuProps['mode'] | undefined = undefined;
26+
export let maintainOrder: MultiSelectMenuProps['maintainOrder'] | undefined = undefined;
2527
export let indeterminateSelected: typeof value = [];
2628
/** Maximum number of options that can be selected */
2729
export let max: number | undefined = undefined;
@@ -203,6 +205,8 @@
203205
<MultiSelectMenu
204206
{options}
205207
{value}
208+
{mode}
209+
{maintainOrder}
206210
{indeterminateSelected}
207211
{max}
208212
{placement}
@@ -237,8 +241,6 @@
237241
</slot>
238242
</svelte:fragment>
239243

240-
<slot name="actions" slot="actions" let:selection {selection}>
241-
<div></div>
242-
</slot>
244+
<slot name="actions" slot="actions" let:selection {selection} />
243245
</MultiSelectMenu>
244246
</div>

packages/svelte-ux/src/lib/components/MultiSelectMenu.svelte

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
1414
export let options: MultiSelectProps['options'];
1515
export let value: MultiSelectProps['value'];
16+
export let mode: MultiSelectProps['mode'] | undefined = undefined;
17+
export let maintainOrder: MultiSelectProps['maintainOrder'] | undefined = undefined;
1618
export let indeterminateSelected: typeof value = [];
1719
export let open = false;
1820
export let duration = 200;
@@ -53,6 +55,8 @@
5355
<MultiSelect
5456
{options}
5557
{value}
58+
{mode}
59+
{maintainOrder}
5660
{indeterminateSelected}
5761
{max}
5862
{open}
@@ -69,9 +73,9 @@
6973
...settingsClasses.multiSelect,
7074
...classes.multiSelect,
7175
}}
72-
on:cancel={() => close()}
76+
on:cancel={() => mode !== 'immediate' && close()}
7377
on:cancel
74-
on:change={() => close()}
78+
on:change={() => mode !== 'immediate' && close()}
7579
on:change
7680
>
7781
<slot name="beforeOptions" slot="beforeOptions" let:selection {selection} />
@@ -95,8 +99,6 @@
9599
</slot>
96100
</svelte:fragment>
97101

98-
<slot name="actions" slot="actions" let:selection {selection}>
99-
<div></div>
100-
</slot>
102+
<slot name="actions" slot="actions" let:selection {selection} />
101103
</MultiSelect>
102104
</Menu>

packages/svelte-ux/src/routes/docs/components/MultiSelect/+page.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
<MultiSelect {options} {value} maintainOrder on:change={(e) => (value = e.detail.value)} />
4343
</Preview>
4444

45-
<h2>Immediate apply changes (no actions)</h2>
45+
<h2>Immediately apply changes (no actions)</h2>
4646

4747
<Preview>
4848
{value.length} selected

packages/svelte-ux/src/routes/docs/components/MultiSelectField/+page.svelte

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,34 @@
7979
/>
8080
</Preview>
8181

82+
<h2>Immediately apply changes (no actions)</h2>
83+
84+
<Preview>
85+
<MultiSelectField
86+
{options}
87+
{value}
88+
on:change={(e) => (value = e.detail.value)}
89+
mode="immediate"
90+
maintainOrder
91+
/>
92+
</Preview>
93+
94+
<h2>Immediately apply changes (with custom action)</h2>
95+
96+
<Preview>
97+
<MultiSelectField
98+
{options}
99+
{value}
100+
on:change={(e) => (value = e.detail.value)}
101+
mode="immediate"
102+
maintainOrder
103+
>
104+
<div slot="actions">
105+
<Button color="primary" icon={mdiPlus}>Add item</Button>
106+
</div>
107+
</MultiSelectField>
108+
</Preview>
109+
82110
<h2>formatSelected</h2>
83111

84112
<Preview>

packages/svelte-ux/src/routes/docs/components/MultiSelectMenu/+page.svelte

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,52 @@
129129
</span>
130130
</Preview>
131131

132+
<h2>Immediately apply changes (no actions)</h2>
133+
<Preview>
134+
<span>
135+
<ToggleButton let:on={open} let:toggleOff transition={false}>
136+
{value.length} selected
137+
<MultiSelectMenu
138+
{options}
139+
{value}
140+
mode="immediate"
141+
maintainOrder
142+
on:change={(e) => {
143+
// @ts-expect-error
144+
value = e.detail.value;
145+
}}
146+
{open}
147+
on:close={toggleOff}
148+
/>
149+
</ToggleButton>
150+
</span>
151+
</Preview>
152+
153+
<h2>Immediately apply changes (with custom action)</h2>
154+
<Preview>
155+
<span>
156+
<ToggleButton let:on={open} let:toggleOff transition={false}>
157+
{value.length} selected
158+
<MultiSelectMenu
159+
{options}
160+
{value}
161+
mode="immediate"
162+
maintainOrder
163+
on:change={(e) => {
164+
// @ts-expect-error
165+
value = e.detail.value;
166+
}}
167+
{open}
168+
on:close={toggleOff}
169+
>
170+
<div slot="actions">
171+
<Button color="primary" icon={mdiPlus}>Add item</Button>
172+
</div>
173+
</MultiSelectMenu>
174+
</ToggleButton>
175+
</span>
176+
</Preview>
177+
132178
<h2>actions slot</h2>
133179

134180
<Preview>

0 commit comments

Comments
 (0)