diff --git a/ChangeLog b/ChangeLog index c18611585..d267ea8ed 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,7 @@ Version 1.0.39 (unreleased) Improvements: +* Open comments in board view with a modal dialog instead of tooltip * Improve card icons alignment on board * Adjust modal dialog width on mobile devices * Add priority column in list view diff --git a/app/Controller/BoardTooltipController.php b/app/Controller/BoardTooltipController.php index 79b9b509f..7bee8dab4 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 526bd2bf9..9a89103ee 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 000000000..63d206634 --- /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 ab7c3b7bd..1b53ae2bc 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 000000000..d6426d1a5 --- /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 efbe2c4d0..e8fee99c1 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 e44a5ecd4..ff8d65369 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 6a9a820e4..d315daca4 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 dcaf81c60..82b175cbb 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 23f4e32e9..4e561f144 100644 --- a/app/Template/board/task_footer.php +++ b/app/Template/board/task_footer.php @@ -95,8 +95,15 @@ = $task['nb_files'] ?> - - = $task['nb_comments'] ?> + 0): ?> + = $this->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 3201d4e2c..1be64fcf9 100644 --- a/app/Template/board/task_private.php +++ b/app/Template/board/task_private.php @@ -28,7 +28,7 @@ = $this->text->e($this->user->getInitials($task['assignee_name'] ?: $task['assignee_username'])) ?> - - = $this->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'])) ?> + = $this->text->e($task['title']) ?>
- -"+$(this.options.container).data("label-"+a)+"
"+i[0].outerHTML}}}return e},Kanboard.Gantt.prototype.getBarTooltip=function(t){var e="";return t.not_defined?e=$(this.options.container).data("label-not-defined"):("task"==t.type&&(e=""+t.progress+""+$(this.options.container).data("label-"+a)+"
"+i[0].outerHTML}}}return e},Kanboard.Gantt.prototype.getBarTooltip=function(t){var e="";return t.not_defined?e=$(this.options.container).data("label-not-defined"):("task"==t.type&&(e=""+t.progress+"