Commit Graph

360 Commits

Author SHA1 Message Date
Zimin A.N. 5fb1658880 feat(sidebar): role-based visibility для /reviews
Phase 1d enhancement: 'Согласования' пункт сайдбара скрыт если у user'а
нет approver/reviewer ролей. Раньше показывался любому authenticated —
оператор без reviewer прав видел queue, кликал и получал пустую
страницу (или 403 если бы пробовал approve).

Visibility rules:
- 'Мои черновики' — auth (maker может быть любой)
- 'Согласования' — auth + (ordinis:schema:reviewer OR ordinis:record:reviewer
  OR ordinis:admin super-role) — иначе hidden
- 'Outbox' / 'Webhooks' / 'Аудит' — auth (admin-y но backend не gated
  отдельной ролью)

Новый NavItem.reviewerOnly flag — фильтр в visibleSections учитывает
оба flag'а (authRequired + reviewerOnly).

Применено и к desktop Sidebar и к MobileSidebar (DRY refactor — отдельный
task).
2026-05-13 13:52:40 +03:00
semantic-release-bot e183ff1d6c chore(release): v2.18.0
## [2.18.0](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/compare/v2.17.0...v2.18.0) (2026-05-13)

###  Features

* **auth:** WorkflowRoles configurable claim path + ordinis:admin super-role ([36c06ae](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/36c06ae1da52ebf515eaa5227c942f8343071188))
2026-05-13 10:29:04 +00:00
Zimin A.N. 36c06ae1da feat(auth): WorkflowRoles configurable claim path + ordinis:admin super-role
User report: token has roles в resource_access.ordinis.roles (client-scoped),
backend WorkflowRoles читал hardcoded realm_access.roles → forbidden_role
для всех reviewer actions.

Backend:
- WorkflowRoles: depends OrdinisAuthProperties → reads via rolesClaim path
  (же что ScopeContext). Default realm_access.roles, на staging/prod env
  var ORDINIS_AUTH_ROLES_CLAIM=resource_access.ordinis.roles (уже wired
  в helm helper).
- Nested claim path resolver — mirror ScopeContext.readClaimByPath
- New super-role ADMIN ('ordinis:admin') — holder автоматически проходит
  любой workflow check без явного назначения отдельных ролей. Convenience
  для small teams.

Frontend (usePermissions.ts):
- tokenRoles() читает оба claim path (realm_access.roles +
  resource_access.ordinis.roles) и объединяет — UI gate работает
  независимо от backend config
- hasRole() recognizes 'ordinis:admin' как super-role override
- ROLE_ADMIN exported

Docs:
- docs/operator/rbac.md: добавлен ordinis:admin row, JWT claim path note,
  Admin profile updated (super-role vs composite explanation)
2026-05-13 13:17:54 +03:00
semantic-release-bot 031a582167 chore(release): v2.17.0
## [2.17.0](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/compare/v2.16.4...v2.17.0) (2026-05-13)

###  Features

* **auth:** Phase 1d — backend role enforcement для workflow ([24aa94d](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/24aa94d13007b7d2d9716a6afb7fdbc54a32d8ba))

### ♻️ Refactoring

* **auth:** domain-specific role names (consistent convention) ([c5b00ff](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/c5b00ff62314942f6b2cee09993d9ddd8648e8e2))

### 📝 Docs

* **rbac:** добавить матрицу realm-ролей Keycloak ([1dba947](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/1dba9476db036d4f5688d409aae4c39b5b5a441c))
2026-05-13 10:06:16 +00:00
Zimin A.N. c5b00ff623 refactor(auth): domain-specific role names (consistent convention)
User feedback: универсальный 'ordinis:approver' отступал от convention
'ordinis:<domain>:<action>'. Меняю на domain-specific:

WorkflowRoles constants:
- APPROVER → SCHEMA_REVIEWER ('ordinis:schema:reviewer')
- PUBLISHER → SCHEMA_PUBLISHER ('ordinis:schema:publisher')
- Новая RECORD_REVIEWER ('ordinis:record:reviewer')

Applied:
- SchemaDraftService.decide() → require SCHEMA_REVIEWER
- SchemaDraftService.publish() → require SCHEMA_PUBLISHER
- DraftService.approve() / .reject() → require RECORD_REVIEWER

