From a7e5d2fcda2e376ef2e834381f793acbe03e0845 Mon Sep 17 00:00:00 2001 From: Birk Johansson Date: Mon, 29 Jan 2024 19:57:04 +0100 Subject: [PATCH] feat: add publicAccessFilter --- .../sectionList/filters/DynamicFilters.tsx | 2 ++ .../ConstantSelectionFilter.tsx | 7 ++++++- .../filterSelectors/PublicAccessFilter.tsx | 19 +++++++++++++++++++ src/lib/sectionList/filters/filterConfig.tsx | 6 +++++- .../filters/parseFiltersToQueryParams.ts | 10 ++++++++-- .../listViews/sectionListViewsConfig.ts | 6 +++++- 6 files changed, 45 insertions(+), 5 deletions(-) create mode 100644 src/components/sectionList/filters/filterSelectors/PublicAccessFilter.tsx diff --git a/src/components/sectionList/filters/DynamicFilters.tsx b/src/components/sectionList/filters/DynamicFilters.tsx index 20c7e0cd..1895cf7b 100644 --- a/src/components/sectionList/filters/DynamicFilters.tsx +++ b/src/components/sectionList/filters/DynamicFilters.tsx @@ -7,6 +7,7 @@ import { DomainTypeSelectionFilter, ValueTypeSelectionFilter, } from './filterSelectors' +import { PublicAccessFilter } from './filterSelectors/PublicAccessFilter' import { useFilterKeys } from './useFilterKeys' type FilterKeyToComponentMap = Partial> @@ -17,6 +18,7 @@ const filterKeyToComponentMap: FilterKeyToComponentMap = { domainType: DomainTypeSelectionFilter, valueType: ValueTypeSelectionFilter, aggregationType: AggregationTypeFilter, + publicAccess: PublicAccessFilter, } export const DynamicFilters = () => { diff --git a/src/components/sectionList/filters/filterSelectors/ConstantSelectionFilter.tsx b/src/components/sectionList/filters/filterSelectors/ConstantSelectionFilter.tsx index 2c29b768..64647e71 100644 --- a/src/components/sectionList/filters/filterSelectors/ConstantSelectionFilter.tsx +++ b/src/components/sectionList/filters/filterSelectors/ConstantSelectionFilter.tsx @@ -19,13 +19,18 @@ export const ConstantSelectionFilter = ({ filterable, }: ConstantSelectionFilterProps) => { const [filter, setFilter] = useSectionListFilter(filterKey) + + const selected = Array.isArray(filter) ? filter[0] : filter + const isInOptions = + selected && constants[selected as keyof typeof constants] + return ( { setFilter(selected ? [selected] : undefined) }} - selected={Array.isArray(filter) ? filter[0] : filter} + selected={isInOptions ? selected : undefined} placeholder={label} dense prefix={label} diff --git a/src/components/sectionList/filters/filterSelectors/PublicAccessFilter.tsx b/src/components/sectionList/filters/filterSelectors/PublicAccessFilter.tsx new file mode 100644 index 00000000..e5e0df45 --- /dev/null +++ b/src/components/sectionList/filters/filterSelectors/PublicAccessFilter.tsx @@ -0,0 +1,19 @@ +import i18n from '@dhis2/d2-i18n' +import React from 'react' +import { ConstantSelectionFilter } from './ConstantSelectionFilter' + +const constants = { + 'rw------': 'Public can edit', + 'r-------': 'Public can view', + '--------': 'Public cannot access', +} + +export const PublicAccessFilter = () => { + return ( + + ) +} diff --git a/src/lib/sectionList/filters/filterConfig.tsx b/src/lib/sectionList/filters/filterConfig.tsx index 158ccadb..cd05e885 100644 --- a/src/lib/sectionList/filters/filterConfig.tsx +++ b/src/lib/sectionList/filters/filterConfig.tsx @@ -2,7 +2,7 @@ import { StringParam } from 'use-query-params' import { z } from 'zod' import { DataElement } from '../../../types/generated' import { IDENTIFIABLE_KEY } from '../../constants' -import { isValidUid } from '../../models' +import { isValidUid, parsePublicAccessString } from '../../models' import { CustomDelimitedArrayParam } from './customParams' const zodArrayIds = z.array(z.string().refine((val) => isValidUid(val))) @@ -15,6 +15,9 @@ export const filterParamsSchema = z categoryCombo: zodArrayIds, dataSet: zodArrayIds, domainType: z.array(z.nativeEnum(DataElement.domainType)), + publicAccess: z.array( + z.string().refine((val) => parsePublicAccessString(val) !== null) + ), valueType: z.array(z.nativeEnum(DataElement.valueType)), }) .partial() @@ -28,6 +31,7 @@ export const filterQueryParamType = { valueType: CustomDelimitedArrayParam, dataSet: CustomDelimitedArrayParam, categoryCombo: CustomDelimitedArrayParam, + publicAccess: CustomDelimitedArrayParam, } as const satisfies QueryParamsConfigMap export const validFilterKeys = Object.keys(filterQueryParamType) diff --git a/src/lib/sectionList/filters/parseFiltersToQueryParams.ts b/src/lib/sectionList/filters/parseFiltersToQueryParams.ts index f19f60b8..33301a67 100644 --- a/src/lib/sectionList/filters/parseFiltersToQueryParams.ts +++ b/src/lib/sectionList/filters/parseFiltersToQueryParams.ts @@ -10,6 +10,9 @@ const defaultFilter = (key: FilterKey, value: AllValues): string => { return `${key}:${operator}:${valuesString}` } +const inFilter = (filterPath: string, value: string[]) => + `${filterPath}:in:[${value.join(',')}]` + const getQueryParamForFilter = ( key: FilterKey, value: AllValues, @@ -24,11 +27,14 @@ const getQueryParamForFilter = ( if (key === 'dataSet') { const v = value as string[] if (section?.name === SECTIONS_MAP.dataElement.name) { - return `dataSetElements.dataSet.id:in:[${v.join(',')}]` + return inFilter('dataSetElements.dataSet.id', v) } } if (key === 'categoryCombo') { - return `categoryCombo.id:in:[${(value as string[]).join(',')}]` + return inFilter('categoryCombo.id', value as string[]) + } + if (key === 'publicAccess') { + return inFilter('sharing.public', value as string[]) } return defaultFilter(key, value) } diff --git a/src/lib/sectionList/listViews/sectionListViewsConfig.ts b/src/lib/sectionList/listViews/sectionListViewsConfig.ts index 97269851..d1111896 100644 --- a/src/lib/sectionList/listViews/sectionListViewsConfig.ts +++ b/src/lib/sectionList/listViews/sectionListViewsConfig.ts @@ -45,6 +45,10 @@ const FILTERS = { label: i18n.t('Category combo'), }, dataSet: { filterKey: 'dataSet', label: i18n.t('Data set') }, + publicAccess: { + filterKey: 'publicAccess', + label: i18n.t('Public access'), + }, } satisfies Record // This is the default views, and can be overriden per section in modelListViewsConfig below @@ -98,7 +102,7 @@ export const modelListViewsConfig = { FILTERS.dataSet, 'categoryCombo', ], - available: ['categoryCombo'], + available: ['categoryCombo', FILTERS.publicAccess], }, }, } satisfies SectionListViewConfig