Skip to content

Commit 34ee0b8

Browse files
committed
update filter settings #40
1 parent 6d23ade commit 34ee0b8

10 files changed

Lines changed: 1223 additions & 372 deletions

File tree

.eslintignore

Lines changed: 0 additions & 3 deletions
This file was deleted.

.eslintrc

Lines changed: 0 additions & 23 deletions
This file was deleted.

package.json

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,16 @@
1919
"author": "LonoxX",
2020
"license": "MIT",
2121
"devDependencies": {
22-
"@types/node": "^25.2.2",
23-
"@typescript-eslint/eslint-plugin": "^8.54.0",
24-
"@typescript-eslint/parser": "^8.54.0",
22+
"@types/node": "^25.3.0",
2523
"builtin-modules": "^5.0.0",
2624
"esbuild": "^0.27.3",
27-
"eslint": "^9.39.2",
28-
"obsidian": "^1.11.4",
25+
"obsidian": "^1.12.2",
26+
"prettier": "^3.8.1",
2927
"tslib": "^2.8.1",
3028
"typescript": "^5.9.3"
3129
},
3230
"dependencies": {
3331
"date-fns": "^4.1.0",
34-
"octokit": "^5.0.5",
35-
"prettier": "^3.8.1"
32+
"octokit": "^5.0.5"
3633
}
3734
}

src/filter-manager.ts

Lines changed: 112 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,30 @@ import { RepositoryTracking } from "./types";
22
import { GitHubClient } from "./github-client";
33