Frontend usePermissions.ts:
- ROLE_APPROVER + ROLE_PUBLISHER → ROLE_SCHEMA_REVIEWER +
  ROLE_SCHEMA_PUBLISHER + ROLE_RECORD_REVIEWER
- Новый hook useCanReviewRecord() для record draft actions

Keycloak setup (updated):
- ordinis:schema:reviewer
- ordinis:schema:publisher
- ordinis:record:reviewer
(Composite role 'ordinis:admin' = all три + scope roles — для удобства.)
2026-05-13 12:44:23 +03:00
Zimin A.N. 24aa94d130 feat(auth): Phase 1d — backend role enforcement для workflow
User explicitly requested 'Phase 1d пора'. До этого MR'а backend гейтил
только maker-checker (self_approve_forbidden), frontend hooks возвращали
auth.isAuthenticated.

Реализация:

Backend WorkflowRoles (ordinis-rest-api/auth/WorkflowRoles.java):
- Component reads realm_access.roles из JWT claim
- Constants: ordinis:approver (decide/approve/reject), ordinis:publisher (publish)
- requireRole(role) throws 403 forbidden_role если missing
- Defensive parse: malformed/missing realm_access → empty roles
- 9 unit tests cover authenticated + anonymous + malformed JWT

Applied gates:
- SchemaDraftService.decide() — require ordinis:approver
- SchemaDraftService.publish() — require ordinis:publisher
- DraftService.approve() — require ordinis:approver
- DraftService.reject() — require ordinis:approver

WorkflowRoles is Optional в test ctors → unit tests без auth setup
не ломаются. Все existing tests должны проходить (legacy ctor overloads
сохранены).

Frontend usePermissions.ts:
- Stub return auth.isAuthenticated заменён на real role decode из
  auth.user.profile.realm_access.roles
- ROLE_APPROVER + ROLE_PUBLISHER constants exported
- Defensive parsing — graceful с missing/malformed claims
- useCanCreateSchemaDraft остаётся permissive (любой auth — maker'ом
  может быть anyone, scope ACL заведует видимостью)

Naming convention — colon-separated (consistent с ordinis:client:*
scope ролями), aligned с MR !161.

MIGRATION (BREAKING без правильной Keycloak setup):
1. Keycloak realm 'nstart' → Realm Roles → Create:
   - ordinis:approver
   - ordinis:publisher
2. Users → assign roles:
   - reviewer/approver users → ordinis:approver
   - publisher users → ordinis:approver + ordinis:publisher
3. После refresh JWT (logout/login) роли появляются в realm_access.roles

Без этого все decide/publish операции вернут 403 forbidden_role.
2026-05-13 12:36:53 +03:00
Zimin A.N. 1281654d32 chore(auth): rename schema workflow roles к colon-convention
Project uses Altum-style colon-separated realm roles:
- ordinis:client:public / internal / restricted (scope ACL, уже active)

Schema workflow roles (Phase 1d TODO) приводим к той же convention:
- ordinis:schema:reviewer (был ordinis-schema-reviewer)
- ordinis:schema:publisher
- ordinis:schema:maker

Изменения в usePermissions.ts:
- JSDoc обновлён с новой convention
- Constants ROLE_SCHEMA_* для discoverable rename'а в Phase 1d
- TODO comments указывают на constants, не bare strings

Phase 1d (когда подключится backend role check):
1. Uncomment role check в hooks
2. Backend SchemaDraftService.decide() — require role
2026-05-13 12:27:33 +03:00
semantic-release-bot dc556d12c8 chore(release): v2.16.4
## [2.16.4](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/compare/v2.16.3...v2.16.4) (2026-05-13)

### 🐛 Fixes

* **ui:** shared UserCell для display UUID actor'ов везде ([e6294ce](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/e6294ce79cc07c6f57c8d45e81a92507e01bb97b))
* **ui:** кнопки в schema draft drawer — RU label + flow row ([6ee88a8](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/6ee88a86bd32cfaa34ceb8dee140c00e629172b8))
2026-05-13 08:53:35 +00:00
Zimin A.N. 6ee88a86bd fix(ui): кнопки в schema draft drawer — RU label + flow row
User feedback (screenshot): 'Approve' остался английским в RU локали +
'Отозвать' улетал на отдельную строку справа из-за ml-auto.

