This commit is contained in:
2025-08-23 18:01:23 +09:00
parent d5ff17074f
commit e79688783e
28 changed files with 126 additions and 131 deletions
+17 -17
View File
@@ -65,30 +65,30 @@ export default () => {
switch (status) switch (status)
{ {
case 503: case 503:
return <ServiceUnavailable /> return <ServiceUnavailable/>
} }
return ( return (
<BrowserRouter> <BrowserRouter>
<div className="flex flex-col h-screen w-screen"> <div className="flex flex-col h-screen w-screen">
<TopNav user={user} /> <TopNav user={user}/>
<Routes> <Routes>
<Route path="/" element={<Navigate to="/posts" replace />} /> <Route path="/" element={<Navigate to="/posts" replace/>}/>
<Route path="/posts" element={<PostListPage />} /> <Route path="/posts" element={<PostListPage/>}/>
<Route path="/posts/new" element={<PostNewPage user={user} />} /> <Route path="/posts/new" element={<PostNewPage user={user}/>}/>
<Route path="/posts/:id" element={<PostDetailPage user={user} />} /> <Route path="/posts/:id" element={<PostDetailPage user={user}/>}/>
<Route path="/tags/nico" element={<NicoTagListPage user={user} />} /> <Route path="/tags/nico" element={<NicoTagListPage user={user}/>}/>
<Route path="/wiki" element={<WikiSearchPage />} /> <Route path="/wiki" element={<WikiSearchPage/>}/>
<Route path="/wiki/:title" element={<WikiDetailPage />} /> <Route path="/wiki/:title" element={<WikiDetailPage/>}/>
<Route path="/wiki/new" element={<WikiNewPage user={user} />} /> <Route path="/wiki/new" element={<WikiNewPage user={user}/>}/>
<Route path="/wiki/:id/edit" element={<WikiEditPage user={user} />} /> <Route path="/wiki/:id/edit" element={<WikiEditPage user={user}/>}/>
<Route path="/wiki/:id/diff" element={<WikiDiffPage />} /> <Route path="/wiki/:id/diff" element={<WikiDiffPage/>}/>
<Route path="/wiki/changes" element={<WikiHistoryPage />} /> <Route path="/wiki/changes" element={<WikiHistoryPage/>}/>
<Route path="/users/settings" element={<SettingPage user={user} setUser={setUser} />} /> <Route path="/users/settings" element={<SettingPage user={user} setUser={setUser}/>}/>
<Route path="/settings" element={<Navigate to="/users/settings" replace />} /> <Route path="/settings" element={<Navigate to="/users/settings" replace/>}/>
<Route path="*" element={<NotFound />} /> <Route path="*" element={<NotFound/>}/>
</Routes> </Routes>
</div> </div>
<Toaster /> <Toaster/>
</BrowserRouter>) </BrowserRouter>)
} }
+2 -2
View File
@@ -39,7 +39,7 @@ export default ({ status }: Props) => {
return ( return (
<MainArea> <MainArea>
<Helmet> <Helmet>
<meta name="robots" content="noindex" /> <meta name="robots" content="noindex"/>
<title>{title} | {SITE_TITLE}</title> <title>{title} | {SITE_TITLE}</title>
</Helmet> </Helmet>
<div className="text-6xl font-bold text-transparent <div className="text-6xl font-bold text-transparent
@@ -50,7 +50,7 @@ export default ({ status }: Props) => {
<p>{status}</p> <p>{status}</p>
<div className="flex flex-row space-x-1 sm:space-x-2 md:space-x-4"> <div className="flex flex-row space-x-1 sm:space-x-2 md:space-x-4">
<p style={{ writingMode: 'vertical-rl' }}>{leftMsg}</p> <p style={{ writingMode: 'vertical-rl' }}>{leftMsg}</p>
<img className="max-w-[70vw]" src={errorImg} alt="逃げたギター" /> <img className="max-w-[70vw]" src={errorImg} alt="逃げたギター"/>
<p style={{ writingMode: 'vertical-rl' }}>{rightMsg}</p> <p style={{ writingMode: 'vertical-rl' }}>{rightMsg}</p>
</div> </div>
<p className="mr-[-.5em]">{message}</p> <p className="mr-[-.5em]">{message}</p>
+1 -1
View File
@@ -2,5 +2,5 @@ export default () => (
<> <>
<span className="hidden md:inline flex items-center px-2">|</span> <span className="hidden md:inline flex items-center px-2">|</span>
<hr className="block md:hidden w-full opacity-25 <hr className="block md:hidden w-full opacity-25
border-t border-black dark:border-white" /> border-t border-black dark:border-white"/>
</>) </>)
+1 -1
View File
@@ -107,5 +107,5 @@ export default (props: Props) => {
height={height} height={height}
style={margedStyle} style={margedStyle}
allowFullScreen allowFullScreen
allow="autoplay" />) allow="autoplay"/>)
} }
+2 -2
View File
@@ -39,14 +39,14 @@ export default ({ post, onSave }: Props) => {
<input type="text" <input type="text"
className="w-full border rounded p-2" className="w-full border rounded p-2"
value={title} value={title}
onChange={e => setTitle (e.target.value)} /> onChange={e => setTitle (e.target.value)}/>
</div> </div>
{/* タグ */} {/* タグ */}
<div> <div>
<label className="block font-semibold"></label> <label className="block font-semibold"></label>
<TextArea value={tags} <TextArea value={tags}
onChange={ev => setTags (ev.target.value)} /> onChange={ev => setTags (ev.target.value)}/>
</div> </div>
{/* 送信 */} {/* 送信 */}
+2 -2
View File
@@ -46,14 +46,14 @@ export default ({ post }: Props) => {
return ( return (
<SidebarComponent> <SidebarComponent>
<TagSearch /> <TagSearch/>
{CATEGORIES.map ((cat: Category) => cat in tags && ( {CATEGORIES.map ((cat: Category) => cat in tags && (
<div className="my-3" key={cat}> <div className="my-3" key={cat}>
<SubsectionTitle>{categoryNames[cat]}</SubsectionTitle> <SubsectionTitle>{categoryNames[cat]}</SubsectionTitle>
<ul> <ul>
{tags[cat].map ((tag, i) => ( {tags[cat].map ((tag, i) => (
<li key={i} className="mb-1"> <li key={i} className="mb-1">
<TagLink tag={tag} /> <TagLink tag={tag}/>
</li>))} </li>))}
</ul> </ul>
</div>))} </div>))}
+2 -2
View File
@@ -93,10 +93,10 @@ const TagSearch: React.FC = () => {
onFocus={() => setSuggestionsVsbl (true)} onFocus={() => setSuggestionsVsbl (true)}
onBlur={() => setSuggestionsVsbl (false)} onBlur={() => setSuggestionsVsbl (false)}
onKeyDown={handleKeyDown} onKeyDown={handleKeyDown}
className="w-full px-3 py-2 border rounded dark:border-gray-600 dark:bg-gray-800 dark:text-white" /> className="w-full px-3 py-2 border rounded dark:border-gray-600 dark:bg-gray-800 dark:text-white"/>
<TagSearchBox suggestions={suggestionsVsbl && suggestions.length ? suggestions : [] as Tag[]} <TagSearchBox suggestions={suggestionsVsbl && suggestions.length ? suggestions : [] as Tag[]}
activeIndex={activeIndex} activeIndex={activeIndex}
onSelect={handleTagSelect} /> onSelect={handleTagSelect}/>
</div>) </div>)
} }
+2 -2
View File
@@ -58,14 +58,14 @@ export default ({ posts }: Props) => {
return ( return (
<SidebarComponent> <SidebarComponent>
<TagSearch /> <TagSearch/>
<div className={cn (!(tagsVsbl) && 'hidden', 'md:block mt-4')}> <div className={cn (!(tagsVsbl) && 'hidden', 'md:block mt-4')}>
<SectionTitle></SectionTitle> <SectionTitle></SectionTitle>
<ul> <ul>
{CATEGORIES.flatMap (cat => cat in tags ? ( {CATEGORIES.flatMap (cat => cat in tags ? (
tags[cat].map (tag => ( tags[cat].map (tag => (
<li key={tag.id} className="mb-1"> <li key={tag.id} className="mb-1">
<TagLink tag={tag} /> <TagLink tag={tag}/>
</li>))) : [])} </li>))) : [])}
</ul> </ul>
<SectionTitle></SectionTitle> <SectionTitle></SectionTitle>
+5 -5
View File
@@ -41,7 +41,7 @@ export default ({ user }: Props) => {
{ name: '新規', to: '/wiki/new' }, { name: '新規', to: '/wiki/new' },
{ name: '全体履歴', to: '/wiki/changes' }, { name: '全体履歴', to: '/wiki/changes' },
{ name: 'ヘルプ', to: '/wiki/ヘルプ:Wiki' }, { name: 'ヘルプ', to: '/wiki/ヘルプ:Wiki' },
{ component: <Separator />, visible: wikiPageFlg }, { component: <Separator/>, visible: wikiPageFlg },
{ name: `広場 (${ postCount || 0 })`, to: `/posts?tags=${ wikiTitle }`, { name: `広場 (${ postCount || 0 })`, to: `/posts?tags=${ wikiTitle }`,
visible: wikiPageFlg }, visible: wikiPageFlg },
{ name: '履歴', to: `/wiki/changes?id=${ wikiId }`, visible: wikiPageFlg }, { name: '履歴', to: `/wiki/changes?id=${ wikiId }`, visible: wikiPageFlg },
@@ -108,7 +108,7 @@ export default ({ user }: Props) => {
))} ))}
</div> </div>
<TopNavUser user={user} /> <TopNavUser user={user}/>
<a href="#" <a href="#"
className="md:hidden ml-auto pr-4 className="md:hidden ml-auto pr-4
@@ -136,7 +136,7 @@ export default ({ user }: Props) => {
<div className={cn (menuOpen ? 'flex flex-col md:hidden' : 'hidden', <div className={cn (menuOpen ? 'flex flex-col md:hidden' : 'hidden',
'bg-yellow-200 dark:bg-red-975 items-start')}> 'bg-yellow-200 dark:bg-red-975 items-start')}>
<Separator /> <Separator/>
{menu.map ((item, i) => ( {menu.map ((item, i) => (
<Fragment key={i}> <Fragment key={i}>
<Link to={i === openItemIdx ? item.to : '#'} <Link to={i === openItemIdx ? item.to : '#'}
@@ -163,8 +163,8 @@ export default ({ user }: Props) => {
{subItem.name} {subItem.name}
</Link>)))} </Link>)))}
</Fragment>))} </Fragment>))}
<TopNavUser user={user} sp /> <TopNavUser user={user} sp/>
<Separator /> <Separator/>
</div> </div>
</>) </>)
} }
+1 -1
View File
@@ -21,7 +21,7 @@ export default ({ user, sp }: Props) => {
return ( return (
<> <>
{sp && <Separator />} {sp && <Separator/>}
<Link to="/users/settings" <Link to="/users/settings"
className={className}> className={className}>
{user.name || '名もなきニジラー'} {user.name || '名もなきニジラー'}
+1 -1
View File
@@ -21,7 +21,7 @@ export default ({ children, checkBox }: Props) => {
<label className="flex items-center block gap-1"> <label className="flex items-center block gap-1">
<input type="checkbox" <input type="checkbox"
checked={checkBox.checked} checked={checkBox.checked}
onChange={checkBox.onChange} /> onChange={checkBox.onChange}/>
{checkBox.label} {checkBox.label}
</label> </label>
</div>) </div>)
+1 -1
View File
@@ -7,4 +7,4 @@ type Props = { value?: string
export default ({ value, onChange }: Props) => ( export default ({ value, onChange }: Props) => (
<textarea className="rounded border w-full p-2 h-32" <textarea className="rounded border w-full p-2 h-32"
value={value} value={value}
onChange={onChange} />) onChange={onChange}/>)
@@ -51,7 +51,7 @@ export default ({ visible, onVisibleChange, setUser }: Props) => {
<div className="flex gap-2"> <div className="flex gap-2">
<Input placeholder="引継ぎコードを入力" <Input placeholder="引継ぎコードを入力"
value={inputCode} value={inputCode}
onChange={ev => setInputCode (ev.target.value)} /> onChange={ev => setInputCode (ev.target.value)}/>
<Button onClick={handleTransfer}></Button> <Button onClick={handleTransfer}></Button>
</div> </div>
</DialogContent> </DialogContent>
+1 -1
View File
@@ -8,5 +8,5 @@ const helmetContext = { }
createRoot (document.getElementById ('root')!).render ( createRoot (document.getElementById ('root')!).render (
<HelmetProvider context={helmetContext}> <HelmetProvider context={helmetContext}>
<App /> <App/>
</HelmetProvider>) </HelmetProvider>)
+1 -1
View File
@@ -1,4 +1,4 @@
import ErrorScreen from '@/components/ErrorScreen' import ErrorScreen from '@/components/ErrorScreen'
export default () => <ErrorScreen status={403} /> export default () => <ErrorScreen status={403}/>
+1 -1
View File
@@ -1,4 +1,4 @@
import ErrorScreen from '@/components/ErrorScreen' import ErrorScreen from '@/components/ErrorScreen'
export default () => <ErrorScreen status={404} /> export default () => <ErrorScreen status={404}/>
+1 -1
View File
@@ -1,4 +1,4 @@
import ErrorScreen from '@/components/ErrorScreen' import ErrorScreen from '@/components/ErrorScreen'
export default () => <ErrorScreen status={503} /> export default () => <ErrorScreen status={503}/>
+8 -8
View File
@@ -72,9 +72,9 @@ export default ({ user }: Props) => {
switch (status) switch (status)
{ {
case 404: case 404:
return <NotFound /> return <NotFound/>
case 503: case 503:
return <ServiceUnavailable /> return <ServiceUnavailable/>
} }
const url = post ? new URL (post.url) : null const url = post ? new URL (post.url) : null
@@ -89,11 +89,11 @@ export default ({ user }: Props) => {
<div className="md:flex md:flex-1"> <div className="md:flex md:flex-1">
<Helmet> <Helmet>
{(post?.thumbnail || post?.thumbnailBase) && ( {(post?.thumbnail || post?.thumbnailBase) && (
<meta name="thumbnail" content={post.thumbnail || post.thumbnailBase} />)} <meta name="thumbnail" content={post.thumbnail || post.thumbnailBase}/>)}
{post && <title>{`${ post.title || post.url } | ${ SITE_TITLE }`}</title>} {post && <title>{`${ post.title || post.url } | ${ SITE_TITLE }`}</title>}
</Helmet> </Helmet>
<div className="hidden md:block"> <div className="hidden md:block">
<TagDetailSidebar post={post} /> <TagDetailSidebar post={post}/>
</div> </div>
<MainArea> <MainArea>
{post {post
@@ -103,8 +103,8 @@ export default ({ user }: Props) => {
? ( ? (
<NicoViewer id={videoId} <NicoViewer id={videoId}
width={640} width={640}
height={360} />) height={360}/>)
: <img src={post.thumbnail} alt={post.url} className="mb-4 w-full" />} : <img src={post.thumbnail} alt={post.url} className="mb-4 w-full"/>}
<Button onClick={changeViewedFlg} <Button onClick={changeViewedFlg}
className={cn ('text-white', viewedClass)}> className={cn ('text-white', viewedClass)}>
{post.viewed ? '閲覧済' : '未閲覧'} {post.viewed ? '閲覧済' : '未閲覧'}
@@ -121,14 +121,14 @@ export default ({ user }: Props) => {
onSave={newPost => { onSave={newPost => {
setPost (newPost) setPost (newPost)
toast ({ description: '更新しました.' }) toast ({ description: '更新しました.' })
}} /> }}/>
</Tab>)} </Tab>)}
</TabGroup> </TabGroup>
</>) </>)
: 'Loading...'} : 'Loading...'}
</MainArea> </MainArea>
<div className="md:hidden"> <div className="md:hidden">
<TagDetailSidebar post={post} /> <TagDetailSidebar post={post}/>
</div> </div>
</div>) </div>)
} }
+3 -3
View File
@@ -111,7 +111,7 @@ export default () => {
</title> </title>
</Helmet> </Helmet>
<TagSidebar posts={posts.slice (0, 20)} /> <TagSidebar posts={posts.slice (0, 20)}/>
<MainArea> <MainArea>
<TabGroup> <TabGroup>
@@ -124,14 +124,14 @@ export default () => {
scroll: containerRef.current?.scrollTop ?? 0 } scroll: containerRef.current?.scrollTop ?? 0 }
sessionStorage.setItem (`posts:${ tagsQuery }`, sessionStorage.setItem (`posts:${ tagsQuery }`,
JSON.stringify (statesToSave)) JSON.stringify (statesToSave))
}} />) }}/>)
: !(loading) && '広場には何もありませんよ.'} : !(loading) && '広場には何もありませんよ.'}
{loading && 'Loading...'} {loading && 'Loading...'}
<div ref={loaderRef} className="h-12"></div> <div ref={loaderRef} className="h-12"></div>
</Tab> </Tab>
{tags.length === 1 && ( {tags.length === 1 && (
<Tab name="Wiki"> <Tab name="Wiki">
<WikiBody title={tags[0]} body={wikiPage?.body} /> <WikiBody title={tags[0]} body={wikiPage?.body}/>
<div className="my-2"> <div className="my-2">
<Link to={`/wiki/${ encodeURIComponent (tags[0]) }`}> <Link to={`/wiki/${ encodeURIComponent (tags[0]) }`}>
Wiki Wiki
+6 -6
View File
@@ -20,7 +20,7 @@ type Props = { user: User | null }
export default ({ user }: Props) => { export default ({ user }: Props) => {
if (!(['admin', 'member'].some (r => user?.role === r))) if (!(['admin', 'member'].some (r => user?.role === r)))
return <Forbidden /> return <Forbidden/>
const navigate = useNavigate () const navigate = useNavigate ()
@@ -125,7 +125,7 @@ export default ({ user }: Props) => {
value={url} value={url}
onChange={e => setURL (e.target.value)} onChange={e => setURL (e.target.value)}
className="w-full border p-2 rounded" className="w-full border p-2 rounded"
onBlur={handleURLBlur} /> onBlur={handleURLBlur}/>
</div> </div>
{/* タイトル */} {/* タイトル */}
@@ -141,7 +141,7 @@ export default ({ user }: Props) => {
value={title} value={title}
placeholder={titleLoading ? 'Loading...' : ''} placeholder={titleLoading ? 'Loading...' : ''}
onChange={ev => setTitle (ev.target.value)} onChange={ev => setTitle (ev.target.value)}
disabled={titleAutoFlg} /> disabled={titleAutoFlg}/>
</div> </div>
{/* サムネール */} {/* サムネール */}
@@ -169,11 +169,11 @@ export default ({ user }: Props) => {
setThumbnailFile (file) setThumbnailFile (file)
setThumbnailPreview (URL.createObjectURL (file)) setThumbnailPreview (URL.createObjectURL (file))
} }
}} />)} }}/>)}
{thumbnailPreview && ( {thumbnailPreview && (
<img src={thumbnailPreview} <img src={thumbnailPreview}
alt="preview" alt="preview"
className="mt-2 max-h-48 rounded border" />)} className="mt-2 max-h-48 rounded border"/>)}
</div> </div>
{/* タグ */} {/* タグ */}
@@ -181,7 +181,7 @@ export default ({ user }: Props) => {
<div> <div>
<Label></Label> <Label></Label>
<TextArea value={tags} <TextArea value={tags}
onChange={ev => setTags (ev.target.value)} /> onChange={ev => setTags (ev.target.value)}/>
</div> </div>
{/* 送信 */} {/* 送信 */}
+3 -3
View File
@@ -114,19 +114,19 @@ export default ({ user }: Props) => {
{nicoTags.map ((tag, i) => ( {nicoTags.map ((tag, i) => (
<tr key={i}> <tr key={i}>
<td className="p-2"> <td className="p-2">
<TagLink tag={tag} withWiki={false} withCount={false} /> <TagLink tag={tag} withWiki={false} withCount={false}/>
</td> </td>
<td className="p-2"> <td className="p-2">
{editing[tag.id] {editing[tag.id]
? ( ? (
<TextArea value={rawTags[tag.id]} onChange={ev => { <TextArea value={rawTags[tag.id]} onChange={ev => {
setRawTags (rawTags => ({ ...rawTags, [tag.id]: ev.target.value })) setRawTags (rawTags => ({ ...rawTags, [tag.id]: ev.target.value }))
}} />) }}/>)
: tag.linkedTags.map((lt, j) => ( : tag.linkedTags.map((lt, j) => (
<span key={j} className="mr-2"> <span key={j} className="mr-2">
<TagLink tag={lt} <TagLink tag={lt}
linkFlg={false} linkFlg={false}
withCount={false} /> withCount={false}/>
</span>))} </span>))}
</td> </td>
{memberFlg && ( {memberFlg && (
+4 -4
View File
@@ -55,7 +55,7 @@ export default ({ user, setUser }: Props) => {
return ( return (
<MainArea> <MainArea>
<Helmet> <Helmet>
<meta name="robots" content="noindex" /> <meta name="robots" content="noindex"/>
<title> | {SITE_TITLE}</title> <title> | {SITE_TITLE}</title>
</Helmet> </Helmet>
@@ -71,7 +71,7 @@ export default ({ user, setUser }: Props) => {
className="w-full border rounded p-2" className="w-full border rounded p-2"
value={name} value={name}
placeholder="名もなきニジラー" placeholder="名もなきニジラー"
onChange={ev => setName (ev.target.value)} /> onChange={ev => setName (ev.target.value)}/>
{(user && !(user.name)) && ( {(user && !(user.name)) && (
<p className="mt-1 text-sm text-red-500"> <p className="mt-1 text-sm text-red-500">
30 !!!! 30 !!!!
@@ -104,10 +104,10 @@ export default ({ user, setUser }: Props) => {
<UserCodeDialogue visible={userCodeVsbl} <UserCodeDialogue visible={userCodeVsbl}
onVisibleChange={setUserCodeVsbl} onVisibleChange={setUserCodeVsbl}
user={user} user={user}
setUser={setUser} /> setUser={setUser}/>
<InheritDialogue visible={inheritVsbl} <InheritDialogue visible={inheritVsbl}
onVisibleChange={setInheritVsbl} onVisibleChange={setInheritVsbl}
setUser={setUser} /> setUser={setUser}/>
</MainArea>) </MainArea>)
} }
+4 -4
View File
@@ -98,7 +98,7 @@ export default () => {
<MainArea> <MainArea>
<Helmet> <Helmet>
<title>{`${ title } Wiki | ${ SITE_TITLE }`}</title> <title>{`${ title } Wiki | ${ SITE_TITLE }`}</title>
{!(wikiPage?.body) && <meta name="robots" content="noindex" />} {!(wikiPage?.body) && <meta name="robots" content="noindex"/>}
</Helmet> </Helmet>
{(wikiPage && version) && ( {(wikiPage && version) && (
@@ -120,18 +120,18 @@ export default () => {
<TagLink tag={tag} <TagLink tag={tag}
withWiki={false} withWiki={false}
withCount={false} withCount={false}
{...(version && { to: `/wiki/${ encodeURIComponent (title) }` })} /> {...(version && { to: `/wiki/${ encodeURIComponent (title) }` })}/>
</PageTitle> </PageTitle>
<div className="prose mx-auto p-4"> <div className="prose mx-auto p-4">
{wikiPage === undefined {wikiPage === undefined
? 'Loading...' ? 'Loading...'
: <WikiBody title={title} body={wikiPage?.body} />} : <WikiBody title={title} body={wikiPage?.body}/>}
</div> </div>
{(!(version) && posts.length > 0) && ( {(!(version) && posts.length > 0) && (
<TabGroup> <TabGroup>
<Tab name="広場"> <Tab name="広場">
<PostList posts={posts} /> <PostList posts={posts}/>
</Tab> </Tab>
</TabGroup>)} </TabGroup>)}
</MainArea>) </MainArea>)
+1 -1
View File
@@ -42,7 +42,7 @@ export default () => {
diff.diff.map (d => ( diff.diff.map (d => (
<span className={cn (d.type === 'added' && 'bg-green-200 dark:bg-green-800', <span className={cn (d.type === 'added' && 'bg-green-200 dark:bg-green-800',
d.type === 'removed' && 'bg-red-200 dark:bg-red-800')}> d.type === 'removed' && 'bg-red-200 dark:bg-red-800')}>
{d.content == '\n' ? <br /> : d.content} {d.content == '\n' ? <br/> : d.content}
</span>))) </span>)))
: 'Loading...'} : 'Loading...'}
</div> </div>
+3 -3
View File
@@ -21,7 +21,7 @@ type Props = { user: User | null }
export default ({ user }: Props) => { export default ({ user }: Props) => {
if (!(['admin', 'member'].some (r => user?.role === r))) if (!(['admin', 'member'].some (r => user?.role === r)))
return <Forbidden /> return <Forbidden/>
const { id } = useParams () const { id } = useParams ()
@@ -73,7 +73,7 @@ export default ({ user }: Props) => {
<input type="text" <input type="text"
value={title} value={title}
onChange={e => setTitle (e.target.value)} onChange={e => setTitle (e.target.value)}
className="w-full border p-2 rounded" /> className="w-full border p-2 rounded"/>
</div> </div>
{/* 本文 */} {/* 本文 */}
@@ -82,7 +82,7 @@ export default ({ user }: Props) => {
<MdEditor value={body} <MdEditor value={body}
style={{ height: '500px' }} style={{ height: '500px' }}
renderHTML={text => mdParser.render (text)} renderHTML={text => mdParser.render (text)}
onChange={({ text }) => setBody (text)} /> onChange={({ text }) => setBody (text)}/>
</div> </div>
{/* 送信 */} {/* 送信 */}
+49 -49
View File
@@ -27,54 +27,54 @@ export default () => {
return ( return (
<MainArea> <MainArea>
<Helmet> <Helmet>
<title>{`Wiki 変更履歴 | ${ SITE_TITLE }`}</title> <title>{`Wiki 変更履歴 | ${ SITE_TITLE }`}</title>
</Helmet> </Helmet>
<table className="table-auto w-full border-collapse"> <table className="table-auto w-full border-collapse">
<thead> <thead>
<tr> <tr>
<th></th> <th></th>
<th className="p-2 text-left"></th> <th className="p-2 text-left"></th>
<th className="p-2 text-left"></th> <th className="p-2 text-left"></th>
<th className="p-2 text-left"></th> <th className="p-2 text-left"></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{changes.map (change => ( {changes.map (change => (
<tr key={change.sha}> <tr key={change.sha}>
<td> <td>
{change.changeType === 'update' && ( {change.changeType === 'update' && (
<Link to={`/wiki/${ change.wikiPage.id }/diff?from=${ change.pred }&to=${ change.sha }`}> <Link to={`/wiki/${ change.wikiPage.id }/diff?from=${ change.pred }&to=${ change.sha }`}>
</Link>)} </Link>)}
</td> </td>
<td className="p-2"> <td className="p-2">
<Link to={`/wiki/${ encodeURIComponent (change.wikiPage.title) }?version=${ change.sha }`}> <Link to={`/wiki/${ encodeURIComponent (change.wikiPage.title) }?version=${ change.sha }`}>
{change.wikiPage.title} {change.wikiPage.title}
</Link> </Link>
</td> </td>
<td className="p-2"> <td className="p-2">
{(() => { {(() => {
switch (change.changeType) switch (change.changeType)
{ {
case 'create': case 'create':
return '新規' return '新規'
case 'update': case 'update':
return '更新' return '更新'
case 'delete': case 'delete':
return '削除' return '削除'
} }
}) ()} }) ()}
</td> </td>
<td className="p-2"> <td className="p-2">
<Link to={`/users/${ change.user.id }`}> <Link to={`/users/${ change.user.id }`}>
{change.user.name} {change.user.name}
</Link> </Link>
<br /> <br/>
{change.timestamp} {change.timestamp}
</td> </td>
</tr>))} </tr>))}
</tbody> </tbody>
</table> </table>
</MainArea>) </MainArea>)
} }
+3 -3
View File
@@ -21,7 +21,7 @@ type Props = { user: User | null }
export default ({ user }: Props) => { export default ({ user }: Props) => {
if (!(['admin', 'member'].some (r => user?.role === r))) if (!(['admin', 'member'].some (r => user?.role === r)))
return <Forbidden /> return <Forbidden/>
const location = useLocation () const location = useLocation ()
const navigate = useNavigate () const navigate = useNavigate ()
@@ -67,7 +67,7 @@ export default ({ user }: Props) => {
<input type="text" <input type="text"
value={title} value={title}
onChange={e => setTitle (e.target.value)} onChange={e => setTitle (e.target.value)}
className="w-full border p-2 rounded" /> className="w-full border p-2 rounded"/>
</div> </div>
{/* 本文 */} {/* 本文 */}
@@ -76,7 +76,7 @@ export default ({ user }: Props) => {
<MdEditor value={body} <MdEditor value={body}
style={{ height: '500px' }} style={{ height: '500px' }}
renderHTML={text => mdParser.render (text)} renderHTML={text => mdParser.render (text)}
onChange={({ text }) => setBody (text)} /> onChange={({ text }) => setBody (text)}/>
</div> </div>
{/* 送信 */} {/* 送信 */}
-5
View File
@@ -1,5 +0,0 @@
// import { Route,
// createBrowserRouter,
// createRoutesFromElements } from 'react-router-dom'
//
// import App from '@/App'