44
export class FilterManager {
5-
constructor(
6-
private gitHubClient: GitHubClient,
7-
) {}
5+
constructor(private gitHubClient: GitHubClient) {}
86

97
public filterIssues(repo: RepositoryTracking, issues: any[]): any[] {
108
let filteredIssues = issues;
119

1210
// Apply label filtering
13-
if ((repo.enableLabelFilter ?? false) && (repo.labelFilters?.length ?? 0) > 0) {
14-
filteredIssues = this.applyLabelFilter(filteredIssues, repo.labelFilterMode ?? "include", repo.labelFilters ?? []);
11+
if (
12+
(repo.enableLabelFilter ?? false) &&
13+
(repo.labelFilters?.length ?? 0) > 0
14+
) {
15+
filteredIssues = this.applyLabelFilter(
16+
filteredIssues,
17+
repo.labelFilterMode ?? "include",
18+
repo.labelFilters ?? [],
19+
);
1520
}
1621

1722
// Apply assignee filtering
18-
if ((repo.enableAssigneeFilter ?? false)) {
19-
filteredIssues = this.applyAssigneeFilter(filteredIssues, repo.assigneeFilterMode ?? "assigned-to-me", repo.assigneeFilters ?? []);
23+
if (repo.enableAssigneeFilter ?? false) {
24+
filteredIssues = this.applyAssigneeFilter(
25+
filteredIssues,
26+
repo.assigneeFilterModes ?? ["assigned-to-me"],
27+
repo.assigneeFilters ?? [],
28+
);
2029
}
2130

2231
return filteredIssues;
@@ -29,95 +38,136 @@ export class FilterManager {
2938
let filteredPullRequests = pullRequests;
3039

3140
// Apply label filtering
32-
if ((repo.enablePrLabelFilter ?? false) && (repo.prLabelFilters?.length ?? 0) > 0) {
33-
filteredPullRequests = this.applyLabelFilter(filteredPullRequests, repo.prLabelFilterMode ?? "include", repo.prLabelFilters ?? []);
41+
if (
42+
(repo.enablePrLabelFilter ?? false) &&
43+
(repo.prLabelFilters?.length ?? 0) > 0
44+
) {
45+
filteredPullRequests = this.applyLabelFilter(
46+
filteredPullRequests,
47+
repo.prLabelFilterMode ?? "include",
48+
repo.prLabelFilters ?? [],
49+
);
3450
}
3551

3652
// Apply assignee filtering
37-
if ((repo.enablePrAssigneeFilter ?? false)) {
38-
filteredPullRequests = this.applyAssigneeFilter(filteredPullRequests, repo.prAssigneeFilterMode ?? "assigned-to-me", repo.prAssigneeFilters ?? []);
53+
if (repo.enablePrAssigneeFilter ?? false) {
54+
filteredPullRequests = this.applyAssigneeFilter(
55+
filteredPullRequests,
56+
repo.prAssigneeFilterModes ?? ["assigned-to-me"],
57+
repo.prAssigneeFilters ?? [],
58+
);
3959
}
4060

4161
// Apply reviewer filtering
42-
if ((repo.enablePrReviewerFilter ?? false)) {
43-
filteredPullRequests = this.applyReviewerFilter(filteredPullRequests, repo.prReviewerFilterMode ?? "review-requested-from-me", repo.prReviewerFilters ?? []);
62+
if (repo.enablePrReviewerFilter ?? false) {
63+
filteredPullRequests = this.applyReviewerFilter(
64+
filteredPullRequests,
65+
repo.prReviewerFilterModes ?? ["review-requested-from-me"],
66+
repo.prReviewerFilters ?? [],
67+
);
4468
}
4569

4670
return filteredPullRequests;
4771
}
4872

49-
private applyLabelFilter(items: any[], filterMode: "include" | "exclude", labelFilters: string[]): any[] {
73+
private applyLabelFilter(
74+
items: any[],
75+
filterMode: "include" | "exclude",
76+
labelFilters: string[],
77+
): any[] {
5078
return items.filter((item) => {
5179
if (!item.labels || !Array.isArray(item.labels)) {
5280
// If no labels, only include in "exclude" mode (since we're excluding specific labels)
5381
return filterMode === "exclude";
5482
}
5583

5684
const itemLabels = item.labels.map((label: any) =>
57-
typeof label === 'string' ? label : label.name
85+
typeof label === "string" ? label : label.name,
5886
);
5987

60-
const hasMatchingLabel = labelFilters.some(filterLabel =>
61-
itemLabels.includes(filterLabel)
88+
const hasMatchingLabel = labelFilters.some((filterLabel) =>
89+
itemLabels.includes(filterLabel),
6290
);
6391

6492
// Include mode: only include items that have at least one of the specified labels
6593
// Exclude mode: exclude items that have any of the specified labels
66-
return filterMode === "include" ? hasMatchingLabel : !hasMatchingLabel;
94+
return filterMode === "include"
95+
? hasMatchingLabel
96+
: !hasMatchingLabel;
6797
});
6898
}
6999

70-
private applyAssigneeFilter(items: any[], filterMode: "assigned-to-me" | "assigned-to-specific" | "unassigned" | "any-assigned", assigneeFilters: string[]): any[] {
100+
private applyAssigneeFilter(
101+
items: any[],
102+
filterModes: Array<
103+
| "assigned-to-me"
104+
| "assigned-to-specific"
105+
| "unassigned"
106+
| "any-assigned"
107+
>,
108+
assigneeFilters: string[],
109+
): any[] {
71110
return items.filter((item) => {
72111
const assignees = item.assignees || [];
73-
const assigneeUsernames = assignees.map((assignee: any) => assignee.login || assignee);
74-
75-
switch (filterMode) {
76-
case "assigned-to-me":
77-
// Get current user from the item's context or use a stored current user
78-
const currentUser = this.getCurrentUser();
79-
return assigneeUsernames.includes(currentUser);
80-
81-
case "assigned-to-specific":
82-
// Check if any of the specified assignees are assigned
83-
return assigneeFilters.some(filterUser => assigneeUsernames.includes(filterUser));
84-
85-
case "unassigned":
86-
// Only include items with no assignees
87-
return assigneeUsernames.length === 0;
88-
89-
case "any-assigned":
90-
// Only include items that have at least one assignee
91-
return assigneeUsernames.length > 0;
92-
93-
default:
94-
return true;
95-
}
112+
const assigneeUsernames = assignees.map(
113+
(assignee: any) => assignee.login || assignee,
114+
);
115+
const currentUser = this.getCurrentUser();
116+
117+
// Item passes if it matches ANY of the selected modes (OR logic)
118+
return filterModes.some((mode) => {
119+
switch (mode) {
120+
case "assigned-to-me":
121+
return assigneeUsernames.includes(currentUser);
122+
case "assigned-to-specific":
123+
return assigneeFilters.some((filterUser) =>
124+
assigneeUsernames.includes(filterUser),
125+
);
126+
case "unassigned":
127+
return assigneeUsernames.length === 0;
128+
case "any-assigned":
129+
return assigneeUsernames.length > 0;
130+
default:
131+
return false;
132+
}
133+
});
96134
});
97135
}
98136

99-
private applyReviewerFilter(items: any[], filterMode: "review-requested-from-me" | "review-requested-from-specific" | "no-review-requested" | "any-review-requested", reviewerFilters: string[]): any[] {
137+
private applyReviewerFilter(
138+
items: any[],
139+
filterModes: Array<
140+
| "review-requested-from-me"
141+
| "review-requested-from-specific"
142+
| "no-review-requested"
143+
| "any-review-requested"
144+
>,
145+
reviewerFilters: string[],
146+
): any[] {
100147
return items.filter((item) => {
101148
const reviewers = item.requested_reviewers || [];
102-
const reviewerUsernames = reviewers.map((reviewer: any) => reviewer.login || reviewer);
103-
104-
switch (filterMode) {
105-
case "review-requested-from-me":
106-
const currentUser = this.getCurrentUser();
107-
return reviewerUsernames.includes(currentUser);
108-
109-
case "review-requested-from-specific":
110-
return reviewerFilters.some(filterUser => reviewerUsernames.includes(filterUser));
111-
112-
case "no-review-requested":
113-
return reviewerUsernames.length === 0;
114-
115-
case "any-review-requested":
116-
return reviewerUsernames.length > 0;
117-
118-
default:
119-
return true;
120-
}
149+
const reviewerUsernames = reviewers.map(
150+
(reviewer: any) => reviewer.login || reviewer,
151+
);
152+
const currentUser = this.getCurrentUser();
153+
154+
// Item passes if it matches ANY of the selected modes (OR logic)
155+
return filterModes.some((mode) => {
156+
switch (mode) {
157+
case "review-requested-from-me":
158+
return reviewerUsernames.includes(currentUser);
159+
case "review-requested-from-specific":
160+
return reviewerFilters.some((filterUser) =>
161+
reviewerUsernames.includes(filterUser),
162+
);
163+
case "no-review-requested":
164+
return reviewerUsernames.length === 0;
165+
case "any-review-requested":
166+
return reviewerUsernames.length > 0;
167+
default:
168+
return false;
169+
}
170+
});
121171
});
122172
}
123173

0 commit comments

Comments
 (0)