feat(ui+backend): project params persistence
This commit is contained in:
@ -16,6 +16,17 @@ fragment FullTask on Task {
|
||||
}
|
||||
`;
|
||||
|
||||
export const FRAGMENT_FULL_PROJECT_PARAMS = gql`
|
||||
fragment FullProjectParams on ProjectParams {
|
||||
timeUnit {
|
||||
label
|
||||
acronym
|
||||
}
|
||||
currency
|
||||
hideFinancialPreviewOnPrint
|
||||
}
|
||||
`;
|
||||
|
||||
export const FRAGMENT_FULL_PROJECT = gql`
|
||||
fragment FullProject on Project {
|
||||
id
|
||||
@ -29,13 +40,9 @@ fragment FullProject on Project {
|
||||
...FullTask
|
||||
}
|
||||
params {
|
||||
timeUnit {
|
||||
label
|
||||
acronym
|
||||
}
|
||||
currency
|
||||
hideFinancialPreviewOnPrint
|
||||
...FullProjectParams
|
||||
}
|
||||
}
|
||||
${FRAGMENT_FULL_TASK}
|
||||
${FRAGMENT_FULL_PROJECT_PARAMS}
|
||||
`
|
@ -1,5 +1,5 @@
|
||||
import { gql, useMutation, PureQueryOptions } from '@apollo/client';
|
||||
import { FRAGMENT_FULL_PROJECT, FRAGMENT_FULL_TASK } from '../fragments/project';
|
||||
import { FRAGMENT_FULL_PROJECT, FRAGMENT_FULL_TASK, FRAGMENT_FULL_PROJECT_PARAMS } from '../fragments/project';
|
||||
import { QUERY_PROJECTS } from '../queries/project';
|
||||
|
||||
export const MUTATION_CREATE_PROJECT = gql`
|
||||
@ -69,3 +69,16 @@ mutation removeProjectTask($projectId: ID!, $taskId: ID!) {
|
||||
export function useRemoveProjectTaskMutation() {
|
||||
return useMutation(MUTATION_REMOVE_PROJECT_TASK);
|
||||
}
|
||||
|
||||
export const MUTATION_UPDATE_PROJECT_PARAMS = gql`
|
||||
mutation updateProjectParams($projectId: ID!, $changes: ProjectParamsChanges!) {
|
||||
updateProjectParams(projectId: $projectId, changes: $changes) {
|
||||
...FullProjectParams
|
||||
}
|
||||
}
|
||||
${FRAGMENT_FULL_PROJECT_PARAMS}
|
||||
`;
|
||||
|
||||
export function useUpdateProjectParamsMutation() {
|
||||
return useMutation(MUTATION_UPDATE_PROJECT_PARAMS);
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { all, select, takeLatest, put, delay } from "redux-saga/effects";
|
||||
import { client } from '../gql/client';
|
||||
import { MUTATION_CREATE_PROJECT, MUTATION_UPDATE_PROJECT_TITLE, MUTATION_ADD_PROJECT_TASK, MUTATION_REMOVE_PROJECT_TASK, MUTATION_UPDATE_PROJECT_TASK } from "../gql/mutations/project";
|
||||
import { UPDATE_PROJECT_TITLE, resetProject, ADD_TASK, taskSaved, AddTask, taskRemoved, RemoveTask, REMOVE_TASK, UPDATE_TASK_ESTIMATION, updateTaskEstimation, UpdateTaskEstimation, UpdateTaskLabel, UPDATE_TASK_LABEL } from "./useProjectReducer";
|
||||
import { MUTATION_CREATE_PROJECT, MUTATION_UPDATE_PROJECT_TITLE, MUTATION_ADD_PROJECT_TASK, MUTATION_REMOVE_PROJECT_TASK, MUTATION_UPDATE_PROJECT_TASK, MUTATION_UPDATE_PROJECT_PARAMS } from "../gql/mutations/project";
|
||||
import { UPDATE_PROJECT_TITLE, resetProject, ADD_TASK, taskSaved, AddTask, taskRemoved, RemoveTask, REMOVE_TASK, UPDATE_TASK_ESTIMATION, updateTaskEstimation, UpdateTaskEstimation, UpdateTaskLabel, UPDATE_TASK_LABEL, UpdateParam, paramsSaved, UPDATE_PARAM } from "./useProjectReducer";
|
||||
import { Project } from "../types/project";
|
||||
|
||||
export function* rootSaga() {
|
||||
@ -10,6 +10,7 @@ export function* rootSaga() {
|
||||
takeLatest(UPDATE_PROJECT_TITLE, updateProjectTitleSaga),
|
||||
takeLatest(UPDATE_TASK_ESTIMATION, updateTaskEstimationSaga),
|
||||
takeLatest(UPDATE_TASK_LABEL, updateTaskLabelSaga),
|
||||
takeLatest(UPDATE_PARAM, updateProjectParamsSaga),
|
||||
takeLatest(ADD_TASK, addTaskSaga),
|
||||
takeLatest(REMOVE_TASK, removeTaskSaga),
|
||||
]);
|
||||
@ -136,4 +137,30 @@ export function* updateTaskLabelSaga({ id, label }: UpdateTaskLabel) {
|
||||
});
|
||||
|
||||
yield put(taskSaved({ ...data.updateProjectTask }));
|
||||
}
|
||||
|
||||
export function* updateProjectParamsSaga({ name, value }: UpdateParam) {
|
||||
yield delay(500);
|
||||
|
||||
let project: Project = yield select();
|
||||
|
||||
if (project.id === undefined) {
|
||||
project = yield createProjectSaga();
|
||||
}
|
||||
|
||||
if (typeof value === 'object') {
|
||||
delete value.__typename;
|
||||
}
|
||||
|
||||
const { data } = yield client.mutate({
|
||||
mutation: MUTATION_UPDATE_PROJECT_PARAMS,
|
||||
variables: {
|
||||
projectId: project.id,
|
||||
changes: {
|
||||
[name]: value,
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
yield put(paramsSaved({ ...data.updateProjectParams }));
|
||||
}
|
@ -3,6 +3,7 @@ import { Task, TaskID, EstimationConfidence, TaskCategoryID, TaskCategory } from
|
||||
import { useReducerAndSaga } from "./useReducerAndSaga";
|
||||
import { rootSaga } from "./useProjectReducer.sagas";
|
||||
import { uuid } from "../util/uuid";
|
||||
import { Params } from "../types/params";
|
||||
|
||||
export interface Action {
|
||||
type: string
|
||||
@ -17,6 +18,7 @@ UpdateTaskEstimation |
|
||||
UpdateProjectTitle |
|
||||
UpdateTaskLabel |
|
||||
UpdateParam |
|
||||
ParamsSaved |
|
||||
UpdateTaskCategoryLabel |
|
||||
UpdateTaskCategoryCost |
|
||||
AddTaskCategory |
|
||||
@ -232,6 +234,16 @@ export function handleUpdateParam(project: Project, action: UpdateParam): Projec
|
||||
};
|
||||
}
|
||||
|
||||
export interface ParamsSaved extends Action {
|
||||
params: Params
|
||||
}
|
||||
|
||||
export const PARAMS_SAVED = "PARAMS_SAVED";
|
||||
|
||||
export function paramsSaved(params: Params): ParamsSaved {
|
||||
return { type: PARAMS_SAVED, params };
|
||||
}
|
||||
|
||||
export interface UpdateTaskCategoryLabel extends Action {
|
||||
categoryId: TaskCategoryID
|
||||
label: string
|
||||
|
Reference in New Issue
Block a user