Skip to content
This repository was archived by the owner on Dec 26, 2022. It is now read-only.

Commit f220166

Browse files
author
Dmitry Yadrikhinsky
committed
Choose color
1 parent 385046b commit f220166

File tree

11 files changed

+132
-18
lines changed

11 files changed

+132
-18
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,7 @@
233233
"yarn-deduplicate": "^3.1.0"
234234
},
235235
"dependencies": {
236+
"@ant-design/colors": "6.0.0",
236237
"@ant-design/icons": "4.6.2",
237238
"antd": "4.15.0",
238239
"date-fns": "2.20.1",

src/screens/projects/components/TaskControl/TaskControl.less renamed to src/components/TaskControl/TaskControl.less

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
@import '../../../../App.global';
1+
@import '../../App.global';
22

33
.task-control {
44
display: inline-flex;

src/screens/projects/components/TaskControl/TaskControl.tsx renamed to src/components/TaskControl/TaskControl.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ import { PauseOutlined } from '@ant-design/icons';
44

55
import './TaskControl.less';
66

7-
import rootStore from '../../../../services/RootStore';
8-
import { useTaskDuration } from '../../../../hooks/TaskHooks';
9-
import CircleButton from '../../../../components/CircleButton/CircleButton';
7+
import rootStore from '../../services/RootStore';
8+
import { useTaskDuration } from '../../hooks/TaskHooks';
9+
import CircleButton from '../CircleButton/CircleButton';
1010

1111
const { tasksStore, projectStore } = rootStore;
1212

src/models/ProjectModel.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,22 @@
11
import AbstractModel from '../base/AbstractModel';
22
import { ITreeItem } from '../types/ITreeItem';
33

4-
interface IProjectItem extends ITreeItem<IProjectItem> {
5-
children?: IProjectItem[];
4+
interface IJsonProjectItem extends ITreeItem<IJsonProjectItem> {
5+
color: string;
6+
}
7+
8+
interface IProjectModel extends ITreeItem<IProjectModel> {
9+
color: string;
610
}
711

812
export default class ProjectModel extends AbstractModel
9-
implements IProjectItem {
13+
implements IProjectModel {
1014
key: string = '';
1115
title: string = '';
16+
color: string = '';
1217
children?: ProjectModel[] = [];
1318

14-
constructor(props: IProjectItem) {
19+
constructor(props: IJsonProjectItem) {
1520
super();
1621
this.load(props);
1722
this.children = props.children?.map((json) => new ProjectModel(json)) || [];

src/screens/Main.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { observer } from 'mobx-react';
66
import './Main.less';
77

88
import Projects from './projects/Projects';
9-
import TaskControl from './projects/components/TaskControl/TaskControl';
9+
import TaskControl from '../components/TaskControl/TaskControl';
1010
import HeaderMenu from '../components/HeaderMenu/HeaderMenu';
1111
import HoursView from './hours/HoursView';
1212

src/screens/projects/components/ProjectModals/EditProjectModal.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { observer } from 'mobx-react';
55

66
import ProjectModel from '../../../../models/ProjectModel';
77
import rootStore from '../../../../services/RootStore';
8+
import ChooseColor from './components/ChooseColor';
89

910
const { projectStore } = rootStore;
1011

@@ -17,11 +18,13 @@ export default observer(function EditProjectModal({
1718
project,
1819
}: EditProjectModalProps) {
1920
const [title, setTitle] = useState<string>('');
21+
const [color, setColor] = useState<string>('');
2022

2123
useEffect(() => {
2224
const editProject = projectStore.editProject;
2325
if (editProject) {
2426
setTitle(editProject.title);
27+
setColor(editProject.color);
2528
}
2629
}, [projectStore.editProject]);
2730

@@ -31,7 +34,7 @@ export default observer(function EditProjectModal({
3134

3235
function handleOk() {
3336
if (project) {
34-
projectStore.setTitle(project, title);
37+
projectStore.setProjectProps(project, title, color);
3538
}
3639
onClose();
3740
}
@@ -65,6 +68,10 @@ export default observer(function EditProjectModal({
6568
value={title}
6669
onChange={(e) => setTitle(e.target.value)}
6770
/>
71+
<ChooseColor
72+
activeColor={color}
73+
onChoose={(color) => setColor(color)}
74+
/>
6875
<Button icon={<DeleteFilled />} onClick={handleDelete}>
6976
Delete
7077
</Button>

src/screens/projects/components/ProjectModals/ProjectModal.tsx

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import React, { useEffect, useState } from 'react';
22
import { observer } from 'mobx-react';
3-
import { Button, Input, Modal, Space } from 'antd';
3+
import { Input, Modal, Space } from 'antd';
44

55
import rootStore from '../../../../services/RootStore';
66
import ProjectModel from '../../../../models/ProjectModel';
7+
import ChooseColor from './components/ChooseColor';
78

89
const { projectStore } = rootStore;
910

@@ -17,6 +18,7 @@ export default observer(function ProjectModal({
1718
onClose,
1819
}: ProjectModalProps) {
1920
const [projectName, setProjectName] = useState<string>('');
21+
const [color, setColor] = useState<string | undefined>();
2022

2123
useEffect(() => {
2224
setProjectName(project?.title || '');
@@ -27,6 +29,7 @@ export default observer(function ProjectModal({
2729
new ProjectModel({
2830
key: String(Date.now()),
2931
title: projectName,
32+
color: color || '',
3033
})
3134
);
3235
onClose();
@@ -44,11 +47,17 @@ export default observer(function ProjectModal({
4447
onCancel={handleCancel}
4548
okText="Create"
4649
>
47-
<Input
48-
placeholder="Project name..."
49-
value={projectName}
50-
onChange={(e) => setProjectName(e.target.value)}
51-
/>
50+
<Space direction="vertical">
51+
<Input
52+
placeholder="Project name..."
53+
value={projectName}
54+
onChange={(e) => setProjectName(e.target.value)}
55+
/>
56+
<ChooseColor
57+
activeColor={color}
58+
onChoose={(color) => setColor(color)}
59+
/>
60+
</Space>
5261
</Modal>
5362
);
5463
});
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
.choose-color {
2+
display: flex;
3+
flex-direction: row;
4+
5+
.color {
6+
display: flex;
7+
justify-content: center;
8+
align-items: center;
9+
cursor: pointer;
10+
height: 20px;
11+
width: 20px;
12+
margin-right: 8px;
13+
border-radius: 3px;
14+
}
15+
16+
.color.active,
17+
.color:hover {
18+
transform: scale(1.1);
19+
}
20+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import React from 'react';
2+
import {
3+
red,
4+
volcano,
5+
blue,
6+
cyan,
7+
geekblue,
8+
gold,
9+
green,
10+
grey,
11+
lime,
12+
magenta,
13+
orange,
14+
purple,
15+
yellow,
16+
} from '@ant-design/colors';
17+
import { CheckOutlined } from '@ant-design/icons';
18+
19+
import './ChooseColor.less';
20+
import cn from '../../../../../helpers/ClassNameHelper';
21+
22+
const colors = [
23+
red,
24+
volcano,
25+
orange,
26+
gold,
27+
yellow,
28+
lime,
29+
green,
30+
cyan,
31+
blue,
32+
geekblue,
33+
purple,
34+
magenta,
35+
grey,
36+
].map((color) => color.primary);
37+
38+
interface ChooseColorProps {
39+
activeColor: string | undefined;
40+
onChoose: (color: string) => void;
41+
}
42+
43+
export default function ChooseColor({
44+
activeColor,
45+
onChoose,
46+
}: ChooseColorProps) {
47+
return (
48+
<div className="choose-color">
49+
{colors.map((color, index) => (
50+
<div
51+
key={index}
52+
className={cn('color', activeColor === color && 'active')}
53+
style={{ backgroundColor: color }}
54+
onClick={() => {
55+
if (color) {
56+
onChoose(color);
57+
}
58+
}}
59+
>
60+
{activeColor === color && (
61+
<CheckOutlined style={{ color: 'white' }} />
62+
)}
63+
</div>
64+
))}
65+
</div>
66+
);
67+
}

src/services/projects/ProjectStore.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,13 @@ export default class ProjectStore {
2929
this.activeProject = projectId;
3030
}
3131

32-
setTitle(project: ProjectModel, title: string) {
32+
setProjectProps(
33+
project: ProjectModel,
34+
title: string,
35+
color: string | undefined
36+
) {
3337
project.title = title;
38+
project.color = color || '';
3439
this.projectService.save(this.projects);
3540
}
3641

0 commit comments

Comments
 (0)