Skip to content

Commit 3502d04

Browse files
committed
Implement viewing of subsub*tasks
1 parent d789a22 commit 3502d04

6 files changed

Lines changed: 89 additions & 41 deletions

File tree

components/Jotting/subtask.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import useSWR from "swr";
2+
import { getTask } from "../../libs/Datastore/requests";
3+
import FetchError from "../FetchError/fetchError";
4+
import ProgressSpinner from "../ProgressSpinner/progressSpinner";
5+
import StyledCheckbox from "../StyledCheckbox/styledCheckbox";
6+
import Jotting from "./jotting";
7+
import JottingDetails from "./jottingDetails";
8+
import JottingOptionsBar from "./JottingOptionsBar";
9+
import SubtasksControl from "./subtasksControl";
10+
11+
export default function Subtask({ id }) {
12+
13+
const { data, error } = useSWR(id, id => getTask(id).makeRequest());
14+
15+
if (!data) return <ProgressSpinner /> ;
16+
if (error) return <FetchError itemName="task" />
17+
18+
console.debug("Subtask: ", data.data);
19+
20+
return (
21+
<Jotting jotType="task" {...data.data}>
22+
<JottingOptionsBar jotType="task" {...data.data}>
23+
<div>
24+
<StyledCheckbox
25+
id={data.data.id}
26+
prefix="task-completion-box-"
27+
completed={data.data.completed == 1}
28+
/>
29+
</div>
30+
</JottingOptionsBar>
31+
<JottingDetails jotType="task" jottingInfo={data.data} />
32+
<SubtasksControl task={data.data} />
33+
</Jotting>
34+
);
35+
}

components/Jotting/subtaskList.js

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,28 @@
1+
import { useRouter } from "next/router";
12
import useSWR from "swr";
23
import { deleteTask, getSubtasksRequest } from "../../libs/Datastore/requests";
4+
import Jotting from "../../libs/Jotting";
35
import FetchError from "../FetchError/fetchError";
46
import ProgressSpinner from "../ProgressSpinner/progressSpinner";
5-
import RemoveableListItem from "../RemoveableListItem/removeableListItem";
67
import StyledCheckbox from "../StyledCheckbox/styledCheckbox";
78
import jotting from "./jotting.module.css";
8-
import Link from "next/link";
9-
import Jotting from "../../libs/Jotting";
10-
import { useRouter } from "next/router";
119

12-
const fetcher = (id) => getSubtasksRequest(id).makeRequest(new AbortController());
10+
const fetcher = (id) => {
11+
console.log(getSubtasksRequest(id));
12+
return getSubtasksRequest(id.substring(2)).makeRequest(new AbortController());
13+
}
1314

