From 0b2a1e59e0400516847bbf194bac6ee5ac02062d Mon Sep 17 00:00:00 2001 From: Brian Hanson Date: Fri, 25 Sep 2026 16:04:54 -0500 Subject: [PATCH 1/3] Upgrade TanStack Table to v9 Moves @tanstack/vue-table and @tanstack/table-core from 8.21.3 to 9.2.4. - Register a shared feature set (craftTableFeatures) for every CP table, since v9 only exposes a feature's APIs to tables that register it - useVueTable -> useTable, drop getCoreRowModel, read state via atoms - Add the feature-set generic to column helpers, types and ColumnMeta - Make AdminTable/BaseElementIndex/DataTable generic over the row type, as v9 tables are invariant in their data type - Keep the select-all checkbox from showing indeterminate when every row is selected (getIsSomeRowsSelected now includes the all-selected case) Co-Authored-By: Claude Opus 5.5 --- package.json | 4 +- pnpm-lock.yaml | 34 ++-- resources/js/common/types/globals.d.ts | 6 +- .../components/AdminTable.stories.ts | 7 +- .../admin-table/components/AdminTable.vue | 5 +- .../composables/useEditableTable.ts | 96 ++++++---- .../helpers/createCraftColumnHelper.ts | 71 ++++--- .../js/modules/admin-table/tableFeatures.ts | 29 +++ .../composables/useAssetFolderActions.ts | 15 +- .../assets/composables/useAssetMoveDrag.ts | 6 +- .../useModalElementIndex.ts | 10 +- .../components/BaseElementIndex.stories.ts | 7 +- .../elements/components/BaseElementIndex.vue | 11 +- .../elements/components/DataTable.stories.ts | 7 +- .../elements/components/DataTable.test.ts | 4 +- .../modules/elements/components/DataTable.vue | 23 ++- .../composables/useElementIndexPage.ts | 12 +- .../useElementIndexSelection.test.ts | 16 +- .../composables/useElementIndexSelection.ts | 23 ++- .../useElementIndexStructure.test.ts | 7 +- .../composables/useElementIndexTable.ts | 4 +- .../js/modules/elements/fixtures/elements.ts | 42 +++-- .../plugin-manager/components/PluginsList.vue | 7 +- .../TwoStepVerification.vue | 10 +- .../utilities/components/Migrations.vue | 44 ++--- .../deprecation-errors/DeprecationErrors.vue | 59 +++--- .../queue-manager/QueueManagerIndex.vue | 104 ++++++----- resources/js/pages/graphql/schemas/Index.vue | 7 +- resources/js/pages/graphql/tokens/Index.vue | 7 +- resources/js/pages/settings/assets/Index.vue | 10 +- .../settings/assets/transformers/Index.vue | 128 +++++++------ .../settings/assets/transforms/Index.vue | 104 ++++++----- .../js/pages/settings/entry-types/Index.vue | 66 ++++--- resources/js/pages/settings/fields/Index.vue | 175 +++++++++--------- .../js/pages/settings/sections/Index.vue | 43 +++-- resources/js/pages/settings/sites/Index.vue | 149 ++++++++------- .../js/pages/settings/users/groups/Index.vue | 7 +- .../js/pages/settings/workflows/Index.vue | 46 +++-- resources/js/pages/users/Passkeys.vue | 10 +- resources/js/pages/users/SignInProviders.vue | 10 +- 40 files changed, 812 insertions(+), 613 deletions(-) create mode 100644 resources/js/modules/admin-table/tableFeatures.ts diff --git a/package.json b/package.json index 2facf31e94c..f5882c9deeb 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 d4f5a7d4a4d..2f24b6f9390 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) @@ -3675,9 +3675,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==} @@ -3685,9 +3688,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' @@ -12761,15 +12764,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/types/globals.d.ts b/resources/js/common/types/globals.d.ts index a3d976c7423..b2bcda7969e 100644 --- a/resources/js/common/types/globals.d.ts +++ b/resources/js/common/types/globals.d.ts @@ -30,7 +30,11 @@ interface LegacyModalInstance { } declare module '@tanstack/vue-table' { - interface ColumnMeta { + interface ColumnMeta< + TFeatures extends TableFeatures, + TData extends RowData, + TValue extends CellData = CellData, + > { wrap?: boolean; // Applies classes to the cell cellClass?: string | Record; diff --git a/resources/js/modules/admin-table/components/AdminTable.stories.ts b/resources/js/modules/admin-table/components/AdminTable.stories.ts index d838062536b..3fcc68005a7 100644 --- a/resources/js/modules/admin-table/components/AdminTable.stories.ts +++ b/resources/js/modules/admin-table/components/AdminTable.stories.ts @@ -7,7 +7,10 @@ import { const meta = { title: 'Elements/AdminTable', - component: AdminTable, + // The component is generic over its row type, which `Meta` can't + // instantiate. Every story drives it through `render`, so the only thing the + // cast costs is arg typing that nothing here uses. + component: AdminTable as Meta['component'], parameters: { docs: { description: { @@ -21,7 +24,7 @@ const meta = { }, }, }, -} satisfies Meta; +} satisfies Meta; export default meta; type Story = StoryObj<{title?: string}>; diff --git a/resources/js/modules/admin-table/components/AdminTable.vue b/resources/js/modules/admin-table/components/AdminTable.vue index 009584e3640..8e67573736e 100644 --- a/resources/js/modules/admin-table/components/AdminTable.vue +++ b/resources/js/modules/admin-table/components/AdminTable.vue @@ -1,6 +1,7 @@ - diff --git a/resources/js/modules/utilities/components/Migrations.vue b/resources/js/modules/utilities/components/Migrations.vue index a77b1b4bfb4..2a6f014ff78 100644 --- a/resources/js/modules/utilities/components/Migrations.vue +++ b/resources/js/modules/utilities/components/Migrations.vue @@ -1,11 +1,11 @@ diff --git a/resources/js/modules/utilities/components/deprecation-errors/DeprecationErrors.vue b/resources/js/modules/utilities/components/deprecation-errors/DeprecationErrors.vue index 2e186b51af4..496726d6bd4 100644 --- a/resources/js/modules/utilities/components/deprecation-errors/DeprecationErrors.vue +++ b/resources/js/modules/utilities/components/deprecation-errors/DeprecationErrors.vue @@ -1,6 +1,7 @@ diff --git a/resources/js/modules/utilities/components/queue-manager/QueueManagerIndex.vue b/resources/js/modules/utilities/components/queue-manager/QueueManagerIndex.vue index a95fc6321a4..545e78b3284 100644 --- a/resources/js/modules/utilities/components/queue-manager/QueueManagerIndex.vue +++ b/resources/js/modules/utilities/components/queue-manager/QueueManagerIndex.vue @@ -2,11 +2,11 @@ import {t} from '@craftcms/ui/utilities/translate'; import AdminTable from '@/modules/admin-table/components/AdminTable.vue'; import {h, ref} from 'vue'; + import {createColumnHelper, useTable} from '@tanstack/vue-table'; import { - createColumnHelper, - getCoreRowModel, - useVueTable, - } from '@tanstack/vue-table'; + craftTableFeatures, + type CraftTableFeatures, + } from '@/modules/admin-table/tableFeatures'; 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 +22,7 @@ {totalJobs: 0} ); - const columnHelper = createColumnHelper(); + const columnHelper = createColumnHelper(); function getStatusVariant(value: number) { if (value === 2 || value === 3) { @@ -44,59 +44,61 @@ 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 = useTable({ + features: craftTableFeatures, get data() { return props.jobs; }, get columns() { return columns.value; }, - getCoreRowModel: getCoreRowModel(), }); diff --git a/resources/js/pages/graphql/schemas/Index.vue b/resources/js/pages/graphql/schemas/Index.vue index 18cec647cd2..7a7e3b287b0 100644 --- a/resources/js/pages/graphql/schemas/Index.vue +++ b/resources/js/pages/graphql/schemas/Index.vue @@ -3,7 +3,8 @@ 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 {useTable} from '@tanstack/vue-table'; + import {craftTableFeatures} from '@/modules/admin-table/tableFeatures'; 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'; @@ -25,7 +26,8 @@ }>(); const columnHelper = createCraftColumnHelper(); - const table = useVueTable({ + const table = useTable({ + features: craftTableFeatures, get columns() { return [ columnHelper.link('name', { @@ -80,7 +82,6 @@ }, }, enableSorting: false, - getCoreRowModel: getCoreRowModel(), }); diff --git a/resources/js/pages/graphql/tokens/Index.vue b/resources/js/pages/graphql/tokens/Index.vue index bb4a2e6bfc4..ca8fb6a4e1b 100644 --- a/resources/js/pages/graphql/tokens/Index.vue +++ b/resources/js/pages/graphql/tokens/Index.vue @@ -2,7 +2,8 @@ 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 {useTable} from '@tanstack/vue-table'; + import {craftTableFeatures} from '@/modules/admin-table/tableFeatures'; import {createCraftColumnHelper} from '@/modules/admin-table/helpers/createCraftColumnHelper'; import CpButtonLink from '@/common/components/CpButtonLink.vue'; import DeleteButton from '@/modules/admin-table/components/DeleteButton.vue'; @@ -38,7 +39,8 @@ }>(); const columnHelper = createCraftColumnHelper(); - const table = useVueTable({ + const table = useTable({ + features: craftTableFeatures, get columns() { return [ columnHelper.link('name', { @@ -85,7 +87,6 @@ }, }, enableSorting: false, - getCoreRowModel: getCoreRowModel(), }); diff --git a/resources/js/pages/settings/assets/Index.vue b/resources/js/pages/settings/assets/Index.vue index ed8e0cad0b4..5fa5b56f0f5 100644 --- a/resources/js/pages/settings/assets/Index.vue +++ b/resources/js/pages/settings/assets/Index.vue @@ -1,7 +1,11 @@ diff --git a/resources/js/pages/settings/assets/transforms/Index.vue b/resources/js/pages/settings/assets/transforms/Index.vue index a3fbb5c1b77..b19b27871f6 100644 --- a/resources/js/pages/settings/assets/transforms/Index.vue +++ b/resources/js/pages/settings/assets/transforms/Index.vue @@ -1,6 +1,7 @@ diff --git a/resources/js/pages/settings/workflows/Index.vue b/resources/js/pages/settings/workflows/Index.vue index 97ae2153387..16185e7f82c 100644 --- a/resources/js/pages/settings/workflows/Index.vue +++ b/resources/js/pages/settings/workflows/Index.vue @@ -1,7 +1,11 @@ diff --git a/resources/js/pages/users/SignInProviders.vue b/resources/js/pages/users/SignInProviders.vue index 873cc75c752..bd36085f1f9 100644 --- a/resources/js/pages/users/SignInProviders.vue +++ b/resources/js/pages/users/SignInProviders.vue @@ -3,7 +3,11 @@ 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 {useTable} from '@tanstack/vue-table'; + import { + craftTableFeatures, + type CraftTableFeatures, + } from '@/modules/admin-table/tableFeatures'; 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 +75,8 @@ } const columnHelper = createCraftColumnHelper(); - const table = useVueTable({ + const table = useTable({ + features: craftTableFeatures, get data() { return page.props.providers; }, @@ -137,7 +142,6 @@ ]), ]; }, - getCoreRowModel: getCoreRowModel(), enableSorting: false, }); From 4ef0d51ba14a418b232afc90a54ae209b3088835 Mon Sep 17 00:00:00 2001 From: Brian Hanson Date: Sat, 26 Sep 2026 10:25:10 -0500 Subject: [PATCH 2/3] Build CP tables with createTableHook - Add useCraftTable (createTableHook) with the shared features and defaults, replacing per-table `features` wiring - Default to enableSorting: false; useServerSort opts tables back in. Tables with no sorting wired up no longer show sort buttons that did nothing - Type column meta through a columnMeta slot instead of global declaration merging - Use createCraftColumnHelper everywhere and the FlexRender shorthand Co-Authored-By: Claude Opus 5.5 --- resources/js/common/types/globals.d.ts | 20 ------- .../admin-table/components/AdminTable.vue | 2 +- .../composables/useEditableTable.ts | 12 ++-- .../admin-table/composables/useServerSort.ts | 2 + .../js/modules/admin-table/craftTable.test.ts | 39 ++++++++++++ .../js/modules/admin-table/craftTable.ts | 60 +++++++++++++++++++ .../helpers/createCraftColumnHelper.ts | 2 +- .../js/modules/admin-table/tableFeatures.ts | 29 --------- .../useModalElementIndex.ts | 9 +-- .../elements/components/BaseElementIndex.vue | 2 +- .../modules/elements/components/DataTable.vue | 16 ++--- .../composables/useElementIndexPage.ts | 10 +--- .../useElementIndexSelection.test.ts | 2 +- .../composables/useElementIndexSelection.ts | 2 +- .../composables/useElementIndexTable.ts | 2 +- .../js/modules/elements/fixtures/elements.ts | 2 +- .../plugin-manager/components/PluginsList.vue | 6 +- .../TwoStepVerification.vue | 10 +--- .../utilities/components/Migrations.vue | 12 ++-- .../deprecation-errors/DeprecationErrors.vue | 7 +-- .../queue-manager/QueueManagerIndex.vue | 12 ++-- resources/js/pages/graphql/schemas/Index.vue | 7 +-- resources/js/pages/graphql/tokens/Index.vue | 7 +-- resources/js/pages/settings/assets/Index.vue | 10 +--- .../settings/assets/transformers/Index.vue | 10 +--- .../settings/assets/transforms/Index.vue | 7 +-- .../js/pages/settings/entry-types/Index.vue | 9 +-- resources/js/pages/settings/fields/Index.vue | 12 ++-- .../js/pages/settings/sections/Index.vue | 6 +- resources/js/pages/settings/sites/Index.vue | 7 +-- .../js/pages/settings/users/groups/Index.vue | 6 +- .../js/pages/settings/workflows/Index.vue | 9 +-- resources/js/pages/users/Passkeys.vue | 10 +--- resources/js/pages/users/SignInProviders.vue | 10 +--- 34 files changed, 163 insertions(+), 205 deletions(-) create mode 100644 resources/js/modules/admin-table/craftTable.test.ts create mode 100644 resources/js/modules/admin-table/craftTable.ts delete mode 100644 resources/js/modules/admin-table/tableFeatures.ts diff --git a/resources/js/common/types/globals.d.ts b/resources/js/common/types/globals.d.ts index b2bcda7969e..4fefa41994f 100644 --- a/resources/js/common/types/globals.d.ts +++ b/resources/js/common/types/globals.d.ts @@ -29,26 +29,6 @@ interface LegacyModalInstance { destroy?(): void; } -declare module '@tanstack/vue-table' { - interface ColumnMeta< - TFeatures extends TableFeatures, - TData extends RowData, - TValue extends CellData = CellData, - > { - wrap?: boolean; - // Applies classes to the cell - cellClass?: string | Record; - cellTag?: 'td' | 'th'; - headerTip?: string; - headerSrOnly?: boolean; - // Applies classes to the header - headerClass?: string | Record; - // Applies classes to both the header and cell at once - columnClass?: string | Record; - trackSize?: string; - } -} - // Set up interfaces and types interface ProgressBarInterface { // oxlint-disable-next-line @typescript-eslint/no-misused-new diff --git a/resources/js/modules/admin-table/components/AdminTable.vue b/resources/js/modules/admin-table/components/AdminTable.vue index 8e67573736e..1010e072b77 100644 --- a/resources/js/modules/admin-table/components/AdminTable.vue +++ b/resources/js/modules/admin-table/components/AdminTable.vue @@ -1,7 +1,7 @@ diff --git a/resources/js/modules/utilities/components/Migrations.vue b/resources/js/modules/utilities/components/Migrations.vue index 2a6f014ff78..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/queue-manager/QueueManagerIndex.vue b/resources/js/modules/utilities/components/queue-manager/QueueManagerIndex.vue index 545e78b3284..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, useTable} from '@tanstack/vue-table'; - import { - craftTableFeatures, - type CraftTableFeatures, - } from '@/modules/admin-table/tableFeatures'; + 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) { @@ -91,8 +88,7 @@ ]) ); - const jobsTable = useTable({ - features: craftTableFeatures, + const jobsTable = useCraftTable({ get data() { return props.jobs; }, diff --git a/resources/js/pages/graphql/schemas/Index.vue b/resources/js/pages/graphql/schemas/Index.vue index 7a7e3b287b0..170a74f0a1d 100644 --- a/resources/js/pages/graphql/schemas/Index.vue +++ b/resources/js/pages/graphql/schemas/Index.vue @@ -3,8 +3,7 @@ import {h} from 'vue'; import {t} from '@craftcms/ui'; import AdminTable from '@/modules/admin-table/components/AdminTable.vue'; - import {useTable} from '@tanstack/vue-table'; - import {craftTableFeatures} from '@/modules/admin-table/tableFeatures'; + 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'; @@ -26,8 +25,7 @@ }>(); const columnHelper = createCraftColumnHelper(); - const table = useTable({ - features: craftTableFeatures, + const table = useCraftTable({ get columns() { return [ columnHelper.link('name', { @@ -81,7 +79,6 @@ }; }, }, - enableSorting: false, }); diff --git a/resources/js/pages/graphql/tokens/Index.vue b/resources/js/pages/graphql/tokens/Index.vue index ca8fb6a4e1b..fd48f44c251 100644 --- a/resources/js/pages/graphql/tokens/Index.vue +++ b/resources/js/pages/graphql/tokens/Index.vue @@ -2,8 +2,7 @@ import {h} from 'vue'; import {t} from '@craftcms/ui'; import AdminTable from '@/modules/admin-table/components/AdminTable.vue'; - import {useTable} from '@tanstack/vue-table'; - import {craftTableFeatures} from '@/modules/admin-table/tableFeatures'; + 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'; @@ -39,8 +38,7 @@ }>(); const columnHelper = createCraftColumnHelper(); - const table = useTable({ - features: craftTableFeatures, + const table = useCraftTable({ get columns() { return [ columnHelper.link('name', { @@ -86,7 +84,6 @@ }; }, }, - enableSorting: false, }); diff --git a/resources/js/pages/settings/assets/Index.vue b/resources/js/pages/settings/assets/Index.vue index 5fa5b56f0f5..c1f9b00239b 100644 --- a/resources/js/pages/settings/assets/Index.vue +++ b/resources/js/pages/settings/assets/Index.vue @@ -1,11 +1,7 @@ diff --git a/resources/js/pages/settings/assets/transforms/Index.vue b/resources/js/pages/settings/assets/transforms/Index.vue index b19b27871f6..6abb8b39512 100644 --- a/resources/js/pages/settings/assets/transforms/Index.vue +++ b/resources/js/pages/settings/assets/transforms/Index.vue @@ -1,7 +1,6 @@ diff --git a/resources/js/pages/users/SignInProviders.vue b/resources/js/pages/users/SignInProviders.vue index bd36085f1f9..a19673cee60 100644 --- a/resources/js/pages/users/SignInProviders.vue +++ b/resources/js/pages/users/SignInProviders.vue @@ -3,11 +3,7 @@ import {router, useHttp, usePage} from '@inertiajs/vue3'; import {t} from '@craftcms/ui'; import {connect, destroy} from '@actions/Users/SignInProvidersController'; - import {useTable} from '@tanstack/vue-table'; - import { - craftTableFeatures, - type CraftTableFeatures, - } from '@/modules/admin-table/tableFeatures'; + 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'; @@ -75,8 +71,7 @@ } const columnHelper = createCraftColumnHelper(); - const table = useTable({ - features: craftTableFeatures, + const table = useCraftTable({ get data() { return page.props.providers; }, @@ -142,7 +137,6 @@ ]), ]; }, - enableSorting: false, }); From d4d02f66e03037f45b47e8bb76004739c6b4b0bb Mon Sep 17 00:00:00 2001 From: Brian Hanson Date: Wed, 30 Sep 2026 16:30:56 -0500 Subject: [PATCH 3/3] Fix lint warnings --- resources/js/common/components/DataTable.vue | 2 +- .../js/common/components/PaginationControls.vue | 6 +++--- resources/js/common/form/IconPicker.vue | 4 ++-- .../elements/components/ElementEditor.vue | 2 +- .../index/components/IndexViewSettings.vue | 4 ++-- .../js/modules/forms/ElementSelectControl.vue | 2 +- .../NestedElementBlocksControl.vue | 6 +++--- .../NestedEntriesCreateButton.vue | 2 +- .../forms/nested-elements/NestedEntriesIndex.vue | 2 +- resources/js/pages/assets/Index.vue | 16 ++++++++-------- 10 files changed, 23 insertions(+), 23 deletions(-) diff --git a/resources/js/common/components/DataTable.vue b/resources/js/common/components/DataTable.vue index 2290288502a..a19dbf08e79 100644 --- a/resources/js/common/components/DataTable.vue +++ b/resources/js/common/components/DataTable.vue @@ -297,7 +297,7 @@ :aria-sort="getAriaSortAttribute(header.column)" >
-
+
-
+
-
+