看板初始化提交

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
@@ -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 ?>