From abcfd02067b348e1c86f61e7545b93f87ea89569 Mon Sep 17 00:00:00 2001 From: Frederic Guillot Date: Sun, 24 Jan 2016 18:15:21 -0500 Subject: Split project edition into multiple pages --- app/Controller/Project.php | 52 ----------- app/Controller/ProjectEdit.php | 115 +++++++++++++++++++++++++ app/ServiceProvider/AuthenticationProvider.php | 3 +- app/ServiceProvider/RouteProvider.php | 6 +- app/Template/activity/project.php | 2 +- app/Template/analytic/layout.php | 2 +- app/Template/app/projects.php | 2 +- app/Template/custom_filter/add.php | 4 +- app/Template/custom_filter/edit.php | 6 +- app/Template/project/dropdown.php | 2 +- app/Template/project/edit.php | 58 ------------- app/Template/project/sidebar.php | 6 +- app/Template/project_edit/dates.php | 25 ++++++ app/Template/project_edit/description.php | 36 ++++++++ app/Template/project_edit/general.php | 35 ++++++++ app/Template/task/layout.php | 2 +- 16 files changed, 231 insertions(+), 125 deletions(-) create mode 100644 app/Controller/ProjectEdit.php delete mode 100644 app/Template/project/edit.php create mode 100644 app/Template/project_edit/dates.php create mode 100644 app/Template/project_edit/description.php create mode 100644 app/Template/project_edit/general.php (limited to 'app') diff --git a/app/Controller/Project.php b/app/Controller/Project.php index 836bfb45..ffd62b09 100644 --- a/app/Controller/Project.php +++ b/app/Controller/Project.php @@ -132,58 +132,6 @@ class Project extends Base ))); } - /** - * Display a form to edit a project - * - * @access public - */ - public function edit(array $values = array(), array $errors = array()) - { - $project = $this->getProject(); - - $this->response->html($this->projectLayout('project/edit', array( - 'values' => empty($values) ? $project : $values, - 'errors' => $errors, - 'project' => $project, - 'owners' => $this->projectUserRole->getAssignableUsersList($project['id'], true), - 'title' => t('Edit project') - ))); - } - - /** - * Validate and update a project - * - * @access public - */ - public function update() - { - $project = $this->getProject(); - $values = $this->request->getValues(); - - if (isset($values['is_private'])) { - if (! $this->helper->user->hasProjectAccess('project', 'create', $project['id'])) { - unset($values['is_private']); - } - } elseif ($project['is_private'] == 1 && ! isset($values['is_private'])) { - if ($this->helper->user->hasProjectAccess('project', 'create', $project['id'])) { - $values += array('is_private' => 0); - } - } - - list($valid, $errors) = $this->projectValidator->validateModification($values); - - if ($valid) { - if ($this->project->update($values)) { - $this->flash->success(t('Project updated successfully.')); - $this->response->redirect($this->helper->url->to('project', 'edit', array('project_id' => $project['id']))); - } else { - $this->flash->failure(t('Unable to update this project.')); - } - } - - $this->edit($values, $errors); - } - /** * Remove a project * diff --git a/app/Controller/ProjectEdit.php b/app/Controller/ProjectEdit.php new file mode 100644 index 00000000..3b0a3da3 --- /dev/null +++ b/app/Controller/ProjectEdit.php @@ -0,0 +1,115 @@ +renderView('project_edit/general', $values, $errors); + } + + /** + * Change start and end dates + * + * @access public + */ + public function dates(array $values = array(), array $errors = array()) + { + $this->renderView('project_edit/dates', $values, $errors); + } + + /** + * Change project description + * + * @access public + */ + public function description(array $values = array(), array $errors = array()) + { + $this->renderView('project_edit/description', $values, $errors); + } + + /** + * Validate and update a project + * + * @access public + */ + public function update() + { + $project = $this->getProject(); + $values = $this->request->getValues(); + $redirect = $this->request->getStringParam('redirect', 'edit'); + + $values = $this->prepareValues($redirect, $project, $values); + list($valid, $errors) = $this->projectValidator->validateModification($values); + + if ($valid) { + if ($this->project->update($values)) { + $this->flash->success(t('Project updated successfully.')); + $this->response->redirect($this->helper->url->to('ProjectEdit', $redirect, array('project_id' => $project['id']))); + } else { + $this->flash->failure(t('Unable to update this project.')); + } + } + + $this->$redirect($values, $errors); + } + + /** + * Prepare form values + * + * @access private + * @param string $redirect + * @param array $project + * @param array $values + * @return array + */ + private function prepareValues($redirect, array $project, array $values) + { + if ($redirect === 'edit') { + if (isset($values['is_private'])) { + if (! $this->helper->user->hasProjectAccess('project', 'create', $project['id'])) { + unset($values['is_private']); + } + } elseif ($project['is_private'] == 1 && ! isset($values['is_private'])) { + if ($this->helper->user->hasProjectAccess('project', 'create', $project['id'])) { + $values += array('is_private' => 0); + } + } + } + + return $values; + } + + /** + * Common metthod to render different views + * + * @access private + * @param string $template + * @param array $values + * @param array $errors + */ + private function renderView($template, array $values, array $errors) + { + $project = $this->getProject(); + + $this->response->html($this->projectLayout($template, array( + 'owners' => $this->projectUserRole->getAssignableUsersList($project['id'], true), + 'values' => empty($values) ? $project : $values, + 'errors' => $errors, + 'project' => $project, + 'title' => t('Edit project') + ))); + } +} diff --git a/app/ServiceProvider/AuthenticationProvider.php b/app/ServiceProvider/AuthenticationProvider.php index 7617ba95..a516cffe 100644 --- a/app/ServiceProvider/AuthenticationProvider.php +++ b/app/ServiceProvider/AuthenticationProvider.php @@ -93,8 +93,9 @@ class AuthenticationProvider implements ServiceProviderInterface $acl->add('Export', '*', Role::PROJECT_MANAGER); $acl->add('File', array('screenshot', 'create', 'save', 'remove', 'confirm'), Role::PROJECT_MEMBER); $acl->add('Gantt', '*', Role::PROJECT_MANAGER); - $acl->add('Project', array('share', 'integrations', 'notifications', 'edit', 'update', 'duplicate', 'disable', 'enable', 'remove'), Role::PROJECT_MANAGER); + $acl->add('Project', array('share', 'integrations', 'notifications', 'duplicate', 'disable', 'enable', 'remove'), Role::PROJECT_MANAGER); $acl->add('ProjectPermission', '*', Role::PROJECT_MANAGER); + $acl->add('ProjectEdit', '*', Role::PROJECT_MANAGER); $acl->add('Projectuser', '*', Role::PROJECT_MANAGER); $acl->add('Subtask', '*', Role::PROJECT_MEMBER); $acl->add('Swimlane', '*', Role::PROJECT_MANAGER); diff --git a/app/ServiceProvider/RouteProvider.php b/app/ServiceProvider/RouteProvider.php index ce66090b..5a5c8652 100644 --- a/app/ServiceProvider/RouteProvider.php +++ b/app/ServiceProvider/RouteProvider.php @@ -52,7 +52,6 @@ class RouteProvider implements ServiceProviderInterface $container['route']->addRoute('project/:project_id/customer-filter', 'customfilter', 'index'); $container['route']->addRoute('project/:project_id/share', 'project', 'share'); $container['route']->addRoute('project/:project_id/notifications', 'project', 'notifications'); - $container['route']->addRoute('project/:project_id/edit', 'project', 'edit'); $container['route']->addRoute('project/:project_id/integrations', 'project', 'integrations'); $container['route']->addRoute('project/:project_id/duplicate', 'project', 'duplicate'); $container['route']->addRoute('project/:project_id/remove', 'project', 'remove'); @@ -61,6 +60,11 @@ class RouteProvider implements ServiceProviderInterface $container['route']->addRoute('project/:project_id/permissions', 'ProjectPermission', 'index'); $container['route']->addRoute('project/:project_id/import', 'taskImport', 'step1'); + // ProjectEdit routes + $container['route']->addRoute('project/:project_id/edit', 'ProjectEdit', 'edit'); + $container['route']->addRoute('project/:project_id/edit/dates', 'ProjectEdit', 'dates'); + $container['route']->addRoute('project/:project_id/edit/description', 'ProjectEdit', 'description'); + // ProjectUser routes $container['route']->addRoute('projects/managers/:user_id', 'projectuser', 'managers'); $container['route']->addRoute('projects/members/:user_id', 'projectuser', 'members'); diff --git a/app/Template/activity/project.php b/app/Template/activity/project.php index 34be06f5..ba6d6629 100644 --- a/app/Template/activity/project.php +++ b/app/Template/activity/project.php @@ -19,7 +19,7 @@ url->link(t('Back to the calendar'), 'calendar', 'show', array('project_id' => $project['id'])) ?> - user->hasProjectAccess('project', 'edit', $project['id'])): ?> + user->hasProjectAccess('ProjectEdit', 'edit', $project['id'])): ?>
  • url->link(t('Project settings'), 'project', 'show', array('project_id' => $project['id'])) ?> diff --git a/app/Template/analytic/layout.php b/app/Template/analytic/layout.php index 3bb6ff6e..ff532fc0 100644 --- a/app/Template/analytic/layout.php +++ b/app/Template/analytic/layout.php @@ -19,7 +19,7 @@ url->link(t('Back to the calendar'), 'calendar', 'show', array('project_id' => $project['id'])) ?>
  • - user->hasProjectAccess('project', 'edit', $project['id'])): ?> + user->hasProjectAccess('ProjectEdit', 'edit', $project['id'])): ?>
  • url->link(t('Project settings'), 'project', 'show', array('project_id' => $project['id'])) ?> diff --git a/app/Template/app/projects.php b/app/Template/app/projects.php index 82a41123..61899c96 100644 --- a/app/Template/app/projects.php +++ b/app/Template/app/projects.php @@ -22,7 +22,7 @@ - user->hasProjectAccess('project', 'edit', $project['id'])): ?> + user->hasProjectAccess('gantt', 'project', $project['id'])): ?> url->link('', 'gantt', 'project', array('project_id' => $project['id']), false, 'dashboard-table-link', t('Gantt chart')) ?> diff --git a/app/Template/custom_filter/add.php b/app/Template/custom_filter/add.php index b0778b8e..361083ee 100644 --- a/app/Template/custom_filter/add.php +++ b/app/Template/custom_filter/add.php @@ -12,10 +12,10 @@ form->label(t('Filter'), 'filter') ?> form->text('filter', $values, $errors, array('required', 'maxlength="100"')) ?> - user->hasProjectAccess('project', 'edit', $project['id'])): ?> + user->hasProjectAccess('ProjectEdit', 'edit', $project['id'])): ?> form->checkbox('is_shared', t('Share with all project members'), 1) ?> - + form->checkbox('append', t('Append filter (instead of replacement)'), 1) ?>
    diff --git a/app/Template/custom_filter/edit.php b/app/Template/custom_filter/edit.php index 683d2802..adae6b4f 100644 --- a/app/Template/custom_filter/edit.php +++ b/app/Template/custom_filter/edit.php @@ -16,14 +16,14 @@ form->label(t('Filter'), 'filter') ?> form->text('filter', $values, $errors, array('required', 'maxlength="100"')) ?> - user->hasProjectAccess('project', 'edit', $project['id'])): ?> + user->hasProjectAccess('ProjectEdit', 'edit', $project['id'])): ?> form->checkbox('is_shared', t('Share with all project members'), 1, $values['is_shared'] == 1) ?> form->hidden('is_shared', $values) ?> - + form->checkbox('append', t('Append filter (instead of replacement)'), 1, $values['append'] == 1) ?> - +
    diff --git a/app/Template/project/dropdown.php b/app/Template/project/dropdown.php index 9ef7cfb4..980f9a44 100644 --- a/app/Template/project/dropdown.php +++ b/app/Template/project/dropdown.php @@ -32,7 +32,7 @@
  • -user->hasProjectAccess('project', 'edit', $project['id'])): ?> +user->hasProjectAccess('ProjectEdit', 'edit', $project['id'])): ?>
  •   url->link(t('Settings'), 'project', 'show', array('project_id' => $project['id'])) ?> diff --git a/app/Template/project/edit.php b/app/Template/project/edit.php deleted file mode 100644 index 3a273f32..00000000 --- a/app/Template/project/edit.php +++ /dev/null @@ -1,58 +0,0 @@ - -
    - - form->csrf() ?> - form->hidden('id', $values) ?> - - form->label(t('Name'), 'name') ?> - form->text('name', $values, $errors, array('required', 'maxlength="50"')) ?> - - form->label(t('Identifier'), 'identifier') ?> - form->text('identifier', $values, $errors, array('maxlength="50"')) ?> -

    - - form->label(t('Project owner'), 'owner_id') ?> - form->select('owner_id', $owners, $values, $errors) ?> - -
    - form->label(t('Start date'), 'start_date') ?> - form->text('start_date', $values, $errors, array('maxlength="10"'), 'form-date') ?> - - form->label(t('End date'), 'end_date') ?> - form->text('end_date', $values, $errors, array('maxlength="10"'), 'form-date') ?> -

    - - user->hasProjectAccess('project', 'create', $project['id'])): ?> -
    - form->checkbox('is_private', t('Private project'), 1, $project['is_private'] == 1) ?> -

    - - -
    - form->label(t('Description'), 'description') ?> - -
    - -
    - form->textarea('description', $values, $errors) ?> -
    -
    -
    -
    -
      -
    • - -
    • -
    • - -
    • -
    -
    -
    url->doc(t('Write your text in Markdown'), 'syntax-guide') ?>
    - -
    - -
    -
    diff --git a/app/Template/project/sidebar.php b/app/Template/project/sidebar.php index e798195d..2f2ce3ce 100644 --- a/app/Template/project/sidebar.php +++ b/app/Template/project/sidebar.php @@ -10,9 +10,9 @@
  • - user->hasProjectAccess('project', 'edit', $project['id'])): ?> -
  • app->checkMenuSelection('project', 'edit') ?>> - url->link(t('Edit project'), 'project', 'edit', array('project_id' => $project['id'])) ?> + user->hasProjectAccess('ProjectEdit', 'edit', $project['id'])): ?> +
  • app->checkMenuSelection('ProjectEdit', 'edit') ?>> + url->link(t('Edit project'), 'ProjectEdit', 'edit', array('project_id' => $project['id'])) ?>
  • app->checkMenuSelection('project', 'share') ?>> url->link(t('Public access'), 'project', 'share', array('project_id' => $project['id'])) ?> diff --git a/app/Template/project_edit/dates.php b/app/Template/project_edit/dates.php new file mode 100644 index 00000000..d3f4bad8 --- /dev/null +++ b/app/Template/project_edit/dates.php @@ -0,0 +1,25 @@ + +
    + form->csrf() ?> + form->hidden('id', $values) ?> + form->hidden('name', $values) ?> + + form->label(t('Start date'), 'start_date') ?> + form->text('start_date', $values, $errors, array('maxlength="10"'), 'form-date') ?> + + form->label(t('End date'), 'end_date') ?> + form->text('end_date', $values, $errors, array('maxlength="10"'), 'form-date') ?> + +
    + +
    +
    + +

    diff --git a/app/Template/project_edit/description.php b/app/Template/project_edit/description.php new file mode 100644 index 00000000..3af484d5 --- /dev/null +++ b/app/Template/project_edit/description.php @@ -0,0 +1,36 @@ + +
    + form->csrf() ?> + form->hidden('id', $values) ?> + form->hidden('name', $values) ?> + + form->label(t('Description'), 'description') ?> +
    +
    + form->textarea('description', $values, $errors) ?> +
    +
    +
    +
    +
      +
    • + +
    • +
    • + +
    • +
    +
    +
    url->doc(t('Write your text in Markdown'), 'syntax-guide') ?>
    + +
    + +
    +
    diff --git a/app/Template/project_edit/general.php b/app/Template/project_edit/general.php new file mode 100644 index 00000000..1da913da --- /dev/null +++ b/app/Template/project_edit/general.php @@ -0,0 +1,35 @@ + +
    + form->csrf() ?> + form->hidden('id', $values) ?> + + form->label(t('Name'), 'name') ?> + form->text('name', $values, $errors, array('required', 'maxlength="50"')) ?> + + form->label(t('Identifier'), 'identifier') ?> + form->text('identifier', $values, $errors, array('maxlength="50"')) ?> +

    + +
    +
    + form->label(t('Project owner'), 'owner_id') ?> + form->select('owner_id', $owners, $values, $errors) ?> +
    + + user->hasProjectAccess('project', 'create', $project['id'])): ?> +
    + form->checkbox('is_private', t('Private project'), 1, $project['is_private'] == 1) ?> +

    + + +
    + +
    +
    diff --git a/app/Template/task/layout.php b/app/Template/task/layout.php index 0ceb9706..9fe1a716 100644 --- a/app/Template/task/layout.php +++ b/app/Template/task/layout.php @@ -9,7 +9,7 @@ url->link(t('Back to the calendar'), 'calendar', 'show', array('project_id' => $task['project_id'])) ?>
  • - user->hasProjectAccess('project', 'edit', $task['project_id'])): ?> + user->hasProjectAccess('ProjectEdit', 'edit', $task['project_id'])): ?>
  • url->link(t('Project settings'), 'project', 'show', array('project_id' => $task['project_id'])) ?> -- cgit v1.2.3