Skip to content

Commit 8dc4363

Browse files
authored
Merge pull request #77 from Ray-D-Song/tag-filter-by-folder
feat: support filter tag by select folder
2 parents 3b8717c + 80e4ef0 commit 8dc4363

File tree

5 files changed

+63
-4
lines changed

5 files changed

+63
-4
lines changed

packages/server/src/api/pages.ts

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { isNil, isNotNil, isNumberString } from '@web-archive/shared/utils'
44
import { z } from 'zod'
55
import type { HonoTypeUserInformation } from '~/constants/binding'
66
import result from '~/utils/result'
7-
import { clearDeletedPage, deletePageById, getPageById, insertPage, queryDeletedPage, queryPage, queryPageByUrl, queryRecentSavePage, restorePage, selectPageTotalCount, updatePage } from '~/model/page'
7+
import { clearDeletedPage, deletePageById, getPageById, insertPage, queryAllPageIds, queryDeletedPage, queryPage, queryPageByUrl, queryRecentSavePage, restorePage, selectPageTotalCount, updatePage } from '~/model/page'
88
import { getFolderById, restoreFolder } from '~/model/folder'
99
import { getFileFromBucket, saveFileToBucket } from '~/utils/file'
1010
import { updateShowcase } from '~/model/showcase'
@@ -131,6 +131,30 @@ app.post(
131131
},
132132
)
133133

134+
app.post(
135+
'/query_all_page_ids',
136+
validator('json', (value, c) => {
137+
const schema = z.object({
138+
folderId: z.number({
139+
message: 'Folder ID should be a number',
140+
}),
141+
})
142+
143+
const parsed = schema.safeParse(value)
144+
if (!parsed.success) {
145+
return c.json(result.error(400, parsed.error.errors[0].message))
146+
}
147+
148+
return parsed.data
149+
}),
150+
async (c) => {
151+
const { folderId } = c.req.valid('json')
152+
const pages = await queryAllPageIds(c.env.DB, folderId)
153+
154+
return c.json(result.success(pages))
155+
},
156+
)
157+
134158
app.post(
135159
'/query_by_url',
136160
validator('json', (value, c) => {

packages/server/src/model/page.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,14 @@ async function updatePage(DB: D1Database, options: UpdatePageOptions) {
243243
return result.every(r => r.success)
244244
}
245245

246+
async function queryAllPageIds(DB: D1Database, folderId: number) {
247+
const sql = `
248+
SELECT id FROM pages WHERE folderId = ? AND isDeleted = 0
249+
`
250+
const result = await DB.prepare(sql).bind(folderId).all()
251+
return result.results.map(r => r.id)
252+
}
253+
246254
export {
247255
selectPageTotalCount,
248256
queryPage,
@@ -257,4 +265,5 @@ export {
257265
queryRecentSavePage,
258266
selectAllPageCount,
259267
updatePage,
268+
queryAllPageIds,
260269
}

packages/web/src/components/side-bar-tag-menu.tsx

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,16 @@ import type { Tag } from '@web-archive/shared/types'
66
import { cn } from '@web-archive/shared/utils'
77
import { useRequest } from 'ahooks'
88
import { ChevronDown, Pencil, TagIcon, Trash } from 'lucide-react'
9-
import { useContext, useState } from 'react'
9+
import { useContext, useEffect, useState } from 'react'
1010
import toast from 'react-hot-toast'
1111
import { useTranslation } from 'react-i18next'
1212
import EditTagDialog from './edit-tag-dialog'
1313
import { deleteTag } from '~/data/tag'
1414
import TagContext from '~/store/tag'
15+
import { queryAllPageIds } from '~/data/page'
1516

1617
interface SidebarTagMenuProps {
18+
selectedFolder: number | null
1719
selectedTag: number | null
1820
setSelectedTag: (tag: number | null) => void
1921
}
@@ -61,7 +63,7 @@ function TagBadge({ tag, isSelected, onClick, onDelete, onEdit }: TagBadgeProps)
6163
)
6264
}
6365

64-
function SidebarTagMenu({ selectedTag, setSelectedTag }: SidebarTagMenuProps) {
66+
function SidebarTagMenu({ selectedTag, setSelectedTag, selectedFolder }: SidebarTagMenuProps) {
6567
const { t } = useTranslation()
6668
const { tagCache: tags, refreshTagCache } = useContext(TagContext)
6769
const [isTagsCollapseOpen, setIsTagsCollapseOpen] = useState(false)
@@ -92,6 +94,19 @@ function SidebarTagMenu({ selectedTag, setSelectedTag }: SidebarTagMenuProps) {
9294
setEditTag(tag)
9395
}
9496

97+
const [showTagList, setShowTagList] = useState(tags)
98+
useEffect(() => {
99+
if (!selectedFolder) {
100+
setShowTagList(tags)
101+
return
102+
}
103+
queryAllPageIds(selectedFolder).then((data) => {
104+
const newTags = tags.filter((tag) => {
105+
return tag.pageIds.some(pageId => data.includes(pageId))
106+
})
107+
setShowTagList(newTags)
108+
})
109+
}, [selectedFolder, tags])
95110
return (
96111
<SidebarMenu>
97112
<EditTagDialog editTag={editTag} afterSubmit={refreshTagCache} open={editTagDialogOpen} setOpen={setEditTagDialogOpen}></EditTagDialog>
@@ -113,7 +128,7 @@ function SidebarTagMenu({ selectedTag, setSelectedTag }: SidebarTagMenuProps) {
113128
onContextMenu={e => e.preventDefault()}
114129
>
115130
<div className="space-y-2">
116-
{tags?.map(tag => (
131+
{showTagList?.map(tag => (
117132
<TagBadge
118133
key={tag.id}
119134
tag={tag}

packages/web/src/components/side-bar.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ function Component({ selectedTag, setSelectedTag }: SidebarProps) {
7474
<SidebarTagMenu
7575
selectedTag={selectedTag}
7676
setSelectedTag={setSelectedTag}
77+
selectedFolder={openedFolder}
7778
>
7879
</SidebarTagMenu>
7980
</ScrollArea>

packages/web/src/data/page.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,15 @@ function getRecentSavePage(): Promise<Page[]> {
105105
})
106106
}
107107

108+
function queryAllPageIds(folderId: number): Promise<number[]> {
109+
return fetcher<number[]>('/pages/query_all_page_ids', {
110+
method: 'POST',
111+
body: {
112+
folderId,
113+
},
114+
})
115+
}
116+
108117
export {
109118
getPageDetail,
110119
deletePage,
@@ -116,4 +125,5 @@ export {
116125
updatePageShowcase,
117126
getPageScreenshot,
118127
getRecentSavePage,
128+
queryAllPageIds,
119129
}

0 commit comments

Comments
 (0)