diff --git a/src/components/SearchBar/SearchBarColumn/DateSingleColumn/hooks.ts b/src/components/SearchBar/SearchBarColumn/DateSingleColumn/hooks.ts new file mode 100644 index 00000000..1a181d74 --- /dev/null +++ b/src/components/SearchBar/SearchBarColumn/DateSingleColumn/hooks.ts @@ -0,0 +1,19 @@ +import moment from 'moment'; +import { useCallback } from 'react'; + +import { SearchBarColumnSingleDateTypeProps } from '../types'; + +export function useDateColumn(props: SearchBarColumnSingleDateTypeProps) { + const { onChange, columnFilterValue } = props; + + const onColumnChange = useCallback( + (value: moment.Moment | null) => { + if (value) { + onChange(value, columnFilterValue.column.id); + } + }, + [onChange, columnFilterValue], + ); + + return { onColumnChange }; +} diff --git a/src/components/SearchBar/SearchBarColumn/DateSingleColumn/index.tsx b/src/components/SearchBar/SearchBarColumn/DateSingleColumn/index.tsx new file mode 100644 index 00000000..6be64ae0 --- /dev/null +++ b/src/components/SearchBar/SearchBarColumn/DateSingleColumn/index.tsx @@ -0,0 +1,20 @@ +import { DatePicker } from 'src/components/DatePicker'; + +import { useDateColumn } from './hooks'; +import { SearchBarColumnSingleDateTypeProps } from '../types'; + +export function DateSingleColumn(props: SearchBarColumnSingleDateTypeProps) { + const { columnFilterValue } = props; + const { placeholder } = columnFilterValue.column; + const { onColumnChange } = useDateColumn(props); + + return ( + + ); +} diff --git a/src/components/SearchBar/SearchBarColumn/DateSingleColumn/types.ts b/src/components/SearchBar/SearchBarColumn/DateSingleColumn/types.ts new file mode 100644 index 00000000..c2e504b6 --- /dev/null +++ b/src/components/SearchBar/SearchBarColumn/DateSingleColumn/types.ts @@ -0,0 +1,4 @@ +import { RangePickerProps } from 'antd/lib/date-picker/generatePicker'; +import moment from 'moment'; + +export type RangePickerOnChange = Exclude['onChange'], undefined>; diff --git a/src/components/SearchBar/SearchBarColumn/index.tsx b/src/components/SearchBar/SearchBarColumn/index.tsx index f05d7ea2..fe791b76 100644 --- a/src/components/SearchBar/SearchBarColumn/index.tsx +++ b/src/components/SearchBar/SearchBarColumn/index.tsx @@ -1,5 +1,6 @@ import { ChoiceColumn } from './ChoiceColumn'; import { DateColumn } from './DateColumn'; +import { DateSingleColumn } from './DateSingleColumn'; import { ReferenceColumn } from './ReferenceColumn'; import { SolidChoiceColumn } from './SolidChoiceColumn'; import { StringColumn } from './StringColumn'; @@ -10,6 +11,7 @@ import { isReferenceColumnFilterValue, isChoiceColumnFilterValue, isSolidChoiceColumnFilterValue, + isSingleDateColumnFilterValue, } from '../types'; export function SearchBarColumn(props: SearchBarColumnProps) { @@ -31,6 +33,14 @@ export function SearchBarColumn(props: SearchBarColumnProps) { return ; } + if (isSingleDateColumnFilterValue(columnFilterValue)) { + const dateProps = { + ...props, + columnFilterValue, + }; + return ; + } + if (isReferenceColumnFilterValue(columnFilterValue)) { const referenceProps = { ...props, diff --git a/src/components/SearchBar/SearchBarColumn/types.ts b/src/components/SearchBar/SearchBarColumn/types.ts index dcf94301..db3eeb8c 100644 --- a/src/components/SearchBar/SearchBarColumn/types.ts +++ b/src/components/SearchBar/SearchBarColumn/types.ts @@ -5,6 +5,7 @@ import { DateTypeColumnFilterValue, ReferenceTypeColumnFilterValue, StringTypeColumnFilterValue, + SingleDateTypeColumnFilterValue, } from '../types'; export type SearchBarColumnProps = { @@ -22,6 +23,11 @@ export interface SearchBarColumnDateTypeProps { onChange: (value: DateTypeColumnFilterValue['value'], key: string) => void; } +export interface SearchBarColumnSingleDateTypeProps { + columnFilterValue: SingleDateTypeColumnFilterValue; + onChange: (value: SingleDateTypeColumnFilterValue['value'], key: string) => void; +} + export interface SearchBarColumnReferenceTypeProps { columnFilterValue: ReferenceTypeColumnFilterValue; onChange: (value: ReferenceTypeColumnFilterValue['value'], key: string) => void; diff --git a/src/components/SearchBar/hooks.ts b/src/components/SearchBar/hooks.ts index ab1720e9..6de4300a 100644 --- a/src/components/SearchBar/hooks.ts +++ b/src/components/SearchBar/hooks.ts @@ -14,6 +14,8 @@ import { isChoiceColumnFilterValue, isSolidChoiceColumn, isSolidChoiceColumnFilterValue, + isSingleDateColumn, + isSingleDateColumnFilterValue, } from './types'; import { validateStringColumnFilterValue, @@ -21,6 +23,7 @@ import { validateReferenceColumnFilterValue, validateChoiceColumnFilterValue, validateSolidChoiceColumnFilterValue, + validateSingleDateColumnFilterValue, } from './validate'; export function useSearchBar(props: SearchBarProps): SearchBarData { @@ -36,6 +39,10 @@ export function useSearchBar(props: SearchBarProps): SearchBarData { return { column, value: undefined }; } + if (isSingleDateColumn(column)) { + return { column, value: column.defaultValue ?? undefined }; + } + if (isReferenceColumn(column)) { return { column, value: null }; } @@ -78,6 +85,13 @@ export function useSearchBar(props: SearchBarProps): SearchBarData { } } + if (isSingleDateColumnFilterValue(newFilterValue)) { + if (validateSingleDateColumnFilterValue(value)) { + newFilterValue.value = value; + return newFilterValue; + } + } + if (isReferenceColumnFilterValue(newFilterValue)) { if (validateReferenceColumnFilterValue(value)) { newFilterValue.value = value; diff --git a/src/components/SearchBar/types.ts b/src/components/SearchBar/types.ts index 207fdc39..1fac95af 100644 --- a/src/components/SearchBar/types.ts +++ b/src/components/SearchBar/types.ts @@ -8,6 +8,7 @@ import { LoadResourceOption } from 'src/services/questionnaire'; export enum SearchBarColumnType { STRING = 'string', DATE = 'date', + SINGLEDATE = 'singleDate', REFERENCE = 'reference', CHOICE = 'choice', SOLIDCHOICE = 'solidChoice', @@ -26,6 +27,12 @@ export type SearchBarDateColumn = { type: SearchBarColumnType.DATE; placeholder: [string, string]; }; +export type SearchBarSingleDateColumn = { + id: string; + type: SearchBarColumnType.SINGLEDATE; + placeholder: string; + defaultValue?: moment.Moment; +}; export type SearchBarReferenceColumn = { id: string; type: SearchBarColumnType.REFERENCE; @@ -63,6 +70,7 @@ export type SearchBarSolidChoiceColumn = { export type SearchBarColumn = | SearchBarStringColumn | SearchBarDateColumn + | SearchBarSingleDateColumn | SearchBarReferenceColumn | SearchBarChoiceColumn | SearchBarSolidChoiceColumn; @@ -72,6 +80,9 @@ export function isStringColumn(column: SearchBarColumn): column is SearchBarStri export function isDateColumn(column: SearchBarColumn): column is SearchBarDateColumn { return column.type === SearchBarColumnType.DATE; } +export function isSingleDateColumn(column: SearchBarColumn): column is SearchBarSingleDateColumn { + return column.type === SearchBarColumnType.SINGLEDATE; +} export function isReferenceColumn(column: SearchBarColumn): column is SearchBarReferenceColumn { return column.type === SearchBarColumnType.REFERENCE; } @@ -83,6 +94,7 @@ export function isSolidChoiceColumn(column: SearchBarColumn): column is SearchBa } export type DateColumnFilterValue = [moment.Moment, moment.Moment]; +export type SingleDateColumnFilterValue = moment.Moment; export interface StringTypeColumnFilterValue { column: SearchBarStringColumn; @@ -92,6 +104,11 @@ export interface DateTypeColumnFilterValue { column: SearchBarDateColumn; value?: DateColumnFilterValue; } + +export interface SingleDateTypeColumnFilterValue { + column: SearchBarSingleDateColumn; + value?: SingleDateColumnFilterValue; +} export interface ReferenceTypeColumnFilterValue { column: SearchBarReferenceColumn; value?: LoadResourceOption | null; @@ -109,6 +126,7 @@ export interface SolidChoiceTypeColumnFilterValue { export type ColumnFilterValue = | StringTypeColumnFilterValue | DateTypeColumnFilterValue + | SingleDateTypeColumnFilterValue | ReferenceTypeColumnFilterValue | ChoiceTypeColumnFilterValue | SolidChoiceTypeColumnFilterValue; @@ -118,6 +136,11 @@ export function isStringColumnFilterValue(filterValue: ColumnFilterValue): filte export function isDateColumnFilterValue(filterValue: ColumnFilterValue): filterValue is DateTypeColumnFilterValue { return isDateColumn(filterValue.column); } +export function isSingleDateColumnFilterValue( + filterValue: ColumnFilterValue, +): filterValue is SingleDateTypeColumnFilterValue { + return isSingleDateColumn(filterValue.column); +} export function isReferenceColumnFilterValue( filterValue: ColumnFilterValue, ): filterValue is ReferenceTypeColumnFilterValue { diff --git a/src/components/SearchBar/utils.ts b/src/components/SearchBar/utils.ts index 5fb6592e..a18b947f 100644 --- a/src/components/SearchBar/utils.ts +++ b/src/components/SearchBar/utils.ts @@ -1,10 +1,11 @@ -import { formatFHIRDateTime } from '@beda.software/fhir-react'; +import { formatFHIRDate, formatFHIRDateTime } from '@beda.software/fhir-react'; import { ColumnFilterValue, isChoiceColumnFilterValue, isDateColumnFilterValue, isReferenceColumnFilterValue, + isSingleDateColumnFilterValue, isSolidChoiceColumnFilterValue, isStringColumnFilterValue, SearchBarColumn, @@ -34,6 +35,10 @@ export function getSearchBarColumnFilterValue(filterValue: ColumnFilterValue) { : undefined; } + if (isSingleDateColumnFilterValue(filterValue)) { + return filterValue.value ? formatFHIRDate(filterValue.value) : undefined; + } + if (isReferenceColumnFilterValue(filterValue)) { return filterValue.value?.value.Reference.id; } diff --git a/src/components/SearchBar/validate.ts b/src/components/SearchBar/validate.ts index 197ebc7f..9435c7dc 100644 --- a/src/components/SearchBar/validate.ts +++ b/src/components/SearchBar/validate.ts @@ -6,6 +6,7 @@ import { ColumnFilterValue, DateTypeColumnFilterValue, ReferenceTypeColumnFilterValue, + SingleDateTypeColumnFilterValue, SolidChoiceTypeColumnFilterValue, StringTypeColumnFilterValue, } from './types'; @@ -33,6 +34,16 @@ export function validateDateColumnFilterValue( throw new Error('Invalid date column filter value'); } +export function validateSingleDateColumnFilterValue( + value?: ColumnFilterValue['value'], +): value is SingleDateTypeColumnFilterValue['value'] { + if (_.isUndefined(value) || moment.isMoment(value)) { + return true; + } + + throw new Error('Invalid single date column filter value'); +} + export function validateReferenceColumnFilterValue( value?: ColumnFilterValue['value'], ): value is ReferenceTypeColumnFilterValue['value'] { @@ -76,5 +87,5 @@ export function validateSolidChoiceColumnFilterValue( return true; } - throw new Error('Invalid choice column filter value'); + throw new Error('Invalid solid choice column filter value'); }