You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
276 lines
8.0 KiB
TypeScript
276 lines
8.0 KiB
TypeScript
// Copyright (C) 2020-2022 Intel Corporation
|
|
// Copyright (C) 2022 CVAT.ai Corporation
|
|
//
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
import { AnyAction } from 'redux';
|
|
import { omit } from 'lodash';
|
|
import { BoundariesActionTypes } from 'actions/boundaries-actions';
|
|
import { TasksActionTypes } from 'actions/tasks-actions';
|
|
import { AuthActionTypes } from 'actions/auth-actions';
|
|
|
|
import { AnnotationActionTypes } from 'actions/annotation-actions';
|
|
import { TasksState, Task } from '.';
|
|
|
|
const defaultState: TasksState = {
|
|
initialized: false,
|
|
fetching: false,
|
|
updating: false,
|
|
hideEmpty: false,
|
|
moveTask: {
|
|
modalVisible: false,
|
|
taskId: null,
|
|
},
|
|
count: 0,
|
|
current: [],
|
|
previews: {},
|
|
gettingQuery: {
|
|
page: 1,
|
|
id: null,
|
|
search: null,
|
|
filter: null,
|
|
sort: null,
|
|
projectId: null,
|
|
},
|
|
activities: {
|
|
deletes: {},
|
|
jobUpdates: {},
|
|
},
|
|
};
|
|
|
|
export default (state: TasksState = defaultState, action: AnyAction): TasksState => {
|
|
switch (action.type) {
|
|
case TasksActionTypes.GET_TASKS:
|
|
return {
|
|
...state,
|
|
activities: {
|
|
...state.activities,
|
|
deletes: {},
|
|
},
|
|
initialized: false,
|
|
fetching: true,
|
|
hideEmpty: true,
|
|
count: 0,
|
|
gettingQuery: action.payload.updateQuery ? {
|
|
...defaultState.gettingQuery,
|
|
...action.payload.query,
|
|
} : state.gettingQuery,
|
|
};
|
|
case TasksActionTypes.GET_TASKS_SUCCESS: {
|
|
return {
|
|
...state,
|
|
initialized: true,
|
|
fetching: false,
|
|
updating: false,
|
|
count: action.payload.count,
|
|
current: action.payload.array,
|
|
};
|
|
}
|
|
case TasksActionTypes.GET_TASKS_FAILED:
|
|
return {
|
|
...state,
|
|
initialized: true,
|
|
fetching: false,
|
|
};
|
|
case TasksActionTypes.DELETE_TASK: {
|
|
const { taskID } = action.payload;
|
|
const { deletes } = state.activities;
|
|
|
|
deletes[taskID] = false;
|
|
|
|
return {
|
|
...state,
|
|
activities: {
|
|
...state.activities,
|
|
deletes: {
|
|
...deletes,
|
|
},
|
|
},
|
|
};
|
|
}
|
|
case TasksActionTypes.DELETE_TASK_SUCCESS: {
|
|
const { taskID } = action.payload;
|
|
const { deletes } = state.activities;
|
|
|
|
deletes[taskID] = true;
|
|
|
|
return {
|
|
...state,
|
|
activities: {
|
|
...state.activities,
|
|
deletes: {
|
|
...deletes,
|
|
},
|
|
},
|
|
};
|
|
}
|
|
case TasksActionTypes.DELETE_TASK_FAILED: {
|
|
const { taskID } = action.payload;
|
|
const { deletes } = state.activities;
|
|
|
|
delete deletes[taskID];
|
|
|
|
return {
|
|
...state,
|
|
activities: {
|
|
...state.activities,
|
|
deletes: {
|
|
...deletes,
|
|
},
|
|
},
|
|
};
|
|
}
|
|
case TasksActionTypes.UPDATE_TASK: {
|
|
return {
|
|
...state,
|
|
updating: true,
|
|
};
|
|
}
|
|
case TasksActionTypes.UPDATE_TASK_SUCCESS: {
|
|
// a task will be undefined after updating when a user doesn't have access to the task anymore
|
|
const { task, taskID } = action.payload;
|
|
|
|
if (typeof task === 'undefined') {
|
|
return {
|
|
...state,
|
|
updating: false,
|
|
current: state.current.filter((_task: Task): boolean => _task.id !== taskID),
|
|
};
|
|
}
|
|
|
|
return {
|
|
...state,
|
|
updating: false,
|
|
current: state.current.map(
|
|
(_task): Task => {
|
|
if (_task.id === task.id) {
|
|
return task;
|
|
}
|
|
|
|
return _task;
|
|
},
|
|
),
|
|
};
|
|
}
|
|
case TasksActionTypes.UPDATE_TASK_FAILED: {
|
|
return {
|
|
...state,
|
|
updating: false,
|
|
current: state.current.map(
|
|
(task): Task => {
|
|
if (task.id === action.payload.task.id) {
|
|
return action.payload.task;
|
|
}
|
|
|
|
return task;
|
|
},
|
|
),
|
|
};
|
|
}
|
|
case TasksActionTypes.UPDATE_JOB: {
|
|
const { jobID } = action.payload;
|
|
const { jobUpdates } = state.activities;
|
|
|
|
return {
|
|
...state,
|
|
updating: true,
|
|
activities: {
|
|
...state.activities,
|
|
jobUpdates: {
|
|
...jobUpdates,
|
|
...Object.fromEntries([[jobID, true]]),
|
|
},
|
|
},
|
|
};
|
|
}
|
|
case TasksActionTypes.UPDATE_JOB_SUCCESS:
|
|
case TasksActionTypes.UPDATE_JOB_FAILED: {
|
|
const { jobID } = action.payload;
|
|
const { jobUpdates } = state.activities;
|
|
|
|
delete jobUpdates[jobID];
|
|
|
|
return {
|
|
...state,
|
|
activities: {
|
|
...state.activities,
|
|
jobUpdates: omit(jobUpdates, [jobID]),
|
|
},
|
|
};
|
|
}
|
|
case TasksActionTypes.HIDE_EMPTY_TASKS: {
|
|
return {
|
|
...state,
|
|
hideEmpty: action.payload.hideEmpty,
|
|
};
|
|
}
|
|
case TasksActionTypes.SWITCH_MOVE_TASK_MODAL_VISIBLE: {
|
|
return {
|
|
...state,
|
|
moveTask: {
|
|
...state.moveTask,
|
|
modalVisible: action.payload.visible,
|
|
taskId: action.payload.taskId,
|
|
},
|
|
};
|
|
}
|
|
case AnnotationActionTypes.CLOSE_JOB: {
|
|
return {
|
|
...state,
|
|
updating: false,
|
|
};
|
|
}
|
|
case BoundariesActionTypes.RESET_AFTER_ERROR:
|
|
case AuthActionTypes.LOGOUT_SUCCESS: {
|
|
return { ...defaultState };
|
|
}
|
|
case TasksActionTypes.GET_TASK_PREVIEW: {
|
|
const { taskID } = action.payload;
|
|
const { previews } = state;
|
|
return {
|
|
...state,
|
|
previews: {
|
|
...previews,
|
|
[taskID]: {
|
|
preview: '',
|
|
fetching: true,
|
|
initialized: false,
|
|
},
|
|
},
|
|
};
|
|
}
|
|
case TasksActionTypes.GET_TASK_PREVIEW_SUCCESS: {
|
|
const { taskID, preview } = action.payload;
|
|
const { previews } = state;
|
|
return {
|
|
...state,
|
|
previews: {
|
|
...previews,
|
|
[taskID]: {
|
|
preview,
|
|
fetching: false,
|
|
initialized: true,
|
|
},
|
|
},
|
|
};
|
|
}
|
|
case TasksActionTypes.GET_TASK_PREVIEW_FAILED: {
|
|
const { taskID } = action.payload;
|
|
const { previews } = state;
|
|
return {
|
|
...state,
|
|
previews: {
|
|
...previews,
|
|
[taskID]: {
|
|
...previews[taskID],
|
|
fetching: false,
|
|
initialized: true,
|
|
},
|
|
},
|
|
};
|
|
}
|
|
default:
|
|
return state;
|
|
}
|
|
};
|