feat(records): bulk export CSV выбранных + pagination
Backend POST /api/v1/dictionaries/{name}/records/export-selected.csv:
принимает businessKeys[] (1..500), возвращает CSV с колонками
business_key, valid_from, valid_to, scope, data (JSONB inline).
Не-найденные ключи отдаются строкой с пустыми ячейками — admin видит
что ключ обработан, но данных нет. RFC 4180 экранирование.
requireReadAccess: для экспорта достаточно прав чтения (не write).
POST а не GET потому что >100 ключей не помещается в URL params
(Server: Request URI Too Long).
Frontend useBulkExportRecords: axios POST с responseType: blob →
temporary <a download> link → клик → revokeObjectURL через rAF.
Filename берётся из Content-Disposition header.
Toolbar: новая кнопка "Экспорт CSV" (variant=secondary) рядом с
"Закрыть выбранные" (variant=danger). Loading state через isPending.
Pagination для records list (PAGE_SIZE=50, client-side):
- visibleRecords = filteredRecords.slice(...)
- Footer "Записи 1–50 из 100, Стр. 1 из 2" с Prev/Next кнопками
- Auto-reset на page=0 при изменении filter/scope/AOI
- selectAll/visibleKeys теперь = только current page (WYSIWYG)
- При >50 записей видно навигацию, при <=50 footer скрыт
Прогон: 20/20 e2e + 60/60 rest-api + 89/89 admin-ui.
This commit is contained in:
@@ -153,6 +153,11 @@ i18n
|
||||
'dict.bulk.selectedCount_other': 'Выбрано {{count}} из {{total}}',
|
||||
'dict.bulk.clearSelection': 'Снять выделение',
|
||||
'dict.bulk.closeAction': 'Закрыть выбранные',
|
||||
'dict.bulk.exportAction': 'Экспорт CSV',
|
||||
'dict.page.prev': 'Назад',
|
||||
'dict.page.next': 'Вперёд',
|
||||
'dict.page.of': 'Стр. {{cur}} из {{total}}',
|
||||
'dict.page.range': 'Записи {{from}}–{{to}} из {{total}}',
|
||||
'dict.bulk.confirmTitle': 'Массовое закрытие записей',
|
||||
'dict.bulk.confirmBody':
|
||||
'{{count}} запис(ей) будут помечены как закрытые (valid_to = now). Действие обратимо через создание новой версии. Каждая запись закрывается отдельно — если часть уже закрыта, остальные обработаются.',
|
||||
@@ -432,6 +437,11 @@ i18n
|
||||
'dict.bulk.selectedCount_other': '{{count}} of {{total}} selected',
|
||||
'dict.bulk.clearSelection': 'Clear selection',
|
||||
'dict.bulk.closeAction': 'Close selected',
|
||||
'dict.bulk.exportAction': 'Export CSV',
|
||||
'dict.page.prev': 'Prev',
|
||||
'dict.page.next': 'Next',
|
||||
'dict.page.of': 'Page {{cur}} of {{total}}',
|
||||
'dict.page.range': 'Records {{from}}–{{to}} of {{total}}',
|
||||
'dict.bulk.confirmTitle': 'Bulk close records',
|
||||
'dict.bulk.confirmBody':
|
||||
'{{count}} record(s) will be marked as closed (valid_to = now). Reversible by creating a new version. Each record is closed individually — if some are already closed, others will still be processed.',
|
||||
|
||||
Reference in New Issue
Block a user