From 4eb483c0498e776a03a40b9822d4abaced1a1992 Mon Sep 17 00:00:00 2001 From: miteruzo Date: Thu, 16 Jul 2026 00:24:24 +0900 Subject: [PATCH] #399 --- frontend/src/components/TopNav.tsx | 16 +++++++--------- frontend/src/lib/postImportStorage.ts | 6 +++--- .../src/pages/posts/PostImportResultPage.tsx | 2 +- .../src/pages/posts/PostImportReviewPage.tsx | 2 +- 4 files changed, 12 insertions(+), 14 deletions(-) diff --git a/frontend/src/components/TopNav.tsx b/frontend/src/components/TopNav.tsx index fe9cdd9..db5adcd 100644 --- a/frontend/src/components/TopNav.tsx +++ b/frontend/src/components/TopNav.tsx @@ -9,6 +9,7 @@ import TopNavUser from '@/components/TopNavUser' import { WikiIdBus } from '@/lib/eventBus/WikiIdBus' import { materialsKeys, tagsKeys, wikiKeys } from '@/lib/queryKeys' import { useClientBehaviourSettings } from '@/lib/useClientBehaviourSettings' +import { canEditContent } from '@/lib/users' import { fetchTag, fetchTagByName } from '@/lib/tags' import { fetchMaterial } from '@/lib/materials' import { cn } from '@/lib/utils' @@ -30,6 +31,7 @@ export const menuOutline = ( pathName: string }, ): Menu => { const postCount = tag?.postCount ?? material?.tag?.postCount ?? 0 + const editable = canEditContent (user) const wikiPageFlg = Boolean (/^\/wiki\/(?!new|changes)[^/]+/.test (pathName) && wikiId) const wikiTitle = pathName.split ('/')[2] ?? '' @@ -42,10 +44,8 @@ export const menuOutline = ( { name: '広場', to: '/posts', subMenu: [ { name: '一覧', to: '/posts' }, { name: '検索', to: '/posts/search' }, - { name: '追加', to: '/posts/new', - visible: ['admin', 'member'].includes (user?.role) }, - { name: '取込', to: '/posts/import', - visible: ['admin', 'member'].includes (user?.role) }, + { name: '追加', to: '/posts/new', visible: editable }, + { name: '取込', to: '/posts/import', visible: editable }, { name: '全体履歴', to: '/posts/changes' }, { name: 'ヘルプ', to: '/wiki/ヘルプ:広場' }] }, { name: 'タグ', to: '/tags', subMenu: [ @@ -61,8 +61,7 @@ export const menuOutline = ( visible: tagFlg && tag?.category !== 'nico' }] }, { name: '素材', to: '/materials', visible: true, subMenu: [ { name: '一覧', to: '/materials' }, - { name: '追加', to: '/materials/new', - visible: ['admin', 'member'].includes (user?.role) }, + { name: '追加', to: '/materials/new', visible: editable }, { name: '抑止', to: '/materials/suppressions', visible: user?.role === 'admin' }, { name: '全体履歴', to: '/materials/changes' }, @@ -75,8 +74,7 @@ export const menuOutline = ( visible: materialFlg }] }, { name: 'Wiki', to: '/wiki/ヘルプ:ホーム', base: '/wiki', subMenu: [ { name: '検索', to: '/wiki' }, - { name: '新規', to: '/wiki/new', - visible: ['member', 'admin'].includes (user?.role) }, + { name: '新規', to: '/wiki/new', visible: editable }, { name: '全体履歴', to: '/wiki/changes' }, { name: 'ヘルプ', to: '/wiki/ヘルプ:Wiki' }, { component: , visible: wikiPageFlg }, @@ -84,7 +82,7 @@ export const menuOutline = ( visible: wikiPageFlg }, { name: '履歴', to: `/wiki/changes?id=${ wikiId }`, visible: wikiPageFlg }, { name: '編輯', to: `/wiki/${ wikiId || wikiTitle }/edit`, - visible: wikiPageFlg && ['admin', 'member'].includes (user?.role) }] }, + visible: wikiPageFlg && editable }] }, { name: 'おたのしみ', visible: false, subMenu: [ { name: '上映会 (β)', to: '/theatres/1' }, { name: 'グカネータ (β)', to: '/gekanator' }] }, diff --git a/frontend/src/lib/postImportStorage.ts b/frontend/src/lib/postImportStorage.ts index 30fba58..360963a 100644 --- a/frontend/src/lib/postImportStorage.ts +++ b/frontend/src/lib/postImportStorage.ts @@ -223,7 +223,7 @@ const sanitiseRow = (value: unknown): PostImportRow | null => { value.importErrors == null ? undefined : ensureStringListRecord (value.importErrors) - if (value.importErrors != null && importErrors == null) + if (importErrors === null) return null if (!(Array.isArray (value.baseWarnings)) || !(value.baseWarnings.every (_1 => typeof _1 === 'string'))) @@ -261,14 +261,14 @@ const sanitiseRow = (value: unknown): PostImportRow | null => { provenance: value.provenance as Record, tagSources: value.tagSources as Record | undefined, status: value.status, - skipReason: value.skipReason, + skipReason: value.skipReason ?? undefined, existingPostId: isPositiveInteger (value.existingPostId) ? Number (value.existingPostId) : undefined, metadataUrl: typeof value.metadataUrl === 'string' ? value.metadataUrl : undefined, resetSnapshot, createdPostId: isPositiveInteger (value.createdPostId) ? Number (value.createdPostId) : undefined, - importStatus: value.importStatus } + importStatus: value.importStatus ?? undefined } } diff --git a/frontend/src/pages/posts/PostImportResultPage.tsx b/frontend/src/pages/posts/PostImportResultPage.tsx index 5124e3b..9045161 100644 --- a/frontend/src/pages/posts/PostImportResultPage.tsx +++ b/frontend/src/pages/posts/PostImportResultPage.tsx @@ -123,7 +123,7 @@ const PostImportResultPage: FC = ({ user }) => { row.status === 'failed' && row.recoverable && Object.keys (row.errors ?? { }).length > 0) - const nextRows = mergedRows.map (row => { + const nextRows = mergedRows.map ((row): PostImportRow => { const recoverable = recoverableRows.find (_1 => _1.sourceRow === row.sourceRow) if (recoverable == null) return row diff --git a/frontend/src/pages/posts/PostImportReviewPage.tsx b/frontend/src/pages/posts/PostImportReviewPage.tsx index 2342ac6..207694c 100644 --- a/frontend/src/pages/posts/PostImportReviewPage.tsx +++ b/frontend/src/pages/posts/PostImportReviewPage.tsx @@ -234,7 +234,7 @@ const PostImportReviewPage: FC = ({ user }) => { row.status === 'failed' && row.recoverable && Object.keys (row.errors ?? { }).length > 0) - const nextRows = mergedResults.map (row => { + const nextRows = mergedResults.map ((row): PostImportRow => { const recoverable = recoverableRows.find (rr => rr.sourceRow === row.sourceRow) if (recoverable == null) return row