[]>(
+ () => [
+ {
+ accessorKey: "id",
+ header: "ID",
+ size: 250,
+ cell: ({ row }) => (
+
+ {row.getValue("id")}
+
+ ),
+ },
+ {
+ accessorKey: "lot_number",
+ header: ({ column }) => (
+
+ ),
+ size: 250,
+ enableColumnFilter: true,
+ enableSorting: false,
+ },
+ {
+ accessorKey: "flavor",
+ header: ({ column }) => (
+
+ ),
+ size: 250,
+ enableColumnFilter: true,
+ enableSorting: false,
+ cell: ({ row }) => {
+ const flavor = row.getValue("flavor") as string
+ return
+ },
+ },
+ {
+ accessorKey: "created_at",
+ header: ({ column }) => (
+
+ ),
+ size: 150,
+ enableSorting: true,
+ enableColumnFilter: false,
+ cell: ({ row }) => {
+ const dateCreated = row.getValue("created_at") as Date
+ return {new Date(dateCreated).toLocaleDateString()}
+ },
+ },
+
+ {
+ accessorKey: "actions",
+ header: "Actions",
+ size: 60,
+ cell: ({ row }) => {
+ const item = row.original
+ return (
+
+
+
+
+
+ Actions
+
+ {
+ setEditOpen(true)
+ setEntity(item)
+ }}
+ disabled={!userPerms.contains(PERM_UPDATE)}
+ className="cursor-pointer"
+ >
+ Edit
+
+ {
+ setDeleteOpen(true)
+ setEntity(item)
+ }}
+ disabled={!userPerms.contains(PERM_DELETE)}
+ className="cursor-pointer"
+ >
+ Delete
+
+
+
+ )
+ },
+ },
+ ],
+ [userPerms]
+ )
+
+ // eslint-disable-next-line react-hooks/incompatible-library
+ const table = useReactTable({
+ data: rows,
+ columns,
+ pageCount,
+ state: { pagination, sorting, columnFilters },
+ onPaginationChange: setPagination,
+ onSortingChange: setSorting,
+ onColumnFiltersChange: setColumnFilters,
+ getCoreRowModel: getCoreRowModel(),
+ manualPagination: true,
+ manualSorting: true,
+ manualFiltering: true,
+ })
+
+ useEffect(() => {
+ if (!editOpen && !deleteOpen) setEntity(null)
+ }, [editOpen, deleteOpen])
+
+ async function deleteEntity(id: string) {
+ const res = await fetch(`${API_PATH}/${id}`, {
+ method: "DELETE",
+ })
+ if (res.ok) {
+ refetch()
+ } else {
+ const data = await res.json()
+ setDeleteError(data.error)
+ }
+ }
+
+ const displayName = entity?.[DISPLAY_PROP] as string | undefined
+ const entityTitle = displayName ?? ENTITY_NAME
+
+ return (
+ <>
+
+
+ {error ? (
+ {error.message}
+ ) : (
+
+
+ {deleteError && (
+
{deleteError}
+ )}
+
+
+
+
+
+ {table.getHeaderGroups().map((headerGroup) => (
+
+ {headerGroup.headers.map((header) => (
+
+ header.column.getToggleSortingHandler()
+ }
+ className={
+ header.column.getCanSort()
+ ? "cursor-pointer select-none"
+ : ""
+ }
+ >
+ {header.isPlaceholder
+ ? null
+ : flexRender(
+ header.column.columnDef.header,
+ header.getContext()
+ )}
+
+ ))}
+
+ ))}
+
+
+ {isLoading ? (
+
+ ) : (
+ table.getRowModel().rows.map((row) => (
+
+ {row.getVisibleCells().map((cell) => (
+
+ {flexRender(
+ cell.column.columnDef.cell,
+ cell.getContext()
+ )}
+
+ ))}
+
+ ))
+ )}
+
+
+
+
+
table.setPageIndex(p)}
+ pageSize={pagination.pageSize}
+ onPageSizeChange={(s) => table.setPageSize(s)}
+ />
+
+
+ )}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ )
}
diff --git a/frontend/components/pages/flavors.tsx b/frontend/components/pages/flavors.tsx
--- a/frontend/components/pages/flavors.tsx
+++ b/frontend/components/pages/flavors.tsx
@@ -67,8 +67,12 @@
}
function IngredientCell({ flavorId }: { flavorId: string }) {
- const { data: flavor, isLoading } = useQuery({
- queryKey: ["flavor", flavorId],
+ const {
+ data: ingredients,
+ isLoading,
+ error,
+ } = useQuery({
+ queryKey: ["flavor", flavorId, "ingredients"],
queryFn: async () => {
const res = await fetch(`/api/flavors/${flavorId}/ingredients`)
return res.json()
@@ -77,11 +81,17 @@
})
if (isLoading) return Loading...
- if (!flavor) return Unknown
+ if (!ingredients || !Array.isArray(ingredients)) {
+ console.log(ingredients)
+
+ return (
+ {error?.toString() || "Unknown"}
+ )
+ }
return (
- {flavor.map((f_is: { id: string; name: string }) => (
+ {ingredients.map((f_is: { id: string; name: string }) => (
{f_is.name}
))}