forked from Yadro/time-tracker
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProjectsScreen.tsx
More file actions
138 lines (127 loc) · 3.98 KB
/
ProjectsScreen.tsx
File metadata and controls
138 lines (127 loc) · 3.98 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
import React, { useState } from 'react';
import { Button, Layout, Space } from 'antd';
import { observer } from 'mobx-react';
import { Key } from 'rc-tree/lib/interface';
import { createUseStyles } from 'react-jss';
import { PlusOutlined } from '@ant-design/icons';
import TaskInput from './components/TaskInput';
import rootStore from '../../modules/RootStore';
import TreeList from './components/TreeList';
import TaskModel from '../../modules/tasks/models/TaskModel';
import ProjectModel from '../../modules/projects/models/ProjectModel';
import ProjectModal from './components/ProjectModals/ProjectModal';
import TaskNode from './components/TaskNode/TaskNode';
import DrawerTask from './components/DrawerTask/DrawerTask';
import ProjectNode from './components/ProjectNode/ProjectNode';
import EditProjectModal from './components/ProjectModals/EditProjectModal';
const { Sider } = Layout;
const { tasksStore, projectStore } = rootStore;
const TaskList = TreeList(
() => tasksStore.getTasks(projectStore.activeProject),
(list: TaskModel[]) => {
tasksStore.set(projectStore.activeProject, list);
},
{
checkable: true,
onExpand(keys: Key[]) {
tasksStore.markExpanded(projectStore.activeProject, keys as string[]);
},
getExpandedKeys() {
return tasksStore.getExpandedKeys(projectStore.activeProject);
},
onCheck(keys: any) {
tasksStore.checkTasks(projectStore.activeProject, keys as string[]);
},
getCheckedKeys() {
return tasksStore.getCheckedKeys(projectStore.activeProject);
},
titleRender(node: TaskModel) {
return <TaskNode task={node} />;
},
}
);
const ProjectList = TreeList(
() => projectStore.projects,
(list: ProjectModel[]) => {
projectStore.set(list);
},
{
selectable: false,
titleRender(project: ProjectModel) {
return (
<ProjectNode
project={project}
active={projectStore.activeProject === project.key}
/>
);
},
onExpand(keys: Key[]) {
projectStore.markExpanded(keys as string[]);
},
getExpandedKeys() {
return projectStore.getExpandedKeys();
},
}
);
export default observer(function Projects() {
const classes = useStyles();
const [showProjectModal, setShowProjectModal] = useState<boolean>(false);
const [drawerVisible, setDrawerVisible] = useState<boolean>(false);
const [selectedTask, setSelectedTask] = useState<TaskModel | undefined>();
function handleCreateProject() {
setShowProjectModal(true);
}
function handleSelectProject(items: Key[]) {
if (items.length > 0) {
projectStore.setActiveProject(items[0] as string);
}
}
function handleSelectTask(items: Key[]) {
if (items.length > 0) {
setDrawerVisible(true);
const task = tasksStore.getTaskByKey(items[0] as string);
setSelectedTask(task);
}
}
return (
<Layout>
<Sider width={250} className={classes.sider}>
<Layout style={{ padding: '12px' }}>
<Space direction="vertical">
<ProjectList onSelect={handleSelectProject} />
<Button onClick={handleCreateProject} icon={<PlusOutlined />}>
Project
</Button>
</Space>
</Layout>
</Sider>
<Layout style={{ padding: '24px' }} className={classes.tasks}>
<Space className="root" direction="vertical">
<TaskList onSelect={handleSelectTask} />
<TaskInput />
</Space>
</Layout>
{showProjectModal && (
<ProjectModal onClose={() => setShowProjectModal(false)} />
)}
<EditProjectModal
project={projectStore.editProject}
onClose={() => projectStore.setEditableProject(undefined)}
/>
<DrawerTask
task={selectedTask}
visible={drawerVisible}
onClose={() => setDrawerVisible(false)}
/>
</Layout>
);
});
const useStyles = createUseStyles({
sider: {
backgroundColor: '#f0f2f5',
borderRight: '1px solid #d9d9d9',
},
tasks: {
overflowY: 'auto',
},
});