看板初始化提交

This commit is contained in:
zephyr
2026-06-01 21:23:12 -07:00
commit 27411ebedc
1827 changed files with 192340 additions and 0 deletions
+80
View File
@@ -0,0 +1,80 @@
<div class="page-header">
<h2><?= t('Automatic actions for the project "%s"', $project['name']) ?></h2>
<ul>
<li>
<?= $this->modal->medium('plus', t('Add a new action'), 'ActionCreationController', 'create', array('project_id' => $project['id'])) ?>
</li>
<li>
<?= $this->modal->medium('copy', t('Import from another project'), 'ProjectActionDuplicationController', 'show', array('project_id' => $project['id'])) ?>
</li>
</ul>
</div>
<?php if (empty($actions)): ?>
<p class="alert"><?= t('There is no action at the moment.') ?></p>
<?php else: ?>
<table class="table-scrolling">
<?php foreach ($actions as $action): ?>
<tr>
<th>
<div class="dropdown">
<a href="#" class="dropdown-menu dropdown-menu-link-icon"><i class="fa fa-cog"></i><i class="fa fa-caret-down"></i></a>
<ul>
<li>
<?= $this->modal->confirm('trash-o', t('Remove'), 'ActionController', 'confirm', array('project_id' => $project['id'], 'action_id' => $action['id'])) ?>
</li>
</ul>
</div>
<?php if (! isset($available_params[$action['action_name']])): ?>
<?= $this->text->e($action['action_name']) ?>
<?php else: ?>
<?= $this->text->in($action['action_name'], $available_actions) ?>
<?php endif ?>
</th>
</tr>
<tr>
<td>
<?php if (! isset($available_params[$action['action_name']])): ?>
<p class="alert alert-error"><?= t('Automatic action not found: "%s"', $action['action_name']) ?></p>
<?php else: ?>
<ul>
<li>
<?= t('Event name') ?> =
<strong><?= $this->text->in($action['event_name'], $available_events) ?></strong>
</li>
<?php foreach ($action['params'] as $param_name => $param_value): ?>
<li>
<?php if (isset($available_params[$action['action_name']][$param_name]) && is_array($available_params[$action['action_name']][$param_name])): ?>
<?= $this->text->e(ucfirst($param_name)) ?> =
<?php else: ?>
<?= $this->text->in($param_name, $available_params[$action['action_name']]) ?> =
<?php endif ?>
<strong>
<?php if ($this->text->contains($param_name, 'column_id')): ?>
<?= $this->text->in($param_value, $columns_list) ?>
<?php elseif ($this->text->contains($param_name, 'user_id')): ?>
<?= $this->text->in($param_value, $users_list) ?>
<?php elseif ($this->text->contains($param_name, 'project_id')): ?>
<?= $this->text->in($param_value, $projects_list) ?>
<?php elseif ($this->text->contains($param_name, 'color_id')): ?>
<?= $this->text->in($param_value, $colors_list) ?>
<?php elseif ($this->text->contains($param_name, 'category_id')): ?>
<?= $this->text->in($param_value, $categories_list) ?>
<?php elseif ($this->text->contains($param_name, 'link_id')): ?>
<?= $this->text->in($param_value, $links_list) ?>
<?php elseif ($this->text->contains($param_name, 'swimlane_id')): ?>
<?= $this->text->in($param_value, $swimlane_list) ?>
<?php else: ?>
<?= $this->text->e($param_value) ?>
<?php endif ?>
</strong>
</li>
<?php endforeach ?>
</ul>
<?php endif ?>
</td>
</tr>
<?php endforeach ?>
</table>
<?php endif ?>
+15
View File
@@ -0,0 +1,15 @@
<div class="page-header">
<h2><?= t('Remove an automatic action') ?></h2>
</div>
<div class="confirm">
<p class="alert alert-info">
<?= t('Do you really want to remove this action: "%s"?', $this->text->in($action['event_name'], $available_events).'/'.$this->text->in($action['action_name'], $available_actions)) ?>
</p>
<?= $this->modal->confirmButtons(
'ActionController',
'remove',
array('project_id' => $project['id'], 'action_id' => $action['id'])
) ?>
</div>
+13
View File
@@ -0,0 +1,13 @@
<div class="page-header">
<h2><?= t('Add an action') ?></h2>
</div>
<form method="post" action="<?= $this->url->href('ActionCreationController', 'event', array('project_id' => $project['id'])) ?>">
<?= $this->form->csrf() ?>
<?= $this->form->label(t('Action'), 'action_name') ?>
<?= $this->form->select('action_name', $available_actions, $values) ?>
<?= $this->modal->submitButtons(array(
'submitLabel' => t('Next step')
)) ?>
</form>
+23
View File
@@ -0,0 +1,23 @@
<div class="page-header">
<h2><?= t('Choose an event') ?></h2>
</div>
<form method="post" action="<?= $this->url->href('ActionCreationController', 'params', array('project_id' => $project['id'])) ?>">
<?= $this->form->csrf() ?>
<?= $this->form->hidden('action_name', $values) ?>
<?= $this->form->label(t('Action'), 'action_name') ?>
<?= $this->form->select('action_name', $available_actions, $values, array(), array('disabled')) ?>
<?= $this->form->label(t('Event'), 'event_name') ?>
<?= $this->form->select('event_name', $events, $values) ?>
<div class="form-help">
<?= t('When the selected event occurs execute the corresponding action.') ?>
</div>
<?= $this->modal->submitButtons(array(
'submitLabel' => t('Next step')
)) ?>
</form>
+54
View File
@@ -0,0 +1,54 @@
<div class="page-header">
<h2><?= t('Define action parameters') ?></h2>
</div>
<form method="post" action="<?= $this->url->href('ActionCreationController', 'save', array('project_id' => $project['id'])) ?>" autocomplete="off">
<?= $this->form->csrf() ?>
<?= $this->form->hidden('event_name', $values) ?>
<?= $this->form->hidden('action_name', $values) ?>
<?= $this->form->label(t('Action'), 'action_name') ?>
<?= $this->form->select('action_name', $available_actions, $values, array(), array('disabled')) ?>
<?= $this->form->label(t('Event'), 'event_name') ?>
<?= $this->form->select('event_name', $events, $values, array(), array('disabled')) ?>
<?php foreach ($action_params as $param_name => $param_desc): ?>
<?php if ($this->text->contains($param_name, 'column_id')): ?>
<?= $this->form->label($param_desc, $param_name) ?>
<?= $this->form->select('params['.$param_name.']', $columns_list, $values) ?>
<?php elseif ($this->text->contains($param_name, 'user_id')): ?>
<?= $this->form->label($param_desc, $param_name) ?>
<?= $this->form->select('params['.$param_name.']', $users_list, $values) ?>
<?php elseif ($this->text->contains($param_name, 'project_id')): ?>
<?= $this->form->label($param_desc, $param_name) ?>
<?= $this->form->select('params['.$param_name.']', $projects_list, $values) ?>
<?php elseif ($this->text->contains($param_name, 'color_id')): ?>
<?= $this->form->colorSelect('params['.$param_name.']', $values) ?>
<?php elseif ($this->text->contains($param_name, 'category_id')): ?>
<?= $this->form->label($param_desc, $param_name) ?>
<?= $this->form->select('params['.$param_name.']', $categories_list, $values) ?>
<?php elseif ($this->text->contains($param_name, 'link_id')): ?>
<?= $this->form->label($param_desc, $param_name) ?>
<?= $this->form->select('params['.$param_name.']', $links_list, $values) ?>
<?php elseif ($param_name === 'priority'): ?>
<?= $this->form->label($param_desc, $param_name) ?>
<?= $this->form->select('params['.$param_name.']', $priorities_list, $values) ?>
<?php elseif ($this->text->contains($param_name, 'duration')): ?>
<?= $this->form->label($param_desc, $param_name) ?>
<?= $this->form->number('params['.$param_name.']', $values) ?>
<?php elseif ($this->text->contains($param_name, 'swimlane_id')): ?>
<?= $this->form->label($param_desc, $param_name) ?>
<?= $this->form->select('params['.$param_name.']', $swimlane_list, $values) ?>
<?php elseif (is_array($param_desc)): ?>
<?= $this->form->label(ucfirst($param_name), $param_name) ?>
<?= $this->form->select('params['.$param_name.']', $param_desc, $values) ?>
<?php else: ?>
<?= $this->form->label($param_desc, $param_name) ?>
<?= $this->form->text('params['.$param_name.']', $values) ?>
<?php endif ?>
<?php endforeach ?>
<?= $this->modal->submitButtons() ?>
</form>
+14
View File
@@ -0,0 +1,14 @@
<div class="dropdown">
<a href="#" class="dropdown-menu dropdown-menu-link-icon" title="<?= t('Default filters') ?>" aria-label="<?= t('Default filters') ?>"><i class="fa fa-filter fa-fw"></i><i class="fa fa-caret-down"></i></a>
<ul>
<li><a href="#" class="filter-helper filter-reset" data-filter="" title="<?= t('Keyboard shortcut: "%s"', 'r') ?>"><?= t('Reset filters') ?></a></li>
<li><a href="#" class="filter-helper" data-filter="creator:me"><?= t('My activities') ?></a></li>
<li><a href="#" class="filter-helper" data-filter="created:<=<?= date('Y-m-d', strtotime('yesterday')) ?>"><?= t('Activity until yesterday') ?></a></li>
<li><a href="#" class="filter-helper" data-filter="created:<=<?= date('Y-m-d')?>"><?= t('Activity until today') ?></a></li>
<li><a href="#" class="filter-helper" data-filter="status:closed"><?= t('Closed tasks') ?></a></li>
<li><a href="#" class="filter-helper" data-filter="status:open"><?= t('Open tasks') ?></a></li>
<li>
<?= $this->url->doc(t('View advanced search syntax'), 'search') ?>
</li>
</ul>
</div>
+12
View File
@@ -0,0 +1,12 @@
<div class="page-header">
<h2><?= t('%s\'s activity', $project['name']) ?></h2>
<?php if ($project['is_public']): ?>
<ul>
<li><?= $this->url->icon('rss-square', t('RSS feed'), 'FeedController', 'project', array('token' => $project['token']), false, '', '', true) ?></li>
<li><?= $this->url->icon('calendar', t('iCal feed'), 'ICalendarController', 'project', array('token' => $project['token'])) ?></li>
</ul>
<?php endif ?>
</div>
<?= $this->render('event/events', array('events' => $events)) ?>
+12
View File
@@ -0,0 +1,12 @@
<?= $this->render('task/details', array(
'task' => $task,
'tags' => $tags,
'project' => $project,
'editable' => false,
)) ?>
<div class="page-header">
<h2><?= t('Activity stream') ?></h2>
</div>
<?= $this->render('event/events', array('events' => $events)) ?>
+4
View File
@@ -0,0 +1,4 @@
<div class="page-header">
<h2><?= t('My activity stream') ?></h2>
</div>
<?= $this->render('event/events', array('events' => $events)) ?>
@@ -0,0 +1,31 @@
<?php if (! $is_ajax): ?>
<div class="page-header">
<h2><?= t('Average time spent in each column') ?></h2>
</div>
<?php endif ?>
<?php if (empty($metrics)): ?>
<p class="alert"><?= t('Not enough data to show the graph.') ?></p>
<?php else: ?>
<?= $this->app->component('chart-project-avg-time-column', array(
'metrics' => $metrics,
'label' => t('Average time spent'),
)) ?>
<table class="table-striped">
<tr>
<th><?= t('Column') ?></th>
<th><?= t('Average time spent') ?></th>
</tr>
<?php foreach ($metrics as $column): ?>
<tr>
<td><?= $this->text->e($column['title']) ?></td>
<td><?= $this->dt->duration($column['average']) ?></td>
</tr>
<?php endforeach ?>
</table>
<p class="alert alert-info">
<?= t('This chart shows the average time spent in each column for the last %d tasks.', 1000) ?>
</p>
<?php endif ?>
+26
View File
@@ -0,0 +1,26 @@
<?php if (! $is_ajax): ?>
<div class="page-header">
<h2><?= t('Burndown chart') ?></h2>
</div>
<?php endif ?>
<?php if (! $display_graph): ?>
<p class="alert"><?= t('You need at least 2 days of data to show the chart.') ?></p>
<?php else: ?>
<?= $this->app->component('chart-project-burndown', array(
'metrics' => $metrics,
'labelTotal' => t('Total for all columns'),
'dateFormat' => e('%%Y-%%m-%%d'),
)) ?>
<?php endif ?>
<hr/>
<form method="post" class="form-inline" action="<?= $this->url->href('AnalyticController', 'burndown', array('project_id' => $project['id'])) ?>" autocomplete="off">
<?= $this->form->csrf() ?>
<?= $this->form->date(t('Start date'), 'from', $values) ?>
<?= $this->form->date(t('End date'), 'to', $values) ?>
<?= $this->modal->submitButtons(array('submitLabel' => t('Execute'))) ?>
</form>
<p class="alert alert-info"><?= t('This chart show the task complexity over the time (Work Remaining).') ?></p>
+23
View File
@@ -0,0 +1,23 @@
<?php if (! $is_ajax): ?>
<div class="page-header">
<h2><?= t('Cumulative flow diagram') ?></h2>
</div>
<?php endif ?>
<?php if (! $display_graph): ?>
<p class="alert"><?= t('You need at least 2 days of data to show the chart.') ?></p>
<?php else: ?>
<?= $this->app->component('chart-project-cumulative-flow', array(
'metrics' => $metrics,
'dateFormat' => e('%%Y-%%m-%%d'),
)) ?>
<?php endif ?>
<hr/>
<form method="post" class="form-inline" action="<?= $this->url->href('AnalyticController', 'cfd', array('project_id' => $project['id'])) ?>" autocomplete="off">
<?= $this->form->csrf() ?>
<?= $this->form->date(t('Start date'), 'from', $values) ?>
<?= $this->form->date(t('End date'), 'to', $values) ?>
<?= $this->modal->submitButtons(array('submitLabel' => t('Execute'))) ?>
</form>
@@ -0,0 +1,30 @@
<?php if (! $is_ajax): ?>
<div class="page-header">
<h2><?= t('Estimated vs actual time per column') ?></h2>
</div>
<?php endif ?>
<?php if (empty($metrics)): ?>
<p class="alert"><?= t('Not enough data to show the graph.') ?></p>
<?php else: ?>
<?= $this->app->component('chart-project-estimated-actual-column', array(
'metrics' => $metrics,
'labelSpent' => t('Hours Spent'),
'labelEstimated' => t('Hours Estimated'),
)) ?>
<table class="table-striped">
<tr>
<th><?= t('Column') ?></th>
<th><?= t('Hours Spent') ?></th>
<th><?= t('Hours Estimated') ?></th>
</tr>
<?php foreach ($metrics as $column): ?>
<tr>
<td><?= $this->text->e($column['title']) ?></td>
<td><?= $this->dt->durationHours($column['hours_spent']) ?></td>
<td><?= $this->dt->durationHours($column['hours_estimated']) ?></td>
</tr>
<?php endforeach ?>
</table>
<?php endif ?>
+14
View File
@@ -0,0 +1,14 @@
<?php if ($is_ajax): ?>
<div class="page-header">
<h2><?= $title ?></h2>
</div>
<?php else: ?>
<?= $this->projectHeader->render($project, 'TaskListController', 'show') ?>
<?php endif ?>
<section class="sidebar-container">
<?= $this->render($sidebar_template, array('project' => $project)) ?>
<div class="sidebar-content">
<?= $content_for_sublayout ?>
</div>
</section>
+33
View File
@@ -0,0 +1,33 @@
<?php if (! $is_ajax): ?>
<div class="page-header">
<h2><?= t('Average Lead and Cycle time') ?></h2>
</div>
<?php endif ?>
<div class="panel">
<ul>
<li><?= t('Average lead time: ').'<strong>'.$this->dt->duration($average['avg_lead_time']) ?></strong></li>
<li><?= t('Average cycle time: ').'<strong>'.$this->dt->duration($average['avg_cycle_time']) ?></strong></li>
</ul>
</div>
<?php if (empty($metrics)): ?>
<p class="alert"><?= t('Not enough data to show the graph.') ?></p>
<?php else: ?>
<?= $this->app->component('chart-project-lead-cycle-time', array(
'metrics' => $metrics,
'labelCycle' => t('Cycle Time'),
'labelLead' => t('Lead Time'),
)) ?>
<form method="post" class="form-inline" action="<?= $this->url->href('AnalyticController', 'leadAndCycleTime', array('project_id' => $project['id'])) ?>" autocomplete="off">
<?= $this->form->csrf() ?>
<?= $this->form->date(t('Start date'), 'from', $values) ?>
<?= $this->form->date(t('End date'), 'to', $values) ?>
<?= $this->modal->submitButtons(array('submitLabel' => t('Execute'))) ?>
</form>
<p class="alert alert-info">
<?= t('This chart shows the average lead and cycle time for the last %d tasks over the time.', 1000) ?>
</p>
<?php endif ?>
+30
View File
@@ -0,0 +1,30 @@
<div class="sidebar">
<ul>
<li <?= $this->app->checkMenuSelection('AnalyticController', 'taskDistribution') ?>>
<?= $this->modal->replaceLink(t('Task distribution'), 'AnalyticController', 'taskDistribution', array('project_id' => $project['id'])) ?>
</li>
<li <?= $this->app->checkMenuSelection('AnalyticController', 'userDistribution') ?>>
<?= $this->modal->replaceLink(t('User repartition'), 'AnalyticController', 'userDistribution', array('project_id' => $project['id'])) ?>
</li>
<li <?= $this->app->checkMenuSelection('AnalyticController', 'cfd') ?>>
<?= $this->modal->replaceLink(t('Cumulative flow diagram'), 'AnalyticController', 'cfd', array('project_id' => $project['id'])) ?>
</li>
<li <?= $this->app->checkMenuSelection('AnalyticController', 'burndown') ?>>
<?= $this->modal->replaceLink(t('Burndown chart'), 'AnalyticController', 'burndown', array('project_id' => $project['id'])) ?>
</li>
<li <?= $this->app->checkMenuSelection('AnalyticController', 'averageTimeByColumn') ?>>
<?= $this->modal->replaceLink(t('Average time into each column'), 'AnalyticController', 'averageTimeByColumn', array('project_id' => $project['id'])) ?>
</li>
<li <?= $this->app->checkMenuSelection('AnalyticController', 'leadAndCycleTime') ?>>
<?= $this->modal->replaceLink(t('Lead and cycle time'), 'AnalyticController', 'leadAndCycleTime', array('project_id' => $project['id'])) ?>
</li>
<li <?= $this->app->checkMenuSelection('AnalyticController', 'timeComparison') ?>>
<?= $this->modal->replaceLink(t('Estimated vs actual time'), 'AnalyticController', 'timeComparison', array('project_id' => $project['id'])) ?>
</li>
<li <?= $this->app->checkMenuSelection('AnalyticController', 'estimatedVsActualByColumn') ?>>
<?= $this->modal->replaceLink(t('Estimated vs actual time per column'), 'AnalyticController', 'estimatedVsActualByColumn', array('project_id' => $project['id'])) ?>
</li>
<?= $this->hook->render('template:analytic:sidebar', array('project' => $project)) ?>
</ul>
</div>
@@ -0,0 +1,34 @@
<?php if (! $is_ajax): ?>
<div class="page-header">
<h2><?= t('Task distribution') ?></h2>
</div>
<?php endif ?>
<?php if (empty($metrics)): ?>
<p class="alert"><?= t('Not enough data to show the graph.') ?></p>
<?php else: ?>
<?= $this->app->component('chart-project-task-distribution', array(
'metrics' => $metrics,
)) ?>
<table class="table-striped">
<tr>
<th><?= t('Column') ?></th>
<th><?= t('Number of tasks') ?></th>
<th><?= t('Percentage') ?></th>
</tr>
<?php foreach ($metrics as $metric): ?>
<tr>
<td>
<?= $this->text->e($metric['column_title']) ?>
</td>
<td>
<?= $metric['nb_tasks'] ?>
</td>
<td>
<?= n($metric['percentage']) ?>%
</td>
</tr>
<?php endforeach ?>
</table>
<?php endif ?>
+63
View File
@@ -0,0 +1,63 @@
<?php if (! $is_ajax): ?>
<div class="page-header">
<h2><?= t('Estimated vs actual time') ?></h2>
</div>
<?php endif ?>
<div class="panel">
<ul>
<li><?= t('Estimated hours: ').'<strong>'.$this->text->e($metrics['open']['time_estimated'] + $metrics['closed']['time_estimated']) ?></strong></li>
<li><?= t('Actual hours: ').'<strong>'.$this->text->e($metrics['open']['time_spent'] + $metrics['closed']['time_spent']) ?></strong></li>
</ul>
</div>
<?php if (empty($metrics)): ?>
<p class="alert"><?= t('Not enough data to show the graph.') ?></p>
<?php else: ?>
<?php if ($paginator->isEmpty()): ?>
<p class="alert"><?= t('No tasks found.') ?></p>
<?php elseif (! $paginator->isEmpty()): ?>
<?= $this->app->component('chart-project-time-comparison', array(
'metrics' => $metrics,
'labelSpent' => t('Hours Spent'),
'labelEstimated' => t('Hours Estimated'),
'labelClosed' => t('Closed'),
'labelOpen' => t('Open'),
)) ?>
<table class="table-fixed table-small table-scrolling">
<tr>
<th class="column-5"><?= $paginator->order(t('Id'), 'tasks.id') ?></th>
<th><?= $paginator->order(t('Title'), 'tasks.title') ?></th>
<th class="column-10"><?= $paginator->order(t('Status'), 'tasks.is_active') ?></th>
<th class="column-12"><?= $paginator->order(t('Estimated Time'), 'tasks.time_estimated') ?></th>
<th class="column-12"><?= $paginator->order(t('Actual Time'), 'tasks.time_spent') ?></th>
</tr>
<?php foreach ($paginator->getCollection() as $task): ?>
<tr>
<td class="task-table color-<?= $task['color_id'] ?>">
<?= $this->url->link('#'.$this->text->e($task['id']), 'TaskViewController', 'show', array('task_id' => $task['id']), false, '', t('View this task')) ?>
</td>
<td>
<?= $this->url->link($this->text->e($task['title']), 'TaskViewController', 'show', array('task_id' => $task['id']), false, '', t('View this task')) ?>
</td>
<td>
<?php if ($task['is_active'] == \Kanboard\Model\TaskModel::STATUS_OPEN): ?>
<?= t('Open') ?>
<?php else: ?>
<?= t('Closed') ?>
<?php endif ?>
</td>
<td>
<?= $this->text->e($task['time_estimated']) ?>
</td>
<td>
<?= $this->text->e($task['time_spent']) ?>
</td>
</tr>
<?php endforeach ?>
</table>
<?= $paginator ?>
<?php endif ?>
<?php endif ?>
@@ -0,0 +1,34 @@
<?php if (! $is_ajax): ?>
<div class="page-header">
<h2><?= t('User repartition') ?></h2>
</div>
<?php endif ?>
<?php if (empty($metrics)): ?>
<p class="alert"><?= t('Not enough data to show the graph.') ?></p>
<?php else: ?>
<?= $this->app->component('chart-project-user-distribution', array(
'metrics' => $metrics,
)) ?>
<table class="table-striped">
<tr>
<th><?= t('User') ?></th>
<th><?= t('Number of tasks') ?></th>
<th><?= t('Percentage') ?></th>
</tr>
<?php foreach ($metrics as $metric): ?>
<tr>
<td>
<?= $this->text->e($metric['user']) ?>
</td>
<td>
<?= $metric['nb_tasks'] ?>
</td>
<td>
<?= n($metric['percentage']) ?>%
</td>
</tr>
<?php endforeach ?>
</table>
<?php endif ?>
+21
View File
@@ -0,0 +1,21 @@
<?= $this->hook->render('template:app:filters-helper:before', isset($project) ? array('project' => $project) : array()) ?>
<div class="dropdown">
<a href="#" class="dropdown-menu dropdown-menu-link-icon" title="<?= t('Default filters') ?>" aria-label="<?= t('Default filters') ?>"><i class="fa fa-filter fa-fw"></i><i class="fa fa-caret-down"></i></a>
<ul>
<li><a href="#" class="filter-helper filter-reset" data-filter="<?= isset($reset) ? $reset : '' ?>" title="<?= t('Keyboard shortcut: "%s"', 'r') ?>"><?= t('Reset filters') ?></a></li>
<li><a href="#" class="filter-helper" data-filter="status:open assignee:me"><?= t('My tasks') ?></a></li>
<li><a href="#" class="filter-helper" data-filter="status:open assignee:me due:tomorrow"><?= t('My tasks due tomorrow') ?></a></li>
<li><a href="#" class="filter-helper" data-filter="status:open due:today"><?= t('Tasks due today') ?></a></li>
<li><a href="#" class="filter-helper" data-filter="status:open due:tomorrow"><?= t('Tasks due tomorrow') ?></a></li>
<li><a href="#" class="filter-helper" data-filter="status:open due:yesterday"><?= t('Tasks due yesterday') ?></a></li>
<li><a href="#" class="filter-helper" data-filter="status:closed"><?= t('Closed tasks') ?></a></li>
<li><a href="#" class="filter-helper" data-filter="status:open"><?= t('Open tasks') ?></a></li>
<li><a href="#" class="filter-helper" data-filter="status:open assignee:nobody"><?= t('Not assigned') ?></a></li>
<li><a href="#" class="filter-helper" data-filter="status:open assignee:anybody"><?= t('Assigned') ?></a></li>
<li><a href="#" class="filter-helper" data-filter="status:open category:none"><?= t('No category') ?></a></li>
<li>
<?= $this->url->doc(t('View advanced search syntax'), 'search') ?>
</li>
</ul>
</div>
<?= $this->hook->render('template:app:filters-helper:after', isset($project) ? array('project' => $project) : array()) ?>
+5
View File
@@ -0,0 +1,5 @@
<section id="main">
<p class="alert alert-error">
<?= t('Access Forbidden') ?>
</p>
</section>
+5
View File
@@ -0,0 +1,5 @@
<section id="main">
<p class="alert alert-error">
<?= t('Sorry, I didn\'t find this information in my database!') ?>
</p>
</section>
+53
View File
@@ -0,0 +1,53 @@
<div class="login-page-wrapper">
<div class="form-login">
<h2><?= t('Login') ?></h2>
<?= $this->hook->render('template:auth:login-form:before') ?>
<?php if (isset($errors['login'])): ?>
<p class="alert alert-error"><?= $this->text->e($errors['login']) ?></p>
<?php endif ?>
<?php if (! HIDE_LOGIN_FORM): ?>
<form method="post" action="<?= $this->url->href('AuthController', 'check') ?>">
<?= $this->form->csrf() ?>
<div class="input-icon-wrapper">
<?= $this->form->label(t('Username'), 'username') ?>
<i class="fa fa-user" aria-hidden="true"></i>
<?= $this->form->text('username', $values, $errors, array('autofocus', 'required', 'autocomplete="username"', 'placeholder="'.t('Username').'"')) ?>
</div>
<div class="input-icon-wrapper">
<?= $this->form->label(t('Password'), 'password') ?>
<i class="fa fa-lock" aria-hidden="true"></i>
<?= $this->form->password('password', $values, $errors, array('required', 'autocomplete="current-password"', 'placeholder="'.t('Password').'"')) ?>
</div>
<?php if (isset($captcha) && $captcha): ?>
<?= $this->form->label(t('Enter the text below'), 'captcha') ?>
<img src="<?= $this->url->href('CaptchaController', 'image') ?>" alt="Captcha">
<?= $this->form->text('captcha', array(), $errors, array('required')) ?>
<?php endif ?>
<?php if (REMEMBER_ME_AUTH): ?>
<div class="remember-me-wrapper">
<?= $this->form->checkbox('remember_me', t('Remember Me'), 1, true) ?>
</div>
<?php endif ?>
<div class="form-actions">
<button type="submit" class="btn btn-blue"><?= t('Sign in') ?></button>
</div>
<?php if ($this->app->config('password_reset') == 1): ?>
<div class="reset-password">
<?= $this->url->link(t('Forgot password?'), 'PasswordResetController', 'create') ?>
</div>
<?php endif ?>
</form>
<?php endif ?>
<?= $this->hook->render('template:auth:login-form:after') ?>
</div>
</div>
+23
View File
@@ -0,0 +1,23 @@
<div class="page-header">
<h2><?= t('Avatar') ?></h2>
</div>
<?= $this->avatar->render($user['id'], $user['username'], $user['name'], $user['email'], $user['avatar_path'], '') ?>
<div class="form-actions">
<?php if (! empty($user['avatar_path'])): ?>
<?= $this->url->link(t('Remove my image'), 'AvatarFileController', 'remove', array('user_id' => $user['id']), true, 'btn btn-red js-modal-replace') ?>
<?php endif ?>
</div>
<hr>
<h3><?= t('Upload my avatar image') ?></h3>
<form method="post" enctype="multipart/form-data" action="<?= $this->url->href('AvatarFileController', 'upload', array('user_id' => $user['id']), true) ?>">
<?= $this->form->label(t('Avatar'), 'avatar', ['class="ui-helper-hidden-accessible"']) ?>
<?= $this->form->file('avatar') ?>
<div class="form-actions">
<button type="submit" class="btn btn-blue"><?= t('Upload my avatar image') ?></button>
</div>
</form>
+127
View File
@@ -0,0 +1,127 @@
<!-- column titles -->
<?= $this->hook->render('template:board:table:column:before-header-row', array('swimlane' => $swimlane)) ?>
<tr class="board-swimlane-columns-<?= $swimlane['id'] ?>">
<?php foreach ($swimlane['columns'] as $column): ?>
<th class="board-column-header board-column-header-<?= $column['id'] ?>" data-column-id="<?= $column['id'] ?>">
<!-- column in collapsed mode -->
<div class="board-column-collapsed">
<small class="board-column-header-task-count" title="<?= t('Task count') ?>">
<span id="task-number-column-<?= $column['id'] ?>"><span class="ui-helper-hidden-accessible"><?= t('Task count') ?> </span><?= $column['nb_tasks'] ?></span>
</small>
</div>
<!-- column in expanded mode -->
<div class="board-column-expanded board-column-expanded-header">
<?php if (! $not_editable && $this->projectRole->canCreateTaskInColumn($column['project_id'], $column['id'])): ?>
<?= $this->task->getNewBoardTaskButton($swimlane, $column) ?>
<?php endif ?>
<span class="board-column-title">
<?php if ($not_editable): ?>
<?= $this->text->e($column['title']) ?>
<?php else: ?>
<span class="dropdown">
<a href="#" class="dropdown-menu"><?= $this->text->e($column['title']) ?> <i class="fa fa-caret-down"></i></a>
<ul>
<li>
<i class="fa fa-minus-square fa-fw"></i>
<a href="#" class="board-toggle-column-view" data-column-id="<?= $column['id'] ?>"><?= t('Hide this column') ?></a>
</li>
<?php if ($this->projectRole->canCreateTaskInColumn($column['project_id'], $column['id'])): ?>
<li>
<?= $this->modal->medium('align-justify', t('Create tasks in bulk'), 'TaskBulkController', 'show', array('project_id' => $column['project_id'], 'column_id' => $column['id'], 'swimlane_id' => $swimlane['id'])) ?>
</li>
<?php endif ?>
<?php if ($column['nb_tasks'] > 0 && $this->projectRole->canChangeTaskStatusInColumn($column['project_id'], $column['id'])): ?>
<li>
<?= $this->modal->confirm('close', t('Close all tasks in this column and this swimlane'), 'BoardPopoverController', 'confirmCloseColumnTasks', array('project_id' => $column['project_id'], 'column_id' => $column['id'], 'swimlane_id' => $swimlane['id'])) ?>
</li>
<?php endif ?>
</ul>
<?php if ($column['nb_tasks'] > 0 && $this->user->hasProjectAccess('TaskModificationController', 'update', $column['project_id'])): ?>
<span class="dropdown">
<a href="#" class="dropdown-menu"><i class="fa fa-sort"></i></i></a>
<ul>
<li>
<?= $this->url->icon('sort-numeric-asc', t('Reorder this column by id (ASC)'), 'TaskReorderController', 'reorderColumn', ['sort' => 'id', 'direction' => 'asc', 'project_id' => $column['project_id'], 'column_id' => $column['id'], 'swimlane_id' => $swimlane['id']], true) ?>
</li>
<li>
<?= $this->url->icon('sort-numeric-desc', t('Reorder this column by id (DESC)'), 'TaskReorderController', 'reorderColumn', ['sort' => 'id', 'direction' => 'desc', 'project_id' => $column['project_id'], 'column_id' => $column['id'], 'swimlane_id' => $swimlane['id']], true) ?>
</li>
<li>
<?= $this->url->icon('sort-numeric-asc', t('Reorder this column by priority (ASC)'), 'TaskReorderController', 'reorderColumn', ['sort' => 'priority', 'direction' => 'asc', 'project_id' => $column['project_id'], 'column_id' => $column['id'], 'swimlane_id' => $swimlane['id']], true) ?>
</li>
<li>
<?= $this->url->icon('sort-numeric-desc', t('Reorder this column by priority (DESC)'), 'TaskReorderController', 'reorderColumn', ['sort' => 'priority', 'direction' => 'desc', 'project_id' => $column['project_id'], 'column_id' => $column['id'], 'swimlane_id' => $swimlane['id']], true) ?>
</li>
<li>
<?= $this->url->icon('sort-amount-asc', t('Reorder this column by assignee and priority (ASC)'), 'TaskReorderController', 'reorderColumn', ['sort' => 'assignee-priority', 'direction' => 'asc', 'project_id' => $column['project_id'], 'column_id' => $column['id'], 'swimlane_id' => $swimlane['id']], true) ?>
</li>
<li>
<?= $this->url->icon('sort-amount-desc', t('Reorder this column by assignee and priority (DESC)'), 'TaskReorderController', 'reorderColumn', ['sort' => 'assignee-priority', 'direction' => 'desc', 'project_id' => $column['project_id'], 'column_id' => $column['id'], 'swimlane_id' => $swimlane['id']], true) ?>
</li>
<li>
<?= $this->url->icon('sort-alpha-asc', t('Reorder this column by assignee (A-Z)'), 'TaskReorderController', 'reorderColumn', ['sort' => 'assignee', 'direction' => 'asc', 'project_id' => $column['project_id'], 'column_id' => $column['id'], 'swimlane_id' => $swimlane['id']], true) ?>
</li>
<li>
<?= $this->url->icon('sort-alpha-desc', t('Reorder this column by assignee (Z-A)'), 'TaskReorderController', 'reorderColumn', ['sort' => 'assignee', 'direction' => 'desc', 'project_id' => $column['project_id'], 'column_id' => $column['id'], 'swimlane_id' => $swimlane['id']], true) ?>
</li>
<li>
<?= $this->url->icon('sort-numeric-asc', t('Reorder this column by due date (ASC)'), 'TaskReorderController', 'reorderColumn', ['sort' => 'due-date', 'direction' => 'asc', 'project_id' => $column['project_id'], 'column_id' => $column['id'], 'swimlane_id' => $swimlane['id']], true) ?>
</li>
<li>
<?= $this->url->icon('sort-numeric-desc', t('Reorder this column by due date (DESC)'), 'TaskReorderController', 'reorderColumn', ['sort' => 'due-date', 'direction' => 'desc', 'project_id' => $column['project_id'], 'column_id' => $column['id'], 'swimlane_id' => $swimlane['id']], true) ?>
</li>
</ul>
</span>
<?php endif ?>
<?= $this->hook->render('template:board:column:dropdown', array('swimlane' => $swimlane, 'column' => $column)) ?>
</span>
<?php endif ?>
</span>
<span class="pull-right board-column-header-task-count">
<?php if (! empty($column['score'])): ?>
<span title="<?= t('Score') ?>">
<span class="ui-helper-hidden-accessible"><?= t('Score') ?> </span><?= $column['score'] ?>
</span>
<?php endif ?>
<?php if ($swimlane['nb_swimlanes'] > 1 && ! empty($column['cumulative_score_across_swimlane'])): ?>
<span title="<?= t('Total score in this column across all swimlanes') ?>">
(<span><span class="ui-helper-hidden-accessible"><?= t('Total score in this column across all swimlanes') ?> </span><?= $column['cumulative_score_across_swimlane'] ?></span>)&nbsp;
</span>
<?php endif ?>
<?php if (! $not_editable && ! empty($column['description'])): ?>
<?= $this->app->tooltipMarkdown($column['description']) ?>&nbsp;
<?php endif ?>
<?php if (! empty($column['nb_tasks'])): ?>
<span title="<?= t('Number of visible tasks in this column and swimlane') ?>">
<span><span class="ui-helper-hidden-accessible"><?= t('Task count') ?> </span><?= $column['nb_tasks'] ?></span>&nbsp;
</span>
<?php endif ?>
<?php if (! empty($column['nb_unfiltered_tasks_across_swimlane'])): ?>
<span title="<?= t('Total number of tasks in this column across all swimlanes') ?>">
<?php if ($column['task_limit'] > 0): ?>
(<span><span class="ui-helper-hidden-accessible"><?= t('Total number of tasks in this column across all swimlanes') ?> </span><?= $column['nb_unfiltered_tasks_across_swimlane'] ?></span>/<span title="<?= t('Task limit') ?>"><span class="ui-helper-hidden-accessible"><?= t('Task limit') ?> </span><?= $this->text->e($column['task_limit']) ?></span>)
<?php else: ?>
(<span><span class="ui-helper-hidden-accessible"><?= t('Total number of tasks in this column across all swimlanes') ?> </span><?= $column['nb_unfiltered_tasks_across_swimlane'] ?></span>)
<?php endif ?>
</span>
<?php endif ?>
</span>
<?= $this->hook->render('template:board:column:header', array('swimlane' => $swimlane, 'column' => $column)) ?>
</div>
</th>
<?php endforeach ?>
</tr>
<?= $this->hook->render('template:board:table:column:after-header-row', array('swimlane' => $swimlane)) ?>
+20
View File
@@ -0,0 +1,20 @@
<tr class="board-swimlane-columns-first">
<?php foreach ($swimlane['columns'] as $column): ?>
<th class="board-column-header board-column-header-first board-column-header-<?= $column['id'] ?>" data-column-id="<?= $column['id'] ?>">
<!-- column in collapsed mode -->
<div class="board-column-collapsed">
</div>
<!-- column in expanded mode -->
<div class="board-column-expanded board-column-expanded-header">
<span class="board-column-title">
</span>
<span class="pull-right">
</span>
</div>
</th>
<?php endforeach ?>
</tr>
+67
View File
@@ -0,0 +1,67 @@
<div id="board-container"
class="<?= ($project['task_limit'] && array_key_exists('nb_active_tasks', $project) && $project['nb_active_tasks'] > $project['task_limit']) ? 'board-task-list-limit' : '' ?>">
<?php if (empty($swimlanes) || empty($swimlanes[0]['nb_columns'])): ?>
<p class="alert alert-error"><?= t('There is no column or swimlane activated in your project!') ?></p>
<?php else: ?>
<?php if (isset($not_editable)): ?>
<table id="board" class="board-project-<?= $project['id'] ?>">
<?php else: ?>
<table id="board"
class="board-project-<?= $project['id'] ?>"
data-project-id="<?= $project['id'] ?>"
data-check-interval="<?= $board_private_refresh_interval ?>"
data-save-url="<?= $this->url->href('BoardAjaxController', 'save', array('project_id' => $project['id'], 'csrf_token' => $this->app->getToken()->getReusableCSRFToken())) ?>"
data-reload-url="<?= $this->url->href('BoardAjaxController', 'reload', array('project_id' => $project['id'], 'csrf_token' => $this->app->getToken()->getReusableCSRFToken())) ?>"
data-check-url="<?= $this->url->href('BoardAjaxController', 'check', array('project_id' => $project['id'], 'timestamp' => time(), 'csrf_token' => $this->app->getToken()->getReusableCSRFToken())) ?>"
data-task-creation-url="<?= $this->url->href('TaskCreationController', 'show', array('project_id' => $project['id'])) ?>"
>
<?php endif ?>
<?php foreach ($swimlanes as $index => $swimlane): ?>
<?php if (! ($swimlane['nb_tasks'] === 0 && isset($not_editable))): ?>
<?php if ($index === 0 && $swimlane['nb_swimlanes'] > 1): ?>
<!-- Render empty columns to setup the "grid" for collapsing columns (Only once and only if more than 1 swimlane in project) -->
<?= $this->render('board/table_column_first', array(
'swimlane' => $swimlane,
'not_editable' => isset($not_editable),
)) ?>
<?php endif ?>
<?php if ($index === 0 && $swimlane['nb_swimlanes'] > 1): ?>
<!-- Only show first swimlane-header if project more than 1 swimlanes -->
<?= $this->render('board/table_swimlane', array(
'project' => $project,
'swimlane' => $swimlane,
'not_editable' => isset($not_editable),
)) ?>
<?php endif ?>
<?php if ($index > 0 && $swimlane['nb_swimlanes'] > 1): ?>
<?= $this->render('board/table_swimlane', array(
'project' => $project,
'swimlane' => $swimlane,
'not_editable' => isset($not_editable),
)) ?>
<?php endif ?>
<?= $this->render('board/table_column', array(
'swimlane' => $swimlane,
'not_editable' => isset($not_editable),
)) ?>
<?= $this->render('board/table_tasks', array(
'project' => $project,
'swimlane' => $swimlane,
'not_editable' => isset($not_editable),
'board_highlight_period' => $board_highlight_period,
)) ?>
<?php endif ?>
<?php endforeach ?>
</table>
<?php endif ?>
</div>
+25
View File
@@ -0,0 +1,25 @@
<!-- swimlane -->
<tr id="swimlane-<?= $swimlane['id'] ?>">
<th class="board-swimlane-header" colspan="<?= $swimlane['nb_columns'] ?>">
<?php if (! $not_editable): ?>
<a href="#" class="board-swimlane-toggle" data-swimlane-id="<?= $swimlane['id'] ?>">
<i class="fa fa-chevron-circle-up hide-icon-swimlane-<?= $swimlane['id'] ?>" title="<?= t('Collapse swimlane') ?>" role="button" aria-label="<?= t('Collapse swimlane') ?>"></i>
<i class="fa fa-chevron-circle-down show-icon-swimlane-<?= $swimlane['id'] ?>" title="<?= t('Expand swimlane') ?>" role="button" aria-label="<?= t('Expand swimlane') ?>" style="display: none"></i>
</a>
<?php endif ?>
<?= $this->text->e($swimlane['name']) ?>
<?php if (! $not_editable && ! empty($swimlane['description'])): ?>
<?= $this->app->tooltipLink('<i class="fa fa-info-circle"></i>', $this->url->href('BoardTooltipController', 'swimlane', array('swimlane_id' => $swimlane['id'], 'project_id' => $project['id']))) ?>
<?php endif ?>
<span title="<?= t('Number of tasks in this swimlane') ?>" class="board-column-header-task-count swimlane-task-count-<?= $swimlane['id'] ?>">
<?php if ($swimlane['task_limit']): ?>
(<span><span class="ui-helper-hidden-accessible"><?= t('Number of tasks in this swimlane') ?> </span><?= $swimlane['nb_tasks'] ?>/<?= $swimlane['task_limit'] ?>)
<?php else: ?>
(<span><span class="ui-helper-hidden-accessible"><?= t('Number of tasks in this swimlane') ?> </span><?= $swimlane['nb_tasks'] ?>)
<?php endif ?>
</span>
</th>
</tr>
+40
View File
@@ -0,0 +1,40 @@
<!-- task row -->
<tr class="board-swimlane board-swimlane-tasks-<?= $swimlane['id'] ?><?= $swimlane['task_limit'] && $swimlane['nb_tasks'] > $swimlane['task_limit'] ? ' board-task-list-limit' : '' ?>">
<?php foreach ($swimlane['columns'] as $column): ?>
<td class="
board-column-<?= $column['id'] ?>
<?= $column['task_limit'] > 0 && $column['column_nb_open_tasks'] > $column['task_limit'] ? 'board-task-list-limit' : '' ?>
"
>
<!-- tasks list -->
<div
class="board-task-list board-column-expanded <?= $this->projectRole->isSortableColumn($column['project_id'], $column['id']) ? 'sortable-column' : '' ?>"
data-column-id="<?= $column['id'] ?>"
data-swimlane-id="<?= $swimlane['id'] ?>"
data-task-limit="<?= $column['task_limit'] ?>">
<?php foreach ($column['tasks'] as $task): ?>
<?= $this->render($not_editable ? 'board/task_public' : 'board/task_private', array(
'project' => $project,
'task' => $task,
'board_highlight_period' => $board_highlight_period,
'not_editable' => $not_editable,
)) ?>
<?php endforeach ?>
</div>
<!-- column in collapsed mode (rotated text) -->
<div class="board-column-collapsed board-task-list sortable-column"
data-column-id="<?= $column['id'] ?>"
data-swimlane-id="<?= $swimlane['id'] ?>"
data-task-limit="<?= $column['task_limit'] ?>">
<div class="board-rotation-wrapper">
<div class="board-column-title board-rotation board-toggle-column-view" data-column-id="<?= $column['id'] ?>" title="<?= $this->text->e($column['title']) ?>">
<i class="fa fa-plus-square" title="<?= t('Show this column') ?>" role="button" aria-label="<?= t('Show this column') ?>"></i> <?= $this->text->e($column['title']) ?>
</div>
</div>
</div>
</td>
<?php endforeach ?>
</tr>
+20
View File
@@ -0,0 +1,20 @@
<?php if (! empty($task['owner_id'])): ?>
<div class="task-board-avatars">
<span
<?php if ($this->user->hasProjectAccess('TaskModificationController', 'edit', $task['project_id'])): ?>
class="task-board-assignee task-board-change-assignee"
data-url="<?= $this->url->href('TaskModificationController', 'edit', array('task_id' => $task['id'])) ?>">
<?php else: ?>
class="task-board-assignee">
<?php endif ?>
<?= $this->avatar->small(
$task['owner_id'],
$task['assignee_username'],
$task['assignee_name'],
$task['assignee_email'],
$task['assignee_avatar_path'],
'avatar-inline'
) ?>
</span>
</div>
<?php endif ?>
+141
View File
@@ -0,0 +1,141 @@
<?php if (! empty($task['category_id'])): ?>
<div class="task-board-category-container task-board-category-container-color">
<span class="task-board-category category-<?= $this->text->e($task['category_name']) ?> <?= $task['category_color_id'] ? "color-{$task['category_color_id']}" : '' ?>">
<?php if ($not_editable): ?>
<?= $this->text->e($task['category_name']) ?>
<?php else: ?>
<?= $this->url->link(
$this->text->e($task['category_name']),
'TaskModificationController',
'edit',
array('task_id' => $task['id']),
false,
'js-modal-large' . (! empty($task['category_description']) ? ' tooltip' : ''),
t('Change category')
) ?>
<?php if (! empty($task['category_description'])): ?>
<?= $this->app->tooltipMarkdown($task['category_description']) ?>
<?php endif ?>
<?php endif ?>
</span>
</div>
<?php endif ?>
<?php if (! empty($task['tags'])): ?>
<div class="task-tags">
<ul>
<?php foreach ($task['tags'] as $tag): ?>
<li class="task-tag <?= $tag['color_id'] ? "color-{$tag['color_id']}" : '' ?>"><?= $this->text->e($tag['name']) ?></li>
<?php endforeach ?>
</ul>
</div>
<?php endif ?>
<div class="task-board-icons">
<div class="task-board-icons-row">
<?php if ($task['reference']): ?>
<span class="task-board-reference" title="<?= t('Reference') ?>">
<span class="ui-helper-hidden-accessible"><?= t('Reference') ?> </span><?= $this->task->renderReference($task) ?>
</span>
<?php endif ?>
</div>
<div class="task-board-icons-row">
<?php if ($task['is_milestone'] == 1): ?>
<span title="<?= t('Milestone') ?>">
<i class="fa fa-flag flag-milestone" role="img" aria-label="<?= t('Milestone') ?>"></i>
</span>
<?php endif ?>
<?php if ($task['score']): ?>
<span class="task-score" title="<?= t('Complexity') ?>">
<i class="fa fa-trophy" role="img" aria-label="<?= t('Complexity') ?>"></i>
<?= $this->text->e($task['score']) ?>
</span>
<?php endif ?>
<?php if (! empty($task['time_estimated']) || ! empty($task['time_spent'])): ?>
<span class="task-time-estimated" title="<?= t('Time spent and estimated') ?>">
<span class="ui-helper-hidden-accessible"><?= t('Time spent and estimated') ?> </span><?= $this->text->e($task['time_spent']) ?>/<?= $this->text->e($task['time_estimated']) ?>h
</span>
<?php endif ?>
<?php if (! empty($task['date_due'])): ?>
<span class="task-date
<?php if (time() > $task['date_due']): ?>
task-date-overdue
<?php elseif (date('Y-m-d') == date('Y-m-d', $task['date_due'])): ?>
task-date-today
<?php endif ?>
">
<i class="fa fa-calendar"></i>
<?php if (date('Hi', $task['date_due']) === '0000' ): ?>
<?= $this->dt->date($task['date_due']) ?>
<?php else: ?>
<?= $this->dt->datetime($task['date_due']) ?>
<?php endif ?>
</span>
<?php endif ?>
</div>
<div class="task-board-icons-row">
<?php if ($task['recurrence_status'] == \Kanboard\Model\TaskModel::RECURRING_STATUS_PENDING): ?>
<?= $this->app->tooltipLink('<i class="fa fa-refresh fa-rotate-90"></i>', $this->url->href('BoardTooltipController', 'recurrence', array('task_id' => $task['id']))) ?>
<?php endif ?>
<?php if ($task['recurrence_status'] == \Kanboard\Model\TaskModel::RECURRING_STATUS_PROCESSED): ?>
<?= $this->app->tooltipLink('<i class="fa fa-refresh fa-rotate-90 fa-inverse"></i>', $this->url->href('BoardTooltipController', 'recurrence', array('task_id' => $task['id']))) ?>
<?php endif ?>
<?php if (! empty($task['nb_links'])): ?>
<?= $this->app->tooltipLink('<i class="fa fa-code-fork fa-fw"></i>'.$task['nb_links'], $this->url->href('BoardTooltipController', 'tasklinks', array('task_id' => $task['id']))) ?>
<?php endif ?>
<?php if (! empty($task['nb_external_links'])): ?>
<?= $this->app->tooltipLink('<i class="fa fa-external-link fa-fw"></i>'.$task['nb_external_links'], $this->url->href('BoardTooltipController', 'externallinks', array('task_id' => $task['id']))) ?>
<?php endif ?>
<?php if (! empty($task['nb_subtasks'])): ?>
<?php $nb_subtasks = (int) $task['nb_subtasks']; $nb_completed = (int) $task['nb_completed_subtasks']; $percentage = $nb_subtasks > 0 ? round($nb_completed / $nb_subtasks * 100, 0) : 0; ?>
<?= $this->app->tooltipLink('<i class="fa fa-bars fa-fw"></i>'.$percentage.'% ('.$nb_completed.'/'.$nb_subtasks.')', $this->url->href('BoardTooltipController', 'subtasks', array('task_id' => $task['id']))) ?>
<?php endif ?>
<?php if (! empty($task['nb_files'])): ?>
<?= $this->app->tooltipLink('<i class="fa fa-paperclip fa-fw"></i>'.$task['nb_files'], $this->url->href('BoardTooltipController', 'attachments', array('task_id' => $task['id']))) ?>
<?php endif ?>
<?php if ($task['nb_comments'] > 0): ?>
<?php if ($not_editable): ?>
<?php $aria_label = $task['nb_comments'] == 1 ? t('%d comment', $task['nb_comments']) : t('%d comments', $task['nb_comments']); ?>
<span title="<?= $aria_label ?>" role="img" aria-label="<?= $aria_label ?>"><i class="fa fa-comments-o"></i>&nbsp;<?= $task['nb_comments'] ?></span>
<?php else: ?>
<?= $this->modal->medium(
'comments-o',
$task['nb_comments'],
'CommentListController',
'show',
array('task_id' => $task['id']),
$task['nb_comments'] == 1 ? t('%d comment', $task['nb_comments']) : t('%d comments', $task['nb_comments'])
) ?>
<?php endif ?>
<?php endif ?>
<?php if (! empty($task['description'])): ?>
<?= $this->app->tooltipLink('<i class="fa fa-file-text-o"></i>', $this->url->href('BoardTooltipController', 'description', array('task_id' => $task['id']))) ?>
<?php endif ?>
<?php if ($task['is_active'] == 1): ?>
<div class="task-icon-age">
<span title="<?= t('Task age in days')?>" class="task-icon-age-total"><span class="ui-helper-hidden-accessible"><?= t('Task age in days') ?> </span><?= $this->dt->age($task['date_creation']) ?></span>
<span title="<?= t('Days in this column')?>" class="task-icon-age-column"><span class="ui-helper-hidden-accessible"><?= t('Days in this column') ?> </span><?= $this->dt->age($task['date_moved']) ?></span>
</div>
<?php else: ?>
<span class="task-board-closed"><i class="fa fa-ban fa-fw"></i><?= t('Closed') ?></span>
<?php endif ?>
<?= $this->task->renderPriority($task['priority']) ?>
<?= $this->hook->render('template:board:task:icons', array('task' => $task)) ?>
</div>
</div>
<?= $this->hook->render('template:board:task:footer', array('task' => $task)) ?>
+71
View File
@@ -0,0 +1,71 @@
<div class="
task-board
<?= $task['is_draggable'] ? 'draggable-item ' : '' ?>
<?= $task['is_active'] == 1 ? 'task-board-status-open '.($task['date_modification'] > (time() - $board_highlight_period) ? 'task-board-recent' : '') : 'task-board-status-closed' ?>
color-<?= $task['color_id'] ?>"
data-task-id="<?= $task['id'] ?>"
data-column-id="<?= $task['column_id'] ?>"
data-swimlane-id="<?= $task['swimlane_id'] ?>"
data-position="<?= $task['position'] ?>"
data-owner-id="<?= $task['owner_id'] ?>"
data-category-id="<?= $task['category_id'] ?>"
data-due-date="<?= $task['date_due'] ?>"
data-task-url="<?= $this->url->href('TaskViewController', 'show', array('task_id' => $task['id'])) ?>">
<div class="task-board-sort-handle" style="display: none;"><i class="fa fa-arrows-alt"></i></div>
<?php if ($this->board->isCollapsed($task['project_id'])): ?>
<div class="task-board-collapsed">
<div class="task-board-saving-icon" style="display: none;"><i class="fa fa-spinner fa-pulse"></i></div>
<?php if ($this->user->hasProjectAccess('TaskModificationController', 'edit', $task['project_id'])): ?>
<?= $this->render('task/dropdown', array('task' => $task, 'redirect' => 'board')) ?>
<?php if ($this->projectRole->canUpdateTask($task)): ?>
<?= $this->modal->large('edit', '', 'TaskModificationController', 'edit', array('task_id' => $task['id'])) ?>
<?php endif ?>
<?php else: ?>
<strong><?= '#'.$task['id'] ?></strong>
<?php endif ?>
<?php if (! empty($task['assignee_username'])): ?>
<span title="<?= $this->text->e($task['assignee_name'] ?: $task['assignee_username']) ?>">
<?= $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']), false, '', $this->text->e($task['title'])) ?>
</div>
<?php else: ?>
<div class="task-board-expanded">
<div class="task-board-saving-icon" style="display: none;"><i class="fa fa-spinner fa-pulse fa-2x"></i></div>
<div class="task-board-header">
<?php if ($this->user->hasProjectAccess('TaskModificationController', 'edit', $task['project_id'])): ?>
<?= $this->render('task/dropdown', array('task' => $task, 'redirect' => 'board')) ?>
<?php if ($this->projectRole->canUpdateTask($task)): ?>
<?= $this->modal->large('edit', '', 'TaskModificationController', 'edit', array('task_id' => $task['id'])) ?>
<?php endif ?>
<?php else: ?>
<strong><?= '#'.$task['id'] ?></strong>
<?php endif ?>
<?php if (! empty($task['owner_id'])): ?>
<span class="task-board-assignee">
<?= $this->text->e($task['assignee_name'] ?: $task['assignee_username']) ?>
</span>
<?php endif ?>
<?= $this->render('board/task_avatar', array('task' => $task)) ?>
</div>
<?= $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'])) ?>
</div>
<?= $this->hook->render('template:board:private:task:after-title', array('task' => $task)) ?>
<?= $this->render('board/task_footer', array(
'task' => $task,
'not_editable' => $not_editable,
'project' => $project,
)) ?>
</div>
<?php endif ?>
</div>
+25
View File
@@ -0,0 +1,25 @@
<div class="task-board color-<?= $task['color_id'] ?> <?= $task['date_modification'] > time() - $board_highlight_period ? 'task-board-recent' : '' ?>">
<div class="task-board-header">
<?= $this->url->link('#'.$task['id'], 'TaskViewController', 'readonly', array('task_id' => $task['id'], 'token' => $project['token'])) ?>
<?php if (! empty($task['owner_id'])): ?>
<span class="task-board-assignee">
<?= $this->text->e($task['assignee_name'] ?: $task['assignee_username']) ?>
</span>
<?php endif ?>
<?= $this->render('board/task_avatar', array('task' => $task)) ?>
</div>
<?= $this->hook->render('template:board:public:task:before-title', array('task' => $task)) ?>
<div class="task-board-title">
<?= $this->url->link($this->text->e($task['title']), 'TaskViewController', 'readonly', array('task_id' => $task['id'], 'token' => $project['token'])) ?>
</div>
<?= $this->hook->render('template:board:public:task:after-title', array('task' => $task)) ?>
<?= $this->render('board/task_footer', array(
'task' => $task,
'not_editable' => $not_editable,
'project' => $project,
)) ?>
</div>
@@ -0,0 +1,5 @@
<section class="tooltip-large">
<div class="markdown">
<?= $this->text->markdown($task['description']) ?>
</div>
</section>
@@ -0,0 +1,22 @@
<div class="tooltip-large">
<table class="table-small">
<tr>
<th class="column-20"><?= t('Type') ?></th>
<th class="column-70"><?= t('Title') ?></th>
<th class="column-10"><?= t('Dependency') ?></th>
</tr>
<?php foreach ($links as $link): ?>
<tr>
<td>
<?= $link['type'] ?>
</td>
<td>
<a href="<?= $this->text->e($link['url']) ?>" title="<?= $this->text->e($link['url']) ?>" target="_blank"><?= $this->text->e($link['title']) ?></a>
</td>
<td>
<?= $this->text->e($link['dependency_label']) ?>
</td>
</tr>
<?php endforeach ?>
</table>
</div>
+24
View File
@@ -0,0 +1,24 @@
<div class="tooltip-large">
<table class="table-small">
<?php foreach ($files as $file): ?>
<tr>
<th>
<i class="fa <?= $this->file->icon($file['name']) ?> fa-fw"></i>
<?= $this->text->e($file['name']) ?>
</th>
</tr>
<tr>
<td>
<?= $this->url->icon('download', t('Download'), 'FileViewerController', 'download', array('task_id' => $task['id'], 'file_id' => $file['id'], 'etag' => $file['etag'])) ?>
<?php if ($this->file->getPreviewType($file['name']) !== null || $file['is_image'] == 1): ?>
&nbsp;<?= $this->modal->large('eye', t('View file'), 'FileViewerController', 'show', array('task_id' => $task['id'], 'file_id' => $file['id'], 'etag' => $file['etag'])) ?>
&nbsp;<?= $this->url->icon('external-link', t('View file'), 'FileViewerController', ($file['is_image'] == 1 ? 'image' : 'show'), array('task_id' => $task['id'], 'file_id' => $file['id'], 'etag' => $file['etag']), false, '', '', true) ?>
<?php elseif ($this->file->getBrowserViewType($file['name']) !== null): ?>
<i class="fa fa-eye fa-fw"></i>
<?= $this->url->link(t('View file'), 'FileViewerController', 'browser', array('task_id' => $task['id'], 'file_id' => $file['id']), false, '', '', true) ?>
<?php endif ?>
</td>
</tr>
<?php endforeach ?>
</table>
</div>
+24
View File
@@ -0,0 +1,24 @@
<div class="tooltip-large">
<table class="table-small">
<tr>
<th class="column-70"><?= t('Subtask') ?></th>
<?= $this->hook->render('template:board:tooltip:subtasks:header:before-assignee') ?>
<th><?= t('Assignee') ?></th>
</tr>
<?php foreach ($subtasks as $subtask): ?>
<tr>
<td>
<?= $this->subtask->renderToggleStatus($task, $subtask) ?>
</td>
<?= $this->hook->render('template:board:tooltip:subtasks:rows', array('subtask' => $subtask)) ?>
<td>
<?php if (! empty($subtask['username'])): ?>
<?= $this->text->e($subtask['name'] ?: $subtask['username']) ?>
<?php else: ?>
<?= t('Not assigned') ?>
<?php endif ?>
</td>
</tr>
<?php endforeach ?>
</table>
</div>
+34
View File
@@ -0,0 +1,34 @@
<div class="tooltip-large">
<table class="table-small">
<?php foreach ($links as $label => $grouped_links): ?>
<tr>
<th colspan="4"><?= t($label) ?></th>
</tr>
<?php foreach ($grouped_links as $link): ?>
<tr>
<td class="column-10">
<?= $this->task->getProgress($link).'%' ?>
</td>
<td class="column-60">
<?= $this->url->link(
$this->text->e('#'.$link['task_id'].' '.$link['title']),
'TaskViewController', 'show', array('task_id' => $link['task_id']),
false,
$link['is_active'] ? '' : 'task-link-closed'
) ?>
</td>
<td>
<?php if (! empty($link['task_assignee_username'])): ?>
<?= $this->text->e($link['task_assignee_name'] ?: $link['task_assignee_username']) ?>
<?php else: ?>
<?= t('Not assigned') ?>
<?php endif ?>
</td>
<td>
<?= $link['project_name'] ?>
</td>
</tr>
<?php endforeach ?>
<?php endforeach ?>
</table>
</div>
+12
View File
@@ -0,0 +1,12 @@
<section id="main">
<?= $this->projectHeader->render($project, 'BoardViewController', 'show', true) ?>
<?= $this->render('board/table_container', array(
'project' => $project,
'swimlanes' => $swimlanes,
'board_private_refresh_interval' => $board_private_refresh_interval,
'board_highlight_period' => $board_highlight_period,
)) ?>
</section>
+11
View File
@@ -0,0 +1,11 @@
<section id="main" class="public-board">
<?= $this->render('board/table_container', array(
'project' => $project,
'swimlanes' => $swimlanes,
'board_private_refresh_interval' => $board_private_refresh_interval,
'board_highlight_period' => $board_highlight_period,
'not_editable' => true,
)) ?>
</section>
@@ -0,0 +1,15 @@
<div class="page-header">
<h2><?= t('Do you really want to close all tasks of this column?') ?></h2>
</div>
<form method="post" action="<?= $this->url->href('BoardPopoverController', 'closeColumnTasks', array('project_id' => $project['id'])) ?>">
<?= $this->form->csrf() ?>
<?= $this->form->hidden('column_id', $values) ?>
<?= $this->form->hidden('swimlane_id', $values) ?>
<p class="alert"><?= t('%d task(s) in the column "%s" and the swimlane "%s" will be closed.', $nb_tasks, $column, $swimlane) ?></p>
<?= $this->modal->submitButtons(array(
'submitLabel' => t('Yes'),
'color' => 'red',
)) ?>
</form>
+14
View File
@@ -0,0 +1,14 @@
<div class="page-header">
<h2><?= t('Add a new category') ?></h2>
</div>
<form method="post" action="<?= $this->url->href('CategoryController', 'save', array('project_id' => $project['id'])) ?>" autocomplete="off">
<?= $this->form->csrf() ?>
<?= $this->form->label(t('Category Name'), 'name') ?>
<?= $this->form->text('name', $values, $errors, array('autofocus', 'required')) ?>
<?= $this->form->label(t('Color'), 'color_id') ?>
<?= $this->form->select('color_id', array('' => t('No color')) + $colors, $values, $errors, array(), 'color-picker') ?>
<?= $this->modal->submitButtons() ?>
</form>
+18
View File
@@ -0,0 +1,18 @@
<div class="page-header">
<h2><?= t('Category modification for the project "%s"', $project['name']) ?></h2>
</div>
<form method="post" action="<?= $this->url->href('CategoryController', 'update', array('project_id' => $project['id'], 'category_id' => $values['id'])) ?>" autocomplete="off">
<?= $this->form->csrf() ?>
<?= $this->form->label(t('Category Name'), 'name') ?>
<?= $this->form->text('name', $values, $errors, array('autofocus', 'required', 'maxlength="191"', 'tabindex="1"')) ?>
<?= $this->form->label(t('Description'), 'description') ?>
<?= $this->form->textEditor('description', $values, $errors, array('tabindex' => 2)) ?>
<?= $this->form->label(t('Color'), 'color_id') ?>
<?= $this->form->select('color_id', array('' => t('No color')) + $colors, $values, $errors, array(), 'color-picker') ?>
<?= $this->modal->submitButtons() ?>
</form>
+42
View File
@@ -0,0 +1,42 @@
<div class="page-header">
<h2><?= t('Categories') ?></h2>
<ul>
<li>
<?= $this->modal->medium('plus', t('Add a new category'), 'CategoryController', 'create', array('project_id' => $project['id'])) ?>
</li>
</ul>
</div>
<?php if (empty($categories)): ?>
<p class="alert"><?= t('There is no category in this project.') ?></p>
<?php else: ?>
<table class="table-striped">
<tr>
<th><?= t('Category Name') ?></th>
<th><?= t('Color') ?></th>
</tr>
<?php foreach ($categories as $category): ?>
<tr>
<td>
<div class="dropdown">
<a href="#" class="dropdown-menu dropdown-menu-link-icon"><i class="fa fa-cog"></i><i class="fa fa-caret-down"></i></a>
<ul>
<li>
<?= $this->modal->medium('edit', t('Edit'), 'CategoryController', 'edit', array('project_id' => $project['id'], 'category_id' => $category['id'])) ?>
</li>
<li>
<?= $this->modal->confirm('trash-o', t('Remove'), 'CategoryController', 'confirm', array('project_id' => $project['id'], 'category_id' => $category['id'])) ?>
</li>
</ul>
</div>
<?= $this->text->e($category['name']) ?>
<?php if (! empty($category['description'])): ?>
<?= $this->app->tooltipMarkdown($category['description']) ?>
<?php endif ?>
</td>
<td><?= $this->text->e($colors[$category['color_id']] ?? '') ?></td>
</tr>
<?php endforeach ?>
</table>
<?php endif ?>
+15
View File
@@ -0,0 +1,15 @@
<div class="page-header">
<h2><?= t('Remove a category') ?></h2>
</div>
<div class="confirm">
<p class="alert alert-info">
<?= t('Do you really want to remove this category: "%s"?', $category['name']) ?>
</p>
<?= $this->modal->confirmButtons(
'CategoryController',
'remove',
array('project_id' => $project['id'], 'category_id' => $category['id'])
) ?>
</div>
+19
View File
@@ -0,0 +1,19 @@
<div class="page-header">
<h2><?= t('Add a new column') ?></h2>
</div>
<form method="post" action="<?= $this->url->href('ColumnController', 'save', array('project_id' => $project['id'])) ?>" autocomplete="off">
<?= $this->form->csrf() ?>
<?= $this->form->label(t('Title'), 'title') ?>
<?= $this->form->text('title', $values, $errors, array('autofocus', 'required', 'maxlength="191"', 'tabindex="1"')) ?>
<?= $this->form->label(t('Task limit'), 'task_limit') ?>
<?= $this->form->number('task_limit', $values, $errors, array('tabindex="2"', 'min="0"')) ?>
<?= $this->form->checkbox('hide_in_dashboard', t('Hide tasks in this column in the dashboard'), 1, false, '', array('tabindex' => 3)) ?>
<?= $this->form->label(t('Description'), 'description') ?>
<?= $this->form->textEditor('description', $values, $errors, array('tabindex' => 4)) ?>
<?= $this->modal->submitButtons() ?>
</form>
+20
View File
@@ -0,0 +1,20 @@
<div class="page-header">
<h2><?= t('Edit column "%s"', $column['title']) ?></h2>
</div>
<form method="post" action="<?= $this->url->href('ColumnController', 'update', array('project_id' => $project['id'], 'column_id' => $column['id'])) ?>" autocomplete="off">
<?= $this->form->csrf() ?>
<?= $this->form->label(t('Title'), 'title') ?>
<?= $this->form->text('title', $values, $errors, array('autofocus', 'required', 'maxlength="191"')) ?>
<?= $this->form->label(t('Task limit'), 'task_limit') ?>
<?= $this->form->number('task_limit', $values, $errors, array('min="0"')) ?>
<?= $this->form->checkbox('hide_in_dashboard', t('Hide tasks in this column in the dashboard'), 1, $values['hide_in_dashboard'] == 1) ?>
<?= $this->form->label(t('Description'), 'description') ?>
<?= $this->form->textEditor('description', $values, $errors) ?>
<?= $this->modal->submitButtons() ?>
</form>
+64
View File
@@ -0,0 +1,64 @@
<div class="page-header">
<h2><?= t('Edit the board for "%s"', $project['name']) ?></h2>
<ul>
<li>
<?= $this->modal->medium('plus', t('Add a new column'), 'ColumnController', 'create', array('project_id' => $project['id'])) ?>
</li>
</ul>
</div>
<?php if (empty($columns)): ?>
<p class="alert alert-error"><?= t('Your board doesn\'t have any columns!') ?></p>
<?php else: ?>
<table
class="columns-table table-striped"
data-save-position-url="<?= $this->url->href('ColumnController', 'move', array('project_id' => $project['id'], 'csrf_token' => $this->app->getToken()->getReusableCSRFToken())) ?>">
<thead>
<tr>
<th><?= t('Column') ?></th>
<th class="column-10"><?= t('Task limit') ?></th>
<th class="column-15"><?= t('Visible on dashboard') ?></th>
<th class="column-12"><?= t('Open tasks') ?></th>
<th class="column-12"><?= t('Closed tasks') ?></th>
</tr>
</thead>
<tbody>
<?php foreach ($columns as $column): ?>
<tr data-column-id="<?= $column['id'] ?>">
<td>
<i class="fa fa-arrows-alt draggable-row-handle" title="<?= t('Change column position') ?>" role="button" aria-label="<?= t('Change column position') ?>"></i>&nbsp;
<div class="dropdown">
<a href="#" class="dropdown-menu dropdown-menu-link-icon"><i class="fa fa-cog"></i><i class="fa fa-caret-down"></i></a>
<ul>
<li>
<?= $this->modal->medium('edit', t('Edit'), 'ColumnController', 'edit', array('project_id' => $project['id'], 'column_id' => $column['id'])) ?>
</li>
<?php if ($column['nb_open_tasks'] == 0 && $column['nb_closed_tasks'] == 0): ?>
<li>
<?= $this->modal->confirm('trash-o', t('Remove'), 'ColumnController', 'confirm', array('project_id' => $project['id'], 'column_id' => $column['id'])) ?>
</li>
<?php endif ?>
</ul>
</div>
<?= $this->text->e($column['title']) ?>
<?php if (! empty($column['description'])): ?>
<?= $this->app->tooltipMarkdown($column['description']) ?>
<?php endif ?>
</td>
<td>
<?= $column['task_limit'] ?: '∞' ?>
</td>
<td>
<?= $column['hide_in_dashboard'] == 0 ? t('Yes') : t('No') ?>
</td>
<td>
<?= $column['nb_open_tasks'] ?>
</td>
<td>
<?= $column['nb_closed_tasks'] ?>
</td>
</tr>
<?php endforeach ?>
</tbody>
</table>
<?php endif ?>
+15
View File
@@ -0,0 +1,15 @@
<div class="page-header">
<h2><?= t('Remove a column') ?></h2>
</div>
<div class="confirm">
<p class="alert alert-info">
<?= t('Do you really want to remove this column: "%s"?', $column['title']) ?>
</p>
<?= $this->modal->confirmButtons(
'ColumnController',
'remove',
array('project_id' => $project['id'], 'column_id' => $column['id'])
) ?>
</div>
@@ -0,0 +1,20 @@
<div class="page-header">
<h2><?= t('New drag and drop restriction for the role "%s"', $role['role']) ?></h2>
</div>
<form method="post" action="<?= $this->url->href('ColumnMoveRestrictionController', 'save', array('project_id' => $project['id'])) ?>" autocomplete="off">
<?= $this->form->csrf() ?>
<?= $this->form->hidden('project_id', $values) ?>
<?= $this->form->hidden('role_id', $values) ?>
<?= $this->form->label(t('Source column'), 'src_column_id') ?>
<?= $this->form->select('src_column_id', $columns, $values, $errors) ?>
<?= $this->form->label(t('Destination column'), 'dst_column_id') ?>
<?= $this->form->select('dst_column_id', $columns, $values, $errors) ?>
<?= $this->form->checkbox('only_assigned', t('Only for tasks assigned to the current user'), 1, isset($values['only_assigned']) && $values['only_assigned'] == 1) ?>
<?= $this->modal->submitButtons() ?>
<p class="alert alert-info"><?= t('People belonging to this role will be able to move tasks only between the source and the destination column.') ?></p>
</form>
@@ -0,0 +1,15 @@
<div class="page-header">
<h2><?= t('Remove a column restriction') ?></h2>
</div>
<div class="confirm">
<p class="alert alert-info">
<?= t('Do you really want to remove this column restriction: "%s" to "%s"?', $restriction['src_column_title'], $restriction['dst_column_title']) ?>
</p>
<?= $this->modal->confirmButtons(
'ColumnMoveRestrictionController',
'remove',
array('project_id' => $project['id'], 'restriction_id' => $restriction['restriction_id'])
) ?>
</div>
@@ -0,0 +1,16 @@
<div class="page-header">
<h2><?= t('New column restriction for the role "%s"', $role['role']) ?></h2>
</div>
<form method="post" action="<?= $this->url->href('ColumnRestrictionController', 'save', array('project_id' => $project['id'])) ?>" autocomplete="off">
<?= $this->form->csrf() ?>
<?= $this->form->hidden('project_id', $values) ?>
<?= $this->form->hidden('role_id', $values) ?>
<?= $this->form->label(t('Rule'), 'rule') ?>
<?= $this->form->select('rule', $rules, $values, $errors) ?>
<?= $this->form->label(t('Column'), 'column_id') ?>
<?= $this->form->select('column_id', $columns, $values, $errors) ?>
<?= $this->modal->submitButtons() ?>
</form>
@@ -0,0 +1,15 @@
<div class="page-header">
<h2><?= t('Remove a column restriction') ?></h2>
</div>
<div class="confirm">
<p class="alert alert-info">
<?= t('Do you really want to remove this column restriction?') ?>
</p>
<?= $this->modal->confirmButtons(
'ColumnRestrictionController',
'remove',
array('project_id' => $project['id'], 'restriction_id' => $restriction['restriction_id'])
) ?>
</div>
+36
View File
@@ -0,0 +1,36 @@
<?php use Kanboard\Core\Security\Role; ?>
<div class="page-header">
<h2><?= t('Add a comment') ?></h2>
<ul>
<li>
<?= $this->modal->medium('paper-plane', t('Send by email'), 'CommentMailController', 'create', array('task_id' => $task['id'])) ?>
</li>
</ul>
</div>
<form method="post" action="<?= $this->url->href('CommentController', 'save', array('task_id' => $task['id'])) ?>" autocomplete="off">
<?= $this->form->csrf() ?>
<?= $this->form->textEditor('comment', $values, $errors, array('autofocus' => true, 'required' => true, 'aria-label' => t('New comment'))) ?>
<?php
$formName = 'visibility';
$visibilityOptions['app-user'] = t('Standard users');
$attribute[] = ('hidden');
?>
<?php if ($this->user->getRole() !== Role::APP_USER) {
echo $this->form->label(t('Visibility:'), $formName);
$attribute = [];
$visibilityOptions['app-user'] = t('Standard users');
$visibilityOptions['app-manager'] = t('Application managers or more');
}
?>
<?php if ($this->user->getRole() === Role::APP_ADMIN) {
$visibilityOptions['app-admin'] = t('Administrators');
}
?>
<?= $this->form->select($formName, $visibilityOptions, array(), array(), $attribute) ?>
<?= $this->modal->submitButtons() ?>
</form>
+11
View File
@@ -0,0 +1,11 @@
<div class="page-header">
<h2><?= t('Edit a comment') ?></h2>
</div>
<form method="post" action="<?= $this->url->href('CommentController', 'update', array('task_id' => $task['id'], 'comment_id' => $comment['id'])) ?>" autocomplete="off">
<?= $this->form->csrf() ?>
<?= $this->form->textEditor('comment', $values, $errors, array('autofocus' => true, 'required' => true, 'aria-label' => t('Comment'))) ?>
<?= $this->modal->submitButtons() ?>
</form>
+21
View File
@@ -0,0 +1,21 @@
<div class="page-header">
<h2><?= t('Remove a comment') ?></h2>
</div>
<div class="confirm">
<p class="alert alert-info">
<?= t('Do you really want to remove this comment?') ?>
</p>
<?= $this->render('comment/show', array(
'comment' => $comment,
'task' => $task,
'hide_actions' => true
)) ?>
<?= $this->modal->confirmButtons(
'CommentController',
'remove',
array('task_id' => $task['id'], 'comment_id' => $comment['id'])
) ?>
</div>
+75
View File
@@ -0,0 +1,75 @@
<?php
use Kanboard\Core\Security\Role;
$userRole = $this->user->getRole();
if ($userRole === '' && $comment['visibility'] !== Role::APP_USER) {
return;
}
if ($userRole === Role::APP_MANAGER && $comment['visibility'] === Role::APP_ADMIN) {
return;
}
if ($userRole === Role::APP_USER && $comment['visibility'] !== Role::APP_USER) {
return;
}
?>
<div class="comment <?= isset($preview) ? 'comment-preview' : '' ?>" id="comment-<?= $comment['id'] ?>">
<?= $this->avatar->render($comment['user_id'], $comment['username'], $comment['name'], $comment['email'], $comment['avatar_path']) ?>
<div class="comment-title">
<?php if (! empty($comment['username'])): ?>
<strong class="comment-username"><?= $this->text->e($comment['name'] ?: $comment['username']) ?></strong>
<?php endif ?>
<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>
<small class="comment-visibility"><?= t('Visibility:') ?>
<?php if ($comment['visibility'] === Role::APP_USER): ?>
<?= t('Standard users') ?>
<?php elseif ($comment['visibility'] === Role::APP_MANAGER): ?>
<?= t('Application managers or more') ?>
<?php else: ?>
<?= t('Administrators') ?>
<?php endif ?>
</small>
</div>
<?php if (! isset($hide_actions)): ?>
<div class="comment-actions">
<div class="dropdown">
<a href="#" class="dropdown-menu dropdown-menu-link-icon"><i class="fa fa-cog"></i><i class="fa fa-caret-down"></i></a>
<ul>
<li>
<?= $this->url->icon('link', t('Link'), 'TaskViewController', 'show', array('task_id' => $task['id']), false, '', '', $this->app->isAjax(), 'comment-'.$comment['id']) ?>
</li>
<li data-comment-id="<?= $comment['id'] ?>">
<?= $this->url->icon('reply', t('Reply'), 'TaskViewController', 'show', array('task_id' => $task['id']), false, 'js-reply-to-comment', '', $this->app->isAjax(), 'form-task_id') ?>
</li>
<?php if ($editable && ($this->user->isAdmin() || $this->user->isCurrentUser($comment['user_id']))): ?>
<li>
<?= $this->modal->medium('edit', t('Edit'), 'CommentController', 'edit', array('task_id' => $task['id'], 'comment_id' => $comment['id'])) ?>
</li>
<li>
<?= $this->modal->confirm('trash-o', t('Remove'), 'CommentController', 'confirm', array('task_id' => $task['id'], 'comment_id' => $comment['id'])) ?>
</li>
<?php endif ?>
</ul>
</div>
</div>
<?php endif ?>
<div class="comment-content">
<div class="markdown">
<?= $this->text->markdown($comment['comment'], isset($is_public) && $is_public) ?>
</div>
<template id="comment-reply-content-<?= $comment['id'] ?>">
<textarea><?= $this->text->reply($comment['name'] ?: $comment['username'], $comment['comment']) ?></textarea>
</template>
</div>
</div>
+30
View File
@@ -0,0 +1,30 @@
<?php use Kanboard\Core\Security\Role;?>
<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'])) ?>" autocomplete="off">
<?= $this->form->csrf() ?>
<?= $this->form->textEditor('comment', array('project_id' => $task['project_id']), array(), array('required' => true, 'aria-label' => t('New comment'))) ?>
<?php
$formName = 'visibility';
$visibilityOptions['app-user'] = t('Standard users');
$attribute[] = ('hidden');
?>
<?php if ($this->user->getRole() !== Role::APP_USER) {
echo $this->form->label(t('Visibility:'), $formName);
$attribute = [];
$visibilityOptions['app-user'] = t('Standard users');
$visibilityOptions['app-manager'] = t('Application managers or more');
}
?>
<?php if ($this->user->getRole() === Role::APP_ADMIN) {
$visibilityOptions['app-admin'] = t('Administrators');
}
?>
<?= $this->form->select($formName, $visibilityOptions, array(), array(), $attribute) ?>
<?= $this->modal->submitButtons() ?>
</form>
+31
View File
@@ -0,0 +1,31 @@
<div class="page-header">
<h2><?= $this->text->e($task['title']) ?></h2>
<?php if (!isset($is_public) || !$is_public): ?>
<ul>
<li>
<?= $this->url->icon('sort', t('Change sorting'), 'CommentListController', 'toggleSorting', array('task_id' => $task['id']), false, 'js-modal-replace') ?>
</li>
<?php if ($editable): ?>
<li>
<?= $this->modal->medium('paper-plane', t('Send by email'), 'CommentMailController', 'create', array('task_id' => $task['id'])) ?>
</li>
<?php endif ?>
</ul>
<?php endif ?>
</div>
<div class="comments">
<?php foreach ($comments as $comment): ?>
<?= $this->render('comment/show', array(
'comment' => $comment,
'task' => $task,
'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>
+73
View File
@@ -0,0 +1,73 @@
<?php use Kanboard\Core\Security\Role; ?>
<div class="page-header">
<h2><?= t('Create and send a comment by email') ?></h2>
</div>
<form method="post" action="<?= $this->url->href('CommentMailController', 'save', array('task_id' => $task['id'])) ?>" autocomplete="off" class="js-mail-form">
<?= $this->form->csrf() ?>
<?= $this->form->hidden('task_id', $values) ?>
<?= $this->form->hidden('user_id', $values) ?>
<?= $this->form->label(t('Email'), 'emails') ?>
<?= $this->form->text('emails', $values, $errors, array('autofocus', 'required', 'tabindex="1"')) ?>
<?php if (! empty($members)): ?>
<div class="dropdown">
<a href="#" class="dropdown-menu dropdown-menu-link-icon"><i class="fa fa-address-card-o"></i><i class="fa fa-caret-down"></i></a>
<ul>
<?php foreach ($members as $member): ?>
<li data-email="<?= $this->text->e($member['email']) ?>" class="js-autocomplete-email">
<?= $this->text->e($this->user->getFullname($member)) ?>
</li>
<?php endforeach ?>
</ul>
</div>
<?php endif ?>
<?= $this->form->label(t('Subject'), 'subject') ?>
<?= $this->form->text('subject', $values, $errors, array('required', 'tabindex="2"')) ?>
<?php if (! empty($project['predefined_email_subjects'])): ?>
<div class="dropdown">
<a href="#" class="dropdown-menu dropdown-menu-link-icon"><i class="fa fa-archive"></i><i class="fa fa-caret-down"></i></a>
<ul>
<?php foreach (explode("\r\n", trim($project['predefined_email_subjects'])) as $subject): ?>
<?php $subject = trim($subject); ?>
<?php if (! empty($subject)): ?>
<li data-subject="<?= $this->text->e($subject) ?>" class="js-autocomplete-subject">
<?= $this->text->e($subject) ?>
</li>
<?php endif ?>
<?php endforeach ?>
</ul>
</div>
<?php endif ?>
<?= $this->form->textEditor('comment', $values, $errors, array('required' => true, 'tabindex' => 3, 'aria-label' => t('New comment'))) ?>
<?php
$formName = 'visibility';
$visibilityOptions['app-user'] = t('Standard users');
$attribute[] = ('hidden');
?>
<?php if ($this->user->getRole() !== Role::APP_USER) {
echo $this->form->label(t('Visibility:'), $formName);
$attribute = [];
$visibilityOptions['app-user'] = t('Standard users');
$visibilityOptions['app-manager'] = t('Application managers or more');
}
?>
<?php if ($this->user->getRole() === Role::APP_ADMIN) {
$visibilityOptions['app-admin'] = t('Administrators');
}
?>
<?= $this->form->select($formName, $visibilityOptions, array(), array(), $attribute) ?>
<?= $this->modal->submitButtons(array(
'submitLabel' => t('Send by email'),
'tabindex' => 4,
)) ?>
</form>
+3
View File
@@ -0,0 +1,3 @@
<?= $this->text->markdown($email['comment'], true) ?>
<?= $this->render('notification/footer', array('task' => $task)) ?>
+94
View File
@@ -0,0 +1,94 @@
<div class="page-header">
<h2><?= t('About') ?></h2>
</div>
<div class="panel">
<ul>
<li>
<?= t('Official website:') ?>
<a href="https://kanboard.org/" target="_blank" rel="noopener noreferrer">https://kanboard.org/</a>
</li>
<li>
<?= t('Author:') ?>
<strong>Frédéric Guillot</strong> (<a href="https://github.com/kanboard/kanboard/graphs/contributors" target="_blank" rel="noopener noreferrer"><?= t('contributors') ?></a>)
</li>
<li>
<?= t('License:') ?>
<strong>MIT</strong>
</li>
</ul>
</div>
<div class="page-header">
<h2><?= t('Configuration') ?></h2>
</div>
<div class="panel">
<ul>
<li>
<?= t('Application version:') ?>
<strong><?= APP_VERSION ?></strong>
</li>
<li>
<?= t('PHP version:') ?>
<strong><?= PHP_VERSION ?></strong>
</li>
<li>
<?= t('PHP SAPI:') ?>
<strong><?= PHP_SAPI ?></strong>
</li>
<li>
<?= t('HTTP Client:') ?>
<strong><?= Kanboard\Core\Http\Client::backend() ?></strong>
</li>
<li>
<?= t('OS version:') ?>
<strong><?= @php_uname('s').' '.@php_uname('r') ?></strong>
</li>
<li>
<?= t('Database driver:') ?>
<strong><?= DB_DRIVER ?></strong>
</li>
<li>
<?= t('Database version:') ?>
<strong><?= $this->text->e($db_version) ?></strong>
</li>
<li>
<?= t('Browser:') ?>
<strong><?= $this->text->e($user_agent) ?></strong>
</li>
</ul>
</div>
<?php if (DB_DRIVER === 'sqlite'): ?>
<div class="page-header">
<h2><?= t('Database') ?></h2>
</div>
<div class="panel">
<ul>
<li>
<?= t('Database size:') ?>
<strong><?= $this->text->bytes($db_size) ?></strong>
</li>
<li>
<?= $this->url->link(t('Download the database'), 'ConfigController', 'downloadDb', array(), true) ?>&nbsp;
<?= t('(Gzip compressed Sqlite file)') ?>
</li>
<li>
<?= $this->url->link(t('Upload the database'), 'ConfigController', 'uploadDb', array(), false, 'js-modal-medium') ?>
</li>
<li>
<?= $this->url->link(t('Optimize the database'), 'ConfigController', 'optimizeDb', array(), true) ?>&nbsp;
<?= t('(VACUUM command)') ?>
</li>
<?php foreach ($db_options as $option => $value): ?>
<li><strong><?= $this->text->e($option) ?></strong> = <?= $this->text->e($value) ?></li>
<?php endforeach ?>
</ul>
</div>
<?php endif ?>
<div class="page-header">
<h2><?= t('License') ?></h2>
</div>
<div class="panel">
<?= nl2br(file_get_contents(ROOT_DIR.DIRECTORY_SEPARATOR.'LICENSE')) ?>
</div>
+17
View File
@@ -0,0 +1,17 @@
<div class="page-header">
<h2><?= t('API') ?></h2>
</div>
<div class="panel">
<ul>
<li>
<?= t('API token:') ?>
<strong><?= $this->text->e($values['api_token']) ?></strong>
</li>
<li>
<?= t('API endpoint:') ?>
<strong><?= $this->text->e($this->url->base()).'jsonrpc.php' ?></strong>
</li>
</ul>
</div>
<?= $this->url->link(t('Reset token'), 'ConfigController', 'token', array('type' => 'api'), true, 'btn btn-red') ?>
+44
View File
@@ -0,0 +1,44 @@
<div class="page-header">
<h2><?= t('Application settings') ?></h2>
</div>
<form method="post" action="<?= $this->url->href('ConfigController', 'save', array('redirect' => 'application')) ?>" autocomplete="off">
<?= $this->form->csrf() ?>
<fieldset>
<?= $this->form->label(t('Application URL'), 'application_url') ?>
<?= $this->form->text('application_url', $values, $errors, array('placeholder="https://example.kanboard.org/"')) ?>
<p class="form-help"><?= t('Example: https://example.kanboard.org/ (used to generate absolute URLs)') ?></p>
<?= $this->form->label(t('Language'), 'application_language') ?>
<?= $this->form->select('application_language', $languages, $values, $errors) ?>
<?= $this->form->checkbox('password_reset', t('Enable "Forget Password"'), 1, $values['password_reset'] == 1) ?>
</fieldset>
<fieldset>
<?= $this->form->label(t('Timezone'), 'application_timezone') ?>
<?= $this->form->select('application_timezone', $timezones, $values, $errors) ?>
<?= $this->form->label(t('Date format'), 'application_date_format') ?>
<?= $this->form->select('application_date_format', $date_formats, $values, $errors) ?>
<p class="form-help"><?= t('ISO format is always accepted, example: "%s" and "%s"', date('Y-m-d'), date('Y_m_d')) ?></p>
<?= $this->form->label(t('Time format'), 'application_time_format') ?>
<?= $this->form->select('application_time_format', $time_formats, $values, $errors) ?>
</fieldset>
<fieldset>
<?= $this->form->checkbox('notifications_enabled', t('Enable notifications by default for all new users'), 1, isset($values['notifications_enabled']) && $values['notifications_enabled'] == 1) ?>
</fieldset>
<fieldset>
<?= $this->form->label(t('Custom Stylesheet'), 'application_stylesheet') ?>
<?= $this->form->textarea('application_stylesheet', $values, $errors) ?>
</fieldset>
<?= $this->hook->render('template:config:application', array('values' => $values, 'errors' => $errors)) ?>
<div class="form-actions">
<button type="submit" class="btn btn-blue"><?= t('Save') ?></button>
</div>
</form>
+26
View File
@@ -0,0 +1,26 @@
<div class="page-header">
<h2><?= t('Board settings') ?></h2>
</div>
<form method="post" action="<?= $this->url->href('ConfigController', 'save', array('redirect' => 'board')) ?>" autocomplete="off">
<?= $this->form->csrf() ?>
<fieldset>
<?= $this->form->label(t('Task highlight period'), 'board_highlight_period') ?>
<?= $this->form->number('board_highlight_period', $values, $errors) ?>
<p class="form-help"><?= t('Period (in second) to consider a task was modified recently (0 to disable, 2 days by default)') ?></p>
<?= $this->form->label(t('Refresh interval for public board'), 'board_public_refresh_interval') ?>
<?= $this->form->number('board_public_refresh_interval', $values, $errors) ?>
<p class="form-help"><?= t('Frequency in second (60 seconds by default)') ?></p>
<?= $this->form->label(t('Refresh interval for personal board'), 'board_private_refresh_interval') ?>
<?= $this->form->number('board_private_refresh_interval', $values, $errors) ?>
<p class="form-help"><?= t('Frequency in second (0 to disable this feature, 10 seconds by default)') ?></p>
</fieldset>
<?= $this->hook->render('template:config:board', array('values' => $values, 'errors' => $errors)) ?>
<div class="form-actions">
<button type="submit" class="btn btn-blue"><?= t('Save') ?></button>
</div>
</form>
+25
View File
@@ -0,0 +1,25 @@
<div class="page-header">
<h2><?= t('Email settings') ?></h2>
</div>
<form method="post" action="<?= $this->url->href('ConfigController', 'save', array('redirect' => 'email')) ?>" autocomplete="off">
<?= $this->form->csrf() ?>
<fieldset>
<legend><?= t('Outgoing Emails') ?></legend>
<?php if (MAIL_CONFIGURATION): ?>
<?= $this->form->label(t('Email sender address'), 'mail_sender_address') ?>
<?= $this->form->text('mail_sender_address', $values, $errors, array('placeholder="'.MAIL_FROM.'"')) ?>
<?= $this->form->label(t('Email transport'), 'mail_transport') ?>
<?= $this->form->select('mail_transport', $mail_transports, $values, $errors) ?>
<?php else: ?>
<p class="alert"><?= t('The email configuration has been disabled by the administrator.') ?></p>
<?php endif ?>
</fieldset>
<?= $this->hook->render('template:config:email', array('values' => $values, 'errors' => $errors)) ?>
<div class="form-actions">
<button type="submit" class="btn btn-blue"><?= t('Save') ?></button>
</div>
</form>
+14
View File
@@ -0,0 +1,14 @@
<div class="page-header">
<h2><?= t('Integration with third-party services') ?></h2>
</div>
<form method="post" action="<?= $this->url->href('ConfigController', 'save', array('redirect' => 'integrations')) ?>" autocomplete="off">
<?= $this->form->csrf() ?>
<?php $contents = $this->hook->render('template:config:integrations', array('values' => $values)) ?>
<?php if (empty($contents)): ?>
<p class="alert"><?= t('There is no external integration installed.') ?></p>
<?php else: ?>
<?= $contents ?>
<?php endif ?>
</form>
@@ -0,0 +1,33 @@
<div class="page-header">
<h2><?= t('Keyboard shortcuts') ?></h2>
</div>
<div class="panel">
<h3><?= t('Board/Calendar/List view') ?></h3>
<ul>
<li><?= t('Switch to the project overview') ?> = <strong>v o</strong></li>
<li><?= t('Switch to the board view') ?> = <strong>v b</strong></li>
<li><?= t('Switch to the list view') ?> = <strong>v l</strong></li>
</ul>
<h3><?= t('Board view') ?></h3>
<ul>
<li><?= t('New task') ?> = <strong>n</strong></li>
<li><?= t('Expand/collapse tasks') ?> = <strong>s</strong></li>
<li><?= t('Compact/wide view') ?> = <strong>c</strong></li>
</ul>
<h3><?= t('Task view') ?></h3>
<ul>
<li><?= t('Edit task') ?> = <strong>e</strong></li>
<li><?= t('New subtask') ?> = <strong>s</strong></li>
<li><?= t('New comment') ?> = <strong>c</strong></li>
<li><?= t('New internal link') ?> = <strong>l</strong></li>
</ul>
<h3><?= t('Application') ?></h3>
<ul>
<li><?= t('Display list of keyboard shortcuts') ?> = <strong>?</strong></li>
<li><?= t('Open board switcher') ?> = <strong>b</strong></li>
<li><?= t('Go to the search/filter box') ?> = <strong>f</strong></li>
<li><?= t('Reset the search/filter box') ?> = <strong>r</strong></li>
<li><?= t('Close dialog box') ?> = <strong>ESC</strong></li>
<li><?= t('Submit a form') ?> = <strong>CTRL+ENTER</strong> <?= t('or') ?> <strong>⌘+ENTER</strong></li>
</ul>
</div>
+9
View File
@@ -0,0 +1,9 @@
<section id="main">
<section class="sidebar-container" id="config-section">
<?= $this->render($sidebar_template) ?>
<div class="sidebar-content">
<?= $content_for_sublayout ?>
</div>
</section>
</section>
+30
View File
@@ -0,0 +1,30 @@
<div class="page-header">
<h2><?= t('Project settings') ?></h2>
</div>
<form method="post" action="<?= $this->url->href('ConfigController', 'save', array('redirect' => 'project')) ?>" autocomplete="off">
<?= $this->form->csrf() ?>
<fieldset>
<?= $this->form->label(t('Default task color'), 'default_color') ?>
<?= $this->form->select('default_color', $colors, $values, $errors) ?>
<?= $this->form->label(t('Default columns for new projects (Comma-separated)'), 'board_columns') ?>
<?= $this->form->text('board_columns', $values, $errors) ?>
<p class="form-help"><?= t('Default values are "%s"', $default_columns) ?></p>
<?= $this->form->label(t('Default categories for new projects (Comma-separated)'), 'project_categories') ?>
<?= $this->form->text('project_categories', $values, $errors) ?>
<p class="form-help"><?= t('Example: "Bug, Feature Request, Improvement"') ?></p>
</fieldset>
<fieldset>
<?= $this->form->checkbox('disable_private_project', t('Disable personal projects'), 1, isset($values['disable_private_project']) && $values['disable_private_project'] == 1) ?>
<?= $this->form->checkbox('subtask_restriction', t('Allow only one subtask in progress at the same time for a user'), 1, $values['subtask_restriction'] == 1) ?>
<?= $this->form->checkbox('subtask_time_tracking', t('Trigger automatically subtask time tracking'), 1, $values['subtask_time_tracking'] == 1) ?>
<?= $this->form->checkbox('cfd_include_closed_tasks', t('Include closed tasks in the cumulative flow diagram'), 1, $values['cfd_include_closed_tasks'] == 1) ?>
</fieldset>
<div class="form-actions">
<button type="submit" class="btn btn-blue"><?= t('Save') ?></button>
</div>
</form>
+38
View File
@@ -0,0 +1,38 @@
<div class="sidebar">
<ul>
<li <?= $this->app->checkMenuSelection('ConfigController', 'index') ?>>
<?= $this->url->link(t('About'), 'ConfigController', 'index') ?>
</li>
<li <?= $this->app->checkMenuSelection('ConfigController', 'application') ?>>
<?= $this->url->link(t('Application settings'), 'ConfigController', 'application') ?>
</li>
<li <?= $this->app->checkMenuSelection('ConfigController', 'email') ?>>
<?= $this->url->link(t('Email settings'), 'ConfigController', 'email') ?>
</li>
<li <?= $this->app->checkMenuSelection('ConfigController', 'project') ?>>
<?= $this->url->link(t('Project settings'), 'ConfigController', 'project') ?>
</li>
<li <?= $this->app->checkMenuSelection('ConfigController', 'board') ?>>
<?= $this->url->link(t('Board settings'), 'ConfigController', 'board') ?>
</li>
<li <?= $this->app->checkMenuSelection('TagController', 'index') ?>>
<?= $this->url->link(t('Tags management'), 'TagController', 'index') ?>
</li>
<li <?= $this->app->checkMenuSelection('LinkController') ?>>
<?= $this->url->link(t('Link labels'), 'LinkController', 'show') ?>
</li>
<li <?= $this->app->checkMenuSelection('CurrencyController') ?>>
<?= $this->url->link(t('Currency rates'), 'CurrencyController', 'show') ?>
</li>
<li <?= $this->app->checkMenuSelection('ConfigController', 'integrations') ?>>
<?= $this->url->link(t('Integrations'), 'ConfigController', 'integrations') ?>
</li>
<li <?= $this->app->checkMenuSelection('ConfigController', 'webhook') ?>>
<?= $this->url->link(t('Webhooks'), 'ConfigController', 'webhook') ?>
</li>
<li <?= $this->app->checkMenuSelection('ConfigController', 'api') ?>>
<?= $this->url->link(t('API'), 'ConfigController', 'api') ?>
</li>
<?= $this->hook->render('template:config:sidebar') ?>
</ul>
</div>
+16
View File
@@ -0,0 +1,16 @@
<div class="page-header">
<h2><?= t('Upload the database') ?></h2>
</div>
<div class="alert">
<p>
<?= t('You could upload the previously downloaded Sqlite database (Gzip format).') ?>
</p>
</div>
<form action="<?= $this->url->href('ConfigController', 'saveUploadedDb', [], true) ?>" method="post" enctype="multipart/form-data">
<?= $this->form->label(t('Database file'), 'file') ?>
<?= $this->form->file('file') ?>
<?= $this->modal->submitButtons(array('submitLabel' => t('Upload'))) ?>
</form>
+23
View File
@@ -0,0 +1,23 @@
<div class="page-header">
<h2><?= t('Webhook settings') ?></h2>
</div>
<form method="post" action="<?= $this->url->href('ConfigController', 'save', array('redirect' => 'webhook')) ?>" autocomplete="off">
<?= $this->form->csrf() ?>
<?= $this->form->label(t('Webhook URL'), 'webhook_url') ?>
<?= $this->form->text('webhook_url', $values, $errors) ?>
<div class="form-actions">
<button type="submit" class="btn btn-blue"><?= t('Save') ?></button>
</div>
</form>
<div class="page-header margin-top">
<h2><?= t('Webhook token') ?></h2>
</div>
<div class="panel">
<?= t('Webhook token:') ?>
<strong><?= $this->text->e($values['webhook_token']) ?></strong>
</div>
<?= $this->url->link(t('Reset token'), 'ConfigController', 'token', array('type' => 'webhook'), true, 'btn btn-red') ?>
+9
View File
@@ -0,0 +1,9 @@
<div class="page-header">
<h2><?= t('Change reference currency') ?></h2>
</div>
<form method="post" action="<?= $this->url->href('CurrencyController', 'update') ?>" autocomplete="off">
<?= $this->form->csrf() ?>
<?= $this->form->label(t('Reference currency'), 'application_currency') ?>
<?= $this->form->select('application_currency', $currencies, $values, $errors) ?>
<?= $this->modal->submitButtons() ?>
</form>
+11
View File
@@ -0,0 +1,11 @@
<div class="page-header">
<h2><?= t('Add or change currency rate') ?></h2>
</div>
<form method="post" action="<?= $this->url->href('CurrencyController', 'save') ?>" autocomplete="off">
<?= $this->form->csrf() ?>
<?= $this->form->label(t('Currency'), 'currency') ?>
<?= $this->form->select('currency', $currencies, $values, $errors) ?>
<?= $this->form->label(t('Rate'), 'rate') ?>
<?= $this->form->text('rate', $values, $errors, array('autofocus'), 'form-numeric') ?>
<?= $this->modal->submitButtons() ?>
</form>
+34
View File
@@ -0,0 +1,34 @@
<div class="page-header">
<h2><?= t('Currency rates') ?></h2>
<ul>
<li>
<?= $this->modal->medium('plus', t('Add or change currency rate'), 'CurrencyController', 'create') ?>
</li>
<li>
<?= $this->modal->medium('edit', t('Change reference currency'), 'CurrencyController', 'change') ?>
</li>
</ul>
</div>
<div class="panel">
<strong><?= t('Reference currency: %s', $application_currency) ?></strong>
</div>
<?php if (! empty($rates)): ?>
<table class="table-striped">
<tr>
<th class="column-35"><?= t('Currency') ?></th>
<th><?= t('Rate') ?></th>
</tr>
<?php foreach ($rates as $rate): ?>
<tr>
<td>
<strong><?= $this->text->e($rate['currency']) ?></strong>
</td>
<td>
<?= n($rate['rate']) ?>
</td>
</tr>
<?php endforeach ?>
</table>
<?php endif ?>
+20
View File
@@ -0,0 +1,20 @@
<div class="page-header">
<h2><?= t('Add a new filter') ?></h2>
</div>
<form method="post" action="<?= $this->url->href('CustomFilterController', 'save', array('project_id' => $project['id'])) ?>" autocomplete="off">
<?= $this->form->csrf() ?>
<?= $this->form->label(t('Name'), 'name') ?>
<?= $this->form->text('name', $values, $errors, array('autofocus', 'required')) ?>
<?= $this->form->label(t('Filter'), 'filter') ?>
<?= $this->form->text('filter', $values, $errors, array('required')) ?>
<?php if ($this->user->hasProjectAccess('ProjectEditController', 'show', $project['id'])): ?>
<?= $this->form->checkbox('is_shared', t('Share with all project members'), 1) ?>
<?php endif ?>
<?= $this->form->checkbox('append', t('Append filter (instead of replacement)'), 1) ?>
<?= $this->modal->submitButtons() ?>
</form>
+25
View File
@@ -0,0 +1,25 @@
<div class="page-header">
<h2><?= t('Edit custom filter') ?></h2>
</div>
<form method="post" action="<?= $this->url->href('CustomFilterController', 'update', array('project_id' => $filter['project_id'], 'filter_id' => $filter['id'])) ?>" autocomplete="off">
<?= $this->form->csrf() ?>
<?= $this->form->hidden('user_id', $values) ?>
<?= $this->form->label(t('Name'), 'name') ?>
<?= $this->form->text('name', $values, $errors, array('autofocus', 'required')) ?>
<?= $this->form->label(t('Filter'), 'filter') ?>
<?= $this->form->text('filter', $values, $errors, array('required')) ?>
<?php if ($this->user->hasProjectAccess('ProjectEditController', 'show', $project['id'])): ?>
<?= $this->form->checkbox('is_shared', t('Share with all project members'), 1, $values['is_shared'] == 1) ?>
<?php else: ?>
<?= $this->form->hidden('is_shared', $values) ?>
<?php endif ?>
<?= $this->form->checkbox('append', t('Append filter (instead of replacement)'), 1, $values['append'] == 1) ?>
<?= $this->modal->submitButtons() ?>
</form>
+57
View File
@@ -0,0 +1,57 @@
<div class="page-header">
<h2><?= t('Custom filters') ?></h2>
<ul>
<li>
<?= $this->modal->medium('filter', t('Add custom filters'), 'CustomFilterController', 'create', array('project_id' => $project['id'])) ?>
</li>
</ul>
</div>
<?php if (! empty($custom_filters)): ?>
<table class="table-striped table-scrolling">
<tr>
<th><?= t('Name') ?></th>
<th class="column-30"><?= t('Filter') ?></th>
<th class="column-10"><?= t('Shared') ?></th>
<th class="column-15"><?= t('Append/Replace') ?></th>
<th class="column-20"><?= t('Owner') ?></th>
</tr>
<?php foreach ($custom_filters as $filter): ?>
<tr>
<td>
<?php if (($filter['user_id'] == $this->user->getId() || $this->user->isAdmin() || $this->projectRole->getProjectUserRole($project['id']) == \Kanboard\Core\Security\Role::PROJECT_MANAGER) && $this->user->hasProjectAccess('CustomFilterController', 'edit', $project['id'])): ?>
<div class="dropdown">
<a href="#" class="dropdown-menu dropdown-menu-link-icon"><i class="fa fa-cog"></i><i class="fa fa-caret-down"></i></a>
<ul>
<li><?= $this->modal->medium('edit', t('Edit'), 'CustomFilterController', 'edit', array('project_id' => $filter['project_id'], 'filter_id' => $filter['id'])) ?></li>
<li><?= $this->modal->confirm('trash-o', t('Remove'), 'CustomFilterController', 'confirm', array('project_id' => $filter['project_id'], 'filter_id' => $filter['id'])) ?></li>
</ul>
</div>
<?php endif ?>
<?= $this->text->e($filter['name']) ?>
</td>
<td>
<?= $this->text->e($filter['filter']) ?>
</td>
<td>
<?php if ($filter['is_shared'] == 1): ?>
<?= t('Yes') ?>
<?php else: ?>
<?= t('No') ?>
<?php endif ?>
</td>
<td>
<?php if ($filter['append'] == 1): ?>
<?= t('Append') ?>
<?php else: ?>
<?= t('Replace') ?>
<?php endif ?>
</td>
<td>
<?= $this->text->e($filter['owner_name'] ?: $filter['owner_username']) ?>
</td>
</tr>
<?php endforeach ?>
</table>
<?php else: ?>
<p class="alert"><?= t('There is no custom filter.') ?></p>
<?php endif ?>
+15
View File
@@ -0,0 +1,15 @@
<div class="page-header">
<h2><?= t('Remove a custom filter') ?></h2>
</div>
<div class="confirm">
<p class="alert alert-info">
<?= t('Do you really want to remove this custom filter: "%s"?', $filter['name']) ?>
</p>
<?= $this->modal->confirmButtons(
'CustomFilterController',
'remove',
array('project_id' => $project['id'], 'filter_id' => $filter['id'])
) ?>
</div>
+9
View File
@@ -0,0 +1,9 @@
<section id="main">
<section class="sidebar-container" id="dashboard">
<?= $this->render($sidebar_template, array('user' => $user)) ?>
<div class="sidebar-content">
<?= $content_for_sublayout ?>
</div>
</section>
</section>
+105
View File
@@ -0,0 +1,105 @@
<?= $this->hook->render('template:dashboard:show:before-filter-box', array('user' => $user)) ?>
<div class="filter-box margin-bottom">
<form method="get" action="<?= $this->url->dir() ?>" class="search">
<?= $this->form->hidden('controller', array('controller' => 'SearchController')) ?>
<?= $this->form->hidden('action', array('action' => 'index')) ?>
<div class="input-addon">
<?= $this->form->text('search', array(), array(), array('placeholder="'.t('Search').'"', 'aria-label="'.t('Search').'"'), 'input-addon-field') ?>
<div class="input-addon-item">
<?= $this->render('app/filters_helper') ?>
</div>
</div>
</form>
</div>
<?= $this->hook->render('template:dashboard:show:after-filter-box', array('user' => $user)) ?>
<?php if (! $project_paginator->isEmpty()): ?>
<div class="table-list">
<?= $this->render('project_list/header', array('paginator' => $project_paginator)) ?>
<?php foreach ($project_paginator->getCollection() as $project): ?>
<div class="table-list-row table-border-left">
<div>
<?php if ($this->user->hasProjectAccess('ProjectViewController', 'show', $project['id'])): ?>
<?= $this->render('project/dropdown', array('project' => $project)) ?>
<?php else: ?>
<strong><?= '#'.$project['id'] ?></strong>
<?php endif ?>
<?= $this->hook->render('template:dashboard:project:before-title', array('project' => $project)) ?>
<span class="table-list-title <?= $project['is_active'] == 0 ? 'status-closed' : '' ?>">
<?= $this->url->link($this->text->e($project['name']), 'BoardViewController', 'show', array('project_id' => $project['id'])) ?>
</span>
<?php if ($project['is_private']): ?>
<i class="fa fa-lock fa-fw" title="<?= t('Personal project') ?>" role="img" aria-label="<?= t('Personal project') ?>"></i>
<?php endif ?>
<?= $this->hook->render('template:dashboard:project:after-title', array('project' => $project)) ?>
</div>
<div class="table-list-details">
<?php foreach ($project['columns'] as $column): ?>
<strong title="<?= t('Task count') ?>"><span class="ui-helper-hidden-accessible"><?= t('Task count') ?> </span><?= $column['nb_open_tasks'] ?></strong>
<small><?= $this->text->e($column['title']) ?></small>
<?php endforeach ?>
</div>
</div>
<?php endforeach ?>
</div>
<?= $project_paginator ?>
<?php endif ?>
<?php if (empty($overview_paginator)): ?>
<p class="alert"><?= t('There is nothing assigned to you.') ?></p>
<?php else: ?>
<?php foreach ($overview_paginator as $result): ?>
<?php if (! $result['paginator']->isEmpty()): ?>
<div class="page-header">
<h2 id="project-tasks-<?= $result['project_id'] ?>"><?= $this->url->link($this->text->e($result['project_name']), 'BoardViewController', 'show', array('project_id' => $result['project_id'])) ?></h2>
</div>
<div class="table-list">
<?= $this->render('task_list/header', array(
'paginator' => $result['paginator'],
)) ?>
<?php foreach ($result['paginator']->getCollection() as $task): ?>
<div class="table-list-row color-<?= $task['color_id'] ?>">
<?= $this->render('task_list/task_title', array(
'task' => $task,
'redirect' => 'dashboard',
)) ?>
<?= $this->render('task_list/task_details', array(
'task' => $task,
)) ?>
<?= $this->render('task_list/task_avatars', array(
'task' => $task,
)) ?>
<?= $this->render('task_list/task_icons', array(
'task' => $task,
)) ?>
<?= $this->render('task_list/task_subtasks', array(
'task' => $task,
'user_id' => $user['id'],
)) ?>
<?= $this->hook->render('template:dashboard:task:footer', array('task' => $task)) ?>
</div>
<?php endforeach ?>
</div>
<?= $result['paginator'] ?>
<?php endif ?>
<?php endforeach ?>
<?php endif ?>
<?= $this->hook->render('template:dashboard:show', array('user' => $user)) ?>
+27
View File
@@ -0,0 +1,27 @@
<div class="page-header">
<h2><?= $this->url->link(t('My projects'), 'DashboardController', 'projects', array('user_id' => $user['id'])) ?> (<?= $paginator->getTotal() ?>)</h2>
</div>
<?php if ($paginator->isEmpty()): ?>
<p class="alert"><?= t('You are not a member of any project.') ?></p>
<?php else: ?>
<div class="table-list">
<?= $this->render('project_list/header', array('paginator' => $paginator)) ?>
<?php foreach ($paginator->getCollection() as $project): ?>
<div class="table-list-row table-border-left">
<?= $this->render('project_list/project_title', array(
'project' => $project,
)) ?>
<?= $this->render('project_list/project_details', array(
'project' => $project,
)) ?>
<?= $this->render('project_list/project_icons', array(
'project' => $project,
)) ?>
</div>
<?php endforeach ?>
</div>
<?= $paginator ?>
<?php endif ?>
+24
View File
@@ -0,0 +1,24 @@
<div class="sidebar">
<ul>
<li <?= $this->app->checkMenuSelection('ProjectListController', 'show') ?>>
<?= $this->url->icon('folder', '<span class="sidebar-text">'.t('Project management').'</span>', 'ProjectListController', 'show') ?>
</li>
<li <?= $this->app->checkMenuSelection('ActivityController', 'user') ?>>
<?= $this->url->icon('dashboard', '<span class="sidebar-text">'.t('My activity stream').'</span>', 'ActivityController', 'user') ?>
</li>
<li><hr></li>
<li <?= $this->app->checkMenuSelection('DashboardController', 'show') ?>>
<?= $this->url->link('<i class="fa fa-fw"></i> <span class="sidebar-text">'.t('Overview').'</span>', 'DashboardController', 'show', array('user_id' => $user['id'])) ?>
</li>
<li <?= $this->app->checkMenuSelection('DashboardController', 'projects') ?>>
<?= $this->url->link('<i class="fa fa-fw"></i> <span class="sidebar-text">'.t('My projects').'</span>', 'DashboardController', 'projects', array('user_id' => $user['id'])) ?>
</li>
<li <?= $this->app->checkMenuSelection('DashboardController', 'tasks') ?>>
<?= $this->url->link('<i class="fa fa-fw"></i> <span class="sidebar-text">'.t('My tasks').'</span>', 'DashboardController', 'tasks', array('user_id' => $user['id'])) ?>
</li>
<li <?= $this->app->checkMenuSelection('DashboardController', 'subtasks') ?>>
<?= $this->url->link('<i class="fa fa-fw"></i> <span class="sidebar-text">'.t('My subtasks').'</span>', 'DashboardController', 'subtasks', array('user_id' => $user['id'])) ?>
</li>
<?= $this->hook->render('template:dashboard:sidebar', array('user' => $user)) ?>
</ul>
</div>
+49
View File
@@ -0,0 +1,49 @@
<div class="page-header">
<h2><?= $this->url->link(t('My subtasks'), 'DashboardController', 'subtasks', array('user_id' => $user['id'])) ?> (<?= $nb_subtasks ?>)</h2>
</div>
<?php if ($nb_subtasks == 0): ?>
<p class="alert"><?= t('There is nothing assigned to you.') ?></p>
<?php else: ?>
<div class="table-list">
<div class="table-list-header">
<div class="table-list-header-count">
<?php if ($nb_subtasks > 1): ?>
<?= t('%d subtasks', $nb_subtasks) ?>
<?php else: ?>
<?= t('%d subtask', $nb_subtasks) ?>
<?php endif ?>
</div>
<div class="table-list-header-menu">
<div class="dropdown">
<a href="#" class="dropdown-menu dropdown-menu-link-icon"><strong><?= t('Sort') ?> <i class="fa fa-caret-down"></i></strong></a>
<ul>
<li>
<?= $paginator->order(t('Task ID'), \Kanboard\Model\TaskModel::TABLE.'.id') ?>
</li>
<li>
<?= $paginator->order(t('Title'), \Kanboard\Model\TaskModel::TABLE.'.title') ?>
</li>
<li>
<?= $paginator->order(t('Priority'), \Kanboard\Model\TaskModel::TABLE.'.priority') ?>
</li>
</ul>
</div>
</div>
</div>
<?php foreach ($paginator->getCollection() as $task): ?>
<div class="table-list-row color-<?= $task['color_id'] ?>">
<?= $this->render('task_list/task_title', array(
'task' => $task,
)) ?>
<?= $this->render('task_list/task_subtasks', array(
'task' => $task,
'user_id' => $user['id'],
)) ?>
</div>
<?php endforeach ?>
</div>
<?= $paginator ?>
<?php endif ?>
+41
View File
@@ -0,0 +1,41 @@
<div class="page-header">
<h2><?= $this->url->link(t('My tasks'), 'DashboardController', 'tasks', array('user_id' => $user['id'])) ?> (<?= $paginator->getTotal() ?>)</h2>
</div>
<?php if ($paginator->isEmpty()): ?>
<p class="alert"><?= t('There is nothing assigned to you.') ?></p>
<?php else: ?>
<div class="table-list">
<?= $this->render('task_list/header', array(
'paginator' => $paginator,
)) ?>
<?php foreach ($paginator->getCollection() as $task): ?>
<div class="table-list-row color-<?= $task['color_id'] ?>">
<?= $this->render('task_list/task_title', array(
'task' => $task,
'redirect' => 'dashboard-tasks',
)) ?>
<?= $this->render('task_list/task_details', array(
'task' => $task,
)) ?>
<?= $this->render('task_list/task_avatars', array(
'task' => $task,
)) ?>
<?= $this->render('task_list/task_icons', array(
'task' => $task,
)) ?>
<?= $this->render('task_list/task_subtasks', array(
'task' => $task,
)) ?>
<?= $this->hook->render('template:dashboard:task:footer', array('task' => $task)) ?>
</div>
<?php endforeach ?>
</div>
<?= $paginator ?>
<?php endif ?>
+11
View File
@@ -0,0 +1,11 @@
<p class="activity-title">
<?= e('%s commented the task %s',
$this->text->e($author),
$this->url->link(t('#%d', $task['id']), 'TaskViewController', 'show', array('task_id' => $task['id']))
) ?>
<small class="activity-date"><?= $this->dt->datetime($date_creation) ?></small>
</p>
<div class="activity-description">
<p class="activity-task-title"><?= $this->text->e($task['title']) ?></p>
<div class="markdown"><?= $this->text->markdown($comment['comment']) ?></div>
</div>
+11
View File
@@ -0,0 +1,11 @@
<p class="activity-title">
<?= e('%s removed a comment on the task %s',
$this->text->e($author),
$this->url->link(t('#%d', $task['id']), 'TaskViewController', 'show', array('task_id' => $task['id']))
) ?>
<small class="activity-date"><?= $this->dt->datetime($date_creation) ?></small>
</p>
<div class="activity-description">
<p class="activity-task-title"><?= $this->text->e($task['title']) ?></p>
<div class="markdown"><?= $this->text->markdown($comment['comment']) ?></div>
</div>
+13
View File
@@ -0,0 +1,13 @@
<p class="activity-title">
<?= e('%s updated a comment on the task %s',
$this->text->e($author),
$this->url->link(t('#%d', $task['id']), 'TaskViewController', 'show', array('task_id' => $task['id']))
) ?>
<small class="activity-date"><?= $this->dt->datetime($date_creation) ?></small>
</p>
<div class="activity-description">
<p class="activity-task-title"><?= $this->text->e($task['title']) ?></p>
<?php if (! empty($comment['comment'])): ?>
<div class="markdown"><?= $this->text->markdown($comment['comment']) ?></div>
<?php endif ?>
</div>
+19
View File
@@ -0,0 +1,19 @@
<?php if (empty($events)): ?>
<p class="alert"><?= t('There is no activity yet.') ?></p>
<?php else: ?>
<?php foreach ($events as $event): ?>
<div class="activity-event">
<?= $this->avatar->render(
$event['creator_id'],
$event['author_username'],
$event['author_name'],
$event['email'],
$event['avatar_path']
) ?>
<div class="activity-content">
<?= $event['event_content'] ?>
</div>
</div>
<?php endforeach ?>
<?php endif ?>
+23
View File
@@ -0,0 +1,23 @@
<p class="activity-title">
<?= e('%s created a subtask for the task %s',
$this->text->e($author),
$this->url->link(t('#%d', $task['id']), 'TaskViewController', 'show', array('task_id' => $task['id']))
) ?>
<small class="activity-date"><?= $this->dt->datetime($date_creation) ?></small>
</p>
<div class="activity-description">
<p class="activity-task-title"><?= $this->text->e($task['title']) ?></p>
<ul>
<li>
<?= $this->text->e($subtask['title']) ?> (<strong><?= t($subtask['status_name']) ?></strong>)
</li>
<li>
<?php if ($subtask['username']): ?>
<?= t('Assigned to %s with an estimate of %s/%sh', $subtask['name'] ?: $subtask['username'], $subtask['time_spent'], $subtask['time_estimated']) ?>
<?php else: ?>
<?= t('Not assigned, estimate of %sh', $subtask['time_estimated']) ?>
<?php endif ?>
</li>
</ul>
</div>
+15
View File
@@ -0,0 +1,15 @@
<p class="activity-title">
<?= e('%s removed a subtask for the task %s',
$this->text->e($author),
$this->url->link(t('#%d', $task['id']), 'TaskViewController', 'show', array('task_id' => $task['id']))
) ?>
<small class="activity-date"><?= $this->dt->datetime($date_creation) ?></small>
</p>
<div class="activity-description">
<p class="activity-task-title"><?= $this->text->e($task['title']) ?></p>
<ul>
<li>
<?= $this->text->e($subtask['title']) ?> (<strong><?= $this->text->e($subtask['status_name']) ?></strong>)
</li>
</ul>
</div>
+23
View File
@@ -0,0 +1,23 @@
<p class="activity-title">
<?= e('%s updated a subtask for the task %s',
$this->text->e($author),
$this->url->link(t('#%d', $task['id']), 'TaskViewController', 'show', array('task_id' => $task['id']))
) ?>
<small class="activity-date"><?= $this->dt->datetime($date_creation) ?></small>
</p>
<div class="activity-description">
<p class="activity-task-title"><?= $this->text->e($task['title']) ?></p>
<ul>
<li>
<?= $this->text->e($subtask['title']) ?> (<strong><?= t($subtask['status_name']) ?></strong>)
</li>
<li>
<?php if ($subtask['username']): ?>
<?= t('Assigned to %s with an estimate of %s/%sh', $subtask['name'] ?: $subtask['username'], $subtask['time_spent'], $subtask['time_estimated']) ?>
<?php else: ?>
<?= t('Not assigned, estimate of %sh', $subtask['time_estimated']) ?>
<?php endif ?>
</li>
</ul>
</div>
@@ -0,0 +1,17 @@
<p class="activity-title">
<?php $assignee = $task['assignee_name'] ?: $task['assignee_username'] ?>
<?php if (! empty($assignee)): ?>
<?= e('%s changed the assignee of the task %s to %s',
$this->text->e($author),
$this->url->link(t('#%d', $task['id']), 'TaskViewController', 'show', array('task_id' => $task['id'])),
$this->text->e($assignee)
) ?>
<?php else: ?>
<?= e('%s removed the assignee of the task %s', $this->text->e($author), $this->url->link(t('#%d', $task['id']), 'TaskViewController', 'show', array('task_id' => $task['id']))) ?>
<?php endif ?>
<small class="activity-date"><?= $this->dt->datetime($date_creation) ?></small>
</p>
<div class="activity-description">
<p class="activity-task-title"><?= $this->text->e($task['title']) ?></p>
</div>
+10
View File
@@ -0,0 +1,10 @@
<p class="activity-title">
<?= e('%s closed the task %s',
$this->text->e($author),
$this->url->link(t('#%d', $task['id']), 'TaskViewController', 'show', array('task_id' => $task['id']))
) ?>
<small class="activity-date"><?= $this->dt->datetime($date_creation) ?></small>
</p>
<div class="activity-description">
<p class="activity-task-title"><?= $this->text->e($task['title']) ?></p>
</div>
+10
View File
@@ -0,0 +1,10 @@
<p class="activity-title">
<?= e('%s created the task %s',
$this->text->e($author),
$this->url->link(t('#%d', $task['id']), 'TaskViewController', 'show', array('task_id' => $task['id']))
) ?>
<small class="activity-date"><?= $this->dt->datetime($date_creation) ?></small>
</p>
<div class="activity-description">
<p class="activity-task-title"><?= $this->text->e($task['title']) ?></p>
</div>
+10
View File
@@ -0,0 +1,10 @@
<p class="activity-title">
<?= e('%s attached a new file to the task %s',
$this->text->e($author),
$this->url->link(t('#%d', $task['id']), 'TaskViewController', 'show', array('task_id' => $task['id']))
) ?>
<small class="activity-date"><?= $this->dt->datetime($date_creation) ?></small>
</p>
<div class="activity-description">
<p class="activity-task-title"><?= $this->text->e($file['name']) ?></p>
</div>
+10
View File
@@ -0,0 +1,10 @@
<p class="activity-title">
<?= e('%s removed a file from the task %s',
$this->text->e($author),
$this->url->link(t('#%d', $task['id']), 'TaskViewController', 'show', array('task_id' => $task['id']))
) ?>
<small class="activity-date"><?= $this->dt->datetime($date_creation) ?></small>
</p>
<div class="activity-description">
<p class="activity-task-title"><?= $this->text->e($file['name']) ?></p>
</div>
@@ -0,0 +1,14 @@
<p class="activity-title">
<?= e('%s set a new internal link for the task %s',
$this->text->e($author),
$this->url->link(t('#%d', $task['id']), 'TaskViewController', 'show', array('task_id' => $task['id']))
) ?>
<small class="activity-date"><?= $this->dt->datetime($date_creation) ?></small>
</p>
<div class="activity-description">
<p class="activity-task-title">
<?= e('This task is now linked to the task %s with the relation "%s"',
$this->url->link(t('#%d', $task_link['opposite_task_id']), 'TaskViewController', 'show', array('task_id' => $task_link['opposite_task_id'])),
$this->text->e($task_link['label'])) ?>
</p>
</div>
@@ -0,0 +1,14 @@
<p class="activity-title">
<?= e('%s removed an internal link for the task %s',
$this->text->e($author),
$this->url->link(t('#%d', $task['id']), 'TaskViewController', 'show', array('task_id' => $task['id']))
) ?>
<small class="activity-date"><?= $this->dt->datetime($date_creation) ?></small>
</p>
<div class="activity-description">
<p class="activity-task-title">
<?= e('The link with the relation "%s" to the task %s has been removed',
$this->text->e($task_link['label']),
$this->url->link(t('#%d', $task_link['opposite_task_id']), 'TaskViewController', 'show', array('task_id' => $task_link['opposite_task_id']))) ?>
</p>
</div>

Some files were not shown because too many files have changed in this diff Show More