import { Dispatch } from "redux";
import { getResourceKind } from "../../models/resource";
import FilterBuilder from "../../common/api/filter-builder";
+import { ThunkAction } from "../../../node_modules/redux-thunk";
const actions = unionize({
- CREATE_PROJECT: ofType<Project>(),
+ OPEN_PROJECT_CREATOR: ofType<{}>(),
+ CREATE_PROJECT: ofType<Partial<ProjectResource>>(),
+ CREATE_PROJECT_SUCCESS: ofType<ProjectResource>(),
+ CREATE_PROJECT_ERROR: ofType<string>(),
REMOVE_PROJECT: ofType<string>(),
PROJECTS_REQUEST: ofType<string>(),
PROJECTS_SUCCESS: ofType<{ projects: Project[], parentItemId?: string }>(),
});
};
+export const createProject = (project: Partial<ProjectResource>) =>
+ (dispatch: Dispatch) => {
+ dispatch(actions.CREATE_PROJECT(project));
+ return projectService
+ .create(project)
+ .then(project => dispatch(actions.CREATE_PROJECT_SUCCESS(project)))
+ .catch(() => dispatch(actions.CREATE_PROJECT_ERROR("Could not create a project")));
+ };
+
export type ProjectAction = UnionOf<typeof actions>;
export default actions;
active: true,
status: 1
}],
- currentItemId: "1"
+ currentItemId: "1",
+ creator: { opened: false, pending: false },
};
const project = {
items: [{
active: false,
status: 1
}],
- currentItemId: "1"
+ currentItemId: "1",
+ creator: { opened: false, pending: false }
};
const project = {
items: [{
status: 1,
toggled: true
}],
- currentItemId: "1"
+ currentItemId: "1",
+ creator: { opened: false, pending: false },
};
const state = projectsReducer(initialState, actions.TOGGLE_PROJECT_TREE_ITEM_ACTIVE(initialState.items[0].id));
status: 1,
toggled: false,
}],
- currentItemId: "1"
+ currentItemId: "1",
+ creator: { opened: false, pending: false }
};
const project = {
items: [{
status: 1,
toggled: true
}],
- currentItemId: "1"
+ currentItemId: "1",
+ creator: { opened: false, pending: false },
};
const state = projectsReducer(initialState, actions.TOGGLE_PROJECT_TREE_ITEM_OPEN(initialState.items[0].id));
export type ProjectState = {
items: Array<TreeItem<Project>>,
- currentItemId: string
+ currentItemId: string,
+ creator: {
+ opened: boolean,
+ pending: boolean
+ }
};
export function findTreeItem<T>(tree: Array<TreeItem<T>>, itemId: string): TreeItem<T> | undefined {
}
export function getTreePath<T>(tree: Array<TreeItem<T>>, itemId: string): Array<TreeItem<T>> {
- for (const item of tree){
- if(item.id === itemId){
+ for (const item of tree) {
+ if (item.id === itemId) {
return [item];
} else {
const branch = getTreePath(item.items || [], itemId);
- if(branch.length > 0){
+ if (branch.length > 0) {
return [item, ...branch];
}
}
return items;
}
-const projectsReducer = (state: ProjectState = { items: [], currentItemId: "" }, action: ProjectAction) => {
+const initialState: ProjectState = {
+ items: [],
+ currentItemId: "",
+ creator: {
+ opened: false,
+ pending: false
+ }
+};
+
+
+const projectsReducer = (state: ProjectState = initialState, action: ProjectAction) => {
return actions.match(action, {
- CREATE_PROJECT: project => ({
- ...state,
- items: state.items.concat({
- id: project.uuid,
- open: false,
- active: false,
- status: TreeItemStatus.Loaded,
- toggled: false,
- items: [],
- data: project
- })
- }),
+ OPEN_PROJECT_CREATOR: () => ({ ...state, creator: { opened: true, pending: false } }),
+ CREATE_PROJECT: () => ({ ...state, creator: { opened: false, pending: true } }),
+ CREATE_PROJECT_SUCCESS: () => ({ ...state, creator: { opened: false, pending: false } }),
+ CREATE_PROJECT_ERROR: () => ({ ...state, creator: { opened: false, pending: false } }),
REMOVE_PROJECT: () => state,
PROJECTS_REQUEST: itemId => {
const items = _.cloneDeep(state.items);