From fd922feab7bbfb71143794a9986bb9e56e5dfabf Mon Sep 17 00:00:00 2001 From: Joschua <70809675+selfire1@users.noreply.github.com> Date: Wed, 5 Nov 2025 06:54:06 +1000 Subject: [PATCH 01/10] wip: edit tips from admin table --- .../_components/create-tip-dialog.tsx | 33 +++++++++-------- .../_components/edit-tip-context.tsx | 26 ++++++++++++++ .../group-admin/_components/row-action.tsx | 35 +++++++++++++++---- app/tipping/group-admin/page.tsx | 21 ++++++----- 4 files changed, 87 insertions(+), 28 deletions(-) create mode 100644 app/tipping/group-admin/_components/edit-tip-context.tsx diff --git a/app/tipping/group-admin/_components/create-tip-dialog.tsx b/app/tipping/group-admin/_components/create-tip-dialog.tsx index ce0091f..a0166cb 100644 --- a/app/tipping/group-admin/_components/create-tip-dialog.tsx +++ b/app/tipping/group-admin/_components/create-tip-dialog.tsx @@ -45,19 +45,31 @@ type RaceOption = Pick< 'id' | 'locality' | 'grandPrixDate' | 'sprintQualifyingDate' > +export type TipFormData = { + users: Pick[] + drivers: DriverOptionProps[] + constructors: ConstructorProps[] + races: RaceOption[] +} + +type TipFormProps = TipFormData & { + defaultValues?: Partial + button?: React.ReactNode +} + export default function CreateTipDialog({ users, races, drivers, constructors, -}: { - users: Pick[] - drivers: DriverOptionProps[] - constructors: ConstructorProps[] - races: RaceOption[] -}) { + defaultValues, + button = ( + + Actions - View customer - View payment details + + + } + /> + + TODO: Delete ) diff --git a/app/tipping/group-admin/page.tsx b/app/tipping/group-admin/page.tsx index f1ef2b2..2fea401 100644 --- a/app/tipping/group-admin/page.tsx +++ b/app/tipping/group-admin/page.tsx @@ -14,7 +14,8 @@ import { formatPredictionsToRows } from './_utils/rows' import { unstable_cache } from 'next/cache' import { db } from '@/db' import { CacheTag } from '@/constants/cache' -import CreateTipDialog from './_components/create-tip-dialog' +import CreateTipDialog, { TipFormData } from './_components/create-tip-dialog' +import TipFormProvider from './_components/edit-tip-context' export default async function GroupSettings() { const { userId } = await verifySession() @@ -51,6 +52,13 @@ export default async function GroupSettings() { race: raceMap, }) + const formProps: TipFormData = { + users: members, + races, + constructors, + drivers, + } + return (
@@ -68,14 +76,11 @@ export default async function GroupSettings() { group member.

- +
- + + + ) From 4e542328bddec670871110059f3a5e2f4c3e4c26 Mon Sep 17 00:00:00 2001 From: Joschua <70809675+selfire1@users.noreply.github.com> Date: Sat, 8 Nov 2025 10:20:27 +1000 Subject: [PATCH 02/10] show full name of driver --- app/tipping/group-admin/_components/create-tip-dialog.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/tipping/group-admin/_components/create-tip-dialog.tsx b/app/tipping/group-admin/_components/create-tip-dialog.tsx index a0166cb..d15c76b 100644 --- a/app/tipping/group-admin/_components/create-tip-dialog.tsx +++ b/app/tipping/group-admin/_components/create-tip-dialog.tsx @@ -246,7 +246,9 @@ export default function CreateTipDialog({ getSearchValue={(driver) => [driver.givenName, driver.familyName].join(' ') } - renderItem={(driver) => driver.familyName} + renderItem={(driver) => + [driver.givenName, driver.familyName].join(' ') + } /> ) }} From 255ae74100bf8386f1635cfb3dfac9e04788dc0f Mon Sep 17 00:00:00 2001 From: Joschua <70809675+selfire1@users.noreply.github.com> Date: Sat, 8 Nov 2025 10:20:38 +1000 Subject: [PATCH 03/10] justify buttons between --- app/tipping/group-admin/_components/create-tip-dialog.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/tipping/group-admin/_components/create-tip-dialog.tsx b/app/tipping/group-admin/_components/create-tip-dialog.tsx index d15c76b..825942e 100644 --- a/app/tipping/group-admin/_components/create-tip-dialog.tsx +++ b/app/tipping/group-admin/_components/create-tip-dialog.tsx @@ -142,7 +142,7 @@ export default function CreateTipDialog({ )} -
+
diff --git a/db/schema/schema.ts b/db/schema/schema.ts index 98a0922..ee54adc 100644 --- a/db/schema/schema.ts +++ b/db/schema/schema.ts @@ -260,6 +260,7 @@ export type GroupId = Group['id'] export type GroupMember = typeof groupMembersTable.$inferSelect export type Race = typeof racesTable.$inferSelect +export type RaceId = Race['id'] export type InsertRace = typeof racesTable.$inferInsert export type Driver = typeof driversTable.$inferSelect @@ -279,3 +280,4 @@ export type Result = typeof resultsTable.$inferSelect export type InsertResult = typeof resultsTable.$inferInsert export type User = typeof user.$inferSelect +export type UserId = User['id'] From 8a809f7c04c1615e4b5186a42e695e5c7ae7bb9a Mon Sep 17 00:00:00 2001 From: Joschua <70809675+selfire1@users.noreply.github.com> Date: Sat, 8 Nov 2025 11:14:19 +1000 Subject: [PATCH 05/10] add sort by position --- app/tipping/group-admin/_components/columns.tsx | 12 +++++++++++- .../group-admin/_components/data-table.tsx | 16 ++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/app/tipping/group-admin/_components/columns.tsx b/app/tipping/group-admin/_components/columns.tsx index 086c7df..369dd48 100644 --- a/app/tipping/group-admin/_components/columns.tsx +++ b/app/tipping/group-admin/_components/columns.tsx @@ -8,6 +8,7 @@ import { getLabel } from '@/lib/utils/prediction-fields' import RowAction from './row-action' import { Button } from '@/components/ui/button' import { LucideArrowDown, LucideArrowUp, LucideArrowUpDown } from 'lucide-react' +import { RACE_PREDICTION_FIELDS } from '@/constants' export const columns: ColumnDef[] = [ { @@ -57,7 +58,16 @@ export const columns: ColumnDef[] = [ }, { accessorKey: 'position', - header: 'Position', + id: 'position', + // header: 'Position', + header: ({ column }) => , + sortingFn: (rowA, roB, columnId) => { + const fields = RACE_PREDICTION_FIELDS + return ( + fields.indexOf(roB.getValue(columnId)) - + fields.indexOf(rowA.getValue(columnId)) + ) + }, cell({ row: { original: { position }, diff --git a/app/tipping/group-admin/_components/data-table.tsx b/app/tipping/group-admin/_components/data-table.tsx index 26d21b7..872fdfc 100644 --- a/app/tipping/group-admin/_components/data-table.tsx +++ b/app/tipping/group-admin/_components/data-table.tsx @@ -9,6 +9,8 @@ import { getPaginationRowModel, SortingState, getSortedRowModel, + Row, + SortingFn, } from '@tanstack/react-table' import { Button } from '@/components/ui/button' @@ -20,6 +22,7 @@ import { TableHeader, TableRow, } from '@/components/ui/table' +import { RACE_PREDICTION_FIELDS } from '@/constants' interface DataTableProps { columns: ColumnDef[] @@ -39,6 +42,10 @@ export function DataTable({ id: 'user', desc: true, }, + { + id: 'position', + desc: true, + }, ]) const table = useReactTable({ @@ -130,4 +137,13 @@ export function DataTable({
) + function sortByPosition(): SortingFn { + const fields = RACE_PREDICTION_FIELDS + return (rowA: Row, rowB: Row, columnId: string) => { + return ( + fields.indexOf(rowA.getValue(columnId)) - + fields.indexOf(rowB.getValue(columnId)) + ) + } + } } From fe8306d992bda380be21d519c8223e91921996ce Mon Sep 17 00:00:00 2001 From: Joschua <70809675+selfire1@users.noreply.github.com> Date: Sat, 8 Nov 2025 11:21:48 +1000 Subject: [PATCH 06/10] break user combobox into component --- .../_components/create-edit-tip-dialog.tsx | 18 ++-------- .../group-admin/_components/select-user.tsx | 34 +++++++++++++++++++ app/tipping/group-admin/page.tsx | 12 +++++-- 3 files changed, 46 insertions(+), 18 deletions(-) create mode 100644 app/tipping/group-admin/_components/select-user.tsx diff --git a/app/tipping/group-admin/_components/create-edit-tip-dialog.tsx b/app/tipping/group-admin/_components/create-edit-tip-dialog.tsx index bb6c7da..07f477b 100644 --- a/app/tipping/group-admin/_components/create-edit-tip-dialog.tsx +++ b/app/tipping/group-admin/_components/create-edit-tip-dialog.tsx @@ -39,6 +39,7 @@ import { toast } from 'sonner' import Button from '@/components/button' import { formSchema, Schema } from '../_utils/schema' import { useRouter } from 'next/navigation' +import { SelectUser } from './select-user' type RaceOption = Pick< Database.Race, @@ -269,24 +270,11 @@ export default function CreateOrEditTipDialog({ label='Tipper' renderItem={({ field }) => { return ( - user.name} - placeholder='Search users…' - emptyText='Select a user' disabled={isEditing} - renderItem={(user) => ( -
- -

{user.name}

-
- )} /> ) }} diff --git a/app/tipping/group-admin/_components/select-user.tsx b/app/tipping/group-admin/_components/select-user.tsx new file mode 100644 index 0000000..9e74c52 --- /dev/null +++ b/app/tipping/group-admin/_components/select-user.tsx @@ -0,0 +1,34 @@ +import { Combobox } from '@/components/combobox' +import { FormField } from '@/components/ui/form' +import UserAvatar from '@/components/user-avatar' +import { Database } from '@/db/types' + +export function SelectUser({ + users, + value, + onSelect, + disabled = false, +}: { + users: Pick[] + value: Database.UserId + onSelect: (value: Database.UserId | undefined) => void + disabled?: boolean +}) { + return ( + user.name} + placeholder='Search users…' + emptyText='Select a user' + disabled={disabled} + renderItem={(user) => ( +
+ +

{user.name}

+
+ )} + /> + ) +} diff --git a/app/tipping/group-admin/page.tsx b/app/tipping/group-admin/page.tsx index 185e0c1..df5e12b 100644 --- a/app/tipping/group-admin/page.tsx +++ b/app/tipping/group-admin/page.tsx @@ -18,6 +18,7 @@ import CreateOrEditTipDialog, { TipFormData, } from './_components/create-edit-tip-dialog' import TipFormProvider from './_components/edit-tip-context' +import { Combobox } from '@/components/combobox' export default async function GroupSettings() { const { userId } = await verifySession() @@ -80,9 +81,14 @@ export default async function GroupSettings() { - - - +
+
+

Filters

+
+ + + +
) From c238bdec5b35a42cba225eb1761f8c2a09608593 Mon Sep 17 00:00:00 2001 From: Joschua <70809675+selfire1@users.noreply.github.com> Date: Sat, 8 Nov 2025 11:25:26 +1000 Subject: [PATCH 07/10] remove import --- app/tipping/group-admin/page.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/app/tipping/group-admin/page.tsx b/app/tipping/group-admin/page.tsx index df5e12b..a43eff4 100644 --- a/app/tipping/group-admin/page.tsx +++ b/app/tipping/group-admin/page.tsx @@ -18,7 +18,6 @@ import CreateOrEditTipDialog, { TipFormData, } from './_components/create-edit-tip-dialog' import TipFormProvider from './_components/edit-tip-context' -import { Combobox } from '@/components/combobox' export default async function GroupSettings() { const { userId } = await verifySession() From 7559675b115b09dcd78deb9b85281092fa71832e Mon Sep 17 00:00:00 2001 From: Joschua <70809675+selfire1@users.noreply.github.com> Date: Sat, 8 Nov 2025 11:26:07 +1000 Subject: [PATCH 08/10] remove todo button --- app/tipping/group-admin/_components/row-action.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/app/tipping/group-admin/_components/row-action.tsx b/app/tipping/group-admin/_components/row-action.tsx index 3bd74f1..a76114e 100644 --- a/app/tipping/group-admin/_components/row-action.tsx +++ b/app/tipping/group-admin/_components/row-action.tsx @@ -50,7 +50,6 @@ export default function RowAction({ row }: { row: PredictionRow }) { } /> - TODO: Delete ) From 14751136b127a693b09677818b0fa2eeba0da158 Mon Sep 17 00:00:00 2001 From: Joschua <70809675+selfire1@users.noreply.github.com> Date: Sat, 8 Nov 2025 11:31:57 +1000 Subject: [PATCH 09/10] up From b93d3d9fb0a4e899ba378ccc01f90a7c8a34b009 Mon Sep 17 00:00:00 2001 From: Joschua <70809675+selfire1@users.noreply.github.com> Date: Sat, 8 Nov 2025 11:34:56 +1000 Subject: [PATCH 10/10] up