From 376b4a6a571b343ea6bad0ec84a49b6de87d8a5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B2=D0=BE=D0=B2=20=D0=90=D1=80=D1=82?= =?UTF-8?q?=D0=B5=D0=BC?= Date: Thu, 30 Apr 2026 04:40:42 +0300 Subject: [PATCH] Rework menu for different statuses of equip --- client/src/App.tsx | 4 ++- client/src/i18n/ru.ts | 2 +- client/src/layout/ToirLayout.tsx | 7 +++++ client/src/layout/ToirMenu.tsx | 23 ++++++++++++++ client/src/layout/toirMenuLinks.ts | 13 ++++++++ .../src/resources/equipment/EquipmentList.tsx | 30 +++++++++++++++++-- client/src/theme/toirMuiTheme.ts | 3 ++ 7 files changed, 77 insertions(+), 5 deletions(-) create mode 100644 client/src/layout/ToirLayout.tsx create mode 100644 client/src/layout/ToirMenu.tsx create mode 100644 client/src/layout/toirMenuLinks.ts diff --git a/client/src/App.tsx b/client/src/App.tsx index 5ca643d..809be98 100644 --- a/client/src/App.tsx +++ b/client/src/App.tsx @@ -15,6 +15,7 @@ import { EquipmentStatusChangeCreate } from './resources/equipment-status-change import { EquipmentStatusChangeEdit } from './resources/equipment-status-change/EquipmentStatusChangeEdit'; import { EquipmentStatusChangeList } from './resources/equipment-status-change/EquipmentStatusChangeList'; import { EquipmentStatusChangeShow } from './resources/equipment-status-change/EquipmentStatusChangeShow'; +import { ToirLayout } from './layout/ToirLayout'; function ToirAdmin() { const paletteMode = useEmbeddedParentTheme(); @@ -32,6 +33,7 @@ function ToirAdmin() { return ( ): ReactElement { + return ; +} diff --git a/client/src/layout/ToirMenu.tsx b/client/src/layout/ToirMenu.tsx new file mode 100644 index 0000000..c44720b --- /dev/null +++ b/client/src/layout/ToirMenu.tsx @@ -0,0 +1,23 @@ +import { Menu, MenuItemLink } from 'react-admin'; +import { + EQUIPMENT_SIDEBAR_ARCHIVE_FILTER, + EQUIPMENT_SIDEBAR_IN_WORK_FILTER, + equipmentListSearch, +} from './toirMenuLinks'; + +export function ToirMenu() { + return ( + + + + + + + ); +} diff --git a/client/src/layout/toirMenuLinks.ts b/client/src/layout/toirMenuLinks.ts new file mode 100644 index 0000000..435b381 --- /dev/null +++ b/client/src/layout/toirMenuLinks.ts @@ -0,0 +1,13 @@ +/** Параметры списка оборудования в формате react-admin (как при сохранённом фильтре в URL). */ +export function equipmentListSearch(filter: Record): string { + const params = new URLSearchParams(); + params.set('filter', JSON.stringify(filter)); + params.set('displayedFilters', JSON.stringify({ status: true })); + return params.toString(); +} + +/** «В работе» → статус Active (в эксплуатации). См. `equipmentStatusChoices`. */ +export const EQUIPMENT_SIDEBAR_IN_WORK_FILTER = { status: ['Active'] }; + +/** «Архив» → списанное оборудование (WriteOff). */ +export const EQUIPMENT_SIDEBAR_ARCHIVE_FILTER = { status: ['WriteOff'] }; diff --git a/client/src/resources/equipment/EquipmentList.tsx b/client/src/resources/equipment/EquipmentList.tsx index 075f642..7995dd8 100644 --- a/client/src/resources/equipment/EquipmentList.tsx +++ b/client/src/resources/equipment/EquipmentList.tsx @@ -1,3 +1,5 @@ +import { useMemo } from 'react'; +import { useLocation } from 'react-router-dom'; import { CreateButton, Datagrid, @@ -5,13 +7,26 @@ import { FilterButton, List, SelectArrayInput, - SelectField, TextField, TextInput, TopToolbar, } from 'react-admin'; import { equipmentStatusChoices } from './shared'; +function parseListFilterFromSearch(search: string): Record | undefined { + const params = new URLSearchParams(search); + const raw = params.get('filter'); + if (!raw) { + return undefined; + } + try { + const parsed = JSON.parse(raw) as Record; + return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : undefined; + } catch { + return undefined; + } +} + const equipmentFilters = [ , , @@ -25,14 +40,23 @@ const ListActions = () => ( ); export function EquipmentList() { + const location = useLocation(); + const filterDefaultValues = useMemo(() => parseListFilterFromSearch(location.search), [location.search]); + const listKey = `${location.pathname}${location.search}`; + return ( - } sort={{ field: 'name', order: 'ASC' }}> + } + sort={{ field: 'name', order: 'ASC' }} + filterDefaultValues={filterDefaultValues} + > - ); diff --git a/client/src/theme/toirMuiTheme.ts b/client/src/theme/toirMuiTheme.ts index 6b7852f..28b7b38 100644 --- a/client/src/theme/toirMuiTheme.ts +++ b/client/src/theme/toirMuiTheme.ts @@ -82,9 +82,12 @@ export function buildToirMuiTheme(mode: Mode): Theme { styleOverrides: { head: { fontWeight: 700, + fontSize: '0.9rem', borderBottom: `1px solid ${t.border}`, }, root: { + fontSize: '0.95rem', + lineHeight: 1.35, borderBottom: `1px solid ${t.divider}`, }, },