@@ -10,7 +13,7 @@ const CommentsList = ({ comments, removeComent }) => (
@@ -23,7 +26,14 @@ const CommentsList = ({ comments, removeComent }) => (
CommentsList.propTypes = {
comments: PropTypes.array,
- removeComent: PropTypes.func,
+ deleteComment: PropTypes.func,
};
-export default CommentsList;
+import { deleteComment } from '../state';
+
+export default connect(
+ state => ({
+ comments: state.tasksDetails.comments,
+ }),
+ { deleteComment }
+)(CommentsList);
diff --git a/frontend/src/containers/TaskDetails/TaskInfo.jsx b/frontend/src/containers/TaskDetails/TaskInfo.jsx
deleted file mode 100644
index 0258a9f..0000000
--- a/frontend/src/containers/TaskDetails/TaskInfo.jsx
+++ /dev/null
@@ -1,17 +0,0 @@
-
-import { connect } from 'react-redux';
-import { removeTask } from 'reduxApp/modules/tasks';
-
-import TaskInfoComponent from 'components/TaskInfo/';
-
-
-const TaskInfo = connect(
- state => ({
- task: state.tasks.task,
- }),
- { removeTask }
-)(TaskInfoComponent);
-
-
-export default TaskInfo;
-
diff --git a/frontend/src/containers/TaskDetails/TaskInfo/index.jsx b/frontend/src/containers/TaskDetails/TaskInfo/index.jsx
new file mode 100644
index 0000000..90cf29a
--- /dev/null
+++ b/frontend/src/containers/TaskDetails/TaskInfo/index.jsx
@@ -0,0 +1,33 @@
+
+import { connect } from 'react-redux';
+
+import React, { PropTypes } from 'react';
+import { Button } from 'react-bootstrap';
+
+const TaskInfo = ({ task: { title, description }, deleteTask }) => (
+
+
+
{title}
+
+ {description}
+
+
+
+
+);
+
+TaskInfo.propTypes = {
+ task: PropTypes.object,
+ deleteTask: PropTypes.func,
+};
+
+import { deleteTask } from '../state';
+
+export default connect(
+ state => ({
+ task: state.tasksDetails.task,
+ }),
+ { deleteTask }
+)(TaskInfo);
+
+
diff --git a/frontend/src/containers/TaskDetails/index.jsx b/frontend/src/containers/TaskDetails/index.jsx
index 31cb176..aa90264 100644
--- a/frontend/src/containers/TaskDetails/index.jsx
+++ b/frontend/src/containers/TaskDetails/index.jsx
@@ -1,8 +1,8 @@
import React from 'react';
-import TaskInfo from './TaskInfo';
-import AddComentForm from './AddComentForm';
-import CommentsList from './CommentsList';
+import TaskInfo from './TaskInfo/';
+import AddComentForm from './AddComentForm/';
+import CommentsList from './CommentsList/';
const TaskDetails = () => (
@@ -12,8 +12,7 @@ const TaskDetails = () => (
);
-import loading from 'containers/Application/loading';
-import { loadTask } from 'reduxApp/modules/tasks';
-import { loadComments } from 'reduxApp/modules/comments';
+import loading from 'HOC/loading';
+import { showPage } from './state';
-export default loading([loadTask, loadComments])(TaskDetails);
+export default loading([showPage])(TaskDetails);
diff --git a/frontend/src/containers/TaskDetails/state.jsx b/frontend/src/containers/TaskDetails/state.jsx
new file mode 100644
index 0000000..25abd88
--- /dev/null
+++ b/frontend/src/containers/TaskDetails/state.jsx
@@ -0,0 +1,92 @@
+
+const initState = {
+ task: null,
+ comments: [],
+};
+
+export const reducer = (state = initState, action) => {
+ switch (action.type) {
+ case 'LOAD_COMMENTS_SUCCESS':
+ return { ...state, comments: action.payload.items };
+ case 'LOAD_TASK_SUCCESS':
+ return { ...state, task: action.payload };
+ default:
+ return state;
+ }
+};
+
+import { push } from 'redux-router';
+
+const loadComments = (id) => ({
+ type: 'LOAD_COMMENTS',
+ payload: {
+ request: `/api/tasks/${id}/comments/page/0/5`,
+ },
+});
+
+const loadTask = (id) => ({
+ type: 'LOAD_TASK',
+ payload: {
+ request: `/api/tasks/${id}`,
+ },
+});
+
+const deleteTaskApiCall = (id) => ({
+ type: 'DELETE_TASK',
+ payload: {
+ request: {
+ url: `/api/tasks/${id}`,
+ method: 'delete',
+ },
+ },
+});
+
+const deleteCommentApiCall = (taskId, commentId) => ({
+ type: 'DEELTE_COMMENT',
+ payload: {
+ request: {
+ url: `/api/tasks/${taskId}/comments/${commentId}`,
+ method: 'delete',
+ },
+ },
+});
+
+const addCommentApiCall = (taskId, data) => ({
+ type: 'ADD_COMMENT',
+ payload: {
+ request: {
+ url: `/api/tasks/${taskId}/comments`,
+ method: 'post',
+ data,
+ },
+ },
+});
+
+// PUBLICK
+export const deleteTask = () => (dispatch, getState) => {
+ const { router: { params: { id, projectId } } } = getState();
+ return dispatch(deleteTaskApiCall(id))
+ .then(() => dispatch(push(`/projects/${projectId}/tasks`)));
+};
+
+export const addComment = (text) => (dispatch, getState) => {
+ const {
+ auth: { user: { name } },
+ router: { params: { id } },
+ } = getState();
+
+ return dispatch(addCommentApiCall(id, { text, userName: name }))
+ .then(() => dispatch(loadComments(id)));
+};
+
+export const deleteComment = (comment) => (dispatch, getState) => {
+ const { router: { params: { id } } } = getState();
+ return dispatch(deleteCommentApiCall(id, comment.id))
+ .then(() => dispatch(loadComments(id)));
+};
+
+export const showPage = ({ id }) => (dispatch) =>
+ Promise.all([
+ dispatch(loadComments(id)),
+ dispatch(loadTask(id)),
+ ]);
diff --git a/frontend/src/containers/TasksList/TaskFilter.jsx b/frontend/src/containers/TasksList/TaskFilter.jsx
deleted file mode 100644
index 9b48fe7..0000000
--- a/frontend/src/containers/TasksList/TaskFilter.jsx
+++ /dev/null
@@ -1,20 +0,0 @@
-import { connect } from 'react-redux';
-
-import * as action from 'reduxApp/modules/taskFilter';
-// import { loadTasks } from 'reduxApp/modules/tasks';
-
-import TaskFilter from 'components/TaskFilter/';
-
-export default connect(
- state => ({
- statuses: state.tasks.statuses,
- users: state.users.users,
- userId: state.taskFilter.userId,
- status: state.taskFilter.status,
- }),
- {
- changeFilter: action.changeFilter,
- findTask: action.findTask,
- },
-)(TaskFilter);
-
diff --git a/frontend/src/containers/TasksList/TaskFilter/StatusSelect.jsx b/frontend/src/containers/TasksList/TaskFilter/StatusSelect.jsx
new file mode 100644
index 0000000..e4d94aa
--- /dev/null
+++ b/frontend/src/containers/TasksList/TaskFilter/StatusSelect.jsx
@@ -0,0 +1,30 @@
+
+import React from 'react';
+import Select from 'react-select';
+import { connect } from 'react-redux';
+
+const StatusSelect = ({ statuses, status, changeStatus }) => (
+