New feature: edit bookmark category position in category table

master
TZGyn 2 years ago
parent f916144929
commit 73920ed164
Signed by: TZGyn
GPG Key ID: 122EAF77AE81FD4A

@ -8,14 +8,18 @@ import {
TableRow, TableRow,
TableCell, TableCell,
Tooltip, Tooltip,
Select,
SelectItem,
Selection,
} from '@nextui-org/react' } from '@nextui-org/react'
import { DeleteIcon, EditIcon } from '@/components/icons' import { DeleteIcon, EditIcon } from '@/components/icons'
import { BookmarkCategoryWithBookmarks } from '@/types' import { BookmarkCategory, BookmarkCategoryWithBookmarks } from '@/types'
import { useRouter } from 'next/navigation' import { useRouter } from 'next/navigation'
const columns = [ const columns = [
{ name: 'NAME', uid: 'name' }, { name: 'NAME', uid: 'name' },
{ name: 'POSITION', uid: 'position' },
{ name: 'BOOKMARK COUNT', uid: 'bookmarkcount' }, { name: 'BOOKMARK COUNT', uid: 'bookmarkcount' },
{ name: 'ACTIONS', uid: 'actions' }, { name: 'ACTIONS', uid: 'actions' },
] ]
@ -41,6 +45,26 @@ export default function TableComponent({
return return
} }
const updateCategory = async (
bookmark_category: BookmarkCategory,
position: Selection
) => {
if (position === 'all') return
const body = {
...bookmark_category,
position: parseInt(position.values().next().value),
}
await fetch('/api/bookmark_category', {
method: 'PATCH',
body: JSON.stringify(body),
})
router.refresh()
return
}
return ( return (
<> <>
<Table> <Table>
@ -52,32 +76,51 @@ export default function TableComponent({
)} )}
</TableHeader> </TableHeader>
<TableBody items={bookmarkCategories}> <TableBody items={bookmarkCategories}>
{(item) => ( {(item) => {
<TableRow key={item.id}> const { bookmark: _, ...category } = item
<TableCell>{item.name}</TableCell> return (
<TableCell>{item.bookmark.length}</TableCell> <TableRow key={item.id}>
<TableCell> <TableCell>{item.name}</TableCell>
<div className='relative flex items-center gap-2'> <TableCell>
<Tooltip content='Edit Category'> <Select
<span className='cursor-pointer text-lg text-default-400 active:opacity-50'> placeholder='Select position'
<EditIcon /> selectedKeys={item.position.toString()}
</span> onSelectionChange={(key) => {
</Tooltip> updateCategory(category, key)
<Tooltip }}>
color='danger' {bookmarkCategories.map((_, index) => (
content='Delete Category'> <SelectItem
<span key={index + 1}
className='cursor-pointer text-lg text-danger active:opacity-50' value={index + 1}>
onClick={() => {(index + 1).toString()}
deleteCategory(item.id) </SelectItem>
}> ))}
<DeleteIcon /> </Select>
</span> </TableCell>
</Tooltip> <TableCell>{item.bookmark.length}</TableCell>
</div> <TableCell>
</TableCell> <div className='relative flex items-center gap-2'>
</TableRow> <Tooltip content='Edit Category'>
)} <span className='cursor-pointer text-lg text-default-400 active:opacity-50'>
<EditIcon />
</span>
</Tooltip>
<Tooltip
color='danger'
content='Delete Category'>
<span
className='cursor-pointer text-lg text-danger active:opacity-50'
onClick={() =>
deleteCategory(item.id)
}>
<DeleteIcon />
</span>
</Tooltip>
</div>
</TableCell>
</TableRow>
)
}}
</TableBody> </TableBody>
</Table> </Table>
</> </>

@ -26,6 +26,7 @@ export type Bookmark = z.infer<typeof bookmarkSchema>
const bookmarkCategory = { const bookmarkCategory = {
name: z.string().nonempty(), name: z.string().nonempty(),
position: z.number(),
} }
export const newBookmarkCategorySchema = z.object({ export const newBookmarkCategorySchema = z.object({
@ -42,6 +43,7 @@ export type BookmarkCategory = z.infer<typeof bookmarkCategorySchema>
export const bookmarkCategoryWithBookmarksSchema = z.object({ export const bookmarkCategoryWithBookmarksSchema = z.object({
id: z.number(), id: z.number(),
userId: z.number(),
...bookmarkCategory, ...bookmarkCategory,
bookmark: bookmarkSchema.array(), bookmark: bookmarkSchema.array(),
}) })

Loading…
Cancel
Save