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.
361 lines
11 KiB
TypeScript
361 lines
11 KiB
TypeScript
// Copyright (C) 2020-2022 Intel 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 { TasksState, Task } from './interfaces';
|
|
|
|
const defaultState: TasksState = {
|
|
initialized: false,
|
|
fetching: false,
|
|
updating: false,
|
|
hideEmpty: false,
|
|
moveTask: {
|
|
modalVisible: false,
|
|
taskId: null,
|
|
},
|
|
count: 0,
|
|
current: [],
|
|
gettingQuery: {
|
|
page: 1,
|
|
id: null,
|
|
search: null,
|
|
filter: null,
|
|
sort: null,
|
|
projectId: null,
|
|
},
|
|
activities: {
|
|
loads: {},
|
|
deletes: {},
|
|
creates: {
|
|
taskId: null,
|
|
status: '',
|
|
error: '',
|
|
},
|
|
backups: {},
|
|
},
|
|
importing: false,
|
|
};
|
|
|
|
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,
|
|
current: [],
|
|
gettingQuery: action.payload.updateQuery ? { ...action.payload.query } : state.gettingQuery,
|
|
};
|
|
case TasksActionTypes.GET_TASKS_SUCCESS: {
|
|
const combinedWithPreviews = action.payload.array.map(
|
|
(task: any, index: number): Task => ({
|
|
instance: task,
|
|
preview: action.payload.previews[index],
|
|
}),
|
|
);
|
|
|
|
return {
|
|
...state,
|
|
initialized: true,
|
|
fetching: false,
|
|
count: action.payload.count,
|
|
current: combinedWithPreviews,
|
|
};
|
|
}
|
|
case TasksActionTypes.GET_TASKS_FAILED:
|
|
return {
|
|
...state,
|
|
initialized: true,
|
|
fetching: false,
|
|
};
|
|
case TasksActionTypes.LOAD_ANNOTATIONS: {
|
|
const { task } = action.payload;
|
|
const { loader } = action.payload;
|
|
const { loads } = state.activities;
|
|
|
|
loads[task.id] = task.id in loads ? loads[task.id] : loader.name;
|
|
|
|
return {
|
|
...state,
|
|
activities: {
|
|
...state.activities,
|
|
loads: {
|
|
...loads,
|
|
},
|
|
},
|
|
};
|
|
}
|
|
case TasksActionTypes.LOAD_ANNOTATIONS_FAILED:
|
|
case TasksActionTypes.LOAD_ANNOTATIONS_SUCCESS: {
|
|
const { task } = action.payload;
|
|
const { loads } = state.activities;
|
|
|
|
delete loads[task.id];
|
|
|
|
return {
|
|
...state,
|
|
activities: {
|
|
...state.activities,
|
|
loads: {
|
|
...loads,
|
|
},
|
|
},
|
|
};
|
|
}
|
|
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.EXPORT_TASK: {
|
|
const { taskID } = action.payload;
|
|
const { backups } = state.activities;
|
|
|
|
return {
|
|
...state,
|
|
activities: {
|
|
...state.activities,
|
|
backups: {
|
|
...backups,
|
|
...Object.fromEntries([[taskID, true]]),
|
|
},
|
|
},
|
|
};
|
|
}
|
|
case TasksActionTypes.EXPORT_TASK_FAILED:
|
|
case TasksActionTypes.EXPORT_TASK_SUCCESS: {
|
|
const { taskID } = action.payload;
|
|
const { backups } = state.activities;
|
|
|
|
delete backups[taskID];
|
|
|
|
return {
|
|
...state,
|
|
activities: {
|
|
...state.activities,
|
|
backups: omit(backups, [taskID]),
|
|
},
|
|
};
|
|
}
|
|
case TasksActionTypes.IMPORT_TASK: {
|
|
return {
|
|
...state,
|
|
importing: true,
|
|
};
|
|
}
|
|
case TasksActionTypes.IMPORT_TASK_FAILED:
|
|
case TasksActionTypes.IMPORT_TASK_SUCCESS: {
|
|
return {
|
|
...state,
|
|
importing: false,
|
|
};
|
|
}
|
|
case TasksActionTypes.CREATE_TASK: {
|
|
return {
|
|
...state,
|
|
activities: {
|
|
...state.activities,
|
|
creates: {
|
|
taskId: null,
|
|
status: '',
|
|
error: '',
|
|
},
|
|
},
|
|
};
|
|
}
|
|
case TasksActionTypes.CREATE_TASK_STATUS_UPDATED: {
|
|
const { status } = action.payload;
|
|
|
|
return {
|
|
...state,
|
|
activities: {
|
|
...state.activities,
|
|
creates: {
|
|
...state.activities.creates,
|
|
status,
|
|
},
|
|
},
|
|
};
|
|
}
|
|
case TasksActionTypes.CREATE_TASK_SUCCESS: {
|
|
const { taskId } = action.payload;
|
|
return {
|
|
...state,
|
|
activities: {
|
|
...state.activities,
|
|
creates: {
|
|
...state.activities.creates,
|
|
taskId,
|
|
status: 'CREATED',
|
|
},
|
|
},
|
|
};
|
|
}
|
|
case TasksActionTypes.CREATE_TASK_FAILED: {
|
|
return {
|
|
...state,
|
|
activities: {
|
|
...state.activities,
|
|
creates: {
|
|
...state.activities.creates,
|
|
status: 'FAILED',
|
|
error: action.payload.error.toString(),
|
|
},
|
|
},
|
|
};
|
|
}
|
|
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.instance.id !== taskID),
|
|
};
|
|
}
|
|
|
|
return {
|
|
...state,
|
|
updating: false,
|
|
current: state.current.map(
|
|
(_task): Task => {
|
|
if (_task.instance.id === task.id) {
|
|
return {
|
|
..._task,
|
|
instance: task,
|
|
};
|
|
}
|
|
|
|
return _task;
|
|
},
|
|
),
|
|
};
|
|
}
|
|
case TasksActionTypes.UPDATE_TASK_FAILED: {
|
|
return {
|
|
...state,
|
|
updating: false,
|
|
current: state.current.map(
|
|
(task): Task => {
|
|
if (task.instance.id === action.payload.task.id) {
|
|
return {
|
|
...task,
|
|
instance: action.payload.task,
|
|
};
|
|
}
|
|
|
|
return task;
|
|
},
|
|
),
|
|
};
|
|
}
|
|
case TasksActionTypes.UPDATE_JOB: {
|
|
return {
|
|
...state,
|
|
updating: true,
|
|
};
|
|
}
|
|
case TasksActionTypes.UPDATE_JOB_SUCCESS: {
|
|
const { jobInstance } = action.payload;
|
|
const idx = state.current.findIndex((task: Task) => task.instance.id === jobInstance.taskId);
|
|
const newCurrent = idx === -1 ?
|
|
state.current : [...(state.current.splice(idx, 1), state.current)];
|
|
|
|
return {
|
|
...state,
|
|
current: newCurrent,
|
|
gettingQuery: state.gettingQuery.id === jobInstance.taskId ? {
|
|
...state.gettingQuery,
|
|
id: null,
|
|
} : state.gettingQuery,
|
|
updating: false,
|
|
};
|
|
}
|
|
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 BoundariesActionTypes.RESET_AFTER_ERROR:
|
|
case AuthActionTypes.LOGOUT_SUCCESS: {
|
|
return { ...defaultState };
|
|
}
|
|
default:
|
|
return state;
|
|
}
|
|
};
|