diff --git a/backend/app/controllers/post_versions_controller.rb b/backend/app/controllers/post_versions_controller.rb new file mode 100644 index 0000000..7b30b5a --- /dev/null +++ b/backend/app/controllers/post_versions_controller.rb @@ -0,0 +1,29 @@ +class PostVersionsController < ApplicationController + def index + post_id = params[:post].presence + tag_id = params[:tag].presence + page = (params[:page].presence || 1).to_i + limit = (params[:limit].presence || 20).to_i + + page = 1 if page < 1 + limit = 1 if limit < 1 + + offset = (page - 1) * limit + + tag_name = nil + if tag_id + tag_name = TagName.joins(:tag).find_by(tag: { id: tag_id }) + return render json: [] unless tag_name + end + + q = PostVersion + q = q.where(post_id:) if post_id + q = q.where("CONCAT(' ', tags, ' ') LIKE ?", "% #{ tag_name } %") if tag_name + + versions = q.order(created_at: :desc, id: :desc) + .limit(limit) + .offset(offset) + + render json: { versions:, count: q.count } + end +end diff --git a/backend/app/controllers/posts_controller.rb b/backend/app/controllers/posts_controller.rb index fda77ed..c6e2d7d 100644 --- a/backend/app/controllers/posts_controller.rb +++ b/backend/app/controllers/posts_controller.rb @@ -204,7 +204,7 @@ class PostsController < ApplicationController pts = pts.where(post_id: id) if id.present? pts = pts.where(tag_id:) if tag_id.present? pts = pts.includes(:post, :created_user, :deleted_user, - tag: { tag_name: :wiki_page }) + tag: [:materials, { tag_name: :wiki_page }]) events = [] pts.each do |pt| diff --git a/backend/config/routes.rb b/backend/config/routes.rb index fc56aa4..edd978f 100644 --- a/backend/config/routes.rb +++ b/backend/config/routes.rb @@ -49,6 +49,7 @@ Rails.application.routes.draw do collection do get :random get :changes + get :versions, to: 'post_versions#index' end member do diff --git a/frontend/src/components/DraggableDroppableTagRow.tsx b/frontend/src/components/DraggableDroppableTagRow.tsx index 6660f7e..55bc4d4 100644 --- a/frontend/src/components/DraggableDroppableTagRow.tsx +++ b/frontend/src/components/DraggableDroppableTagRow.tsx @@ -90,7 +90,9 @@ export default (({ tag, nestLevel, pathKey, parentTagId, suppressClickRef, sp }: className={cn ('rounded select-none', over && 'ring-2 ring-offset-2')} {...attributes} {...listeners}> - + ) diff --git a/frontend/src/components/TagDetailSidebar.tsx b/frontend/src/components/TagDetailSidebar.tsx index c02eca9..e195619 100644 --- a/frontend/src/components/TagDetailSidebar.tsx +++ b/frontend/src/components/TagDetailSidebar.tsx @@ -313,7 +313,9 @@ export default (({ post, sp }: Props) => { {CATEGORIES.map ((cat: Category) => ((tags[cat] ?? []).length > 0 || dragging) && (
- + {CATEGORY_NAMES[cat]} @@ -325,7 +327,9 @@ export default (({ post, sp }: Props) => {
))} {post && ( - + 情報
  • Id.: {post.id}
  • diff --git a/frontend/src/types.ts b/frontend/src/types.ts index c453a10..57e2dd5 100644 --- a/frontend/src/types.ts +++ b/frontend/src/types.ts @@ -136,6 +136,21 @@ export type PostTagChange = { changeType: 'add' | 'remove' timestamp: string } +export type PostVersion = { + postId: number + versionNo: number + eventType: 'create' | 'update' | 'discard' | 'restore' + title: string + url: string + thumbnail: string + thumbnailBase: string + tags: Tag[] + parent: Post | null + originalCreatedFrom: string | null + originalCreatedBefore: string | null + createdAt: string + createdByUser: { id: number; name: string | null } | null } + export type SubMenuComponentItem = { component: ReactNode visible: boolean }