Skip to content
This repository was archived by the owner on Jul 28, 2025. It is now read-only.

Commit e4db116

Browse files
committed
checkbox filter
1 parent 582f0c3 commit e4db116

File tree

5 files changed

+63
-9
lines changed

5 files changed

+63
-9
lines changed

src/components/DefaultHeader.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,11 @@ import RollupIcon from "components/img/RollupIcon";
1919
import { AddColumnModal } from "components/modals/newColumn/addColumnModal";
2020
import {
2121
BaseFilter,
22+
BooleanFilter,
2223
DateRangeFilter,
2324
NumberFilter,
2425
TextFilter,
25-
} from "components/reducers/ColumnFilter";
26+
} from "components/reducers/ColumnFilters";
2627
import { InputType, MetadataColumns } from "helpers/Constants";
2728
import { LOGGER } from "services/Logger";
2829
import { DatabaseHeaderProps, TableColumn } from "cdm/FolderModel";
@@ -96,8 +97,11 @@ export default function DefaultHeader(headerProps: DatabaseHeaderProps) {
9697
columnSearch = <BaseFilter {...headerProps} />;
9798
break;
9899
case InputType.TASK:
100+
propertyIcon = <TaskIcon />;
101+
break;
99102
case InputType.CHECKBOX:
100103
propertyIcon = <TaskIcon />;
104+
columnSearch = <BooleanFilter {...headerProps} />;
101105
break;
102106
case InputType.FORMULA:
103107
propertyIcon = <CodeIcon />;
Lines changed: 43 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import { DatabaseHeaderProps } from "cdm/FolderModel";
22
import { DynamicDebouncedInput } from "components/behavior/DebouncedInputFn";
33
import DatePicker from "react-datepicker";
44
import React, { useState } from "react";
5+
import { ChangeEventHandler } from "react";
6+
import { StyleVariables } from "helpers/Constants";
57

68
/**
79
* Filter input for text columns
@@ -42,10 +44,10 @@ export function TextFilter(headerProps: DatabaseHeaderProps) {
4244
);
4345

4446
return (
45-
<>
46-
<datalist id={`${column.id}-list`}>
47-
{sortedUniqueValues.slice(0, 5000).map((value: any) => (
48-
<option value={value} key={value} />
47+
<div key={`${column.id}-text-filter`}>
48+
<datalist id={`${column.id}-list`} key={`${column.id}-datalist`}>
49+
{sortedUniqueValues.slice(0, 5000).map((value, index) => (
50+
<option value={value} key={`${column.id}-option-${index}`} />
4951
))}
5052
</datalist>
5153
<DynamicDebouncedInput
@@ -60,7 +62,7 @@ export function TextFilter(headerProps: DatabaseHeaderProps) {
6062
}}
6163
/>
6264
<div className="h-1" />
63-
</>
65+
</div>
6466
);
6567
}
6668

@@ -72,7 +74,7 @@ export function NumberFilter(headerProps: DatabaseHeaderProps) {
7274
const maxValue = (column.getFilterValue() as [number, number])?.[1] ?? "";
7375
return (
7476
<>
75-
<div className="flex space-x-2">
77+
<div className="flex space-x-2" key={`${column.id}-number-filter`}>
7678
<DynamicDebouncedInput
7779
type="number"
7880
min={min}
@@ -93,8 +95,8 @@ export function NumberFilter(headerProps: DatabaseHeaderProps) {
9395
/>
9496
<DynamicDebouncedInput
9597
type="number"
96-
min={min}
97-
max={max}
98+
min={Number.isNaN(min) ? undefined : min}
99+
max={Number.isNaN(max) ? undefined : max}
98100
value={maxValue}
99101
onChange={(value) =>
100102
column.setFilterValue((old: [number, number]) => [old?.[0], value])
@@ -126,6 +128,7 @@ export function DateRangeFilter(headerProps: DatabaseHeaderProps) {
126128
style={{
127129
display: "flex",
128130
}}
131+
key={`${column.id}-date-filter`}
129132
>
130133
<div
131134
className="w-24 border shadow rounded"
@@ -173,3 +176,35 @@ export function DateRangeFilter(headerProps: DatabaseHeaderProps) {
173176
</>
174177
);
175178
}
179+
180+
export function BooleanFilter(headerProps: DatabaseHeaderProps) {
181+
const { column } = headerProps;
182+
const [value, setValue] = useState<number | string>("All");
183+
184+
const handlerOnChange: ChangeEventHandler<HTMLSelectElement> = (event) => {
185+
const newValue =
186+
event.target.value !== "All" ? Number(event.target.value) : null;
187+
column.setFilterValue(newValue);
188+
setValue(newValue);
189+
};
190+
return (
191+
<>
192+
<select
193+
typeof="select"
194+
value={value}
195+
onChange={handlerOnChange}
196+
className="w-36 border shadow rounded"
197+
style={{
198+
width: "100%",
199+
background: StyleVariables.BACKGROUND_MODIFIER_FORM_FIELD,
200+
}}
201+
key={`${column.id}-select-filter`}
202+
>
203+
<option value={"All"}>All</option>
204+
<option value={1}>True</option>
205+
<option value={0}>False</option>
206+
</select>
207+
<div className="h-1" />
208+
</>
209+
);
210+
}

src/components/reducers/TableFilterFlavours.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,10 +104,21 @@ const CalendarGroupFilterFn: FilterFn<RowDataType> = (row: Row<RowDataType>, col
104104
return calendarValue >= dateRange[0] && calendarValue <= dateRange[1];
105105
}
106106

107+
108+
const BooleanGroupFilterFn: FilterFn<RowDataType> = (row: Row<RowDataType>, columnId: string, selectedOption: number) => {
109+
const value = row.getValue<Literal>(columnId);
110+
if (selectedOption === undefined || selectedOption === null) {
111+
return true;
112+
}
113+
114+
return Boolean(value) === Boolean(selectedOption);
115+
116+
}
107117
const customSortingfns: FilterFns = {
108118
markdown: MarkdownFilterFn,
109119
linksGroup: LinksGroupFilterFn,
110120
calendar: CalendarGroupFilterFn,
121+
boolean: BooleanGroupFilterFn,
111122
};
112123

113124
export default customSortingfns;

src/helpers/Constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,7 @@ export const StyleVariables = Object.freeze({
244244
BACKGROUND_PRIMARY: 'var(--background-primary)',
245245
BACKGROUND_SECONDARY: 'var(--background-secondary)',
246246
BACKGROUND_DIVIDER: 'var(--background-divider)',
247+
BACKGROUND_MODIFIER_FORM_FIELD: "var(--background-modifier-form-field)",
247248
TEXT_FAINT: 'var(--text-faint)',
248249
TEXT_MUTED: 'var(--text-muted)',
249250
TEXT_NORMAL: 'var(--text-normal)',

src/helpers/TableFiltersHelper.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,9 @@ export function getFilterKeyInFunctionOfInputType(inputType: string): string {
108108
case InputType.METATADA_TIME:
109109
filterKey = 'calendar';
110110
break;
111+
case InputType.CHECKBOX:
112+
filterKey = 'boolean';
113+
break;
111114
default:
112115
filterKey = 'auto';
113116
}

0 commit comments

Comments
 (0)