diff options
Diffstat (limited to 'plugins/TimeMachine/Template')
6 files changed, 363 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 ?> diff --git a/plugins/TimeMachine/Template/subtask/edit.php b/plugins/TimeMachine/Template/subtask/edit.php new file mode 100644 index 00000000..7f20075c --- /dev/null +++ b/plugins/TimeMachine/Template/subtask/edit.php @@ -0,0 +1,28 @@ +<div class="page-header"> + <h2><?= t('Edit a sub-task') ?></h2> +</div> + +<form method="post" action="<?= $this->url->href('SubtaskController', 'update', array('plugin' => 'TimeMachine', 'task_id' => $task['id'], 'project_id' => $task['project_id'], 'subtask_id' => $subtask['id'])) ?>" autocomplete="off"> + <?= $this->form->csrf() ?> + + <?= $this->subtask->renderTitleField($values, $errors, array('autofocus')) ?> + <?= $this->subtask->renderAssigneeField($users_list, $values, $errors) ?> + <?= $this->subtask->renderTimeEstimatedField($values, $errors) ?> + <?= $this->subtask->renderTimeSpentField($values, $errors) ?> + <div class="subtask-time-tracking-edit form-inline"> + <h3><strong>Time Tracking details</strong></h3> + <?php foreach ($sttts as $key => $sttt) :?> + <?php $errorsSttt = isset($errorsSttts[$key]) ? $errorsSttts[$key]: []; ?> + <div> + <?= $sttt['username']?> : + <?= $this->helper->form->datetime(t('Start Date'), 'start-'.$sttt['id'], $sttt, $errorsSttt) ?> + <?= $this->helper->form->datetime(t('End Date'), 'end-'.$sttt['id'], $sttt, $errorsSttt) ?> + / <?=t('Time spent')?> : <?= $sttt['time_spent']?> + </div> + <?php endforeach; ?> + </div> + + <?= $this->hook->render('template:subtask:form:edit', array('values' => $values, 'errors' => $errors)) ?> + + <?= $this->modal->submitButtons() ?> +</form> diff --git a/plugins/TimeMachine/Template/subtask/menu.php b/plugins/TimeMachine/Template/subtask/menu.php new file mode 100644 index 00000000..5f8a41f8 --- /dev/null +++ b/plugins/TimeMachine/Template/subtask/menu.php @@ -0,0 +1,21 @@ +<?php +/** + * Created by yvalentin. + * https://yohannvalentin.com + * + */ +?> +<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'), 'SubtaskController', 'edit', array('plugin' => 'TimeMachine', 'task_id' => $task['id'], 'project_id' => $task['project_id'], 'subtask_id' => $subtask['id'])) ?> + </li> + <li> + <?= $this->modal->confirm('trash-o', t('Remove'), 'SubtaskController', 'confirm', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'subtask_id' => $subtask['id'])) ?> + </li> + <li> + <?= $this->modal->confirm('clone', t('Convert to task'), 'SubtaskConverterController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'subtask_id' => $subtask['id'])) ?> + </li> + </ul> +</div>
\ No newline at end of file |