Сохранять выбранные галочки на вкладке «Выгрузка маршрутов» в localStorage

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
gorbenko.pavel
2026-10-13 09:50:04 +05:00
parent 75214f5797
commit 43b3c77ac1
@@ -3,6 +3,7 @@ import { ApprovalRouteApi } from '../../services/api';
import { PortalDictionaryClient } from '../../services/portalDictionary'; import { PortalDictionaryClient } from '../../services/portalDictionary';
import { texts } from '../../texts'; import { texts } from '../../texts';
import { useRequestTypes } from '../../hooks/useRequestTypes'; import { useRequestTypes } from '../../hooks/useRequestTypes';
import { useLocalStorageState } from '../../hooks/useLocalStorageState';
import { usePortalEmployees } from '../../hooks/usePortalEmployees'; import { usePortalEmployees } from '../../hooks/usePortalEmployees';
import { usePortalDictionaries } from '../../hooks/usePortalDictionaries'; import { usePortalDictionaries } from '../../hooks/usePortalDictionaries';
import { reportError } from '../../utils/errors'; import { reportError } from '../../utils/errors';
@@ -15,6 +16,10 @@ export interface IRoutesExportScreenProps {
dictionary?: PortalDictionaryClient; dictionary?: PortalDictionaryClient;
} }
// Выбранные типы заявок переживают перезагрузку страницы — выгрузку обычно
// делают по одному и тому же набору типов.
const SELECTED_STORAGE_KEY = 'approvalAdmin.routesExport.selected';
function download(blob: Blob, fileName: string): void { function download(blob: Blob, fileName: string): void {
const url = URL.createObjectURL(blob); const url = URL.createObjectURL(blob);
const link = document.createElement('a'); const link = document.createElement('a');
@@ -31,15 +36,17 @@ export const RoutesExportScreen: React.FC<IRoutesExportScreenProps> = ({ api, di
const employees = usePortalEmployees(dictionary); const employees = usePortalEmployees(dictionary);
const portalDictionaries = usePortalDictionaries(dictionary); const portalDictionaries = usePortalDictionaries(dictionary);
const [selected, setSelected] = React.useState<number[]>([]); const [storedSelected, setSelected] = useLocalStorageState<number[]>(SELECTED_STORAGE_KEY, []);
const [isBusy, setIsBusy] = React.useState(false); const [isBusy, setIsBusy] = React.useState(false);
const [error, setError] = React.useState<string | undefined>(); const [error, setError] = React.useState<string | undefined>();
const allIds = requestTypes.items.map(rt => rt.id); const allIds = requestTypes.items.map(rt => rt.id);
// Удалённые с тех пор типы из сохранённого выбора не считаем.
const selected = storedSelected.filter(id => allIds.indexOf(id) !== -1);
const allSelected = allIds.length > 0 && allIds.every(id => selected.indexOf(id) !== -1); const allSelected = allIds.length > 0 && allIds.every(id => selected.indexOf(id) !== -1);
const toggle = (id: number, checked: boolean): void => const toggle = (id: number, checked: boolean): void =>
setSelected(current => (checked ? [...current, id] : current.filter(x => x !== id))); setSelected(current => (checked ? [...current.filter(x => x !== id), id] : current.filter(x => x !== id)));
const runExport = (): void => { const runExport = (): void => {
setError(undefined); setError(undefined);