@xy-planning-network/trees 0.11.6-dev-1 → 0.11.6-dev-2
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.
package/package.json
CHANGED
|
@@ -46,6 +46,10 @@ const loadAndRender = (): void => {
|
|
|
46
46
|
q: query.value,
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
+
if (!selectionsPersisted.value) {
|
|
50
|
+
clearSelections()
|
|
51
|
+
}
|
|
52
|
+
|
|
49
53
|
BaseAPI.get<TrailsRespPaged<unknown>>(
|
|
50
54
|
props.tableOptions.url,
|
|
51
55
|
{ skipLoader: false },
|
|
@@ -137,7 +141,11 @@ const hasContent = computed((): boolean => {
|
|
|
137
141
|
return rows.value.length ? true : false
|
|
138
142
|
})
|
|
139
143
|
|
|
140
|
-
const
|
|
144
|
+
const selectionsPersisted = computed(() => {
|
|
145
|
+
return props.tableBulkActions.persistent ?? false
|
|
146
|
+
})
|
|
147
|
+
|
|
148
|
+
const clearSelections = () => {
|
|
141
149
|
selected.value = []
|
|
142
150
|
}
|
|
143
151
|
|
|
@@ -152,6 +160,12 @@ const selectedData = computed<TableRowData[]>(() => {
|
|
|
152
160
|
})
|
|
153
161
|
})
|
|
154
162
|
|
|
163
|
+
const selectedOnPage = computed(() => {
|
|
164
|
+
return selected.value.filter((id) => {
|
|
165
|
+
return selectableIds.value.includes(id)
|
|
166
|
+
}).length
|
|
167
|
+
})
|
|
168
|
+
|
|
155
169
|
const bulkActions = computed(() => {
|
|
156
170
|
return props.tableBulkActions.actions
|
|
157
171
|
.filter((action) => {
|
|
@@ -189,8 +203,47 @@ const selectableIds = computed(() => {
|
|
|
189
203
|
.map((d) => d["id"])
|
|
190
204
|
})
|
|
191
205
|
|
|
206
|
+
const bulkSelectChecked = computed(
|
|
207
|
+
() =>
|
|
208
|
+
selected.value.length > 0 &&
|
|
209
|
+
selected.value.length === selectableIds.value.length
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
const bulkSelectIndeterminate = computed(
|
|
213
|
+
() =>
|
|
214
|
+
selected.value.length > 0 &&
|
|
215
|
+
selected.value.length < selectableIds.value.length
|
|
216
|
+
)
|
|
217
|
+
|
|
218
|
+
const bulkSelectOnChange = (e: Event) => {
|
|
219
|
+
const isChecked = (e.target as HTMLInputElement).checked
|
|
220
|
+
|
|
221
|
+
// append all records on current page to existing selection
|
|
222
|
+
if (selectionsPersisted.value && isChecked) {
|
|
223
|
+
selected.value = [...selected.value, ...selectableIds.value.map((id) => id)]
|
|
224
|
+
return
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// remove all records on current page from existing selection
|
|
228
|
+
if (selectionsPersisted.value && !isChecked) {
|
|
229
|
+
selected.value = selected.value.filter((id) => {
|
|
230
|
+
return !selectableIds.value.includes(id)
|
|
231
|
+
})
|
|
232
|
+
|
|
233
|
+
return
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// set all records on current page to selection
|
|
237
|
+
if (isChecked) {
|
|
238
|
+
selected.value = selectableIds.value.map((id) => id)
|
|
239
|
+
return
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
clearSelections()
|
|
243
|
+
}
|
|
244
|
+
|
|
192
245
|
const publicMethods: DynamicTableAPI = {
|
|
193
|
-
|
|
246
|
+
clearSelection: clearSelections,
|
|
194
247
|
refresh: loadAndRender,
|
|
195
248
|
reset: reloadTable,
|
|
196
249
|
}
|
|
@@ -302,16 +355,10 @@ loadAndRender()
|
|
|
302
355
|
'checked:disabled:bg-xy-blue checked:disabled:border-xy-blue checked:disabled:opacity-50',
|
|
303
356
|
'border-gray-300 focus:ring-xy-blue-500',
|
|
304
357
|
]"
|
|
305
|
-
:checked="
|
|
306
|
-
:indeterminate="
|
|
307
|
-
selected.length > 0 && selected.length < selectableIds.length
|
|
308
|
-
"
|
|
358
|
+
:checked="bulkSelectChecked"
|
|
359
|
+
:indeterminate="bulkSelectIndeterminate"
|
|
309
360
|
type="checkbox"
|
|
310
|
-
@change="
|
|
311
|
-
selected = ($event.target as HTMLInputElement).checked
|
|
312
|
-
? selectableIds.map((id) => id)
|
|
313
|
-
: []
|
|
314
|
-
"
|
|
361
|
+
@change="bulkSelectOnChange"
|
|
315
362
|
/>
|
|
316
363
|
</th>
|
|
317
364
|
|
|
@@ -382,10 +429,14 @@ loadAndRender()
|
|
|
382
429
|
/>
|
|
383
430
|
</tr>
|
|
384
431
|
|
|
385
|
-
<tr v-if="selected.length > 0">
|
|
432
|
+
<tr v-if="hasBulkActions && selected.length > 0">
|
|
386
433
|
<td colspan="100%" class="px-6 py-3 border-t bg-neutral-50">
|
|
387
434
|
<div class="flex items-center space-x-3">
|
|
388
|
-
<div class="text-sm font-semibold">
|
|
435
|
+
<div v-if="selectionsPersisted" class="text-sm font-semibold">
|
|
436
|
+
Selected: {{ selectedOnPage }} ({{ selected.length }} total)
|
|
437
|
+
</div>
|
|
438
|
+
|
|
439
|
+
<div v-else class="text-sm font-semibold">
|
|
389
440
|
{{ selected.length }}
|
|
390
441
|
selected
|
|
391
442
|
</div>
|
|
@@ -11,7 +11,7 @@ export interface DynamicTableOptions {
|
|
|
11
11
|
url: string;
|
|
12
12
|
}
|
|
13
13
|
export interface DynamicTableAPI {
|
|
14
|
-
|
|
14
|
+
clearSelection: () => void;
|
|
15
15
|
/**
|
|
16
16
|
* Force refresh the table data with the current api params state
|
|
17
17
|
* @returns void
|
|
@@ -69,6 +69,7 @@ export interface TableBulkActions<T extends TableRowData = TableRowData> {
|
|
|
69
69
|
* an array of TableActionItem definitions
|
|
70
70
|
*/
|
|
71
71
|
actions: TableBulkActionItem<T>[];
|
|
72
|
+
persistent?: boolean;
|
|
72
73
|
isSelectable?: (data: T) => boolean;
|
|
73
74
|
}
|
|
74
75
|
export interface TableColumn<T = TableRowData> {
|
|
@@ -9,7 +9,7 @@ type __VLS_PublicProps = {
|
|
|
9
9
|
"selected"?: number[];
|
|
10
10
|
} & __VLS_Props;
|
|
11
11
|
declare const _default: import("vue").DefineComponent<__VLS_PublicProps, {
|
|
12
|
-
|
|
12
|
+
clearSelection: () => void;
|
|
13
13
|
refresh: () => void;
|
|
14
14
|
reset: () => void;
|
|
15
15
|
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|