Правки финального ревью: обновление списка после создания консолидации, подсказка кнопки, решения R-4..R-8

- Sidebar: после создания консолидации перечитывается список группы
- useLegalEntityFiles: убран biome-ignore в зависимостях эффекта
- FilesDrawer: курсор и pointer-events у недоступной кнопки загрузки
- design.md: решения R-4..R-8

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Andrey Epifancev 2026-10-10 01:03:00 +04:00
parent 9f56442a0c
commit c5537d5a6b
6 changed files with 21 additions and 6 deletions

View File

@ -51,3 +51,13 @@
не из текущей консоли; в режиме стола подписи нет (все файлы — этой консоли или подхваченные). Цена ошибки: низкая.
3. 09.10.2026 — **R-3:** неизвестный `consolidation_id` (нет в списке ГК) подписывается «другая консолидация», а не
скрывается. Цена ошибки: нулевая.
4. 10.10.2026 — **R-4:** ручной прогон на стенде отложен до выката arm-core#96. Цена ошибки: UI-дефект всплывёт позже;
PR не вливать до прогона.
5. 10.10.2026 — **R-5:** trailer коммита 5b7b02a «Claude Haiku 5.5» вместо «Claude Fable 5.1» оставлен. Цена ошибки:
неверная атрибуция в одном коммите.
6. 10.10.2026 — **R-6:** промежуточное состояние (tsc-ошибка и versionId в UploadDocumentsModal между Task 2 и Task 3)
принято, чинится в Task 3. Цена ошибки: нулевая, закрыто в Task 3.
7. 10.10.2026 — **R-7:** `consolidation_id` в scripts/demo-prepare.sh берётся из карточки версии
`GET /consolidations/versions/$V`, а не из `POST /consolidations`. Цена ошибки: скрипт демо не запускался на живом ядре.
8. 10.10.2026 — **R-8:** после создания консолидации перечитывается список консолидаций группы (I-1). Цена ошибки:
правка выходит за Impact proposal, лишний запрос.

View File

@ -1,5 +1,5 @@
#!/usr/bin/env bash
# Подготовка демо: загрузить квартальные ОСВ РБ и Счастливочной за 2024 Q1–Q3 в версию и подтвердить ОСВ-документы.
# Подготовка демо: загрузить квартальные ОСВ РБ и Счастливочной за 2024 Q1–Q3 в консолидацию версии и подтвердить ОСВ-документы.
# Использование: scripts/demo-prepare.sh <version_id> [email] (стенд arm-core на localhost:8000, DEBUG=true)
# Каталог фикстур: FIXTURES_DIR (по умолчанию ../../fixtures относительно репозитория arm-web, т.е. workspace/fixtures).
set -euo pipefail

View File

@ -50,7 +50,7 @@ export function DocumentsDrawer({ open, onClose }: { open: boolean; onClose: ()
icon={<UploadOutlined />}
disabled={!current_legal_entity_id || !canUpload}
onClick={() => setUploadOpen(true)}
style={{ background: canUpload ? '#237804' : undefined }}>
style={canUpload ? { background: '#237804' } : { pointerEvents: 'none' }}>
Загрузить документы
</Button>
);
@ -83,7 +83,7 @@ export function DocumentsDrawer({ open, onClose }: { open: boolean; onClose: ()
uploadButton
) : (
<Tooltip title={UPLOAD_DISABLED_HINT}>
<span>{uploadButton}</span>
<span style={{ display: 'inline-block', cursor: 'not-allowed' }}>{uploadButton}</span>
</Tooltip>
)}
{current !== null && (

View File

@ -18,7 +18,7 @@ describe('consolidationLabel', () => {
expect(consolidationLabel(null, cons, 'c-2024q3')).toBe('вне консолидации');
expect(consolidationLabel('ghost', cons, 'c-2024q3')).toBe('другая консолидация');
});
it('без текущей консоли подпись есть у всех, кроме null-текущей', () => {
it('без текущей консолидации подпись есть у всех файлов', () => {
expect(consolidationLabel('c-2024q3', cons, null)).toBe('2024 К3');
expect(consolidationLabel(null, cons, null)).toBe('вне консолидации');
});

View File

@ -42,7 +42,7 @@ export function useLegalEntityFiles(legalEntityId: string | null, consolidationI
}
}, [legalEntityId, consolidationId]);
// biome-ignore lint/correctness/useExhaustiveDependencies: consolidationId — триггер сброса при смене режима, в теле не читается
// смена режима (consolidationId) приходит через reload: он пересоздаётся и перезапускает этот эффект
useEffect(() => {
// при смене ЮЛ, режима (консолидация/все) или закрытии панели: старые ответы не применяем, прежние файлы очищаем
requestRef.current++;
@ -50,7 +50,7 @@ export function useLegalEntityFiles(legalEntityId: string | null, consolidationI
errorShownRef.current = false;
setFiles([]);
if (open && legalEntityId) void reload();
}, [open, legalEntityId, consolidationId, reload]);
}, [open, legalEntityId, reload]);
const pending = hasPendingFiles(files);
useEffect(() => {

View File

@ -15,6 +15,8 @@ import { NavLink, useNavigate } from 'react-router-dom';
import { USERS_ADMIN } from '../../auth/permissions';
import { Logo } from '../../components/Logo';
import { createConsolidation } from '../../services/api/consolidations';
import { getConsolidationsListThunk } from '../../store/slices/consolidations/thunks';
import { useAppDispatch } from '../../store/store';
import { quarterLabel } from '../../utils/labels';
import { NewConsolidationModal } from '../NewConsoleModal/NewConsoleModal';
import styles from './styles.module.css';
@ -165,6 +167,7 @@ const Section = memo(function Section({
export function Sidebar() {
const navigate = useNavigate();
const dispatch = useAppDispatch();
const [modalOpen, setModalOpen] = useState(false);
const [isCollapsed, setIsCollapsed] = useState(false);
@ -218,6 +221,8 @@ export function Sidebar() {
}}
onOk={async (values) => {
const card = await createConsolidation(values);
// перечитываем список: на странице группы он сам не обновится, и новая консолидация не станет текущей
await dispatch(getConsolidationsListThunk(values.company_group_id));
setModalOpen(false);
message.success(`Создана консолидация ${values.year}, ${quarterLabel(values.quarter)}`);
navigate(`/groups/${values.company_group_id}?version=${card.id}`);