diff --git a/package.json b/package.json
index 0ba7336c246..b78bd28bfa0 100644
--- a/package.json
+++ b/package.json
@@ -94,8 +94,8 @@
"@inertiajs/vite": "^3.0.3",
"@inertiajs/vue3": "^3.0.3",
"@simplewebauthn/browser": "catalog:",
- "@tanstack/table-core": "^8.21.3",
- "@tanstack/vue-table": "^8.21.3",
+ "@tanstack/table-core": "^9.2.4",
+ "@tanstack/vue-table": "^9.2.4",
"@uppy/aws-s3": "^6.1.0",
"@uppy/core": "^6.0.1",
"@uppy/drop-target": "^5.0.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index bd19e730d05..3e1161170b0 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -353,11 +353,11 @@ importers:
specifier: 'catalog:'
version: 13.3.0
'@tanstack/table-core':
- specifier: ^8.21.3
- version: 8.21.3
+ specifier: ^9.2.4
+ version: 9.2.4
'@tanstack/vue-table':
- specifier: ^8.21.3
- version: 8.21.3(vue@3.5.33(typescript@6.0.3))
+ specifier: ^9.2.4
+ version: 9.2.4(vue@3.5.33(typescript@6.0.3))
'@uppy/aws-s3':
specifier: ^6.1.0
version: 6.1.0(@uppy/core@6.0.1)
@@ -3672,9 +3672,12 @@ packages:
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
- '@tanstack/table-core@8.21.3':
- resolution: {integrity: sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==}
- engines: {node: '>=12'}
+ '@tanstack/store@0.11.1':
+ resolution: {integrity: sha512-mzTOBhypOuDJAy/D8n2MfUZ1HFkXnmSETviRyhqEC8LUE7/IZQExOTxMANj3KjTofYTkFNpBY67qaVrT41YccA==}
+
+ '@tanstack/table-core@9.2.4':
+ resolution: {integrity: sha512-GwdDyGGr6UXAtubF14yAwcXvdaogqfsQgIk89Suebjxob/Rjq2xvfmXsjDF1rQmKmhHsJm9TOY7myxv3i6geJw==}
+ engines: {node: '>=20'}
'@tanstack/virtual-core@3.13.12':
resolution: {integrity: sha512-1YBOJfRHV4sXUmWsFSf5rQor4Ss82G8dQWLRbnk3GA4jeP8hQt1hxXh0tmflpC0dz3VgEv/1+qwPyLeWkQuPFA==}
@@ -3682,9 +3685,9 @@ packages:
'@tanstack/virtual-core@3.13.18':
resolution: {integrity: sha512-Mx86Hqu1k39icq2Zusq+Ey2J6dDWTjDvEv43PJtRCoEYTLyfaPnxIQ6iy7YAOK0NV/qOEmZQ/uCufrppZxTgcg==}
- '@tanstack/vue-table@8.21.3':
- resolution: {integrity: sha512-rusRyd77c5tDPloPskctMyPLFEQUeBzxdQ+2Eow4F7gDPlPOB1UnnhzfpdvqZ8ZyX2rRNGmqNnQWm87OI2OQPw==}
- engines: {node: '>=12'}
+ '@tanstack/vue-table@9.2.4':
+ resolution: {integrity: sha512-GSD6ZkeQvADs6u9KUyhUuiD+qYgA+Lt6hTBDSEadCBIbC8q2SaoHzseLwgDKVUnRClTIMj9+NwCEF+Gp3P7ChQ==}
+ engines: {node: '>=20'}
peerDependencies:
vue: '>=3.2'
@@ -12758,15 +12761,20 @@ snapshots:
react: 19.2.5
react-dom: 19.2.5(react@19.2.5)
- '@tanstack/table-core@8.21.3': {}
+ '@tanstack/store@0.11.1': {}
+
+ '@tanstack/table-core@9.2.4':
+ dependencies:
+ '@tanstack/store': 0.11.1
'@tanstack/virtual-core@3.13.12': {}
'@tanstack/virtual-core@3.13.18': {}
- '@tanstack/vue-table@8.21.3(vue@3.5.33(typescript@6.0.3))':
+ '@tanstack/vue-table@9.2.4(vue@3.5.33(typescript@6.0.3))':
dependencies:
- '@tanstack/table-core': 8.21.3
+ '@tanstack/store': 0.11.1
+ '@tanstack/table-core': 9.2.4
vue: 3.5.33(typescript@6.0.3)
'@tanstack/vue-virtual@3.13.18(vue@3.5.33(typescript@6.0.3))':
diff --git a/resources/js/common/components/DataTable.vue b/resources/js/common/components/DataTable.vue
index 21b0747a557..8b184e61033 100644
--- a/resources/js/common/components/DataTable.vue
+++ b/resources/js/common/components/DataTable.vue
@@ -1,10 +1,11 @@
-
diff --git a/resources/js/modules/utilities/components/Migrations.vue b/resources/js/modules/utilities/components/Migrations.vue
index a77b1b4bfb4..8f9a0a3b736 100644
--- a/resources/js/modules/utilities/components/Migrations.vue
+++ b/resources/js/modules/utilities/components/Migrations.vue
@@ -1,11 +1,8 @@
diff --git a/resources/js/modules/utilities/components/deprecation-errors/DeprecationErrors.vue b/resources/js/modules/utilities/components/deprecation-errors/DeprecationErrors.vue
index 2e186b51af4..8ff84091098 100644
--- a/resources/js/modules/utilities/components/deprecation-errors/DeprecationErrors.vue
+++ b/resources/js/modules/utilities/components/deprecation-errors/DeprecationErrors.vue
@@ -1,6 +1,6 @@
diff --git a/resources/js/modules/utilities/components/queue-manager/QueueManagerIndex.vue b/resources/js/modules/utilities/components/queue-manager/QueueManagerIndex.vue
index a95fc6321a4..7681a28189a 100644
--- a/resources/js/modules/utilities/components/queue-manager/QueueManagerIndex.vue
+++ b/resources/js/modules/utilities/components/queue-manager/QueueManagerIndex.vue
@@ -2,11 +2,8 @@
import {t} from '@craftcms/ui/utilities/translate';
import AdminTable from '@/modules/admin-table/components/AdminTable.vue';
import {h, ref} from 'vue';
- import {
- createColumnHelper,
- getCoreRowModel,
- useVueTable,
- } from '@tanstack/vue-table';
+ import {useCraftTable} from '@/modules/admin-table/craftTable';
+ import {createCraftColumnHelper} from '@/modules/admin-table/helpers/createCraftColumnHelper';
import CpLink from '@/common/components/CpLink.vue';
import {type JobInfo, JobStatus} from '@/modules/queue/types';
import RetryJobButton from '@/modules/utilities/components/queue-manager/RetryJobButton.vue';
@@ -22,7 +19,7 @@
{totalJobs: 0}
);
- const columnHelper = createColumnHelper();
+ const columnHelper = createCraftColumnHelper();
function getStatusVariant(value: number) {
if (value === 2 || value === 3) {
@@ -44,59 +41,60 @@
return job.status.value == JobStatus.Failed;
}
- const columns = ref([
- columnHelper.accessor('description', {
- header: () => t('Name'),
- cell: ({row, getValue}) =>
- h(
- CpLink,
- {href: show.url({id: 'queue-manager', extra: row.original.uid})},
- () => getValue()
- ),
- }),
- columnHelper.accessor('status', {
- header: () => t('Status'),
- size: 80,
- cell: (info) =>
- h(
- 'craft-badge',
- {
- fill: getStatusVariant(info.getValue().value),
- },
- info.getValue().label
- ),
- }),
- columnHelper.display({
- id: 'progress',
- header: () => t('Progress'),
- cell: ({row}) =>
- row.original.progress > 0
- ? `${row.original.progress}% ${row.original.progressLabel ? `(${row.original.progressLabel})` : ''}`
- : '',
- }),
- columnHelper.display({
- id: 'actions',
- cell: ({row}) => {
- return h('div', {class: 'flex justify-end gap-2'}, [
- isRetryable(row.original)
- ? h(RetryJobButton, {job: row.original})
- : null,
- row.original.status.value !== JobStatus.Done
- ? h(ReleaseJobButton, {job: row.original})
- : null,
- ]);
- },
- }),
- ]);
+ const columns = ref(
+ columnHelper.columns([
+ columnHelper.accessor('description', {
+ header: () => t('Name'),
+ cell: ({row, getValue}) =>
+ h(
+ CpLink,
+ {href: show.url({id: 'queue-manager', extra: row.original.uid})},
+ () => getValue()
+ ),
+ }),
+ columnHelper.accessor('status', {
+ header: () => t('Status'),
+ size: 80,
+ cell: (info) =>
+ h(
+ 'craft-badge',
+ {
+ fill: getStatusVariant(info.getValue().value),
+ },
+ info.getValue().label
+ ),
+ }),
+ columnHelper.display({
+ id: 'progress',
+ header: () => t('Progress'),
+ cell: ({row}) =>
+ row.original.progress > 0
+ ? `${row.original.progress}% ${row.original.progressLabel ? `(${row.original.progressLabel})` : ''}`
+ : '',
+ }),
+ columnHelper.display({
+ id: 'actions',
+ cell: ({row}) => {
+ return h('div', {class: 'flex justify-end gap-2'}, [
+ isRetryable(row.original)
+ ? h(RetryJobButton, {job: row.original})
+ : null,
+ row.original.status.value !== JobStatus.Done
+ ? h(ReleaseJobButton, {job: row.original})
+ : null,
+ ]);
+ },
+ }),
+ ])
+ );
- const jobsTable = useVueTable({
+ const jobsTable = useCraftTable({
get data() {
return props.jobs;
},
get columns() {
return columns.value;
},
- getCoreRowModel: getCoreRowModel(),
});
diff --git a/resources/js/pages/assets/Index.vue b/resources/js/pages/assets/Index.vue
index 2c5f7ff48d0..90068a31342 100644
--- a/resources/js/pages/assets/Index.vue
+++ b/resources/js/pages/assets/Index.vue
@@ -136,7 +136,7 @@
@@ -174,7 +174,7 @@
)
}}
-
+
{{ t('Cancel') }}
@@ -196,7 +196,7 @@
@craft-before-hide="resolveDragFolderConflictChoice('cancel')"
>
{{ dragFolderConflictPrompt?.message }}
-
+
{{ t('Cancel') }}
@@ -219,7 +219,7 @@
@craft-before-hide="closeNewFolder"
@craft-after-show="focusNewFolderName"
>
-
-
+
{{ t('Cancel') }}
@@ -248,7 +248,7 @@
:label="t('Rename folder')"
@craft-before-hide="closeRename"
>
-
-
+
{{ t('Cancel') }}
@@ -277,7 +277,7 @@
@craft-before-hide="resolveFolderConflictChoice('cancel')"
>
{{ folderConflictPrompt?.message }}
-
+
{{ t('Cancel') }}
diff --git a/resources/js/pages/graphql/schemas/Index.vue b/resources/js/pages/graphql/schemas/Index.vue
index 7fd601e2d0e..fdfb71283e8 100644
--- a/resources/js/pages/graphql/schemas/Index.vue
+++ b/resources/js/pages/graphql/schemas/Index.vue
@@ -3,7 +3,7 @@
import {h} from 'vue';
import {t} from '@craftcms/ui';
import AdminTable from '@/modules/admin-table/components/AdminTable.vue';
- import {getCoreRowModel, useVueTable} from '@tanstack/vue-table';
+ import {useCraftTable} from '@/modules/admin-table/craftTable';
import {createCraftColumnHelper} from '@/modules/admin-table/helpers/createCraftColumnHelper';
import {create, destroy, edit} from '@actions/Gql/SchemasController';
import DeleteButton from '@/modules/admin-table/components/DeleteButton.vue';
@@ -24,7 +24,7 @@
}>();
const columnHelper = createCraftColumnHelper
();
- const table = useVueTable({
+ const table = useCraftTable({
get columns() {
return [
columnHelper.link('name', {
@@ -78,8 +78,6 @@
};
},
},
- enableSorting: false,
- getCoreRowModel: getCoreRowModel(),
});
diff --git a/resources/js/pages/graphql/tokens/Index.vue b/resources/js/pages/graphql/tokens/Index.vue
index 6cff2777101..c51e99d896e 100644
--- a/resources/js/pages/graphql/tokens/Index.vue
+++ b/resources/js/pages/graphql/tokens/Index.vue
@@ -2,7 +2,7 @@
import {h} from 'vue';
import {t} from '@craftcms/ui';
import AdminTable from '@/modules/admin-table/components/AdminTable.vue';
- import {getCoreRowModel, useVueTable} from '@tanstack/vue-table';
+ import {useCraftTable} from '@/modules/admin-table/craftTable';
import {createCraftColumnHelper} from '@/modules/admin-table/helpers/createCraftColumnHelper';
import CpButtonLink from '@/common/components/CpButtonLink.vue';
import DeleteButton from '@/modules/admin-table/components/DeleteButton.vue';
@@ -37,7 +37,7 @@
}>();
const columnHelper = createCraftColumnHelper();
- const table = useVueTable({
+ const table = useCraftTable({
get columns() {
return [
columnHelper.link('name', {
@@ -83,8 +83,6 @@
};
},
},
- enableSorting: false,
- getCoreRowModel: getCoreRowModel(),
});
diff --git a/resources/js/pages/settings/assets/Index.vue b/resources/js/pages/settings/assets/Index.vue
index 647ab11c35c..18aa2bf55dd 100644
--- a/resources/js/pages/settings/assets/Index.vue
+++ b/resources/js/pages/settings/assets/Index.vue
@@ -1,7 +1,7 @@
diff --git a/resources/js/pages/settings/assets/transforms/Index.vue b/resources/js/pages/settings/assets/transforms/Index.vue
index d09407a5c06..562e7010cd5 100644
--- a/resources/js/pages/settings/assets/transforms/Index.vue
+++ b/resources/js/pages/settings/assets/transforms/Index.vue
@@ -1,6 +1,6 @@
diff --git a/resources/js/pages/settings/workflows/Index.vue b/resources/js/pages/settings/workflows/Index.vue
index 6a64e1c4538..92a03f2b832 100644
--- a/resources/js/pages/settings/workflows/Index.vue
+++ b/resources/js/pages/settings/workflows/Index.vue
@@ -1,7 +1,7 @@
diff --git a/resources/js/pages/users/SignInProviders.vue b/resources/js/pages/users/SignInProviders.vue
index 873cc75c752..a19673cee60 100644
--- a/resources/js/pages/users/SignInProviders.vue
+++ b/resources/js/pages/users/SignInProviders.vue
@@ -3,7 +3,7 @@
import {router, useHttp, usePage} from '@inertiajs/vue3';
import {t} from '@craftcms/ui';
import {connect, destroy} from '@actions/Users/SignInProvidersController';
- import {getCoreRowModel, useVueTable} from '@tanstack/vue-table';
+ import {useCraftTable} from '@/modules/admin-table/craftTable';
import {createCraftColumnHelper} from '@/modules/admin-table/helpers/createCraftColumnHelper';
import AdminTable from '@/modules/admin-table/components/AdminTable.vue';
import {elevatedSessionManager} from '@/modules/auth/elevated-session';
@@ -71,7 +71,7 @@
}
const columnHelper = createCraftColumnHelper();
- const table = useVueTable({
+ const table = useCraftTable({
get data() {
return page.props.providers;
},
@@ -137,8 +137,6 @@
]),
];
},
- getCoreRowModel: getCoreRowModel(),
- enableSorting: false,
});