Andrey Epifancev 627ea82321 perf: замеры открытия модалок
Перечень модалок (modals.json), measureOpen с main_thread_ms, профиль
перерисовок React (reactProfile), сценарий modals.spec.ts, подкоманда
stand.sh web-profiling (:8081), генератор modals-inventory.md.

Refs #202

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 00:53:55 +04:00

641 lines
19 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[
{
"id": "sheet_select_vsp",
"title": "Выбор ВСП (добавление строки)",
"page": "sheet",
"source": "web/src/components/RealtimeTable/Modals/SelectVspModal.jsx:51",
"priority": 1,
"role": "rf",
"sheet_ref": "FORM_2/AHR_RENT/null",
"open": {
"selector": "button[aria-label=\"Добавить строку\"]",
"action": "click"
},
"appear": {
"css": "h2",
"text": "Выбор ВСП"
},
"note": "открывается из RealtimeTable.jsx:652; только при праве править строки (rf); на самом большом листе rf (FORM_2/AHR, 1154 строк) модалка не открывается (проверено: кнопка «Добавить строку» добавляет строку, ВСП-выбор только для ветки isVspAdditionRow)"
},
{
"id": "sheet_select_expense",
"title": "Добавление строки (статья расходов)",
"page": "sheet",
"source": "web/src/components/RealtimeTable/Modals/SelectExpenseItemModal.jsx:51",
"priority": 1,
"role": "rf",
"sheet_ref": "FORM_4/AHR/null",
"open": {
"selector": "button[aria-label=\"Добавить строку\"]",
"action": "click",
"pre": [
{
"selector": "tbody tr:has-text(\"ПроектAHR\") >> nth=0 >> td >> nth=1",
"action": "click"
}
]
},
"appear": {
"css": "h2",
"text": "Добавление строки"
},
"note": "нужна выделенная строка проекта (row_type ITEM); RealtimeTable.jsx:656"
},
{
"id": "sheet_create_program",
"title": "Создание программы",
"page": "sheet",
"source": "web/src/components/RealtimeTable/Modals/CreateProgramProjectModal.jsx:38",
"priority": 1,
"role": "rf",
"sheet_ref": "FORM_4/AHR/null",
"open": {
"selector": "button[aria-label=\"Добавить программу\"]",
"action": "click"
},
"appear": {
"css": "h2",
"text": "Создание программы"
},
"note": "RealtimeTable.jsx:697, только FORM_4"
},
{
"id": "sheet_create_project",
"title": "Создание проекта (в программе)",
"page": "sheet",
"source": "web/src/components/RealtimeTable/Modals/CreateProgramProjectModal.jsx:38",
"priority": 1,
"role": "rf",
"sheet_ref": "FORM_4/AHR/null",
"open": {
"selector": "button[aria-label=\"Добавить проект\"]",
"action": "click",
"pre": [
{
"selector": "tbody tr:has-text(\"ПрограммаAHR\") >> nth=0 >> td >> nth=1",
"action": "click"
}
]
},
"appear": {
"css": "h2",
"text": "Создание проекта"
},
"note": "нужна выделенная строка программы (GROUP); RealtimeTable.jsx:705"
},
{
"id": "sheet_columns_tree",
"title": "Выбор столбцов (Popover с деревом)",
"page": "sheet",
"source": "web/src/components/common/CollapsibleTree.jsx:203",
"priority": 1,
"role": "rf",
"sheet_ref": "FORM_2/AHR_RENT/null",
"open": {
"selector": "[data-pin-panel] input[readonly]",
"action": "click"
},
"appear": {
"css": ".MuiPopover-root .MuiPaper-root"
},
"big_sheet": "FORM_2/AHR/null",
"note": "не модалка, а MUI Popover: единственный оверлей, доступный на больших листах; замер на малом и на самом большом листе rf"
},
{
"id": "task_stages",
"title": "Этапы задачи (SettingModal)",
"page": "task",
"source": "web/src/components/Stages/SettingModal.jsx:102",
"priority": 1,
"role": "rf",
"page_ref": "task_rf_form_2",
"open": {
"selector": "role=button[name=\"Этапы\"]",
"action": "click"
},
"appear": {
"css": ".fixed.inset-0.z-50",
"text": "Этапы"
},
"note": "TaskPage.jsx:171"
},
{
"id": "task_stage_add",
"title": "Добавление этапа (задача)",
"page": "task",
"source": "web/src/components/Stages/AddStagesModal.jsx:156",
"priority": 1,
"role": "admin",
"page_ref": "task_rf_form_2",
"open": {
"selector": "role=button[name=\"Добавить этап\"]",
"action": "click",
"pre": [
{
"selector": "role=button[name=\"Этапы\"]",
"action": "click"
}
]
},
"appear": {
"css": "h2",
"text": "Добавление этапа"
},
"note": "кнопка только у admin"
},
{
"id": "task_stage_edit",
"title": "Редактирование этапа (задача)",
"page": "task",
"source": "web/src/components/Stages/AddStagesModal.jsx:156",
"priority": 1,
"role": "admin",
"page_ref": "task_rf_form_2",
"open": {
"selector": "role=menuitem[name=\"Редактировать\"]",
"action": "click",
"pre": [
{
"selector": "role=button[name=\"Этапы\"]",
"action": "click"
},
{
"selector": ".fixed.inset-0.z-50 button.MuiIconButton-root >> nth=0",
"action": "click"
}
]
},
"appear": {
"css": "h2",
"text": "Редактирование этапа"
},
"note": "меню строки этапа только у admin"
},
{
"id": "project_stages",
"title": "Этапы отчёта проекта (SettingModal)",
"page": "project",
"source": "web/src/components/Stages/SettingModal.jsx:102",
"priority": 1,
"role": "rf",
"page_ref": "project_card",
"open": {
"selector": "role=button[name=\"Этапы\"] >> nth=0",
"action": "click"
},
"appear": {
"css": ".fixed.inset-0.z-50",
"text": "Этапы"
},
"note": "TaskPage.jsx:195 (по строке отчёта)"
},
{
"id": "project_add_year",
"title": "Добавить год",
"page": "project",
"source": "web/src/pages/TaskPage/TaskPage.jsx:217",
"priority": 1,
"role": "rf",
"page_ref": "project_card",
"open": {
"selector": "role=button[name=\"Добавить год\"]",
"action": "click"
},
"appear": {
"css": ".fixed.inset-0.z-50",
"text": "Вы точно хотите добавить год"
}
},
{
"id": "project_stage_delete",
"title": "Удаление этапа (проект)",
"page": "project",
"source": "web/src/components/Stages/DeleteStageModal.jsx:38",
"priority": 1,
"role": "admin",
"page_ref": "project_card",
"open": {
"selector": "role=menuitem[name=\"Удалить\"]",
"action": "click",
"pre": [
{
"selector": "role=button[name=\"Этапы\"] >> nth=0",
"action": "click"
},
{
"selector": ".fixed.inset-0.z-50 button.MuiIconButton-root >> nth=0",
"action": "click"
}
]
},
"appear": {
"css": ".MuiTypography-root",
"text": "Удалить этот элемент?"
},
"note": "удаление этапа только в режиме project; открытие без подтверждения"
},
{
"id": "projects_create",
"title": "Создание проекта",
"page": "projects",
"source": "web/src/pages/ProjectsPage/ModalCreateProject.jsx:247",
"priority": 1,
"role": "rf",
"page_ref": "projects",
"open": {
"selector": "role=button[name=\"Создать проект\"]",
"action": "click"
},
"appear": {
"css": ".fixed.inset-0.z-50",
"text": "Создание проекта"
},
"note": "NavigationProjectPage.jsx:504"
},
{
"id": "projects_edit",
"title": "Редактирование строки проекта (MUI Dialog)",
"page": "projects",
"source": "web/src/pages/ProjectPages/components/EditModal/EditModal.jsx:170",
"priority": 1,
"role": "rf",
"page_ref": "projects",
"open": {
"selector": "role=button[name=\"Редактировать\"] >> nth=0",
"action": "click"
},
"appear": {
"css": "[role=dialog]",
"text": "Редактирование строки"
},
"note": "NavigationProjectPage.jsx:496"
},
{
"id": "projects_delete",
"title": "Удалить проект?",
"page": "projects",
"source": "web/src/pages/ProjectPages/NavigationProjectPage.jsx:510",
"priority": 1,
"role": "rf",
"page_ref": "projects",
"open": {
"selector": "role=button[name=\"Удалить проект\"] >> nth=0",
"action": "click"
},
"appear": {
"css": ".fixed.inset-0.z-50",
"text": "Удалить проект?"
}
},
{
"id": "tasks_create",
"title": "Создать задачу",
"page": "tasks",
"source": "web/src/pages/TasksPage/TasksPage.jsx:374",
"priority": 1,
"role": "admin",
"page_ref": "tasks",
"open": {
"selector": "role=button[name=\"Создать задачу\"]",
"action": "click"
},
"appear": {
"css": ".fixed.inset-0.z-50",
"text": "Создать задачу"
},
"note": "кнопка только у admin"
},
{
"id": "tasks_confirm_mark",
"title": "Отправить задачу на удаление (подтверждение)",
"page": "tasks",
"source": "web/src/pages/TasksPage/TasksTable.jsx:371",
"priority": 1,
"role": "admin",
"page_ref": "tasks",
"open": {
"selector": "text=Отправить на удаление",
"action": "click",
"pre": [
{
"selector": "role=button[name^=\"Действия с задачей\"] >> nth=0",
"action": "click"
}
]
},
"appear": {
"css": ".fixed.inset-0.z-50",
"text": "Отправить задачу на удаление"
},
"note": "меню действий только у admin"
},
{
"id": "forms_create",
"title": "Создание формы (FormsPage)",
"page": "forms",
"source": "web/src/pages/FormsPage.jsx:133",
"priority": 1,
"role": "admin",
"open": {
"selector": "",
"action": "click"
},
"skip_reason": "страница FormsPage не подключена в app/Routes.jsx - открыть из UI нельзя"
},
{
"id": "taskcard_confirm",
"title": "Подтверждение действия над карточкой задачи",
"page": "forms",
"source": "web/src/components/common/TaskCardComponent.jsx:265",
"priority": 1,
"role": "admin",
"open": {
"selector": "",
"action": "click"
},
"skip_reason": "TaskCardComponent используется только в FormsPage (не в маршрутах)"
},
{
"id": "infoheader_rename",
"title": "Переименование таблицы (InfoForHeader)",
"page": "forms",
"source": "web/src/pages/TableTempPage/InfoForHeader.jsx:44",
"priority": 1,
"role": "admin",
"open": {
"selector": "",
"action": "click"
},
"skip_reason": "TableTempPage не в маршрутах, ModalRename не импортирован - мёртвый код"
},
{
"id": "admin_users_add",
"title": "Добавить пользователей",
"page": "admin_users",
"source": "web/src/pages/AdminPanel/UsersPage/ModalAddUsers.jsx:71",
"priority": 2,
"role": "admin",
"page_ref": "admin_users",
"open": {
"selector": "role=button[name=\"Добавить\"]",
"action": "click"
},
"appear": {
"css": ".fixed.inset-0.z-50",
"text": "Добавить пользователей"
}
},
{
"id": "admin_users_edit",
"title": "Информация о пользователе",
"page": "admin_users",
"source": "web/src/pages/AdminPanel/UsersPage/UserTable/EditUserModal.jsx:311",
"priority": 2,
"role": "admin",
"page_ref": "admin_users",
"open": {
"selector": "role=menuitem[name=\"Редактировать\"]",
"action": "click",
"pre": [
{
"selector": "tbody tr >> nth=1 >> button >> nth=-1",
"action": "click"
}
]
},
"appear": {
"css": ".fixed.inset-0.z-50",
"text": "Информация о пользователе"
}
},
{
"id": "admin_users_delete",
"title": "Удалить пользователя?",
"page": "admin_users",
"source": "web/src/pages/AdminPanel/UsersPage/UserTable/DeleteUserModal.jsx:48",
"priority": 2,
"role": "admin",
"page_ref": "admin_users",
"open": {
"selector": "role=menuitem[name=\"Удалить\"]",
"action": "click",
"pre": [
{
"selector": "tbody tr >> nth=1 >> button >> nth=-1",
"action": "click"
}
]
},
"appear": {
"css": ".MuiTypography-root",
"text": "Удалить пользователя?"
}
},
{
"id": "admin_users_ssp",
"title": "Выбор подразделения пользователя",
"page": "admin_users",
"source": "web/src/pages/AdminPanel/UsersPage/ModalEditUserSsp.jsx:93",
"priority": 2,
"role": "admin",
"page_ref": "admin_users",
"open": {
"selector": "tbody button:has-text(\"Выбрать\") >> nth=0",
"action": "click"
},
"appear": {
"css": ".fixed.inset-0.z-50",
"text": "Выбор подразделения"
}
},
{
"id": "admin_ssps_add",
"title": "Добавить ССП/РФ",
"page": "admin_ssps",
"source": "web/src/pages/AdminPanel/SppsPage/ModalAddSsp.jsx:51",
"priority": 2,
"role": "admin",
"page_ref": "admin_ssps",
"open": {
"selector": "role=button[name=\"Добавить\"]",
"action": "click"
},
"appear": {
"css": ".fixed.inset-0.z-50",
"text": "Добавить ССП/Рег. филиал"
}
},
{
"id": "admin_ssps_edit",
"title": "Редактировать ССП/РФ",
"page": "admin_ssps",
"source": "web/src/pages/AdminPanel/SppsPage/ModalEditSsp.jsx:41",
"priority": 2,
"role": "admin",
"page_ref": "admin_ssps",
"open": {
"selector": "tbody tr >> nth=0 >> button >> nth=-1",
"action": "click"
},
"appear": {
"css": ".fixed.inset-0.z-50",
"text": "Редактировать ССП/Рег. филиал"
}
},
{
"id": "admin_ssps_users",
"title": "Список пользователей ССП/РФ",
"page": "admin_ssps",
"source": "web/src/pages/AdminPanel/SppsPage/ModalChangeUsersInSsp.jsx:121",
"priority": 2,
"role": "admin",
"page_ref": "admin_ssps",
"open": {
"selector": "tbody tr >> nth=0 >> button >> nth=0",
"action": "click"
},
"appear": {
"css": ".fixed.inset-0.z-50",
"text": "Редактировать список пользователей"
}
},
{
"id": "admin_ssps_archive",
"title": "Подтверждение архивации ССП",
"page": "admin_ssps",
"source": "web/src/pages/AdminPanel/SppsPage/ModalConfirmArchiveSsp.jsx:27",
"priority": 2,
"role": "admin",
"page_ref": "admin_ssps",
"open": {
"selector": "tbody tr >> nth=0 >> button:has-text(\"Активен\")",
"action": "click"
},
"appear": {
"css": ".fixed.inset-0.z-50",
"text": "Отправить ссп в архив"
}
},
{
"id": "admin_phase_add",
"title": "Добавление этапа (шаблон)",
"page": "admin_default_stage",
"source": "web/src/pages/AdminPanel/PhaseTemplatesPage/components/PhaseTemplateDialog.jsx:120",
"priority": 2,
"role": "admin",
"page_ref": "admin_default_stage",
"open": {
"selector": "role=button[name=\"Добавить этап\"]",
"action": "click"
},
"appear": {
"css": "[role=dialog]",
"text": "Добавление этапа"
}
},
{
"id": "admin_phase_edit",
"title": "Редактирование этапа (шаблон)",
"page": "admin_default_stage",
"source": "web/src/pages/AdminPanel/PhaseTemplatesPage/components/PhaseTemplateDialog.jsx:120",
"priority": 2,
"role": "admin",
"page_ref": "admin_default_stage",
"open": {
"selector": "role=button[name^=\"Редактировать этап\"] >> nth=0",
"action": "click"
},
"appear": {
"css": "[role=dialog]",
"text": "Редактирование этапа"
}
},
{
"id": "admin_phase_delete",
"title": "Удалить предопределённый этап?",
"page": "admin_default_stage",
"source": "web/src/pages/AdminPanel/PhaseTemplatesPage/components/DeletePhaseTemplateDialog.jsx:8",
"priority": 2,
"role": "admin",
"page_ref": "admin_default_stage",
"open": {
"selector": "role=button[name^=\"Удалить этап\"] >> nth=0",
"action": "click"
},
"appear": {
"css": "[role=dialog]",
"text": "Удалить предопределённый этап"
}
},
{
"id": "admin_audit_json",
"title": "Детали события аудита",
"page": "admin_audit_log",
"source": "web/src/pages/AdminPanel/AuditLogsPage/components/JsonViewModal.jsx:95",
"priority": 2,
"role": "admin",
"page_ref": "admin_audit_log",
"open": {
"selector": "text=Посмотреть >> nth=0",
"action": "click"
},
"appear": {
"css": ".MuiModal-root",
"text": "Детали события"
},
"note": "MUI Modal; страница грузится дольше"
},
{
"id": "dict_vsp_add",
"title": "Добавление ВСП",
"page": "dict_vsp",
"source": "web/src/pages/DictVspPage/components/Modals/ModalEditAddVsp.jsx:239",
"priority": 2,
"role": "admin",
"page_ref": "dict_vsp",
"open": {
"selector": "role=button[name=\"+ Добавить объект\"]",
"action": "click"
},
"appear": {
"css": ".fixed.inset-0.z-50",
"text": "Добавление ВСП"
}
},
{
"id": "dict_vsp_edit",
"title": "Редактирование ВСП",
"page": "dict_vsp",
"source": "web/src/pages/DictVspPage/components/Modals/ModalEditAddVsp.jsx:239",
"priority": 2,
"role": "admin",
"page_ref": "dict_vsp",
"open": {
"selector": "tbody tr >> nth=0 >> button >> nth=-1",
"action": "click"
},
"appear": {
"css": ".fixed.inset-0.z-50",
"text": "Редактирование ВСП"
},
"note": "нужны строки справочника (после выбора ССП)"
},
{
"id": "dict_vsp_export",
"title": "Экспорт ВСП",
"page": "dict_vsp",
"source": "web/src/pages/DictVspPage/components/Modals/ModalExport.jsx:71",
"priority": 2,
"role": "admin",
"page_ref": "dict_vsp",
"open": {
"selector": "role=button[name=\"Экспортировать\"]",
"action": "click"
},
"appear": {
"css": ".fixed.inset-0.z-50",
"text": "Экспорт ВСП"
}
}
]