diff --git a/ChangeLog b/ChangeLog index 7aef3a9bd..6fadf5617 100644 --- a/ChangeLog +++ b/ChangeLog @@ -6,6 +6,10 @@ Breaking changes: * Remove feature "Allow everybody to access to this project" (You must define members and groups) * Composer dependencies are now included in the repository (except development dependencies) +New features: + +* Add predefined templates for task descriptions + Improvements: * You can get an archive of Kanboard by using the download button in Github or the command git archive diff --git a/app/Controller/PredefinedTaskDescriptionController.php b/app/Controller/PredefinedTaskDescriptionController.php new file mode 100644 index 000000000..1b7eca124 --- /dev/null +++ b/app/Controller/PredefinedTaskDescriptionController.php @@ -0,0 +1,116 @@ +getProject(); + + $this->response->html($this->template->render('predefined_task_description/create', array( + 'values' => $values, + 'errors' => $errors, + 'project' => $project, + ))); + } + + public function save() + { + $project = $this->getProject(); + $values = $this->request->getValues(); + + list($valid, $errors) = $this->predefinedTaskDescriptionValidator->validate($values); + + if ($valid) { + if ($this->predefinedTaskDescriptionModel->create($project['id'], $values['title'], $values['description']) !== false) { + $this->flash->success(t('Template created successfully.')); + } else { + $this->flash->failure(t('Unable to create this template.')); + } + + $this->response->redirect($this->helper->url->to('ProjectPredefinedContentController', 'show', array('project_id' => $project['id'])), true); + } else { + $this->create($values, $errors); + } + } + + public function edit(array $values = array(), array $errors = array()) + { + $project = $this->getProject(); + $template = $this->predefinedTaskDescriptionModel->getById($project['id'], $this->request->getIntegerParam('id')); + + $this->response->html($this->template->render('predefined_task_description/edit', array( + 'values' => empty($values) ? $template : $values, + 'template' => $template, + 'errors' => $errors, + 'project' => $project, + ))); + } + + public function update() + { + $project = $this->getProject(); + $template = $this->getTemplate($project); + $values = $this->request->getValues(); + + list($valid, $errors) = $this->predefinedTaskDescriptionValidator->validate($values); + + if ($valid) { + if ($this->predefinedTaskDescriptionModel->update($project['id'], $template['id'], $values['title'], $values['description']) !== false) { + $this->flash->success(t('Template updated successfully.')); + } else { + $this->flash->failure(t('Unable to update this template.')); + } + + $this->response->redirect($this->helper->url->to('ProjectPredefinedContentController', 'show', array('project_id' => $project['id'])), true); + } else { + $this->edit($values, $errors); + } + } + + public function confirm() + { + $project = $this->getProject(); + $template = $this->getTemplate($project); + + $this->response->html($this->template->render('predefined_task_description/remove', array( + 'template' => $template, + 'project' => $project, + ))); + } + + public function remove() + { + $this->checkCSRFParam(); + $project = $this->getProject(); + $template = $this->getTemplate($project); + + if ($this->predefinedTaskDescriptionModel->remove($project['id'], $template['id'])) { + $this->flash->success(t('Template removed successfully.')); + } else { + $this->flash->failure(t('Unable to remove this template.')); + } + + $this->response->redirect($this->helper->url->to('ProjectPredefinedContentController', 'show', array('project_id' => $project['id'])), true); + } + + protected function getTemplate(array $project) + { + $template = $this->predefinedTaskDescriptionModel->getById($project['id'], $this->request->getIntegerParam('id')); + + if (empty($template)) { + throw new PageNotFoundException(); + } + + return $template; + } +} \ No newline at end of file diff --git a/app/Controller/ProjectPredefinedContentController.php b/app/Controller/ProjectPredefinedContentController.php index 1195dfa3b..709d6b795 100644 --- a/app/Controller/ProjectPredefinedContentController.php +++ b/app/Controller/ProjectPredefinedContentController.php @@ -10,13 +10,6 @@ namespace Kanboard\Controller; */ class ProjectPredefinedContentController extends BaseController { - /** - * Edit project - * - * @access public - * @param array $values - * @param array $errors - */ public function show(array $values = array(), array $errors = array()) { $project = $this->getProject(); @@ -25,15 +18,11 @@ class ProjectPredefinedContentController extends BaseController 'values' => empty($values) ? $project : $values, 'errors' => $errors, 'project' => $project, - 'title' => t('Predefined Contents') + 'predefined_task_descriptions' => $this->predefinedTaskDescriptionModel->getAll($project['id']), + 'title' => t('Predefined Contents'), ))); } - /** - * Validate and update a project - * - * @access public - */ public function update() { $project = $this->getProject(); diff --git a/app/Core/Base.php b/app/Core/Base.php index bf89c00f2..4e553746e 100644 --- a/app/Core/Base.php +++ b/app/Core/Base.php @@ -105,6 +105,7 @@ use Pimple\Container; * @property \Kanboard\Model\LinkModel $linkModel * @property \Kanboard\Model\NotificationModel $notificationModel * @property \Kanboard\Model\PasswordResetModel $passwordResetModel + * @property \Kanboard\Model\PredefinedTaskDescriptionModel $predefinedTaskDescriptionModel * @property \Kanboard\Model\ProjectModel $projectModel * @property \Kanboard\Model\ProjectActivityModel $projectActivityModel * @property \Kanboard\Model\ProjectDuplicationModel $projectDuplicationModel @@ -179,6 +180,7 @@ use Pimple\Container; * @property \Kanboard\Validator\TaskLinkValidator $taskLinkValidator * @property \Kanboard\Validator\TaskValidator $taskValidator * @property \Kanboard\Validator\UserValidator $userValidator + * @property \Kanboard\Validator\PredefinedTaskDescriptionValidator $predefinedTaskDescriptionValidator * @property \Kanboard\Import\TaskImport $taskImport * @property \Kanboard\Import\UserImport $userImport * @property \Kanboard\Export\SubtaskExport $subtaskExport diff --git a/app/Helper/TaskHelper.php b/app/Helper/TaskHelper.php index b105eaec7..43347a6d7 100644 --- a/app/Helper/TaskHelper.php +++ b/app/Helper/TaskHelper.php @@ -61,6 +61,30 @@ class TaskHelper extends Base return $this->helper->form->textEditor('description', $values, $errors, array('tabindex' => 2)); } + public function renderDescriptionTemplateDropdown($projectId) + { + $templates = $this->predefinedTaskDescriptionModel->getAll($projectId); + + if (! empty($templates)) { + $html = '
+ = t('Do you really want to remove this template? "%s"', $template['title']) ?> +
+ + = $this->modal->confirmButtons( + 'PredefinedTaskDescriptionController', + 'remove', + array('project_id' => $project['id'], 'id' => $template['id']) + ) ?> +