Skip to content

Commit

Permalink
Merge pull request #77 from Ray-D-Song/tag-filter-by-folder
Browse files Browse the repository at this point in the history
feat: support filter tag by select folder
  • Loading branch information
banzhe authored Feb 24, 2025
2 parents 3b8717c + 80e4ef0 commit 8dc4363
Show file tree
Hide file tree
Showing 5 changed files with 63 additions and 4 deletions.
26 changes: 25 additions & 1 deletion packages/server/src/api/pages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { isNil, isNotNil, isNumberString } from '@web-archive/shared/utils'
import { z } from 'zod'
import type { HonoTypeUserInformation } from '~/constants/binding'
import result from '~/utils/result'
import { clearDeletedPage, deletePageById, getPageById, insertPage, queryDeletedPage, queryPage, queryPageByUrl, queryRecentSavePage, restorePage, selectPageTotalCount, updatePage } from '~/model/page'
import { clearDeletedPage, deletePageById, getPageById, insertPage, queryAllPageIds, queryDeletedPage, queryPage, queryPageByUrl, queryRecentSavePage, restorePage, selectPageTotalCount, updatePage } from '~/model/page'
import { getFolderById, restoreFolder } from '~/model/folder'
import { getFileFromBucket, saveFileToBucket } from '~/utils/file'
import { updateShowcase } from '~/model/showcase'
Expand Down Expand Up @@ -131,6 +131,30 @@ app.post(
},
)

app.post(
'/query_all_page_ids',
validator('json', (value, c) => {
const schema = z.object({
folderId: z.number({
message: 'Folder ID should be a number',
}),
})

const parsed = schema.safeParse(value)
if (!parsed.success) {
return c.json(result.error(400, parsed.error.errors[0].message))
}

return parsed.data
}),
async (c) => {
const { folderId } = c.req.valid('json')
const pages = await queryAllPageIds(c.env.DB, folderId)

return c.json(result.success(pages))
},
)

app.post(
'/query_by_url',
validator('json', (value, c) => {
Expand Down
9 changes: 9 additions & 0 deletions packages/server/src/model/page.ts
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,14 @@ async function updatePage(DB: D1Database, options: UpdatePageOptions) {
return result.every(r => r.success)
}

async function queryAllPageIds(DB: D1Database, folderId: number) {
const sql = `
SELECT id FROM pages WHERE folderId = ? AND isDeleted = 0
`
const result = await DB.prepare(sql).bind(folderId).all()
return result.results.map(r => r.id)
}

export {
selectPageTotalCount,
queryPage,
Expand All @@ -257,4 +265,5 @@ export {
queryRecentSavePage,
selectAllPageCount,
updatePage,
queryAllPageIds,
}
21 changes: 18 additions & 3 deletions packages/web/src/components/side-bar-tag-menu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,16 @@ import type { Tag } from '@web-archive/shared/types'
import { cn } from '@web-archive/shared/utils'
import { useRequest } from 'ahooks'
import { ChevronDown, Pencil, TagIcon, Trash } from 'lucide-react'
import { useContext, useState } from 'react'
import { useContext, useEffect, useState } from 'react'
import toast from 'react-hot-toast'
import { useTranslation } from 'react-i18next'
import EditTagDialog from './edit-tag-dialog'
import { deleteTag } from '~/data/tag'
import TagContext from '~/store/tag'
import { queryAllPageIds } from '~/data/page'

interface SidebarTagMenuProps {
selectedFolder: number | null
selectedTag: number | null
setSelectedTag: (tag: number | null) => void
}
Expand Down Expand Up @@ -61,7 +63,7 @@ function TagBadge({ tag, isSelected, onClick, onDelete, onEdit }: TagBadgeProps)
)
}

function SidebarTagMenu({ selectedTag, setSelectedTag }: SidebarTagMenuProps) {
function SidebarTagMenu({ selectedTag, setSelectedTag, selectedFolder }: SidebarTagMenuProps) {
const { t } = useTranslation()
const { tagCache: tags, refreshTagCache } = useContext(TagContext)
const [isTagsCollapseOpen, setIsTagsCollapseOpen] = useState(false)
Expand Down Expand Up @@ -92,6 +94,19 @@ function SidebarTagMenu({ selectedTag, setSelectedTag }: SidebarTagMenuProps) {
setEditTag(tag)
}

const [showTagList, setShowTagList] = useState(tags)
useEffect(() => {
if (!selectedFolder) {
setShowTagList(tags)
return
}
queryAllPageIds(selectedFolder).then((data) => {
const newTags = tags.filter((tag) => {
return tag.pageIds.some(pageId => data.includes(pageId))
})
setShowTagList(newTags)
})
}, [selectedFolder, tags])
return (
<SidebarMenu>
<EditTagDialog editTag={editTag} afterSubmit={refreshTagCache} open={editTagDialogOpen} setOpen={setEditTagDialogOpen}></EditTagDialog>
Expand All @@ -113,7 +128,7 @@ function SidebarTagMenu({ selectedTag, setSelectedTag }: SidebarTagMenuProps) {
onContextMenu={e => e.preventDefault()}
>
<div className="space-y-2">
{tags?.map(tag => (
{showTagList?.map(tag => (
<TagBadge
key={tag.id}
tag={tag}
Expand Down
1 change: 1 addition & 0 deletions packages/web/src/components/side-bar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ function Component({ selectedTag, setSelectedTag }: SidebarProps) {
<SidebarTagMenu
selectedTag={selectedTag}
setSelectedTag={setSelectedTag}
selectedFolder={openedFolder}
>
</SidebarTagMenu>
</ScrollArea>
Expand Down
10 changes: 10 additions & 0 deletions packages/web/src/data/page.ts
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,15 @@ function getRecentSavePage(): Promise<Page[]> {
})
}

function queryAllPageIds(folderId: number): Promise<number[]> {
return fetcher<number[]>('/pages/query_all_page_ids', {
method: 'POST',
body: {
folderId,
},
})
}

export {
getPageDetail,
deletePage,
Expand All @@ -116,4 +125,5 @@ export {
updatePageShowcase,
getPageScreenshot,
getRecentSavePage,
queryAllPageIds,
}

0 comments on commit 8dc4363

Please sign in to comment.