1415
/**
1516
* @param { {id : number } } props The info about the task
1617
* @param {number} props.id The id of the parent task
1718
*/
1819
export default function SubtaskList({ id, subtasksState }) {
1920
const [subtasks, setSubtasks] = subtasksState;
20-
const { data, error } = useSWR(id, fetcher);
21+
const { data, error } = useSWR("ST" + id, fetcher);
2122
const router = useRouter();
2223

24+
if (!data) return <ProgressSpinner />;
2325
if (error) return <FetchError itemName="subtasks" />;
24-
if (!data)
25-
return <ProgressSpinner />;
2626

2727
const handleRemoveClick = (e) => {
2828
const itemId = e.target.parentElement.id.substring(2);
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { useState } from "react";
2+
import CreateJottingButton from "../CreateJottingButton/createJottingButton";
3+
import SubtaskList from "./subtaskList";
4+
import jotting from "./jotting.module.css";
5+
6+
export default function SubtasksControl({ task }) {
7+
const [subtasks, setSubtasks] = useState(null);
8+
return (
9+
<div className={jotting.subtasksControl}>
10+
<h3 className={jotting.subtaskHeading}>Subtasks</h3>
11+
<SubtaskList id={task.id} subtasksState={[subtasks, setSubtasks]} />
12+
<CreateJottingButton
13+
requestFunc="createSubtask"
14+
jotType="subtask"
15+
jots={subtasks}
16+
setJots={setSubtasks}
17+
requestArg1={task.id}
18+
/>
19+
</div>
20+
);
21+
}

components/Jotting/task.js

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import CreateJottingButton from "../CreateJottingButton/createJottingButton";
77
import { useState } from "react";
88
import StyledCheckbox from "../StyledCheckbox/styledCheckbox";
99
import ShareButton from "../ShareButton/shareButton";
10+
import SubtasksControl from "./subtasksControl";
1011

1112
export default function Task(task) {
1213
return (
@@ -26,20 +27,3 @@ export default function Task(task) {
2627
</Jotting>
2728
);
2829
}
29-
30-
function SubtasksControl({ task }) {
31-
const [subtasks, setSubtasks] = useState(null);
32-
return (
33-
<div className={jotting.subtasksControl}>
34-
<h3 className={jotting.subtaskHeading}>Subtasks</h3>
35-
<SubtaskList id={task.id} subtasksState={[subtasks, setSubtasks]} />
36-
<CreateJottingButton
37-
requestFunc="createSubtask"
38-
jotType="subtask"
39-
jots={subtasks}
40-
setJots={setSubtasks}
41-
requestArg1={task.id}
42-
/>
43-
</div>
44-
);
45-
}

components/JottingsControls/taskControl.js

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import { useRouter } from "next/router";
2-
import { useRef, useState } from "react";
2+
import { useEffect, useRef, useState } from "react";
33
import UrlService from "../../libs/UrlService";
44
import { useEscapeAlerter, useOutsideAlerter } from "../../libs/view";
5+
import Subtask from "../Jotting/subtask";
56
import Task from "../Jotting/task";
67
import ShareMenu from "../ShareMenu/shareMenu";
78
import jottingsControl from "./jottingsControl.module.css";
@@ -11,31 +12,39 @@ export default function TaskControl({ tasks }) {
1112
const urlService = new UrlService(router);
1213
const ref = useRef(null);
1314
const [showShareMenu, setShowShareMenu] = useState(false);
15+
const [urlInfo, setUrlInfo] = useState(urlService.getQueryJottingInfo("task") || null);
16+
17+
useEffect(() => {
18+
setUrlInfo(urlService.getQueryJottingInfo("task"));
19+
}, [router.asPath]);
1420

1521
useOutsideAlerter(ref, router);
1622

1723
// Escape the jot popup when Escape is pressed
1824
useEscapeAlerter(router);
1925

20-
urlService.setQueryToJottingInfo("task");
21-
22-
return tasks &&
23-
((router.query.type &&
24-
router.query.type == "task" &&
25-
router.query.id) ||
26-
urlService.queryHasJottingInfo("task")) ? (
26+
// Load notes and tasks before proceeding with showing any task or subtask
27+
return tasks && urlInfo != null ? (
2728
<article
2829
ref={ref}
2930
className={`${jottingsControl.fullJotting} ${jottingsControl.taskControl}`}
3031
>
32+
{console.log("Searching for task with given id...", urlInfo[1])}
3133
<div
3234
ref={showShareMenu ? null : ref}
3335
className={jottingsControl.jottingContent}
3436
>
35-
<Task
36-
showShareMenuState={[showShareMenu, setShowShareMenu]}
37-
{...tasks.find((item) => item.id == router.query.id)}
38-
/>
37+
{
38+
tasks.find(item => item.id == urlInfo[1]) ?
39+
<Task
40+
showShareMenuState={[showShareMenu, setShowShareMenu]}
41+
{...tasks.find((item) => item.id == urlInfo[1])}
42+
/> :
43+
<Subtask
44+
showShareMenuState={[showShareMenu, setShowShareMenu]}
45+
id={urlInfo[1]}
46+
/>
47+
}
3948
</div>
4049

4150
{showShareMenu && router.query.type == "task" ? (

libs/Datastore/requests.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,11 +66,10 @@ export async function getSharedJottings(abortController = null) {
6666
return response;
6767
}
6868

69-
export async function getTask(id, abortController = null) {
69+
export function getTask(id) {
7070
const queryString = `id=${id}`;
71-
return await BorumJotRequest.initialize(`task?${queryString}`)
72-
.authorize()
73-
.makeRequest(abortController);
71+
return BorumJotRequest.initialize(`task?${queryString}`)
72+
.authorize();
7473
}
7574

7675
/**

0 commit comments

Comments
 (0)