diff options
Diffstat (limited to 'plugins/TimeMachine/Template/analytic')
4 files changed, 314 insertions, 0 deletions
diff --git a/plugins/TimeMachine/Template/analytic/sidebar.php b/plugins/TimeMachine/Template/analytic/sidebar.php new file mode 100644 index 00000000..cc04bc1d --- /dev/null +++ b/plugins/TimeMachine/Template/analytic/sidebar.php @@ -0,0 +1,46 @@ +<?php +/** + * Created by yvalentin. + * https://yohannvalentin.com + * + * Date: 12/11/18 + */ +?> + +<li <?= $this->app->checkMenuSelection('AnalyticsTimesController', 'timeComparisonBySwimlane') ?>> + <?= $this->modal->replaceLink( + t('Estimated vs actual time / Swimlanes'), + 'AnalyticsTimesController', + 'timeComparisonBySwimlane', + array( + 'plugin' => 'TimeMachine', + 'project_id' => $project['id'] + ) + ) + ?> +</li> +<li <?= $this->app->checkMenuSelection('AnalyticsTimesController', 'timeComparisonByCategories') ?>> + <?= $this->modal->replaceLink( + t('Estimated vs actual time / Categories'), + 'AnalyticsTimesController', + 'timeComparisonByCategories', + array( + 'plugin' => 'TimeMachine', + 'project_id' => $project['id'] + ) + ) + ?> +</li> +<!--TODO check if project has automatic action: task.move.column - \Kanboard\Action\SubtaskTimerMoveTaskColumn --> +<li <?= $this->app->checkMenuSelection('AnalyticsTimesController', 'timeComparisonByDates') ?>> + <?= $this->modal->replaceLink( + t('Spent time / Dates'), + 'AnalyticsTimesController', + 'timeComparisonByDates', + array( + 'plugin' => 'TimeMachine', + 'project_id' => $project['id'] + ) + ) + ?> +</li>
\ No newline at end of file diff --git a/plugins/TimeMachine/Template/analytic/spent_time_by_dates.php b/plugins/TimeMachine/Template/analytic/spent_time_by_dates.php new file mode 100644 index 00000000..47fa657c --- /dev/null +++ b/plugins/TimeMachine/Template/analytic/spent_time_by_dates.php @@ -0,0 +1,100 @@ +<?php if (! $is_ajax): ?> + <div class="page-header"> + <h2><?= t('Spent time / Dates') ?></h2> + </div> +<?php endif ?> + +<div class="panel"> + <?php $spentTime['total'] = 0; $spentTime['open'] = 0; $spentTime['closed'] = 0; ?> + <?php foreach ($metrics as $taskId => $metric) : ?> + <?php $spentTime['total'] += $metric['open']['stt_time_spent'] + $metric['closed']['stt_time_spent']?> + <?php $spentTime['open'] += $metric['open']['stt_time_spent']?> + <?php $spentTime['closed'] += $metric['closed']['stt_time_spent']?> + <?php endforeach; ?> + <?= t('Total spent time / Dates')?> : <?= $from->format($userFormat) ?> -> <?= $to->format($userFormat) ?> + <ul> + <li> + <strong> + <?= $this->text->e($spentTime['total']) ?> + </strong> + <i>(<?=t('Open').' : '.$this->text->e($spentTime['open']) ?> + - <?= t('Closed').' : '.$spentTime['closed'] ?>)</i> + </li> + </ul> +</div> + +<form method="post" + class="form-inline" + style="text-align: center" + action="<?= $this->url->href( + 'AnalyticsTimesController', + 'timeComparisonByDates', + array('plugin' => 'TimeMachine', 'project_id' => $project['id'])) + ?>" + autocomplete="off"> + <?= $this->form->csrf() ?> + <?php $values['from'] = $from->getTimestamp() ?> + <?php $values['to'] = $to->getTimestamp() ?> + <?= $this->form->date(t('Start date'), 'from', $values) ?> + <?= $this->form->date(t('End date'), 'to', $values) ?> + <?= $this->modal->submitButtons(array('submitLabel' => t('Execute'))) ?> +</form> +<?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-analytics-spent-time-by-dates', array( + 'metrics' => $spentTime, + 'labelSpent' => t('Hours Spent'), + 'labelClosed' => t('Closed'), + 'labelOpen' => t('Open'), + )) ?> + <table class="table-fixed table-small table-scrolling margin-top"> + <tr> + <th class="column-5"><?= $paginator->order(t('Id'), 'tasks.id') ?></th> + <th class="column-8"><?= $paginator->order(t('Categories'), 'tasks.category_id') ?></th> + <th class="column-8"><?= $paginator->order(t('Swimlane'), 'tasks.swimlane_id') ?></th> + <th><?= $paginator->order(t('Title'), 'tasks.title') ?></th> + <th class="column-5"><?= $paginator->order(t('Status'), 'tasks.is_active') ?></th> + <th class="column-13"><?= t('Spent time / Dates')?></th> + <th class="column-9"><?= $paginator->order(t('Hours Spent'), 'tasks.time_spent') ?></th> + </tr> + <?php foreach ($paginator->getCollection() as $task): ?> + <?php if (array_key_exists($task['id'], $metrics)) : ?> + <tr> + <td class="task-table color-<?= $task['color_id'] ?>"> + <?= $this->url->link('#'.$this->text->e($task['id']), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, '', t('View this task')) ?> + </td> + <td class="task-table category-<?= $task['category_id'] ?>"> + <?= $this->text->e($categories[$task['category_id']]) ?> + </td> + <td class="task-table swimlane-<?= $task['swimlane_id'] ?>"> + <?= $this->text->e($swimlanes[$task['swimlane_id']]) ?> + </td> + <td> + <?= $this->url->link($this->text->e($task['title']), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, '', t('View this task')) ?> + </td> + <td> + <?php if ($task['is_active'] == \Kanboard\Model\TaskModel::STATUS_OPEN): ?> + <?php $isActive = "open" ?> + <?= t('Open') ?> + <?php else: ?> + <?php $isActive = "closed" ?> + <?= t('Closed') ?> + <?php endif ?> + </td> + <td> + <?= $this->text->e($metrics[$task['id']][$isActive]['stt_time_spent']) ?> + </td> + <td> + <?= $this->text->e($metrics[$task['id']][$isActive]['time_spent']) ?> + </td> + </tr> + <?php endif; ?> + <?php endforeach ?> + </table> + <?= $paginator ?> + <?php endif ?> +<?php endif ?> diff --git a/plugins/TimeMachine/Template/analytic/time_comparison_by_categories.php b/plugins/TimeMachine/Template/analytic/time_comparison_by_categories.php new file mode 100644 index 00000000..fc838374 --- /dev/null +++ b/plugins/TimeMachine/Template/analytic/time_comparison_by_categories.php @@ -0,0 +1,84 @@ +<?php if (! $is_ajax): ?> + <div class="page-header"> + <h2><?= t('Estimated vs actual time / Categories') ?></h2> + </div> +<?php endif ?> + +<div class="panel"> + <?php foreach ($metrics as $categorieName => $metricByCategories) : ?> + <p><strong><?= $categorieName ?></strong></p> + <ul> + <li> + <?= t('Estimated hours: ') ?> + <strong> + <?= $this->text->e($metricByCategories['open']['time_estimated'] + $metricByCategories['closed']['time_estimated']) ?> + </strong> + <i>(<?=t('Open').' : '.$this->text->e($metricByCategories['open']['time_estimated']) ?> + - <?= t('Closed').' : '.$metricByCategories['closed']['time_estimated'] ?>)</i> + </li> + <li> + <?= t('Actual hours: ')?> + <strong> + <?= $this->text->e($metricByCategories['open']['time_spent'] + $metricByCategories['closed']['time_spent']) ?> + </strong> + <i>(<?=t('Open').' : '.$this->text->e($metricByCategories['open']['time_spent']) ?> + - <?= t('Closed').' : '.$metricByCategories['closed']['time_spent'] ?>)</i> + </li> + </ul> + <?php endforeach; ?> +</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-analytics-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 class="column-8"><?= $paginator->order(t('Categories'), 'tasks.category_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'], 'project_id' => $task['project_id']), false, '', t('View this task')) ?> + </td> + <td class="task-table swimlane-<?= $task['category_id'] ?>"> + <?= $this->text->e($categories[$task['category_id']]) ?> + </td> + <td> + <?= $this->url->link($this->text->e($task['title']), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_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 ?> diff --git a/plugins/TimeMachine/Template/analytic/time_comparison_by_swimlane.php b/plugins/TimeMachine/Template/analytic/time_comparison_by_swimlane.php new file mode 100644 index 00000000..95fd7a41 --- /dev/null +++ b/plugins/TimeMachine/Template/analytic/time_comparison_by_swimlane.php @@ -0,0 +1,84 @@ +<?php if (! $is_ajax): ?> + <div class="page-header"> + <h2><?= t('Estimated vs actual time / Swimlanes') ?></h2> + </div> +<?php endif ?> + +<div class="panel"> + <?php foreach ($metrics as $swimlaneName => $metricBySwimlane) : ?> + <p><strong><?= $swimlaneName ?></strong></p> + <ul> + <li> + <?= t('Estimated hours: ') ?> + <strong> + <?= $this->text->e($metricBySwimlane['open']['time_estimated'] + $metricBySwimlane['closed']['time_estimated']) ?> + </strong> + <i>(<?=t('Open').' : '.$this->text->e($metricBySwimlane['open']['time_estimated']) ?> + - <?= t('Closed').' : '.$metricBySwimlane['closed']['time_estimated'] ?>)</i> + </li> + <li> + <?= t('Actual hours: ')?> + <strong> + <?= $this->text->e($metricBySwimlane['open']['time_spent'] + $metricBySwimlane['closed']['time_spent']) ?> + </strong> + <i>(<?=t('Open').' : '.$this->text->e($metricBySwimlane['open']['time_spent']) ?> + - <?= t('Closed').' : '.$metricBySwimlane['closed']['time_spent'] ?>)</i> + </li> + </ul> + <?php endforeach; ?> +</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-analytics-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 class="column-8"><?= $paginator->order(t('Swimlane'), 'tasks.swimlane_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'], 'project_id' => $task['project_id']), false, '', t('View this task')) ?> + </td> + <td class="task-table swimlane-<?= $task['swimlane_id'] ?>"> + <?= $this->text->e($swimlanes[$task['swimlane_id']]) ?> + </td> + <td> + <?= $this->url->link($this->text->e($task['title']), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_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 ?> |