From 8895b7b1f6f1662263bfcd030e84fcf5aa89a409 Mon Sep 17 00:00:00 2001 From: "David W. Gray" Date: Sat, 5 Apr 2025 11:34:52 -0700 Subject: [PATCH 1/2] fix(BTable): correct multi-sort to not update sortby in place --- .../docs/components/demo/TableProvider.vue | 189 ++++++++++++++++++ apps/docs/src/docs/components/table.md | 8 + .../src/components/BTable/BTable.vue | 11 +- 3 files changed, 203 insertions(+), 5 deletions(-) create mode 100644 apps/docs/src/docs/components/demo/TableProvider.vue diff --git a/apps/docs/src/docs/components/demo/TableProvider.vue b/apps/docs/src/docs/components/demo/TableProvider.vue new file mode 100644 index 000000000..ae7d97f1e --- /dev/null +++ b/apps/docs/src/docs/components/demo/TableProvider.vue @@ -0,0 +1,189 @@ + + + diff --git a/apps/docs/src/docs/components/table.md b/apps/docs/src/docs/components/table.md index df53cce18..f2658c35f 100644 --- a/apps/docs/src/docs/components/table.md +++ b/apps/docs/src/docs/components/table.md @@ -822,6 +822,14 @@ To Be Completed To Be Completed +Below is a trimmed down version of the [complete example](#complete-example) as a starting place for using provider functions until +docs for the provider function are completed. It uses a local provider function that implements +sorting and filtering. Note that sorting is done in cooperation with `` by having the +provider function react to the `context.sortBy` array that it is passed, while filtering is done +entirely by the provider, which manually forces a refresh of the table when the filter is changed. + +<<< DEMO ./demo/TableProvider.vue + ## Light-weight tables `` provides a great alternative to `` if you just need simple display of diff --git a/packages/bootstrap-vue-next/src/components/BTable/BTable.vue b/packages/bootstrap-vue-next/src/components/BTable/BTable.vue index 95a236856..72da4d502 100644 --- a/packages/bootstrap-vue-next/src/components/BTable/BTable.vue +++ b/packages/bootstrap-vue-next/src/components/BTable/BTable.vue @@ -231,7 +231,7 @@ import { } from '../../types/TableTypes' import {useDefaults} from '../../composables/useDefaults' import type {BTableProps} from '../../types/ComponentProps' -import {get, pick, set} from '../../utils/object' +import {deepEqual, get, pick, set} from '../../utils/object' import {startCase} from '../../utils/stringUtils' import type {LiteralUnion} from '../../types/LiteralUnion' import { @@ -831,14 +831,15 @@ const handleFieldSorting = (field: TableField) => { * @returns the updated value to emit for sorted */ const handleMultiSort = (): BTableSortBy => { - sortByModel.value = sortByModel.value ?? [] + const tmp = [...(sortByModel.value ?? [])] const val = updatedValue if (index === -1) { - sortByModel.value.push(val) + tmp.push(val) } else { val.order = resolveOrder(val.order) - sortByModel.value.splice(index, 1, val) + tmp.splice(index, 1, val) } + sortByModel.value = tmp return val } @@ -900,7 +901,7 @@ const callItemsProvider = async () => { } const providerPropsWatch = async (prop: string, val: unknown, oldVal: unknown) => { - if (val === oldVal) return + if (deepEqual(val, oldVal)) return //stop provide when paging const inNoProvider = (key: NoProviderTypes) => props.noProvider?.includes(key) === true From 8db7c5fd632732fba9b9fa00520201ca85832d5a Mon Sep 17 00:00:00 2001 From: "David W. Gray" Date: Sun, 6 Apr 2025 09:08:38 -0700 Subject: [PATCH 2/2] docs(BTable): Improve provider function examples --- .../docs/components/demo/TableProvider.vue | 2 +- .../components/demo/TableProviderAsync.vue | 194 ++++++++++++++++++ apps/docs/src/docs/components/table.md | 9 +- 3 files changed, 202 insertions(+), 3 deletions(-) create mode 100644 apps/docs/src/docs/components/demo/TableProviderAsync.vue diff --git a/apps/docs/src/docs/components/demo/TableProvider.vue b/apps/docs/src/docs/components/demo/TableProvider.vue index ae7d97f1e..640804a5c 100644 --- a/apps/docs/src/docs/components/demo/TableProvider.vue +++ b/apps/docs/src/docs/components/demo/TableProvider.vue @@ -97,7 +97,7 @@ const sortItems = (items: Person[], sortBy?: BTableSortBy[]) => { return items } - return [...filteredItems.value].sort((a: Person, b: Person) => { + return filteredItems.value.toSorted((a: Person, b: Person) => { for (const sort of sortBy) { if (sort.order === undefined) { continue diff --git a/apps/docs/src/docs/components/demo/TableProviderAsync.vue b/apps/docs/src/docs/components/demo/TableProviderAsync.vue new file mode 100644 index 000000000..d41b68917 --- /dev/null +++ b/apps/docs/src/docs/components/demo/TableProviderAsync.vue @@ -0,0 +1,194 @@ + + + diff --git a/apps/docs/src/docs/components/table.md b/apps/docs/src/docs/components/table.md index f2658c35f..aa0b919ff 100644 --- a/apps/docs/src/docs/components/table.md +++ b/apps/docs/src/docs/components/table.md @@ -822,14 +822,19 @@ To Be Completed To Be Completed -Below is a trimmed down version of the [complete example](#complete-example) as a starting place for using provider functions until -docs for the provider function are completed. It uses a local provider function that implements +Below are trimmed down versions of the [complete example](#complete-example) as a starting place for using provider functions until docs for the provider function are completed. They use local provider functions that implement sorting and filtering. Note that sorting is done in cooperation with `` by having the provider function react to the `context.sortBy` array that it is passed, while filtering is done entirely by the provider, which manually forces a refresh of the table when the filter is changed. +This version uses a syncronous provider funtion: + <<< DEMO ./demo/TableProvider.vue +This version uses an asyncronous provider function that simulates latency by sleeping for a second: + +<<< DEMO ./demo/TableProviderAsync.vue + ## Light-weight tables `` provides a great alternative to `` if you just need simple display of