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}`,
},
},