Use inline popup to create new columns

This commit is contained in:
Frederic Guillot
2016-02-20 10:46:10 -05:00
parent 6d09bfc96e
commit 2d27c36a71
5 changed files with 105 additions and 70 deletions

View File

@@ -11,6 +11,7 @@ New features:
Improvements: Improvements:
* Use inline popup to create new columns
* Improve filter box design * Improve filter box design
* Improve image thumbnails and files table * Improve image thumbnails and files table
* Add confirmation inline popup to remove custom filter * Add confirmation inline popup to remove custom filter

View File

@@ -15,54 +15,62 @@ class Column extends Base
* *
* @access public * @access public
*/ */
public function index(array $values = array(), array $errors = array()) public function index()
{ {
$project = $this->getProject(); $project = $this->getProject();
$columns = $this->board->getColumns($project['id']); $columns = $this->board->getColumns($project['id']);
foreach ($columns as $column) {
$values['title['.$column['id'].']'] = $column['title'];
$values['description['.$column['id'].']'] = $column['description'];
$values['task_limit['.$column['id'].']'] = $column['task_limit'] ?: null;
}
$this->response->html($this->helper->layout->project('column/index', array( $this->response->html($this->helper->layout->project('column/index', array(
'errors' => $errors,
'values' => $values + array('project_id' => $project['id']),
'columns' => $columns, 'columns' => $columns,
'project' => $project, 'project' => $project,
'title' => t('Edit board') 'title' => t('Edit board')
))); )));
} }
/**
* Show form to create a new column
*
* @access public
*/
public function create(array $values = array(), array $errors = array())
{
$project = $this->getProject();
$columns = $this->board->getColumnsList($project['id']);
if (empty($values)) {
$values = array('project_id' => $project['id']);
}
$this->response->html($this->template->render('column/create', array(
'values' => $values,
'errors' => $errors,
'project' => $project,
'title' => t('Add a new column')
)));
}
/** /**
* Validate and add a new column * Validate and add a new column
* *
* @access public * @access public
*/ */
public function create() public function save()
{ {
$project = $this->getProject(); $project = $this->getProject();
$columns = $this->board->getColumnsList($project['id']); $values = $this->request->getValues();
$data = $this->request->getValues();
$values = array();
foreach ($columns as $column_id => $column_title) { list($valid, $errors) = $this->columnValidator->validateCreation($values);
$values['title['.$column_id.']'] = $column_title;
}
list($valid, $errors) = $this->columnValidator->validateCreation($data);
if ($valid) { if ($valid) {
if ($this->board->addColumn($project['id'], $data['title'], $data['task_limit'], $data['description'])) { if ($this->board->addColumn($project['id'], $values['title'], $values['task_limit'], $values['description'])) {
$this->flash->success(t('Board updated successfully.')); $this->flash->success(t('Column created successfully.'));
$this->response->redirect($this->helper->url->to('column', 'index', array('project_id' => $project['id']))); return $this->response->redirect($this->helper->url->to('column', 'index', array('project_id' => $project['id'])), true);
} else { } else {
$this->flash->failure(t('Unable to update this board.')); $errors['title'] = array(t('Another column with the same title exists in the project'));
} }
} }
$this->index($values, $errors); $this->create($values, $errors);
} }
/** /**

View File

@@ -0,0 +1,41 @@
<div class="page-header">
<h2><?= t('Add a new column') ?></h2>
</div>
<form class="popover-form" method="post" action="<?= $this->url->href('Column', 'save', array('project_id' => $project['id'])) ?>" autocomplete="off">
<?= $this->form->csrf() ?>
<?= $this->form->hidden('project_id', $values) ?>
<?= $this->form->label(t('Title'), 'title') ?>
<?= $this->form->text('title', $values, $errors, array('autofocus', 'required', 'maxlength="50"')) ?>
<?= $this->form->label(t('Task limit'), 'task_limit') ?>
<?= $this->form->number('task_limit', $values, $errors) ?>
<?= $this->form->label(t('Description'), 'description') ?>
<div class="form-tabs">
<div class="write-area">
<?= $this->form->textarea('description', $values, $errors) ?>
</div>
<div class="preview-area">
<div class="markdown"></div>
</div>
<ul class="form-tabs-nav">
<li class="form-tab form-tab-selected">
<i class="fa fa-pencil-square-o fa-fw"></i><a id="markdown-write" href="#"><?= t('Write') ?></a>
</li>
<li class="form-tab">
<a id="markdown-preview" href="#"><i class="fa fa-eye fa-fw"></i><?= t('Preview') ?></a>
</li>
</ul>
</div>
<div class="form-help"><?= $this->url->doc(t('Write your text in Markdown'), 'syntax-guide') ?></div>
<div class="form-actions">
<input type="submit" value="<?= t('Add this column') ?>" class="btn btn-blue">
<?= t('or') ?>
<?= $this->url->link(t('cancel'), 'column', 'index', array('project_id' => $project['id']), false, 'close-popover') ?>
</div>
</form>

View File

@@ -1,5 +1,11 @@
<div class="page-header"> <div class="page-header">
<h2><?= t('Edit the board for "%s"', $project['name']) ?></h2> <h2><?= t('Edit the board for "%s"', $project['name']) ?></h2>
<ul>
<li>
<i class="fa fa-plus fa-fw"></i>
<?= $this->url->link(t('Add a new column'), 'Column', 'create', array('project_id' => $project['id']), false, 'popover') ?>
</li>
</ul>
</div> </div>
<?php if (! empty($columns)): ?> <?php if (! empty($columns)): ?>
@@ -52,41 +58,3 @@
</table> </table>
<?php endif ?> <?php endif ?>
<h3><?= t('Add a new column') ?></h3>
<form method="post" action="<?= $this->url->href('column', 'create', array('project_id' => $project['id'])) ?>" autocomplete="off">
<?= $this->form->csrf() ?>
<?= $this->form->hidden('project_id', $values) ?>
<?= $this->form->label(t('Title'), 'title') ?>
<?= $this->form->text('title', $values, $errors, array('required', 'maxlength="50"')) ?>
<?= $this->form->label(t('Task limit'), 'task_limit') ?>
<?= $this->form->number('task_limit', $values, $errors) ?>
<?= $this->form->label(t('Description'), 'description') ?>
<div class="form-tabs">
<div class="write-area">
<?= $this->form->textarea('description', $values, $errors) ?>
</div>
<div class="preview-area">
<div class="markdown"></div>
</div>
<ul class="form-tabs-nav">
<li class="form-tab form-tab-selected">
<i class="fa fa-pencil-square-o fa-fw"></i><a id="markdown-write" href="#"><?= t('Write') ?></a>
</li>
<li class="form-tab">
<a id="markdown-preview" href="#"><i class="fa fa-eye fa-fw"></i><?= t('Preview') ?></a>
</li>
</ul>
</div>
<div class="form-help"><?= $this->url->doc(t('Write your text in Markdown'), 'syntax-guide') ?></div>
<div class="form-actions">
<input type="submit" value="<?= t('Add this column') ?>" class="btn btn-blue">
</div>
</form>

View File

@@ -22,11 +22,12 @@ class ColumnValidator extends Base
*/ */
public function validateModification(array $values) public function validateModification(array $values)
{ {
$v = new Validator($values, array( $rules = array(
new Validators\Integer('task_limit', t('This value must be an integer')), new Validators\Required('id', t('This value is required')),
new Validators\Required('title', t('The title is required')), new Validators\Integer('id', t('This value must be an integer')),
new Validators\MaxLength('title', t('The maximum length is %d characters', 50), 50), );
));
$v = new Validator($values, array_merge($rules, $this->commonValidationRules()));
return array( return array(
$v->execute(), $v->execute(),
@@ -43,16 +44,32 @@ class ColumnValidator extends Base
*/ */
public function validateCreation(array $values) public function validateCreation(array $values)
{ {
$v = new Validator($values, array( $rules = array(
new Validators\Required('project_id', t('The project id is required')), new Validators\Required('project_id', t('The project id is required')),
new Validators\Integer('project_id', t('This value must be an integer')), new Validators\Integer('project_id', t('This value must be an integer')),
new Validators\Required('title', t('The title is required')), );
new Validators\MaxLength('title', t('The maximum length is %d characters', 50), 50),
)); $v = new Validator($values, array_merge($rules, $this->commonValidationRules()));
return array( return array(
$v->execute(), $v->execute(),
$v->getErrors() $v->getErrors()
); );
} }
/**
* Common validation rules
*
* @access private
* @return array
*/
private function commonValidationRules()
{
return array(
new Validators\Integer('task_limit', t('This value must be an integer')),
new Validators\GreaterThan('task_limit', t('This value must be greater than %d', -1), -1),
new Validators\Required('title', t('The title is required')),
new Validators\MaxLength('title', t('The maximum length is %d characters', 50), 50),
);
}
} }