From c6449a5b665aa5e437d5f29cde88b46a7aa19f2f Mon Sep 17 00:00:00 2001 From: Jeremy Mees Date: Tue, 31 Mar 2026 16:52:00 +0200 Subject: [PATCH 1/5] feat: updated workflow to node 24 scripts --- .github/workflows/pull-request.yaml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/pull-request.yaml b/.github/workflows/pull-request.yaml index 1ec53288..8d4774c2 100644 --- a/.github/workflows/pull-request.yaml +++ b/.github/workflows/pull-request.yaml @@ -9,9 +9,9 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version-file: ".nvmrc" cache: "npm" @@ -26,9 +26,9 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version-file: ".nvmrc" cache: "npm" @@ -43,9 +43,9 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version-file: ".nvmrc" cache: "npm" From 8698e21375ff0332e9f66ad773dee7fe8b83da5e Mon Sep 17 00:00:00 2001 From: Jeremy Mees Date: Tue, 7 Apr 2026 08:41:22 +0200 Subject: [PATCH 2/5] feat: updated page size for campaign notes and homebrew --- app/components/atoms/DataTable.vue | 26 +++++++++------ .../campaigns/[id]-[title]/homebrews.vue | 32 +++++++++++-------- app/pages/campaigns/[id]-[title]/notes.vue | 32 +++++++++++-------- 3 files changed, 54 insertions(+), 36 deletions(-) diff --git a/app/components/atoms/DataTable.vue b/app/components/atoms/DataTable.vue index 755fc5ac..3ff2232c 100644 --- a/app/components/atoms/DataTable.vue +++ b/app/components/atoms/DataTable.vue @@ -7,19 +7,25 @@ const emit = defineEmits<{ invalidate: [] }>() -const props = defineProps<{ - columns: ColumnDef[] - data: any[] - loading: boolean - options?: Partial> - emptyMessage?: string - permission?: boolean | ((item: any) => Promise) - expandedMarkup?: (row: Row) => VNode -}>() +const props = withDefaults( + defineProps<{ + columns: ColumnDef[] + data: any[] + loading: boolean + options?: Partial> + emptyMessage?: string + permission?: boolean | ((item: any) => Promise) + expandedMarkup?: (row: Row) => VNode + pageSize?: number + }>(), + { + pageSize: 10, + }, +) const globalFilter = ref('') const sorting = ref(props.options?.initialState?.sorting || []) -const pagination = ref({ pageIndex: 0, pageSize: 10 }) +const pagination = ref({ pageIndex: 0, pageSize: props.pageSize }) const rowSelectionPermissions = ref>({}) // Convert 0-based to 1-based for Radix diff --git a/app/pages/campaigns/[id]-[title]/homebrews.vue b/app/pages/campaigns/[id]-[title]/homebrews.vue index 3d55f9ae..7d68445a 100644 --- a/app/pages/campaigns/[id]-[title]/homebrews.vue +++ b/app/pages/campaigns/[id]-[title]/homebrews.vue @@ -21,6 +21,7 @@ const queryClient = useQueryClient() const table = ref>() const limitCta = ref>() +const pageSize = 20 const max = 100 const hasRights = computed(() => props.isOwner || props.isAdmin) @@ -29,19 +30,23 @@ const enableDateFetching = computed(() => props.fetchReady) const { mutateAsync: removeHomebrew } = useHomebrewRemove() const { data: count } = useHomebrewCount(props.campaignId, enableDateFetching) -const { data, status } = useHomebrewListing(computed(() => { - const pagination = table.value?.vueTable.getState().pagination - const sorting = table.value?.vueTable.getState().sorting - const search = table.value?.vueTable.getState().globalFilter - - return { - search, - sortBy: sorting?.[0]?.id ?? initialState.sorting?.[0]?.id, - sortDesc: sorting?.[0]?.desc ?? initialState.sorting?.[0]?.desc, - page: pagination?.pageIndex ?? 0, - eq: { field: 'campaign', value: props.campaignId }, - } -}), enableDateFetching) +const { data, status } = useHomebrewListing( + computed(() => { + const pagination = table.value?.vueTable.getState().pagination + const sorting = table.value?.vueTable.getState().sorting + const search = table.value?.vueTable.getState().globalFilter + + return { + search, + sortBy: sorting?.[0]?.id ?? initialState.sorting?.[0]?.id, + sortDesc: sorting?.[0]?.desc ?? initialState.sorting?.[0]?.desc, + page: pagination?.pageIndex ?? 0, + eq: { field: 'campaign', value: props.campaignId }, + } + }), + enableDateFetching, + pageSize, +) const columns = generateColumns({ onUpdate: (item: HomebrewItemRow) => openModal(item), @@ -97,6 +102,7 @@ function invalidateQueries(): void { :columns="columns" :data="data?.homebrews || []" :total="data?.amount || 0" + :page-size="pageSize" :loading="status === 'pending'" :options="{ pageCount: data?.pages ?? -1, diff --git a/app/pages/campaigns/[id]-[title]/notes.vue b/app/pages/campaigns/[id]-[title]/notes.vue index 92b9618c..3c4fd218 100644 --- a/app/pages/campaigns/[id]-[title]/notes.vue +++ b/app/pages/campaigns/[id]-[title]/notes.vue @@ -24,6 +24,7 @@ const { startCoolDown, isInCoolDown, getRemainingTime } = useCoolDown() const queryClient = useQueryClient() const table = ref>() +const pageSize = 20 const max = 100 const hasRights = computed(() => props.isOwner || props.isAdmin) @@ -32,19 +33,23 @@ const enableDateFetching = computed(() => props.fetchReady) const { data: count } = useNoteCount(props.campaignId, enableDateFetching) const { mutateAsync: removeNote } = useNoteRemove() -const { data, status } = useNoteListing(computed(() => { - const pagination = table.value?.vueTable.getState().pagination - const sorting = table.value?.vueTable.getState().sorting - const search = table.value?.vueTable.getState().globalFilter - - return { - search, - sortBy: sorting?.[0]?.id ?? initialState.sorting?.[0]?.id, - sortDesc: sorting?.[0]?.desc ?? initialState.sorting?.[0]?.desc, - page: pagination?.pageIndex ?? 0, - eq: { field: 'campaign', value: props.campaignId }, - } -}), enableDateFetching) +const { data, status } = useNoteListing( + computed(() => { + const pagination = table.value?.vueTable.getState().pagination + const sorting = table.value?.vueTable.getState().sorting + const search = table.value?.vueTable.getState().globalFilter + + return { + search, + sortBy: sorting?.[0]?.id ?? initialState.sorting?.[0]?.id, + sortDesc: sorting?.[0]?.desc ?? initialState.sorting?.[0]?.desc, + page: pagination?.pageIndex ?? 0, + eq: { field: 'campaign', value: props.campaignId }, + } + }), + enableDateFetching, + pageSize, +) const columns = generateColumns({ onUpdate: (item: NoteRow) => openModal(item), @@ -135,6 +140,7 @@ async function sendNoteAsMail(note: NoteRow, addresses: string[]): Promise :columns="columns" :data="data?.notes || []" :total="data?.amount || 0" + :page-size="pageSize" :loading="status === 'pending'" :options="{ pageCount: data?.pages ?? -1, From 01f284b23283869c0702b0e3e907e3c27dd571d2 Mon Sep 17 00:00:00 2001 From: Jeremy Mees Date: Tue, 7 Apr 2026 08:49:22 +0200 Subject: [PATCH 3/5] fix: permissions not updating when new item is added to the table --- app/components/atoms/DataTable.vue | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/app/components/atoms/DataTable.vue b/app/components/atoms/DataTable.vue index 3ff2232c..cd23b95d 100644 --- a/app/components/atoms/DataTable.vue +++ b/app/components/atoms/DataTable.vue @@ -27,6 +27,7 @@ const globalFilter = ref('') const sorting = ref(props.options?.initialState?.sorting || []) const pagination = ref({ pageIndex: 0, pageSize: props.pageSize }) const rowSelectionPermissions = ref>({}) +const permissionFetchVersion = ref(0) // Convert 0-based to 1-based for Radix const internalPage = computed({ @@ -37,18 +38,19 @@ const internalPage = computed({ const selectedRowLength = computed(() => table.getSelectedRowModel().rows.length) watch( - () => props.data?.length, - async (length) => { - if (length) await fetchPermissions() - }, - { immediate: true }, -) + () => ({ + permission: props.permission, + ids: (props.data || []).map(item => String(item.id)), + }), + async ({ ids }) => { + if (!ids.length) { + rowSelectionPermissions.value = {} + return + } -watch( - () => props.permission, - async () => { - if (props.data?.length) await fetchPermissions() + await fetchPermissions() }, + { immediate: true }, ) const table = useVueTable({ @@ -85,6 +87,7 @@ const search = ref(table.getState().globalFilter) watch(search, newValue => table.setGlobalFilter(newValue)) async function fetchPermissions() { + const currentFetchVersion = ++permissionFetchVersion.value const permissions: Record = {} for (const item of props.data) { @@ -93,6 +96,8 @@ async function fetchPermissions() { else permissions[item.id] = true } + if (currentFetchVersion !== permissionFetchVersion.value) return + rowSelectionPermissions.value = permissions } From d35c7717cc811c7d9de7da91a428219eb5cabd92 Mon Sep 17 00:00:00 2001 From: Jeremy Mees Date: Tue, 7 Apr 2026 08:51:29 +0200 Subject: [PATCH 4/5] fix: alert dialog button wrong colors --- app/components/ui/alert-dialog/AlertDialogAction.vue | 2 +- app/components/ui/alert-dialog/AlertDialogCancel.vue | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/components/ui/alert-dialog/AlertDialogAction.vue b/app/components/ui/alert-dialog/AlertDialogAction.vue index bc6363f0..2e1c9ec8 100644 --- a/app/components/ui/alert-dialog/AlertDialogAction.vue +++ b/app/components/ui/alert-dialog/AlertDialogAction.vue @@ -16,7 +16,7 @@ const delegatedProps = computed(() => {