diff options
author | eug-vs <eug-vs@keemail.me> | 2021-04-17 13:39:30 +0300 |
---|---|---|
committer | eug-vs <eug-vs@keemail.me> | 2021-04-17 13:41:29 +0300 |
commit | 1bf07892f2cd8007f48469c42fa9fcc84d5ef435 (patch) | |
tree | 054d600ffa414a71f15e2dc7606121649f7587ca /src/lib | |
parent | a4a1c456e0788ca52261efb38ff3998710a42a59 (diff) | |
download | commercel-ui-1bf07892f2cd8007f48469c42fa9fcc84d5ef435.tar.gz |
feat: correctly add filters from Service JSON
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/ServiceContext.tsx | 7 | ||||
-rw-r--r-- | src/lib/ServiceList.tsx | 33 |
2 files changed, 25 insertions, 15 deletions
diff --git a/src/lib/ServiceContext.tsx b/src/lib/ServiceContext.tsx index ec76106..67f3756 100644 --- a/src/lib/ServiceContext.tsx +++ b/src/lib/ServiceContext.tsx @@ -2,17 +2,11 @@ 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 { - field: string; - options: Option[]; -} - export interface PanelProps<T> { item: T; mutate: (item: T) => void; @@ -26,6 +20,7 @@ export interface ServiceParams<T = any> { default?: Partial<T>; routes?: Record<string, React.FC>; actions?: Action[]; + filters?: string[]; 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 a3c9842..9b12d6b 100644 --- a/src/lib/ServiceList.tsx +++ b/src/lib/ServiceList.tsx @@ -1,10 +1,16 @@ import React, { useContext } from 'react'; import { useHistory, useLocation } from 'react-router-dom'; +import _ from 'lodash'; import Page from '../containers/Page'; -import ListTable from '../components/ListTable'; +import ListTable, { Field } from '../components/ListTable'; import hooks from '../hooks/useAPIClient'; import ServiceContext from './ServiceContext'; +const getItemField = (item: any, field: Field) => { + const value = _.get(item, field.key); + return field.transform ? field.transform(value) : value; +}; + const ServiceList: React.FC = () => { const service = useContext(ServiceContext); const history = useHistory(); @@ -16,14 +22,23 @@ const ServiceList: React.FC = () => { route: `/${service.route}/add${location.search}`, }]; - const filters = [{ - field: '_id', - options: [ - { key: 'a', label: 'a' }, - { key: 'b', label: 'b' }, - { key: 'c', label: 'c' }, - ], - }]; + 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), + })); + + // Add default option + options?.unshift({ + key: '-', + label: field.label, + }); + + return { ...field, options }; + }); const handleRowClick = (item: any) => { const route = service.rowLink |