персистнс строки поиска
This commit is contained in:
@@ -12,6 +12,7 @@ import {
|
|||||||
import { IMyRequest } from './models/IMyRequest';
|
import { IMyRequest } from './models/IMyRequest';
|
||||||
import { REQUEST_STATUS, IRequestType } from '../../shared/approval';
|
import { REQUEST_STATUS, IRequestType } from '../../shared/approval';
|
||||||
import { onRequestsChanged } from '../../shared/requestEvents';
|
import { onRequestsChanged } from '../../shared/requestEvents';
|
||||||
|
import { usePersistedQuery } from '../../shared/usePersistedQuery';
|
||||||
import { Pager } from './Pager';
|
import { Pager } from './Pager';
|
||||||
import styles from './RequestsTableView.module.scss';
|
import styles from './RequestsTableView.module.scss';
|
||||||
|
|
||||||
@@ -150,7 +151,7 @@ export const RequestsTableView: React.FC<IRequestsTableViewProps> = ({
|
|||||||
const [rows, setRows] = React.useState<IMyRequest[] | undefined>(undefined);
|
const [rows, setRows] = React.useState<IMyRequest[] | undefined>(undefined);
|
||||||
const [totalRows, setTotalRows] = React.useState<number>(0);
|
const [totalRows, setTotalRows] = React.useState<number>(0);
|
||||||
const [page, setPage] = React.useState<number>(1);
|
const [page, setPage] = React.useState<number>(1);
|
||||||
const [query, setQuery] = React.useState<string>('');
|
const [query, setQuery] = usePersistedQuery(kind);
|
||||||
const [error, setError] = React.useState<string>('');
|
const [error, setError] = React.useState<string>('');
|
||||||
|
|
||||||
React.useEffect(() => setPage(1), [query, kind]);
|
React.useEffect(() => setPage(1), [query, kind]);
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import { getLinkedTypes, searchMyRequests } from './myRequests.service';
|
|||||||
import { IMyRequest } from './models/IMyRequest';
|
import { IMyRequest } from './models/IMyRequest';
|
||||||
import { REQUEST_STATUS, IRequestType } from '../../shared/approval';
|
import { REQUEST_STATUS, IRequestType } from '../../shared/approval';
|
||||||
import { onRequestsChanged } from '../../shared/requestEvents';
|
import { onRequestsChanged } from '../../shared/requestEvents';
|
||||||
|
import { usePersistedQuery } from '../../shared/usePersistedQuery';
|
||||||
import { Pager } from './Pager';
|
import { Pager } from './Pager';
|
||||||
import styles from './SearchView.module.scss';
|
import styles from './SearchView.module.scss';
|
||||||
|
|
||||||
@@ -107,7 +108,7 @@ export const SearchView: React.FC<ISearchViewProps> = ({ context, onOpen }) => {
|
|||||||
const [rows, setRows] = React.useState<IMyRequest[] | undefined>(undefined);
|
const [rows, setRows] = React.useState<IMyRequest[] | undefined>(undefined);
|
||||||
const [totalRows, setTotalRows] = React.useState<number>(0);
|
const [totalRows, setTotalRows] = React.useState<number>(0);
|
||||||
const [page, setPage] = React.useState<number>(1);
|
const [page, setPage] = React.useState<number>(1);
|
||||||
const [query, setQuery] = React.useState<string>('');
|
const [query, setQuery] = usePersistedQuery('search');
|
||||||
const [error, setError] = React.useState<string>('');
|
const [error, setError] = React.useState<string>('');
|
||||||
|
|
||||||
React.useEffect(() => setPage(1), [query]);
|
React.useEffect(() => setPage(1), [query]);
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
import * as React from 'react';
|
||||||
|
|
||||||
|
// Текст поиска переживает перезагрузку страницы (localStorage), но не более
|
||||||
|
// того — это просто «продолжить с того же места», а не синхронизация между
|
||||||
|
// вкладками/устройствами. key должен быть уникальным на раздел (см. вызовы в
|
||||||
|
// RequestsTableView/SearchView), иначе значения разных таблиц перепишут друг друга.
|
||||||
|
export function usePersistedQuery(key: string): [string, (value: string) => void] {
|
||||||
|
const storageKey = `rp-search-query:${key}`;
|
||||||
|
|
||||||
|
const [value, setValue] = React.useState<string>(() => {
|
||||||
|
try {
|
||||||
|
return window.localStorage.getItem(storageKey) || '';
|
||||||
|
} catch {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const setPersisted = React.useCallback(
|
||||||
|
(next: string): void => {
|
||||||
|
setValue(next);
|
||||||
|
try {
|
||||||
|
if (next) {
|
||||||
|
window.localStorage.setItem(storageKey, next);
|
||||||
|
} else {
|
||||||
|
window.localStorage.removeItem(storageKey);
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
// localStorage недоступен (приватный режим и т.п.) — просто не сохраняем.
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[storageKey]
|
||||||
|
);
|
||||||
|
|
||||||
|
return [value, setPersisted];
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user