2023-04-28 14:56:59 +03:00
|
|
|
import { createAsyncThunk, createSlice } from "@reduxjs/toolkit";
|
2023-05-31 08:36:15 +03:00
|
|
|
|
2023-05-03 16:47:20 +03:00
|
|
|
import { apiRequest } from "../api/request";
|
2023-03-22 21:48:06 +03:00
|
|
|
|
|
|
|
const initialState = {
|
2023-04-28 14:56:59 +03:00
|
|
|
projects: [],
|
2023-05-02 18:51:19 +03:00
|
|
|
projectBoard: {},
|
2023-05-03 16:47:20 +03:00
|
|
|
toggleTab: 1,
|
|
|
|
modalType: "",
|
2023-05-10 12:23:35 +03:00
|
|
|
boardLoader: false,
|
2023-05-16 00:24:52 +03:00
|
|
|
columnName: "",
|
2023-06-09 03:19:09 +03:00
|
|
|
columnId: 0,
|
2023-06-22 14:56:31 +03:00
|
|
|
columnPriority: 0,
|
2023-03-22 21:48:06 +03:00
|
|
|
};
|
|
|
|
|
2023-05-03 16:47:20 +03:00
|
|
|
export const setProjectBoardFetch = createAsyncThunk("userInfo", (id) =>
|
2023-10-13 14:38:11 +03:00
|
|
|
apiRequest(`/project/get-project?project_id=${id}&expand=columns,mark`)
|
2023-04-28 14:56:59 +03:00
|
|
|
);
|
|
|
|
|
2023-03-22 21:48:06 +03:00
|
|
|
export const projectsTrackerSlice = createSlice({
|
|
|
|
name: "projectsTracker",
|
|
|
|
initialState,
|
|
|
|
reducers: {
|
2023-04-28 14:56:59 +03:00
|
|
|
setAllProjects: (state, action) => {
|
2023-05-03 16:47:20 +03:00
|
|
|
state.projects = action.payload;
|
2023-04-28 14:56:59 +03:00
|
|
|
},
|
2023-03-23 16:43:37 +03:00
|
|
|
setProject: (state, action) => {
|
2023-04-28 14:56:59 +03:00
|
|
|
state.projects.push(action.payload);
|
2023-03-22 21:48:06 +03:00
|
|
|
},
|
2023-05-02 18:51:19 +03:00
|
|
|
setToggleTab: (state, action) => {
|
2023-05-03 16:47:20 +03:00
|
|
|
state.toggleTab = action.payload;
|
2023-05-02 18:51:19 +03:00
|
|
|
},
|
2023-04-28 18:29:13 +03:00
|
|
|
deleteProject: (state, action) => {
|
2023-05-08 00:41:39 +03:00
|
|
|
state.projects.forEach((project) => {
|
|
|
|
if (project.id === action.payload.id) {
|
2023-05-10 12:23:35 +03:00
|
|
|
project.status = 10;
|
2023-05-08 00:41:39 +03:00
|
|
|
}
|
2023-05-10 12:23:35 +03:00
|
|
|
});
|
2023-04-28 18:29:13 +03:00
|
|
|
},
|
2023-05-31 08:36:15 +03:00
|
|
|
deletePersonOnProject: (state, action) => {
|
|
|
|
state.projectBoard.projectUsers = state.projectBoard.projectUsers.filter(
|
|
|
|
(person) => person.user_id !== action.payload
|
|
|
|
);
|
2023-05-23 23:02:39 +03:00
|
|
|
},
|
|
|
|
addPersonToProject: (state, action) => {
|
2023-05-31 08:36:15 +03:00
|
|
|
state.projectBoard.projectUsers.push(action.payload);
|
2023-05-23 23:02:39 +03:00
|
|
|
},
|
2023-10-24 22:49:12 +03:00
|
|
|
addNewTagToProject: (state, action) => {
|
2023-10-24 22:58:45 +03:00
|
|
|
state.projectBoard.mark.push(action.payload);
|
2023-10-24 22:49:12 +03:00
|
|
|
},
|
2023-05-05 00:50:48 +03:00
|
|
|
activeLoader: (state) => {
|
2023-05-10 12:23:35 +03:00
|
|
|
state.boardLoader = true;
|
2023-05-05 00:50:48 +03:00
|
|
|
},
|
2023-04-28 14:56:59 +03:00
|
|
|
moveProjectTask: (state, action) => {
|
2023-04-28 16:15:46 +03:00
|
|
|
state.projectBoard.columns.forEach((column, index) => {
|
2023-04-28 14:56:59 +03:00
|
|
|
if (column.id === action.payload.columnId) {
|
2023-06-22 14:56:31 +03:00
|
|
|
column.tasks.push({
|
|
|
|
...action.payload.startWrapperIndex.task,
|
|
|
|
column_id: column.id,
|
|
|
|
});
|
2023-04-28 18:29:13 +03:00
|
|
|
apiRequest(`/task/update-task`, {
|
2023-05-03 16:47:20 +03:00
|
|
|
method: "PUT",
|
2023-04-28 18:29:13 +03:00
|
|
|
data: {
|
|
|
|
task_id: action.payload.startWrapperIndex.task.id,
|
2023-05-03 16:47:20 +03:00
|
|
|
column_id: column.id,
|
2023-06-22 14:56:31 +03:00
|
|
|
priority: column.tasks.length - 1,
|
2023-05-03 16:47:20 +03:00
|
|
|
},
|
2023-05-31 11:24:46 +03:00
|
|
|
}).then(() => {});
|
2023-04-28 14:56:59 +03:00
|
|
|
}
|
|
|
|
if (column.id === action.payload.startWrapperIndex.index) {
|
2023-05-03 16:47:20 +03:00
|
|
|
state.projectBoard.columns[index].tasks = column.tasks.filter(
|
|
|
|
(task) => task.id !== action.payload.startWrapperIndex.task.id
|
|
|
|
);
|
2023-04-28 14:56:59 +03:00
|
|
|
}
|
2023-05-03 16:47:20 +03:00
|
|
|
});
|
|
|
|
},
|
2023-06-15 21:46:52 +03:00
|
|
|
movePositionProjectTask: (state, action) => {
|
|
|
|
state.projectBoard.columns.forEach((column, index) => {
|
|
|
|
if (column.id === action.payload.startTask.column_id) {
|
2023-06-22 14:56:31 +03:00
|
|
|
state.projectBoard.columns[index].tasks = column.tasks.filter(
|
|
|
|
(task) => task.id !== action.payload.startTask.id
|
|
|
|
);
|
2023-06-15 21:46:52 +03:00
|
|
|
}
|
|
|
|
if (column.id === action.payload.finishTask.column_id) {
|
2023-06-22 14:56:31 +03:00
|
|
|
column.tasks.splice(action.payload.finishIndex, 0, {
|
|
|
|
...action.payload.startTask,
|
|
|
|
column_id: column.id,
|
|
|
|
});
|
2023-06-15 21:46:52 +03:00
|
|
|
apiRequest(`/task/update-task`, {
|
|
|
|
method: "PUT",
|
|
|
|
data: {
|
|
|
|
task_id: action.payload.startTask.id,
|
|
|
|
column_id: column.id,
|
|
|
|
},
|
|
|
|
}).then(() => {});
|
2023-06-22 14:56:31 +03:00
|
|
|
const priorityTasks = [];
|
2023-06-15 21:46:52 +03:00
|
|
|
column.tasks.forEach((task, index) => {
|
|
|
|
const curTask = {
|
|
|
|
task_id: task.id,
|
2023-06-22 14:56:31 +03:00
|
|
|
priority: index,
|
|
|
|
};
|
|
|
|
priorityTasks.push(curTask);
|
|
|
|
});
|
2023-06-15 21:46:52 +03:00
|
|
|
apiRequest(`/task/set-priority`, {
|
|
|
|
method: "POST",
|
|
|
|
data: {
|
|
|
|
data: JSON.stringify(priorityTasks),
|
|
|
|
column_id: column.id,
|
|
|
|
},
|
|
|
|
}).then(() => {});
|
|
|
|
}
|
2023-06-22 14:56:31 +03:00
|
|
|
});
|
2023-06-15 21:46:52 +03:00
|
|
|
},
|
2023-06-09 03:19:09 +03:00
|
|
|
filterCreatedByMe: (state, action) => {
|
|
|
|
state.projectBoard.columns.forEach((column) => {
|
2023-06-22 14:56:31 +03:00
|
|
|
column.tasks = column.tasks.filter(
|
|
|
|
(task) => task.user_id === action.payload
|
|
|
|
);
|
|
|
|
});
|
2023-06-09 03:19:09 +03:00
|
|
|
},
|
|
|
|
filteredParticipateTasks: (state, action) => {
|
|
|
|
state.projectBoard.columns.forEach((column) => {
|
2023-06-22 14:56:31 +03:00
|
|
|
column.tasks = column.tasks.filter((task) =>
|
|
|
|
task.taskUsers.some((person) => person.user_id === action.payload)
|
|
|
|
);
|
|
|
|
});
|
2023-06-09 03:19:09 +03:00
|
|
|
},
|
2023-07-03 22:07:44 +03:00
|
|
|
filteredExecutorTasks: (state, action) => {
|
|
|
|
state.projectBoard.columns.forEach((column) => {
|
2023-07-03 22:07:58 +03:00
|
|
|
column.tasks = column.tasks.filter(
|
|
|
|
(task) => task.executor_id === action.payload
|
|
|
|
);
|
2023-07-03 22:07:44 +03:00
|
|
|
});
|
|
|
|
},
|
2023-05-16 00:24:52 +03:00
|
|
|
setColumnName: (state, action) => {
|
2023-05-31 08:36:15 +03:00
|
|
|
state.columnName = action.payload;
|
2023-05-16 00:24:52 +03:00
|
|
|
},
|
|
|
|
setColumnId: (state, action) => {
|
2023-05-31 08:36:15 +03:00
|
|
|
state.columnId = action.payload;
|
2023-05-16 00:24:52 +03:00
|
|
|
},
|
2023-06-09 03:19:09 +03:00
|
|
|
setColumnPriority: (state, action) => {
|
2023-06-22 14:56:31 +03:00
|
|
|
state.columnPriority = action.payload;
|
2023-06-09 03:19:09 +03:00
|
|
|
},
|
2023-05-08 00:41:39 +03:00
|
|
|
editProjectName: (state, action) => {
|
|
|
|
state.projects.forEach((project) => {
|
|
|
|
if (project.id === action.payload.id) {
|
2023-05-10 12:23:35 +03:00
|
|
|
project.name = action.payload.name;
|
2023-05-08 00:41:39 +03:00
|
|
|
}
|
2023-05-10 12:23:35 +03:00
|
|
|
});
|
2023-05-08 00:41:39 +03:00
|
|
|
},
|
2023-05-16 00:24:52 +03:00
|
|
|
editColumnName: (state, action) => {
|
|
|
|
state.projectBoard.columns.forEach((column) => {
|
|
|
|
if (column.id === action.payload.id) {
|
2023-05-31 08:36:15 +03:00
|
|
|
column.title = action.payload.title;
|
2023-05-16 00:24:52 +03:00
|
|
|
}
|
2023-05-31 08:36:15 +03:00
|
|
|
});
|
2023-05-16 00:24:52 +03:00
|
|
|
},
|
2023-05-03 16:47:20 +03:00
|
|
|
modalToggle: (state, action) => {
|
|
|
|
state.modalType = action.payload;
|
|
|
|
},
|
2023-03-22 21:48:06 +03:00
|
|
|
},
|
2023-04-28 14:56:59 +03:00
|
|
|
extraReducers: {
|
|
|
|
[setProjectBoardFetch.fulfilled]: (state, action) => {
|
2023-05-03 16:47:20 +03:00
|
|
|
state.projectBoard = action.payload;
|
2023-05-10 12:23:35 +03:00
|
|
|
state.boardLoader = false;
|
2023-05-03 16:47:20 +03:00
|
|
|
},
|
|
|
|
},
|
2023-03-22 21:48:06 +03:00
|
|
|
});
|
|
|
|
|
2023-05-03 16:47:20 +03:00
|
|
|
export const {
|
|
|
|
setProject,
|
2023-05-16 00:24:52 +03:00
|
|
|
setColumnName,
|
2023-05-03 16:47:20 +03:00
|
|
|
deleteProject,
|
|
|
|
setAllProjects,
|
|
|
|
moveProjectTask,
|
|
|
|
setToggleTab,
|
|
|
|
modalToggle,
|
2023-05-08 00:41:39 +03:00
|
|
|
activeLoader,
|
2023-05-10 12:23:35 +03:00
|
|
|
editProjectName,
|
2023-05-16 00:24:52 +03:00
|
|
|
editColumnName,
|
2023-05-23 23:02:39 +03:00
|
|
|
setColumnId,
|
2023-06-09 03:19:09 +03:00
|
|
|
setColumnPriority,
|
2023-05-23 23:02:39 +03:00
|
|
|
deletePersonOnProject,
|
2023-06-09 03:19:09 +03:00
|
|
|
addPersonToProject,
|
2023-10-24 22:49:12 +03:00
|
|
|
addNewTagToProject,
|
2023-06-09 03:19:09 +03:00
|
|
|
filterCreatedByMe,
|
2023-06-15 21:46:52 +03:00
|
|
|
filteredParticipateTasks,
|
2023-07-03 22:07:44 +03:00
|
|
|
filteredExecutorTasks,
|
2023-06-22 14:56:31 +03:00
|
|
|
movePositionProjectTask,
|
2023-05-03 16:47:20 +03:00
|
|
|
} = projectsTrackerSlice.actions;
|
2023-03-22 21:48:06 +03:00
|
|
|
|
2023-04-28 14:56:59 +03:00
|
|
|
export const getProjects = (state) => state.tracker.projects;
|
|
|
|
export const getProjectBoard = (state) => state.tracker.projectBoard;
|
2023-05-03 16:47:20 +03:00
|
|
|
export const getToggleTab = (state) => state.tracker.toggleTab;
|
|
|
|
export const getValueModalType = (state) => state.tracker.modalType;
|
2023-05-10 12:23:35 +03:00
|
|
|
export const getBoarderLoader = (state) => state.tracker.boardLoader;
|
2023-05-16 00:24:52 +03:00
|
|
|
export const getColumnName = (state) => state.tracker.columnName;
|
|
|
|
export const getColumnId = (state) => state.tracker.columnId;
|
2023-06-22 14:56:31 +03:00
|
|
|
export const getColumnPriority = (state) => state.tracker.columnPriority;
|
2023-03-22 21:48:06 +03:00
|
|
|
|
|
|
|
export default projectsTrackerSlice.reducer;
|