Fix:
- i18n.ts: 'workflow.schemaDraft.actions.approve' default 'Approve' →
  'Одобрить'. EN остался 'Approve'.
- SchemaDraftDrawer.tsx: убрал ml-auto на withdraw button. Раньше это
  force pushed его в конец строки → flex-wrap отправлял на новую строку
  правым краем. Сейчас withdraw сидит сразу после reject в той же
  flow-row, с danger color для визуальной distinction. На узком экране
  всё ещё wrap'нется естественно (без 'плавающего' alignment).
2026-05-13 11:45:29 +03:00
Zimin A.N. e6294ce79c fix(ui): shared UserCell для display UUID actor'ов везде
Browser QA на staging показал что UUID actor'а render'ится raw во многих
местах кроме drawer (MR !158 — там был inline fix):
- /reviews Records tab — column AUTHOR
- /reviews Schemas tab — column AUTHOR
- /audit log — column USER

77ec2cc8-98e3-4d70-8037-94038fcbde67 — нечитаемо для оператора. Тот же
паттерн что я делал в MR !158, теперь shared helper:

src/lib/useUserDisplay.tsx:
- useUserDisplay(uuid) hook — returns { display, isMe, fullId }
- UserCell component — readonly cell с title=fullId tooltip
- Match current user (JWT sub claim) → 'Я • <preferred_username>'
- Other user → short UUID (8 chars) + full в title
- null/undefined → 'anonymous'

Применено:
- reviews.tsx:334,625 — records + schemas table AUTHOR cells
- audit.tsx:476 — USER cell
- SchemaDraftDrawer.tsx — refactor (был inline в MR !158 → теперь shared)

TODO Phase 1d: backend endpoint /admin/users/{sub}/display чтобы и для
не-current-user отображать username.
2026-05-13 11:43:04 +03:00
semantic-release-bot 38764648bf chore(release): v2.16.3
## [2.16.3](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/compare/v2.16.2...v2.16.3) (2026-05-13)

### 🐛 Fixes

* **sidebar,audit:** badges для Outbox + Webhooks, clarify audit scope label ([aec2cdd](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/aec2cdd644b8d6bf1846f0d26d1485ef669f5f98))
* **types:** SchemaReviewQueuePage.total → totalElements (match backend) ([aecd65e](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/aecd65e7d57a6853bf0744571da246d6db236071))
2026-05-13 08:10:21 +00:00
Zimin A.N. aec2cdd644 fix(sidebar,audit): badges для Outbox + Webhooks, clarify audit scope label
Sidebar:
- Outbox: бэйдж = outbox.pending (события queued, не отосланы). DLQ
  отдельно — alarming но не actionable из бэйджа, видно на /outbox.
- Webhooks: бэйдж = count активных subscriptions (w.active === true).
  User feedback: 'вебхуки активные есть а цифры с бэйджем нет'.

Audit log column header:
- 'Scope' → 'Доступ актора' (ru) / 'Actor scope' (en)
- Backend audit_log хранит userScope (claim из JWT актора), НЕ scope
  изменённого ресурса. User confusion: 'правки в public были а тут
  RESTRICTED' — потому что у пользователя scope-привилегия RESTRICTED.
  Уточнённая label убирает путаницу.
- TODO: backend feature — добавить dictionaryScope в AuditEntry чтобы
  показать обе ('Актор: RESTRICTED → Ресурс: PUBLIC' — двусторонний
  audit trail для compliance).
2026-05-13 11:03:47 +03:00
Zimin A.N. aecd65e7d5 fix(types): SchemaReviewQueuePage.total → totalElements (match backend)
User reported бэйдж 'Согласований' в sidebar показывал 0 несмотря на 1
pending schema draft. Root cause:

Backend сериализует Spring Page<SchemaDraft> как:
{items, page, size, totalElements, totalPages}

Но TS type SchemaReviewQueuePage объявлял поле как 'total' (mismatch
именования). Consumers читали data?.total → undefined → fallback 0:

- useReviewsBadgeCount (queries.ts:650) — sidebar badge падал на 0
- reviews.tsx:61 — header count в Schemas tab (но fallback на
  items.length скрывал bug в UI)
