@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
- hasItemsCheckbox,
37
- hasPrimitiveItemsData,
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
- itemSubtitleClassName,
54
- itemSubtitleFieldName,
55
- itemTitleClassName,
56
- itemTitleFieldName,
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 itemsIdentityMap = {};
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 [id2];
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.title = item;
123
- res[idFieldSymbol] = item;
124
- res[searchFieldSymbol] = ("" + item).toLowerCase().trim();
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.isChecked = false;
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[searchFieldSymbol].indexOf(searchText) >= 0;
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 handleItemSelected(ev, item, index) {
229
- let id2 = item[idFieldSymbol];
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={hasItemsCheckbox}
343
+ {hasCheckbox}
362
344
  className=" {itemClassName}"
363
- titleClassName=" {itemTitleClassName}"
364
- subtitleClassName=" {itemSubtitleClassName}"
365
- onClick={(ev) => handleItemSelected(ev, item, index)}
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
- hasItemsCheckbox?: boolean;
25
- hasPrimitiveItemsData?: boolean;
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
- itemSubtitleClassName?: string;
39
- itemSubtitleFieldName?: string;
40
- itemTitleClassName?: string;
41
- itemTitleFieldName?: string;
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';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cloudparker/moldex.js",
3
- "version": "0.0.72",
3
+ "version": "0.0.74",
4
4
  "author": "cloudparker.com",
5
5
  "license": "MIT",
6
6
  "keywords": [