@cloudparker/moldex.js 0.0.72 → 0.0.74
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -17,7 +17,7 @@ let {
|
|
|
17
17
|
createButtonClassName,
|
|
18
18
|
createButtonLabel = "Add",
|
|
19
19
|
displayClassName,
|
|
20
|
-
displayFieldName,
|
|
20
|
+
displayFieldName = "name",
|
|
21
21
|
displayItemsCount,
|
|
22
22
|
dropdownBodyClassName,
|
|
23
23
|
dropdownBodySnippet,
|
|
@@ -33,12 +33,11 @@ let {
|
|
|
33
33
|
hasDropdownFooterCreateButton,
|
|
34
34
|
hasDropdownHeader,
|
|
35
35
|
hasDropdownHeaderSearch,
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
iconPathClassName,
|
|
36
|
+
hasCheckbox,
|
|
37
|
+
iconClassName,
|
|
39
38
|
iconPathFieldName,
|
|
40
39
|
id,
|
|
41
|
-
identityFieldName,
|
|
40
|
+
identityFieldName = "_id",
|
|
42
41
|
itemClassName,
|
|
43
42
|
items,
|
|
44
43
|
multiple,
|
|
@@ -46,24 +45,41 @@ let {
|
|
|
46
45
|
onCreateButtonClick,
|
|
47
46
|
onSearch,
|
|
48
47
|
searchClassName,
|
|
49
|
-
searchFieldName,
|
|
48
|
+
searchFieldName = "name",
|
|
50
49
|
searchPlaceholder = "Search...",
|
|
51
50
|
showChip,
|
|
52
51
|
size,
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
52
|
+
subtitleClassName,
|
|
53
|
+
subtitleFieldName,
|
|
54
|
+
titleClassName,
|
|
55
|
+
titleFieldName = "name",
|
|
57
56
|
value = $bindable(),
|
|
58
57
|
...props
|
|
59
58
|
} = $props();
|
|
60
|
-
let idFieldSymbol = Symbol("_id");
|
|
61
|
-
let searchFieldSymbol = Symbol("_search");
|
|
62
59
|
let searchFieldRef = $state(null);
|
|
63
|
-
let comboboxIconSizeClassName = $state("");
|
|
64
60
|
let isPlaced = $state(false);
|
|
65
61
|
let searchText = $state("");
|
|
66
|
-
let
|
|
62
|
+
let comboboxIconSizeClassName = $derived.by(() => {
|
|
63
|
+
if (size) {
|
|
64
|
+
switch (size) {
|
|
65
|
+
case "lg":
|
|
66
|
+
return "!h-7 !w-7";
|
|
67
|
+
case "md":
|
|
68
|
+
return "!h-6 !w-6";
|
|
69
|
+
case "sm":
|
|
70
|
+
return "!h-5 !w-5";
|
|
71
|
+
case "xs":
|
|
72
|
+
return "!h-4 !w-4";
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
let hasPrimitiveItemsData = $derived.by(() => {
|
|
77
|
+
if (items) {
|
|
78
|
+
let firstItem = items[0];
|
|
79
|
+
return typeof firstItem == "string" || typeof firstItem == "number" || firstItem instanceof Date;
|
|
80
|
+
}
|
|
81
|
+
return false;
|
|
82
|
+
});
|
|
67
83
|
let _value = $derived.by(() => {
|
|
68
84
|
return selectedItemsSet?.size ? " " : "";
|
|
69
85
|
});
|
|
@@ -71,7 +87,7 @@ let displayItems = $derived.by(() => {
|
|
|
71
87
|
let array = Array.from(selectedItemsSet);
|
|
72
88
|
let results = array.map((id2) => {
|
|
73
89
|
if (hasPrimitiveItemsData) {
|
|
74
|
-
return
|
|
90
|
+
return id2;
|
|
75
91
|
} else {
|
|
76
92
|
let item = itemsIdentityMap[id2];
|
|
77
93
|
if (item) {
|
|
@@ -119,65 +135,30 @@ let preparedItems = $derived.by(() => {
|
|
|
119
135
|
return (items || []).map((item, index) => {
|
|
120
136
|
let res = {};
|
|
121
137
|
if (hasPrimitiveItemsData) {
|
|
122
|
-
res
|
|
123
|
-
res[
|
|
124
|
-
res[
|
|
125
|
-
} else {
|
|
126
|
-
if (identityFieldName && item.hasOwnProperty(identityFieldName)) {
|
|
127
|
-
res[idFieldSymbol] = item[identityFieldName];
|
|
128
|
-
} else {
|
|
129
|
-
res[idFieldSymbol] = index;
|
|
130
|
-
}
|
|
131
|
-
itemsIdentityMap[res[idFieldSymbol]] = item;
|
|
132
|
-
if (itemTitleFieldName && item.hasOwnProperty(itemTitleFieldName)) {
|
|
133
|
-
res.title = item[itemTitleFieldName];
|
|
134
|
-
}
|
|
135
|
-
if (itemSubtitleFieldName && item.hasOwnProperty(itemSubtitleFieldName)) {
|
|
136
|
-
res.subtitle = item[itemSubtitleFieldName];
|
|
137
|
-
}
|
|
138
|
-
if (searchFieldName) {
|
|
139
|
-
if (item.hasOwnProperty(searchFieldName)) {
|
|
140
|
-
res[searchFieldSymbol] = (item[searchFieldName] || "").toLowerCase().trim();
|
|
141
|
-
}
|
|
142
|
-
} else {
|
|
143
|
-
res[searchFieldSymbol] = `${item.title || ""} ${item.subtitle || ""}`;
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
if (selectedItemsSet.has(res[idFieldSymbol])) {
|
|
147
|
-
res.isChecked = true;
|
|
138
|
+
res[identityFieldName] = item;
|
|
139
|
+
res[titleFieldName] = item;
|
|
140
|
+
res[searchFieldName] = item;
|
|
148
141
|
} else {
|
|
149
|
-
res
|
|
142
|
+
res = item;
|
|
150
143
|
}
|
|
151
144
|
return res;
|
|
152
145
|
});
|
|
153
146
|
});
|
|
147
|
+
let itemsIdentityMap = $derived.by(() => {
|
|
148
|
+
return preparedItems.reduce((acc, val) => {
|
|
149
|
+
acc[val[identityFieldName]] = val;
|
|
150
|
+
return acc;
|
|
151
|
+
}, {});
|
|
152
|
+
});
|
|
154
153
|
let filteredItems = $derived.by(() => {
|
|
155
154
|
if (searchText) {
|
|
156
155
|
return preparedItems.filter((item) => {
|
|
157
|
-
return item[
|
|
156
|
+
return (item[searchFieldName] || "").toLowerCase().indexOf(searchText) >= 0;
|
|
158
157
|
});
|
|
159
158
|
} else {
|
|
160
159
|
return [...preparedItems];
|
|
161
160
|
}
|
|
162
161
|
});
|
|
163
|
-
$effect(() => {
|
|
164
|
-
if (size) {
|
|
165
|
-
switch (size) {
|
|
166
|
-
case "lg":
|
|
167
|
-
comboboxIconSizeClassName = "!h-7 !w-7";
|
|
168
|
-
break;
|
|
169
|
-
case "md":
|
|
170
|
-
comboboxIconSizeClassName = "!h-6 !w-6";
|
|
171
|
-
break;
|
|
172
|
-
case "sm":
|
|
173
|
-
comboboxIconSizeClassName = "!h-5 !w-5";
|
|
174
|
-
break;
|
|
175
|
-
case "xs":
|
|
176
|
-
comboboxIconSizeClassName = "!h-4 !w-4";
|
|
177
|
-
break;
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
});
|
|
181
162
|
let inputFieldRef = $state(null);
|
|
182
163
|
export function focus() {
|
|
183
164
|
inputFieldRef?.focus();
|
|
@@ -225,8 +206,8 @@ function handleDropdownKeyDown(event) {
|
|
|
225
206
|
function handleSearch(value2) {
|
|
226
207
|
searchText = value2;
|
|
227
208
|
}
|
|
228
|
-
function
|
|
229
|
-
let id2 = item[
|
|
209
|
+
function handleItemClick(ev, item, index) {
|
|
210
|
+
let id2 = item[identityFieldName];
|
|
230
211
|
if (multiple) {
|
|
231
212
|
if (selectedItemsSet.has(id2)) {
|
|
232
213
|
selectedItemsSet.delete(id2);
|
|
@@ -356,13 +337,14 @@ function handleItemSelected(ev, item, index) {
|
|
|
356
337
|
aria-selected={item.isChecked}
|
|
357
338
|
>
|
|
358
339
|
<ButtonListItem
|
|
359
|
-
{item}
|
|
340
|
+
title={item[titleFieldName] || ''}
|
|
341
|
+
subtitle={item[subtitleFieldName || ''] || ''}
|
|
360
342
|
{index}
|
|
361
|
-
hasCheckbox
|
|
343
|
+
{hasCheckbox}
|
|
362
344
|
className=" {itemClassName}"
|
|
363
|
-
titleClassName=" {
|
|
364
|
-
subtitleClassName=" {
|
|
365
|
-
onClick={(ev) =>
|
|
345
|
+
titleClassName=" {titleClassName}"
|
|
346
|
+
subtitleClassName=" {subtitleClassName}"
|
|
347
|
+
onClick={(ev) => handleItemClick(ev, item, index)}
|
|
366
348
|
/>
|
|
367
349
|
</li>
|
|
368
350
|
{/each}
|
|
@@ -21,9 +21,8 @@ export type ComboboxFieldProps = {
|
|
|
21
21
|
hasDropdownFooterCreateButton?: boolean;
|
|
22
22
|
hasDropdownHeader?: boolean;
|
|
23
23
|
hasDropdownHeaderSearch?: boolean;
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
iconPathClassName?: string;
|
|
24
|
+
hasCheckbox?: boolean;
|
|
25
|
+
iconClassName?: string;
|
|
27
26
|
iconPathFieldName?: string;
|
|
28
27
|
identityFieldName?: string;
|
|
29
28
|
itemClassName?: string;
|
|
@@ -35,10 +34,10 @@ export type ComboboxFieldProps = {
|
|
|
35
34
|
searchFieldName?: string;
|
|
36
35
|
searchPlaceholder?: string;
|
|
37
36
|
showChip?: boolean;
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
37
|
+
subtitleClassName?: string;
|
|
38
|
+
subtitleFieldName?: string;
|
|
39
|
+
titleClassName?: string;
|
|
40
|
+
titleFieldName?: string;
|
|
42
41
|
};
|
|
43
42
|
import type { Snippet } from 'svelte';
|
|
44
43
|
import { type InputFieldProps } from '../input-field/input-field.svelte';
|