Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemathinc
GitHub Repository: sagemathinc/cocalc
Path: blob/master/src/packages/frontend/editors/task-editor/task.tsx
1691 views
1
/*
2
* This file is part of CoCalc: Copyright © 2020 Sagemath, Inc.
3
* License: MS-RSL – see LICENSE.md for details
4
*/
5
6
/*
7
A single task
8
*/
9
10
import { CSSProperties } from "react";
11
import { Grid, Row, Col } from "../../antd-bootstrap";
12
import { MinToggle } from "./min-toggle";
13
import { Description } from "./desc";
14
import { Changed } from "./changed";
15
import { DueDate } from "./due";
16
import { DragHandle } from "./drag";
17
import { DoneCheckbox } from "./done";
18
import { header_part } from "./desc-rendering";
19
import { TaskMap } from "./types";
20
import { TaskActions } from "./actions";
21
import { avatar_fontcolor } from "@cocalc/frontend/account/avatar/font-color";
22
import {
23
CODE_FOCUSED_COLOR,
24
FOCUSED_COLOR,
25
} from "@cocalc/frontend/editors/slate/util";
26
27
interface Props {
28
actions?: TaskActions;
29
project_id?: string;
30
path?: string;
31
task: TaskMap;
32
is_current: boolean;
33
editing_due_date: boolean;
34
editing_desc: boolean;
35
font_size: number;
36
sortable?: boolean;
37
read_only?: boolean;
38
selectedHashtags: Set<string>;
39
searchWords?: string[];
40
}
41
42
export default function Task({
43
actions,
44
path,
45
project_id,
46
task,
47
is_current,
48
editing_due_date,
49
editing_desc,
50
font_size,
51
sortable,
52
read_only,
53
selectedHashtags,
54
searchWords,
55
}: Props) {
56
const style = {
57
margin: "2px 5px",
58
paddingTop: "5px",
59
background: "white",
60
borderRadius: "8px",
61
} as CSSProperties;
62
if (editing_desc) {
63
style.border = `2px solid ${CODE_FOCUSED_COLOR}`;
64
style.borderLeft = `10px solid ${CODE_FOCUSED_COLOR}`;
65
} else if (is_current) {
66
style.border = `2px solid ${FOCUSED_COLOR}`;
67
style.borderLeft = `10px solid ${FOCUSED_COLOR}`;
68
} else {
69
style.border = "2px solid #ddd";
70
style.borderTop = "2px solid #eeejj";
71
style.borderLeft = `10px solid #ddd`;
72
}
73
if (task.get("deleted")) {
74
style.background = "#d9534f";
75
style.color = "#fff";
76
} else if (task.get("done")) {
77
style.color = "#888";
78
}
79
if (font_size != null) {
80
style.fontSize = `${font_size}px`;
81
}
82
83
const desc = task.get("desc") ?? "";
84
let min_toggle;
85
if (editing_desc) {
86
// while editing no min toggle
87
min_toggle = false;
88
} else {
89
// not editing, so maybe a min toggle...
90
min_toggle = header_part(desc) !== desc.trim();
91
}
92
93
const color = task.get("color");
94
if (color) {
95
style.background = color;
96
style.color = avatar_fontcolor(color);
97
}
98
99
return (
100
<Grid
101
style={style}
102
onClick={() => {
103
actions?.set_current_task(task.get("task_id"));
104
actions?.enable_key_handler();
105
}}
106
>
107
<Row>
108
<Col sm={1}>
109
{actions != null && (
110
<DragHandle sortable={sortable} id={task.get("task_id")} />
111
)}
112
{actions != null && (
113
<MinToggle
114
actions={actions}
115
task_id={task.get("task_id")}
116
hideBody={task.get("hideBody")}
117
has_body={min_toggle}
118
/>
119
)}
120
</Col>
121
<Col sm={8}>
122
<Description
123
actions={actions}
124
path={path}
125
project_id={project_id}
126
task_id={task.get("task_id")}
127
desc={task.get("desc") ?? ""}
128
color={color}
129
editing={editing_desc}
130
is_current={is_current}
131
isDeleted={task.get("deleted")}
132
font_size={font_size}
133
read_only={read_only}
134
selectedHashtags={selectedHashtags}
135
searchWords={searchWords}
136
hideBody={task.get("hideBody")}
137
/>
138
</Col>
139
<Col sm={1}>
140
{" "}
141
<span style={{ fontSize: "10pt", color: "#666" }}>
142
<DueDate
143
actions={actions}
144
read_only={read_only}
145
task_id={task.get("task_id")}
146
due_date={task.get("due_date")}
147
editing={editing_due_date}
148
is_done={!!task.get("done")}
149
/>
150
</span>
151
</Col>
152
<Col sm={1}>
153
<span style={{ fontSize: "10pt", color: "#666" }}>
154
<Changed last_edited={task.get("last_edited")} />
155
</span>
156
</Col>
157
<Col sm={1} style={{ textAlign: "center" }}>
158
<DoneCheckbox
159
actions={actions}
160
read_only={read_only}
161
done={!!task.get("done")}
162
task_id={task.get("task_id")}
163
/>
164
</Col>
165
</Row>
166
</Grid>
167
);
168
}
169
170