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 @@