Skip to content

Commit 8118974

Browse files
authored
Merge pull request #230 from makeplane/stage-release
Production release v0.2.1-dev
2 parents 2e9b77c + 6966666 commit 8118974

File tree

44 files changed

+926
-771
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+926
-771
lines changed

apps/app/components/command-palette/index.tsx

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -102,50 +102,54 @@ const CommandPalette: React.FC = () => {
102102
!(e.target instanceof HTMLInputElement) &&
103103
!(e.target as Element).classList?.contains("remirror-editor")
104104
) {
105-
if ((e.ctrlKey || e.metaKey) && e.key === "k") {
105+
if ((e.ctrlKey || e.metaKey) && (e.key === "k" || e.key === "K")) {
106106
e.preventDefault();
107107
setIsPaletteOpen(true);
108-
} else if (e.ctrlKey && e.key === "c") {
109-
console.log("Text copied");
110-
} else if (e.key === "c") {
108+
} else if (e.ctrlKey && (e.key === "c" || e.key === "C")) {
109+
if (e.altKey) {
110+
e.preventDefault();
111+
if (!router.query.issueId) return;
112+
113+
const url = new URL(window.location.href);
114+
console.log(url);
115+
copyTextToClipboard(url.href)
116+
.then(() => {
117+
setToastAlert({
118+
type: "success",
119+
title: "Copied to clipboard",
120+
});
121+
})
122+
.catch(() => {
123+
setToastAlert({
124+
type: "error",
125+
title: "Some error occurred",
126+
});
127+
});
128+
console.log("URL Copied");
129+
} else {
130+
console.log("Text copied");
131+
}
132+
} else if (e.key === "c" || e.key === "C") {
111133
e.preventDefault();
112134
setIsIssueModalOpen(true);
113-
} else if (e.key === "p") {
135+
} else if (e.key === "p" || e.key === "P") {
114136
e.preventDefault();
115137
setIsProjectModalOpen(true);
116-
} else if ((e.ctrlKey || e.metaKey) && e.key === "b") {
138+
} else if ((e.ctrlKey || e.metaKey) && (e.key === "b" || e.key === "B")) {
117139
e.preventDefault();
118140
toggleCollapsed();
119-
} else if (e.key === "h") {
141+
} else if (e.key === "h" || e.key === "H") {
120142
e.preventDefault();
121143
setIsShortcutsModalOpen(true);
122-
} else if (e.key === "q") {
144+
} else if (e.key === "q" || e.key === "Q") {
123145
e.preventDefault();
124146
setIsCreateCycleModalOpen(true);
125-
} else if (e.key === "m") {
147+
} else if (e.key === "m" || e.key === "M") {
126148
e.preventDefault();
127149
setIsCreateModuleModalOpen(true);
128150
} else if (e.key === "Delete") {
129151
e.preventDefault();
130152
setIsBulkDeleteIssuesModalOpen(true);
131-
} else if ((e.ctrlKey || e.metaKey) && e.altKey && e.key === "c") {
132-
e.preventDefault();
133-
if (!router.query.issueId) return;
134-
135-
const url = new URL(window.location.href);
136-
copyTextToClipboard(url.href)
137-
.then(() => {
138-
setToastAlert({
139-
type: "success",
140-
title: "Copied to clipboard",
141-
});
142-
})
143-
.catch(() => {
144-
setToastAlert({
145-
type: "error",
146-
title: "Some error occurred",
147-
});
148-
});
149153
}
150154
}
151155
},

