Skip to content

Commit 6e3ae70

Browse files
hdJerryMegio
andauthored
chore: milestone works for only issues (#1951)
* chore: milestone works for only issues * chore: milestone working on pull requests tab * chore: some adjustments * fix: refactored get repo pull requests func * fix: added clear filter button for issues tab --------- Co-authored-by: Mattia Magi <mattia.magi91@gmail.com>
1 parent 1f88372 commit 6e3ae70

13 files changed

Lines changed: 274 additions & 92 deletions

File tree

solidjs-tailwind/src/components/AuthGuard/AuthGuard.spec.jsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@ import { beforeEach, afterEach, describe, expect, it, vi } from 'vitest';
55
import 'whatwg-fetch';
66
import AuthGuard from './AuthGuard';
77

8-
9-
window.scrollTo = vi.fn()
8+
window.scrollTo = vi.fn();
109

1110
vi.mock('../../auth', () => {
1211
return {

solidjs-tailwind/src/components/PRAndIssuesHeader/PRAndIssuesHeader.jsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import FilterDropdown from '../FilterDropDown/FilterDropdown';
44
import { SORT_OPTIONS } from '../../utils/constants';
55
import { createMemo } from 'solid-js';
66
import { usePrAndIssuesContext } from '../../contexts/PrAndIssuesContext';
7-
import { getSelectedMilestoneId } from './utils';
7+
import { getSelectedMilestoneNumber } from './utils';
88

99
const PRAndIssuesHeader = (props) => {
1010
const {
@@ -19,7 +19,7 @@ const PRAndIssuesHeader = (props) => {
1919
setSelectedMilestone,
2020
selectedMilestone,
2121
milestoneOpt,
22-
setMilestoneId,
22+
setMilestoneNumber,
2323
} = usePrAndIssuesContext();
2424

2525
const sortOptions = Object.values(SORT_OPTIONS);
@@ -35,7 +35,9 @@ const PRAndIssuesHeader = (props) => {
3535
setSelectedLabel(selectedLabel() !== value ? value : undefined);
3636
const selectMilestone = (value) => {
3737
setSelectedMilestone(selectedMilestone() !== value ? value : undefined);
38-
setMilestoneId(getSelectedMilestoneId(milestoneOpt(), selectedMilestone()));
38+
setMilestoneNumber(
39+
getSelectedMilestoneNumber(milestoneOpt(), selectedMilestone())
40+
);
3941
};
4042

4143
return (
Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
export const getSelectedMilestoneId = (milestoneOptions, selectedMilestone) =>
1+
export const getSelectedMilestoneNumber = (
2+
milestoneOptions,
23
selectedMilestone
3-
? milestoneOptions.filter((mo) => mo.title === selectedMilestone)[0].id
4+
) =>
5+
selectedMilestone
6+
? milestoneOptions
7+
.filter((mo) => mo.title === selectedMilestone)[0]
8+
.number.toString()
49
: undefined;

solidjs-tailwind/src/components/RepoIssues/RepoIssues.jsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ const RepoIssues = () => {
2222
setMilestoneOpt,
2323
clearSortAndFilter,
2424
selectedMilestone,
25-
milestoneId,
25+
milestoneNumber,
2626
} = usePrAndIssuesContext();
2727

2828
const fetchParameters = () => ({
@@ -32,7 +32,7 @@ const RepoIssues = () => {
3232
direction: parseSortParams(SORT_OPTIONS, sortBy(), 1),
3333
filterBy: {
3434
labels: selectedLabel() ? [selectedLabel()] : undefined,
35-
milestone: selectedMilestone() ? milestoneId() : undefined,
35+
milestoneNumber: selectedMilestone() ? milestoneNumber() : undefined,
3636
},
3737
before: query.before,
3838
after: query.after,
@@ -74,7 +74,9 @@ const RepoIssues = () => {
7474
return (
7575
<div class="md:py-12 max-w-screen-xl mx-auto">
7676
<Show when={!repo.loading} fallback={<PRAndIssueLoaderSkeleton />}>
77-
<Show when={selectedLabel() || sortBy() !== 'Newest'}>
77+
<Show
78+
when={selectedLabel() || sortBy() !== 'Newest' || milestoneNumber()}
79+
>
7880
<button
7981
type="button"
8082
class="flex items-center gap-2 text-sm my-4 ml-2 cursor-pointer"

solidjs-tailwind/src/components/RepoPullRequests/RepoPullRequests.jsx

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,17 @@ import { PRAndIssueLoaderSkeleton } from '../PRAndIssueLoaderSkeleton';
1212
const RepoPullRequests = () => {
1313
const params = useParams();
1414
const location = useLocation();
15-
const { tabActive, sortBy, selectedLabel, setLabelOpt, clearSortAndFilter } =
16-
usePrAndIssuesContext();
15+
const {
16+
tabActive,
17+
sortBy,
18+
milestoneOpt,
19+
labelOpt,
20+
selectedLabel,
21+
setLabelOpt,
22+
setMilestoneOpt,
23+
clearSortAndFilter,
24+
selectedMilestone,
25+
} = usePrAndIssuesContext();
1726

1827
const [data, setData] = createSignal([]);
1928
const [openCount, setOpenCount] = createSignal();
@@ -26,6 +35,7 @@ const RepoPullRequests = () => {
2635
orderBy: parseSortParams(SORT_OPTIONS, sortBy(), 0),
2736
direction: parseSortParams(SORT_OPTIONS, sortBy(), 1),
2837
labels: selectedLabel() ? [selectedLabel()] : undefined,
38+
milestone: selectedMilestone(),
2939
before:
3040
typeof location.query.before === 'string'
3141
? location.query.before
@@ -47,7 +57,8 @@ const RepoPullRequests = () => {
4757

4858
createEffect(() => {
4959
if (resp() && !resp.loading) {
50-
setLabelOpt(resp().labels);
60+
setLabelOpt(resp().labels || labelOpt());
61+
setMilestoneOpt(resp().milestones || milestoneOpt());
5162
setOpenCount(resp().openPullRequests.totalCount);
5263
setClosedCount(resp().closedPullRequests.totalCount);
5364
setPageInfo(
@@ -69,7 +80,9 @@ const RepoPullRequests = () => {
6980
<PRAndIssueLoaderSkeleton />
7081
) : (
7182
<>
72-
{(selectedLabel() || sortBy() !== 'Newest') && (
83+
{(selectedLabel() ||
84+
selectedMilestone() ||
85+
sortBy() !== 'Newest') && (
7386
<div
7487
class="flex items-center gap-2 text-sm my-4 ml-2 cursor-pointer"
7588
onClick={clearSortAndFilter}

solidjs-tailwind/src/contexts/PrAndIssuesContext.jsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,13 @@ export function PrAndIssuesProvider(props) {
1616
const [selectedMilestone, setSelectedMilestone] = createSignal(undefined);
1717
const [labelOpt, setLabelOpt] = createSignal([]);
1818
const [milestoneOpt, setMilestoneOpt] = createSignal([]);
19-
const [milestoneId, setMilestoneId] = createSignal(undefined);
19+
const [milestoneNumber, setMilestoneNumber] = createSignal(undefined);
2020

2121
const clearSortAndFilter = () => {
2222
setSortBy('Newest');
2323
setSelectedLabel(undefined);
2424
setSelectedMilestone(undefined);
25+
setMilestoneNumber(undefined);
2526
};
2627

2728
const PrAndIssuesParameters = {
@@ -39,8 +40,8 @@ export function PrAndIssuesProvider(props) {
3940
setSelectedMilestone,
4041
milestoneOpt,
4142
setMilestoneOpt,
42-
milestoneId,
43-
setMilestoneId,
43+
milestoneNumber,
44+
setMilestoneNumber,
4445
};
4546

4647
return (

solidjs-tailwind/src/services/api.js

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,23 @@
11
const FetchApi = async ({ url, query, variables, headersOptions }) => {
22
return await new Promise((resolve, reject) => {
3-
fetch(url, {
4-
method: 'POST',
3+
let fetchObj = {
54
headers: {
65
...headersOptions,
76
Accept: 'application/vnd.github+json',
87
'Content-Type': 'application/json',
98
},
10-
body: JSON.stringify({
11-
query,
12-
variables,
13-
}),
14-
})
9+
};
10+
if (query) {
11+
fetchObj = {
12+
...fetchObj,
13+
method: 'POST',
14+
body: JSON.stringify({
15+
query,
16+
variables,
17+
}),
18+
};
19+
}
20+
fetch(url, fetchObj)
1521
.then((res) => res.json())
1622
.then((result) => {
1723
resolve(result);

solidjs-tailwind/src/services/get-issues.js

Lines changed: 1 addition & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import FetchApi from './api';
22
import { useAuth } from '../auth';
33
import { ISSUES_QUERY } from './queries/issue-info';
44
import { GITHUB_GRAPHQL } from '../utils/constants';
5+
import { parseLabels, parseMilestones } from '../utils/parseFunctions';
56

67
function parseIssues(connection) {
78
if (!connection) {
@@ -58,43 +59,6 @@ function parseIssues(connection) {
5859
return { issues, totalCount, pageInfo };
5960
}
6061

61-
function parseMilestones(milestones) {
62-
const nodes = milestones?.nodes || [];
63-
return nodes.reduce((milestones, milestone) => {
64-
if (!milestone) {
65-
return milestones;
66-
}
67-
68-
return [
69-
...milestones,
70-
{
71-
id: milestone.id,
72-
closed: milestone.closed,
73-
title: milestone.title,
74-
number: milestone.number,
75-
description: milestone.description,
76-
},
77-
];
78-
}, []);
79-
}
80-
81-
function parseLabels(labels) {
82-
const nodes = labels?.nodes || [];
83-
return nodes.reduce((labels, label) => {
84-
if (!label) {
85-
return labels;
86-
}
87-
88-
return [
89-
...labels,
90-
{
91-
color: label.color,
92-
name: label.name,
93-
},
94-
];
95-
}, []);
96-
}
97-
9862
const getIssues = async ({
9963
owner,
10064
name,

solidjs-tailwind/src/services/get-repo-pull-requests.js

Lines changed: 61 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import { REPO_PULL_REQUESTS } from './queries/repo-pull-requests';
22
import { useAuth } from '../auth';
33
import FetchApi from './api';
4-
import { GITHUB_GRAPHQL } from '../utils/constants';
4+
import { GITHUB_GRAPHQL, SEARCH_PULLS } from '../utils/constants';
5+
import { parseLabels, parseMilestones } from '../utils/parseFunctions';
6+
import parseRestAPIPullRequests from '../utils/parseRestAPIPullRequest';
57

68
function parsePullRequests(connection) {
79
if (!connection) {
@@ -60,23 +62,6 @@ function parsePullRequests(connection) {
6062
return { pullRequests, totalCount, pageInfo };
6163
}
6264

63-
function parseLabels(labels) {
64-
const nodes = labels?.nodes || [];
65-
return nodes.reduce((labels, label) => {
66-
if (!label) {
67-
return labels;
68-
}
69-
70-
return [
71-
...labels,
72-
{
73-
color: label.color,
74-
name: label.name,
75-
},
76-
];
77-
}, []);
78-
}
79-
8065
/**
8166
*
8267
* @param {
@@ -97,6 +82,7 @@ const getRepoPullRequests = async ({
9782
orderBy,
9883
direction,
9984
labels,
85+
milestone,
10086
before,
10187
after,
10288
first,
@@ -121,22 +107,66 @@ const getRepoPullRequests = async ({
121107
authorization: `Bearer ${authStore.token}`,
122108
},
123109
};
124-
const resp = await FetchApi(data);
125110

126-
const openPullRequests = parsePullRequests(
127-
resp.data.repository?.openPullRequest
128-
);
129-
const closedPullRequests = parsePullRequests(
130-
resp.data.repository?.closedPullRequest
131-
);
111+
if (milestone) {
112+
//Using REST API for filters involving milestone as filter by milestone isn't supported on the Graphql
113+
const pulls_data = {
114+
owner,
115+
name,
116+
labels: labels?.[0] ?? undefined,
117+
sort: orderBy,
118+
direction,
119+
first,
120+
type: 'pull-request',
121+
milestone,
122+
};
123+
const restOpenPullRequests = await FetchApi({
124+
url: SEARCH_PULLS({
125+
...pulls_data,
126+
state: 'open',
127+
}),
128+
headersOptions: {
129+
authorization: `Bearer ${authStore.token}`,
130+
},
131+
});
132+
const restClosedPullRequests = await FetchApi({
133+
url: SEARCH_PULLS({
134+
...pulls_data,
135+
state: 'closed',
136+
}),
137+
headersOptions: {
138+
authorization: `Bearer ${authStore.token}`,
139+
},
140+
});
141+
142+
const openPullRequests = parseRestAPIPullRequests(restOpenPullRequests);
143+
const closedPullRequests = parseRestAPIPullRequests(restClosedPullRequests);
132144

133-
const labelMap = parseLabels(resp.data.repository?.labels);
145+
return {
146+
openPullRequests,
147+
closedPullRequests,
148+
};
149+
} else {
150+
const resp = await FetchApi(data);
151+
const openPullRequests = parsePullRequests(
152+
resp.data.repository?.openPullRequest
153+
);
134154

135-
return {
136-
openPullRequests,
137-
closedPullRequests,
138-
labels: labelMap,
139-
};
155+
const closedPullRequests = parsePullRequests(
156+
resp.data.repository?.closedPullRequest
157+
);
158+
159+
const milestones = parseMilestones(resp.data.repository?.milestones);
160+
161+
const labelMap = parseLabels(resp.data.repository?.labels);
162+
163+
return {
164+
openPullRequests,
165+
closedPullRequests,
166+
labels: labelMap,
167+
milestones,
168+
};
169+
}
140170
};
141171

142172
export default getRepoPullRequests;

solidjs-tailwind/src/services/queries/repo-pull-requests.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,22 @@
11
export const REPO_PULL_REQUESTS = `
22
query PullRequests($owner: String!, $name: String!, $first: Int, $last: Int, $before: String, $after: String, $labels: [String!], $orderBy: IssueOrderField!, $direction: OrderDirection!) {
33
repository(owner: $owner, name: $name) {
4+
milestones(first: 100, states: [OPEN]) {
5+
nodes {
6+
id
7+
closed
8+
description
9+
number
10+
title
11+
}
12+
pageInfo {
13+
startCursor
14+
endCursor
15+
hasNextPage
16+
hasPreviousPage
17+
}
18+
totalCount
19+
}
420
labels(first: 100) {
521
totalCount
622
nodes {

0 commit comments

Comments
 (0)