- reviews.tsx:593-594 — schema queue subtitle 'N drafts ждут ревью'

Fix:
- client.ts SchemaReviewQueuePage: total → totalElements + totalPages
- 3 consumer'а обновлены на .totalElements
- Backend контракт не меняется — это чисто frontend type alignment

После prod deploy v2.16.3 sidebar badge заработает корректно.
2026-05-13 10:58:48 +03:00
semantic-release-bot 894fcea81b chore(release): v2.16.2
## [2.16.2](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/compare/v2.16.1...v2.16.2) (2026-05-13)

### 🐛 Fixes

* **schema-draft:** автор display + gate Отозвать только maker'у ([fbf978a](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/fbf978aa397b66a309fafb35caa611e3f73164b8))
* **sidebar:** подключить reviews badge к real count ([252939f](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/252939f63a9c997b94603aefa43b9bae287f3eb3))
2026-05-13 07:46:14 +00:00
Александр Зимин 441bbedadf Merge branch 'fix/schema-draft-author-display-and-withdraw-gate' into 'main'
fix(schema-draft): author display + gate Отозвать только maker'у

See merge request 2-6/2-6-4/terravault/ordinis!158
2026-05-13 07:39:59 +00:00
Zimin A.N. fbf978aa39 fix(schema-draft): автор display + gate Отозвать только maker'у
Два бага в SchemaDraftDrawer (видны на review pending):

1. АВТОР показывал raw UUID (77ec2cc8-98e3-4d70-8037-...). Резолвим:
   - Если maker = current user (JWT sub claim) → 'Я • <preferred_username>'
   - Иначе → short UUID (первые 8 символов) с full в title attribute
   - Стилизация: 'Я' — text-ink (читаемая), чужой — font-mono text-mute
   - TODO Phase 1d: backend endpoint для resolve чужих sub → display name

2. Кнопка 'Отозвать' показывалась всем юзерам, не только автору.
   - Backend всё равно 403'нет non-maker withdraw — но UI confusion:
     reviewer видел кнопку которая всегда fail'ит.
   - Gate: показываем только когда auth.user.profile.sub === draft.makerId.
   - Reviewer теперь видит чистый action row (Approve / Запросить правки /
     Отклонить), без danger-button мимо контекста.

