Browse Source
- Prisma schema: added `changelog Json @default("[]")` to Block model
- Migration: 20260324141120_add_changelog_field
- Seed: 8 blocks with actual versions (v1.0–v1.2) and changelog entries
- API: PATCH /blocks/by-path accepts changelog field
- CORS: accept any localhost port (regex pattern)
- BlockChangelog component: renders version history from API or fallback
- BlockMetaBar: loads changelog from API, passes to BlockChangelog
- Removed "API офлайн" text, replaced with subtle gray dot
- Added defaultChangelog prop for offline fallback
- Block pages: removed hardcoded changelog JSX, use defaultChangelog prop
- Updated SPRINTS.md with completed tasks
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
main
14 changed files with 349 additions and 197 deletions
@ -0,0 +1,2 @@ |
|||||||
|
-- AlterTable |
||||||
|
ALTER TABLE "Block" ADD COLUMN "changelog" JSONB NOT NULL DEFAULT '[]'; |
||||||
@ -0,0 +1,41 @@ |
|||||||
|
"use client"; |
||||||
|
|
||||||
|
export interface ChangelogEntry { |
||||||
|
version: string; |
||||||
|
date: string; |
||||||
|
changes: string[]; |
||||||
|
} |
||||||
|
|
||||||
|
interface BlockChangelogProps { |
||||||
|
changelog: ChangelogEntry[]; |
||||||
|
} |
||||||
|
|
||||||
|
export function BlockChangelog({ changelog }: BlockChangelogProps) { |
||||||
|
if (!changelog || changelog.length === 0) return null; |
||||||
|
|
||||||
|
return ( |
||||||
|
<section className="space-y-3"> |
||||||
|
<h2 className="font-semibold text-base" style={{ color: "var(--bb-text)" }}> |
||||||
|
История версий |
||||||
|
</h2> |
||||||
|
<div className="space-y-2 text-sm" style={{ color: "var(--bb-text-muted)" }}> |
||||||
|
{changelog.map((entry) => ( |
||||||
|
<div |
||||||
|
key={entry.version} |
||||||
|
className="p-3 rounded-lg" |
||||||
|
style={{ background: "var(--bb-sidebar-bg)", border: "1px solid var(--bb-border)" }} |
||||||
|
> |
||||||
|
<p className="font-semibold text-xs mb-1" style={{ color: "var(--bb-text)" }}> |
||||||
|
{entry.version} — {entry.date} |
||||||
|
</p> |
||||||
|
<ul className="list-disc list-inside space-y-0.5 text-xs"> |
||||||
|
{entry.changes.map((change, i) => ( |
||||||
|
<li key={i}>{change}</li> |
||||||
|
))} |
||||||
|
</ul> |
||||||
|
</div> |
||||||
|
))} |
||||||
|
</div> |
||||||
|
</section> |
||||||
|
); |
||||||
|
} |
||||||
Loading…
Reference in new issue