From 8bf054a480ecc2d31b857cb27bd6256f1efdd74c Mon Sep 17 00:00:00 2001 From: Frederic Guillot Date: Sat, 11 Feb 2017 17:22:10 -0500 Subject: Open comments in board view with a modal dialog instead of tooltip --- app/Controller/BoardTooltipController.php | 16 --------- app/Controller/CommentController.php | 21 +++++------ app/Controller/CommentListController.php | 50 ++++++++++++++++++++++++++ app/Core/Helper.php | 1 + app/Helper/CommentHelper.php | 23 ++++++++++++ app/Helper/ModalHelper.php | 4 +-- app/Model/CommentModel.php | 2 +- app/ServiceProvider/AuthenticationProvider.php | 3 +- app/ServiceProvider/HelperProvider.php | 1 + app/Template/board/task_footer.php | 11 ++++-- app/Template/board/task_private.php | 4 +-- app/Template/board/tooltip_comments.php | 9 ----- app/Template/comment/show.php | 13 ++++--- app/Template/comment_list/create.php | 8 +++++ app/Template/comment_list/show.php | 27 ++++++++++++++ app/Template/comments/create.php | 11 ------ app/Template/comments/show.php | 35 ------------------ app/Template/task/public.php | 2 +- app/Template/task/show.php | 2 +- app/Template/task_comments/create.php | 8 +++++ app/Template/task_comments/show.php | 31 ++++++++++++++++ 21 files changed, 182 insertions(+), 100 deletions(-) create mode 100644 app/Controller/CommentListController.php create mode 100644 app/Helper/CommentHelper.php delete mode 100644 app/Template/board/tooltip_comments.php create mode 100644 app/Template/comment_list/create.php create mode 100644 app/Template/comment_list/show.php delete mode 100644 app/Template/comments/create.php delete mode 100644 app/Template/comments/show.php create mode 100644 app/Template/task_comments/create.php create mode 100644 app/Template/task_comments/show.php (limited to 'app') diff --git a/app/Controller/BoardTooltipController.php b/app/Controller/BoardTooltipController.php index 79b9b509..7bee8dab 100644 --- a/app/Controller/BoardTooltipController.php +++ b/app/Controller/BoardTooltipController.php @@ -69,22 +69,6 @@ class BoardTooltipController extends BaseController ))); } - /** - * Display comments during a task mouseover - * - * @access public - */ - public function comments() - { - $task = $this->getTask(); - $commentSortingDirection = $this->userMetadataCacheDecorator->get(UserMetadataModel::KEY_COMMENT_SORTING_DIRECTION, 'ASC'); - - $this->response->html($this->template->render('board/tooltip_comments', array( - 'task' => $task, - 'comments' => $this->commentModel->getAll($task['id'], $commentSortingDirection) - ))); - } - /** * Display task description * diff --git a/app/Controller/CommentController.php b/app/Controller/CommentController.php index 526bd2bf..9a89103e 100644 --- a/app/Controller/CommentController.php +++ b/app/Controller/CommentController.php @@ -4,7 +4,6 @@ namespace Kanboard\Controller; use Kanboard\Core\Controller\AccessForbiddenException; use Kanboard\Core\Controller\PageNotFoundException; -use Kanboard\Model\UserMetadataModel; /** * Comment Controller @@ -17,12 +16,12 @@ class CommentController extends BaseController /** * Get the current comment * - * @access private + * @access protected * @return array * @throws PageNotFoundException * @throws AccessForbiddenException */ - private function getComment() + protected function getComment() { $comment = $this->commentModel->getById($this->request->getIntegerParam('comment_id')); @@ -77,6 +76,8 @@ class CommentController extends BaseController { $task = $this->getTask(); $values = $this->request->getValues(); + $values['task_id'] = $task['id']; + $values['user_id'] = $this->userSession->getId(); list($valid, $errors) = $this->commentValidator->validateCreation($values); @@ -118,7 +119,6 @@ class CommentController extends BaseController 'errors' => $errors, 'comment' => $comment, 'task' => $task, - 'title' => t('Edit a comment') ))); } @@ -142,10 +142,11 @@ class CommentController extends BaseController $this->flash->failure(t('Unable to update your comment.')); } - return $this->response->redirect($this->helper->url->to('TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])), false); + $this->response->redirect($this->helper->url->to('TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])), true); + return; } - return $this->edit($values, $errors); + $this->edit($values, $errors); } /** @@ -182,7 +183,7 @@ class CommentController extends BaseController $this->flash->failure(t('Unable to remove this comment.')); } - $this->response->redirect($this->helper->url->to('TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), 'comments')); + $this->response->redirect($this->helper->url->to('TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), 'comments'), true); } /** @@ -193,11 +194,7 @@ class CommentController extends BaseController public function toggleSorting() { $task = $this->getTask(); - - $oldDirection = $this->userMetadataCacheDecorator->get(UserMetadataModel::KEY_COMMENT_SORTING_DIRECTION, 'ASC'); - $newDirection = $oldDirection === 'ASC' ? 'DESC' : 'ASC'; - - $this->userMetadataCacheDecorator->set(UserMetadataModel::KEY_COMMENT_SORTING_DIRECTION, $newDirection); + $this->helper->comment->toggleSorting(); $this->response->redirect($this->helper->url->to( 'TaskViewController', diff --git a/app/Controller/CommentListController.php b/app/Controller/CommentListController.php new file mode 100644 index 00000000..63d20663 --- /dev/null +++ b/app/Controller/CommentListController.php @@ -0,0 +1,50 @@ +getProject(); + $task = $this->getTask(); + $commentSortingDirection = $this->userMetadataCacheDecorator->get(UserMetadataModel::KEY_COMMENT_SORTING_DIRECTION, 'ASC'); + + $this->response->html($this->template->render('comment_list/show', array( + 'project' => $project, + 'task' => $task, + 'comments' => $this->commentModel->getAll($task['id'], $commentSortingDirection), + 'editable' => $this->helper->user->hasProjectAccess('CommentController', 'edit', $task['project_id']), + ))); + } + + public function save() + { + $task = $this->getTask(); + $values = $this->request->getValues(); + $values['task_id'] = $task['id']; + $values['user_id'] = $this->userSession->getId(); + + list($valid, ) = $this->commentValidator->validateCreation($values); + + if ($valid && $this->commentModel->create($values) !== false) { + $this->flash->success(t('Comment added successfully.')); + } + + $this->show(); + } + + public function toggleSorting() + { + $this->helper->comment->toggleSorting(); + $this->show(); + } +} diff --git a/app/Core/Helper.php b/app/Core/Helper.php index ab7c3b7b..1b53ae2b 100644 --- a/app/Core/Helper.php +++ b/app/Core/Helper.php @@ -15,6 +15,7 @@ use Pimple\Container; * @property \Kanboard\Helper\AvatarHelper $avatar * @property \Kanboard\Helper\BoardHelper $board * @property \Kanboard\Helper\CalendarHelper $calendar + * @property \Kanboard\Helper\CommentHelper $comment * @property \Kanboard\Helper\DateHelper $dt * @property \Kanboard\Helper\FileHelper $file * @property \Kanboard\Helper\FormHelper $form diff --git a/app/Helper/CommentHelper.php b/app/Helper/CommentHelper.php new file mode 100644 index 00000000..d6426d1a --- /dev/null +++ b/app/Helper/CommentHelper.php @@ -0,0 +1,23 @@ +userMetadataCacheDecorator->get(UserMetadataModel::KEY_COMMENT_SORTING_DIRECTION, 'ASC'); + $newDirection = $oldDirection === 'ASC' ? 'DESC' : 'ASC'; + + $this->userMetadataCacheDecorator->set(UserMetadataModel::KEY_COMMENT_SORTING_DIRECTION, $newDirection); + } +} diff --git a/app/Helper/ModalHelper.php b/app/Helper/ModalHelper.php index efbe2c4d..e8fee99c 100644 --- a/app/Helper/ModalHelper.php +++ b/app/Helper/ModalHelper.php @@ -47,10 +47,10 @@ class ModalHelper extends Base return $this->helper->url->link($html, $controller, $action, $params, false, 'js-modal-large'); } - public function medium($icon, $label, $controller, $action, array $params = array()) + public function medium($icon, $label, $controller, $action, array $params = array(), $title = '') { $html = ''.$label; - return $this->helper->url->link($html, $controller, $action, $params, false, 'js-modal-medium'); + return $this->helper->url->link($html, $controller, $action, $params, false, 'js-modal-medium', $title); } public function small($icon, $label, $controller, $action, array $params = array()) diff --git a/app/Model/CommentModel.php b/app/Model/CommentModel.php index e44a5ecd..ff8d6536 100644 --- a/app/Model/CommentModel.php +++ b/app/Model/CommentModel.php @@ -70,7 +70,7 @@ class CommentModel extends Base UserModel::TABLE.'.avatar_path' ) ->join(UserModel::TABLE, 'id', 'user_id') - ->orderBy(self::TABLE.'.date_modification', $sorting) + ->orderBy(self::TABLE.'.date_creation', $sorting) ->eq(self::TABLE.'.task_id', $task_id) ->findAll(); } diff --git a/app/ServiceProvider/AuthenticationProvider.php b/app/ServiceProvider/AuthenticationProvider.php index 6a9a820e..d315daca 100644 --- a/app/ServiceProvider/AuthenticationProvider.php +++ b/app/ServiceProvider/AuthenticationProvider.php @@ -83,7 +83,8 @@ class AuthenticationProvider implements ServiceProviderInterface $acl->add('CalendarController', 'save', Role::PROJECT_MEMBER); $acl->add('CategoryController', '*', Role::PROJECT_MANAGER); $acl->add('ColumnController', '*', Role::PROJECT_MANAGER); - $acl->add('CommentController', '*', Role::PROJECT_MEMBER); + $acl->add('CommentController', array('create', 'save', 'edit', 'update', 'confirm', 'remove'), Role::PROJECT_MEMBER); + $acl->add('CommentListController', array('save'), Role::PROJECT_MEMBER); $acl->add('CustomFilterController', '*', Role::PROJECT_MEMBER); $acl->add('ExportController', '*', Role::PROJECT_MANAGER); $acl->add('TaskFileController', array('screenshot', 'create', 'save', 'remove', 'confirm'), Role::PROJECT_MEMBER); diff --git a/app/ServiceProvider/HelperProvider.php b/app/ServiceProvider/HelperProvider.php index dcaf81c6..82b175cb 100644 --- a/app/ServiceProvider/HelperProvider.php +++ b/app/ServiceProvider/HelperProvider.php @@ -22,6 +22,7 @@ class HelperProvider implements ServiceProviderInterface $container['helper']->register('calendar', '\Kanboard\Helper\CalendarHelper'); $container['helper']->register('asset', '\Kanboard\Helper\AssetHelper'); $container['helper']->register('board', '\Kanboard\Helper\BoardHelper'); + $container['helper']->register('comment', '\Kanboard\Helper\CommentHelper'); $container['helper']->register('dt', '\Kanboard\Helper\DateHelper'); $container['helper']->register('file', '\Kanboard\Helper\FileHelper'); $container['helper']->register('form', '\Kanboard\Helper\FormHelper'); diff --git a/app/Template/board/task_footer.php b/app/Template/board/task_footer.php index 23f4e32e..4e561f14 100644 --- a/app/Template/board/task_footer.php +++ b/app/Template/board/task_footer.php @@ -95,8 +95,15 @@   - -   + 0): ?> + modal->medium( + 'comments-o', + $task['nb_comments'], + 'CommentListController', + 'show', + array('task_id' => $task['id'], 'project_id' => $task['project_id']), + $task['nb_comments'] == 1 ? t('%d comment', $task['nb_comments']) : t('%d comments', $task['nb_comments']) + ) ?> diff --git a/app/Template/board/task_private.php b/app/Template/board/task_private.php index 3201d4e2..1be64fcf 100644 --- a/app/Template/board/task_private.php +++ b/app/Template/board/task_private.php @@ -28,7 +28,7 @@ text->e($this->user->getInitials($task['assignee_name'] ?: $task['assignee_username'])) ?> - - url->link($this->text->e($task['title']), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'task-board-collapsed-title tooltip', $this->text->e($task['title'])) ?> + text->e($task['title']) ?>
@@ -50,7 +50,7 @@ hook->render('template:board:private:task:before-title', array('task' => $task)) ?>
- url->link($this->text->e($task['title']), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, '', t('View this task')) ?> + text->e($task['title']) ?>
hook->render('template:board:private:task:after-title', array('task' => $task)) ?> diff --git a/app/Template/board/tooltip_comments.php b/app/Template/board/tooltip_comments.php deleted file mode 100644 index a1071848..00000000 --- a/app/Template/board/tooltip_comments.php +++ /dev/null @@ -1,9 +0,0 @@ -
- - render('comment/show', array( - 'comment' => $comment, - 'task' => $task, - 'hide_actions' => true, - )) ?> - -
diff --git a/app/Template/comment/show.php b/app/Template/comment/show.php index f8d9607e..d8470c24 100644 --- a/app/Template/comment/show.php +++ b/app/Template/comment/show.php @@ -9,13 +9,6 @@ dt->datetime($comment['date_creation']) ?> dt->datetime($comment['date_modification']) ?> - -
- -
-
- text->markdown($comment['comment'], isset($is_public) && $is_public) ?> -
@@ -36,4 +29,10 @@ + +
+
+ text->markdown($comment['comment'], isset($is_public) && $is_public) ?> +
+
diff --git a/app/Template/comment_list/create.php b/app/Template/comment_list/create.php new file mode 100644 index 00000000..a1bae5eb --- /dev/null +++ b/app/Template/comment_list/create.php @@ -0,0 +1,8 @@ + +
+ form->csrf() ?> + form->textEditor('comment', array(), array(), array('required' => true)) ?> + modal->submitButtons() ?> +
diff --git a/app/Template/comment_list/show.php b/app/Template/comment_list/show.php new file mode 100644 index 00000000..6e362560 --- /dev/null +++ b/app/Template/comment_list/show.php @@ -0,0 +1,27 @@ + +
+ + render('comment/show', array( + 'comment' => $comment, + 'task' => $task, + 'project' => $project, + 'editable' => $editable, + 'is_public' => isset($is_public) && $is_public, + )) ?> + + + + render('comment_list/create', array( + 'task' => $task, + )) ?> + +
diff --git a/app/Template/comments/create.php b/app/Template/comments/create.php deleted file mode 100644 index 06173575..00000000 --- a/app/Template/comments/create.php +++ /dev/null @@ -1,11 +0,0 @@ -
- form->csrf() ?> - form->hidden('task_id', $values) ?> - form->hidden('user_id', $values) ?> - - form->textEditor('comment', $values, $errors, array('required' => true)) ?> - -
- -
-
diff --git a/app/Template/comments/show.php b/app/Template/comments/show.php deleted file mode 100644 index 3edf7076..00000000 --- a/app/Template/comments/show.php +++ /dev/null @@ -1,35 +0,0 @@ -
-
-

-
-
- -
- - url->icon('sort', t('change sorting'), 'CommentController', 'toggleSorting', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> - -
- - - render('comment/show', array( - 'comment' => $comment, - 'task' => $task, - 'project' => $project, - 'editable' => $editable, - 'is_public' => isset($is_public) && $is_public, - )) ?> - - - - render('comments/create', array( - 'values' => array( - 'user_id' => $this->user->getId(), - 'task_id' => $task['id'], - 'project_id' => $task['project_id'], - ), - 'errors' => array(), - 'task' => $task, - )) ?> - -
-
diff --git a/app/Template/task/public.php b/app/Template/task/public.php index b8405ff7..eb3b9f1d 100644 --- a/app/Template/task/public.php +++ b/app/Template/task/public.php @@ -26,7 +26,7 @@ 'is_public' => true, )) ?> - render('comments/show', array( + render('task_comments/show', array( 'task' => $task, 'comments' => $comments, 'project' => $project, diff --git a/app/Template/task/show.php b/app/Template/task/show.php index a5c2d5a7..565f0632 100644 --- a/app/Template/task/show.php +++ b/app/Template/task/show.php @@ -54,7 +54,7 @@ hook->render('template:task:show:before-comments', array('task' => $task, 'project' => $project)) ?> - render('comments/show', array( + render('task_comments/show', array( 'task' => $task, 'comments' => $comments, 'project' => $project, diff --git a/app/Template/task_comments/create.php b/app/Template/task_comments/create.php new file mode 100644 index 00000000..05b05120 --- /dev/null +++ b/app/Template/task_comments/create.php @@ -0,0 +1,8 @@ +
+ form->csrf() ?> + form->hidden('task_id', $values) ?> + form->hidden('user_id', $values) ?> + + form->textEditor('comment', $values, $errors, array('required' => true)) ?> + modal->submitButtons() ?> +
diff --git a/app/Template/task_comments/show.php b/app/Template/task_comments/show.php new file mode 100644 index 00000000..18200bc8 --- /dev/null +++ b/app/Template/task_comments/show.php @@ -0,0 +1,31 @@ +
+
+

+
+
+ +
+ + url->icon('sort', t('change sorting'), 'CommentController', 'toggleSorting', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> + +
+ + + render('comment/show', array( + 'comment' => $comment, + 'task' => $task, + 'project' => $project, + 'editable' => $editable, + 'is_public' => isset($is_public) && $is_public, + )) ?> + + + + render('task_comments/create', array( + 'values' => array(), + 'errors' => array(), + 'task' => $task, + )) ?> + +
+
-- cgit v1.2.3