apps/app/components/command-palette/shortcuts.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ const shortcuts = [
1515
{
1616
title: "Navigation",
1717
shortcuts: [
18-
{ keys: "ctrl,cmd,k", description: "To open navigator" },
18+
{ keys: "Ctrl,Cmd,K", description: "To open navigator" },
1919
{ keys: "↑", description: "Move up" },
2020
{ keys: "↓", description: "Move down" },
2121
{ keys: "←", description: "Move left" },
@@ -27,14 +27,14 @@ const shortcuts = [
2727
{
2828
title: "Common",
2929
shortcuts: [
30-
{ keys: "p", description: "To create project" },
31-
{ keys: "c", description: "To create issue" },
32-
{ keys: "q", description: "To create cycle" },
33-
{ keys: "m", description: "To create module" },
30+
{ keys: "P", description: "To create project" },
31+
{ keys: "C", description: "To create issue" },
32+
{ keys: "Q", description: "To create cycle" },
33+
{ keys: "M", description: "To create module" },
3434
{ keys: "Delete", description: "To bulk delete issues" },
35-
{ keys: "h", description: "To open shortcuts guide" },
35+
{ keys: "H", description: "To open shortcuts guide" },
3636
{
37-
keys: "ctrl,cmd,alt,c",
37+
keys: "Ctrl,Cmd,Alt,C",
3838
description: "To copy issue url when on issue detail page.",
3939
},
4040
],

apps/app/components/common/board-view/single-issue.tsx

Lines changed: 68 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,16 @@ import { AssigneesList, CustomDatePicker } from "components/ui";
2525
import { renderShortNumericDateFormat, findHowManyDaysLeft } from "helpers/date-time.helper";
2626
import { addSpaceIfCamelCase } from "helpers/string.helper";
2727
// types
28-
import { IIssue, IUserLite, IWorkspaceMember, Properties, UserAuth } from "types";
28+
import {
29+
CycleIssueResponse,
30+
IIssue,
31+
IssueResponse,
32+
IUserLite,
33+
IWorkspaceMember,
34+
ModuleIssueResponse,
35+
Properties,
36+
UserAuth,
37+
} from "types";
2938
// common
3039
import { PRIORITIES } from "constants/";
3140
import {
@@ -80,6 +89,60 @@ const SingleBoardIssue: React.FC<Props> = ({
8089
const partialUpdateIssue = (formData: Partial<IIssue>) => {
8190
if (!workspaceSlug || !projectId) return;
8291

92+
if (typeId) {
93+
mutate<CycleIssueResponse[]>(
94+
CYCLE_ISSUES(typeId ?? ""),
95+
(prevData) => {
96+
const updatedIssues = (prevData ?? []).map((p) => {
97+
if (p.issue_detail.id === issue.id) {
98+
return {
99+
...p,
100+
issue_detail: {
101+
...p.issue_detail,
102+
...formData,
103+
},
104+
};
105+
}
106+
return p;
107+
});
108+
return [...updatedIssues];
109+
},
110+
false
111+
);
112+
113+
mutate<ModuleIssueResponse[]>(
114+
MODULE_ISSUES(typeId ?? ""),
115+
(prevData) => {
116+
const updatedIssues = (prevData ?? []).map((p) => {
117+
if (p.issue_detail.id === issue.id) {
118+
return {
119+
...p,
120+
issue_detail: {
121+
...p.issue_detail,
122+
...formData,
123+
},
124+
};
125+
}
126+
return p;
127+
});
128+
return [...updatedIssues];
129+
},
130+
false
131+
);
132+
}
133+
134+
mutate<IssueResponse>(
135+
PROJECT_ISSUES_LIST(workspaceSlug as string, projectId as string),
136+
(prevData) => ({
137+
...(prevData as IssueResponse),
138+
results: (prevData?.results ?? []).map((p) => {
139+
if (p.id === issue.id) return { ...p, ...formData };
140+
return p;
141+
}),
142+
}),
143+
false
144+
);
145+
83146
issuesService
84147
.patchIssue(workspaceSlug as string, projectId as string, issue.id, formData)
85148
.then((res) => {
@@ -270,13 +333,11 @@ const SingleBoardIssue: React.FC<Props> = ({
270333
<CustomDatePicker
271334
placeholder="N/A"
272335
value={issue?.target_date}
273-
onChange={(val: Date) => {
336+
onChange={(val) =>
274337
partialUpdateIssue({
275-
target_date: val
276-
? `${val.getFullYear()}-${val.getMonth() + 1}-${val.getDate()}`
277-
: null,
278-
});
279-
}}
338+
target_date: val,
339+
})
340+
}
280341
className={issue?.target_date ? "w-[6.5rem]" : "w-[3rem] text-center"}
281342
/>
282343
{/* <DatePicker

apps/app/components/common/list-view/single-issue.tsx

Lines changed: 71 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,6 @@ import { useRouter } from "next/router";
55

66
import useSWR, { mutate } from "swr";
77

8-
// react-datepicker
9-
import DatePicker from "react-datepicker";
10-
import "react-datepicker/dist/react-datepicker.css";
118
// services
129
import issuesService from "services/issues.service";
1310
import workspaceService from "services/workspace.service";
@@ -18,13 +15,19 @@ import { Listbox, Transition } from "@headlessui/react";
1815
import { CustomMenu, CustomSelect, AssigneesList, Avatar, CustomDatePicker } from "components/ui";
1916
// components
2017
import ConfirmIssueDeletion from "components/project/issues/confirm-issue-deletion";
21-
// icons
22-
import { CalendarDaysIcon } from "@heroicons/react/24/outline";
2318
// helpers
2419
import { renderShortNumericDateFormat, findHowManyDaysLeft } from "helpers/date-time.helper";
2520
import { addSpaceIfCamelCase } from "helpers/string.helper";
2621
// types
27-
import { IIssue, IWorkspaceMember, Properties, UserAuth } from "types";
22+
import {
23+
CycleIssueResponse,
24+
IIssue,
25+
IssueResponse,
26+
IWorkspaceMember,
27+
ModuleIssueResponse,
28+
Properties,
29+
UserAuth,
30+
} from "types";
2831
// fetch-keys
2932
import {
3033
CYCLE_ISSUES,
@@ -76,6 +79,60 @@ const SingleListIssue: React.FC<Props> = ({
7679
const partialUpdateIssue = (formData: Partial<IIssue>) => {
7780
if (!workspaceSlug || !projectId) return;
7881

82+
if (typeId) {
83+
mutate<CycleIssueResponse[]>(
84+
CYCLE_ISSUES(typeId ?? ""),
85+
(prevData) => {
86+
const updatedIssues = (prevData ?? []).map((p) => {
87+
if (p.issue_detail.id === issue.id) {
88+
return {
89+
...p,
90+
issue_detail: {
91+
...p.issue_detail,
92+
...formData,
93+
},
94+
};
95+
}
96+
return p;
97+
});
98+
return [...updatedIssues];
99+
},
100+
false
101+
);
102+
103+
mutate<ModuleIssueResponse[]>(
104+
MODULE_ISSUES(typeId ?? ""),
105+
(prevData) => {
106+
const updatedIssues = (prevData ?? []).map((p) => {
107+
if (p.issue_detail.id === issue.id) {
108+
return {
109+
...p,
110+
issue_detail: {
111+
...p.issue_detail,
112+
...formData,
113+
},
114+
};
115+
}
116+
return p;
117+
});
118+
return [...updatedIssues];
119+
},
120+
false
121+
);
122+
}
123+
124+
mutate<IssueResponse>(
125+
PROJECT_ISSUES_LIST(workspaceSlug as string, projectId as string),
126+
(prevData) => ({
127+
...(prevData as IssueResponse),
128+
results: (prevData?.results ?? []).map((p) => {
129+
if (p.id === issue.id) return { ...p, ...formData };
130+
return p;
131+
}),
132+
}),
133+
false
134+
);
135+
79136
issuesService
80137
.patchIssue(workspaceSlug as string, projectId as string, issue.id, formData)
81138
.then((res) => {
@@ -255,44 +312,24 @@ const SingleListIssue: React.FC<Props> = ({
255312
<CustomDatePicker
256313
placeholder="N/A"
257314
value={issue?.target_date}
258-
onChange={(val: Date) => {
315+
onChange={(val) =>
259316
partialUpdateIssue({
260-
target_date: val
261-
? `${val.getFullYear()}-${val.getMonth() + 1}-${val.getDate()}`
262-
: null,
263-
});
264-
}}
317+
target_date: val,
318+
})
319+
}
265320
className={issue?.target_date ? "w-[6.5rem]" : "w-[3rem] text-center"}
266321
/>
267-
{/* <DatePicker
268-
placeholderText="N/A"
269-
value={
270-
issue?.target_date ? `${renderShortNumericDateFormat(issue.target_date)}` : "N/A"
271-
}
272-
selected={issue?.target_date ? new Date(issue.target_date) : null}
273-
onChange={(val: Date) => {
274-
partialUpdateIssue({
275-
target_date: val
276-
? `${val.getFullYear()}-${val.getMonth() + 1}-${val.getDate()}`
277-
: null,
278-
});
279-
}}
280-
dateFormat="dd-MM-yyyy"
281-
className={`cursor-pointer rounded-md border px-2 py-[3px] text-xs shadow-sm duration-300 hover:bg-gray-100 focus:border-indigo-500 focus:outline-none focus:ring-1 focus:ring-indigo-500 ${
282-
issue?.target_date ? "w-[4.5rem]" : "w-[3rem] text-center"
283-
}`}
284-
isClearable
285-
/> */}
286322
<div className="absolute bottom-full right-0 z-10 mb-2 hidden whitespace-nowrap rounded-md bg-white p-2 shadow-md group-hover:block">
287323
<h5 className="mb-1 font-medium text-gray-900">Due date</h5>
288324
<div>{renderShortNumericDateFormat(issue.target_date ?? "")}</div>
289325
<div>
290-
{issue.target_date &&
291-
(issue.target_date < new Date().toISOString()
326+
{issue.target_date
327+
? issue.target_date < new Date().toISOString()
292328
? `Due date has passed by ${findHowManyDaysLeft(issue.target_date)} days`
293329
: findHowManyDaysLeft(issue.target_date) <= 3
294330
? `Due date is in ${findHowManyDaysLeft(issue.target_date)} days`
295-
: "Due date")}
331+
: "Due date"
332+
: "N/A"}
296333
</div>
297334
</div>
298335
</div>

0 commit comments

Comments
 (0)