|
63 | 63 | for (let i = 0; i < definition.length; i++) { |
64 | 64 | let property = definition[i]; |
65 | 65 | if (property.name == propertyName) { |
66 | | - console.log('addItem def', propertyName, property); |
| 66 | + console.log('addItem def', propertyName); |
67 | 67 | for (let i = 0; i < property.n.length; i++) { |
68 | 68 | let propertyN = property.n[i]; |
69 | 69 | // console.log("propertyN", propertyN) |
|
73 | 73 | } |
74 | 74 | } |
75 | 75 |
|
76 | | - function handleEdit(propertyName: string, index: number) { |
77 | | - console.log('handleEdit', propertyName, index, data[propertyName][index]); |
78 | | -
|
| 76 | + function handleEdit(propertyName: string, itemToEdit: any) { |
| 77 | + console.log('handleEdit', propertyName); |
79 | 78 | modals.open(EditObject as any, { |
80 | | - property: property, |
81 | | - localDefinition: localDefinition, |
82 | | - title: initCap(propertyName) + ' #' + (index + 1), |
83 | | - dataEditable: data[propertyName][index], // By reference (bindable) |
| 79 | + property, |
| 80 | + localDefinition, |
| 81 | + title: initCap(propertyName), |
| 82 | + dataEditable: itemToEdit, // direct reference |
84 | 83 | onChange, |
85 | 84 | changeOnInput |
86 | 85 | }); |
87 | 86 | } |
88 | 87 |
|
89 | | - function deleteItem(propertyName: string, index: number) { |
90 | | - // Remove item from array |
91 | | - console.log(propertyName, index, data[propertyName]); |
92 | | - data[propertyName].splice(index, 1); |
93 | | - data[propertyName] = [...data[propertyName]]; //Trigger reactivity |
| 88 | + function deleteItem(propertyName: string, itemToDelete: any) { |
| 89 | + console.log('deleteItem', propertyName); |
| 90 | + data[propertyName] = data[propertyName].filter((item: any) => item !== itemToDelete); |
94 | 91 | onChange(); |
95 | 92 | } |
96 | 93 |
|
97 | 94 | // Filter items based on filter query - returns array of {item, originalIndex} |
98 | 95 | let filteredItems = $derived.by(() => { |
99 | | - if (!data[property.name + '_filter']) { |
100 | | - return data[property.name].map((item: any, index: number) => ({ |
101 | | - item, |
102 | | - originalIndex: index |
103 | | - })); |
104 | | - } |
| 96 | + const filterValue = data[property.name + '_filter']?.trim() || ''; |
| 97 | + const isNegated = filterValue.startsWith('!'); |
| 98 | + const query = (isNegated ? filterValue.slice(1) : filterValue).toLowerCase(); |
105 | 99 |
|
106 | | - const isNegated = data[property.name + '_filter'].startsWith('!'); |
107 | | - const query = ( |
108 | | - isNegated ? data[property.name + '_filter'].slice(1) : data[property.name + '_filter'] |
109 | | - ) |
110 | | - .toLowerCase() |
111 | | - .trim(); |
112 | | -
|
113 | | - if (!query) { |
114 | | - return data[property.name].map((item: any, index: number) => ({ |
115 | | - item, |
116 | | - originalIndex: index |
117 | | - })); |
118 | | - } |
| 100 | + // No filter or empty query → return items directly |
| 101 | + if (!query) return data[property.name].map((item:any) => ({ item })); |
119 | 102 |
|
120 | | - const filtered = data[property.name] |
121 | | - .map((item: any, index: number) => ({ item, originalIndex: index })) |
| 103 | + // Filtered items |
| 104 | + return data[property.name] |
| 105 | + .map((item:any) => ({ item })) |
122 | 106 | .filter(({ item }: { item: any }) => { |
123 | | - const matchFound = property.n.slice(0, 3).some((propertyN: any) => { |
| 107 | + const matchFound = property.n.slice(0, 3).some((propertyN:any) => { |
124 | 108 | let valueStr; |
125 | 109 |
|
126 | | - // Check dropdown - only check the SELECTED option's label, not all options |
127 | 110 | if ( |
128 | 111 | propertyN.values && |
129 | 112 | Array.isArray(propertyN.values) && |
|
137 | 120 | return String(valueStr).toLowerCase().includes(query); |
138 | 121 | }); |
139 | 122 |
|
140 | | - // If negated (!), return items that DON'T match |
141 | 123 | return isNegated ? !matchFound : matchFound; |
142 | 124 | }); |
143 | | -
|
144 | | - return filtered; |
145 | 125 | }); |
146 | 126 |
|
147 | 127 | const findItemInDefinition = $derived(definition.find((obj: any) => obj.name === property.name)); |
|
199 | 179 |
|
200 | 180 | <div class="overflow-x-auto space-y-1" transition:slide|local={{ duration: 300, easing: cubicOut }}> |
201 | 181 | <DraggableList items={filteredItems} onReorder={handleReorder} class="space-y-2"> |
202 | | - {#snippet children({ item: itemWrapper, index }: { item: any; index: number })} |
| 182 | + {#snippet children({ item: itemWrapper }: { item: any })} |
203 | 183 | <!-- svelte-ignore a11y_click_events_have_key_events --> |
204 | 184 | <div class="rounded-box bg-base-100 flex items-center space-x-3 px-4 py-2"> |
205 | 185 | <Grip class="h-6 w-6 text-base-content/30 cursor-grab flex-shrink-0" /> |
|
208 | 188 | {#if propertyN.type != 'array' && propertyN.type != 'controls' && propertyN.type != 'password'} |
209 | 189 | <MultiInput |
210 | 190 | property={propertyN} |
211 | | - bind:value={data[property.name][itemWrapper.originalIndex][propertyN.name]} |
| 191 | + bind:value={itemWrapper.item[propertyN.name]} |
212 | 192 | noPrompts={true} |
213 | 193 | onChange={(event) => { |
214 | 194 | onChange(event); |
|
232 | 212 | <button |
233 | 213 | class="btn btn-ghost btn-sm" |
234 | 214 | onclick={() => { |
235 | | - handleEdit(property.name, itemWrapper.originalIndex); |
| 215 | + handleEdit(property.name, itemWrapper.item); |
236 | 216 | }} |
237 | 217 | > |
238 | 218 | <SearchIcon class="h-6 w-6" /></button |
239 | 219 | > |
240 | 220 | <button |
241 | 221 | class="btn btn-ghost btn-sm" |
242 | 222 | onclick={() => { |
243 | | - deleteItem(property.name, itemWrapper.originalIndex); |
| 223 | + deleteItem(property.name, itemWrapper.item); |
244 | 224 | }} |
245 | 225 | > |
246 | 226 | <Delete class="text-error h-6 w-6" /> |
|
0 commit comments