Науковий редактор
Науковий редактор Zemna.AI — це редактор форматованого тексту на базі Tiptap для академічного письма. Він підтримує формули LaTeX, автоматичне збереження, історію версій та збереження публікацій через шар бази даних Ring Platform.
Статус: Фаза 2 (спринти 2.1–2.3) завершені. Підтримка рисунків/таблиць та експорт заплановані в спринтах 2.4–2.5.
Огляд
| Можливість | Опис |
|---|---|
| Форматований текст | Заголовки (H1–H6), жирний, курсив, підкреслення, списки, цитати, блоки коду, таблиці, посилання, зображення |
| LaTeX | Інлайн та блокові формули через KaTeX; модальне вікно формул з попереднім переглядом та шаблонами |
| Автозбереження | Збереження з затримкою 30 с; перше збереження створює публікацію, далі оновлення через PUT |
| Історія версій | Знімки та відновлення версій; список версій з датами та опційними описами |
| Публікації | Вміст зберігається як Tiptap JSON; завантаження за ?id=... або створення нового |
Можливості редактора
Форматований текст (Tiptap)
Редактор використовує Tiptap з StarterKit та розширеннями для наукового письма:
- Форматування: Жирний, курсив, підкреслення, закреслення, надрядковий, підрядковий, виділення
- Структура: Заголовки H1–H6, нумеровані/марковані списки, блокові цитати
- Блоки: Блоки коду (підсвітка через lowlight), таблиці (рядки, стовпці, заголовок)
- Інлайн: Посилання, зображення (підтримка placeholder)
- Типографіка: Розумні лапки та покращення типографіки
Вміст зберігається як Tiptap JSON у полі публікації content; редактор приймає початковий вміст як рядок HTML або JSON для завантаження збережених публікацій.
Формули LaTeX
- Блокові формули: Вставка формул у режимі display через панель (іконка калькулятора) або модальне вікно формул.
- Відображення: KaTeX рендерить формули в редакторі; клік для редагування відкриває модальне вікно.
- Модальне вікно: Поле LaTeX, перемикач display/inline, попередній перегляд, кнопки шаблонів (дріб, сума, інтеграл, матриця), Вставити/Скасувати.
Формули зберігаються як власні вузли Tiptap (mathBlock) з атрибутами latex та display.
Автозбереження та публікації
- Новий документ: Немає
?id=у URL; перше «Зберегти» або перше автозбереження створює публікацію черезPOST /api/publicationsі встановлює id публікації для подальших збережень. - Існуючий документ: Відкрити з
?id=<publicationId>; сторінка завантажує публікацію і встановлює заголовок та вміст (JSON). Автозбереження та ручне «Зберегти» використовуютьPUT /api/publications/:id. - Затримка: Зміни заголовка або вмісту запускають збереження з затримкою 30 с; ручне «Зберегти» виконує збереження одразу.
- Індикатор збереження: На панелі відображається «Збережено» з часом останнього успішного збереження.
Історія версій
- Панель: Кнопка «Історія версій» на панелі відкриває діалог зі списком версій (номер версії, дата, опційний опис).
- Знімок: «Зберегти знімок» створює нову версію з поточним вмістом (опційний опис змін).
- Відновити: «Відновити» для версії оновлює вміст публікації до цієї версії та перезавантажує редактор; панель закривається, редактор показує відновлений вміст.
Архітектура
Схема публікацій
Публікації та версії використовують абстракцію бази даних Ring Platform (PostgreSQL з JSONB):
publications:id,data(JSONB),created_at,updated_at.
dataмістить:user_id,title,content(Tiptap JSON),status,template_id.publication_versions:id,data(JSONB),created_at,updated_at.
dataмістить:publication_id,version_number,content,change_summary,created_by.
Схема визначена в data/schema.sql; адаптер PostgreSQL має fieldMappings для обох колекцій.
Потік збереження
sequenceDiagram
participant User
participant Editor
participant useAutoSave
participant API
participant DB
User->>Editor: Edit content / title
Editor->>useAutoSave: touch(publicationId, payload)
useAutoSave->>useAutoSave: Debounce 30s
Note over useAutoSave: Timer fires
useAutoSave->>API: POST /api/publications (new) or PUT /api/publications/:id
API->>DB: create() or update()
DB-->>API: publication
API-->>useAutoSave: 200 + publication
useAutoSave->>Editor: onFirstSave(id) if new
useAutoSave->>Editor: lastSaved updated
Потік історії версій
sequenceDiagram
participant User
participant Panel
participant API
participant DB
User->>Panel: Open Version History
Panel->>API: GET /api/publications/:id/versions
API->>DB: findByField(publication_versions, publication_id, id)
DB-->>API: versions[]
API-->>Panel: versions
User->>Panel: Restore version V
Panel->>API: POST /api/publications/:id/versions { action: 'restore', versionId: V }
API->>DB: updatePublication(id, content from V)
DB-->>API: publication
API-->>Panel: 200
Panel->>User: onRestore() → refetch publication, set editor content
API-маршрути
| Метод | Шлях | Опис |
|---|---|---|
| GET | /api/publications | Список публікацій поточного користувача |
| POST | /api/publications | Створити публікацію (body: title, content, status, template_id) |
| GET | /api/publications/[id] | Отримати публікацію (перевірка власності) |
| PUT | /api/publications/[id] | Оновити публікацію (перевірка власності) |
| DELETE | /api/publications/[id] | Видалити публікацію (перевірка власності) |
| GET | /api/publications/[id]/versions | Список версій публікації |
| POST | /api/publications/[id]/versions | Знімок (action: snapshot) або відновлення (action: restore, versionId) |
Усі маршрути потребують автентифікації; для get/update/delete та версій перевіряється власність.
Ключові файли
| Область | Шлях |
|---|---|
| Сторінка редактора | app/(authenticated)/[locale]/editor/page.tsx |
| Науковий редактор | components/editor/scientific-editor.tsx |
| Панель інструментів | components/editor/editor-toolbar.tsx |
| Розширення LaTeX | components/editor/extensions/latex-extension.tsx |
| Модальне вікно формул | components/editor/equation-editor.tsx |
| Панель історії версій | components/editor/version-history-panel.tsx |
| Хук автозбереження | hooks/use-auto-save.ts |
| Типи публікацій | features/publications/types/index.ts |
| Сервіс публікацій | features/publications/services/publication-service.ts |
| API-маршрути | app/(public)/api/publications/ |
| Схема | data/schema.sql |
Використання
Відкриття редактора
- Нова публікація: Перейдіть на
/editor(або/[locale]/editor). Редактор завантажується з типовим науковим шаблоном; id публікації встановлюється при першому збереженні. - Існуюча публікація: Перейдіть на
/editor?id=<publicationId>. Сторінка отримує публікацію та встановлює заголовок і вміст (Tiptap JSON) в редакторі.
Збереження
- Вручну: Натисніть Зберегти на панелі. Для нового документу це створює публікацію та встановлює id; для існуючого — оновлення через PUT.
- Автозбереження: Через 30 секунд без змін поточний заголовок та вміст зберігаються автоматично (POST для нового, PUT для існуючого).
Історія версій
- Натисніть Історія версій (іконка історії) на панелі.
- Використовуйте Зберегти знімок, щоб створити нову версію з поточним вмістом.
- Використовуйте Відновити для версії, щоб встановити вміст публікації на цю версію та перезавантажити редактор.
Відновлення не видаляє версії; воно оновлює вміст публікації, історія версій залишається.
Дорожня карта (залишок фази 2)
- Спринт 2.4: Компонент завантаження рисунків, покращення редактора таблиць, розширення перехресних посилань, інтеграція FileService для зображень.
- Спринт 2.5: Сервіси експорту (PDF, Word, Markdown), діалог експорту, кнопка та скорочення експорту.
Детальний розклад спрингів: Фаза 2: Покращення наукового редактора.
Науковий редактор
Науковий редактор Zemna.AI — це редактор форматованого тексту на базі Tiptap для академічного письма. Він підтримує формули LaTeX, автоматичне збереження, історію версій та збереження публікацій через шар бази даних Ring Platform.
Статус: Фаза 2 (спринти 2.1–2.3) завершені. Підтримка рисунків/таблиць та експорт заплановані в спринтах 2.4–2.5.
Огляд
| Можливість | Опис |
|---|---|
| Форматований текст | Заголовки (H1–H6), жирний, курсив, підкреслення, списки, цитати, блоки коду, таблиці, посилання, зображення |
| LaTeX | Інлайн та блокові формули через KaTeX; модальне вікно формул з попереднім переглядом та шаблонами |
| Автозбереження | Збереження з затримкою 30 с; перше збереження створює публікацію, далі оновлення через PUT |
| Історія версій | Знімки та відновлення версій; список версій з датами та опційними описами |
| Публікації | Вміст зберігається як Tiptap JSON; завантаження за ?id=... або створення нового |
Можливості редактора
Форматований текст (Tiptap)
Редактор використовує Tiptap з StarterKit та розширеннями для наукового письма:
- Форматування: Жирний, курсив, підкреслення, закреслення, надрядковий, підрядковий, виділення
- Структура: Заголовки H1–H6, нумеровані/марковані списки, блокові цитати
- Блоки: Блоки коду (підсвітка через lowlight), таблиці (рядки, стовпці, заголовок)
- Інлайн: Посилання, зображення (підтримка placeholder)
- Типографіка: Розумні лапки та покращення типографіки
Вміст зберігається як Tiptap JSON у полі публікації content; редактор приймає початковий вміст як рядок HTML або JSON для завантаження збережених публікацій.
Формули LaTeX
- Блокові формули: Вставка формул у режимі display через панель (іконка калькулятора) або модальне вікно формул.
- Відображення: KaTeX рендерить формули в редакторі; клік для редагування відкриває модальне вікно.
- Модальне вікно: Поле LaTeX, перемикач display/inline, попередній перегляд, кнопки шаблонів (дріб, сума, інтеграл, матриця), Вставити/Скасувати.
Формули зберігаються як власні вузли Tiptap (mathBlock) з атрибутами latex та display.
Автозбереження та публікації
- Новий документ: Немає
?id=у URL; перше «Зберегти» або перше автозбереження створює публікацію черезPOST /api/publicationsі встановлює id публікації для подальших збережень. - Існуючий документ: Відкрити з
?id=<publicationId>; сторінка завантажує публікацію і встановлює заголовок та вміст (JSON). Автозбереження та ручне «Зберегти» використовуютьPUT /api/publications/:id. - Затримка: Зміни заголовка або вмісту запускають збереження з затримкою 30 с; ручне «Зберегти» виконує збереження одразу.
- Індикатор збереження: На панелі відображається «Збережено» з часом останнього успішного збереження.
Історія версій
- Панель: Кнопка «Історія версій» на панелі відкриває діалог зі списком версій (номер версії, дата, опційний опис).
- Знімок: «Зберегти знімок» створює нову версію з поточним вмістом (опційний опис змін).
- Відновити: «Відновити» для версії оновлює вміст публікації до цієї версії та перезавантажує редактор; панель закривається, редактор показує відновлений вміст.
Архітектура
Схема публікацій
Публікації та версії використовують абстракцію бази даних Ring Platform (PostgreSQL з JSONB):
publications:id,data(JSONB),created_at,updated_at.
dataмістить:user_id,title,content(Tiptap JSON),status,template_id.publication_versions:id,data(JSONB),created_at,updated_at.
dataмістить:publication_id,version_number,content,change_summary,created_by.
Схема визначена в data/schema.sql; адаптер PostgreSQL має fieldMappings для обох колекцій.
Потік збереження
sequenceDiagram
participant User
participant Editor
participant useAutoSave
participant API
participant DB
User->>Editor: Edit content / title
Editor->>useAutoSave: touch(publicationId, payload)
useAutoSave->>useAutoSave: Debounce 30s
Note over useAutoSave: Timer fires
useAutoSave->>API: POST /api/publications (new) or PUT /api/publications/:id
API->>DB: create() or update()
DB-->>API: publication
API-->>useAutoSave: 200 + publication
useAutoSave->>Editor: onFirstSave(id) if new
useAutoSave->>Editor: lastSaved updated
Потік історії версій
sequenceDiagram
participant User
participant Panel
participant API
participant DB
User->>Panel: Open Version History
Panel->>API: GET /api/publications/:id/versions
API->>DB: findByField(publication_versions, publication_id, id)
DB-->>API: versions[]
API-->>Panel: versions
User->>Panel: Restore version V
Panel->>API: POST /api/publications/:id/versions { action: 'restore', versionId: V }
API->>DB: updatePublication(id, content from V)
DB-->>API: publication
API-->>Panel: 200
Panel->>User: onRestore() → refetch publication, set editor content
API-маршрути
| Метод | Шлях | Опис |
|---|---|---|
| GET | /api/publications | Список публікацій поточного користувача |
| POST | /api/publications | Створити публікацію (body: title, content, status, template_id) |
| GET | /api/publications/[id] | Отримати публікацію (перевірка власності) |
| PUT | /api/publications/[id] | Оновити публікацію (перевірка власності) |
| DELETE | /api/publications/[id] | Видалити публікацію (перевірка власності) |
| GET | /api/publications/[id]/versions | Список версій публікації |
| POST | /api/publications/[id]/versions | Знімок (action: snapshot) або відновлення (action: restore, versionId) |
Усі маршрути потребують автентифікації; для get/update/delete та версій перевіряється власність.
Ключові файли
| Область | Шлях |
|---|---|
| Сторінка редактора | app/(authenticated)/[locale]/editor/page.tsx |
| Науковий редактор | components/editor/scientific-editor.tsx |
| Панель інструментів | components/editor/editor-toolbar.tsx |
| Розширення LaTeX | components/editor/extensions/latex-extension.tsx |
| Модальне вікно формул | components/editor/equation-editor.tsx |
| Панель історії версій | components/editor/version-history-panel.tsx |
| Хук автозбереження | hooks/use-auto-save.ts |
| Типи публікацій | features/publications/types/index.ts |
| Сервіс публікацій | features/publications/services/publication-service.ts |
| API-маршрути | app/(public)/api/publications/ |
| Схема | data/schema.sql |
Використання
Відкриття редактора
- Нова публікація: Перейдіть на
/editor(або/[locale]/editor). Редактор завантажується з типовим науковим шаблоном; id публікації встановлюється при першому збереженні. - Існуюча публікація: Перейдіть на
/editor?id=<publicationId>. Сторінка отримує публікацію та встановлює заголовок і вміст (Tiptap JSON) в редакторі.
Збереження
- Вручну: Натисніть Зберегти на панелі. Для нового документу це створює публікацію та встановлює id; для існуючого — оновлення через PUT.
- Автозбереження: Через 30 секунд без змін поточний заголовок та вміст зберігаються автоматично (POST для нового, PUT для існуючого).
Історія версій
- Натисніть Історія версій (іконка історії) на панелі.
- Використовуйте Зберегти знімок, щоб створити нову версію з поточним вмістом.
- Використовуйте Відновити для версії, щоб встановити вміст публікації на цю версію та перезавантажити редактор.
Відновлення не видаляє версії; воно оновлює вміст публікації, історія версій залишається.
Дорожня карта (залишок фази 2)
- Спринт 2.4: Компонент завантаження рисунків, покращення редактора таблиць, розширення перехресних посилань, інтеграція FileService для зображень.
- Спринт 2.5: Сервіси експорту (PDF, Word, Markdown), діалог експорту, кнопка та скорочення експорту.
Детальний розклад спрингів: Фаза 2: Покращення наукового редактора.
Науковий редактор
Науковий редактор Zemna.AI — це редактор форматованого тексту на базі Tiptap для академічного письма. Він підтримує формули LaTeX, автоматичне збереження, історію версій та збереження публікацій через шар бази даних Ring Platform.
Статус: Фаза 2 (спринти 2.1–2.3) завершені. Підтримка рисунків/таблиць та експорт заплановані в спринтах 2.4–2.5.
Огляд
| Можливість | Опис |
|---|---|
| Форматований текст | Заголовки (H1–H6), жирний, курсив, підкреслення, списки, цитати, блоки коду, таблиці, посилання, зображення |
| LaTeX | Інлайн та блокові формули через KaTeX; модальне вікно формул з попереднім переглядом та шаблонами |
| Автозбереження | Збереження з затримкою 30 с; перше збереження створює публікацію, далі оновлення через PUT |
| Історія версій | Знімки та відновлення версій; список версій з датами та опційними описами |
| Публікації | Вміст зберігається як Tiptap JSON; завантаження за ?id=... або створення нового |
Можливості редактора
Форматований текст (Tiptap)
Редактор використовує Tiptap з StarterKit та розширеннями для наукового письма:
- Форматування: Жирний, курсив, підкреслення, закреслення, надрядковий, підрядковий, виділення
- Структура: Заголовки H1–H6, нумеровані/марковані списки, блокові цитати
- Блоки: Блоки коду (підсвітка через lowlight), таблиці (рядки, стовпці, заголовок)
- Інлайн: Посилання, зображення (підтримка placeholder)
- Типографіка: Розумні лапки та покращення типографіки
Вміст зберігається як Tiptap JSON у полі публікації content; редактор приймає початковий вміст як рядок HTML або JSON для завантаження збережених публікацій.
Формули LaTeX
- Блокові формули: Вставка формул у режимі display через панель (іконка калькулятора) або модальне вікно формул.
- Відображення: KaTeX рендерить формули в редакторі; клік для редагування відкриває модальне вікно.
- Модальне вікно: Поле LaTeX, перемикач display/inline, попередній перегляд, кнопки шаблонів (дріб, сума, інтеграл, матриця), Вставити/Скасувати.
Формули зберігаються як власні вузли Tiptap (mathBlock) з атрибутами latex та display.
Автозбереження та публікації
- Новий документ: Немає
?id=у URL; перше «Зберегти» або перше автозбереження створює публікацію черезPOST /api/publicationsі встановлює id публікації для подальших збережень. - Існуючий документ: Відкрити з
?id=<publicationId>; сторінка завантажує публікацію і встановлює заголовок та вміст (JSON). Автозбереження та ручне «Зберегти» використовуютьPUT /api/publications/:id. - Затримка: Зміни заголовка або вмісту запускають збереження з затримкою 30 с; ручне «Зберегти» виконує збереження одразу.
- Індикатор збереження: На панелі відображається «Збережено» з часом останнього успішного збереження.
Історія версій
- Панель: Кнопка «Історія версій» на панелі відкриває діалог зі списком версій (номер версії, дата, опційний опис).
- Знімок: «Зберегти знімок» створює нову версію з поточним вмістом (опційний опис змін).
- Відновити: «Відновити» для версії оновлює вміст публікації до цієї версії та перезавантажує редактор; панель закривається, редактор показує відновлений вміст.
Архітектура
Схема публікацій
Публікації та версії використовують абстракцію бази даних Ring Platform (PostgreSQL з JSONB):
publications:id,data(JSONB),created_at,updated_at.
dataмістить:user_id,title,content(Tiptap JSON),status,template_id.publication_versions:id,data(JSONB),created_at,updated_at.
dataмістить:publication_id,version_number,content,change_summary,created_by.
Схема визначена в data/schema.sql; адаптер PostgreSQL має fieldMappings для обох колекцій.
Потік збереження
sequenceDiagram
participant User
participant Editor
participant useAutoSave
participant API
participant DB
User->>Editor: Edit content / title
Editor->>useAutoSave: touch(publicationId, payload)
useAutoSave->>useAutoSave: Debounce 30s
Note over useAutoSave: Timer fires
useAutoSave->>API: POST /api/publications (new) or PUT /api/publications/:id
API->>DB: create() or update()
DB-->>API: publication
API-->>useAutoSave: 200 + publication
useAutoSave->>Editor: onFirstSave(id) if new
useAutoSave->>Editor: lastSaved updated
Потік історії версій
sequenceDiagram
participant User
participant Panel
participant API
participant DB
User->>Panel: Open Version History
Panel->>API: GET /api/publications/:id/versions
API->>DB: findByField(publication_versions, publication_id, id)
DB-->>API: versions[]
API-->>Panel: versions
User->>Panel: Restore version V
Panel->>API: POST /api/publications/:id/versions { action: 'restore', versionId: V }
API->>DB: updatePublication(id, content from V)
DB-->>API: publication
API-->>Panel: 200
Panel->>User: onRestore() → refetch publication, set editor content
API-маршрути
| Метод | Шлях | Опис |
|---|---|---|
| GET | /api/publications | Список публікацій поточного користувача |
| POST | /api/publications | Створити публікацію (body: title, content, status, template_id) |
| GET | /api/publications/[id] | Отримати публікацію (перевірка власності) |
| PUT | /api/publications/[id] | Оновити публікацію (перевірка власності) |
| DELETE | /api/publications/[id] | Видалити публікацію (перевірка власності) |
| GET | /api/publications/[id]/versions | Список версій публікації |
| POST | /api/publications/[id]/versions | Знімок (action: snapshot) або відновлення (action: restore, versionId) |
Усі маршрути потребують автентифікації; для get/update/delete та версій перевіряється власність.
Ключові файли
| Область | Шлях |
|---|---|
| Сторінка редактора | app/(authenticated)/[locale]/editor/page.tsx |
| Науковий редактор | components/editor/scientific-editor.tsx |
| Панель інструментів | components/editor/editor-toolbar.tsx |
| Розширення LaTeX | components/editor/extensions/latex-extension.tsx |
| Модальне вікно формул | components/editor/equation-editor.tsx |
| Панель історії версій | components/editor/version-history-panel.tsx |
| Хук автозбереження | hooks/use-auto-save.ts |
| Типи публікацій | features/publications/types/index.ts |
| Сервіс публікацій | features/publications/services/publication-service.ts |
| API-маршрути | app/(public)/api/publications/ |
| Схема | data/schema.sql |
Використання
Відкриття редактора
- Нова публікація: Перейдіть на
/editor(або/[locale]/editor). Редактор завантажується з типовим науковим шаблоном; id публікації встановлюється при першому збереженні. - Існуюча публікація: Перейдіть на
/editor?id=<publicationId>. Сторінка отримує публікацію та встановлює заголовок і вміст (Tiptap JSON) в редакторі.
Збереження
- Вручну: Натисніть Зберегти на панелі. Для нового документу це створює публікацію та встановлює id; для існуючого — оновлення через PUT.
- Автозбереження: Через 30 секунд без змін поточний заголовок та вміст зберігаються автоматично (POST для нового, PUT для існуючого).
Історія версій
- Натисніть Історія версій (іконка історії) на панелі.
- Використовуйте Зберегти знімок, щоб створити нову версію з поточним вмістом.
- Використовуйте Відновити для версії, щоб встановити вміст публікації на цю версію та перезавантажити редактор.
Відновлення не видаляє версії; воно оновлює вміст публікації, історія версій залишається.
Дорожня карта (залишок фази 2)
- Спринт 2.4: Компонент завантаження рисунків, покращення редактора таблиць, розширення перехресних посилань, інтеграція FileService для зображень.
- Спринт 2.5: Сервіси експорту (PDF, Word, Markdown), діалог експорту, кнопка та скорочення експорту.
Детальний розклад спрингів: Фаза 2: Покращення наукового редактора.
Науковий редактор
Науковий редактор Zemna.AI — це редактор форматованого тексту на базі Tiptap для академічного письма. Він підтримує формули LaTeX, автоматичне збереження, історію версій та збереження публікацій через шар бази даних Ring Platform.
Статус: Фаза 2 (спринти 2.1–2.3) завершені. Підтримка рисунків/таблиць та експорт заплановані в спринтах 2.4–2.5.
Огляд
| Можливість | Опис |
|---|---|
| Форматований текст | Заголовки (H1–H6), жирний, курсив, підкреслення, списки, цитати, блоки коду, таблиці, посилання, зображення |
| LaTeX | Інлайн та блокові формули через KaTeX; модальне вікно формул з попереднім переглядом та шаблонами |
| Автозбереження | Збереження з затримкою 30 с; перше збереження створює публікацію, далі оновлення через PUT |
| Історія версій | Знімки та відновлення версій; список версій з датами та опційними описами |
| Публікації | Вміст зберігається як Tiptap JSON; завантаження за ?id=... або створення нового |
Можливості редактора
Форматований текст (Tiptap)
Редактор використовує Tiptap з StarterKit та розширеннями для наукового письма:
- Форматування: Жирний, курсив, підкреслення, закреслення, надрядковий, підрядковий, виділення
- Структура: Заголовки H1–H6, нумеровані/марковані списки, блокові цитати
- Блоки: Блоки коду (підсвітка через lowlight), таблиці (рядки, стовпці, заголовок)
- Інлайн: Посилання, зображення (підтримка placeholder)
- Типографіка: Розумні лапки та покращення типографіки
Вміст зберігається як Tiptap JSON у полі публікації content; редактор приймає початковий вміст як рядок HTML або JSON для завантаження збережених публікацій.
Формули LaTeX
- Блокові формули: Вставка формул у режимі display через панель (іконка калькулятора) або модальне вікно формул.
- Відображення: KaTeX рендерить формули в редакторі; клік для редагування відкриває модальне вікно.
- Модальне вікно: Поле LaTeX, перемикач display/inline, попередній перегляд, кнопки шаблонів (дріб, сума, інтеграл, матриця), Вставити/Скасувати.
Формули зберігаються як власні вузли Tiptap (mathBlock) з атрибутами latex та display.
Автозбереження та публікації
- Новий документ: Немає
?id=у URL; перше «Зберегти» або перше автозбереження створює публікацію черезPOST /api/publicationsі встановлює id публікації для подальших збережень. - Існуючий документ: Відкрити з
?id=<publicationId>; сторінка завантажує публікацію і встановлює заголовок та вміст (JSON). Автозбереження та ручне «Зберегти» використовуютьPUT /api/publications/:id. - Затримка: Зміни заголовка або вмісту запускають збереження з затримкою 30 с; ручне «Зберегти» виконує збереження одразу.
- Індикатор збереження: На панелі відображається «Збережено» з часом останнього успішного збереження.
Історія версій
- Панель: Кнопка «Історія версій» на панелі відкриває діалог зі списком версій (номер версії, дата, опційний опис).
- Знімок: «Зберегти знімок» створює нову версію з поточним вмістом (опційний опис змін).
- Відновити: «Відновити» для версії оновлює вміст публікації до цієї версії та перезавантажує редактор; панель закривається, редактор показує відновлений вміст.
Архітектура
Схема публікацій
Публікації та версії використовують абстракцію бази даних Ring Platform (PostgreSQL з JSONB):
publications:id,data(JSONB),created_at,updated_at.
dataмістить:user_id,title,content(Tiptap JSON),status,template_id.publication_versions:id,data(JSONB),created_at,updated_at.
dataмістить:publication_id,version_number,content,change_summary,created_by.
Схема визначена в data/schema.sql; адаптер PostgreSQL має fieldMappings для обох колекцій.
Потік збереження
sequenceDiagram
participant User
participant Editor
participant useAutoSave
participant API
participant DB
User->>Editor: Edit content / title
Editor->>useAutoSave: touch(publicationId, payload)
useAutoSave->>useAutoSave: Debounce 30s
Note over useAutoSave: Timer fires
useAutoSave->>API: POST /api/publications (new) or PUT /api/publications/:id
API->>DB: create() or update()
DB-->>API: publication
API-->>useAutoSave: 200 + publication
useAutoSave->>Editor: onFirstSave(id) if new
useAutoSave->>Editor: lastSaved updated
Потік історії версій
sequenceDiagram
participant User
participant Panel
participant API
participant DB
User->>Panel: Open Version History
Panel->>API: GET /api/publications/:id/versions
API->>DB: findByField(publication_versions, publication_id, id)
DB-->>API: versions[]
API-->>Panel: versions
User->>Panel: Restore version V
Panel->>API: POST /api/publications/:id/versions { action: 'restore', versionId: V }
API->>DB: updatePublication(id, content from V)
DB-->>API: publication
API-->>Panel: 200
Panel->>User: onRestore() → refetch publication, set editor content
API-маршрути
| Метод | Шлях | Опис |
|---|---|---|
| GET | /api/publications | Список публікацій поточного користувача |
| POST | /api/publications | Створити публікацію (body: title, content, status, template_id) |
| GET | /api/publications/[id] | Отримати публікацію (перевірка власності) |
| PUT | /api/publications/[id] | Оновити публікацію (перевірка власності) |
| DELETE | /api/publications/[id] | Видалити публікацію (перевірка власності) |
| GET | /api/publications/[id]/versions | Список версій публікації |
| POST | /api/publications/[id]/versions | Знімок (action: snapshot) або відновлення (action: restore, versionId) |
Усі маршрути потребують автентифікації; для get/update/delete та версій перевіряється власність.
Ключові файли
| Область | Шлях |
|---|---|
| Сторінка редактора | app/(authenticated)/[locale]/editor/page.tsx |
| Науковий редактор | components/editor/scientific-editor.tsx |
| Панель інструментів | components/editor/editor-toolbar.tsx |
| Розширення LaTeX | components/editor/extensions/latex-extension.tsx |
| Модальне вікно формул | components/editor/equation-editor.tsx |
| Панель історії версій | components/editor/version-history-panel.tsx |
| Хук автозбереження | hooks/use-auto-save.ts |
| Типи публікацій | features/publications/types/index.ts |
| Сервіс публікацій | features/publications/services/publication-service.ts |
| API-маршрути | app/(public)/api/publications/ |
| Схема | data/schema.sql |
Використання
Відкриття редактора
- Нова публікація: Перейдіть на
/editor(або/[locale]/editor). Редактор завантажується з типовим науковим шаблоном; id публікації встановлюється при першому збереженні. - Існуюча публікація: Перейдіть на
/editor?id=<publicationId>. Сторінка отримує публікацію та встановлює заголовок і вміст (Tiptap JSON) в редакторі.
Збереження
- Вручну: Натисніть Зберегти на панелі. Для нового документу це створює публікацію та встановлює id; для існуючого — оновлення через PUT.
- Автозбереження: Через 30 секунд без змін поточний заголовок та вміст зберігаються автоматично (POST для нового, PUT для існуючого).
Історія версій
- Натисніть Історія версій (іконка історії) на панелі.
- Використовуйте Зберегти знімок, щоб створити нову версію з поточним вмістом.
- Використовуйте Відновити для версії, щоб встановити вміст публікації на цю версію та перезавантажити редактор.
Відновлення не видаляє версії; воно оновлює вміст публікації, історія версій залишається.
Дорожня карта (залишок фази 2)
- Спринт 2.4: Компонент завантаження рисунків, покращення редактора таблиць, розширення перехресних посилань, інтеграція FileService для зображень.
- Спринт 2.5: Сервіси експорту (PDF, Word, Markdown), діалог експорту, кнопка та скорочення експорту.
Детальний розклад спрингів: Фаза 2: Покращення наукового редактора.
Науковий редактор
Науковий редактор Zemna.AI — це редактор форматованого тексту на базі Tiptap для академічного письма. Він підтримує формули LaTeX, автоматичне збереження, історію версій та збереження публікацій через шар бази даних Ring Platform.
Статус: Фаза 2 (спринти 2.1–2.3) завершені. Підтримка рисунків/таблиць та експорт заплановані в спринтах 2.4–2.5.
Огляд
| Можливість | Опис |
|---|---|
| Форматований текст | Заголовки (H1–H6), жирний, курсив, підкреслення, списки, цитати, блоки коду, таблиці, посилання, зображення |
| LaTeX | Інлайн та блокові формули через KaTeX; модальне вікно формул з попереднім переглядом та шаблонами |
| Автозбереження | Збереження з затримкою 30 с; перше збереження створює публікацію, далі оновлення через PUT |
| Історія версій | Знімки та відновлення версій; список версій з датами та опційними описами |
| Публікації | Вміст зберігається як Tiptap JSON; завантаження за ?id=... або створення нового |
Можливості редактора
Форматований текст (Tiptap)
Редактор використовує Tiptap з StarterKit та розширеннями для наукового письма:
- Форматування: Жирний, курсив, підкреслення, закреслення, надрядковий, підрядковий, виділення
- Структура: Заголовки H1–H6, нумеровані/марковані списки, блокові цитати
- Блоки: Блоки коду (підсвітка через lowlight), таблиці (рядки, стовпці, заголовок)
- Інлайн: Посилання, зображення (підтримка placeholder)
- Типографіка: Розумні лапки та покращення типографіки
Вміст зберігається як Tiptap JSON у полі публікації content; редактор приймає початковий вміст як рядок HTML або JSON для завантаження збережених публікацій.
Формули LaTeX
- Блокові формули: Вставка формул у режимі display через панель (іконка калькулятора) або модальне вікно формул.
- Відображення: KaTeX рендерить формули в редакторі; клік для редагування відкриває модальне вікно.
- Модальне вікно: Поле LaTeX, перемикач display/inline, попередній перегляд, кнопки шаблонів (дріб, сума, інтеграл, матриця), Вставити/Скасувати.
Формули зберігаються як власні вузли Tiptap (mathBlock) з атрибутами latex та display.
Автозбереження та публікації
- Новий документ: Немає
?id=у URL; перше «Зберегти» або перше автозбереження створює публікацію черезPOST /api/publicationsі встановлює id публікації для подальших збережень. - Існуючий документ: Відкрити з
?id=<publicationId>; сторінка завантажує публікацію і встановлює заголовок та вміст (JSON). Автозбереження та ручне «Зберегти» використовуютьPUT /api/publications/:id. - Затримка: Зміни заголовка або вмісту запускають збереження з затримкою 30 с; ручне «Зберегти» виконує збереження одразу.
- Індикатор збереження: На панелі відображається «Збережено» з часом останнього успішного збереження.
Історія версій
- Панель: Кнопка «Історія версій» на панелі відкриває діалог зі списком версій (номер версії, дата, опційний опис).
- Знімок: «Зберегти знімок» створює нову версію з поточним вмістом (опційний опис змін).
- Відновити: «Відновити» для версії оновлює вміст публікації до цієї версії та перезавантажує редактор; панель закривається, редактор показує відновлений вміст.
Архітектура
Схема публікацій
Публікації та версії використовують абстракцію бази даних Ring Platform (PostgreSQL з JSONB):
publications:id,data(JSONB),created_at,updated_at.
dataмістить:user_id,title,content(Tiptap JSON),status,template_id.publication_versions:id,data(JSONB),created_at,updated_at.
dataмістить:publication_id,version_number,content,change_summary,created_by.
Схема визначена в data/schema.sql; адаптер PostgreSQL має fieldMappings для обох колекцій.
Потік збереження
sequenceDiagram
participant User
participant Editor
participant useAutoSave
participant API
participant DB
User->>Editor: Edit content / title
Editor->>useAutoSave: touch(publicationId, payload)
useAutoSave->>useAutoSave: Debounce 30s
Note over useAutoSave: Timer fires
useAutoSave->>API: POST /api/publications (new) or PUT /api/publications/:id
API->>DB: create() or update()
DB-->>API: publication
API-->>useAutoSave: 200 + publication
useAutoSave->>Editor: onFirstSave(id) if new
useAutoSave->>Editor: lastSaved updated
Потік історії версій
sequenceDiagram
participant User
participant Panel
participant API
participant DB
User->>Panel: Open Version History
Panel->>API: GET /api/publications/:id/versions
API->>DB: findByField(publication_versions, publication_id, id)
DB-->>API: versions[]
API-->>Panel: versions
User->>Panel: Restore version V
Panel->>API: POST /api/publications/:id/versions { action: 'restore', versionId: V }
API->>DB: updatePublication(id, content from V)
DB-->>API: publication
API-->>Panel: 200
Panel->>User: onRestore() → refetch publication, set editor content
API-маршрути
| Метод | Шлях | Опис |
|---|---|---|
| GET | /api/publications | Список публікацій поточного користувача |
| POST | /api/publications | Створити публікацію (body: title, content, status, template_id) |
| GET | /api/publications/[id] | Отримати публікацію (перевірка власності) |
| PUT | /api/publications/[id] | Оновити публікацію (перевірка власності) |
| DELETE | /api/publications/[id] | Видалити публікацію (перевірка власності) |
| GET | /api/publications/[id]/versions | Список версій публікації |
| POST | /api/publications/[id]/versions | Знімок (action: snapshot) або відновлення (action: restore, versionId) |
Усі маршрути потребують автентифікації; для get/update/delete та версій перевіряється власність.
Ключові файли
| Область | Шлях |
|---|---|
| Сторінка редактора | app/(authenticated)/[locale]/editor/page.tsx |
| Науковий редактор | components/editor/scientific-editor.tsx |
| Панель інструментів | components/editor/editor-toolbar.tsx |
| Розширення LaTeX | components/editor/extensions/latex-extension.tsx |
| Модальне вікно формул | components/editor/equation-editor.tsx |
| Панель історії версій | components/editor/version-history-panel.tsx |
| Хук автозбереження | hooks/use-auto-save.ts |
| Типи публікацій | features/publications/types/index.ts |
| Сервіс публікацій | features/publications/services/publication-service.ts |
| API-маршрути | app/(public)/api/publications/ |
| Схема | data/schema.sql |
Використання
Відкриття редактора
- Нова публікація: Перейдіть на
/editor(або/[locale]/editor). Редактор завантажується з типовим науковим шаблоном; id публікації встановлюється при першому збереженні. - Існуюча публікація: Перейдіть на
/editor?id=<publicationId>. Сторінка отримує публікацію та встановлює заголовок і вміст (Tiptap JSON) в редакторі.
Збереження
- Вручну: Натисніть Зберегти на панелі. Для нового документу це створює публікацію та встановлює id; для існуючого — оновлення через PUT.
- Автозбереження: Через 30 секунд без змін поточний заголовок та вміст зберігаються автоматично (POST для нового, PUT для існуючого).
Історія версій
- Натисніть Історія версій (іконка історії) на панелі.
- Використовуйте Зберегти знімок, щоб створити нову версію з поточним вмістом.
- Використовуйте Відновити для версії, щоб встановити вміст публікації на цю версію та перезавантажити редактор.
Відновлення не видаляє версії; воно оновлює вміст публікації, історія версій залишається.
Дорожня карта (залишок фази 2)
- Спринт 2.4: Компонент завантаження рисунків, покращення редактора таблиць, розширення перехресних посилань, інтеграція FileService для зображень.
- Спринт 2.5: Сервіси експорту (PDF, Word, Markdown), діалог експорту, кнопка та скорочення експорту.
Детальний розклад спрингів: Фаза 2: Покращення наукового редактора.
Науковий редактор
Науковий редактор Zemna.AI — це редактор форматованого тексту на базі Tiptap для академічного письма. Він підтримує формули LaTeX, автоматичне збереження, історію версій та збереження публікацій через шар бази даних Ring Platform.
Статус: Фаза 2 (спринти 2.1–2.3) завершені. Підтримка рисунків/таблиць та експорт заплановані в спринтах 2.4–2.5.
Огляд
| Можливість | Опис |
|---|---|
| Форматований текст | Заголовки (H1–H6), жирний, курсив, підкреслення, списки, цитати, блоки коду, таблиці, посилання, зображення |
| LaTeX | Інлайн та блокові формули через KaTeX; модальне вікно формул з попереднім переглядом та шаблонами |
| Автозбереження | Збереження з затримкою 30 с; перше збереження створює публікацію, далі оновлення через PUT |
| Історія версій | Знімки та відновлення версій; список версій з датами та опційними описами |
| Публікації | Вміст зберігається як Tiptap JSON; завантаження за ?id=... або створення нового |
Можливості редактора
Форматований текст (Tiptap)
Редактор використовує Tiptap з StarterKit та розширеннями для наукового письма:
- Форматування: Жирний, курсив, підкреслення, закреслення, надрядковий, підрядковий, виділення
- Структура: Заголовки H1–H6, нумеровані/марковані списки, блокові цитати
- Блоки: Блоки коду (підсвітка через lowlight), таблиці (рядки, стовпці, заголовок)
- Інлайн: Посилання, зображення (підтримка placeholder)
- Типографіка: Розумні лапки та покращення типографіки
Вміст зберігається як Tiptap JSON у полі публікації content; редактор приймає початковий вміст як рядок HTML або JSON для завантаження збережених публікацій.
Формули LaTeX
- Блокові формули: Вставка формул у режимі display через панель (іконка калькулятора) або модальне вікно формул.
- Відображення: KaTeX рендерить формули в редакторі; клік для редагування відкриває модальне вікно.
- Модальне вікно: Поле LaTeX, перемикач display/inline, попередній перегляд, кнопки шаблонів (дріб, сума, інтеграл, матриця), Вставити/Скасувати.
Формули зберігаються як власні вузли Tiptap (mathBlock) з атрибутами latex та display.
Автозбереження та публікації
- Новий документ: Немає
?id=у URL; перше «Зберегти» або перше автозбереження створює публікацію черезPOST /api/publicationsі встановлює id публікації для подальших збережень. - Існуючий документ: Відкрити з
?id=<publicationId>; сторінка завантажує публікацію і встановлює заголовок та вміст (JSON). Автозбереження та ручне «Зберегти» використовуютьPUT /api/publications/:id. - Затримка: Зміни заголовка або вмісту запускають збереження з затримкою 30 с; ручне «Зберегти» виконує збереження одразу.
- Індикатор збереження: На панелі відображається «Збережено» з часом останнього успішного збереження.
Історія версій
- Панель: Кнопка «Історія версій» на панелі відкриває діалог зі списком версій (номер версії, дата, опційний опис).
- Знімок: «Зберегти знімок» створює нову версію з поточним вмістом (опційний опис змін).
- Відновити: «Відновити» для версії оновлює вміст публікації до цієї версії та перезавантажує редактор; панель закривається, редактор показує відновлений вміст.
Архітектура
Схема публікацій
Публікації та версії використовують абстракцію бази даних Ring Platform (PostgreSQL з JSONB):
publications:id,data(JSONB),created_at,updated_at.
dataмістить:user_id,title,content(Tiptap JSON),status,template_id.publication_versions:id,data(JSONB),created_at,updated_at.
dataмістить:publication_id,version_number,content,change_summary,created_by.
Схема визначена в data/schema.sql; адаптер PostgreSQL має fieldMappings для обох колекцій.
Потік збереження
sequenceDiagram
participant User
participant Editor
participant useAutoSave
participant API
participant DB
User->>Editor: Edit content / title
Editor->>useAutoSave: touch(publicationId, payload)
useAutoSave->>useAutoSave: Debounce 30s
Note over useAutoSave: Timer fires
useAutoSave->>API: POST /api/publications (new) or PUT /api/publications/:id
API->>DB: create() or update()
DB-->>API: publication
API-->>useAutoSave: 200 + publication
useAutoSave->>Editor: onFirstSave(id) if new
useAutoSave->>Editor: lastSaved updated
Потік історії версій
sequenceDiagram
participant User
participant Panel
participant API
participant DB
User->>Panel: Open Version History
Panel->>API: GET /api/publications/:id/versions
API->>DB: findByField(publication_versions, publication_id, id)
DB-->>API: versions[]
API-->>Panel: versions
User->>Panel: Restore version V
Panel->>API: POST /api/publications/:id/versions { action: 'restore', versionId: V }
API->>DB: updatePublication(id, content from V)
DB-->>API: publication
API-->>Panel: 200
Panel->>User: onRestore() → refetch publication, set editor content
API-маршрути
| Метод | Шлях | Опис |
|---|---|---|
| GET | /api/publications | Список публікацій поточного користувача |
| POST | /api/publications | Створити публікацію (body: title, content, status, template_id) |
| GET | /api/publications/[id] | Отримати публікацію (перевірка власності) |
| PUT | /api/publications/[id] | Оновити публікацію (перевірка власності) |
| DELETE | /api/publications/[id] | Видалити публікацію (перевірка власності) |
| GET | /api/publications/[id]/versions | Список версій публікації |
| POST | /api/publications/[id]/versions | Знімок (action: snapshot) або відновлення (action: restore, versionId) |
Усі маршрути потребують автентифікації; для get/update/delete та версій перевіряється власність.
Ключові файли
| Область | Шлях |
|---|---|
| Сторінка редактора | app/(authenticated)/[locale]/editor/page.tsx |
| Науковий редактор | components/editor/scientific-editor.tsx |
| Панель інструментів | components/editor/editor-toolbar.tsx |
| Розширення LaTeX | components/editor/extensions/latex-extension.tsx |
| Модальне вікно формул | components/editor/equation-editor.tsx |
| Панель історії версій | components/editor/version-history-panel.tsx |
| Хук автозбереження | hooks/use-auto-save.ts |
| Типи публікацій | features/publications/types/index.ts |
| Сервіс публікацій | features/publications/services/publication-service.ts |
| API-маршрути | app/(public)/api/publications/ |
| Схема | data/schema.sql |
Використання
Відкриття редактора
- Нова публікація: Перейдіть на
/editor(або/[locale]/editor). Редактор завантажується з типовим науковим шаблоном; id публікації встановлюється при першому збереженні. - Існуюча публікація: Перейдіть на
/editor?id=<publicationId>. Сторінка отримує публікацію та встановлює заголовок і вміст (Tiptap JSON) в редакторі.
Збереження
- Вручну: Натисніть Зберегти на панелі. Для нового документу це створює публікацію та встановлює id; для існуючого — оновлення через PUT.
- Автозбереження: Через 30 секунд без змін поточний заголовок та вміст зберігаються автоматично (POST для нового, PUT для існуючого).
Історія версій
- Натисніть Історія версій (іконка історії) на панелі.
- Використовуйте Зберегти знімок, щоб створити нову версію з поточним вмістом.
- Використовуйте Відновити для версії, щоб встановити вміст публікації на цю версію та перезавантажити редактор.
Відновлення не видаляє версії; воно оновлює вміст публікації, історія версій залишається.
Дорожня карта (залишок фази 2)
- Спринт 2.4: Компонент завантаження рисунків, покращення редактора таблиць, розширення перехресних посилань, інтеграція FileService для зображень.
- Спринт 2.5: Сервіси експорту (PDF, Word, Markdown), діалог експорту, кнопка та скорочення експорту.
Детальний розклад спрингів: Фаза 2: Покращення наукового редактора.
Documentation
📚 Documentation
Науковий редактор
Науковий редактор Zemna.AI — це редактор форматованого тексту на базі Tiptap для академічного письма. Він підтримує формули LaTeX, автоматичне збереження, історію версій та збереження публікацій через шар бази даних Ring Platform.
Статус: Фаза 2 (спринти 2.1–2.3) завершені. Підтримка рисунків/таблиць та експорт заплановані в спринтах 2.4–2.5.
Огляд
| Можливість | Опис |
|---|---|
| Форматований текст | Заголовки (H1–H6), жирний, курсив, підкреслення, списки, цитати, блоки коду, таблиці, посилання, зображення |
| LaTeX | Інлайн та блокові формули через KaTeX; модальне вікно формул з попереднім переглядом та шаблонами |
| Автозбереження | Збереження з затримкою 30 с; перше збереження створює публікацію, далі оновлення через PUT |
| Історія версій | Знімки та відновлення версій; список версій з датами та опційними описами |
| Публікації | Вміст зберігається як Tiptap JSON; завантаження за ?id=... або створення нового |
Можливості редактора
Форматований текст (Tiptap)
Редактор використовує Tiptap з StarterKit та розширеннями для наукового письма:
- Форматування: Жирний, курсив, підкреслення, закреслення, надрядковий, підрядковий, виділення
- Структура: Заголовки H1–H6, нумеровані/марковані списки, блокові цитати
- Блоки: Блоки коду (підсвітка через lowlight), таблиці (рядки, стовпці, заголовок)
- Інлайн: Посилання, зображення (підтримка placeholder)
- Типографіка: Розумні лапки та покращення типографіки
Вміст зберігається як Tiptap JSON у полі публікації content; редактор приймає початковий вміст як рядок HTML або JSON для завантаження збережених публікацій.
Формули LaTeX
- Блокові формули: Вставка формул у режимі display через панель (іконка калькулятора) або модальне вікно формул.
- Відображення: KaTeX рендерить формули в редакторі; клік для редагування відкриває модальне вікно.
- Модальне вікно: Поле LaTeX, перемикач display/inline, попередній перегляд, кнопки шаблонів (дріб, сума, інтеграл, матриця), Вставити/Скасувати.
Формули зберігаються як власні вузли Tiptap (mathBlock) з атрибутами latex та display.
Автозбереження та публікації
- Новий документ: Немає
?id=у URL; перше «Зберегти» або перше автозбереження створює публікацію черезPOST /api/publicationsі встановлює id публікації для подальших збережень. - Існуючий документ: Відкрити з
?id=<publicationId>; сторінка завантажує публікацію і встановлює заголовок та вміст (JSON). Автозбереження та ручне «Зберегти» використовуютьPUT /api/publications/:id. - Затримка: Зміни заголовка або вмісту запускають збереження з затримкою 30 с; ручне «Зберегти» виконує збереження одразу.
- Індикатор збереження: На панелі відображається «Збережено» з часом останнього успішного збереження.
Історія версій
- Панель: Кнопка «Історія версій» на панелі відкриває діалог зі списком версій (номер версії, дата, опційний опис).
- Знімок: «Зберегти знімок» створює нову версію з поточним вмістом (опційний опис змін).
- Відновити: «Відновити» для версії оновлює вміст публікації до цієї версії та перезавантажує редактор; панель закривається, редактор показує відновлений вміст.
Архітектура
Схема публікацій
Публікації та версії використовують абстракцію бази даних Ring Platform (PostgreSQL з JSONB):
publications:id,data(JSONB),created_at,updated_at.
dataмістить:user_id,title,content(Tiptap JSON),status,template_id.publication_versions:id,data(JSONB),created_at,updated_at.
dataмістить:publication_id,version_number,content,change_summary,created_by.
Схема визначена в data/schema.sql; адаптер PostgreSQL має fieldMappings для обох колекцій.
Потік збереження
sequenceDiagram
participant User
participant Editor
participant useAutoSave
participant API
participant DB
User->>Editor: Edit content / title
Editor->>useAutoSave: touch(publicationId, payload)
useAutoSave->>useAutoSave: Debounce 30s
Note over useAutoSave: Timer fires
useAutoSave->>API: POST /api/publications (new) or PUT /api/publications/:id
API->>DB: create() or update()
DB-->>API: publication
API-->>useAutoSave: 200 + publication
useAutoSave->>Editor: onFirstSave(id) if new
useAutoSave->>Editor: lastSaved updated
Потік історії версій
sequenceDiagram
participant User
participant Panel
participant API
participant DB
User->>Panel: Open Version History
Panel->>API: GET /api/publications/:id/versions
API->>DB: findByField(publication_versions, publication_id, id)
DB-->>API: versions[]
API-->>Panel: versions
User->>Panel: Restore version V
Panel->>API: POST /api/publications/:id/versions { action: 'restore', versionId: V }
API->>DB: updatePublication(id, content from V)
DB-->>API: publication
API-->>Panel: 200
Panel->>User: onRestore() → refetch publication, set editor content
API-маршрути
| Метод | Шлях | Опис |
|---|---|---|
| GET | /api/publications | Список публікацій поточного користувача |
| POST | /api/publications | Створити публікацію (body: title, content, status, template_id) |
| GET | /api/publications/[id] | Отримати публікацію (перевірка власності) |
| PUT | /api/publications/[id] | Оновити публікацію (перевірка власності) |
| DELETE | /api/publications/[id] | Видалити публікацію (перевірка власності) |
| GET | /api/publications/[id]/versions | Список версій публікації |
| POST | /api/publications/[id]/versions | Знімок (action: snapshot) або відновлення (action: restore, versionId) |
Усі маршрути потребують автентифікації; для get/update/delete та версій перевіряється власність.
Ключові файли
| Область | Шлях |
|---|---|
| Сторінка редактора | app/(authenticated)/[locale]/editor/page.tsx |
| Науковий редактор | components/editor/scientific-editor.tsx |
| Панель інструментів | components/editor/editor-toolbar.tsx |
| Розширення LaTeX | components/editor/extensions/latex-extension.tsx |
| Модальне вікно формул | components/editor/equation-editor.tsx |
| Панель історії версій | components/editor/version-history-panel.tsx |
| Хук автозбереження | hooks/use-auto-save.ts |
| Типи публікацій | features/publications/types/index.ts |
| Сервіс публікацій | features/publications/services/publication-service.ts |
| API-маршрути | app/(public)/api/publications/ |
| Схема | data/schema.sql |
Використання
Відкриття редактора
- Нова публікація: Перейдіть на
/editor(або/[locale]/editor). Редактор завантажується з типовим науковим шаблоном; id публікації встановлюється при першому збереженні. - Існуюча публікація: Перейдіть на
/editor?id=<publicationId>. Сторінка отримує публікацію та встановлює заголовок і вміст (Tiptap JSON) в редакторі.
Збереження
- Вручну: Натисніть Зберегти на панелі. Для нового документу це створює публікацію та встановлює id; для існуючого — оновлення через PUT.
- Автозбереження: Через 30 секунд без змін поточний заголовок та вміст зберігаються автоматично (POST для нового, PUT для існуючого).
Історія версій
- Натисніть Історія версій (іконка історії) на панелі.
- Використовуйте Зберегти знімок, щоб створити нову версію з поточним вмістом.
- Використовуйте Відновити для версії, щоб встановити вміст публікації на цю версію та перезавантажити редактор.
Відновлення не видаляє версії; воно оновлює вміст публікації, історія версій залишається.
Дорожня карта (залишок фази 2)
- Спринт 2.4: Компонент завантаження рисунків, покращення редактора таблиць, розширення перехресних посилань, інтеграція FileService для зображень.
- Спринт 2.5: Сервіси експорту (PDF, Word, Markdown), діалог експорту, кнопка та скорочення експорту.
Детальний розклад спрингів: Фаза 2: Покращення наукового редактора.
Науковий редактор
Науковий редактор Zemna.AI — це редактор форматованого тексту на базі Tiptap для академічного письма. Він підтримує формули LaTeX, автоматичне збереження, історію версій та збереження публікацій через шар бази даних Ring Platform.
Статус: Фаза 2 (спринти 2.1–2.3) завершені. Підтримка рисунків/таблиць та експорт заплановані в спринтах 2.4–2.5.
Огляд
| Можливість | Опис |
|---|---|
| Форматований текст | Заголовки (H1–H6), жирний, курсив, підкреслення, списки, цитати, блоки коду, таблиці, посилання, зображення |
| LaTeX | Інлайн та блокові формули через KaTeX; модальне вікно формул з попереднім переглядом та шаблонами |
| Автозбереження | Збереження з затримкою 30 с; перше збереження створює публікацію, далі оновлення через PUT |
| Історія версій | Знімки та відновлення версій; список версій з датами та опційними описами |
| Публікації | Вміст зберігається як Tiptap JSON; завантаження за ?id=... або створення нового |
Можливості редактора
Форматований текст (Tiptap)
Редактор використовує Tiptap з StarterKit та розширеннями для наукового письма:
- Форматування: Жирний, курсив, підкреслення, закреслення, надрядковий, підрядковий, виділення
- Структура: Заголовки H1–H6, нумеровані/марковані списки, блокові цитати
- Блоки: Блоки коду (підсвітка через lowlight), таблиці (рядки, стовпці, заголовок)
- Інлайн: Посилання, зображення (підтримка placeholder)
- Типографіка: Розумні лапки та покращення типографіки
Вміст зберігається як Tiptap JSON у полі публікації content; редактор приймає початковий вміст як рядок HTML або JSON для завантаження збережених публікацій.
Формули LaTeX
- Блокові формули: Вставка формул у режимі display через панель (іконка калькулятора) або модальне вікно формул.
- Відображення: KaTeX рендерить формули в редакторі; клік для редагування відкриває модальне вікно.
- Модальне вікно: Поле LaTeX, перемикач display/inline, попередній перегляд, кнопки шаблонів (дріб, сума, інтеграл, матриця), Вставити/Скасувати.
Формули зберігаються як власні вузли Tiptap (mathBlock) з атрибутами latex та display.
Автозбереження та публікації
- Новий документ: Немає
?id=у URL; перше «Зберегти» або перше автозбереження створює публікацію черезPOST /api/publicationsі встановлює id публікації для подальших збережень. - Існуючий документ: Відкрити з
?id=<publicationId>; сторінка завантажує публікацію і встановлює заголовок та вміст (JSON). Автозбереження та ручне «Зберегти» використовуютьPUT /api/publications/:id. - Затримка: Зміни заголовка або вмісту запускають збереження з затримкою 30 с; ручне «Зберегти» виконує збереження одразу.
- Індикатор збереження: На панелі відображається «Збережено» з часом останнього успішного збереження.
Історія версій
- Панель: Кнопка «Історія версій» на панелі відкриває діалог зі списком версій (номер версії, дата, опційний опис).
- Знімок: «Зберегти знімок» створює нову версію з поточним вмістом (опційний опис змін).
- Відновити: «Відновити» для версії оновлює вміст публікації до цієї версії та перезавантажує редактор; панель закривається, редактор показує відновлений вміст.
Архітектура
Схема публікацій
Публікації та версії використовують абстракцію бази даних Ring Platform (PostgreSQL з JSONB):
publications:id,data(JSONB),created_at,updated_at.
dataмістить:user_id,title,content(Tiptap JSON),status,template_id.publication_versions:id,data(JSONB),created_at,updated_at.
dataмістить:publication_id,version_number,content,change_summary,created_by.
Схема визначена в data/schema.sql; адаптер PostgreSQL має fieldMappings для обох колекцій.
Потік збереження
sequenceDiagram
participant User
participant Editor
participant useAutoSave
participant API
participant DB
User->>Editor: Edit content / title
Editor->>useAutoSave: touch(publicationId, payload)
useAutoSave->>useAutoSave: Debounce 30s
Note over useAutoSave: Timer fires
useAutoSave->>API: POST /api/publications (new) or PUT /api/publications/:id
API->>DB: create() or update()
DB-->>API: publication
API-->>useAutoSave: 200 + publication
useAutoSave->>Editor: onFirstSave(id) if new
useAutoSave->>Editor: lastSaved updated
Потік історії версій
sequenceDiagram
participant User
participant Panel
participant API
participant DB
User->>Panel: Open Version History
Panel->>API: GET /api/publications/:id/versions
API->>DB: findByField(publication_versions, publication_id, id)
DB-->>API: versions[]
API-->>Panel: versions
User->>Panel: Restore version V
Panel->>API: POST /api/publications/:id/versions { action: 'restore', versionId: V }
API->>DB: updatePublication(id, content from V)
DB-->>API: publication
API-->>Panel: 200
Panel->>User: onRestore() → refetch publication, set editor content
API-маршрути
| Метод | Шлях | Опис |
|---|---|---|
| GET | /api/publications | Список публікацій поточного користувача |
| POST | /api/publications | Створити публікацію (body: title, content, status, template_id) |
| GET | /api/publications/[id] | Отримати публікацію (перевірка власності) |
| PUT | /api/publications/[id] | Оновити публікацію (перевірка власності) |
| DELETE | /api/publications/[id] | Видалити публікацію (перевірка власності) |
| GET | /api/publications/[id]/versions | Список версій публікації |
| POST | /api/publications/[id]/versions | Знімок (action: snapshot) або відновлення (action: restore, versionId) |
Усі маршрути потребують автентифікації; для get/update/delete та версій перевіряється власність.
Ключові файли
| Область | Шлях |
|---|---|
| Сторінка редактора | app/(authenticated)/[locale]/editor/page.tsx |
| Науковий редактор | components/editor/scientific-editor.tsx |
| Панель інструментів | components/editor/editor-toolbar.tsx |
| Розширення LaTeX | components/editor/extensions/latex-extension.tsx |
| Модальне вікно формул | components/editor/equation-editor.tsx |
| Панель історії версій | components/editor/version-history-panel.tsx |
| Хук автозбереження | hooks/use-auto-save.ts |
| Типи публікацій | features/publications/types/index.ts |
| Сервіс публікацій | features/publications/services/publication-service.ts |
| API-маршрути | app/(public)/api/publications/ |
| Схема | data/schema.sql |
Використання
Відкриття редактора
- Нова публікація: Перейдіть на
/editor(або/[locale]/editor). Редактор завантажується з типовим науковим шаблоном; id публікації встановлюється при першому збереженні. - Існуюча публікація: Перейдіть на
/editor?id=<publicationId>. Сторінка отримує публікацію та встановлює заголовок і вміст (Tiptap JSON) в редакторі.
Збереження
- Вручну: Натисніть Зберегти на панелі. Для нового документу це створює публікацію та встановлює id; для існуючого — оновлення через PUT.
- Автозбереження: Через 30 секунд без змін поточний заголовок та вміст зберігаються автоматично (POST для нового, PUT для існуючого).
Історія версій
- Натисніть Історія версій (іконка історії) на панелі.
- Використовуйте Зберегти знімок, щоб створити нову версію з поточним вмістом.
- Використовуйте Відновити для версії, щоб встановити вміст публікації на цю версію та перезавантажити редактор.
Відновлення не видаляє версії; воно оновлює вміст публікації, історія версій залишається.
Дорожня карта (залишок фази 2)
- Спринт 2.4: Компонент завантаження рисунків, покращення редактора таблиць, розширення перехресних посилань, інтеграція FileService для зображень.
- Спринт 2.5: Сервіси експорту (PDF, Word, Markdown), діалог експорту, кнопка та скорочення експорту.
Детальний розклад спрингів: Фаза 2: Покращення наукового редактора.
Науковий редактор
Науковий редактор Zemna.AI — це редактор форматованого тексту на базі Tiptap для академічного письма. Він підтримує формули LaTeX, автоматичне збереження, історію версій та збереження публікацій через шар бази даних Ring Platform.
Статус: Фаза 2 (спринти 2.1–2.3) завершені. Підтримка рисунків/таблиць та експорт заплановані в спринтах 2.4–2.5.
Огляд
| Можливість | Опис |
|---|---|
| Форматований текст | Заголовки (H1–H6), жирний, курсив, підкреслення, списки, цитати, блоки коду, таблиці, посилання, зображення |
| LaTeX | Інлайн та блокові формули через KaTeX; модальне вікно формул з попереднім переглядом та шаблонами |
| Автозбереження | Збереження з затримкою 30 с; перше збереження створює публікацію, далі оновлення через PUT |
| Історія версій | Знімки та відновлення версій; список версій з датами та опційними описами |
| Публікації | Вміст зберігається як Tiptap JSON; завантаження за ?id=... або створення нового |
Можливості редактора
Форматований текст (Tiptap)
Редактор використовує Tiptap з StarterKit та розширеннями для наукового письма:
- Форматування: Жирний, курсив, підкреслення, закреслення, надрядковий, підрядковий, виділення
- Структура: Заголовки H1–H6, нумеровані/марковані списки, блокові цитати
- Блоки: Блоки коду (підсвітка через lowlight), таблиці (рядки, стовпці, заголовок)
- Інлайн: Посилання, зображення (підтримка placeholder)
- Типографіка: Розумні лапки та покращення типографіки
Вміст зберігається як Tiptap JSON у полі публікації content; редактор приймає початковий вміст як рядок HTML або JSON для завантаження збережених публікацій.
Формули LaTeX
- Блокові формули: Вставка формул у режимі display через панель (іконка калькулятора) або модальне вікно формул.
- Відображення: KaTeX рендерить формули в редакторі; клік для редагування відкриває модальне вікно.
- Модальне вікно: Поле LaTeX, перемикач display/inline, попередній перегляд, кнопки шаблонів (дріб, сума, інтеграл, матриця), Вставити/Скасувати.
Формули зберігаються як власні вузли Tiptap (mathBlock) з атрибутами latex та display.
Автозбереження та публікації
- Новий документ: Немає
?id=у URL; перше «Зберегти» або перше автозбереження створює публікацію черезPOST /api/publicationsі встановлює id публікації для подальших збережень. - Існуючий документ: Відкрити з
?id=<publicationId>; сторінка завантажує публікацію і встановлює заголовок та вміст (JSON). Автозбереження та ручне «Зберегти» використовуютьPUT /api/publications/:id. - Затримка: Зміни заголовка або вмісту запускають збереження з затримкою 30 с; ручне «Зберегти» виконує збереження одразу.
- Індикатор збереження: На панелі відображається «Збережено» з часом останнього успішного збереження.
Історія версій
- Панель: Кнопка «Історія версій» на панелі відкриває діалог зі списком версій (номер версії, дата, опційний опис).
- Знімок: «Зберегти знімок» створює нову версію з поточним вмістом (опційний опис змін).
- Відновити: «Відновити» для версії оновлює вміст публікації до цієї версії та перезавантажує редактор; панель закривається, редактор показує відновлений вміст.
Архітектура
Схема публікацій
Публікації та версії використовують абстракцію бази даних Ring Platform (PostgreSQL з JSONB):
publications:id,data(JSONB),created_at,updated_at.
dataмістить:user_id,title,content(Tiptap JSON),status,template_id.publication_versions:id,data(JSONB),created_at,updated_at.
dataмістить:publication_id,version_number,content,change_summary,created_by.
Схема визначена в data/schema.sql; адаптер PostgreSQL має fieldMappings для обох колекцій.
Потік збереження
sequenceDiagram
participant User
participant Editor
participant useAutoSave
participant API
participant DB
User->>Editor: Edit content / title
Editor->>useAutoSave: touch(publicationId, payload)
useAutoSave->>useAutoSave: Debounce 30s
Note over useAutoSave: Timer fires
useAutoSave->>API: POST /api/publications (new) or PUT /api/publications/:id
API->>DB: create() or update()
DB-->>API: publication
API-->>useAutoSave: 200 + publication
useAutoSave->>Editor: onFirstSave(id) if new
useAutoSave->>Editor: lastSaved updated
Потік історії версій
sequenceDiagram
participant User
participant Panel
participant API
participant DB
User->>Panel: Open Version History
Panel->>API: GET /api/publications/:id/versions
API->>DB: findByField(publication_versions, publication_id, id)
DB-->>API: versions[]
API-->>Panel: versions
User->>Panel: Restore version V
Panel->>API: POST /api/publications/:id/versions { action: 'restore', versionId: V }
API->>DB: updatePublication(id, content from V)
DB-->>API: publication
API-->>Panel: 200
Panel->>User: onRestore() → refetch publication, set editor content
API-маршрути
| Метод | Шлях | Опис |
|---|---|---|
| GET | /api/publications | Список публікацій поточного користувача |
| POST | /api/publications | Створити публікацію (body: title, content, status, template_id) |
| GET | /api/publications/[id] | Отримати публікацію (перевірка власності) |
| PUT | /api/publications/[id] | Оновити публікацію (перевірка власності) |
| DELETE | /api/publications/[id] | Видалити публікацію (перевірка власності) |
| GET | /api/publications/[id]/versions | Список версій публікації |
| POST | /api/publications/[id]/versions | Знімок (action: snapshot) або відновлення (action: restore, versionId) |
Усі маршрути потребують автентифікації; для get/update/delete та версій перевіряється власність.
Ключові файли
| Область | Шлях |
|---|---|
| Сторінка редактора | app/(authenticated)/[locale]/editor/page.tsx |
| Науковий редактор | components/editor/scientific-editor.tsx |
| Панель інструментів | components/editor/editor-toolbar.tsx |
| Розширення LaTeX | components/editor/extensions/latex-extension.tsx |
| Модальне вікно формул | components/editor/equation-editor.tsx |
| Панель історії версій | components/editor/version-history-panel.tsx |
| Хук автозбереження | hooks/use-auto-save.ts |
| Типи публікацій | features/publications/types/index.ts |
| Сервіс публікацій | features/publications/services/publication-service.ts |
| API-маршрути | app/(public)/api/publications/ |
| Схема | data/schema.sql |
Використання
Відкриття редактора
- Нова публікація: Перейдіть на
/editor(або/[locale]/editor). Редактор завантажується з типовим науковим шаблоном; id публікації встановлюється при першому збереженні. - Існуюча публікація: Перейдіть на
/editor?id=<publicationId>. Сторінка отримує публікацію та встановлює заголовок і вміст (Tiptap JSON) в редакторі.
Збереження
- Вручну: Натисніть Зберегти на панелі. Для нового документу це створює публікацію та встановлює id; для існуючого — оновлення через PUT.
- Автозбереження: Через 30 секунд без змін поточний заголовок та вміст зберігаються автоматично (POST для нового, PUT для існуючого).
Історія версій
- Натисніть Історія версій (іконка історії) на панелі.
- Використовуйте Зберегти знімок, щоб створити нову версію з поточним вмістом.
- Використовуйте Відновити для версії, щоб встановити вміст публікації на цю версію та перезавантажити редактор.
Відновлення не видаляє версії; воно оновлює вміст публікації, історія версій залишається.
Дорожня карта (залишок фази 2)
- Спринт 2.4: Компонент завантаження рисунків, покращення редактора таблиць, розширення перехресних посилань, інтеграція FileService для зображень.
- Спринт 2.5: Сервіси експорту (PDF, Word, Markdown), діалог експорту, кнопка та скорочення експорту.
Детальний розклад спрингів: Фаза 2: Покращення наукового редактора.