@@ -52,12 +52,17 @@ class WikiPagesController < ApplicationController | |||||
def changes | def changes | ||||
id = params[:id] | id = params[:id] | ||||
log = id.present? ? wiki.page("#{ id }.md").versions : wiki.repo.log('main', nil, max_count: 50) | |||||
log = id.present? ? wiki.page("#{ id }.md")&.versions : wiki.repo.log('main', nil, max_count: 50) | |||||
return render json: [] unless log | |||||
render json: log.map { |commit| | render json: log.map { |commit| | ||||
{ sha: commit.id, | |||||
author: commit.author.name, | |||||
message: commit.message, | |||||
timestamp: commit.authored_date } } | |||||
wiki_page = WikiPage.find(commit.message.split(' ')[1].to_i) | |||||
user = User.find(commit.author.name.to_i) | |||||
{ sha: commit.id, | |||||
wiki_page: wiki_page && { id: wiki_page.id, title: wiki_page.title }, | |||||
user: user && { id: user.id, name: user.name }, | |||||
change_type: commit.message.split(' ')[0].downcase[0...(-1)], | |||||
timestamp: commit.authored_date } } | |||||
end | end | ||||
private | private | ||||
@@ -14,15 +14,14 @@ class WikiPage < ApplicationRecord | |||||
end | end | ||||
def set_body content, user: | def set_body content, user: | ||||
page = wiki.page("#{ id }.md") | |||||
commit_info = { message: "Update #{ title }", | |||||
name: user.id.to_s, | |||||
commit_info = { name: user.id.to_s, | |||||
email: 'dummy@example.com' } | email: 'dummy@example.com' } | ||||
page = wiki.page("#{ id }.md") | |||||
if page | if page | ||||
commit_info[:message] = "Updated #{ id }" | |||||
wiki.update_page(page, id.to_s, :markdown, content, commit_info) | wiki.update_page(page, id.to_s, :markdown, content, commit_info) | ||||
else | else | ||||
commit_info[:message] = "Created #{ id }" | |||||
wiki.write_page(id.to_s, :markdown, content, commit_info) | wiki.write_page(id.to_s, :markdown, content, commit_info) | ||||
end | end | ||||
end | end | ||||
@@ -1,8 +1,65 @@ | |||||
import { useEffect, useState } from 'react' | |||||
import { Link, useLocation, useParams } from 'react-router-dom' | |||||
import MainArea from '@/components/layout/MainArea' | import MainArea from '@/components/layout/MainArea' | ||||
import axios from 'axios' | |||||
import { API_BASE_URL } from '@/config' | |||||
import type { WikiPageChange } from '@/types' | |||||
export default () => { | export default () => { | ||||
const [changes, setChanges] = useState<WikiPageChange[]> ([]) | |||||
const location = useLocation () | |||||
const query = new URLSearchParams (location.search) | |||||
const id = query.get ('id') | |||||
useEffect (() => { | |||||
void (axios.get (`${ API_BASE_URL }/wiki/changes`, id && { params: { id } }) | |||||
.then (res => setChanges (res.data))) | |||||
}, [location.search]) | |||||
return ( | return ( | ||||
<MainArea> | <MainArea> | ||||
<table className="table-auto w-full border-collapse"> | |||||
<thead> | |||||
<tr> | |||||
<th></th> | |||||
<th className="p-2 text-left">タイトル</th> | |||||
<th className="p-2 text-left">変更</th> | |||||
<th className="p-2 text-left">日時</th> | |||||
</tr> | |||||
</thead> | |||||
<tbody> | |||||
{changes.map (change => ( | |||||
<tr key={change.sha}> | |||||
<td>差分</td> | |||||
<td className="p-2"> | |||||
<Link to={`/wiki/${ encodeURIComponent (change.wiki_page.title) }`} | |||||
className="text-blue-400 hover:underline"> | |||||
{change.wiki_page.title} | |||||
</Link> | |||||
</td> | |||||
<td className="p-2"> | |||||
{(() => { | |||||
switch (change.change_type) | |||||
{ | |||||
case 'create': return '新規' | |||||
case 'update': return '更新' | |||||
case 'delete': return '削除' | |||||
} | |||||
}) ()} | |||||
</td> | |||||
<td className="p-2"> | |||||
<Link to={`/users/${ change.user.id }`} | |||||
className="text-blue-400 hover:underline"> | |||||
{change.user.name} | |||||
</Link> | |||||
<br /> | |||||
{change.timestamp} | |||||
</td> | |||||
</tr>))} | |||||
</tbody> | |||||
</table> | |||||
</MainArea>) | </MainArea>) | ||||
} | } |
@@ -22,4 +22,16 @@ export type User = { | |||||
inheritanceCode: string | inheritanceCode: string | ||||
role: UserRole } | role: UserRole } | ||||
export type WikiPage = { | |||||
id: number | |||||
title: string | |||||
updated_at?: string } | |||||
export type WikiPageChange = { | |||||
sha: string | |||||
wiki_page: WikiPage | |||||
user: User | |||||
change_type: string | |||||
timestamp: string } | |||||
export type UserRole = typeof USER_ROLES[number] | export type UserRole = typeof USER_ROLES[number] |