summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/Controller/BoardTooltipController.php16
-rw-r--r--app/Controller/CommentController.php21
-rw-r--r--app/Controller/CommentListController.php50
-rw-r--r--app/Core/Helper.php1
-rw-r--r--app/Helper/CommentHelper.php23
-rw-r--r--app/Helper/ModalHelper.php4
-rw-r--r--app/Model/CommentModel.php2
-rw-r--r--app/ServiceProvider/AuthenticationProvider.php3
-rw-r--r--app/ServiceProvider/HelperProvider.php1
-rw-r--r--app/Template/board/task_footer.php11
-rw-r--r--app/Template/board/task_private.php4
-rw-r--r--app/Template/board/tooltip_comments.php9
-rw-r--r--app/Template/comment/show.php13
-rw-r--r--app/Template/comment_list/create.php8
-rw-r--r--app/Template/comment_list/show.php27
-rw-r--r--app/Template/task/public.php2
-rw-r--r--app/Template/task/show.php2
-rw-r--r--app/Template/task_comments/create.php (renamed from app/Template/comments/create.php)5
-rw-r--r--app/Template/task_comments/show.php (renamed from app/Template/comments/show.php)10
19 files changed, 147 insertions, 65 deletions
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
@@ -70,22 +70,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
*
* @access public
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 @@
+<?php
+
+namespace Kanboard\Controller;
+
+use Kanboard\Model\UserMetadataModel;
+
+/**
+ * Class CommentListController
+ *
+ * @package Kanboard\Controller
+ * @author Frederic Guillot
+ */
+class CommentListController extends BaseController
+{
+ public function show()
+ {
+ $project = $this->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 @@
+<?php
+
+namespace Kanboard\Helper;
+
+use Kanboard\Core\Base;
+use Kanboard\Model\UserMetadataModel;
+
+/**
+ * Class CommentHelper
+ *
+ * @package Kanboard\Helper
+ * @author Frederic Guillot
+ */
+class CommentHelper extends Base
+{
+ public function toggleSorting()
+ {
+ $oldDirection = $this->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 = '<i class="fa fa-'.$icon.' fa-fw js-modal-medium" aria-hidden="true"></i>'.$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 @@
<span title="<?= t('Attachments') ?>" class="tooltip" data-href="<?= $this->url->href('BoardTooltipController', 'attachments', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>"><i class="fa fa-paperclip"></i>&nbsp;<?= $task['nb_files'] ?></span>
<?php endif ?>
- <?php if (! empty($task['nb_comments'])): ?>
- <span title="<?= $task['nb_comments'] == 1 ? t('%d comment', $task['nb_comments']) : t('%d comments', $task['nb_comments']) ?>" class="tooltip" data-href="<?= $this->url->href('BoardTooltipController', 'comments', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>"><i class="fa fa-comment-o"></i>&nbsp;<?= $task['nb_comments'] ?></span>
+ <?php if ($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'])
+ ) ?>
<?php endif ?>
<?php if (! empty($task['description'])): ?>
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 @@
<?= $this->text->e($this->user->getInitials($task['assignee_name'] ?: $task['assignee_username'])) ?>
</span> -
<?php endif ?>
- <?= $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']) ?>
</div>
<?php else: ?>
<div class="task-board-expanded">
@@ -50,7 +50,7 @@
<?= $this->hook->render('template:board:private:task:before-title', array('task' => $task)) ?>
<div class="task-board-title">
- <?= $this->url->link($this->text->e($task['title']), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, '', t('View this task')) ?>
+ <?= $this->text->e($task['title']) ?>
</div>
<?= $this->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 @@
-<div class="tooltip-large">
- <?php foreach ($comments as $comment): ?>
- <?= $this->render('comment/show', array(
- 'comment' => $comment,
- 'task' => $task,
- 'hide_actions' => true,
- )) ?>
- <?php endforeach ?>
-</div>
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 @@
<small class="comment-date"><?= t('Created at:') ?> <?= $this->dt->datetime($comment['date_creation']) ?></small>
<small class="comment-date"><?= t('Updated at:')?> <?= $this->dt->datetime($comment['date_modification']) ?></small>
-
- </div>
-
- <div class="comment-content">
- <div class="markdown">
- <?= $this->text->markdown($comment['comment'], isset($is_public) && $is_public) ?>
- </div>
</div>
<?php if (! isset($hide_actions)): ?>
@@ -36,4 +29,10 @@
</ul>
</div>
<?php endif ?>
+
+ <div class="comment-content">
+ <div class="markdown">
+ <?= $this->text->markdown($comment['comment'], isset($is_public) && $is_public) ?>
+ </div>
+ </div>
</div>
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 @@
+<div class="page-header">
+ <h2><?= t('Add a comment') ?></h2>
+</div>
+<form method="post" action="<?= $this->url->href('CommentListController', 'save', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>" autocomplete="off">
+ <?= $this->form->csrf() ?>
+ <?= $this->form->textEditor('comment', array(), array(), array('required' => true)) ?>
+ <?= $this->modal->submitButtons() ?>
+</form>
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 @@
+<div class="page-header">
+ <h2><?= $this->text->e($task['title']) ?> &gt; <?= t('Comments') ?></h2>
+ <?php if (!isset($is_public) || !$is_public): ?>
+ <div class="comment-sorting">
+ <small>
+ <?= $this->url->icon('sort', t('change sorting'), 'CommentListController', 'toggleSorting', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'js-modal-replace') ?>
+ </small>
+ </div>
+ <?php endif ?>
+</div>
+<div class="comments">
+ <?php foreach ($comments as $comment): ?>
+ <?= $this->render('comment/show', array(
+ 'comment' => $comment,
+ 'task' => $task,
+ 'project' => $project,
+ 'editable' => $editable,
+ 'is_public' => isset($is_public) && $is_public,
+ )) ?>
+ <?php endforeach ?>
+
+ <?php if ($editable): ?>
+ <?= $this->render('comment_list/create', array(
+ 'task' => $task,
+ )) ?>
+ <?php endif ?>
+</div>
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,
)) ?>
- <?= $this->render('comments/show', array(
+ <?= $this->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 @@
<?php if (!empty($comments)): ?>
<?= $this->hook->render('template:task:show:before-comments', array('task' => $task, 'project' => $project)) ?>
- <?= $this->render('comments/show', array(
+ <?= $this->render('task_comments/show', array(
'task' => $task,
'comments' => $comments,
'project' => $project,
diff --git a/app/Template/comments/create.php b/app/Template/task_comments/create.php
index 06173575..05b05120 100644
--- a/app/Template/comments/create.php
+++ b/app/Template/task_comments/create.php
@@ -4,8 +4,5 @@
<?= $this->form->hidden('user_id', $values) ?>
<?= $this->form->textEditor('comment', $values, $errors, array('required' => true)) ?>
-
- <div class="form-actions">
- <button type="submit" class="btn btn-blue"><?= t('Save') ?></button>
- </div>
+ <?= $this->modal->submitButtons() ?>
</form>
diff --git a/app/Template/comments/show.php b/app/Template/task_comments/show.php
index 3edf7076..18200bc8 100644
--- a/app/Template/comments/show.php
+++ b/app/Template/task_comments/show.php
@@ -2,7 +2,7 @@
<div class="accordion-title">
<h3><a href="#" class="fa accordion-toggle"></a> <?= t('Comments') ?></h3>
</div>
- <div class="accordion-content" id="comments">
+ <div class="accordion-content comments" id="comments">
<?php if (!isset($is_public) || !$is_public): ?>
<div class="comment-sorting">
<small>
@@ -21,12 +21,8 @@
<?php endforeach ?>
<?php if ($editable): ?>
- <?= $this->render('comments/create', array(
- 'values' => array(
- 'user_id' => $this->user->getId(),
- 'task_id' => $task['id'],
- 'project_id' => $task['project_id'],
- ),
+ <?= $this->render('task_comments/create', array(
+ 'values' => array(),
'errors' => array(),
'task' => $task,
)) ?>