Реальный случай: см. user screenshot на v2.16.x — Reviewer modal с UUID
автора и кнопкой 'Отозвать' справа внизу.
2026-05-13 10:33:02 +03:00
Zimin A.N. 252939f63a fix(sidebar): подключить reviews badge к real count
Бэйдж 'На ревью' в sidebar (desktop + mobile) был захардкожен в 0 —
TODO comment ждал cheap /drafts/pending/count endpoint. На самом деле
existing /admin/reviews/pending и /admin/schema-reviews/pending уже
возвращают paged response с totalElements/total в metadata — request
size=1 даёт нужный counter с минимальным payload (~1 строка + 4
metadata field'а).

Новый hook useReviewsBadgeCount():
- Параллельно дёргает обе queue (record + schema)
- Суммирует totalElements (record) + total (schema)
- Полл каждые 60s (lighter чем 30s queue refresh — badge не critical)
- Gated на auth.isAuthenticated (anonymous не должен дёргать admin endpoint'ы)

Sidebar.tsx (оба варианта — desktop + mobile MobileSidebar):
- reviewsCount: 0 → reviews.total
2026-05-13 10:08:57 +03:00
semantic-release-bot 1e5e6b59cb chore(release): v2.16.1
## [2.16.1](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/compare/v2.16.0...v2.16.1) (2026-05-12)

### 🐛 Fixes

* **ci:** use printf для commit/MR description avoiding YAML literal block break ([cac6b6a](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/cac6b6a98180faab308594912248a26e01f2f97a))
* **release:** remove [skip ci] из semantic-release commit message ([b7e1f12](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/b7e1f12bc47031f7a1b817a2d025d5472712220e))
2026-05-12 21:39:15 +00:00
Zimin A.N. b7e1f12bc4 fix(release): remove [skip ci] из semantic-release commit message
[skip ci] в commit message skip'ает GitLab pipeline для ВСЕХ ref'ов на
этом SHA — включая tag pipeline. Эффект: semantic-release создаёт v*.*.*
tag, но tag pipeline скипается → images с tag'ом v*-*-*-<sha> не
собираются → propose-prod-image-bump (этот MR) не имеет images для bump.

Confirmed на v2.16.0 (commit bf07d6b): tag pipeline 6814 = skipped,
registry без 'v2-16-0-*' tags → невозможно deploy.

Loop prevention для chore(release) commit'ов работает через releaseRules
('chore': release: false) — semantic-release на этом commit'е detect'ит
'no releasable commits since previous tag' → exit 0 → no new tag → no loop.

Cost: docker-admin-ui ребилдит на каждом chore(release) commit (package.json
+ CHANGELOG.md match frontend-changes path-filter) — ~2 мин wasted CI time,
приемлемо vs broken release flow.
2026-05-13 00:25:48 +03:00
semantic-release-bot bf07d6b3e3 chore(release): v2.16.0 [skip ci]
## [2.16.0](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/compare/v2.15.0...v2.16.0) (2026-05-12)

###  Features

* **updateBanner:** «Что нового» button открывает modal с changelog ([e46598c](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/e46598c47d01479fae4d6d84a704792ba06a30b4))

### 🐛 Fixes

* **restapi:** NoResource/NoHandler → 404, не 500 ([f2adc37](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/f2adc37e2ef6d22a09759dd6943b0b586d66edce))
2026-05-12 21:18:11 +00:00
Zimin A.N. e46598c47d feat(updateBanner): «Что нового» button открывает modal с changelog
Per user feedback: «по кнопке что нового должно открываться модальное
окно с изменениями».

UpdateBanner кнопка «Что нового» (т9n key `updateBanner.docs`) ранее
открывала `/docs/` в новой вкладке — generic documentation page, не
contextual для «что именно в этом обновлении».

Теперь — открывает `WhatsNewModal` (тот же modal что показывает 🎁
button в TopBar) — public changelog с release notes сразу.

## Refactor

- **`WhatsNewModal.tsx` (NEW)** — extracted controlled-mode modal с
  release notes. Props: `open`, `onClose`. Internal logic читает
  changelog, tracks lastSeen в localStorage, на open mark'ает latest
  как seen.
- **`WhatsNewButton.tsx`** — refactored: trigger button + use
  `WhatsNewModal`. Поведение unchanged (🎁 icon с unread badge → click → modal).
- **`UpdateBanner.tsx`** — replaced `window.open(DOCS_URL)` на
  `setWhatsNewOpen(true)` + render `<WhatsNewModal>`. DOCS_URL constant
  removed (больше не используется).

## UX intent

Когда update detected:
1. User видит orange banner «Доступна новая версия v2.16.0»
2. Hover «Что нового» button → opens modal
3. User читает release notes (что добавлено, исправлено) ДО reload
4. Click «Обновить» → reload

Раньше «Что нового» вёл к generic docs page — user не знал ЧТО
изменилось, только что update есть. Modal даёт structured answer.

## Test plan

- [x] `pnpm tsc --noEmit` clean
- [x] `pnpm build` clean
- [x] `pnpm vitest run useChangelog.test` — 11/11 pass (parser logic
      unchanged)
- [ ] Manual: симулировать update banner (mock useAppVersion
      `updateAvailable=true`), click «Что нового» → modal opens
- [ ] Manual: 🎁 button в TopBar также opens same modal
- [ ] Manual: close modal → red dot disappears на 🎁 button
      (localStorage updated)
2026-05-12 23:28:12 +03:00
semantic-release-bot 6c48cfac46 chore(release): v2.15.0 [skip ci]
## [2.15.0](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/compare/v2.14.0...v2.15.0) (2026-05-12)

###  Features

* **topbar:** «Что нового» button + 2026-05-12 state.md update ([a34c6d4](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/a34c6d4c8248040f90fc24597317d748195468b5))

### 🐛 Fixes

* **admin-ui:** changelog build context — copy script + CI before_script ([5103ed6](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/5103ed6d9cd8e5ba742f66ea72fa8f35e1dcf60a))
* **docs,security:** Swagger UI — staging для exploration, prod env-flagged ([e2080d8](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/e2080d899153f78eb35cf7fab7ea59d52fdc151d))
* **docs:** copy operator/reviewer/changelog dirs to docker image ([82e481a](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/82e481a418f278a566bf6cc3ab7345c99e363902))

### 📝 Docs

* **design:** AI schema assist + dictionary marketplace v1 proposals ([cef5f49](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/cef5f49bf70d5abf857e4d40bfb5550a751fe2ec))
* **design:** ai-schema-assist v2 — /office-hours, Approach C hybrid ([a3eb5f0](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/a3eb5f0c86196acf3fbbad0e5ac74eb058eaa7e3))
* **design:** marketplace v2 — bundle hygiene, hard cap 2-3d ([89c6e04](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/89c6e049657db808ff7c7fa70c58c3311360673a))
* **design:** Redis FK projection v2 — eng review applied ([d9fc49f](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/d9fc49fe72cfcf4cbb7b7568aba560a5a3e1dc84))
2026-05-12 18:54:51 +00:00
Александр Зимин 5103ed6d9c fix(admin-ui): changelog build context — copy script + CI before_script 2026-05-12 18:48:04 +00:00
Александр Зимин a34c6d4c82 feat(topbar): «Что нового» button + 2026-05-12 state.md update 2026-05-12 17:05:24 +00:00
semantic-release-bot 08c9262727 chore(release): v2.14.0 [skip ci]
## [2.14.0](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/compare/v2.13.0...v2.14.0) (2026-05-12)

###  Features

* **webhook:** time-series histogram stats endpoint + frontend chart ([5479142](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/5479142093e428d081fbb548685f7559ddb1fb08))
2026-05-12 14:39:08 +00:00
Александр Зимин 5479142093 feat(webhook): time-series histogram stats endpoint + frontend chart 2026-05-12 14:30:22 +00:00
semantic-release-bot 91f4310a77 chore(release): v2.13.0 [skip ci]
## [2.13.0](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/compare/v2.12.0...v2.13.0) (2026-05-12)

###  Features

* **ui:** searchable MultiSelect (cmdk) + DateRangePicker (react-day-picker) ([21d9561](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/21d95613fc26e298684c1f225896f96fd3bea750))
2026-05-12 14:01:58 +00:00
Александр Зимин 09c248de4f Merge branch 'feat/searchable-multiselect-and-date-range' into 'main'
feat(ui): searchable MultiSelect (cmdk) + DateRangePicker (react-day-picker)

See merge request 2-6/2-6-4/terravault/ordinis!142
2026-05-12 13:55:35 +00:00
Александр Зимин 21d95613fc feat(ui): searchable MultiSelect (cmdk) + DateRangePicker (react-day-picker) 2026-05-12 13:55:35 +00:00
semantic-release-bot 680866bcee chore(release): v2.12.0 [skip ci]
## [2.12.0](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/compare/v2.11.0...v2.12.0) (2026-05-12)

###  Features

* **drawer:** section chip strip scroll-spy via IntersectionObserver ([da04b86](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/da04b862ab5642b33913ae83e6e6429b7ebcbc22))
2026-05-12 13:35:45 +00:00
Александр Зимин da04b862ab feat(drawer): section chip strip scroll-spy via IntersectionObserver 2026-05-12 13:29:52 +00:00
semantic-release-bot 9073229c0e chore(release): v2.11.0 [skip ci]
## [2.11.0](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/compare/v2.10.0...v2.11.0) (2026-05-12)

###  Features

* **timetravel:** Records + Schema tabs wired with real data ([775b834](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/775b8345e346747029b2bd2f59488df595652a39))
2026-05-12 13:06:12 +00:00
Александр Зимин 775b8345e3 feat(timetravel): Records + Schema tabs wired with real data 2026-05-12 13:00:03 +00:00
semantic-release-bot 8878b3f0b6 chore(release): v2.10.0 [skip ci]
## [2.10.0](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/compare/v2.9.0...v2.10.0) (2026-05-12)

###  Features

* **timetravel:** «Что изменилось» tab — закрывает «backend pending» placeholder ([3dbad1e](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/3dbad1e16ce63cdd1a26e12bcedfcf67b54891cd))

### 🐛 Fixes

* **ux:** friendly error UI вместо raw AxiosError ([3984d99](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/3984d99004ce4a1e7de09cfc0a1d3b6de45f5bad))
2026-05-12 12:51:35 +00:00
Александр Зимин 3dbad1e16c feat(timetravel): «Что изменилось» tab — закрывает «backend pending» placeholder 2026-05-12 12:45:55 +00:00
Александр Зимин 3984d99004 fix(ux): friendly error UI вместо raw AxiosError 2026-05-12 12:41:48 +00:00
semantic-release-bot db0986d235 chore(release): v2.9.0 [skip ci]
## [2.9.0](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/compare/v2.8.0...v2.9.0) (2026-05-12)

###  Features

* **webhooks:** stats cards dashboard на subscription detail ([d864a85](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/d864a8561a3f34440d2ef2e0413037bd40c1c73c))
2026-05-12 12:31:16 +00:00
Александр Зимин d864a8561a feat(webhooks): stats cards dashboard на subscription detail 2026-05-12 12:25:15 +00:00
Александр Зимин 56e3e3d1be chore(release): remove bare 'BREAKING' noteKeyword + lesson doc 2026-05-12 12:18:46 +00:00
Александр Зимин 8360c39a45 chore(theme): font audit — arbitrary px → semantic tokens (1/6 Stage 3.x) 2026-05-12 12:09:52 +00:00
semantic-release-bot 9fc2ed5b35 chore(release): v2.8.0 [skip ci]
## [2.8.0](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/compare/v2.7.0...v2.8.0) (2026-05-12)

###  Features

* **reviews:** tabs UX — Записи / Схемы (D) ([a49e01b](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/a49e01b6c965279cc6a6e534245f73285f7271ae))
* **schema-workflow:** PATCH /drafts/{id} — edit без recreate (A) ([b3a9104](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/b3a9104d5469bb2e9c57360ff9fbbee64f29a779))
* **webhooks:** event-type multi-select + schema draft events (E) ([27ffd36](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/27ffd36dcaf204424fb24fdddf2b6cd5c1d215ab))
* **workflow:** Monaco editor для proposed schema (C) ([ef5bd69](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/ef5bd69c40dc272f8d0910b5a277034e68e013ab))
2026-05-12 11:53:59 +00:00
Александр Зимин 27ffd36dca feat(webhooks): event-type multi-select + schema draft events (E) 2026-05-12 11:48:34 +00:00
Александр Зимин a49e01b6c9 feat(reviews): tabs UX — Записи / Схемы (D) 2026-05-12 11:44:46 +00:00
Александр Зимин ef5bd69c40 feat(workflow): Monaco editor для proposed schema (C) 2026-05-12 11:41:12 +00:00
Александр Зимин 131442cae2 chore(theme): bg-white → bg-surface (B — dark theme sweep) 2026-05-12 11:38:14 +00:00
Александр Зимин b3a9104d54 feat(schema-workflow): PATCH /drafts/{id} — edit без recreate (A) 2026-05-12 11:33:01 +00:00
semantic-release-bot ab6ec6ebec chore(release): v2.7.0 [skip ci]
## [2.7.0](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/compare/v2.6.0...v2.7.0) (2026-05-12)

###  Features

* **schema-workflow:** Phase 1c — CreateModal + /reviews extension + RBAC stub ([ac3395f](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/ac3395f4de71a7b97ea453899c41d771e0b338e3))
2026-05-12 11:29:13 +00:00
Александр Зимин ac3395f4de feat(schema-workflow): Phase 1c — CreateModal + /reviews extension + RBAC stub 2026-05-12 11:20:29 +00:00
semantic-release-bot 00fe254ccc chore(release): v2.6.0 [skip ci]
## [2.6.0](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/compare/v2.5.0...v2.6.0) (2026-05-12)

###  Features

* **schema-workflow:** Phase 1b — SchemaDraftDrawer with status-aware actions ([dd3a2d9](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/dd3a2d97e53fa1edf7520a921ebc07d431b406a5))
2026-05-12 11:17:43 +00:00
Александр Зимин dd3a2d97e5 feat(schema-workflow): Phase 1b — SchemaDraftDrawer with status-aware actions 2026-05-12 11:08:31 +00:00