Add task links (Merge pull-request #610)

This commit is contained in:
Frederic Guillot
2015-02-13 17:50:20 -05:00
parent 124f7cad28
commit 364382b1b5
38 changed files with 1769 additions and 41 deletions

View File

@@ -100,7 +100,7 @@
<?php endif ?>
<?php if (! empty($task['date_due']) || ! empty($task['nb_files']) || ! empty($task['nb_comments']) || ! empty($task['description']) || ! empty($task['nb_subtasks'])): ?>
<?php if (! empty($task['date_due']) || ! empty($task['nb_files']) || ! empty($task['nb_comments']) || ! empty($task['description']) || ! empty($task['nb_subtasks']) || ! empty($task['nb_links'])): ?>
<div class="task-board-footer">
<?php if (! empty($task['date_due'])): ?>
@@ -110,7 +110,10 @@
<?php endif ?>
<div class="task-board-icons">
<?php if (! empty($task['nb_links'])): ?>
<span title="<?= t('Links') ?>" class="task-board-tooltip" data-href="<?= $this->u('board', 'tasklinks', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>"><?= $task['nb_links'] ?> <i class="fa fa-code-fork"></i></span>
<?php endif ?>
<?php if (! empty($task['nb_subtasks'])): ?>
<span title="<?= t('Sub-Tasks') ?>" class="task-board-tooltip" data-href="<?= $this->u('board', 'subtasks', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>"><?= round($task['nb_completed_subtasks']/$task['nb_subtasks']*100, 0).'%' ?> <i class="fa fa-bars"></i></span>
<?php endif ?>
@@ -132,4 +135,4 @@
</div>
<?php endif ?>
</div>
</div>

View File

@@ -0,0 +1,28 @@
<section class="tooltip-tasklinks">
<div>
<ul>
<?php
$previous_link = null;
foreach ($links as $link): ?>
<?php if (null == $previous_link || $previous_link != $link['label']): ?>
<?php if (null != $previous_link): ?>
</ul>
</li>
<?php endif ?>
<?php $previous_link = $link['label']; ?>
<li><?= t($this->e($link['label'])) ?>
<ul>
<?php endif ?>
<li<?php if (0 == $link['task_inverse_is_active']): ?> class="task-closed"<?php endif ?>>
<?= $this->e($link['task_inverse_category']) ?>
<?= $this->a('#'.$this->e($link['task_inverse_id']).' - '.trim($this->e($link['task_inverse_title'])),
'task',
'show',
array('task_id' => $link['task_inverse_id'], 'project_id' => $link['task_inverse_project_id'])) ?>
</li>
<?php endforeach ?>
</ul>
</li>
</ul>
</div>
</section>

View File

@@ -10,6 +10,9 @@
<li>
<?= $this->a(t('Board settings'), 'config', 'board') ?>
</li>
<li>
<?= $this->a(t('Links settings'), 'link', 'index') ?>
</li>
<li>
<?= $this->a(t('Webhooks'), 'config', 'webhook') ?>
</li>

View File

@@ -0,0 +1,49 @@
<section id="link-edit-section">
<?php use Model\Link;
if (! isset($edit)): ?>
<h3><?= t('Add a new link label') ?></h3>
<?php else: ?>
<div class="page-header">
<h2><?= t('Edit the link label') ?></h2>
</div>
<?php endif ?>
<form method="post" action="<?= $this->u('link', isset($edit) ? 'update' : 'save', array('project_id' => $project['id'], 'link_id' => @$values['id'])) ?>" autocomplete="off">
<?= $this->formCsrf() ?>
<?php if (isset($edit)): ?>
<?= $this->formHidden('link_id', $values) ?>
<?= $this->formHidden('id[0]', $values[0]) ?>
<?php if (isset($values[1])): ?>
<?= $this->formHidden('id[1]', $values[1]) ?>
<?php endif ?>
<?php endif ?>
<?= $this->formHidden('project_id', $values) ?>
<?= $this->formLabel(t('Link Label'), 'label[0]') ?>
<?= $this->formText('label[0]', $values[0], $errors, array('required', 'autofocus', 'placeholder="'.t('precedes').'"')) ?> &raquo;
<?= $this->formCheckbox('behaviour[0]', t('Bidrectional link label'), Link::BEHAVIOUR_BOTH, (isset($values[0]['behaviour']) && Link::BEHAVIOUR_BOTH == $values[0]['behaviour']), 'behaviour') ?>
<div class="link-inverse-label">
<?= $this->formLabel(t('Link Inverse Label'), 'label[1]') ?>
&laquo; <?= $this->formText('label[1]', isset($values[1]) ? $values[1] : $values, $errors, array('placeholder="'.t('follows').'"')) ?>
</div>
<div class="form-actions">
<input type="submit" value="<?= t('Save') ?>" class="btn btn-blue"/>
<?php if (isset($edit)): ?>
<?= t('or') ?>
<?= $this->a(t('cancel'), 'link', 'index', array('project_id' => $project['id'])) ?>
<?php endif ?>
</div>
<?php if (! isset($edit)): ?>
<div class="alert alert-info">
<strong><?= t('Example:') ?></strong>
<i><?= t('#9 precedes #10') ?></i>
<?= t('and therefore') ?>
<i><?= t('#10 follows #9') ?></i>
</div>
<?php endif ?>
</form>
</section>

View File

@@ -0,0 +1,30 @@
<div class="page-header">
<h2><?= t('Link labels') ?></h2>
</div>
<section>
<?php if (! empty($links)): ?>
<table>
<tr>
<th width="70%"><?= t('Link labels') ?></th>
<th><?= t('Actions') ?></th>
</tr>
<?php foreach ($links as $link): ?>
<tr>
<td><?= t($this->e($link['label'])) ?><?php if (isset($link['label_inverse']) && !empty($link['label_inverse'])): ?> | <?= t($this->e($link['label_inverse'])) ?><?php endif ?></td>
<td>
<ul>
<?= $this->a(t('Edit'), 'link', 'edit', array('link_id' => $link['link_id'], 'project_id' => $link['project_id'])) ?>
<?= t('or') ?>
<?= $this->a(t('Remove'), 'link', 'confirm', array('link_id' => $link['link_id'], 'project_id' => $link['project_id'])) ?>
</ul>
</td>
</tr>
<?php endforeach ?>
</table>
<?php else: ?>
<?= t('There is no link yet.') ?>
<?php endif ?>
</section>
<?= $this->render('link/edit', array('values' => $values, 'errors' => $errors, 'project' => $project)) ?>

View File

@@ -0,0 +1,17 @@
<section id="main">
<div class="page-header">
<h2><?= t('Remove a link') ?></h2>
</div>
<div class="confirm">
<p class="alert alert-info">
<?= t('Do you really want to remove this link: "%s"?', t($link[0]['label']).(isset($link[1]['label']) ? ' | '.t($link[1]['label']) : '')) ?>
</p>
<div class="form-actions">
<?= $this->a(t('Yes'), 'link', 'remove', array('project_id' => $project['id'], 'link_id' => $link[0]['link_id']), true, 'btn btn-red') ?>
<?= t('or') ?>
<?= $this->a(t('cancel'), 'link', 'index', array('project_id' => $project['id'])) ?>
</div>
</div>
</section>

View File

@@ -16,6 +16,13 @@
'not_editable' => true
)) ?>
<?= $this->render('tasklink/show', array(
'task' => $task,
'links' => $links,
'project' => $project,
'not_editable' => true
)) ?>
<?= $this->render('task/comments', array(
'task' => $task,
'comments' => $comments,

View File

@@ -3,5 +3,6 @@
<?= $this->render('task/show_description', array('task' => $task)) ?>
<?= $this->render('subtask/show', array('task' => $task, 'subtasks' => $subtasks)) ?>
<?= $this->render('task/timesheet', array('task' => $task)) ?>
<?= $this->render('tasklink/show', array('task' => $task, 'links' => $links, 'link_list' => $link_list, 'task_list' => $task_list)) ?>
<?= $this->render('file/show', array('task' => $task, 'files' => $files)) ?>
<?= $this->render('task/comments', array('task' => $task, 'comments' => $comments, 'project' => $project)) ?>
<?= $this->render('task/comments', array('task' => $task, 'comments' => $comments, 'project' => $project)) ?>

View File

@@ -18,6 +18,9 @@
<li>
<?= $this->a(t('Add a sub-task'), 'subtask', 'create', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>
</li>
<li>
<?= $this->a(t('Add a link'), 'tasklink', 'create', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>
</li>
<li>
<?= $this->a(t('Add a comment'), 'comment', 'create', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>
</li>

View File

@@ -0,0 +1,53 @@
<div class="page-header">
<?php if (! isset($edit)): ?>
<h2><?= t('Add a link') ?></h2>
<?php else: ?>
<h2><?= t('Edit a link') ?></h2>
<?php endif ?>
</div>
<?php if (!empty($link_list)): ?>
<form method="post" action="<?= $this->u('tasklink', isset($edit) ? 'update' : 'save', array('task_id' => $task['id'], 'link_id' => @$values['id'], 'project_id' => $task['project_id'])) ?>" autocomplete="off">
<?= $this->formCsrf() ?>
<?php if (isset($edit)): ?>
<?= $this->formHidden('id', $values) ?>
<?= $this->formHidden('task_link_inverse_id', $values) ?>
<?php endif ?>
<?= $this->formHidden('task_id', $values) ?>
#<?= $task['id'] ?>
&#160;
<?= $this->formSelect('link_label_id', $link_list, $values, $errors, 'required autofocus') ?>
&#160;
#<?= $this->formNumeric('task_inverse_id', $values, $errors, array('required', 'placeholder="'.t('Task id').'"', 'title="'.t('Linked task id').'"', 'list="task_inverse_ids"')) ?>
<?php if (!empty($task_list)): ?>
<datalist id="task_inverse_ids">
<select>
<?php foreach ($task_list as $task_inverse_id => $task_inverse_title): ?>
<option value="<?= $task_inverse_id ?>">#<?= $task_inverse_id.' '.$task_inverse_title ?></option>
<?php endforeach ?>
</select>
</datalist>
<?php endif ?>
<br/>
<?php if (! isset($edit)): ?>
<?= $this->formCheckbox('another_link', t('Create another link'), 1, isset($values['another_link']) && $values['another_link'] == 1) ?>
<?php endif ?>
<div class="form-actions">
<input type="submit" value="<?= t('Save') ?>" class="btn btn-blue"/>
<?= t('or') ?>
<?= $this->a(t('cancel'), 'task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>
</div>
</form>
<?php else: ?>
<div class="alert alert-info">
<?= t('You need to add link labels to this project before to link this task to another one.') ?>
<ul>
<li><?= $this->a(t('Add link labels'), 'link', 'index', array('project_id' => $task['project_id'])) ?></li>
</ul>
</div>
<?php endif ?>

View File

@@ -0,0 +1,17 @@
<div class="page-header">
<h2><?= t('Remove a link') ?></h2>
</div>
<div class="confirm">
<p class="alert alert-info">
<?= t('Do you really want to remove this link with task #%s?', $link['task_inverse_id']) ?>
<br />
</p>
<div class="form-actions">
<?= $this->a(t('Yes'), 'tasklink', 'remove', array('task_id' => $task['id'], 'link_id' => $link['id'], 'project_id' => $task['project_id']), true, 'btn btn-red') ?>
<?= t('or') ?>
<?= $this->a(t('cancel'), 'task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>
</div>
</div>

View File

@@ -0,0 +1,68 @@
<?php if (! empty($links)): ?>
<aside id="links" class="task-show-section">
<div class="page-header">
<h2><?= t('Links') ?></h2>
</div>
<table class="link-table">
<tr>
<th><?= t('Label') ?></th>
<th width="70%"><?= t('Task') ?></th>
<?php if (! isset($not_editable)): ?>
<th><?= t('Actions') ?></th>
<?php endif ?>
</tr>
<?php $previous_link = null;
foreach ($links as $link): ?>
<tr>
<td>
<?php if (null == $previous_link || $previous_link != $link['label']):
$previous_link = $link['label']; ?>
<?= t($this->e($link['label'])) ?>
<?php endif ?>
</td>
<td>
<?php if (0 == $link['task_inverse_is_active']): ?><span class="task-closed"><?php endif ?>
<?= $this->e($link['task_inverse_category']) ?>
<?php if (! isset($not_editable)): ?>
<?= $this->a('#'.$this->e($link['task_inverse_id']).' - '.trim($this->e($link['task_inverse_title'])), 'task', 'show', array('task_id' => $link['task_inverse_id'], 'project_id' => $link['task_inverse_project_id'])) ?>
<?php else: ?>
<?= $this->a('#'.$this->e($link['task_inverse_id']).' - '.trim($this->e($link['task_inverse_title'])), 'task', 'readonly', array('task_id' => $link['task_inverse_id'], 'project_id' => $link['task_inverse_project_id'], 'token' => $project['token'])) ?>
<?php endif ?>
<?php if (0 == $link['task_inverse_is_active']): ?></span><?php endif ?>
</td>
<?php if (! isset($not_editable)): ?>
<td>
<ul>
<li><?= $this->a(t('Edit'), 'tasklink', 'edit', array('task_id' => $task['id'], 'link_id' => $link['id'], 'project_id' => $task['project_id'])) ?></li>
<li><?= $this->a(t('Remove'), 'tasklink', 'confirm', array('task_id' => $task['id'], 'link_id' => $link['id'], 'project_id' => $task['project_id'])) ?></li>
</ul>
</td>
<?php endif ?>
</tr>
<?php endforeach ?>
</table>
<?php if (! isset($not_editable) && !empty($link_list)): ?>
<form method="post" action="<?= $this->u('tasklink', 'save', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>" autocomplete="off">
<?= $this->formCsrf() ?>
<?= $this->formHidden('task_id', array('task_id' => $task['id'])) ?>
#<?= $this->e($task['id']) ?>
&#160;
<?= $this->formSelect('link_label_id', $link_list, array(), array(), 'required autofocus') ?>
&#160;
#<?= $this->formNumeric('task_inverse_id', array(), array(), array('required', 'placeholder="'.t('Task id').'"', 'title="'.t('Linked task id').'"', 'list="task_inverse_ids"')) ?>
<?php if (!empty($task_list)): ?>
<datalist id="task_inverse_ids">
<select>
<?php foreach ($task_list as $task_inverse_id => $task_inverse_title): ?>
<option value="<?= $task_inverse_id ?>">#<?= $task_inverse_id.' '.$task_inverse_title ?></option>
<?php endforeach ?>
</select>
</datalist>
<?php endif ?>
<input type="submit" value="<?= t('Add') ?>" class="btn btn-blue"/>
</form>
<?php endif ?>
</aside>
<?php endif ?>