summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/ServiceContext.tsx9
-rw-r--r--src/lib/ServiceList.tsx34
2 files changed, 27 insertions, 16 deletions
diff --git a/src/lib/ServiceContext.tsx b/src/lib/ServiceContext.tsx
index 67f3756..2001d00 100644
--- a/src/lib/ServiceContext.tsx
+++ b/src/lib/ServiceContext.tsx
@@ -2,11 +2,18 @@ import React from 'react';
import { FormikProps } from 'formik';
import { Props as ButtonProps } from '../components/Button';
import { Field } from '../components/ListTable';
+import { Option } from '../components/Select';
export interface Action extends ButtonProps {
name: string;
}
+export interface Filter extends Field {
+ as?: string;
+ options?: Option[];
+ value?: string;
+}
+
export interface PanelProps<T> {
item: T;
mutate: (item: T) => void;
@@ -20,7 +27,7 @@ export interface ServiceParams<T = any> {
default?: Partial<T>;
routes?: Record<string, React.FC>;
actions?: Action[];
- filters?: string[];
+ filters?: Filter[];
rowLink?: (item: T) => string;
Form?: React.FC<FormikProps<T>>;
Panel?: React.FC<PanelProps<T>>;
diff --git a/src/lib/ServiceList.tsx b/src/lib/ServiceList.tsx
index 9b12d6b..5abae6b 100644
--- a/src/lib/ServiceList.tsx
+++ b/src/lib/ServiceList.tsx
@@ -2,42 +2,46 @@ import React, { useContext } from 'react';
import { useHistory, useLocation } from 'react-router-dom';
import _ from 'lodash';
import Page from '../containers/Page';
-import ListTable, { Field } from '../components/ListTable';
+import ListTable from '../components/ListTable';
import hooks from '../hooks/useAPIClient';
-import ServiceContext from './ServiceContext';
+import ServiceContext, { Filter } from './ServiceContext';
+import useQuery from '../hooks/useQuery';
-const getItemField = (item: any, field: Field) => {
- const value = _.get(item, field.key);
- return field.transform ? field.transform(value) : value;
+const getOptionLabel = (item: any, filter: Filter) => {
+ const value = _.get(item, filter.as || filter.key);
+ return filter.transform ? filter.transform(value) : value;
};
const ServiceList: React.FC = () => {
const service = useContext(ServiceContext);
const history = useHistory();
const location = useLocation();
+ const query = useQuery();
const { data } = hooks[service.route].useList(location.search);
+ const { data: unfilteredData } = hooks[service.route].useList('', { revalidateOnMount: !!location.search });
const actions = service.actions || [{
name: 'Добавить',
route: `/${service.route}/add${location.search}`,
}];
- const filters = service.filters?.map(key => {
- const field = _.find(service.tableFields, { key });
- if (!field) return { key: '-', label: '-', options: [] };
-
- const options = data?.map((item: any) => ({
- key: _.get(item, field.key),
- label: getItemField(item, field),
- }));
+ const filters = service.filters?.map(filter => {
+ const options = _
+ .uniqBy(unfilteredData, filter.key)
+ .map((item: any) => ({
+ key: _.get(item, filter.key),
+ label: getOptionLabel(item, filter),
+ }));
// Add default option
options?.unshift({
key: '-',
- label: field.label,
+ label: filter.label,
});
- return { ...field, options };
+ const value = _.get(query, filter.key);
+
+ return { ...filter, options, value };
});
const handleRowClick = (item: any) => {