@cloudparker/moldex.js 0.0.73 → 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,11 +33,11 @@ let {
33
33
  hasDropdownFooterCreateButton,
34
34
  hasDropdownHeader,
35
35
  hasDropdownHeaderSearch,
36
- hasItemsCheckbox,
37
- iconPathClassName,
36
+ hasCheckbox,
37
+ iconClassName,
38
38
  iconPathFieldName,
39
39
  id,
40
- identityFieldName,
40
+ identityFieldName = "_id",
41
41
  itemClassName,
42
42
  items,
43
43
  multiple,
@@ -45,23 +45,34 @@ let {
45
45
  onCreateButtonClick,
46
46
  onSearch,
47
47
  searchClassName,
48
- searchFieldName,
48
+ searchFieldName = "name",
49
49
  searchPlaceholder = "Search...",
50
50
  showChip,
51
51
  size,
52
- itemSubtitleClassName,
53
- itemSubtitleFieldName,
54
- itemTitleClassName,
55
- itemTitleFieldName,
52
+ subtitleClassName,
53
+ subtitleFieldName,
54
+ titleClassName,
55
+ titleFieldName = "name",
56
56
  value = $bindable(),
57
57
  ...props
58
58
  } = $props();
59
- let idFieldSymbol = Symbol("_id");
60
- let searchFieldSymbol = Symbol("_search");
61
59
  let searchFieldRef = $state(null);
62
- let comboboxIconSizeClassName = $state("");
63
60
  let isPlaced = $state(false);
64
61
  let searchText = $state("");
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
+ });
65
76
  let hasPrimitiveItemsData = $derived.by(() => {
66
77
  if (items) {
67
78
  let firstItem = items[0];
@@ -69,7 +80,6 @@ let hasPrimitiveItemsData = $derived.by(() => {
69
80
  }
70
81
  return false;
71
82
  });
72
- let itemsIdentityMap = {};
73
83
  let _value = $derived.by(() => {
74
84
  return selectedItemsSet?.size ? " " : "";
75
85
  });
@@ -77,7 +87,7 @@ let displayItems = $derived.by(() => {
77
87
  let array = Array.from(selectedItemsSet);
78
88
  let results = array.map((id2) => {
79
89
  if (hasPrimitiveItemsData) {
80
- return [id2];
90
+ return id2;
81
91
  } else {
82
92
  let item = itemsIdentityMap[id2];
83
93
  if (item) {
@@ -125,65 +135,30 @@ let preparedItems = $derived.by(() => {
125
135
  return (items || []).map((item, index) => {
126
136
  let res = {};
127
137
  if (hasPrimitiveItemsData) {
128
- res.title = item;
129
- res[idFieldSymbol] = item;
130
- res[searchFieldSymbol] = ("" + item).toLowerCase().trim();
131
- } else {
132
- if (identityFieldName && item.hasOwnProperty(identityFieldName)) {
133
- res[idFieldSymbol] = item[identityFieldName];
134
- } else {
135
- res[idFieldSymbol] = index;
136
- }
137
- itemsIdentityMap[res[idFieldSymbol]] = item;
138
- if (itemTitleFieldName && item.hasOwnProperty(itemTitleFieldName)) {
139
- res.title = item[itemTitleFieldName];
140
- }
141
- if (itemSubtitleFieldName && item.hasOwnProperty(itemSubtitleFieldName)) {
142
- res.subtitle = item[itemSubtitleFieldName];
143
- }
144
- if (searchFieldName) {
145
- if (item.hasOwnProperty(searchFieldName)) {
146
- res[searchFieldSymbol] = (item[searchFieldName] || "").toLowerCase().trim();
147
- }
148
- } else {
149
- res[searchFieldSymbol] = `${item.title || ""} ${item.subtitle || ""}`;
150
- }
151
- }
152
- if (selectedItemsSet.has(res[idFieldSymbol])) {
153
- res.isChecked = true;
138
+ res[identityFieldName] = item;
139
+ res[titleFieldName] = item;
140
+ res[searchFieldName] = item;
154
141
  } else {
155
- res.isChecked = false;
142
+ res = item;
156
143
  }
157
144
  return res;
158
145
  });
159
146
  });
147
+ let itemsIdentityMap = $derived.by(() => {
148
+ return preparedItems.reduce((acc, val) => {
149
+ acc[val[identityFieldName]] = val;
150
+ return acc;
151
+ }, {});
152
+ });
160
153
  let filteredItems = $derived.by(() => {
161
154
  if (searchText) {
162
155
  return preparedItems.filter((item) => {
163
- return item[searchFieldSymbol].indexOf(searchText) >= 0;
156
+ return (item[searchFieldName] || "").toLowerCase().indexOf(searchText) >= 0;
164
157
  });
165
158
  } else {
166
159
  return [...preparedItems];
167
160
  }
168
161
  });
169
- $effect(() => {
170
- if (size) {
171
- switch (size) {
172
- case "lg":
173
- comboboxIconSizeClassName = "!h-7 !w-7";
174
- break;
175
- case "md":
176
- comboboxIconSizeClassName = "!h-6 !w-6";
177
- break;
178
- case "sm":
179
- comboboxIconSizeClassName = "!h-5 !w-5";
180
- break;
181
- case "xs":
182
- comboboxIconSizeClassName = "!h-4 !w-4";
183
- break;
184
- }
185
- }
186
- });
187
162
  let inputFieldRef = $state(null);
188
163
  export function focus() {
189
164
  inputFieldRef?.focus();
@@ -231,8 +206,8 @@ function handleDropdownKeyDown(event) {
231
206
  function handleSearch(value2) {
232
207
  searchText = value2;
233
208
  }
234
- function handleItemSelected(ev, item, index) {
235
- let id2 = item[idFieldSymbol];
209
+ function handleItemClick(ev, item, index) {
210
+ let id2 = item[identityFieldName];
236
211
  if (multiple) {
237
212
  if (selectedItemsSet.has(id2)) {
238
213
  selectedItemsSet.delete(id2);
@@ -362,14 +337,14 @@ function handleItemSelected(ev, item, index) {
362
337
  aria-selected={item.isChecked}
363
338
  >
364
339
  <ButtonListItem
365
- title={item.title}
366
- subtitle={item.subtitle}
340
+ title={item[titleFieldName] || ''}
341
+ subtitle={item[subtitleFieldName || ''] || ''}
367
342
  {index}
368
- hasCheckbox={hasItemsCheckbox}
343
+ {hasCheckbox}
369
344
  className=" {itemClassName}"
370
- titleClassName=" {itemTitleClassName}"
371
- subtitleClassName=" {itemSubtitleClassName}"
372
- onClick={(ev) => handleItemSelected(ev, item, index)}
345
+ titleClassName=" {titleClassName}"
346
+ subtitleClassName=" {subtitleClassName}"
347
+ onClick={(ev) => handleItemClick(ev, item, index)}
373
348
  />
374
349
  </li>
375
350
  {/each}
@@ -21,8 +21,8 @@ export type ComboboxFieldProps = {
21
21
  hasDropdownFooterCreateButton?: boolean;
22
22
  hasDropdownHeader?: boolean;
23
23
  hasDropdownHeaderSearch?: boolean;
24
- hasItemsCheckbox?: boolean;
25
- iconPathClassName?: string;
24
+ hasCheckbox?: boolean;
25
+ iconClassName?: string;
26
26
  iconPathFieldName?: string;
27
27
  identityFieldName?: string;
28
28
  itemClassName?: string;
@@ -34,10 +34,10 @@ export type ComboboxFieldProps = {
34
34
  searchFieldName?: string;
35
35
  searchPlaceholder?: string;
36
36
  showChip?: boolean;
37
- itemSubtitleClassName?: string;
38
- itemSubtitleFieldName?: string;
39
- itemTitleClassName?: string;
40
- itemTitleFieldName?: string;
37
+ subtitleClassName?: string;
38
+ subtitleFieldName?: string;
39
+ titleClassName?: string;
40
+ titleFieldName?: string;
41
41
  };
42
42
  import type { Snippet } from 'svelte';
43
43
  import { type InputFieldProps } from '../input-field/input-field.svelte';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cloudparker/moldex.js",
3
- "version": "0.0.73",
3
+ "version": "0.0.74",
4
4
  "author": "cloudparker.com",
5
5
  "license": "MIT",
6
6
  "keywords": [