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

Commit 8f1e775

Browse files
committed
better control of select write. Number filter improved
1 parent f8982cf commit 8f1e775

File tree

7 files changed

+79
-20
lines changed

7 files changed

+79
-20
lines changed

src/components/Table.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,6 @@ export function Table(tableData: TableDataType) {
180180
defaultColumn: {
181181
...defaultColumn,
182182
sortingFn: dbfolderColumnSortingFn(configInfo.getLocalSettings()),
183-
filterFn: globalDatabaseFilterFn(configInfo.getLocalSettings()),
184183
},
185184
getExpandedRowModel: getExpandedRowModel(),
186185
getCoreRowModel: getCoreRowModel(),

src/components/cellTypes/SelectCell.tsx

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -86,14 +86,16 @@ const SelectCell = (popperProps: CellComponentProps) => {
8686
selectRow,
8787
tableColumn,
8888
selectValue
89-
);
89+
)
90+
.toString()
91+
.replaceAll('"', "");
9092
// Update on disk & memory
9193
dataActions.updateCell(
9294
row.index,
9395
tableColumn,
94-
newCell,
96+
`"${newCell}"`,
9597
columnsInfo.getAllColumns(),
96-
{ ...configInfo.getLocalSettings(), frontmatter_quote_wrap: true },
98+
configInfo.getLocalSettings(),
9799
true
98100
);
99101
// Add new option to column options
@@ -151,10 +153,7 @@ const SelectCell = (popperProps: CellComponentProps) => {
151153
style={{ width: column.getSize() }}
152154
>
153155
{selectCell && (
154-
<Relationship
155-
value={selectCell.toString()}
156-
backgroundColor={getColor()}
157-
/>
156+
<Relationship value={selectCell} backgroundColor={getColor()} />
158157
)}
159158
</div>
160159
)}

src/components/reducers/ColumnFilters.tsx

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,10 @@ export function TextFilter(headerProps: DatabaseHeaderProps) {
4747
<div key={`${column.id}-text-filter`}>
4848
<datalist id={`${column.id}-list`} key={`${column.id}-datalist`}>
4949
{sortedUniqueValues.slice(0, 5000).map((value, index) => (
50-
<option value={value} key={`${column.id}-option-${index}`} />
50+
<option
51+
value={value?.toString()}
52+
key={`${column.id}-option-${index}`}
53+
/>
5154
))}
5255
</datalist>
5356
<DynamicDebouncedInput
@@ -68,10 +71,12 @@ export function TextFilter(headerProps: DatabaseHeaderProps) {
6871

6972
export function NumberFilter(headerProps: DatabaseHeaderProps) {
7073
const { column } = headerProps;
71-
const min = Number(column.getFacetedMinMaxValues()?.[0] ?? "");
72-
const max = Number(column.getFacetedMinMaxValues()?.[1] ?? "");
73-
const minValue = (column.getFilterValue() as [number, number])?.[0] ?? "";
74-
const maxValue = (column.getFilterValue() as [number, number])?.[1] ?? "";
74+
const min = Number(column.getFacetedMinMaxValues()?.[0] ?? undefined);
75+
const max = Number(column.getFacetedMinMaxValues()?.[1] ?? undefined);
76+
const minValue =
77+
(column.getFilterValue() as [number, number])?.[0] ?? undefined;
78+
const maxValue =
79+
(column.getFilterValue() as [number, number])?.[1] ?? undefined;
7580
return (
7681
<>
7782
<div className="flex space-x-2" key={`${column.id}-number-filter`}>
@@ -80,9 +85,12 @@ export function NumberFilter(headerProps: DatabaseHeaderProps) {
8085
min={min}
8186
max={max}
8287
value={minValue}
83-
onChange={(value) =>
84-
column.setFilterValue((old: [number, number]) => [value, old?.[1]])
85-
}
88+
onChange={(value) => {
89+
if (value === "" || value === null) {
90+
value = undefined;
91+
}
92+
column.setFilterValue((old: [number, number]) => [value, old?.[1]]);
93+
}}
8694
placeholder={`Min ${
8795
column.getFacetedMinMaxValues()?.[0]
8896
? `(${column.getFacetedMinMaxValues()?.[0]})`
@@ -98,9 +106,12 @@ export function NumberFilter(headerProps: DatabaseHeaderProps) {
98106
min={Number.isNaN(min) ? undefined : min}
99107
max={Number.isNaN(max) ? undefined : max}
100108
value={maxValue}
101-
onChange={(value) =>
102-
column.setFilterValue((old: [number, number]) => [old?.[0], value])
103-
}
109+
onChange={(value) => {
110+
if (value === "" || value === null) {
111+
value = undefined;
112+
}
113+
column.setFilterValue((old: [number, number]) => [old?.[0], value]);
114+
}}
104115
placeholder={`Max ${
105116
column.getFacetedMinMaxValues()?.[1]
106117
? `(${column.getFacetedMinMaxValues()?.[1]})`

src/components/reducers/TableFilterFlavours.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ const LinksGroupFilterFn: FilterFn<RowDataType> = (row: Row<RowDataType>, column
6161
if (value === undefined || wrapLiteral.type !== "array") {
6262
return false;
6363
}
64+
6465
return wrapLiteral.value
6566
.filter((l) => DataviewService.wrapLiteral(l).type === "link")
6667
.some((l: Link) => {
@@ -150,13 +151,52 @@ const TaskGroupFilterFn: FilterFn<RowDataType> = (row: Row<RowDataType>, columnI
150151
});
151152
}
152153

154+
const PlainTextGroupFilterFn: FilterFn<RowDataType> = (row: Row<RowDataType>, columnId: string, selectedOption: string) => {
155+
const value = row.getValue<Literal>(columnId);
156+
if (selectedOption === undefined || selectedOption === null) {
157+
return true;
158+
}
159+
if (value === undefined || value === null) {
160+
return false;
161+
}
162+
163+
const sanitizedSelectedOption = selectedOption.toLowerCase();
164+
const sanitized = value.toString().toLowerCase();
165+
return sanitized.includes(sanitizedSelectedOption) || searchRegex(sanitized, sanitizedSelectedOption);
166+
}
167+
168+
const NumberGroupFilterFn: FilterFn<RowDataType> = (row: Row<RowDataType>, columnId: string, numberRange: [number, number]) => {
169+
const value = row.getValue<Literal>(columnId);
170+
const minRange = numberRange[0];
171+
const maxRange = numberRange[1];
172+
if (minRange === undefined && maxRange === undefined) {
173+
return true;
174+
}
175+
176+
const sanitizedValue = Number(value);
177+
if (value === undefined || value === null || Number.isNaN(sanitizedValue)) {
178+
return false;
179+
}
180+
181+
if (minRange === undefined) {
182+
return sanitizedValue <= maxRange;
183+
}
184+
185+
if (maxRange === undefined) {
186+
return sanitizedValue >= minRange;
187+
}
188+
189+
return sanitizedValue >= minRange && sanitizedValue <= maxRange;
190+
}
153191
const customSortingfns: FilterFns = {
154192
markdown: MarkdownFilterFn,
155193
linksGroup: LinksGroupFilterFn,
156194
calendar: CalendarGroupFilterFn,
157195
boolean: BooleanGroupFilterFn,
158196
task: TaskGroupFilterFn,
159197
tags: TagsGroupFilterFn,
198+
plainText: PlainTextGroupFilterFn,
199+
number: NumberGroupFilterFn
160200
};
161201

162202
export default customSortingfns;

src/helpers/TableFiltersHelper.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,15 @@ export function getFilterKeyInFunctionOfInputType(inputType: string): string {
117117
case InputType.TASK:
118118
filterKey = 'task';
119119
break;
120+
case InputType.SELECT:
121+
case InputType.TEXT:
122+
case InputType.ROLLUP:
123+
case InputType.FORMULA:
124+
filterKey = 'plainText';
125+
break;
126+
case InputType.NUMBER:
127+
filterKey = 'number';
128+
break;
120129
default:
121130
filterKey = 'auto';
122131
}

src/services/ParseService.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,7 @@ class Parse {
319319
// Remove a possible already existing quote wrapper
320320
if (value.startsWith('"') && value.endsWith('"')) {
321321
value = value.substring(1, value.length - 1);
322+
return this.wrapWithQuotes(value);
322323
}
323324

324325
// Wrap in quotes if is configured to do so

src/stateManagement/data/handlers/UpdateCellHandlerAction.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export default class UpdateCellHandlerAction extends AbstractTableAction<DataSta
2323
let rowTFile = modifiedRow.__note__.getFile();
2424

2525
// Update the row on memory
26-
modifiedRow[column.key] = value;
26+
modifiedRow[column.key] = value.toString().replaceAll('"', "");
2727

2828
// Row Rules
2929
if (ddbbConfig.show_metadata_modified) {

0 commit comments

Comments
 (0)