Skip to content

Commit

Permalink
Add Single Date Search bar control
Browse files Browse the repository at this point in the history
  • Loading branch information
vesnushka committed Dec 3, 2024
1 parent 9aceceb commit 18814ed
Show file tree
Hide file tree
Showing 9 changed files with 114 additions and 2 deletions.
19 changes: 19 additions & 0 deletions src/components/SearchBar/SearchBarColumn/DateSingleColumn/hooks.ts
Original file line number Diff line number Diff line change
@@ -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 };
}
Original file line number Diff line number Diff line change
@@ -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 (
<DatePicker
showTime={false}
onChange={onColumnChange}
value={columnFilterValue.value}
placeholder={placeholder}
clearIcon={false}
/>
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import { RangePickerProps } from 'antd/lib/date-picker/generatePicker';
import moment from 'moment';

export type RangePickerOnChange = Exclude<RangePickerProps<moment.Moment>['onChange'], undefined>;
10 changes: 10 additions & 0 deletions src/components/SearchBar/SearchBarColumn/index.tsx
Original file line number Diff line number Diff line change
@@ -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';
Expand All @@ -10,6 +11,7 @@ import {
isReferenceColumnFilterValue,
isChoiceColumnFilterValue,
isSolidChoiceColumnFilterValue,
isSingleDateColumnFilterValue,
} from '../types';

export function SearchBarColumn(props: SearchBarColumnProps) {
Expand All @@ -31,6 +33,14 @@ export function SearchBarColumn(props: SearchBarColumnProps) {
return <DateColumn {...dateProps} />;
}

if (isSingleDateColumnFilterValue(columnFilterValue)) {
const dateProps = {
...props,
columnFilterValue,
};
return <DateSingleColumn {...dateProps} />;
}

if (isReferenceColumnFilterValue(columnFilterValue)) {
const referenceProps = {
...props,
Expand Down
6 changes: 6 additions & 0 deletions src/components/SearchBar/SearchBarColumn/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import {
DateTypeColumnFilterValue,
ReferenceTypeColumnFilterValue,
StringTypeColumnFilterValue,
SingleDateTypeColumnFilterValue,
} from '../types';

export type SearchBarColumnProps = {
Expand All @@ -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;
Expand Down
14 changes: 14 additions & 0 deletions src/components/SearchBar/hooks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,16 @@ import {
isChoiceColumnFilterValue,
isSolidChoiceColumn,
isSolidChoiceColumnFilterValue,
isSingleDateColumn,
isSingleDateColumnFilterValue,
} from './types';
import {
validateStringColumnFilterValue,
validateDateColumnFilterValue,
validateReferenceColumnFilterValue,
validateChoiceColumnFilterValue,
validateSolidChoiceColumnFilterValue,
validateSingleDateColumnFilterValue,
} from './validate';

export function useSearchBar(props: SearchBarProps): SearchBarData {
Expand All @@ -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 };
}
Expand Down Expand Up @@ -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;
Expand Down
23 changes: 23 additions & 0 deletions src/components/SearchBar/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand All @@ -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;
Expand Down Expand Up @@ -63,6 +70,7 @@ export type SearchBarSolidChoiceColumn = {
export type SearchBarColumn =
| SearchBarStringColumn
| SearchBarDateColumn
| SearchBarSingleDateColumn
| SearchBarReferenceColumn
| SearchBarChoiceColumn
| SearchBarSolidChoiceColumn;
Expand All @@ -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;
}
Expand All @@ -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;
Expand All @@ -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<Resource> | null;
Expand All @@ -109,6 +126,7 @@ export interface SolidChoiceTypeColumnFilterValue {
export type ColumnFilterValue =
| StringTypeColumnFilterValue
| DateTypeColumnFilterValue
| SingleDateTypeColumnFilterValue
| ReferenceTypeColumnFilterValue
| ChoiceTypeColumnFilterValue
| SolidChoiceTypeColumnFilterValue;
Expand All @@ -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 {
Expand Down
7 changes: 6 additions & 1 deletion src/components/SearchBar/utils.ts
Original file line number Diff line number Diff line change
@@ -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,
Expand Down Expand Up @@ -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;
}
Expand Down
13 changes: 12 additions & 1 deletion src/components/SearchBar/validate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import {
ColumnFilterValue,
DateTypeColumnFilterValue,
ReferenceTypeColumnFilterValue,
SingleDateTypeColumnFilterValue,
SolidChoiceTypeColumnFilterValue,
StringTypeColumnFilterValue,
} from './types';
Expand Down Expand Up @@ -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'] {
Expand Down Expand Up @@ -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');
}

0 comments on commit 18814ed

Please sign in to comment.