@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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xy-planning-network/trees",
3
- "version": "0.11.6-dev-1",
3
+ "version": "0.11.6-dev-2",
4
4
  "description": "",
5
5
  "license": "MIT",
6
6
  "repository": "github:xy-planning-network/trees",
@@ -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 deselectAll = () => {
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
- deselectAll: deselectAll,
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="selected.length === selectableIds.length"
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
- deselectAll: () => void;
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
- deselectAll: () => void;
12
+ clearSelection: () => void;
13
13
  refresh: () => void;
14
14
  reset: () => void;
15
15
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {