Skip to content

Commit dc8d51a

Browse files
committed
filter
1 parent f73ff12 commit dc8d51a

14 files changed

+171
-58
lines changed

__mocks__/obsidian.ts

+2
Original file line numberDiff line numberDiff line change
@@ -86,3 +86,5 @@ class HTMLElement {
8686
}
8787
}
8888

89+
class HTMLInputElement extends HTMLElement{}
90+

jest/filterCol.test.ts

-14
Original file line numberDiff line numberDiff line change
@@ -149,20 +149,6 @@ describe("FilterAlgo", () => {
149149
});
150150

151151

152-
it("MultipleFilter", async () => {
153-
column = new BoolColumn("testProperty", { vault: mockVault });
154-
column.setFilter(["true", ""]);
155-
column.setIndex(4);
156-
column.filterRows(rows);
157-
158-
let column2 = new IntColumn("testProperty2", { vault: mockVault });
159-
column2.setFilter([42]);
160-
column2.setIndex(5);
161-
column2.filterRows(rows);
162-
163-
});
164-
165-
166152

167153
function createMockTableRows() {
168154
const data = [
+124
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
import DateTimeColumn from "../src/DateTimeColumn";
2+
import TextColumn from "../src/TextColumn";
3+
import IntColumn from "../src/IntColumn";
4+
import BoolColumn from "../src/BoolColumn";
5+
import { TFile, Vault } from "obsidian";
6+
import fs from "fs";
7+
import yaml from "js-yaml";
8+
9+
describe("GetUniq", () => {
10+
let column;
11+
let mockVault;
12+
let rows;
13+
14+
beforeEach(() => {
15+
mockVault = new Vault();
16+
rows = createMockTableRows();
17+
});
18+
19+
it("getUnqDisplayDate", async () => {
20+
column = new DateTimeColumn("testProperty", { vault: mockVault });
21+
column.setIndex(3); // Index of the date column
22+
column.setFilter(["2023-11-01", "2024-01-03"]); // Range for filtering
23+
let result = column.getUniqDisplayValuesFiltered(rows);
24+
expect(result.length).toBe(3);
25+
column.setFilter([]); // Range for filtering
26+
rows = createMockTableRows();
27+
result = column.getUniqDisplayValuesFiltered(rows);
28+
expect(result.length).toBe(3);
29+
});
30+
31+
/* issue with mock
32+
it("getUnqDisplayText", async () => {
33+
column = new TextColumn("testProperty", { vault: mockVault });
34+
column.setIndex(7);
35+
column.setFilter(["ampl"]);
36+
let result = column.getUniqDisplayValuesFiltered(rows);
37+
expect(result.length).toBe(1);
38+
column.setFilter([]);
39+
rows = createMockTableRows();
40+
result = column.getUniqDisplayValuesFiltered(rows);
41+
expect(result.length).toBe(10);
42+
});
43+
*/
44+
45+
it("getUnqDisplayInt", async () => {
46+
column = new IntColumn("testProperty", { vault: mockVault });
47+
column.setIndex(5); // Index of the date column
48+
column.setFilter(["29"]); // Range for filtering
49+
let result = column.getUniqDisplayValuesFiltered(rows);
50+
expect(result.length).toBe(2);
51+
column.setFilter([]); // Range for filtering
52+
rows = createMockTableRows();
53+
result = column.getUniqDisplayValuesFiltered(rows);
54+
expect(result.length).toBe(6);
55+
});
56+
57+
it("getUnqDisplayBool", async () => {
58+
column = new BoolColumn("testProperty", { vault: mockVault });
59+
column.setIndex(4); // Index of the date column
60+
column.setFilter(["true"]); // Range for filtering
61+
let result = column.getUniqDisplayValuesFiltered(rows);
62+
expect(result.length).toBe(3);
63+
column.setFilter(["true", ""]); // Range for filtering
64+
result = column.getUniqDisplayValuesFiltered(rows);
65+
expect(result.length).toBe(3);
66+
column.setFilter([]); // Range for filtering
67+
rows = createMockTableRows();
68+
result = column.getUniqDisplayValuesFiltered(rows);
69+
expect(result.length).toBe(3);
70+
});
71+
72+
function createMockTableRows() {
73+
const data = [
74+
["1", "flskdfj/lfksdjfslf/", "f1.md", "2023-10-01T00:00:00", true, 56, ["fdkj", "aaa", "fds"], "ffff", 34],
75+
["2", "example/dir/", "file2.md", "2023-11-22T00:00:00", false, null, null, "sampleString", null],
76+
["3", "sample/dir/", "file3.md", "2023-12-01T00:00:00", null, 42, ["item1", "item2"], null, 18],
77+
["4", "another/path/", "file_four.md", null, null, null, ["one"], "text", 49],
78+
["5", "just/path/", "fileV.md", null, true, null, ["another", "list"], "word", null],
79+
["6", "dirName/", "lastFile.md", "2023-12-13T00:00:00", true, 29, null, null, 10],
80+
["7", "test/dir7/", "file7.md", null, null, 77, ["alpha", "beta"], "testString", 23],
81+
["8", "path8/", "theFile8.md", null, false, null, ["lambda"], "anotherString", null],
82+
["9", "directory/nine/", "file_9.md", "2024-02-21T00:00:00", true, null, ["foo", "bar"], "random", 15],
83+
["10", "sampleDir10/", "file10.md", "2024-03-05T00:00:00", false, 47, null, "lastString", 38]
84+
];
85+
86+
return data.map(([id, dir, nomdefichier, datet, bool1, num1, list1, txt1, int2]) => {
87+
const createCellS = (textContent) => {
88+
const cell = document.createElement("td");
89+
cell.textContent = textContent;
90+
return cell;
91+
};
92+
const createCellD = (dt) => {
93+
const cell = document.createElement("td");
94+
const input = document.createElement("input");
95+
cell.appendChild(input);
96+
input.value = dt;
97+
return cell;
98+
};
99+
100+
const createCellB = (bl) => {
101+
const cell = document.createElement("td");
102+
const input = document.createElement("input");
103+
input.type = "checkbox";
104+
input.checked = bl;
105+
cell.appendChild(input);
106+
return cell;
107+
};
108+
109+
const rows = document.createElement("div");
110+
rows.style.display = "";
111+
rows.appendChild(createCellS(id));
112+
rows.appendChild(createCellS(dir));
113+
rows.appendChild(createCellS(nomdefichier));
114+
rows.appendChild(createCellD(datet));
115+
rows.appendChild(createCellB(bool1));
116+
rows.appendChild(createCellD(num1));
117+
rows.appendChild(createCellS(list1));
118+
rows.appendChild(createCellS(txt1));
119+
rows.appendChild(createCellS(int2));
120+
121+
return rows;
122+
});
123+
}
124+
});

src/BasedTextColumn.ts

+12-4
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,29 @@ export default abstract class BasedTextColumn extends Column {
1010
abstract fillCell(cell: HTMLElement, file: any, prop: any, value: any): void;
1111

1212
public getUniqDisplayValuesBasedOnSelector(rows: HTMLElement[], sQuerry: string): any[] {
13+
console.log("getUniq");
1314
let values: (string | null)[] = [];
1415
let cells = this.extractCells(rows);
1516
cells.forEach((cell) => {
1617
let input = cell.querySelector(sQuerry);
1718
if (input) {
18-
if (input instanceof HTMLInputElement && input.value.trim() !== "") {
19-
values.push(input.value.trim());
20-
} else if (input instanceof HTMLSelectElement && input.value.trim() !== "") {
19+
if (
20+
(input instanceof HTMLInputElement || input instanceof HTMLSelectElement) &&
21+
input.value.trim() !== ""
22+
) {
2123
values.push(input.value.trim());
24+
console.log("dd", input.value);
2225
} else if (input.textContent?.trim() !== "") {
2326
values.push(input.textContent?.trim() || "");
27+
console.log("=>", input.textContent);
28+
} else {
29+
values.push("");
2430
}
31+
} else {
32+
values.push("");
2533
}
2634
});
27-
values.push("");
35+
// values.push("");
2836
return [...new Set(values)];
2937
}
3038

src/BoolColumn.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ export default class BoolColumn extends Column {
4747
});
4848
}
4949

50-
public getUniqDisplayValues(rows: HTMLElement[]) {return [true,false, ""]}
50+
public getUniqDisplayValuesFiltered(rows: HTMLElement[]) {return [true,false, ""]}
5151

5252
public fillCell(cell: HTMLElement, file: TFile, prop: string, value: Object | null): void {
5353
cell.empty();

src/Column.ts

+6-22
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ export interface IColumn {
3535
getFilter(): string[];
3636

3737
filterRows(rows: HTMLElement[]): void;
38-
getUniqDisplayValues(rows: HTMLElement[]): any[];
38+
getUniqDisplayValuesFiltered(rows: HTMLElement[]): any[];
3939

4040
updateYamlProperty(filePath: string, prop: string, value: any, actiontype: string): Promise<void>;
4141

@@ -63,21 +63,18 @@ export default abstract class Column implements IColumn {
6363

6464
public extractCells(rows: HTMLElement[]): HTMLElement[] {
6565
let values: HTMLElement[] = [];
66-
rows.forEach((row) => {
66+
rows.filter(r => r.style.display == "").forEach((row) => {
6767
let cells = row.querySelectorAll("td");
6868
let cell = cells[this.getIndex()]; // Récupère la cellule à l'index spécifié
69-
if (this.getFilter().length != 0) {
70-
if (cell) values.push(cell);
71-
} else if (this.getFilter().length == 0 && row.style.display === "") {
72-
if (cell) values.push(cell);
73-
}
69+
if (cell) values.push(cell);
7470
});
7571
return values;
7672
}
7773

78-
abstract getUniqDisplayValues(rows: HTMLElement[]): any[];
74+
abstract getUniqDisplayValuesFiltered(rows: HTMLElement[]): any[];
7975
abstract fillCell(cell: HTMLElement, file: any, prop: any, value: any): void;
80-
76+
abstract filterRows(rows: HTMLElement[]):void;
77+
8178
public addCnt1() {
8279
this.cnt++;
8380
}
@@ -134,19 +131,6 @@ export default abstract class Column implements IColumn {
134131
return this.filter;
135132
}
136133

137-
public filterRows(rows: HTMLElement[]) {
138-
rows.forEach((row) => {
139-
row.style.display = "";
140-
const cells = row.querySelectorAll("td");
141-
const cell = cells[this.getIndex()];
142-
if (this.getFilter().length > 0) {
143-
if (!this.getFilter().includes(cell?.textContent?.trim() ?? "")) {
144-
row.style.display = "none";
145-
}
146-
}
147-
});
148-
}
149-
150134
async updateYamlProperty(
151135
filePath: string,
152136
prop: string,

src/DateTimeColumn.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ export default class DateTimeColumn extends Column {
5757
return this.dtype;
5858
}
5959

60-
public getUniqDisplayValues(rows: HTMLElement[]): any[] {
60+
public getUniqDisplayValuesFiltered(rows: HTMLElement[]): any[] {//renvoi minimal et maximal vu que le filtre est
6161
let minDate: Date | null = null;
6262
let maxDate: Date | null = null;
6363

src/DirColumn.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import BasedTextColumn from "./BasedTextColumn";
66

77
export default class DirColumn extends BasedTextColumn {
88

9-
public getUniqDisplayValues(rows: HTMLElement[]): any[] {
9+
public getUniqDisplayValuesFiltered(rows: HTMLElement[]): any[] {
1010
let a= super.getUniqDisplayValuesBasedOnSelector(rows, "div");
1111
return a.filter(b => b!="");
1212
}

src/FileColumn.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import BasedTextColumn from "./BasedTextColumn";
66

77
export default class FileColumn extends BasedTextColumn {
88

9-
public getUniqDisplayValues(rows: HTMLElement[]): any[] {
9+
public getUniqDisplayValuesFiltered(rows: HTMLElement[]): any[] {
1010
let a= super.getUniqDisplayValuesBasedOnSelector(rows, "a");
1111
return a.filter(b => b!="");
1212
}

src/IDColumn.ts

+2-4
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,9 @@ export default class IDColumn extends Column {
2020
IDColumn.counter +=0;
2121
}
2222

23-
public isFiltering():boolean {
24-
return false
25-
}
23+
public filterRows(rows: HTMLElement[]){} // never used as no filter on ID Column
2624

27-
getUniqDisplayValues(rows: HTMLElement[]): any[]{return []} //never used as no filter on ID column
25+
getUniqDisplayValuesFiltered(rows: HTMLElement[]): any[]{return []} //never used as no filter on ID column
2826

2927

3028
public static getStrType():string {

src/IntColumn.ts

+5-3
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,19 @@ export default class IntColumn extends Column {
2828
});
2929
}
3030

31-
public getUniqDisplayValues(rows: HTMLElement[]): any[] {
31+
public getUniqDisplayValuesFiltered(rows: HTMLElement[]): any[] {
3232
let values: (number|string)[] = [];
3333
let cells = this.extractCells(rows);
3434
cells.forEach((cell) => {
3535
let input = cell.querySelector("input");
3636
if (input && input.value != "") {
3737
let value = Number(input.value);
38-
if (!isNaN(value) && !values.includes(value)) values.push(value);
38+
if (isNaN(value)){return;}
39+
if (this.getFilter().length == 0) values.push(value);
40+
else if ( this.getFilter().map(a => Number(a)).includes(value)) values.push(value);
3941
}
42+
else{values.push("")};
4043
});
41-
values.push("");
4244
return [...new Set(values)];
4345
}
4446

src/ListColumn.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export default class ListColumn extends Column {
88
}
99

1010

11-
public getUniqDisplayValues(rows: HTMLElement[]) {
11+
public getUniqDisplayValuesFiltered(rows: HTMLElement[]) {
1212
let values: string[] = [];
1313
let cells = this.extractCells(rows);
1414
cells.forEach((cell) => {

src/TextColumn.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export default class TextColumn extends BasedTextColumn {
2020
return "Text";
2121
}
2222

23-
public getUniqDisplayValues(rows: HTMLElement[]): any[] {
23+
public getUniqDisplayValuesFiltered(rows: HTMLElement[]): any[] {
2424
return super.getUniqDisplayValuesBasedOnSelector(rows, "input");
2525
}
2626

src/propTable.ts

+14-5
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ export class GlobalPropertiesView extends ItemView {
109109
buttonGlobF.appendChild(icon2Container);
110110
buttonGlobF.addEventListener("click", async (event) => {
111111
event.preventDefault();
112+
console.log("clearAllFilter");
112113
this.clearAllFilters();
113114
});
114115
/******************************************************/
@@ -301,7 +302,8 @@ export class GlobalPropertiesView extends ItemView {
301302
buttonlist.appendChild(createMenuOption("filter", () => this.openFilterModal(col)));
302303
buttonlist.appendChild(
303304
createMenuOption("filter-x", () => {
304-
this.clearAllFilters();
305+
col.setFilter([]);
306+
this.reapplyAllFilters()
305307
})
306308
);
307309
}
@@ -330,17 +332,24 @@ export class GlobalPropertiesView extends ItemView {
330332

331333
//issue with multiple filter.
332334
private openFilterModal(col: IColumn) {
333-
let allowedValues = col.getUniqDisplayValues(this.getRows());
335+
let allowedValues = col.getUniqDisplayValuesFiltered(this.getRows());
334336

335337
const modal = new FilterModal(this.app, col, allowedValues, (selectedValues: any[]) => {
336-
this.clearAllFilters();
337338
col.setFilter(selectedValues);
338-
col.filterRows(this.getRows());
339+
this.reapplyAllFilters();
339340
this.updateFilterButtonStyles();
340341
});
341342
modal.open();
342343
}
343-
344+
private reapplyAllFilters(){
345+
let allRows = this.getRows();
346+
allRows.forEach(r => r.style.display = "");
347+
this.columnsMapping.forEach((col) => {
348+
col.filterRows(allRows);
349+
allRows = this.getRows().filter(r => r.style.display == "");
350+
this.updateFilterButtonStyles();
351+
});
352+
}
344353
private clearAllFilters() {
345354
this.columnsMapping.forEach((col) => {
346355
col.setFilter([]);

0 commit comments

Comments
 (0)