Skip to content

Commit da7669b

Browse files
committed
Bugfix multirow delete
1 parent e0b9e08 commit da7669b

File tree

2 files changed

+12440
-12463
lines changed

2 files changed

+12440
-12463
lines changed

interface/src/lib/components/moonbase/MultiRow.svelte

Lines changed: 23 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@
6363
for (let i = 0; i < definition.length; i++) {
6464
let property = definition[i];
6565
if (property.name == propertyName) {
66-
console.log('addItem def', propertyName, property);
66+
console.log('addItem def', propertyName);
6767
for (let i = 0; i < property.n.length; i++) {
6868
let propertyN = property.n[i];
6969
// console.log("propertyN", propertyN)
@@ -73,57 +73,40 @@
7373
}
7474
}
7575
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);
7978
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
8483
onChange,
8584
changeOnInput
8685
});
8786
}
8887
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);
9491
onChange();
9592
}
9693
9794
// Filter items based on filter query - returns array of {item, originalIndex}
9895
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();
10599
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 }));
119102
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 }))
122106
.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) => {
124108
let valueStr;
125109
126-
// Check dropdown - only check the SELECTED option's label, not all options
127110
if (
128111
propertyN.values &&
129112
Array.isArray(propertyN.values) &&
@@ -137,11 +120,8 @@
137120
return String(valueStr).toLowerCase().includes(query);
138121
});
139122
140-
// If negated (!), return items that DON'T match
141123
return isNegated ? !matchFound : matchFound;
142124
});
143-
144-
return filtered;
145125
});
146126
147127
const findItemInDefinition = $derived(definition.find((obj: any) => obj.name === property.name));
@@ -199,7 +179,7 @@
199179

200180
<div class="overflow-x-auto space-y-1" transition:slide|local={{ duration: 300, easing: cubicOut }}>
201181
<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 })}
203183
<!-- svelte-ignore a11y_click_events_have_key_events -->
204184
<div class="rounded-box bg-base-100 flex items-center space-x-3 px-4 py-2">
205185
<Grip class="h-6 w-6 text-base-content/30 cursor-grab flex-shrink-0" />
@@ -208,7 +188,7 @@
208188
{#if propertyN.type != 'array' && propertyN.type != 'controls' && propertyN.type != 'password'}
209189
<MultiInput
210190
property={propertyN}
211-
bind:value={data[property.name][itemWrapper.originalIndex][propertyN.name]}
191+
bind:value={itemWrapper.item[propertyN.name]}
212192
noPrompts={true}
213193
onChange={(event) => {
214194
onChange(event);
@@ -232,15 +212,15 @@
232212
<button
233213
class="btn btn-ghost btn-sm"
234214
onclick={() => {
235-
handleEdit(property.name, itemWrapper.originalIndex);
215+
handleEdit(property.name, itemWrapper.item);
236216
}}
237217
>
238218
<SearchIcon class="h-6 w-6" /></button
239219
>
240220
<button
241221
class="btn btn-ghost btn-sm"
242222
onclick={() => {
243-
deleteItem(property.name, itemWrapper.originalIndex);
223+
deleteItem(property.name, itemWrapper.item);
244224
}}
245225
>
246226
<Delete class="text-error h-6 w-6" />

0 commit comments

Comments
 (0)