+ {/* QA UX-004: добавлен 2-digit year к boundary меткам — раньше «05.05»
+ * без года был неоднозначным на конец декабря / начало января. */}
{pct > 12 && (
-
+
{new Date(range.min).toLocaleDateString(undefined, {
+ year: '2-digit',
month: '2-digit',
day: '2-digit',
})}
@@ -586,8 +592,12 @@ function TimelineSlider({
{dateLabel}
{pct < 88 && (
-
+
{new Date(range.max).toLocaleDateString(undefined, {
+ year: '2-digit',
month: '2-digit',
day: '2-digit',
})}
diff --git a/ordinis-admin-ui/src/i18n.ts b/ordinis-admin-ui/src/i18n.ts
index 49b4f22..54d07e6 100644
--- a/ordinis-admin-ui/src/i18n.ts
+++ b/ordinis-admin-ui/src/i18n.ts
@@ -278,7 +278,7 @@ i18n
// User confusion: 'правки в public были, а тут RESTRICTED' —
// потому что у пользователя scope=RESTRICTED привилегия. Label
// 'Доступ актора' разъясняет это.
- 'audit.col.scope': 'Доступ актора',
+ 'audit.col.scope': 'Scope',
'audit.col.trace': 'Trace',
'audit.col.diff': 'Изменения',
'audit.action.expand': 'Раскрыть',
@@ -334,7 +334,7 @@ i18n
'dict.list.deps.short': 'СО СВЯЗЯМИ',
// Catalog v2 (URL-driven filters + sort + density)
'dict.list.heading': 'Каталог справочников',
- 'dict.list.filter.scope': 'Фильтр по области',
+ 'dict.list.filter.scope': 'Фильтр по области (можно выбрать несколько)',
'dict.list.sort.label': 'Сортировка',
'dict.list.sort.name': 'По названию',
'dict.list.sort.recordCount': 'По количеству записей',
@@ -424,7 +424,7 @@ i18n
'form.cancel': 'Отмена',
'form.save': 'Сохранить',
'form.saving': 'Сохранение...',
- 'form.delete': 'Удалить',
+ 'form.delete': 'Закрыть запись',
'form.error.required': 'Обязательное поле',
'form.unsavedNFields_one': 'не сохранено · {{count}} поле',
'form.unsavedNFields_few': 'не сохранено · {{count}} поля',
@@ -1103,7 +1103,7 @@ i18n
'audit.col.dictionary': 'Dictionary',
'audit.col.businessKey': 'Business key',
'audit.col.user': 'User',
- 'audit.col.scope': 'Actor scope',
+ 'audit.col.scope': 'Scope',
'audit.col.trace': 'Trace',
'audit.col.diff': 'Diff',
'audit.action.expand': 'Expand',
@@ -1157,7 +1157,7 @@ i18n
'dict.list.deps.short': 'WITH LINKS',
// Catalog v2
'dict.list.heading': 'Dictionary catalog',
- 'dict.list.filter.scope': 'Scope filter',
+ 'dict.list.filter.scope': 'Scope filter (multi-select)',
'dict.list.sort.label': 'Sort',
'dict.list.sort.name': 'By name',
'dict.list.sort.recordCount': 'By record count',
@@ -1239,7 +1239,7 @@ i18n
'form.cancel': 'Cancel',
'form.save': 'Save',
'form.saving': 'Saving...',
- 'form.delete': 'Delete',
+ 'form.delete': 'Close record',
'form.unsavedNFields_one': 'unsaved · {{count}} field',
'form.unsavedNFields_other': 'unsaved · {{count}} fields',
'drawer.collapse': 'Collapse to 520px',
diff --git a/ordinis-admin-ui/src/routes/audit.tsx b/ordinis-admin-ui/src/routes/audit.tsx
index 948d07f..efee47f 100644
--- a/ordinis-admin-ui/src/routes/audit.tsx
+++ b/ordinis-admin-ui/src/routes/audit.tsx
@@ -441,14 +441,15 @@ function AuditTable({ rows }: { rows: AuditEntry[] }) {
- {t('audit.col.time')}
- {t('audit.col.action')}
- {t('audit.col.dictionary')}
- {t('audit.col.businessKey')}
- {t('audit.col.user')}
- {t('audit.col.scope')}
- {t('audit.col.trace')}
- {t('audit.col.diff')}
+ {/* QA BUG-011 fix: title attribute → hover tooltip когда text truncate'ится. */}
+ {t('audit.col.time')}
+ {t('audit.col.action')}
+ {t('audit.col.dictionary')}
+ {t('audit.col.businessKey')}
+ {t('audit.col.user')}
+ {t('audit.col.scope')}
+ {t('audit.col.trace')}
+ {t('audit.col.diff')}
diff --git a/ordinis-admin-ui/src/routes/dictionaries.$name.tsx b/ordinis-admin-ui/src/routes/dictionaries.$name.tsx
index a5739a2..6e3fe8e 100644
--- a/ordinis-admin-ui/src/routes/dictionaries.$name.tsx
+++ b/ordinis-admin-ui/src/routes/dictionaries.$name.tsx
@@ -839,6 +839,11 @@ function DictionaryDetail() {
search: (prev) => ({
...prev,
tab: tab === 'records' ? undefined : tab,
+ // QA UX-003: сбросить records-tab фильтры (search/q + column filters
+ // + scopes) когда пользователь перешёл на другую вкладку. Иначе
+ // search:'абв' оставался применённым после возврата на records.
+ q: undefined,
+ scopes: undefined,
}),
replace: true,
})
diff --git a/ordinis-admin-ui/src/routes/dictionaries.index.tsx b/ordinis-admin-ui/src/routes/dictionaries.index.tsx
index c06a4fb..ab7297f 100644
--- a/ordinis-admin-ui/src/routes/dictionaries.index.tsx
+++ b/ordinis-admin-ui/src/routes/dictionaries.index.tsx
@@ -281,12 +281,15 @@ function DictionariesPage() {
// Scope chips всегда покрашены в свой scope-color (filled bg
// + colored text) per user feedback ("плашки то покрась").
// Selected state — ring-1 ring-{scope} + slightly opaque bg.
- className={`h-8 text-cap tracking-[0.14em] uppercase font-semibold px-2.5 rounded-md border inline-flex items-center transition-all focus:outline-none focus:ring-2 focus:ring-accent/40 ${SCOPE_BG_TINT[scope]} ${SCOPE_TEXT[scope]} ${
+ // QA UX-001: ✓ glyph когда selected — clarifies что это
+ // multi-select (checkbox-like), не radio.
+ className={`h-8 text-cap tracking-[0.14em] uppercase font-semibold px-2.5 rounded-md border inline-flex items-center gap-1 transition-all focus:outline-none focus:ring-2 focus:ring-accent/40 ${SCOPE_BG_TINT[scope]} ${SCOPE_TEXT[scope]} ${
selected
? `border-current shadow-sm`
: 'border-transparent opacity-70 hover:opacity-100'
}`}
>
+ {selected && ✓}
{scope}
)