summaryrefslogtreecommitdiff
path: root/app/Template
diff options
context:
space:
mode:
authorFrédéric Guillot <fred@kanboard.net>2014-10-24 22:51:30 -0400
committerFrédéric Guillot <fred@kanboard.net>2014-10-24 22:51:30 -0400
commit90e06162999c8ec7fa9bcfa391800f7907419d9b (patch)
treef0f8d4a760f25c4f7773e0a1851031db6b08b9f2 /app/Template
parent180efb962c6fc4da47ed39e60db137d63ffaad5b (diff)
Rename Locales and Templates folders to be more consistent
Diffstat (limited to 'app/Template')
-rw-r--r--app/Template/action_event.php22
-rw-r--r--app/Template/action_index.php65
-rw-r--r--app/Template/action_params.php40
-rw-r--r--app/Template/action_remove.php14
-rw-r--r--app/Template/app_forbidden.php9
-rw-r--r--app/Template/app_index.php45
-rw-r--r--app/Template/app_notfound.php9
-rw-r--r--app/Template/board_assignee.php24
-rw-r--r--app/Template/board_category.php24
-rw-r--r--app/Template/board_edit.php58
-rw-r--r--app/Template/board_index.php38
-rw-r--r--app/Template/board_public.php34
-rw-r--r--app/Template/board_remove.php15
-rw-r--r--app/Template/board_show.php49
-rw-r--r--app/Template/board_task.php109
-rw-r--r--app/Template/category_edit.php16
-rw-r--r--app/Template/category_index.php41
-rw-r--r--app/Template/category_remove.php16
-rw-r--r--app/Template/comment_create.php19
-rw-r--r--app/Template/comment_edit.php17
-rw-r--r--app/Template/comment_forbidden.php9
-rw-r--r--app/Template/comment_remove.php16
-rw-r--r--app/Template/comment_show.php41
-rw-r--r--app/Template/config_about.php41
-rw-r--r--app/Template/config_api.php18
-rw-r--r--app/Template/config_application.php27
-rw-r--r--app/Template/config_board.php29
-rw-r--r--app/Template/config_layout.php13
-rw-r--r--app/Template/config_sidebar.php22
-rw-r--r--app/Template/config_webhook.php38
-rw-r--r--app/Template/event_comment_create.php7
-rw-r--r--app/Template/event_comment_update.php7
-rw-r--r--app/Template/event_subtask_create.php19
-rw-r--r--app/Template/event_subtask_update.php19
-rw-r--r--app/Template/event_task_assignee_change.php12
-rw-r--r--app/Template/event_task_close.php6
-rw-r--r--app/Template/event_task_create.php6
-rw-r--r--app/Template/event_task_move_column.php6
-rw-r--r--app/Template/event_task_move_position.php6
-rw-r--r--app/Template/event_task_open.php6
-rw-r--r--app/Template/event_task_update.php6
-rw-r--r--app/Template/file_new.php14
-rw-r--r--app/Template/file_open.php6
-rw-r--r--app/Template/file_remove.php14
-rw-r--r--app/Template/file_show.php23
-rw-r--r--app/Template/layout.php84
-rw-r--r--app/Template/notification_comment_creation.php7
-rw-r--r--app/Template/notification_comment_update.php7
-rw-r--r--app/Template/notification_file_creation.php5
-rw-r--r--app/Template/notification_footer.php6
-rw-r--r--app/Template/notification_subtask_creation.php17
-rw-r--r--app/Template/notification_subtask_update.php21
-rw-r--r--app/Template/notification_task_assignee_change.php20
-rw-r--r--app/Template/notification_task_close.php5
-rw-r--r--app/Template/notification_task_creation.php43
-rw-r--r--app/Template/notification_task_due.php20
-rw-r--r--app/Template/notification_task_move_column.php11
-rw-r--r--app/Template/notification_task_move_position.php11
-rw-r--r--app/Template/notification_task_open.php5
-rw-r--r--app/Template/notification_task_update.php43
-rw-r--r--app/Template/project_activity.php18
-rw-r--r--app/Template/project_disable.php14
-rw-r--r--app/Template/project_duplicate.php14
-rw-r--r--app/Template/project_edit.php15
-rw-r--r--app/Template/project_enable.php14
-rw-r--r--app/Template/project_events.php21
-rw-r--r--app/Template/project_export.php24
-rw-r--r--app/Template/project_feed.php27
-rw-r--r--app/Template/project_index.php49
-rw-r--r--app/Template/project_layout.php17
-rw-r--r--app/Template/project_new.php22
-rw-r--r--app/Template/project_remove.php14
-rw-r--r--app/Template/project_search.php37
-rw-r--r--app/Template/project_share.php19
-rw-r--r--app/Template/project_show.php55
-rw-r--r--app/Template/project_sidebar.php49
-rw-r--r--app/Template/project_tasks.php23
-rw-r--r--app/Template/project_users.php57
-rw-r--r--app/Template/subtask_create.php27
-rw-r--r--app/Template/subtask_edit.php32
-rw-r--r--app/Template/subtask_remove.php16
-rw-r--r--app/Template/subtask_show.php72
-rw-r--r--app/Template/task_close.php14
-rw-r--r--app/Template/task_comments.php29
-rw-r--r--app/Template/task_details.php83
-rw-r--r--app/Template/task_duplicate.php14
-rw-r--r--app/Template/task_duplicate_project.php24
-rw-r--r--app/Template/task_edit.php51
-rw-r--r--app/Template/task_edit_description.php22
-rw-r--r--app/Template/task_layout.php16
-rw-r--r--app/Template/task_move_project.php24
-rw-r--r--app/Template/task_new.php55
-rw-r--r--app/Template/task_open.php14
-rw-r--r--app/Template/task_public.php27
-rw-r--r--app/Template/task_remove.php14
-rw-r--r--app/Template/task_show.php7
-rw-r--r--app/Template/task_show_description.php24
-rw-r--r--app/Template/task_sidebar.php26
-rw-r--r--app/Template/task_table.php56
-rw-r--r--app/Template/task_time.php15
-rw-r--r--app/Template/task_timesheet.php13
-rw-r--r--app/Template/user_edit.php30
-rw-r--r--app/Template/user_external.php39
-rw-r--r--app/Template/user_index.php71
-rw-r--r--app/Template/user_last.php24
-rw-r--r--app/Template/user_layout.php19
-rw-r--r--app/Template/user_login.php42
-rw-r--r--app/Template/user_new.php39
-rw-r--r--app/Template/user_notifications.php22
-rw-r--r--app/Template/user_password.php23
-rw-r--r--app/Template/user_remove.php12
-rw-r--r--app/Template/user_sessions.php26
-rw-r--r--app/Template/user_show.php12
-rw-r--r--app/Template/user_sidebar.php42
114 files changed, 2945 insertions, 0 deletions
diff --git a/app/Template/action_event.php b/app/Template/action_event.php
new file mode 100644
index 00000000..eee41780
--- /dev/null
+++ b/app/Template/action_event.php
@@ -0,0 +1,22 @@
+<div class="page-header">
+ <h2><?= t('Automatic actions for the project "%s"', $project['name']) ?></h2>
+</div>
+
+<h3><?= t('Choose an event') ?></h3>
+<form method="post" action="?controller=action&amp;action=params&amp;project_id=<?= $project['id'] ?>" autocomplete="off">
+ <?= Helper\form_csrf() ?>
+ <?= Helper\form_hidden('project_id', $values) ?>
+ <?= Helper\form_hidden('action_name', $values) ?>
+
+ <?= Helper\form_label(t('Event'), 'event_name') ?>
+ <?= Helper\form_select('event_name', $events, $values) ?><br/>
+
+ <div class="form-help">
+ <?= t('When the selected event occurs execute the corresponding action.') ?>
+ </div>
+
+ <div class="form-actions">
+ <input type="submit" value="<?= t('Next step') ?>" class="btn btn-blue"/>
+ <?= t('or') ?> <a href="?controller=action&amp;action=index&amp;project_id=<?= $project['id'] ?>"><?= t('cancel') ?></a>
+ </div>
+</form> \ No newline at end of file
diff --git a/app/Template/action_index.php b/app/Template/action_index.php
new file mode 100644
index 00000000..30874591
--- /dev/null
+++ b/app/Template/action_index.php
@@ -0,0 +1,65 @@
+<div class="page-header">
+ <h2><?= t('Automatic actions for the project "%s"', $project['name']) ?></h2>
+</div>
+
+<?php if (! empty($actions)): ?>
+
+<h3><?= t('Defined actions') ?></h3>
+<table>
+ <tr>
+ <th><?= t('Event name') ?></th>
+ <th><?= t('Action name') ?></th>
+ <th><?= t('Action parameters') ?></th>
+ <th><?= t('Action') ?></th>
+ </tr>
+
+ <?php foreach ($actions as $action): ?>
+ <tr>
+ <td><?= Helper\in_list($action['event_name'], $available_events) ?></td>
+ <td><?= Helper\in_list($action['action_name'], $available_actions) ?></td>
+ <td>
+ <ul>
+ <?php foreach ($action['params'] as $param): ?>
+ <li>
+ <?= Helper\in_list($param['name'], $available_params) ?> =
+ <strong>
+ <?php if (Helper\contains($param['name'], 'column_id')): ?>
+ <?= Helper\in_list($param['value'], $columns_list) ?>
+ <?php elseif (Helper\contains($param['name'], 'user_id')): ?>
+ <?= Helper\in_list($param['value'], $users_list) ?>
+ <?php elseif (Helper\contains($param['name'], 'project_id')): ?>
+ <?= Helper\in_list($param['value'], $projects_list) ?>
+ <?php elseif (Helper\contains($param['name'], 'color_id')): ?>
+ <?= Helper\in_list($param['value'], $colors_list) ?>
+ <?php elseif (Helper\contains($param['name'], 'category_id')): ?>
+ <?= Helper\in_list($param['value'], $categories_list) ?>
+ <?php elseif (Helper\contains($param['name'], 'label')): ?>
+ <?= Helper\escape($param['value']) ?>
+ <?php endif ?>
+ </strong>
+ </li>
+ <?php endforeach ?>
+ </ul>
+ </td>
+ <td>
+ <a href="?controller=action&amp;action=confirm&amp;project_id=<?= $project['id'] ?>&amp;action_id=<?= $action['id'] ?>"><?= t('Remove') ?></a>
+ </td>
+ </tr>
+ <?php endforeach ?>
+
+</table>
+
+<?php endif ?>
+
+<h3><?= t('Add an action') ?></h3>
+<form method="post" action="?controller=action&amp;action=event&amp;project_id=<?= $project['id'] ?>" autocomplete="off">
+ <?= Helper\form_csrf() ?>
+ <?= Helper\form_hidden('project_id', $values) ?>
+
+ <?= Helper\form_label(t('Action'), 'action_name') ?>
+ <?= Helper\form_select('action_name', $available_actions, $values) ?><br/>
+
+ <div class="form-actions">
+ <input type="submit" value="<?= t('Next step') ?>" class="btn btn-blue"/>
+ </div>
+</form> \ No newline at end of file
diff --git a/app/Template/action_params.php b/app/Template/action_params.php
new file mode 100644
index 00000000..f647149b
--- /dev/null
+++ b/app/Template/action_params.php
@@ -0,0 +1,40 @@
+<div class="page-header">
+ <h2><?= t('Automatic actions for the project "%s"', $project['name']) ?></h2>
+</div>
+
+<h3><?= t('Define action parameters') ?></h3>
+<form method="post" action="?controller=action&amp;action=create&amp;project_id=<?= $project['id'] ?>" autocomplete="off">
+ <?= Helper\form_csrf() ?>
+ <?= Helper\form_hidden('project_id', $values) ?>
+ <?= Helper\form_hidden('event_name', $values) ?>
+ <?= Helper\form_hidden('action_name', $values) ?>
+
+ <?php foreach ($action_params as $param_name => $param_desc): ?>
+
+ <?php if (Helper\contains($param_name, 'column_id')): ?>
+ <?= Helper\form_label($param_desc, $param_name) ?>
+ <?= Helper\form_select('params['.$param_name.']', $columns_list, $values) ?><br/>
+ <?php elseif (Helper\contains($param_name, 'user_id')): ?>
+ <?= Helper\form_label($param_desc, $param_name) ?>
+ <?= Helper\form_select('params['.$param_name.']', $users_list, $values) ?><br/>
+ <?php elseif (Helper\contains($param_name, 'project_id')): ?>
+ <?= Helper\form_label($param_desc, $param_name) ?>
+ <?= Helper\form_select('params['.$param_name.']', $projects_list, $values) ?><br/>
+ <?php elseif (Helper\contains($param_name, 'color_id')): ?>
+ <?= Helper\form_label($param_desc, $param_name) ?>
+ <?= Helper\form_select('params['.$param_name.']', $colors_list, $values) ?><br/>
+ <?php elseif (Helper\contains($param_name, 'category_id')): ?>
+ <?= Helper\form_label($param_desc, $param_name) ?>
+ <?= Helper\form_select('params['.$param_name.']', $categories_list, $values) ?><br/>
+ <?php elseif (Helper\contains($param_name, 'label')): ?>
+ <?= Helper\form_label($param_desc, $param_name) ?>
+ <?= Helper\form_text('params['.$param_name.']', $values) ?>
+ <?php endif ?>
+
+ <?php endforeach ?>
+
+ <div class="form-actions">
+ <input type="submit" value="<?= t('Save this action') ?>" class="btn btn-blue"/>
+ <?= t('or') ?> <a href="?controller=action&amp;action=index&amp;project_id=<?= $project['id'] ?>"><?= t('cancel') ?></a>
+ </div>
+</form> \ No newline at end of file
diff --git a/app/Template/action_remove.php b/app/Template/action_remove.php
new file mode 100644
index 00000000..668067da
--- /dev/null
+++ b/app/Template/action_remove.php
@@ -0,0 +1,14 @@
+<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"?', Helper\in_list($action['event_name'], $available_events).'/'.Helper\in_list($action['action_name'], $available_actions)) ?>
+ </p>
+
+ <div class="form-actions">
+ <?= Helper\a(t('Yes'), 'action', 'remove', array('project_id' => $project['id'], 'action_id' => $action['id']), true, 'btn btn-red') ?>
+ <?= t('or') ?> <?= Helper\a(t('cancel'), 'action', 'index', array('project_id' => $project['id'])) ?>
+ </div>
+</div> \ No newline at end of file
diff --git a/app/Template/app_forbidden.php b/app/Template/app_forbidden.php
new file mode 100644
index 00000000..0c035404
--- /dev/null
+++ b/app/Template/app_forbidden.php
@@ -0,0 +1,9 @@
+<section id="main">
+ <div class="page-header">
+ <h2><?= t('Forbidden') ?></h2>
+ </div>
+
+ <p class="alert alert-error">
+ <?= t('Access Forbidden') ?>
+ </p>
+</section> \ No newline at end of file
diff --git a/app/Template/app_index.php b/app/Template/app_index.php
new file mode 100644
index 00000000..91eecce4
--- /dev/null
+++ b/app/Template/app_index.php
@@ -0,0 +1,45 @@
+<section id="main">
+ <div class="page-header">
+ <h2><?= t('Dashboard') ?></h2>
+ </div>
+ <section id="dashboard">
+ <div class="dashboard-left-column">
+ <h2><?= t('My tasks') ?></h2>
+ <?php if (empty($tasks)): ?>
+ <p class="alert"><?= t('There is nothing assigned to you.') ?></p>
+ <?php else: ?>
+ <table>
+ <tr>
+ <th>&nbsp;</th>
+ <th width="15%"><?= t('Project') ?></th>
+ <th width="40%"><?= t('Title') ?></th>
+ <th><?= t('Due date') ?></th>
+ <th><?= t('Date created') ?></th>
+ </tr>
+ <?php foreach ($tasks as $task): ?>
+ <tr>
+ <td class="task-table task-<?= $task['color_id'] ?>">
+ <?= Helper\a('#'.$task['id'], 'task', 'show', array('task_id' => $task['id'])) ?>
+ </td>
+ <td>
+ <?= Helper\a(Helper\escape($task['project_name']), 'board', 'show', array('project_id' => $task['project_id'])) ?>
+ </td>
+ <td>
+ <?= Helper\a(Helper\escape($task['title']), 'task', 'show', array('task_id' => $task['id'])) ?>
+ </td>
+ <td>
+ <?= dt('%B %e, %Y', $task['date_due']) ?>
+ </td>
+ <td>
+ <?= dt('%B %e, %Y', $task['date_creation']) ?>
+ </td>
+ </tr>
+ <?php endforeach ?>
+ </table>
+ <?php endif ?>
+ </div>
+ <div class="dashboard-right-column">
+ <h2><?= t('Activity stream') ?></h2>
+ <?= Helper\template('project_events', array('events' => $events)) ?>
+ </section>
+</section> \ No newline at end of file
diff --git a/app/Template/app_notfound.php b/app/Template/app_notfound.php
new file mode 100644
index 00000000..734d16a4
--- /dev/null
+++ b/app/Template/app_notfound.php
@@ -0,0 +1,9 @@
+<section id="main">
+ <div class="page-header">
+ <h2><?= t('Page not found') ?></h2>
+ </div>
+
+ <p class="alert alert-error">
+ <?= t('Sorry, I didn\'t found this information in my database!') ?>
+ </p>
+</section> \ No newline at end of file
diff --git a/app/Template/board_assignee.php b/app/Template/board_assignee.php
new file mode 100644
index 00000000..41ede32b
--- /dev/null
+++ b/app/Template/board_assignee.php
@@ -0,0 +1,24 @@
+<section id="main">
+
+ <div class="page-header board">
+ <h2><?= t('Project "%s"', $current_project_name) ?></h2>
+ </div>
+
+ <section>
+ <h3><?= t('Change assignee for the task "%s"', $values['title']) ?></h3>
+ <form method="post" action="?controller=board&amp;action=updateAssignee" autocomplete="off">
+ <?= Helper\form_csrf() ?>
+ <?= Helper\form_hidden('id', $values) ?>
+ <?= Helper\form_hidden('project_id', $values) ?>
+
+ <?= Helper\form_label(t('Assignee'), 'owner_id') ?>
+ <?= Helper\form_select('owner_id', $users_list, $values, $errors) ?><br/>
+
+ <div class="form-actions">
+ <input type="submit" value="<?= t('Save') ?>" class="btn btn-blue"/>
+ <?= t('or') ?> <a href="?controller=board&amp;action=show&amp;project_id=<?= $values['project_id'] ?>"><?= t('cancel') ?></a>
+ </div>
+ </form>
+ </section>
+
+</section> \ No newline at end of file
diff --git a/app/Template/board_category.php b/app/Template/board_category.php
new file mode 100644
index 00000000..36126a1d
--- /dev/null
+++ b/app/Template/board_category.php
@@ -0,0 +1,24 @@
+<section id="main">
+
+ <div class="page-header board">
+ <h2><?= t('Project "%s"', $current_project_name) ?></h2>
+ </div>
+
+ <section>
+ <h3><?= t('Change category for the task "%s"', $values['title']) ?></h3>
+ <form method="post" action="?controller=board&amp;action=updateCategory" autocomplete="off">
+ <?= Helper\form_csrf() ?>
+ <?= Helper\form_hidden('id', $values) ?>
+ <?= Helper\form_hidden('project_id', $values) ?>
+
+ <?= Helper\form_label(t('Category'), 'category_id') ?>
+ <?= Helper\form_select('category_id', $categories_list, $values, $errors) ?><br/>
+
+ <div class="form-actions">
+ <input type="submit" value="<?= t('Save') ?>" class="btn btn-blue"/>
+ <?= t('or') ?> <a href="?controller=board&amp;action=show&amp;project_id=<?= $values['project_id'] ?>"><?= t('cancel') ?></a>
+ </div>
+ </form>
+ </section>
+
+</section> \ No newline at end of file
diff --git a/app/Template/board_edit.php b/app/Template/board_edit.php
new file mode 100644
index 00000000..cfaebc50
--- /dev/null
+++ b/app/Template/board_edit.php
@@ -0,0 +1,58 @@
+<div class="page-header">
+ <h2><?= t('Edit the board for "%s"', $project['name']) ?></h2>
+</div>
+<section>
+
+<h3><?= t('Change columns') ?></h3>
+<form method="post" action="?controller=board&amp;action=update&amp;project_id=<?= $project['id'] ?>" autocomplete="off">
+ <?= Helper\form_csrf() ?>
+ <?php $i = 0; ?>
+ <table>
+ <tr>
+ <th><?= t('Position') ?></th>
+ <th><?= t('Column title') ?></th>
+ <th><?= t('Task limit') ?></th>
+ <th><?= t('Actions') ?></th>
+ </tr>
+ <?php foreach ($columns as $column): ?>
+ <tr>
+ <td><?= Helper\form_label(t('Column %d', ++$i), 'title['.$column['id'].']', array('title="column_id='.$column['id'].'"')) ?></td>
+ <td><?= Helper\form_text('title['.$column['id'].']', $values, $errors, array('required')) ?></td>
+ <td><?= Helper\form_number('task_limit['.$column['id'].']', $values, $errors, array('placeholder="'.t('limit').'"')) ?></td>
+ <td>
+ <ul>
+ <?php if ($column['position'] != 1): ?>
+ <li>
+ <?= Helper\a(t('Move Up'), 'board', 'moveColumn', array('project_id' => $project['id'], 'column_id' => $column['id'], 'direction' => 'up'), true) ?>
+ </li>
+ <?php endif ?>
+ <?php if ($column['position'] != count($columns)): ?>
+ <li>
+ <?= Helper\a(t('Move Down'), 'board', 'moveColumn', array('project_id' => $project['id'], 'column_id' => $column['id'], 'direction' => 'down'), true) ?>
+ </li>
+ <?php endif ?>
+ <li>
+ <?= Helper\a(t('Remove'), 'board', 'remove', array('project_id' => $project['id'], 'column_id' => $column['id'])) ?>
+ </li>
+ </ul>
+ </td>
+ </tr>
+ <?php endforeach ?>
+ </table>
+
+ <div class="form-actions">
+ <input type="submit" value="<?= t('Update') ?>" class="btn btn-blue"/>
+ </div>
+</form>
+
+<h3><?= t('Add a new column') ?></h3>
+<form method="post" action="?controller=board&amp;action=add&amp;project_id=<?= $project['id'] ?>" autocomplete="off">
+ <?= Helper\form_csrf() ?>
+ <?= Helper\form_hidden('project_id', $values) ?>
+ <?= Helper\form_label(t('Title'), 'title') ?>
+ <?= Helper\form_text('title', $values, $errors, array('required')) ?>
+
+ <div class="form-actions">
+ <input type="submit" value="<?= t('Add this column') ?>" class="btn btn-blue"/>
+ </div>
+</form> \ No newline at end of file
diff --git a/app/Template/board_index.php b/app/Template/board_index.php
new file mode 100644
index 00000000..bff7dcc9
--- /dev/null
+++ b/app/Template/board_index.php
@@ -0,0 +1,38 @@
+<section id="main">
+
+ <div class="page-header board">
+ <h2>
+ <?= t('Project "%s"', $current_project_name) ?>
+ </h2>
+ </div>
+
+ <div class="project-menu">
+ <ul>
+ <li>
+ <span class="hide-tablet"><?= t('Filter by user') ?></span>
+ <?= Helper\form_select('user_id', $users, $filters) ?>
+ </li>
+ <li>
+ <span class="hide-tablet"><?= t('Filter by category') ?></span>
+ <?= Helper\form_select('category_id', $categories, $filters) ?>
+ </li>
+ <li><a href="#" id="filter-due-date"><?= t('Filter by due date') ?></a></li>
+ <li><a href="?controller=project&amp;action=search&amp;project_id=<?= $current_project_id ?>"><?= t('Search') ?></a></li>
+ <li><a href="?controller=project&amp;action=tasks&amp;project_id=<?= $current_project_id ?>"><?= t('Completed tasks') ?></a></li>
+ <li><a href="?controller=project&amp;action=activity&amp;project_id=<?= $current_project_id ?>"><?= t('Activity') ?></a></li>
+ </ul>
+ </div>
+
+ <?php if (empty($board)): ?>
+ <p class="alert alert-error"><?= t('There is no column in your project!') ?></p>
+ <?php else: ?>
+ <?= Helper\template('board_show', array(
+ 'current_project_id' => $current_project_id,
+ 'board' => $board,
+ 'categories' => $categories,
+ 'board_private_refresh_interval' => $board_private_refresh_interval,
+ 'board_highlight_period' => $board_highlight_period,
+ )) ?>
+ <?php endif ?>
+
+</section>
diff --git a/app/Template/board_public.php b/app/Template/board_public.php
new file mode 100644
index 00000000..85c90cfa
--- /dev/null
+++ b/app/Template/board_public.php
@@ -0,0 +1,34 @@
+<section id="main" class="public-board">
+
+ <?php if (empty($columns)): ?>
+ <p class="alert alert-error"><?= t('There is no column in your project!') ?></p>
+ <?php else: ?>
+ <table id="board">
+ <tr>
+ <?php $column_with = round(100 / count($columns), 2); ?>
+ <?php foreach ($columns as $column): ?>
+ <th width="<?= $column_with ?>%">
+ <?= Helper\escape($column['title']) ?>
+ <?php if ($column['task_limit']): ?>
+ <span title="<?= t('Task limit') ?>" class="task-limit">(<?= Helper\escape(count($column['tasks']).'/'.$column['task_limit']) ?>)</span>
+ <?php endif ?>
+ </th>
+ <?php endforeach ?>
+ </tr>
+ <tr>
+ <?php foreach ($columns as $column): ?>
+ <td class="column <?= $column['task_limit'] && count($column['tasks']) > $column['task_limit'] ? 'task-limit-warning' : '' ?>">
+ <?php foreach ($column['tasks'] as $task): ?>
+ <div class="task-board task-<?= $task['color_id'] ?>">
+
+ <?= Helper\template('board_task', array('task' => $task, 'categories' => $categories, 'not_editable' => true, 'project' => $project)) ?>
+
+ </div>
+ <?php endforeach ?>
+ </td>
+ <?php endforeach ?>
+ </tr>
+ </table>
+ <?php endif ?>
+
+</section> \ No newline at end of file
diff --git a/app/Template/board_remove.php b/app/Template/board_remove.php
new file mode 100644
index 00000000..4529063b
--- /dev/null
+++ b/app/Template/board_remove.php
@@ -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']) ?>
+ <?= t('This action will REMOVE ALL TASKS associated to this column!') ?>
+ </p>
+
+ <div class="form-actions">
+ <?= Helper\a(t('Yes'), 'board', 'remove', array('project_id' => $project['id'], 'column_id' => $column['id'], 'remove' => 'yes'), true, 'btn btn-red') ?>
+ <?= t('or') ?> <?= Helper\a(t('cancel'), 'board', 'edit', array('project_id' => $project['id'])) ?>
+ </div>
+</div> \ No newline at end of file
diff --git a/app/Template/board_show.php b/app/Template/board_show.php
new file mode 100644
index 00000000..e8c3c1ba
--- /dev/null
+++ b/app/Template/board_show.php
@@ -0,0 +1,49 @@
+<table id="board" data-project-id="<?= $current_project_id ?>" data-time="<?= time() ?>" data-check-interval="<?= $board_private_refresh_interval ?>" data-csrf-token=<?= \Core\Security::getCSRFToken() ?>>
+<tr>
+ <?php $column_with = round(100 / count($board), 2); ?>
+ <?php foreach ($board as $column): ?>
+ <th width="<?= $column_with ?>%">
+ <div class="board-add-icon">
+ <a href="?controller=task&amp;action=create&amp;project_id=<?= $column['project_id'] ?>&amp;column_id=<?= $column['id'] ?>" title="<?= t('Add a new task') ?>">+</a>
+ </div>
+ <?= Helper\escape($column['title']) ?>
+ <?php if ($column['task_limit']): ?>
+ <span title="<?= t('Task limit') ?>" class="task-limit">
+ (
+ <span id="task-number-column-<?= $column['id'] ?>"><?= count($column['tasks']) ?></span>
+ /
+ <?= Helper\escape($column['task_limit']) ?>
+ )
+ </span>
+ <?php else: ?>
+ <span title="<?= t('Task count') ?>" class="task-count">
+ (<span id="task-number-column-<?= $column['id'] ?>"><?= count($column['tasks']) ?></span>)
+ </span>
+ <?php endif ?>
+ </th>
+ <?php endforeach ?>
+</tr>
+<tr>
+ <?php foreach ($board as $column): ?>
+ <td
+ id="column-<?= $column['id'] ?>"
+ class="column <?= $column['task_limit'] && count($column['tasks']) > $column['task_limit'] ? 'task-limit-warning' : '' ?>"
+ data-column-id="<?= $column['id'] ?>"
+ data-task-limit="<?= $column['task_limit'] ?>"
+ >
+ <?php foreach ($column['tasks'] as $task): ?>
+ <div class="task-board draggable-item task-<?= $task['color_id'] ?> <?= $task['date_modification'] > time() - $board_highlight_period ? 'task-board-recent' : '' ?>"
+ data-task-id="<?= $task['id'] ?>"
+ data-owner-id="<?= $task['owner_id'] ?>"
+ data-category-id="<?= $task['category_id'] ?>"
+ data-due-date="<?= $task['date_due'] ?>"
+ title="<?= t('View this task') ?>">
+
+ <?= Helper\template('board_task', array('task' => $task, 'categories' => $categories)) ?>
+
+ </div>
+ <?php endforeach ?>
+ </td>
+ <?php endforeach ?>
+</tr>
+</table>
diff --git a/app/Template/board_task.php b/app/Template/board_task.php
new file mode 100644
index 00000000..ca854f37
--- /dev/null
+++ b/app/Template/board_task.php
@@ -0,0 +1,109 @@
+<?php if (isset($not_editable)): ?>
+
+ <a href="?controller=task&amp;action=readonly&amp;task_id=<?= $task['id'] ?>&amp;token=<?= $project['token'] ?>">#<?= $task['id'] ?></a>
+
+ <?php if ($task['reference']): ?>
+ <span class="task-board-reference" title="<?= t('Reference') ?>">
+ (<?= $task['reference'] ?>)
+ </span>
+ <?php endif ?>
+
+ &nbsp;-&nbsp;
+
+ <span class="task-board-user">
+ <?php if (! empty($task['owner_id'])): ?>
+ <?= t('Assigned to %s', $task['assignee_name'] ?: $task['assignee_username']) ?>
+ <?php else: ?>
+ <span class="task-board-nobody"><?= t('Nobody assigned') ?></span>
+ <?php endif ?>
+ </span>
+
+ <?php if ($task['score']): ?>
+ <span class="task-score"><?= Helper\escape($task['score']) ?></span>
+ <?php endif ?>
+
+ <div class="task-board-title">
+ <a href="?controller=task&amp;action=readonly&amp;task_id=<?= $task['id'] ?>&amp;token=<?= $project['token'] ?>">
+ <?= Helper\escape($task['title']) ?>
+ </a>
+ </div>
+
+<?php else: ?>
+
+ <a class="task-edit-popover" href="?controller=task&amp;action=edit&amp;task_id=<?= $task['id'] ?>" title="<?= t('Edit this task') ?>">#<?= $task['id'] ?></a>
+
+ <?php if ($task['reference']): ?>
+ <span class="task-board-reference" title="<?= t('Reference') ?>">
+ (<?= $task['reference'] ?>)
+ </span>
+ <?php endif ?>
+
+ &nbsp;-&nbsp;
+
+ <span class="task-board-user">
+ <a class="assignee-popover" href="?controller=board&amp;action=changeAssignee&amp;task_id=<?= $task['id'] ?>" title="<?= t('Change assignee') ?>">
+ <?php if (! empty($task['owner_id'])): ?>
+ <?= t('Assigned to %s', $task['assignee_name'] ?: $task['assignee_username']) ?></a>
+ <?php else: ?>
+ <?= t('Nobody assigned') ?>
+ <?php endif ?>
+ </a>
+ </span>
+
+ <?php if ($task['score']): ?>
+ <span class="task-score"><?= Helper\escape($task['score']) ?></span>
+ <?php endif ?>
+
+ <div class="task-board-title">
+ <a href="?controller=task&amp;action=show&amp;task_id=<?= $task['id'] ?>" title="<?= t('View this task') ?>"><?= Helper\escape($task['title']) ?></a>
+ </div>
+
+<?php endif ?>
+
+
+<?php if ($task['category_id']): ?>
+<div class="task-board-category-container">
+ <span class="task-board-category">
+ <a class="category-popover" href="?controller=board&amp;action=changeCategory&amp;task_id=<?= $task['id'] ?>" title="<?= t('Change category') ?>">
+ <?= Helper\in_list($task['category_id'], $categories) ?>
+ </a>
+ </span>
+</div>
+<?php endif ?>
+
+
+<?php if (! empty($task['date_due']) || ! empty($task['nb_files']) || ! empty($task['nb_comments']) || ! empty($task['description']) || ! empty($task['nb_subtasks'])): ?>
+<div class="task-board-footer">
+
+ <?php if (! empty($task['date_due'])): ?>
+ <div class="task-board-date <?= time() > $task['date_due'] ? 'task-board-date-overdue' : '' ?>">
+ <?= dt('%B %e, %Y', $task['date_due']) ?>
+ </div>
+ <?php endif ?>
+
+ <div class="task-board-icons">
+
+ <?php if (! empty($task['nb_subtasks'])): ?>
+ <span title="<?= t('Sub-Tasks') ?>"><?= $task['nb_completed_subtasks'].'/'.$task['nb_subtasks'] ?> <i class="fa fa-bars"></i></span>
+ <?php endif ?>
+
+ <?php if (! empty($task['nb_files'])): ?>
+ <span title="<?= t('Attachments') ?>"><?= $task['nb_files'] ?> <i class="fa fa-paperclip"></i></span>
+ <?php endif ?>
+
+ <?php if (! empty($task['nb_comments'])): ?>
+ <span title="<?= p($task['nb_comments'], t('%d comment', $task['nb_comments']), t('%d comments', $task['nb_comments'])) ?>"><?= $task['nb_comments'] ?> <i class="fa fa-comment-o"></i></span>
+ <?php endif ?>
+
+ <?php if (! empty($task['description'])): ?>
+ <span title="<?= t('Description') ?>">
+ <?php if (! isset($not_editable)): ?>
+ <a class="task-description-popover" href="?controller=task&amp;action=description&amp;task_id=<?= $task['id'] ?>"><i class="fa fa-file-text-o" data-href="?controller=task&amp;action=description&amp;task_id=<?= $task['id'] ?>"></i></a>
+ <?php else: ?>
+ <i class="fa fa-file-text-o"></i>
+ <?php endif ?>
+ </span>
+ <?php endif ?>
+ </div>
+</div>
+<?php endif ?>
diff --git a/app/Template/category_edit.php b/app/Template/category_edit.php
new file mode 100644
index 00000000..278d7e12
--- /dev/null
+++ b/app/Template/category_edit.php
@@ -0,0 +1,16 @@
+<div class="page-header">
+ <h2><?= t('Category modification for the project "%s"', $project['name']) ?></h2>
+</div>
+
+<form method="post" action="?controller=category&amp;action=update&amp;project_id=<?= $project['id'] ?>" autocomplete="off">
+ <?= Helper\form_csrf() ?>
+ <?= Helper\form_hidden('id', $values) ?>
+ <?= Helper\form_hidden('project_id', $values) ?>
+
+ <?= Helper\form_label(t('Category Name'), 'name') ?>
+ <?= Helper\form_text('name', $values, $errors, array('autofocus required')) ?>
+
+ <div class="form-actions">
+ <input type="submit" value="<?= t('Save') ?>" class="btn btn-blue"/>
+ </div>
+</form> \ No newline at end of file
diff --git a/app/Template/category_index.php b/app/Template/category_index.php
new file mode 100644
index 00000000..4635406e
--- /dev/null
+++ b/app/Template/category_index.php
@@ -0,0 +1,41 @@
+<div class="page-header">
+ <h2><?= t('Categories') ?></h2>
+</div>
+
+<?php if (! empty($categories)): ?>
+<table>
+ <tr>
+ <th><?= t('Category Name') ?></th>
+ <th><?= t('Actions') ?></th>
+ </tr>
+ <?php foreach ($categories as $category_id => $category_name): ?>
+ <tr>
+ <td><?= Helper\escape($category_name) ?></td>
+ <td>
+ <ul>
+ <li>
+ <a href="?controller=category&amp;action=edit&amp;project_id=<?= $project['id'] ?>&amp;category_id=<?= $category_id ?>"><?= t('Edit') ?></a>
+ </li>
+ <li>
+ <a href="?controller=category&amp;action=confirm&amp;project_id=<?= $project['id'] ?>&amp;category_id=<?= $category_id ?>"><?= t('Remove') ?></a>
+ </li>
+ </ul>
+ </td>
+ </tr>
+ <?php endforeach ?>
+</table>
+<?php endif ?>
+
+<h3><?= t('Add a new category') ?></h3>
+<form method="post" action="?controller=category&amp;action=save&amp;project_id=<?= $project['id'] ?>" autocomplete="off">
+
+ <?= Helper\form_csrf() ?>
+ <?= Helper\form_hidden('project_id', $values) ?>
+
+ <?= Helper\form_label(t('Category Name'), 'name') ?>
+ <?= Helper\form_text('name', $values, $errors, array('autofocus required')) ?>
+
+ <div class="form-actions">
+ <input type="submit" value="<?= t('Save') ?>" class="btn btn-blue"/>
+ </div>
+</form> \ No newline at end of file
diff --git a/app/Template/category_remove.php b/app/Template/category_remove.php
new file mode 100644
index 00000000..cfc23e07
--- /dev/null
+++ b/app/Template/category_remove.php
@@ -0,0 +1,16 @@
+<section id="main">
+ <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>
+
+ <div class="form-actions">
+ <a href="?controller=category&amp;action=remove&amp;project_id=<?= $project['id'] ?>&amp;category_id=<?= $category['id'].Helper\param_csrf() ?>" class="btn btn-red"><?= t('Yes') ?></a>
+ <?= t('or') ?> <a href="?controller=category&amp;project_id=<?= $project['id'] ?>"><?= t('cancel') ?></a>
+ </div>
+ </div>
+</section> \ No newline at end of file
diff --git a/app/Template/comment_create.php b/app/Template/comment_create.php
new file mode 100644
index 00000000..11772f75
--- /dev/null
+++ b/app/Template/comment_create.php
@@ -0,0 +1,19 @@
+<div class="page-header">
+ <h2><?= t('Add a comment') ?></h2>
+</div>
+
+<form method="post" action="?controller=comment&amp;action=save&amp;task_id=<?= $task['id'] ?>" autocomplete="off">
+ <?= Helper\form_csrf() ?>
+ <?= Helper\form_hidden('task_id', $values) ?>
+ <?= Helper\form_hidden('user_id', $values) ?>
+ <?= Helper\form_textarea('comment', $values, $errors, array(! isset($skip_cancel) ? 'autofocus' : '', 'required', 'placeholder="'.t('Leave a comment').'"'), 'comment-textarea') ?><br/>
+ <div class="form-help"><a href="http://kanboard.net/documentation/syntax-guide" target="_blank" rel="noreferrer"><?= t('Write your text in Markdown') ?></a></div>
+
+ <div class="form-actions">
+ <input type="submit" value="<?= t('Save') ?>" class="btn btn-blue"/>
+ <?php if (! isset($skip_cancel)): ?>
+ <?= t('or') ?>
+ <a href="?controller=task&amp;action=show&amp;task_id=<?= $task['id'] ?>"><?= t('cancel') ?></a>
+ <?php endif ?>
+ </div>
+</form>
diff --git a/app/Template/comment_edit.php b/app/Template/comment_edit.php
new file mode 100644
index 00000000..4ce48964
--- /dev/null
+++ b/app/Template/comment_edit.php
@@ -0,0 +1,17 @@
+<div class="page-header">
+ <h2><?= t('Edit a comment') ?></h2>
+</div>
+
+<form method="post" action="?controller=comment&amp;action=update&amp;task_id=<?= $task['id'] ?>&amp;comment_id=<?= $comment['id'] ?>" autocomplete="off">
+
+ <?= Helper\form_csrf() ?>
+ <?= Helper\form_hidden('id', $values) ?>
+ <?= Helper\form_hidden('task_id', $values) ?>
+ <?= Helper\form_textarea('comment', $values, $errors, array('autofocus', 'required', 'placeholder="'.t('Leave a comment').'"'), 'comment-textarea') ?><br/>
+
+ <div class="form-actions">
+ <input type="submit" value="<?= t('Update') ?>" class="btn btn-blue"/>
+ <?= t('or') ?>
+ <a href="?controller=task&amp;action=show&amp;task_id=<?= $task['id'] ?>"><?= t('cancel') ?></a>
+ </div>
+</form>
diff --git a/app/Template/comment_forbidden.php b/app/Template/comment_forbidden.php
new file mode 100644
index 00000000..eeea8404
--- /dev/null
+++ b/app/Template/comment_forbidden.php
@@ -0,0 +1,9 @@
+<section id="main">
+ <div class="page-header">
+ <h2><?= t('Forbidden') ?></h2>
+ </div>
+
+ <p class="alert alert-error">
+ <?= t('Only administrators or the creator of the comment can access to this page.') ?>
+ </p>
+</section> \ No newline at end of file
diff --git a/app/Template/comment_remove.php b/app/Template/comment_remove.php
new file mode 100644
index 00000000..7b117781
--- /dev/null
+++ b/app/Template/comment_remove.php
@@ -0,0 +1,16 @@
+<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>
+
+ <?= Helper\template('comment_show', array('comment' => $comment, 'task' => $task, 'preview' => true)) ?>
+
+ <div class="form-actions">
+ <a href="?controller=comment&amp;action=remove&amp;task_id=<?= $task['id'] ?>&amp;comment_id=<?= $comment['id'].Helper\param_csrf() ?>" class="btn btn-red"><?= t('Yes') ?></a>
+ <?= t('or') ?> <a href="?controller=task&amp;action=show&amp;task_id=<?= $task['id'] ?>#comment-<?= $comment['id'] ?>"><?= t('cancel') ?></a>
+ </div>
+</div> \ No newline at end of file
diff --git a/app/Template/comment_show.php b/app/Template/comment_show.php
new file mode 100644
index 00000000..b2ccc25a
--- /dev/null
+++ b/app/Template/comment_show.php
@@ -0,0 +1,41 @@
+<div class="comment <?= isset($preview) ? 'comment-preview' : '' ?>" id="comment-<?= $comment['id'] ?>">
+
+ <p class="comment-title">
+ <span class="comment-username"><?= Helper\escape($comment['name'] ?: $comment['username']) ?></span> @ <span class="comment-date"><?= dt('%B %e, %Y at %k:%M %p', $comment['date']) ?></span>
+ </p>
+
+ <div class="comment-inner">
+
+ <?php if (! isset($preview)): ?>
+ <ul class="comment-actions">
+ <li><a href="#comment-<?= $comment['id'] ?>"><?= t('link') ?></a></li>
+ <?php if ((! isset($not_editable) || ! $not_editable) && (Helper\is_admin() || Helper\is_current_user($comment['user_id']))): ?>
+ <li>
+ <a href="?controller=comment&amp;action=confirm&amp;task_id=<?= $task['id'] ?>&amp;comment_id=<?= $comment['id'] ?>"><?= t('remove') ?></a>
+ </li>
+ <li>
+ <a href="?controller=comment&amp;action=edit&amp;task_id=<?= $task['id'] ?>&amp;comment_id=<?= $comment['id'] ?>"><?= t('edit') ?></a>
+ </li>
+ <?php endif ?>
+ </ul>
+ <?php endif ?>
+
+ <div class="markdown">
+ <?php if (isset($is_public) && $is_public): ?>
+ <?= Helper\markdown(
+ $comment['comment'],
+ array(
+ 'controller' => 'task',
+ 'action' => 'readonly',
+ 'params' => array(
+ 'token' => $project['token']
+ )
+ )
+ ) ?>
+ <?php else: ?>
+ <?= Helper\markdown($comment['comment']) ?>
+ <?php endif ?>
+ </div>
+
+ </div>
+</div> \ No newline at end of file
diff --git a/app/Template/config_about.php b/app/Template/config_about.php
new file mode 100644
index 00000000..3f34f802
--- /dev/null
+++ b/app/Template/config_about.php
@@ -0,0 +1,41 @@
+<div class="page-header">
+ <h2><?= t('About') ?></h2>
+</div>
+<section class="listing">
+ <ul>
+ <li>
+ <?= t('Official website:') ?>
+ <a href="http://kanboard.net/" target="_blank" rel="noreferer">http://kanboard.net/</a>
+ </li>
+ <li>
+ <?= t('Application version:') ?>
+ <strong><?= APP_VERSION ?></strong>
+ </li>
+ </ul>
+</section>
+
+<div class="page-header">
+ <h2><?= t('Database') ?></h2>
+</div>
+<section class="listing">
+ <ul>
+ <li>
+ <?= t('Database driver:') ?>
+ <strong><?= Helper\escape(DB_DRIVER) ?></strong>
+ </li>
+ <?php if (DB_DRIVER === 'sqlite'): ?>
+ <li>
+ <?= t('Database size:') ?>
+ <strong><?= Helper\format_bytes($db_size) ?></strong>
+ </li>
+ <li>
+ <?= Helper\a(t('Download the database'), 'config', 'downloadDb', array(), true) ?>&nbsp;
+ <?= t('(Gzip compressed Sqlite file)') ?>
+ </li>
+ <li>
+ <?= Helper\a(t('Optimize the database'), 'config', 'optimizeDb', array(), true) ?>&nbsp;
+ <?= t('(VACUUM command)') ?>
+ </li>
+ <?php endif ?>
+ </ul>
+</section> \ No newline at end of file
diff --git a/app/Template/config_api.php b/app/Template/config_api.php
new file mode 100644
index 00000000..037ea08d
--- /dev/null
+++ b/app/Template/config_api.php
@@ -0,0 +1,18 @@
+<div class="page-header">
+ <h2><?= t('API') ?></h2>
+</div>
+<section class="listing">
+ <ul>
+ <li>
+ <?= t('API token:') ?>
+ <strong><?= Helper\escape($values['api_token']) ?></strong>
+ </li>
+ <li>
+ <?= t('API endpoint:') ?>
+ <input type="text" readonly="readonly" value="<?= Helper\get_current_base_url().'jsonrpc.php' ?>">
+ </li>
+ <li>
+ <?= Helper\a(t('Reset token'), 'config', 'token', array('type' => 'api'), true) ?>
+ </li>
+ </ul>
+</section> \ No newline at end of file
diff --git a/app/Template/config_application.php b/app/Template/config_application.php
new file mode 100644
index 00000000..97071bd0
--- /dev/null
+++ b/app/Template/config_application.php
@@ -0,0 +1,27 @@
+<div class="page-header">
+ <h2><?= t('Application settings') ?></h2>
+</div>
+<section>
+<form method="post" action="<?= Helper\u('config', 'application') ?>" autocomplete="off">
+
+ <?= Helper\form_csrf() ?>
+
+ <?= Helper\form_label(t('Application URL'), 'application_url') ?>
+ <?= Helper\form_text('application_url', $values, $errors, array('placeholder="http://example.kanboar.net/"')) ?><br/>
+ <p class="form-help"><?= t('Example: http://example.kanboard.net/ (used by email notifications)') ?></p>
+
+ <?= Helper\form_label(t('Language'), 'application_language') ?>
+ <?= Helper\form_select('application_language', $languages, $values, $errors) ?><br/>
+
+ <?= Helper\form_label(t('Timezone'), 'application_timezone') ?>
+ <?= Helper\form_select('application_timezone', $timezones, $values, $errors) ?><br/>
+
+ <?= Helper\form_label(t('Date format'), 'application_date_format') ?>
+ <?= Helper\form_select('application_date_format', $date_formats, $values, $errors) ?><br/>
+ <p class="form-help"><?= t('ISO format is always accepted, example: "%s" and "%s"', date('Y-m-d'), date('Y_m_d')) ?></p>
+
+ <div class="form-actions">
+ <input type="submit" value="<?= t('Save') ?>" class="btn btn-blue"/>
+ </div>
+</form>
+</section> \ No newline at end of file
diff --git a/app/Template/config_board.php b/app/Template/config_board.php
new file mode 100644
index 00000000..f260d084
--- /dev/null
+++ b/app/Template/config_board.php
@@ -0,0 +1,29 @@
+<div class="page-header">
+ <h2><?= t('Board settings') ?></h2>
+</div>
+<section>
+<form method="post" action="<?= Helper\u('config', 'board') ?>" autocomplete="off">
+
+ <?= Helper\form_csrf() ?>
+
+ <?= Helper\form_label(t('Task highlight period'), 'board_highlight_period') ?>
+ <?= Helper\form_number('board_highlight_period', $values, $errors) ?><br/>
+ <p class="form-help"><?= t('Period (in second) to consider a task was modified recently (0 to disable, 2 days by default)') ?></p>
+
+ <?= Helper\form_label(t('Refresh interval for public board'), 'board_public_refresh_interval') ?>
+ <?= Helper\form_number('board_public_refresh_interval', $values, $errors) ?><br/>
+ <p class="form-help"><?= t('Frequency in second (60 seconds by default)') ?></p>
+
+ <?= Helper\form_label(t('Refresh interval for private board'), 'board_private_refresh_interval') ?>
+ <?= Helper\form_number('board_private_refresh_interval', $values, $errors) ?><br/>
+ <p class="form-help"><?= t('Frequency in second (0 to disable this feature, 10 seconds by default)') ?></p>
+
+ <?= Helper\form_label(t('Default columns for new projects (Comma-separated)'), 'board_columns') ?>
+ <?= Helper\form_text('board_columns', $values, $errors) ?><br/>
+ <p class="form-help"><?= t('Default values are "%s"', $default_columns) ?></p>
+
+ <div class="form-actions">
+ <input type="submit" value="<?= t('Save') ?>" class="btn btn-blue"/>
+ </div>
+</form>
+</section> \ No newline at end of file
diff --git a/app/Template/config_layout.php b/app/Template/config_layout.php
new file mode 100644
index 00000000..3aacb9b7
--- /dev/null
+++ b/app/Template/config_layout.php
@@ -0,0 +1,13 @@
+<section id="main">
+ <div class="page-header">
+ <h2><?= t('Settings') ?></h2>
+ </div>
+ <section class="config-show" id="config-section">
+
+ <?= Helper\template('config_sidebar') ?>
+
+ <div class="config-show-main">
+ <?= $config_content_for_layout ?>
+ </div>
+ </section>
+</section> \ No newline at end of file
diff --git a/app/Template/config_sidebar.php b/app/Template/config_sidebar.php
new file mode 100644
index 00000000..d96159b8
--- /dev/null
+++ b/app/Template/config_sidebar.php
@@ -0,0 +1,22 @@
+<div class="config-show-sidebar">
+ <h2><?= t('Actions') ?></h2>
+ <div class="config-show-actions">
+ <ul>
+ <li>
+ <?= Helper\a(t('About'), 'config', 'index') ?>
+ </li>
+ <li>
+ <?= Helper\a(t('Application settings'), 'config', 'application') ?>
+ </li>
+ <li>
+ <?= Helper\a(t('Board settings'), 'config', 'board') ?>
+ </li>
+ <li>
+ <?= Helper\a(t('Webhooks'), 'config', 'webhook') ?>
+ </li>
+ <li>
+ <?= Helper\a(t('API'), 'config', 'api') ?>
+ </li>
+ </ul>
+ </div>
+</div> \ No newline at end of file
diff --git a/app/Template/config_webhook.php b/app/Template/config_webhook.php
new file mode 100644
index 00000000..052a2a99
--- /dev/null
+++ b/app/Template/config_webhook.php
@@ -0,0 +1,38 @@
+<div class="page-header">
+ <h2><?= t('Webhook settings') ?></h2>
+</div>
+<section>
+<form method="post" action="<?= Helper\u('config', 'webhook') ?>" autocomplete="off">
+
+ <?= Helper\form_csrf() ?>
+
+ <?= Helper\form_label(t('Webhook URL for task creation'), 'webhook_url_task_creation') ?>
+ <?= Helper\form_text('webhook_url_task_creation', $values, $errors) ?><br/>
+
+ <?= Helper\form_label(t('Webhook URL for task modification'), 'webhook_url_task_modification') ?>
+ <?= Helper\form_text('webhook_url_task_modification', $values, $errors) ?><br/>
+
+ <div class="form-actions">
+ <input type="submit" value="<?= t('Save') ?>" class="btn btn-blue"/>
+ </div>
+</form>
+</section>
+
+<div class="page-header">
+ <h2><?= t('URL and token') ?></h2>
+</div>
+<section class="listing">
+ <ul>
+ <li>
+ <?= t('Webhook token:') ?>
+ <strong><?= Helper\escape($values['webhook_token']) ?></strong>
+ </li>
+ <li>
+ <?= t('URL for task creation:') ?>
+ <input type="text" readonly="readonly" value="<?= Helper\get_current_base_url().Helper\u('webhook', 'task', array('token' => $values['webhook_token'])) ?>">
+ </li>
+ <li>
+ <?= Helper\a(t('Reset token'), 'config', 'token', array('type' => 'webhook'), true) ?>
+ </li>
+ </ul>
+</section> \ No newline at end of file
diff --git a/app/Template/event_comment_create.php b/app/Template/event_comment_create.php
new file mode 100644
index 00000000..d2f6f97b
--- /dev/null
+++ b/app/Template/event_comment_create.php
@@ -0,0 +1,7 @@
+<p class="activity-title">
+ <?= e('%s commented the task <a href="?controller=task&amp;action=show&amp;task_id=%d">#%d</a>', Helper\escape($author), $task_id, $task_id) ?>
+</p>
+<div class="activity-description">
+ <em><?= Helper\escape($task['title']) ?></em><br/>
+ <div class="markdown"><?= Helper\markdown($comment['comment']) ?></div>
+</div> \ No newline at end of file
diff --git a/app/Template/event_comment_update.php b/app/Template/event_comment_update.php
new file mode 100644
index 00000000..27cc0be6
--- /dev/null
+++ b/app/Template/event_comment_update.php
@@ -0,0 +1,7 @@
+<p class="activity-title">
+ <?= e('%s updated a comment on the task <a href="?controller=task&amp;action=show&amp;task_id=%d">#%d</a>', Helper\escape($author), $task_id, $task_id) ?>
+</p>
+<div class="activity-description">
+ <em><?= Helper\escape($task['title']) ?></em><br/>
+ <div class="markdown"><?= Helper\markdown($comment['comment']) ?></div>
+</div> \ No newline at end of file
diff --git a/app/Template/event_subtask_create.php b/app/Template/event_subtask_create.php
new file mode 100644
index 00000000..664e9da2
--- /dev/null
+++ b/app/Template/event_subtask_create.php
@@ -0,0 +1,19 @@
+<p class="activity-title">
+ <?= e('%s created a subtask for the task <a href="?controller=task&amp;action=show&amp;task_id=%d">#%d</a>', Helper\escape($author), $task_id, $task_id) ?>
+</p>
+<div class="activity-description">
+ <p><em><?= Helper\escape($task['title']) ?></em></p>
+
+ <ul>
+ <li>
+ <?= Helper\escape($subtask['title']) ?> (<strong><?= Helper\escape($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> \ No newline at end of file
diff --git a/app/Template/event_subtask_update.php b/app/Template/event_subtask_update.php
new file mode 100644
index 00000000..96a589dd
--- /dev/null
+++ b/app/Template/event_subtask_update.php
@@ -0,0 +1,19 @@
+<p class="activity-title">
+ <?= e('%s updated a subtask for the task <a href="?controller=task&amp;action=show&amp;task_id=%d">#%d</a>', Helper\escape($author), $task_id, $task_id) ?>
+</p>
+<div class="activity-description">
+ <p><em><?= Helper\escape($task['title']) ?></em></p>
+
+ <ul>
+ <li>
+ <?= Helper\escape($subtask['title']) ?> (<strong><?= Helper\escape($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>
diff --git a/app/Template/event_task_assignee_change.php b/app/Template/event_task_assignee_change.php
new file mode 100644
index 00000000..b346325e
--- /dev/null
+++ b/app/Template/event_task_assignee_change.php
@@ -0,0 +1,12 @@
+<p class="activity-title">
+ <?= e(
+ '%s change the assignee of the task <a href="?controller=task&amp;action=show&amp;task_id=%d">#%d</a> to %s',
+ Helper\escape($author),
+ $task_id,
+ $task_id,
+ Helper\escape($task['assignee_name'] ?: $task['assignee_username'])
+ ) ?>
+</p>
+<p class="activity-description">
+ <em><?= Helper\escape($task['title']) ?></em>
+</p> \ No newline at end of file
diff --git a/app/Template/event_task_close.php b/app/Template/event_task_close.php
new file mode 100644
index 00000000..48d25678
--- /dev/null
+++ b/app/Template/event_task_close.php
@@ -0,0 +1,6 @@
+<p class="activity-title">
+ <?= e('%s closed the task <a href="?controller=task&amp;action=show&amp;task_id=%d">#%d</a>', Helper\escape($author), $task_id, $task_id) ?>
+</p>
+<p class="activity-description">
+ <em><?= Helper\escape($task['title']) ?></em>
+</p> \ No newline at end of file
diff --git a/app/Template/event_task_create.php b/app/Template/event_task_create.php
new file mode 100644
index 00000000..2515af05
--- /dev/null
+++ b/app/Template/event_task_create.php
@@ -0,0 +1,6 @@
+<p class="activity-title">
+ <?= e('%s created the task <a href="?controller=task&amp;action=show&amp;task_id=%d">#%d</a>', Helper\escape($author), $task_id, $task_id) ?>
+</p>
+<p class="activity-description">
+ <em><?= Helper\escape($task['title']) ?></em>
+</p> \ No newline at end of file
diff --git a/app/Template/event_task_move_column.php b/app/Template/event_task_move_column.php
new file mode 100644
index 00000000..f2aac8f7
--- /dev/null
+++ b/app/Template/event_task_move_column.php
@@ -0,0 +1,6 @@
+<p class="activity-title">
+ <?= e('%s moved the task <a href="?controller=task&amp;action=show&amp;task_id=%d">#%d</a> to the column "%s"', Helper\escape($author), $task_id, $task_id, Helper\escape($task['column_title'])) ?>
+</p>
+<p class="activity-description">
+ <em><?= Helper\escape($task['title']) ?></em>
+</p> \ No newline at end of file
diff --git a/app/Template/event_task_move_position.php b/app/Template/event_task_move_position.php
new file mode 100644
index 00000000..26cdeb13
--- /dev/null
+++ b/app/Template/event_task_move_position.php
@@ -0,0 +1,6 @@
+<p class="activity-title">
+ <?= e('%s moved the task <a href="?controller=task&amp;action=show&amp;task_id=%d">#%d</a> to the position #%d in the column "%s"', Helper\escape($author), $task_id, $task_id, $task['position'], Helper\escape($task['column_title'])) ?>
+</p>
+<p class="activity-description">
+ <em><?= Helper\escape($task['title']) ?></em>
+</p> \ No newline at end of file
diff --git a/app/Template/event_task_open.php b/app/Template/event_task_open.php
new file mode 100644
index 00000000..9623be74
--- /dev/null
+++ b/app/Template/event_task_open.php
@@ -0,0 +1,6 @@
+<p class="activity-title">
+ <?= e('%s open the task <a href="?controller=task&amp;action=show&amp;task_id=%d">#%d</a>', Helper\escape($author), $task_id, $task_id) ?>
+</p>
+<p class="activity-description">
+ <em><?= Helper\escape($task['title']) ?></em>
+</p> \ No newline at end of file
diff --git a/app/Template/event_task_update.php b/app/Template/event_task_update.php
new file mode 100644
index 00000000..a270b936
--- /dev/null
+++ b/app/Template/event_task_update.php
@@ -0,0 +1,6 @@
+<p class="activity-title">
+ <?= e('%s updated the task <a href="?controller=task&amp;action=show&amp;task_id=%d">#%d</a>', Helper\escape($author), $task_id, $task_id) ?>
+</p>
+<p class="activity-description">
+ <em><?= Helper\escape($task['title']) ?></em>
+</p> \ No newline at end of file
diff --git a/app/Template/file_new.php b/app/Template/file_new.php
new file mode 100644
index 00000000..7f7f1d1c
--- /dev/null
+++ b/app/Template/file_new.php
@@ -0,0 +1,14 @@
+<div class="page-header">
+ <h2><?= t('Attach a document') ?></h2>
+</div>
+
+<form action="?controller=file&amp;action=save&amp;task_id=<?= $task['id'] ?>" method="post" enctype="multipart/form-data">
+ <?= Helper\form_csrf() ?>
+ <input type="file" name="files[]" multiple />
+ <div class="form-help"><?= t('Maximum size: ') ?><?= is_integer($max_size) ? Helper\format_bytes($max_size) : $max_size ?></div>
+ <div class="form-actions">
+ <input type="submit" value="<?= t('Save') ?>" class="btn btn-blue"/>
+ <?= t('or') ?>
+ <a href="?controller=task&amp;action=show&amp;task_id=<?= $task['id'] ?>"><?= t('cancel') ?></a>
+ </div>
+</form> \ No newline at end of file
diff --git a/app/Template/file_open.php b/app/Template/file_open.php
new file mode 100644
index 00000000..aa181d64
--- /dev/null
+++ b/app/Template/file_open.php
@@ -0,0 +1,6 @@
+<div class="page-header">
+ <h2><?= Helper\escape($file['name']) ?></h2>
+ <div class="task-file-viewer">
+ <img src="?controller=file&amp;action=image&amp;file_id=<?= $file['id'] ?>&amp;task_id=<?= $file['task_id'] ?>" alt="<?= Helper\escape($file['name']) ?>"/>
+ </div>
+</div> \ No newline at end of file
diff --git a/app/Template/file_remove.php b/app/Template/file_remove.php
new file mode 100644
index 00000000..af77591c
--- /dev/null
+++ b/app/Template/file_remove.php
@@ -0,0 +1,14 @@
+<div class="page-header">
+ <h2><?= t('Remove a file') ?></h2>
+</div>
+
+<div class="confirm">
+ <p class="alert alert-info">
+ <?= t('Do you really want to remove this file: "%s"?', Helper\escape($file['name'])) ?>
+ </p>
+
+ <div class="form-actions">
+ <a href="?controller=file&amp;action=remove&amp;task_id=<?= $task['id'] ?>&amp;file_id=<?= $file['id'].Helper\param_csrf() ?>" class="btn btn-red"><?= t('Yes') ?></a>
+ <?= t('or') ?> <a href="?controller=task&amp;action=show&amp;task_id=<?= $task['id'] ?>"><?= t('cancel') ?></a>
+ </div>
+</div> \ No newline at end of file
diff --git a/app/Template/file_show.php b/app/Template/file_show.php
new file mode 100644
index 00000000..3832a0f5
--- /dev/null
+++ b/app/Template/file_show.php
@@ -0,0 +1,23 @@
+<?php if (! empty($files)): ?>
+<div id="attachments" class="task-show-section">
+
+ <div class="page-header">
+ <h2><?= t('Attachments') ?></h2>
+ </div>
+
+ <ul class="task-show-files">
+ <?php foreach ($files as $file): ?>
+ <li>
+ <a href="?controller=file&amp;action=download&amp;file_id=<?= $file['id'] ?>&amp;task_id=<?= $task['id'] ?>"><?= Helper\escape($file['name']) ?></a>
+ <span class="task-show-file-actions">
+ <?php if ($file['is_image']): ?>
+ <a href="?controller=file&amp;action=open&amp;file_id=<?= $file['id'] ?>&amp;task_id=<?= $task['id'] ?>" class="file-popover"><?= t('open') ?></a>,
+ <?php endif ?>
+ <a href="?controller=file&amp;action=confirm&amp;file_id=<?= $file['id'] ?>&amp;task_id=<?= $task['id'] ?>"><?= t('remove') ?></a>
+ </span>
+ </li>
+ <?php endforeach ?>
+ </ul>
+
+</div>
+<?php endif ?> \ No newline at end of file
diff --git a/app/Template/layout.php b/app/Template/layout.php
new file mode 100644
index 00000000..a86d613b
--- /dev/null
+++ b/app/Template/layout.php
@@ -0,0 +1,84 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width">
+ <meta name="mobile-web-app-capable" content="yes">
+ <meta name="robots" content="noindex,nofollow">
+
+ <?php if (isset($board_public_refresh_interval)): ?>
+ <meta http-equiv="refresh" content="<?= $board_public_refresh_interval ?>" >
+ <?php endif ?>
+
+ <?php if (! isset($not_editable)): ?>
+ <?= Helper\js('assets/js/jquery-1.11.1.min.js') ?>
+ <?= Helper\js('assets/js/jquery-ui-1.10.4.custom.min.js') ?>
+ <?= Helper\js('assets/js/jquery.ui.touch-punch.min.js') ?>
+ <?= Helper\js('assets/js/chosen.jquery.min.js') ?>
+ <?= Helper\js('assets/js/app.js') ?>
+ <?php endif ?>
+
+ <?= Helper\css('assets/css/app.css') ?>
+ <?= Helper\css('assets/css/font-awesome.min.css') ?>
+ <?= Helper\css('assets/css/jquery-ui-1.10.4.custom.css'); ?>
+ <?= Helper\css('assets/css/chosen.min.css'); ?>
+
+ <link rel="icon" type="image/png" href="assets/img/favicon.png">
+ <link rel="apple-touch-icon" href="assets/img/touch-icon-iphone.png">
+ <link rel="apple-touch-icon" sizes="72x72" href="assets/img/touch-icon-ipad.png">
+ <link rel="apple-touch-icon" sizes="114x114" href="assets/img/touch-icon-iphone-retina.png">
+ <link rel="apple-touch-icon" sizes="144x144" href="assets/img/touch-icon-ipad-retina.png">
+
+ <title><?= isset($title) ? Helper\escape($title).' - Kanboard' : 'Kanboard' ?></title>
+ </head>
+ <body>
+ <?php if (isset($no_layout) && $no_layout): ?>
+ <?= $content_for_layout ?>
+ <?php else: ?>
+ <header>
+ <nav>
+ <a class="logo" href="?">kanboard</a>
+
+ <ul>
+ <?php if (isset($board_selector) && ! empty($board_selector)): ?>
+ <li>
+ <select id="board-selector" data-placeholder="<?= t('Display another project') ?>">
+ <option value=""></option>
+ <?php foreach($board_selector as $board_id => $board_name): ?>
+ <option value="<?= $board_id ?>"><?= Helper\escape($board_name) ?></option>
+ <?php endforeach ?>
+ </select>
+ </li>
+ <?php endif ?>
+ <li <?= isset($menu) && $menu === 'dashboard' ? 'class="active"' : '' ?>>
+ <a href="?controller=app"><?= t('Dashboard') ?></a>
+ </li>
+ <li <?= isset($menu) && $menu === 'boards' ? 'class="active"' : '' ?>>
+ <a href="?controller=board"><?= t('Boards') ?></a>
+ </li>
+ <li <?= isset($menu) && $menu === 'projects' ? 'class="active"' : '' ?>>
+ <a href="?controller=project"><?= t('Projects') ?></a>
+ </li>
+ <?php if (Helper\is_admin()): ?>
+ <li <?= isset($menu) && $menu === 'users' ? 'class="active"' : '' ?>>
+ <a href="?controller=user"><?= t('Users') ?></a>
+ </li>
+ <li class="hide-tablet <?= isset($menu) && $menu === 'config' ? 'active' : '' ?>">
+ <a href="?controller=config"><?= t('Settings') ?></a>
+ </li>
+ <?php endif ?>
+ <li>
+ <a href="?controller=user&amp;action=logout<?= Helper\param_csrf() ?>"><?= t('Logout') ?></a>
+ <span class="username">(<a href="?controller=user&amp;action=show&amp;user_id=<?= Helper\get_user_id() ?>"><?= Helper\escape(Helper\get_username()) ?></a>)</span>
+ </li>
+ </ul>
+ </nav>
+ </header>
+ <section class="page">
+ <?= Helper\flash('<div class="alert alert-success alert-fade-out">%s</div>') ?>
+ <?= Helper\flash_error('<div class="alert alert-error">%s</div>') ?>
+ <?= $content_for_layout ?>
+ </section>
+ <?php endif ?>
+ </body>
+</html>
diff --git a/app/Template/notification_comment_creation.php b/app/Template/notification_comment_creation.php
new file mode 100644
index 00000000..5b334d76
--- /dev/null
+++ b/app/Template/notification_comment_creation.php
@@ -0,0 +1,7 @@
+<h2><?= Helper\escape($task['title']) ?> (#<?= $task['id'] ?>)</h2>
+
+<h3><?= t('New comment posted by %s', $comment['name'] ?: $comment['username']) ?></h3>
+
+<?= Helper\markdown($comment['comment']) ?>
+
+<?= Helper\template('notification_footer', array('task' => $task, 'application_url' => $application_url)) ?> \ No newline at end of file
diff --git a/app/Template/notification_comment_update.php b/app/Template/notification_comment_update.php
new file mode 100644
index 00000000..04aafb85
--- /dev/null
+++ b/app/Template/notification_comment_update.php
@@ -0,0 +1,7 @@
+<h2><?= Helper\escape($task['title']) ?> (#<?= $task['id'] ?>)</h2>
+
+<h3><?= t('Comment updated') ?></h3>
+
+<?= Helper\markdown($comment['comment']) ?>
+
+<?= Helper\template('notification_footer', array('task' => $task, 'application_url' => $application_url)) ?> \ No newline at end of file
diff --git a/app/Template/notification_file_creation.php b/app/Template/notification_file_creation.php
new file mode 100644
index 00000000..d8636820
--- /dev/null
+++ b/app/Template/notification_file_creation.php
@@ -0,0 +1,5 @@
+<h2><?= Helper\escape($task['title']) ?> (#<?= $task['id'] ?>)</h2>
+
+<h3><?= t('New attachment added "%s"', $file['name']) ?></h3>
+
+<?= Helper\template('notification_footer', array('task' => $task, 'application_url' => $application_url)) ?> \ No newline at end of file
diff --git a/app/Template/notification_footer.php b/app/Template/notification_footer.php
new file mode 100644
index 00000000..533621f4
--- /dev/null
+++ b/app/Template/notification_footer.php
@@ -0,0 +1,6 @@
+<hr/>
+Kanboard
+
+<?php if ($application_url): ?>
+ - <a href="<?= $application_url.'?controller=task&action=show&task_id='.$task['id'] ?>"><?= t('view the task on Kanboard') ?></a>.
+<?php endif ?>
diff --git a/app/Template/notification_subtask_creation.php b/app/Template/notification_subtask_creation.php
new file mode 100644
index 00000000..2ddfc649
--- /dev/null
+++ b/app/Template/notification_subtask_creation.php
@@ -0,0 +1,17 @@
+<h2><?= Helper\escape($task['title']) ?> (#<?= $task['id'] ?>)</h2>
+
+<h3><?= t('New sub-task') ?></h3>
+
+<ul>
+ <li><?= t('Title:') ?> <?= Helper\escape($subtask['title']) ?></li>
+ <li><?= t('Status:') ?> <?= Helper\escape($subtask['status_name']) ?></li>
+ <li><?= t('Assignee:') ?> <?= Helper\escape($subtask['name'] ?: $subtask['username'] ?: '?') ?></li>
+ <li>
+ <?= t('Time tracking:') ?>
+ <?php if (! empty($subtask['time_estimated'])): ?>
+ <strong><?= Helper\escape($subtask['time_estimated']).'h' ?></strong> <?= t('estimated') ?>
+ <?php endif ?>
+ </li>
+</ul>
+
+<?= Helper\template('notification_footer', array('task' => $task, 'application_url' => $application_url)) ?> \ No newline at end of file
diff --git a/app/Template/notification_subtask_update.php b/app/Template/notification_subtask_update.php
new file mode 100644
index 00000000..999edbf9
--- /dev/null
+++ b/app/Template/notification_subtask_update.php
@@ -0,0 +1,21 @@
+<h2><?= Helper\escape($task['title']) ?> (#<?= $task['id'] ?>)</h2>
+
+<h3><?= t('Sub-task updated') ?></h3>
+
+<ul>
+ <li><?= t('Title:') ?> <?= Helper\escape($subtask['title']) ?></li>
+ <li><?= t('Status:') ?> <?= Helper\escape($subtask['status_name']) ?></li>
+ <li><?= t('Assignee:') ?> <?= Helper\escape($subtask['name'] ?: $subtask['username'] ?: '?') ?></li>
+ <li>
+ <?= t('Time tracking:') ?>
+ <?php if (! empty($subtask['time_spent'])): ?>
+ <strong><?= Helper\escape($subtask['time_spent']).'h' ?></strong> <?= t('spent') ?>
+ <?php endif ?>
+
+ <?php if (! empty($subtask['time_estimated'])): ?>
+ <strong><?= Helper\escape($subtask['time_estimated']).'h' ?></strong> <?= t('estimated') ?>
+ <?php endif ?>
+ </li>
+</ul>
+
+<?= Helper\template('notification_footer', array('task' => $task, 'application_url' => $application_url)) ?> \ No newline at end of file
diff --git a/app/Template/notification_task_assignee_change.php b/app/Template/notification_task_assignee_change.php
new file mode 100644
index 00000000..d23f769e
--- /dev/null
+++ b/app/Template/notification_task_assignee_change.php
@@ -0,0 +1,20 @@
+<h2><?= Helper\escape($task['title']) ?> (#<?= $task['id'] ?>)</h2>
+
+<ul>
+ <li>
+ <strong>
+ <?php if ($task['assignee_username']): ?>
+ <?= t('Assigned to %s', $task['assignee_name'] ?: $task['assignee_username']) ?>
+ <?php else: ?>
+ <?= t('There is nobody assigned') ?>
+ <?php endif ?>
+ </strong>
+ </li>
+</ul>
+
+<?php if (! empty($task['description'])): ?>
+ <h2><?= t('Description') ?></h2>
+ <?= Helper\markdown($task['description']) ?: t('There is no description.') ?>
+<?php endif ?>
+
+<?= Helper\template('notification_footer', array('task' => $task, 'application_url' => $application_url)) ?> \ No newline at end of file
diff --git a/app/Template/notification_task_close.php b/app/Template/notification_task_close.php
new file mode 100644
index 00000000..d56e71bb
--- /dev/null
+++ b/app/Template/notification_task_close.php
@@ -0,0 +1,5 @@
+<h2><?= Helper\escape($task['title']) ?> (#<?= $task['id'] ?>)</h2>
+
+<p><?= t('The task #%d have been closed.', $task['id']) ?></p>
+
+<?= Helper\template('notification_footer', array('task' => $task, 'application_url' => $application_url)) ?> \ No newline at end of file
diff --git a/app/Template/notification_task_creation.php b/app/Template/notification_task_creation.php
new file mode 100644
index 00000000..1b555096
--- /dev/null
+++ b/app/Template/notification_task_creation.php
@@ -0,0 +1,43 @@
+<h2><?= Helper\escape($task['title']) ?> (#<?= $task['id'] ?>)</h2>
+
+<ul>
+ <li>
+ <?= dt('Created on %B %e, %Y at %k:%M %p', $task['date_creation']) ?>
+ </li>
+ <?php if ($task['date_due']): ?>
+ <li>
+ <strong><?= dt('Must be done before %B %e, %Y', $task['date_due']) ?></strong>
+ </li>
+ <?php endif ?>
+ <?php if ($task['creator_username']): ?>
+ <li>
+ <?= t('Created by %s', $task['creator_name'] ?: $task['creator_username']) ?>
+ </li>
+ <?php endif ?>
+ <li>
+ <strong>
+ <?php if ($task['assignee_username']): ?>
+ <?= t('Assigned to %s', $task['assignee_name'] ?: $task['assignee_username']) ?>
+ <?php else: ?>
+ <?= t('There is nobody assigned') ?>
+ <?php endif ?>
+ </strong>
+ </li>
+ <li>
+ <?= t('Column on the board:') ?>
+ <strong><?= Helper\escape($task['column_title']) ?></strong>
+ </li>
+ <li><?= t('Task position:').' '.Helper\escape($task['position']) ?></li>
+ <?php if ($task['category_name']): ?>
+ <li>
+ <?= t('Category:') ?> <strong><?= Helper\escape($task['category_name']) ?></strong>
+ </li>
+ <?php endif ?>
+</ul>
+
+<?php if (! empty($task['description'])): ?>
+ <h2><?= t('Description') ?></h2>
+ <?= Helper\markdown($task['description']) ?>
+<?php endif ?>
+
+<?= Helper\template('notification_footer', array('task' => $task, 'application_url' => $application_url)) ?> \ No newline at end of file
diff --git a/app/Template/notification_task_due.php b/app/Template/notification_task_due.php
new file mode 100644
index 00000000..a32a9efc
--- /dev/null
+++ b/app/Template/notification_task_due.php
@@ -0,0 +1,20 @@
+<h2><?= t('List of due tasks for the project "%s"', $project) ?></h2>
+
+<ul>
+ <?php foreach ($tasks as $task): ?>
+ <li>
+ (<strong>#<?= $task['id'] ?></strong>)
+ <?php if ($application_url): ?>
+ <a href="<?= $application_url.'?controller=task&action=show&task_id='.$task['id'] ?>"><?= Helper\escape($task['title']) ?></a>
+ <?php else: ?>
+ <?= Helper\escape($task['title']) ?>
+ <?php endif ?>
+ (<?= dt('%B %e, %Y', $task['date_due']) ?>)
+ <?php if ($task['assignee_username']): ?>
+ (<strong><?= t('Assigned to %s', $task['assignee_name'] ?: $task['assignee_username']) ?></strong>)
+ <?php endif ?>
+ </li>
+ <?php endforeach ?>
+</ul>
+
+<?= Helper\template('notification_footer', array('task' => $task)) ?>
diff --git a/app/Template/notification_task_move_column.php b/app/Template/notification_task_move_column.php
new file mode 100644
index 00000000..c3f94df7
--- /dev/null
+++ b/app/Template/notification_task_move_column.php
@@ -0,0 +1,11 @@
+<h2><?= Helper\escape($task['title']) ?> (#<?= $task['id'] ?>)</h2>
+
+<ul>
+ <li>
+ <?= t('Column on the board:') ?>
+ <strong><?= Helper\escape($task['column_title']) ?></strong>
+ </li>
+ <li><?= t('Task position:').' '.Helper\escape($task['position']) ?></li>
+</ul>
+
+<?= Helper\template('notification_footer', array('task' => $task, 'application_url' => $application_url)) ?> \ No newline at end of file
diff --git a/app/Template/notification_task_move_position.php b/app/Template/notification_task_move_position.php
new file mode 100644
index 00000000..c3f94df7
--- /dev/null
+++ b/app/Template/notification_task_move_position.php
@@ -0,0 +1,11 @@
+<h2><?= Helper\escape($task['title']) ?> (#<?= $task['id'] ?>)</h2>
+
+<ul>
+ <li>
+ <?= t('Column on the board:') ?>
+ <strong><?= Helper\escape($task['column_title']) ?></strong>
+ </li>
+ <li><?= t('Task position:').' '.Helper\escape($task['position']) ?></li>
+</ul>
+
+<?= Helper\template('notification_footer', array('task' => $task, 'application_url' => $application_url)) ?> \ No newline at end of file
diff --git a/app/Template/notification_task_open.php b/app/Template/notification_task_open.php
new file mode 100644
index 00000000..5d9f7d5b
--- /dev/null
+++ b/app/Template/notification_task_open.php
@@ -0,0 +1,5 @@
+<h2><?= Helper\escape($task['title']) ?> (#<?= $task['id'] ?>)</h2>
+
+<p><?= t('The task #%d have been opened.', $task['id']) ?></p>
+
+<?= Helper\template('notification_footer', array('task' => $task, 'application_url' => $application_url)) ?> \ No newline at end of file
diff --git a/app/Template/notification_task_update.php b/app/Template/notification_task_update.php
new file mode 100644
index 00000000..b3c07911
--- /dev/null
+++ b/app/Template/notification_task_update.php
@@ -0,0 +1,43 @@
+<h2><?= Helper\escape($task['title']) ?> (#<?= $task['id'] ?>)</h2>
+
+<ul>
+ <li>
+ <?= dt('Created on %B %e, %Y at %k:%M %p', $task['date_creation']) ?>
+ </li>
+ <?php if ($task['date_due']): ?>
+ <li>
+ <strong><?= dt('Must be done before %B %e, %Y', $task['date_due']) ?></strong>
+ </li>
+ <?php endif ?>
+ <?php if ($task['creator_username']): ?>
+ <li>
+ <?= t('Created by %s', $task['creator_name'] ?: $task['creator_username']) ?>
+ </li>
+ <?php endif ?>
+ <li>
+ <strong>
+ <?php if ($task['assignee_username']): ?>
+ <?= t('Assigned to %s', $task['assignee_name'] ?: $task['assignee_username']) ?>
+ <?php else: ?>
+ <?= t('There is nobody assigned') ?>
+ <?php endif ?>
+ </strong>
+ </li>
+ <li>
+ <?= t('Column on the board:') ?>
+ <strong><?= Helper\escape($task['column_title']) ?></strong>
+ </li>
+ <li><?= t('Task position:').' '.Helper\escape($task['position']) ?></li>
+ <?php if ($task['category_name']): ?>
+ <li>
+ <?= t('Category:') ?> <strong><?= Helper\escape($task['category_name']) ?></strong>
+ </li>
+ <?php endif ?>
+</ul>
+
+<?php if (! empty($task['description'])): ?>
+ <h2><?= t('Description') ?></h2>
+ <?= Helper\markdown($task['description']) ?: t('There is no description.') ?>
+<?php endif ?>
+
+<?= Helper\template('notification_footer', array('task' => $task, 'application_url' => $application_url)) ?> \ No newline at end of file
diff --git a/app/Template/project_activity.php b/app/Template/project_activity.php
new file mode 100644
index 00000000..d07ba86a
--- /dev/null
+++ b/app/Template/project_activity.php
@@ -0,0 +1,18 @@
+<section id="main">
+ <div class="page-header">
+ <h2><?= t('%s\'s activity', $project['name']) ?></h2>
+ <ul>
+ <li><?= Helper\a(t('Back to the board'), 'board', 'show', array('project_id' => $project['id'])) ?></li>
+ <li><?= Helper\a(t('Search'), 'project', 'search', array('project_id' => $project['id'])) ?></li>
+ <li><?= Helper\a(t('Completed tasks'), 'project', 'tasks', array('project_id' => $project['id'])) ?></li>
+ <li><?= Helper\a(t('List of projects'), 'project', 'index') ?></li>
+ </ul>
+ </div>
+ <section>
+ <?php if ($project['is_public']): ?>
+ <p class="pull-right"><i class="fa fa-rss-square"></i> <?= Helper\a(t('RSS feed'), 'project', 'feed', array('token' => $project['token'])) ?></p>
+ <?php endif ?>
+
+ <?= Helper\template('project_events', array('events' => $events)) ?>
+ </section>
+</section> \ No newline at end of file
diff --git a/app/Template/project_disable.php b/app/Template/project_disable.php
new file mode 100644
index 00000000..7a729fa3
--- /dev/null
+++ b/app/Template/project_disable.php
@@ -0,0 +1,14 @@
+<div class="page-header">
+ <h2><?= t('Project activation') ?></h2>
+</div>
+
+<div class="confirm">
+ <p class="alert alert-info">
+ <?= t('Do you really want to disable this project: "%s"?', $project['name']) ?>
+ </p>
+
+ <div class="form-actions">
+ <?= Helper\a(t('Yes'), 'project', 'disable', array('project_id' => $project['id'], 'disable' => 'yes'), true, 'btn btn-red') ?>
+ <?= t('or') ?> <?= Helper\a(t('cancel'), 'project', 'show', array('project_id' => $project['id'])) ?>
+ </div>
+</div> \ No newline at end of file
diff --git a/app/Template/project_duplicate.php b/app/Template/project_duplicate.php
new file mode 100644
index 00000000..a926dcd1
--- /dev/null
+++ b/app/Template/project_duplicate.php
@@ -0,0 +1,14 @@
+<div class="page-header">
+ <h2><?= t('Clone this project') ?></h2>
+</div>
+
+<div class="confirm">
+ <p class="alert alert-info">
+ <?= t('Do you really want to duplicate this project: "%s"?', $project['name']) ?>
+ </p>
+
+ <div class="form-actions">
+ <?= Helper\a(t('Yes'), 'project', 'duplicate', array('project_id' => $project['id'], 'duplicate' => 'yes'), true, 'btn btn-red') ?>
+ <?= t('or') ?> <?= Helper\a(t('cancel'), 'project', 'show', array('project_id' => $project['id'])) ?>
+ </div>
+</div> \ No newline at end of file
diff --git a/app/Template/project_edit.php b/app/Template/project_edit.php
new file mode 100644
index 00000000..8eb2110d
--- /dev/null
+++ b/app/Template/project_edit.php
@@ -0,0 +1,15 @@
+<div class="page-header">
+ <h2><?= t('Edit project') ?></h2>
+</div>
+<form method="post" action="<?= Helper\u('project', 'update', array('project_id' => $values['id'])) ?>" autocomplete="off">
+
+ <?= Helper\form_csrf() ?>
+ <?= Helper\form_hidden('id', $values) ?>
+
+ <?= Helper\form_label(t('Name'), 'name') ?>
+ <?= Helper\form_text('name', $values, $errors, array('required')) ?>
+
+ <div class="form-actions">
+ <input type="submit" value="<?= t('Save') ?>" class="btn btn-blue"/>
+ </div>
+</form> \ No newline at end of file
diff --git a/app/Template/project_enable.php b/app/Template/project_enable.php
new file mode 100644
index 00000000..f2a1b0e7
--- /dev/null
+++ b/app/Template/project_enable.php
@@ -0,0 +1,14 @@
+<div class="page-header">
+ <h2><?= t('Project activation') ?></h2>
+</div>
+
+<div class="confirm">
+ <p class="alert alert-info">
+ <?= t('Do you really want to enable this project: "%s"?', $project['name']) ?>
+ </p>
+
+ <div class="form-actions">
+ <?= Helper\a(t('Yes'), 'project', 'enable', array('project_id' => $project['id'], 'enable' => 'yes'), true, 'btn btn-red') ?>
+ <?= t('or') ?> <?= Helper\a(t('cancel'), 'project', 'show', array('project_id' => $project['id'])) ?>
+ </div>
+</div> \ No newline at end of file
diff --git a/app/Template/project_events.php b/app/Template/project_events.php
new file mode 100644
index 00000000..1b606414
--- /dev/null
+++ b/app/Template/project_events.php
@@ -0,0 +1,21 @@
+<?php if (empty($events)): ?>
+ <p class="alert"><?= t('No activity.') ?></p>
+<?php else: ?>
+
+ <?php foreach ($events as $event): ?>
+ <div class="activity-event">
+ <p class="activity-datetime">
+ <?php if (Helper\contains($event['event_name'], 'subtask')): ?>
+ <i class="fa fa-tasks"></i>
+ <?php elseif (Helper\contains($event['event_name'], 'task')): ?>
+ <i class="fa fa-newspaper-o"></i>
+ <?php elseif (Helper\contains($event['event_name'], 'comment')): ?>
+ <i class="fa fa-comments-o"></i>
+ <?php endif ?>
+ &nbsp;<?= dt('%B %e, %Y at %k:%M %p', $event['date_creation']) ?>
+ </p>
+ <div class="activity-content"><?= $event['event_content'] ?></div>
+ </div>
+ <?php endforeach ?>
+
+<?php endif ?> \ No newline at end of file
diff --git a/app/Template/project_export.php b/app/Template/project_export.php
new file mode 100644
index 00000000..02eb389f
--- /dev/null
+++ b/app/Template/project_export.php
@@ -0,0 +1,24 @@
+<div class="page-header">
+ <h2>
+ <?= t('Tasks exportation for "%s"', $project['name']) ?>
+ </h2>
+</div>
+
+<form method="get" action="?" autocomplete="off">
+
+ <?= Helper\form_hidden('controller', $values) ?>
+ <?= Helper\form_hidden('action', $values) ?>
+ <?= Helper\form_hidden('project_id', $values) ?>
+
+ <?= Helper\form_label(t('Start Date'), 'from') ?>
+ <?= Helper\form_text('from', $values, $errors, array('required', 'placeholder="'.Helper\in_list($date_format, $date_formats).'"'), 'form-date') ?><br/>
+
+ <?= Helper\form_label(t('End Date'), 'to') ?>
+ <?= Helper\form_text('to', $values, $errors, array('required', 'placeholder="'.Helper\in_list($date_format, $date_formats).'"'), 'form-date') ?>
+
+ <div class="form-help"><?= t('Others formats accepted: %s and %s', date('Y-m-d'), date('Y_m_d')) ?></div>
+
+ <div class="form-actions">
+ <input type="submit" value="<?= t('Execute') ?>" class="btn btn-blue"/>
+ </div>
+</form> \ No newline at end of file
diff --git a/app/Template/project_feed.php b/app/Template/project_feed.php
new file mode 100644
index 00000000..9d10ecb1
--- /dev/null
+++ b/app/Template/project_feed.php
@@ -0,0 +1,27 @@
+<?= '<?xml version="1.0" encoding="utf-8"?>' ?>
+<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom">
+ <title><?= t('%s\'s activity', $project['name']) ?></title>
+ <link rel="alternate" type="text/html" href="<?= Helper\get_current_base_url() ?>"/>
+ <link rel="self" type="application/atom+xml" href="<?= Helper\get_current_base_url().Helper\u('project', 'feed', array('token' => $project['token'])) ?>"/>
+ <updated><?= date(DATE_ATOM) ?></updated>
+ <id><?= Helper\get_current_base_url() ?></id>
+ <icon><?= Helper\get_current_base_url() ?>assets/img/favicon.png</icon>
+
+ <?php foreach ($events as $e): ?>
+ <entry>
+ <title type="text"><?= $e['event_title'] ?></title>
+ <link rel="alternate" href="<?= Helper\get_current_base_url().Helper\u('task', 'show', array('task_id' => $e['task_id'])) ?>"/>
+ <id><?= $e['id'].'-'.$e['event_name'].'-'.$e['task_id'].'-'.$e['date_creation'] ?></id>
+ <published><?= date(DATE_ATOM, $e['date_creation']) ?></published>
+ <updated><?= date(DATE_ATOM, $e['date_creation']) ?></updated>
+ <author>
+ <name><?= Helper\escape($e['author']) ?></name>
+ </author>
+ <content type="html">
+ <![CDATA[
+ <?= $e['event_content'] ?>
+ ]]>
+ </content>
+ </entry>
+ <?php endforeach ?>
+</feed> \ No newline at end of file
diff --git a/app/Template/project_index.php b/app/Template/project_index.php
new file mode 100644
index 00000000..b575e958
--- /dev/null
+++ b/app/Template/project_index.php
@@ -0,0 +1,49 @@
+<section id="main">
+ <div class="page-header">
+ <h2><?= t('Projects') ?><span id="page-counter"> (<?= $nb_projects ?>)</span></h2>
+ <ul>
+ <?php if (Helper\is_admin()): ?>
+ <li><?= Helper\a(t('New project'), 'project', 'create') ?></li>
+ <?php endif ?>
+ <li><?= Helper\a(t('New private project'), 'project', 'create', array('private' => 1)) ?></li>
+ </ul>
+ </div>
+ <section>
+ <?php if (empty($active_projects) && empty($inactive_projects)): ?>
+ <p class="alert"><?= t('No project') ?></p>
+ <?php else: ?>
+
+ <?php if (! empty($active_projects)): ?>
+ <h3><?= t('Active projects') ?></h3>
+ <ul class="project-listing">
+ <?php foreach ($active_projects as $project): ?>
+ <li>
+ <?php if ($project['is_public']): ?>
+ <i class="fa fa-share-alt fa-fw"></i>
+ <?php endif ?>
+ <?php if ($project['is_private']): ?>
+ <i class="fa fa-lock fa-fw"></i>
+ <?php endif ?>
+ <?= Helper\a(Helper\escape($project['name']), 'project', 'show', array('project_id' => $project['id'])) ?>
+ </li>
+ <?php endforeach ?>
+ </ul>
+ <?php endif ?>
+
+ <?php if (! empty($inactive_projects)): ?>
+ <h3><?= t('Inactive projects') ?></h3>
+ <ul class="project-listing">
+ <?php foreach ($inactive_projects as $project): ?>
+ <li>
+ <?php if ($project['is_private']): ?>
+ <i class="fa fa-lock"></i>
+ <?php endif ?>
+ <?= Helper\a(Helper\escape($project['name']), 'project', 'show', array('project_id' => $project['id'])) ?>
+ </li>
+ <?php endforeach ?>
+ </ul>
+ <?php endif ?>
+
+ <?php endif ?>
+ </section>
+</section> \ No newline at end of file
diff --git a/app/Template/project_layout.php b/app/Template/project_layout.php
new file mode 100644
index 00000000..d69bbd53
--- /dev/null
+++ b/app/Template/project_layout.php
@@ -0,0 +1,17 @@
+<section id="main">
+ <div class="page-header">
+ <h2><?= t('Project "%s"', $project['name']) ?> (#<?= $project['id'] ?>)</h2>
+ <ul>
+ <li><?= Helper\a(t('Back to the board'), 'board', 'show', array('project_id' => $project['id'])) ?></li>
+ <li><?= Helper\a(t('All projects'), 'project', 'index') ?></li>
+ </ul>
+ </div>
+ <section class="project-show" id="project-section">
+
+ <?= Helper\template('project_sidebar', array('project' => $project)) ?>
+
+ <div class="project-show-main">
+ <?= $project_content_for_layout ?>
+ </div>
+ </section>
+</section> \ No newline at end of file
diff --git a/app/Template/project_new.php b/app/Template/project_new.php
new file mode 100644
index 00000000..e1ea5af7
--- /dev/null
+++ b/app/Template/project_new.php
@@ -0,0 +1,22 @@
+<section id="main">
+ <div class="page-header">
+ <h2><?= empty($values['is_private']) ? t('New project') : t('New private project') ?></h2>
+ <ul>
+ <li><?= Helper\a(t('All projects'), 'project', 'index') ?></li>
+ </ul>
+ </div>
+ <section>
+ <form method="post" action="<?= Helper\u('project', 'save') ?>" autocomplete="off">
+
+ <?= Helper\form_csrf() ?>
+ <?= Helper\form_hidden('is_private', $values) ?>
+ <?= Helper\form_label(t('Name'), 'name') ?>
+ <?= Helper\form_text('name', $values, $errors, array('autofocus', 'required')) ?>
+
+ <div class="form-actions">
+ <input type="submit" value="<?= t('Save') ?>" class="btn btn-blue"/>
+ <?= t('or') ?> <?= Helper\a(t('cancel'), 'project', 'index') ?>
+ </div>
+ </form>
+ </section>
+</section> \ No newline at end of file
diff --git a/app/Template/project_remove.php b/app/Template/project_remove.php
new file mode 100644
index 00000000..a98f94eb
--- /dev/null
+++ b/app/Template/project_remove.php
@@ -0,0 +1,14 @@
+<div class="page-header">
+ <h2><?= t('Remove project') ?></h2>
+</div>
+
+<div class="confirm">
+ <p class="alert alert-info">
+ <?= t('Do you really want to remove this project: "%s"?', $project['name']) ?>
+ </p>
+
+ <div class="form-actions">
+ <?= Helper\a(t('Yes'), 'project', 'remove', array('project_id' => $project['id'], 'remove' => 'yes'), true, 'btn btn-red') ?>
+ <?= t('or') ?> <?= Helper\a(t('cancel'), 'project', 'show', array('project_id' => $project['id'])) ?>
+ </div>
+</div> \ No newline at end of file
diff --git a/app/Template/project_search.php b/app/Template/project_search.php
new file mode 100644
index 00000000..7d5d8795
--- /dev/null
+++ b/app/Template/project_search.php
@@ -0,0 +1,37 @@
+<section id="main">
+ <div class="page-header">
+ <h2>
+ <?= t('Search in the project "%s"', $project['name']) ?>
+ <?php if (! empty($nb_tasks)): ?>
+ <span id="page-counter"> (<?= $nb_tasks ?>)</span>
+ <?php endif ?>
+ </h2>
+ <ul>
+ <li><?= Helper\a(t('Back to the board'), 'board', 'show', array('project_id' => $project['id'])) ?></li>
+ <li><?= Helper\a(t('Completed tasks'), 'project', 'tasks', array('project_id' => $project['id'])) ?></li>
+ <li><?= Helper\a(t('Activity'), 'project', 'activity', array('project_id' => $project['id'])) ?></li>
+ <li><?= Helper\a(t('List of projects'), 'project', 'index') ?></li>
+ </ul>
+ </div>
+ <section>
+ <form method="get" action="?" autocomplete="off">
+ <?= Helper\form_hidden('controller', $values) ?>
+ <?= Helper\form_hidden('action', $values) ?>
+ <?= Helper\form_hidden('project_id', $values) ?>
+ <?= Helper\form_text('search', $values, array(), array('autofocus', 'required', 'placeholder="'.t('Search').'"')) ?>
+ <input type="submit" value="<?= t('Search') ?>" class="btn btn-blue"/>
+ </form>
+
+ <?php if (empty($tasks) && ! empty($values['search'])): ?>
+ <p class="alert"><?= t('Nothing found.') ?></p>
+ <?php elseif (! empty($tasks)): ?>
+ <?= Helper\template('task_table', array(
+ 'tasks' => $tasks,
+ 'categories' => $categories,
+ 'columns' => $columns,
+ 'pagination' => $pagination,
+ )) ?>
+ <?php endif ?>
+
+ </section>
+</section> \ No newline at end of file
diff --git a/app/Template/project_share.php b/app/Template/project_share.php
new file mode 100644
index 00000000..8edcbbc0
--- /dev/null
+++ b/app/Template/project_share.php
@@ -0,0 +1,19 @@
+<div class="page-header">
+ <h2><?= t('Public access') ?></h2>
+</div>
+
+<?php if ($project['is_public']): ?>
+
+ <div class="listing">
+ <ul class="no-bullet">
+ <li><strong><i class="fa fa-share-alt"></i> <?= Helper\a(t('Public link'), 'board', 'readonly', array('token' => $project['token'])) ?></strong></li>
+ <li><strong><i class="fa fa-rss-square"></i> <?= Helper\a(t('RSS feed'), 'project', 'feed', array('token' => $project['token'])) ?></strong></li>
+ </ul>
+ <input type="text" readonly="readonly" value="<?= Helper\get_current_base_url().Helper\u('board', 'readonly', array('token' => $project['token'])) ?>"/>
+ </div>
+
+ <?= Helper\a(t('Disable public access'), 'project', 'share', array('project_id' => $project['id'], 'switch' => 'disable'), true, 'btn btn-red') ?>
+
+<?php else: ?>
+ <?= Helper\a(t('Enable public access'), 'project', 'share', array('project_id' => $project['id'], 'switch' => 'enable'), true, 'btn btn-blue') ?>
+<?php endif ?>
diff --git a/app/Template/project_show.php b/app/Template/project_show.php
new file mode 100644
index 00000000..facdc60a
--- /dev/null
+++ b/app/Template/project_show.php
@@ -0,0 +1,55 @@
+<div class="page-header">
+ <h2><?= t('Summary') ?></h2>
+</div>
+<ul class="listing">
+ <li><strong><?= $project['is_active'] ? t('Active') : t('Inactive') ?></strong></li>
+
+ <?php if ($project['is_private']): ?>
+ <li><i class="fa fa-lock"></i> <?= t('This project is private') ?></li>
+ <?php endif ?>
+
+ <?php if ($project['is_public']): ?>
+ <li><i class="fa fa-share-alt"></i> <?= Helper\a(t('Public link'), 'board', 'readonly', array('token' => $project['token'])) ?></li>
+ <li><i class="fa fa-rss-square"></i> <?= Helper\a(t('RSS feed'), 'project', 'feed', array('token' => $project['token'])) ?></li>
+ <?php else: ?>
+ <li><?= t('Public access disabled') ?></li>
+ <?php endif ?>
+
+ <?php if ($project['last_modified']): ?>
+ <li><?= dt('Last modified on %B %e, %Y at %k:%M %p', $project['last_modified']) ?></li>
+ <?php endif ?>
+
+ <?php if ($stats['nb_tasks'] > 0): ?>
+
+ <?php if ($stats['nb_active_tasks'] > 0): ?>
+ <li><?= Helper\a(t('%d tasks on the board', $stats['nb_active_tasks']), 'board', 'show', array('project_id' => $project['id'])) ?></li>
+ <?php endif ?>
+
+ <?php if ($stats['nb_inactive_tasks'] > 0): ?>
+ <li><?= Helper\a(t('%d closed tasks', $stats['nb_inactive_tasks']), 'project', 'tasks', array('project_id' => $project['id'])) ?></li>
+ <?php endif ?>
+
+ <li><?= t('%d tasks in total', $stats['nb_tasks']) ?></li>
+
+ <?php else: ?>
+ <li><?= t('No task for this project') ?></li>
+ <?php endif ?>
+</ul>
+
+<div class="page-header">
+ <h2><?= t('Board') ?></h2>
+</div>
+<table class="table-stripped">
+ <tr>
+ <th width="50%"><?= t('Column') ?></th>
+ <th><?= t('Task limit') ?></th>
+ <th><?= t('Active tasks') ?></th>
+ </tr>
+ <?php foreach ($stats['columns'] as $column): ?>
+ <tr>
+ <td><?= Helper\escape($column['title']) ?></td>
+ <td><?= $column['task_limit'] ?: '∞' ?></td>
+ <td><?= $column['nb_active_tasks'] ?></td>
+ </tr>
+ <?php endforeach ?>
+</table>
diff --git a/app/Template/project_sidebar.php b/app/Template/project_sidebar.php
new file mode 100644
index 00000000..7bad1f0e
--- /dev/null
+++ b/app/Template/project_sidebar.php
@@ -0,0 +1,49 @@
+<div class="project-show-sidebar">
+ <h2><?= t('Actions') ?></h2>
+ <div class="project-show-actions">
+ <ul>
+ <li>
+ <a href="?controller=project&amp;action=show&amp;project_id=<?= $project['id'] ?>"><?= t('Summary') ?></a>
+ </li>
+
+ <?php if (Helper\is_admin() || $project['is_private']): ?>
+ <li>
+ <a href="?controller=project&amp;action=export&amp;project_id=<?= $project['id'] ?>"><?= t('Tasks Export') ?></a>
+ </li>
+ <li>
+ <a href="?controller=project&amp;action=share&amp;project_id=<?= $project['id'] ?>"><?= t('Public access') ?></a>
+ </li>
+ <li>
+ <a href="?controller=project&amp;action=edit&amp;project_id=<?= $project['id'] ?>"><?= t('Edit project') ?></a>
+ </li>
+ <li>
+ <a href="?controller=board&amp;action=edit&amp;project_id=<?= $project['id'] ?>"><?= t('Edit board') ?></a>
+ </li>
+ <li>
+ <a href="?controller=category&amp;action=index&amp;project_id=<?= $project['id'] ?>"><?= t('Category management') ?></a>
+ </li>
+ <?php if (Helper\is_admin()): ?>
+ <li>
+ <a href="?controller=project&amp;action=users&amp;project_id=<?= $project['id'] ?>"><?= t('User management') ?></a>
+ </li>
+ <?php endif ?>
+ <li>
+ <a href="?controller=action&amp;action=index&amp;project_id=<?= $project['id'] ?>"><?= t('Automatic actions') ?></a>
+ </li>
+ <li>
+ <a href="?controller=project&amp;action=duplicate&amp;project_id=<?= $project['id'].Helper\param_csrf() ?>"><?= t('Duplicate') ?></a>
+ </li>
+ <li>
+ <?php if ($project['is_active']): ?>
+ <a href="?controller=project&amp;action=disable&amp;project_id=<?= $project['id'].Helper\param_csrf() ?>"><?= t('Disable') ?></a>
+ <?php else: ?>
+ <a href="?controller=project&amp;action=enable&amp;project_id=<?= $project['id'].Helper\param_csrf() ?>"><?= t('Enable') ?></a>
+ <?php endif ?>
+ </li>
+ <li>
+ <a href="?controller=project&amp;action=remove&amp;project_id=<?= $project['id'] ?>"><?= t('Remove') ?></a>
+ </li>
+ <?php endif ?>
+ </ul>
+ </div>
+</div> \ No newline at end of file
diff --git a/app/Template/project_tasks.php b/app/Template/project_tasks.php
new file mode 100644
index 00000000..7b6f2d9c
--- /dev/null
+++ b/app/Template/project_tasks.php
@@ -0,0 +1,23 @@
+<section id="main">
+ <div class="page-header">
+ <h2><?= t('Completed tasks for "%s"', $project['name']) ?><span id="page-counter"> (<?= $nb_tasks ?>)</span></h2>
+ <ul>
+ <li><a href="?controller=board&amp;action=show&amp;project_id=<?= $project['id'] ?>"><?= t('Back to the board') ?></a></li>
+ <li><a href="?controller=project&amp;action=search&amp;project_id=<?= $project['id'] ?>"><?= t('Search') ?></a></li>
+ <li><a href="?controller=project&amp;action=activity&amp;project_id=<?= $project['id'] ?>"><?= t('Activity') ?></a></li>
+ <li><a href="?controller=project&amp;action=index"><?= t('List of projects') ?></a></li>
+ </ul>
+ </div>
+ <section>
+ <?php if (empty($tasks)): ?>
+ <p class="alert"><?= t('No task') ?></p>
+ <?php else: ?>
+ <?= Helper\template('task_table', array(
+ 'tasks' => $tasks,
+ 'categories' => $categories,
+ 'columns' => $columns,
+ 'pagination' => $pagination,
+ )) ?>
+ <?php endif ?>
+ </section>
+</section> \ No newline at end of file
diff --git a/app/Template/project_users.php b/app/Template/project_users.php
new file mode 100644
index 00000000..35079df6
--- /dev/null
+++ b/app/Template/project_users.php
@@ -0,0 +1,57 @@
+<div class="page-header">
+ <h2><?= t('List of authorized users') ?></h2>
+</div>
+
+<?php if ($project['is_everybody_allowed']): ?>
+ <div class="alert alert-info"><?= t('Everybody have access to this project.') ?></div>
+<?php else: ?>
+
+ <?php if (empty($users['allowed'])): ?>
+ <div class="alert alert-error"><?= t('Nobody have access to this project.') ?></div>
+ <?php else: ?>
+ <div class="listing">
+ <p><?= t('Only those users have access to this project:') ?></p>
+ <ul>
+ <?php foreach ($users['allowed'] as $user_id => $username): ?>
+ <li>
+ <strong><?= Helper\escape($username) ?></strong>
+ <?php if ($project['is_private'] == 0): ?>
+ (<?= Helper\a(t('revoke'), 'project', 'revoke', array('project_id' => $project['id'], 'user_id' => $user_id), true) ?>)
+ <?php endif ?>
+ </li>
+ <?php endforeach ?>
+ </ul>
+ <p><?= t('Don\'t forget that administrators have access to everything.') ?></p>
+ </div>
+ <?php endif ?>
+
+ <?php if ($project['is_private'] == 0 && ! empty($users['not_allowed'])): ?>
+ <form method="post" action="<?= Helper\u('project', 'allow', array('project_id' => $project['id'])) ?>" autocomplete="off">
+
+ <?= Helper\form_csrf() ?>
+
+ <?= Helper\form_hidden('project_id', array('project_id' => $project['id'])) ?>
+
+ <?= Helper\form_label(t('User'), 'user_id') ?>
+ <?= Helper\form_select('user_id', $users['not_allowed']) ?><br/>
+
+ <div class="form-actions">
+ <input type="submit" value="<?= t('Allow this user') ?>" class="btn btn-blue"/>
+ </div>
+ </form>
+ <?php endif ?>
+
+<?php endif ?>
+
+<?php if ($project['is_private'] == 0): ?>
+<form method="post" action="<?= Helper\u('project', 'allowEverybody', array('project_id' => $project['id'])) ?>">
+ <?= Helper\form_csrf() ?>
+
+ <?= Helper\form_hidden('id', array('id' => $project['id'])) ?>
+ <?= Helper\form_checkbox('is_everybody_allowed', t('Allow everybody to access to this project'), 1, $project['is_everybody_allowed']) ?>
+
+ <div class="form-actions">
+ <input type="submit" value="<?= t('Save') ?>" class="btn btn-blue"/>
+ </div>
+</form>
+<?php endif ?>
diff --git a/app/Template/subtask_create.php b/app/Template/subtask_create.php
new file mode 100644
index 00000000..c8ee556b
--- /dev/null
+++ b/app/Template/subtask_create.php
@@ -0,0 +1,27 @@
+<div class="page-header">
+ <h2><?= t('Add a sub-task') ?></h2>
+</div>
+
+<form method="post" action="?controller=subtask&amp;action=save&amp;task_id=<?= $task['id'] ?>" autocomplete="off">
+
+ <?= Helper\form_csrf() ?>
+
+ <?= Helper\form_hidden('task_id', $values) ?>
+
+ <?= Helper\form_label(t('Title'), 'title') ?>
+ <?= Helper\form_text('title', $values, $errors, array('required autofocus')) ?><br/>
+
+ <?= Helper\form_label(t('Assignee'), 'user_id') ?>
+ <?= Helper\form_select('user_id', $users_list, $values, $errors) ?><br/>
+
+ <?= Helper\form_label(t('Original estimate'), 'time_estimated') ?>
+ <?= Helper\form_numeric('time_estimated', $values, $errors) ?> <?= t('hours') ?><br/>
+
+ <?= Helper\form_checkbox('another_subtask', t('Create another sub-task'), 1, isset($values['another_subtask']) && $values['another_subtask'] == 1) ?>
+
+ <div class="form-actions">
+ <input type="submit" value="<?= t('Save') ?>" class="btn btn-blue"/>
+ <?= t('or') ?>
+ <a href="?controller=task&amp;action=show&amp;task_id=<?= $task['id'] ?>"><?= t('cancel') ?></a>
+ </div>
+</form>
diff --git a/app/Template/subtask_edit.php b/app/Template/subtask_edit.php
new file mode 100644
index 00000000..91690d0a
--- /dev/null
+++ b/app/Template/subtask_edit.php
@@ -0,0 +1,32 @@
+<div class="page-header">
+ <h2><?= t('Edit a sub-task') ?></h2>
+</div>
+
+<form method="post" action="?controller=subtask&amp;action=update&amp;task_id=<?= $task['id'] ?>&amp;subtask_id=<?= $subtask['id'] ?>" autocomplete="off">
+
+ <?= Helper\form_csrf() ?>
+
+ <?= Helper\form_hidden('id', $values) ?>
+ <?= Helper\form_hidden('task_id', $values) ?>
+
+ <?= Helper\form_label(t('Title'), 'title') ?>
+ <?= Helper\form_text('title', $values, $errors, array('required autofocus')) ?><br/>
+
+ <?= Helper\form_label(t('Status'), 'status') ?>
+ <?= Helper\form_select('status', $status_list, $values, $errors) ?><br/>
+
+ <?= Helper\form_label(t('Assignee'), 'user_id') ?>
+ <?= Helper\form_select('user_id', $users_list, $values, $errors) ?><br/>
+
+ <?= Helper\form_label(t('Original estimate'), 'time_estimated') ?>
+ <?= Helper\form_numeric('time_estimated', $values, $errors) ?> <?= t('hours') ?><br/>
+
+ <?= Helper\form_label(t('Time spent'), 'time_spent') ?>
+ <?= Helper\form_numeric('time_spent', $values, $errors) ?> <?= t('hours') ?><br/>
+
+ <div class="form-actions">
+ <input type="submit" value="<?= t('Save') ?>" class="btn btn-blue"/>
+ <?= t('or') ?>
+ <a href="?controller=task&amp;action=show&amp;task_id=<?= $task['id'] ?>"><?= t('cancel') ?></a>
+ </div>
+</form>
diff --git a/app/Template/subtask_remove.php b/app/Template/subtask_remove.php
new file mode 100644
index 00000000..12c99cf1
--- /dev/null
+++ b/app/Template/subtask_remove.php
@@ -0,0 +1,16 @@
+<div class="page-header">
+ <h2><?= t('Remove a sub-task') ?></h2>
+</div>
+
+<div class="confirm">
+ <p class="alert alert-info">
+ <?= t('Do you really want to remove this sub-task?') ?>
+ </p>
+
+ <p><strong><?= Helper\escape($subtask['title']) ?></strong></p>
+
+ <div class="form-actions">
+ <a href="?controller=subtask&amp;action=remove&amp;task_id=<?= $task['id'] ?>&amp;subtask_id=<?= $subtask['id'].Helper\param_csrf() ?>" class="btn btn-red"><?= t('Yes') ?></a>
+ <?= t('or') ?> <a href="?controller=task&amp;action=show&amp;task_id=<?= $task['id'] ?>#subtasks"><?= t('cancel') ?></a>
+ </div>
+</div> \ No newline at end of file
diff --git a/app/Template/subtask_show.php b/app/Template/subtask_show.php
new file mode 100644
index 00000000..f1b0466f
--- /dev/null
+++ b/app/Template/subtask_show.php
@@ -0,0 +1,72 @@
+<?php if (! empty($subtasks)): ?>
+<div id="subtasks" class="task-show-section">
+
+ <div class="page-header">
+ <h2><?= t('Sub-Tasks') ?></h2>
+ </div>
+
+ <table class="subtasks-table">
+ <tr>
+ <th width="40%"><?= t('Title') ?></th>
+ <th><?= t('Status') ?></th>
+ <th><?= t('Assignee') ?></th>
+ <th><?= t('Time tracking') ?></th>
+ <?php if (! isset($not_editable)): ?>
+ <th><?= t('Actions') ?></th>
+ <?php endif ?>
+ </tr>
+ <?php foreach ($subtasks as $subtask): ?>
+ <tr>
+ <td><?= Helper\escape($subtask['title']) ?></td>
+ <td>
+ <?php if (!isset($not_editable)): ?>
+ <a href="<?= Helper\u('subtask', 'toggleStatus', array('task_id' => $task['id'], 'subtask_id' => $subtask['id'])) ?>">
+ <?php endif ?>
+ <?php if ($subtask['status'] == 0): ?>
+ <i class="fa fa-square-o fa-fw"></i><i class="fa">&nbsp;<?= Helper\escape($subtask['status_name']) ?></i>
+ <?php elseif ($subtask['status'] == 1): ?>
+ <i class="fa fa-gears fa-fw"></i><i class="fa">&nbsp;<?= Helper\escape($subtask['status_name']) ?></i>
+ <?php else: ?>
+ <i class="fa fa-check-square-o fa-fw"></i><i class="fa">&nbsp;<?= Helper\escape($subtask['status_name']) ?></i>
+ <?php endif ?>
+ <?php if (! isset($not_editable)): ?>
+ </a>
+ <?php endif ?>
+ </td>
+
+ <td>
+ <?php if (! empty($subtask['username'])): ?>
+ <?= Helper\escape($subtask['name'] ?: $subtask['username']) ?>
+ <?php endif ?>
+ </td>
+ <td>
+ <?php if (! empty($subtask['time_spent'])): ?>
+ <strong><?= Helper\escape($subtask['time_spent']).'h' ?></strong> <?= t('spent') ?>
+ <?php endif ?>
+
+ <?php if (! empty($subtask['time_estimated'])): ?>
+ <strong><?= Helper\escape($subtask['time_estimated']).'h' ?></strong> <?= t('estimated') ?>
+ <?php endif ?>
+ </td>
+ <?php if (! isset($not_editable)): ?>
+ <td>
+ <?= Helper\a(t('Edit'), 'subtask', 'edit', array('task_id' => $task['id'], 'subtask_id' => $subtask['id'])) ?>
+ <?= t('or') ?>
+ <?= Helper\a(t('Remove'), 'subtask', 'confirm', array('task_id' => $task['id'], 'subtask_id' => $subtask['id'])) ?>
+ </td>
+ <?php endif ?>
+ </tr>
+ <?php endforeach ?>
+ </table>
+
+ <?php if (! isset($not_editable)): ?>
+ <form method="post" action="<?= Helper\u('subtask', 'save', array('task_id' => $task['id'])) ?>" autocomplete="off">
+ <?= Helper\form_csrf() ?>
+ <?= Helper\form_hidden('task_id', array('task_id' => $task['id'])) ?>
+ <?= Helper\form_text('title', array(), array(), array('required', 'placeholder="'.t('Type here to create a new sub-task').'"')) ?>
+ <input type="submit" value="<?= t('Add') ?>" class="btn btn-blue"/>
+ </form>
+ <?php endif ?>
+
+</div>
+<?php endif ?>
diff --git a/app/Template/task_close.php b/app/Template/task_close.php
new file mode 100644
index 00000000..2abfd032
--- /dev/null
+++ b/app/Template/task_close.php
@@ -0,0 +1,14 @@
+<div class="page-header">
+ <h2><?= t('Close a task') ?></h2>
+</div>
+
+<div class="confirm">
+ <p class="alert alert-info">
+ <?= t('Do you really want to close this task: "%s"?', Helper\escape($task['title'])) ?>
+ </p>
+
+ <div class="form-actions">
+ <a href="?controller=task&amp;action=close&amp;confirmation=yes&amp;task_id=<?= $task['id'].Helper\param_csrf() ?>" class="btn btn-red"><?= t('Yes') ?></a>
+ <?= t('or') ?> <a href="?controller=task&amp;action=show&amp;task_id=<?= $task['id'] ?>"><?= t('cancel') ?></a>
+ </div>
+</div> \ No newline at end of file
diff --git a/app/Template/task_comments.php b/app/Template/task_comments.php
new file mode 100644
index 00000000..5cfa99ce
--- /dev/null
+++ b/app/Template/task_comments.php
@@ -0,0 +1,29 @@
+<?php if (! empty($comments)): ?>
+<div id="comments" class="task-show-section">
+ <div class="page-header">
+ <h2><?= t('Comments') ?></h2>
+ </div>
+
+ <?php foreach ($comments as $comment): ?>
+ <?= Helper\template('comment_show', array(
+ 'comment' => $comment,
+ 'task' => $task,
+ 'project' => $project,
+ 'not_editable' => isset($not_editable) && $not_editable,
+ 'is_public' => isset($is_public) && $is_public,
+ )) ?>
+ <?php endforeach ?>
+
+ <?php if (! isset($not_editable)): ?>
+ <?= Helper\template('comment_create', array(
+ 'skip_cancel' => true,
+ 'values' => array(
+ 'user_id' => Helper\get_user_id(),
+ 'task_id' => $task['id'],
+ ),
+ 'errors' => array(),
+ 'task' => $task
+ )) ?>
+ <?php endif ?>
+</div>
+<?php endif ?> \ No newline at end of file
diff --git a/app/Template/task_details.php b/app/Template/task_details.php
new file mode 100644
index 00000000..a4fdf6ce
--- /dev/null
+++ b/app/Template/task_details.php
@@ -0,0 +1,83 @@
+<div class="task-<?= $task['color_id'] ?> task-show-details">
+ <h2><?= Helper\escape($task['title']) ?></h2>
+ <?php if ($task['score']): ?>
+ <span class="task-score"><?= Helper\escape($task['score']) ?></span>
+ <?php endif ?>
+ <ul>
+ <?php if ($task['reference']): ?>
+ <li>
+ <strong><?= t('Reference: %s', $task['reference']) ?></strong>
+ </li>
+ <?php endif ?>
+ <li>
+ <?= dt('Created on %B %e, %Y at %k:%M %p', $task['date_creation']) ?>
+ </li>
+ <?php if ($task['date_modification']): ?>
+ <li>
+ <?= dt('Last modified on %B %e, %Y at %k:%M %p', $task['date_modification']) ?>
+ </li>
+ <?php endif ?>
+ <?php if ($task['date_completed']): ?>
+ <li>
+ <?= dt('Completed on %B %e, %Y at %k:%M %p', $task['date_completed']) ?>
+ </li>
+ <?php endif ?>
+ <?php if ($task['date_started']): ?>
+ <li>
+ <?= dt('Started on %B %e, %Y', $task['date_started']) ?>
+ </li>
+ <?php endif ?>
+ <?php if ($task['date_due']): ?>
+ <li>
+ <strong><?= dt('Must be done before %B %e, %Y', $task['date_due']) ?></strong>
+ </li>
+ <?php endif ?>
+ <?php if ($task['time_estimated']): ?>
+ <li>
+ <?= t('Estimated time: %s hours', $task['time_estimated']) ?>
+ </li>
+ <?php endif ?>
+ <?php if ($task['time_spent']): ?>
+ <li>
+ <?= t('Time spent: %s hours', $task['time_spent']) ?>
+ </li>
+ <?php endif ?>
+ <?php if ($task['creator_username']): ?>
+ <li>
+ <?= t('Created by %s', $task['creator_name'] ?: $task['creator_username']) ?>
+ </li>
+ <?php endif ?>
+ <li>
+ <strong>
+ <?php if ($task['assignee_username']): ?>
+ <?= t('Assigned to %s', $task['assignee_name'] ?: $task['assignee_username']) ?>
+ <?php else: ?>
+ <?= t('There is nobody assigned') ?>
+ <?php endif ?>
+ </strong>
+ </li>
+ <li>
+ <?= t('Column on the board:') ?>
+ <strong><?= Helper\escape($task['column_title']) ?></strong>
+ (<?= Helper\escape($task['project_name']) ?>)
+ </li>
+ <li><?= t('Task position:').' '.Helper\escape($task['position']) ?></li>
+ <?php if ($task['category_name']): ?>
+ <li>
+ <?= t('Category:') ?> <strong><?= Helper\escape($task['category_name']) ?></strong>
+ </li>
+ <?php endif ?>
+ <li>
+ <?php if ($task['is_active'] == 1): ?>
+ <?= t('Status is open') ?>
+ <?php else: ?>
+ <?= t('Status is closed') ?>
+ <?php endif ?>
+ </li>
+ <?php if ($project['is_public']): ?>
+ <li>
+ <a href="?controller=task&amp;action=readonly&amp;task_id=<?= $task['id'] ?>&amp;token=<?= $project['token'] ?>" target="_blank"><?= t('Public link') ?></a>
+ </li>
+ <?php endif ?>
+ </ul>
+</div>
diff --git a/app/Template/task_duplicate.php b/app/Template/task_duplicate.php
new file mode 100644
index 00000000..ef903f1d
--- /dev/null
+++ b/app/Template/task_duplicate.php
@@ -0,0 +1,14 @@
+<div class="page-header">
+ <h2><?= t('Duplicate a task') ?></h2>
+</div>
+
+<div class="confirm">
+ <p class="alert alert-info">
+ <?= t('Do you really want to duplicate this task?') ?>
+ </p>
+
+ <div class="form-actions">
+ <a href="?controller=task&amp;action=duplicate&amp;confirmation=yes&amp;task_id=<?= $task['id'].Helper\param_csrf() ?>" class="btn btn-red"><?= t('Yes') ?></a>
+ <?= t('or') ?> <a href="?controller=task&amp;action=show&amp;task_id=<?= $task['id'] ?>"><?= t('cancel') ?></a>
+ </div>
+</div> \ No newline at end of file
diff --git a/app/Template/task_duplicate_project.php b/app/Template/task_duplicate_project.php
new file mode 100644
index 00000000..86d2114a
--- /dev/null
+++ b/app/Template/task_duplicate_project.php
@@ -0,0 +1,24 @@
+<div class="page-header">
+ <h2><?= t('Duplicate the task to another project') ?></h2>
+</div>
+
+<?php if (empty($projects_list)): ?>
+ <p class="alert"><?= t('No project') ?></p>
+<?php else: ?>
+
+ <form method="post" action="?controller=task&amp;action=copy&amp;task_id=<?= $task['id'] ?>&amp;project_id=<?= $task['project_id'] ?>" autocomplete="off">
+
+ <?= Helper\form_csrf() ?>
+
+ <?= Helper\form_hidden('id', $values) ?>
+ <?= Helper\form_label(t('Project'), 'project_id') ?>
+ <?= Helper\form_select('project_id', $projects_list, $values, $errors) ?><br/>
+
+ <div class="form-actions">
+ <input type="submit" value="<?= t('Save') ?>" class="btn btn-blue"/>
+ <?= t('or') ?>
+ <a href="?controller=task&amp;action=show&amp;task_id=<?= $task['id'] ?>"><?= t('cancel') ?></a>
+ </div>
+ </form>
+
+<?php endif ?> \ No newline at end of file
diff --git a/app/Template/task_edit.php b/app/Template/task_edit.php
new file mode 100644
index 00000000..73e00a31
--- /dev/null
+++ b/app/Template/task_edit.php
@@ -0,0 +1,51 @@
+<div class="page-header">
+ <h2><?= t('Edit a task') ?></h2>
+</div>
+<section id="task-section">
+<form method="post" action="?controller=task&amp;action=update&amp;task_id=<?= $task['id'] ?>&amp;ajax=<?= $ajax ?>" autocomplete="off">
+
+ <?= Helper\form_csrf() ?>
+
+ <div class="form-column">
+
+ <?= Helper\form_label(t('Title'), 'title') ?>
+ <?= Helper\form_text('title', $values, $errors, array('required')) ?><br/>
+
+ <?= Helper\form_label(t('Description'), 'description') ?>
+ <?= Helper\form_textarea('description', $values, $errors) ?><br/>
+ <div class="form-help"><a href="http://kanboard.net/documentation/syntax-guide" target="_blank" rel="noreferrer"><?= t('Write your text in Markdown') ?></a></div>
+
+ </div>
+
+ <div class="form-column">
+ <?= Helper\form_hidden('id', $values) ?>
+ <?= Helper\form_hidden('project_id', $values) ?>
+
+ <?= Helper\form_label(t('Assignee'), 'owner_id') ?>
+ <?= Helper\form_select('owner_id', $users_list, $values, $errors) ?><br/>
+
+ <?= Helper\form_label(t('Category'), 'category_id') ?>
+ <?= Helper\form_select('category_id', $categories_list, $values, $errors) ?><br/>
+
+ <?= Helper\form_label(t('Color'), 'color_id') ?>
+ <?= Helper\form_select('color_id', $colors_list, $values, $errors) ?><br/>
+
+ <?= Helper\form_label(t('Complexity'), 'score') ?>
+ <?= Helper\form_number('score', $values, $errors) ?><br/>
+
+ <?= Helper\form_label(t('Due Date'), 'date_due') ?>
+ <?= Helper\form_text('date_due', $values, $errors, array('placeholder="'.Helper\in_list($date_format, $date_formats).'"'), 'form-date') ?><br/>
+ <div class="form-help"><?= t('Others formats accepted: %s and %s', date('Y-m-d'), date('Y_m_d')) ?></div>
+ </div>
+
+ <div class="form-actions">
+ <input type="submit" value="<?= t('Save') ?>" class="btn btn-blue"/>
+ <?= t('or') ?>
+ <?php if ($ajax): ?>
+ <a href="?controller=board&amp;action=show&amp;project_id=<?= $task['project_id'] ?>"><?= t('cancel') ?></a>
+ <?php else: ?>
+ <a href="?controller=task&amp;action=show&amp;task_id=<?= $task['id'] ?>"><?= t('cancel') ?></a>
+ <?php endif ?>
+ </div>
+</form>
+</section>
diff --git a/app/Template/task_edit_description.php b/app/Template/task_edit_description.php
new file mode 100644
index 00000000..2d2a4d0b
--- /dev/null
+++ b/app/Template/task_edit_description.php
@@ -0,0 +1,22 @@
+<div class="page-header">
+ <h2><?= t('Edit the description') ?></h2>
+</div>
+
+<form method="post" action="?controller=task&amp;action=description&amp;task_id=<?= $task['id'] ?>&amp;ajax=<?= $ajax ?>" autocomplete="off">
+
+ <?= Helper\form_csrf() ?>
+
+ <?= Helper\form_hidden('id', $values) ?>
+ <?= Helper\form_textarea('description', $values, $errors, array('autofocus', 'required', 'placeholder="'.t('Leave a description').'"'), 'description-textarea') ?><br/>
+ <div class="form-help"><a href="http://kanboard.net/documentation/syntax-guide" target="_blank" rel="noreferrer"><?= t('Write your text in Markdown') ?></a></div>
+
+ <div class="form-actions">
+ <input type="submit" value="<?= t('Save') ?>" class="btn btn-blue"/>
+ <?= t('or') ?>
+ <?php if ($ajax): ?>
+ <a href="?controller=board&amp;action=show&amp;project_id=<?= $task['project_id'] ?>"><?= t('cancel') ?></a>
+ <?php else: ?>
+ <a href="?controller=task&amp;action=show&amp;task_id=<?= $task['id'] ?>"><?= t('cancel') ?></a>
+ <?php endif ?>
+ </div>
+</form>
diff --git a/app/Template/task_layout.php b/app/Template/task_layout.php
new file mode 100644
index 00000000..ca0a413f
--- /dev/null
+++ b/app/Template/task_layout.php
@@ -0,0 +1,16 @@
+<section id="main">
+ <div class="page-header">
+ <h2><?= Helper\escape($task['project_name']) ?> &gt; <?= t('Task #%d', $task['id']) ?></h2>
+ <ul>
+ <li><a href="?controller=board&amp;action=show&amp;project_id=<?= $task['project_id'] ?>"><?= t('Back to the board') ?></a></li>
+ </ul>
+ </div>
+ <section class="task-show" id="task-section">
+
+ <?= Helper\template('task_sidebar', array('task' => $task, 'hide_remove_menu' => isset($hide_remove_menu))) ?>
+
+ <div class="task-show-main">
+ <?= $task_content_for_layout ?>
+ </div>
+ </section>
+</section> \ No newline at end of file
diff --git a/app/Template/task_move_project.php b/app/Template/task_move_project.php
new file mode 100644
index 00000000..3bc3bcb8
--- /dev/null
+++ b/app/Template/task_move_project.php
@@ -0,0 +1,24 @@
+<div class="page-header">
+ <h2><?= t('Move the task to another project') ?></h2>
+</div>
+
+<?php if (empty($projects_list)): ?>
+ <p class="alert"><?= t('No project') ?></p>
+<?php else: ?>
+
+ <form method="post" action="?controller=task&amp;action=move&amp;task_id=<?= $task['id'] ?>&amp;project_id=<?= $task['project_id'] ?>" autocomplete="off">
+
+ <?= Helper\form_csrf() ?>
+
+ <?= Helper\form_hidden('id', $values) ?>
+ <?= Helper\form_label(t('Project'), 'project_id') ?>
+ <?= Helper\form_select('project_id', $projects_list, $values, $errors) ?><br/>
+
+ <div class="form-actions">
+ <input type="submit" value="<?= t('Save') ?>" class="btn btn-blue"/>
+ <?= t('or') ?>
+ <a href="?controller=task&amp;action=show&amp;task_id=<?= $task['id'] ?>"><?= t('cancel') ?></a>
+ </div>
+ </form>
+
+<?php endif ?> \ No newline at end of file
diff --git a/app/Template/task_new.php b/app/Template/task_new.php
new file mode 100644
index 00000000..51142165
--- /dev/null
+++ b/app/Template/task_new.php
@@ -0,0 +1,55 @@
+<section id="main">
+ <div class="page-header">
+ <h2><?= t('New task') ?></h2>
+ </div>
+ <section id="task-section">
+ <form method="post" action="?controller=task&amp;action=save" autocomplete="off">
+
+ <?= Helper\form_csrf() ?>
+
+ <div class="form-column">
+ <?= Helper\form_label(t('Title'), 'title') ?>
+ <?= Helper\form_text('title', $values, $errors, array('autofocus', 'required')) ?><br/>
+
+ <?= Helper\form_label(t('Description'), 'description') ?>
+ <?= Helper\form_textarea('description', $values, $errors) ?><br/>
+ <div class="form-help"><a href="http://kanboard.net/documentation/syntax-guide" target="_blank" rel="noreferrer"><?= t('Write your text in Markdown') ?></a></div>
+
+ <?php if (! isset($duplicate)): ?>
+ <?= Helper\form_checkbox('another_task', t('Create another task'), 1, isset($values['another_task']) && $values['another_task'] == 1) ?>
+ <?php endif ?>
+ </div>
+
+ <div class="form-column">
+ <?= Helper\form_hidden('project_id', $values) ?>
+
+ <?= Helper\form_label(t('Assignee'), 'owner_id') ?>
+ <?= Helper\form_select('owner_id', $users_list, $values, $errors) ?><br/>
+
+ <?= Helper\form_label(t('Category'), 'category_id') ?>
+ <?= Helper\form_select('category_id', $categories_list, $values, $errors) ?><br/>
+
+ <?= Helper\form_label(t('Column'), 'column_id') ?>
+ <?= Helper\form_select('column_id', $columns_list, $values, $errors) ?><br/>
+
+ <?= Helper\form_label(t('Color'), 'color_id') ?>
+ <?= Helper\form_select('color_id', $colors_list, $values, $errors) ?><br/>
+
+ <?= Helper\form_label(t('Complexity'), 'score') ?>
+ <?= Helper\form_number('score', $values, $errors) ?><br/>
+
+ <?= Helper\form_label(t('Original estimate'), 'time_estimated') ?>
+ <?= Helper\form_numeric('time_estimated', $values, $errors) ?> <?= t('hours') ?><br/>
+
+ <?= Helper\form_label(t('Due Date'), 'date_due') ?>
+ <?= Helper\form_text('date_due', $values, $errors, array('placeholder="'.Helper\in_list($date_format, $date_formats).'"'), 'form-date') ?><br/>
+ <div class="form-help"><?= t('Others formats accepted: %s and %s', date('Y-m-d'), date('Y_m_d')) ?></div>
+ </div>
+
+ <div class="form-actions">
+ <input type="submit" value="<?= t('Save') ?>" class="btn btn-blue"/>
+ <?= t('or') ?> <a href="?controller=board&amp;action=show&amp;project_id=<?= $values['project_id'] ?>"><?= t('cancel') ?></a>
+ </div>
+ </form>
+ </section>
+</section> \ No newline at end of file
diff --git a/app/Template/task_open.php b/app/Template/task_open.php
new file mode 100644
index 00000000..d28970e3
--- /dev/null
+++ b/app/Template/task_open.php
@@ -0,0 +1,14 @@
+<div class="page-header">
+ <h2><?= t('Open a task') ?></h2>
+</div>
+
+<div class="confirm">
+ <p class="alert alert-info">
+ <?= t('Do you really want to open this task: "%s"?', Helper\escape($task['title'])) ?>
+ </p>
+
+ <div class="form-actions">
+ <a href="?controller=task&amp;action=open&amp;confirmation=yes&amp;task_id=<?= $task['id'].Helper\param_csrf() ?>" class="btn btn-red"><?= t('Yes') ?></a>
+ <?= t('or') ?> <a href="?controller=task&amp;action=show&amp;task_id=<?= $task['id'] ?>"><?= t('cancel') ?></a>
+ </div>
+</div> \ No newline at end of file
diff --git a/app/Template/task_public.php b/app/Template/task_public.php
new file mode 100644
index 00000000..13fef1ed
--- /dev/null
+++ b/app/Template/task_public.php
@@ -0,0 +1,27 @@
+<section id="main" class="public-task">
+
+ <?= Helper\template('task_details', array('task' => $task, 'project' => $project)) ?>
+
+ <p class="pull-right"><?= Helper\a(t('Back to the board'), 'board', 'readonly', array('token' => $project['token'])) ?></p>
+
+ <?= Helper\template('task_show_description', array(
+ 'task' => $task,
+ 'project' => $project,
+ 'is_public' => true
+ )) ?>
+
+ <?= Helper\template('subtask_show', array(
+ 'task' => $task,
+ 'subtasks' => $subtasks,
+ 'not_editable' => true
+ )) ?>
+
+ <?= Helper\template('task_comments', array(
+ 'task' => $task,
+ 'comments' => $comments,
+ 'project' => $project,
+ 'not_editable' => true,
+ 'is_public' => true,
+ )) ?>
+
+</section> \ No newline at end of file
diff --git a/app/Template/task_remove.php b/app/Template/task_remove.php
new file mode 100644
index 00000000..496ac2d8
--- /dev/null
+++ b/app/Template/task_remove.php
@@ -0,0 +1,14 @@
+<div class="page-header">
+ <h2><?= t('Remove a task') ?></h2>
+</div>
+
+<div class="confirm">
+ <p class="alert alert-info">
+ <?= t('Do you really want to remove this task: "%s"?', Helper\escape($task['title'])) ?>
+ </p>
+
+ <div class="form-actions">
+ <a href="?controller=task&amp;action=remove&amp;confirmation=yes&amp;task_id=<?= $task['id'].Helper\param_csrf() ?>" class="btn btn-red"><?= t('Yes') ?></a>
+ <?= t('or') ?> <a href="?controller=task&amp;action=show&amp;task_id=<?= $task['id'] ?>"><?= t('cancel') ?></a>
+ </div>
+</div> \ No newline at end of file
diff --git a/app/Template/task_show.php b/app/Template/task_show.php
new file mode 100644
index 00000000..ec5d5da4
--- /dev/null
+++ b/app/Template/task_show.php
@@ -0,0 +1,7 @@
+<?= Helper\template('task_details', array('task' => $task, 'project' => $project)) ?>
+<?= Helper\template('task_time', array('values' => $values, 'date_format' => $date_format, 'date_formats' => $date_formats)) ?>
+<?= Helper\template('task_show_description', array('task' => $task)) ?>
+<?= Helper\template('subtask_show', array('task' => $task, 'subtasks' => $subtasks)) ?>
+<?= Helper\template('task_timesheet', array('timesheet' => $timesheet)) ?>
+<?= Helper\template('file_show', array('task' => $task, 'files' => $files)) ?>
+<?= Helper\template('task_comments', array('task' => $task, 'comments' => $comments, 'project' => $project)) ?> \ No newline at end of file
diff --git a/app/Template/task_show_description.php b/app/Template/task_show_description.php
new file mode 100644
index 00000000..25312149
--- /dev/null
+++ b/app/Template/task_show_description.php
@@ -0,0 +1,24 @@
+<?php if (! empty($task['description'])): ?>
+ <div id="description" class="task-show-section">
+ <div class="page-header">
+ <h2><?= t('Description') ?></h2>
+ </div>
+
+ <article class="markdown task-show-description">
+ <?php if (! isset($is_public)): ?>
+ <?= Helper\markdown($task['description']) ?>
+ <?php else: ?>
+ <?= Helper\markdown(
+ $task['description'],
+ array(
+ 'controller' => 'task',
+ 'action' => 'readonly',
+ 'params' => array(
+ 'token' => $project['token']
+ )
+ )
+ ) ?>
+ <?php endif ?>
+ </article>
+ </div>
+<?php endif ?> \ No newline at end of file
diff --git a/app/Template/task_sidebar.php b/app/Template/task_sidebar.php
new file mode 100644
index 00000000..4cffd5fa
--- /dev/null
+++ b/app/Template/task_sidebar.php
@@ -0,0 +1,26 @@
+<div class="task-show-sidebar">
+ <h2><?= t('Actions') ?></h2>
+ <div class="task-show-actions">
+ <ul>
+ <li><a href="?controller=task&amp;action=show&amp;task_id=<?= $task['id'] ?>"><?= t('Summary') ?></a></li>
+ <li><a href="?controller=task&amp;action=edit&amp;task_id=<?= $task['id'] ?>"><?= t('Edit the task') ?></a></li>
+ <li><a href="?controller=task&amp;action=description&amp;task_id=<?= $task['id'] ?>"><?= t('Edit the description') ?></a></li>
+ <li><a href="?controller=subtask&amp;action=create&amp;task_id=<?= $task['id'] ?>"><?= t('Add a sub-task') ?></a></li>
+ <li><a href="?controller=comment&amp;action=create&amp;task_id=<?= $task['id'] ?>"><?= t('Add a comment') ?></a></li>
+ <li><a href="?controller=file&amp;action=create&amp;task_id=<?= $task['id'] ?>"><?= t('Attach a document') ?></a></li>
+ <li><a href="?controller=task&amp;action=duplicate&amp;project_id=<?= $task['project_id'] ?>&amp;task_id=<?= $task['id'] ?>"><?= t('Duplicate') ?></a></li>
+ <li><a href="?controller=task&amp;action=copy&amp;project_id=<?= $task['project_id'] ?>&amp;task_id=<?= $task['id'] ?>"><?= t('Duplicate to another project') ?></a></li>
+ <li><a href="?controller=task&amp;action=move&amp;project_id=<?= $task['project_id'] ?>&amp;task_id=<?= $task['id'] ?>"><?= t('Move to another project') ?></a></li>
+ <li>
+ <?php if ($task['is_active'] == 1): ?>
+ <a href="?controller=task&amp;action=close&amp;task_id=<?= $task['id'] ?>"><?= t('Close this task') ?></a>
+ <?php else: ?>
+ <a href="?controller=task&amp;action=open&amp;task_id=<?= $task['id'] ?>"><?= t('Open this task') ?></a>
+ <?php endif ?>
+ </li>
+ <?php if (! $hide_remove_menu): ?>
+ <li><a href="?controller=task&amp;action=remove&amp;task_id=<?= $task['id'] ?>"><?= t('Remove') ?></a></li>
+ <?php endif ?>
+ </ul>
+ </div>
+</div> \ No newline at end of file
diff --git a/app/Template/task_table.php b/app/Template/task_table.php
new file mode 100644
index 00000000..fa04fa55
--- /dev/null
+++ b/app/Template/task_table.php
@@ -0,0 +1,56 @@
+<table>
+ <tr>
+ <th><?= Helper\order(t('Id'), 'tasks.id', $pagination) ?></th>
+ <th><?= Helper\order(t('Column'), 'tasks.column_id', $pagination) ?></th>
+ <th><?= Helper\order(t('Category'), 'tasks.category_id', $pagination) ?></th>
+ <th><?= Helper\order(t('Title'), 'tasks.title', $pagination) ?></th>
+ <th><?= Helper\order(t('Assignee'), 'users.username', $pagination) ?></th>
+ <th><?= Helper\order(t('Due date'), 'tasks.date_due', $pagination) ?></th>
+ <th><?= Helper\order(t('Date created'), 'tasks.date_creation', $pagination) ?></th>
+ <th><?= Helper\order(t('Date completed'), 'tasks.date_completed', $pagination) ?></th>
+ <th><?= Helper\order(t('Status'), 'tasks.is_active', $pagination) ?></th>
+ </tr>
+ <?php foreach ($tasks as $task): ?>
+ <tr>
+ <td class="task-table task-<?= $task['color_id'] ?>">
+ <a href="?controller=task&amp;action=show&amp;task_id=<?= $task['id'] ?>" title="<?= t('View this task') ?>">#<?= Helper\escape($task['id']) ?></a>
+ </td>
+ <td>
+ <?= Helper\in_list($task['column_id'], $columns) ?>
+ </td>
+ <td>
+ <?= Helper\in_list($task['category_id'], $categories, '') ?>
+ </td>
+ <td>
+ <a href="?controller=task&amp;action=show&amp;task_id=<?= $task['id'] ?>" title="<?= t('View this task') ?>"><?= Helper\escape($task['title']) ?></a>
+ </td>
+ <td>
+ <?php if ($task['assignee_username']): ?>
+ <?= Helper\escape($task['assignee_name'] ?: $task['assignee_username']) ?>
+ <?php else: ?>
+ <?= t('Unassigned') ?>
+ <?php endif ?>
+ </td>
+ <td>
+ <?= dt('%B %e, %Y', $task['date_due']) ?>
+ </td>
+ <td>
+ <?= dt('%B %e, %Y at %k:%M %p', $task['date_creation']) ?>
+ </td>
+ <td>
+ <?php if ($task['date_completed']): ?>
+ <?= dt('%B %e, %Y at %k:%M %p', $task['date_completed']) ?>
+ <?php endif ?>
+ </td>
+ <td>
+ <?php if ($task['is_active'] == \Model\Task::STATUS_OPEN): ?>
+ <?= t('Open') ?>
+ <?php else: ?>
+ <?= t('Closed') ?>
+ <?php endif ?>
+ </td>
+ </tr>
+ <?php endforeach ?>
+</table>
+
+<?= Helper\paginate($pagination) ?>
diff --git a/app/Template/task_time.php b/app/Template/task_time.php
new file mode 100644
index 00000000..11a76303
--- /dev/null
+++ b/app/Template/task_time.php
@@ -0,0 +1,15 @@
+<form method="post" action="<?= Helper\u('task', 'time', array('task_id' => $values['id'])) ?>" class="form-inline task-time-form" autocomplete="off">
+ <?= Helper\form_csrf() ?>
+ <?= Helper\form_hidden('id', $values) ?>
+
+ <?= Helper\form_label(t('Start date'), 'date_started') ?>
+ <?= Helper\form_text('date_started', $values, array(), array('placeholder="'.Helper\in_list($date_format, $date_formats).'"'), 'form-date') ?>
+
+ <?= Helper\form_label(t('Time estimated'), 'time_estimated') ?>
+ <?= Helper\form_numeric('time_estimated', $values, array(), array('placeholder="'.t('hours').'"')) ?>
+
+ <?= Helper\form_label(t('Time spent'), 'time_spent') ?>
+ <?= Helper\form_numeric('time_spent', $values, array(), array('placeholder="'.t('hours').'"')) ?>
+
+ <input type="submit" value="<?= t('Save') ?>" class="btn btn-blue"/>
+</form> \ No newline at end of file
diff --git a/app/Template/task_timesheet.php b/app/Template/task_timesheet.php
new file mode 100644
index 00000000..cd093657
--- /dev/null
+++ b/app/Template/task_timesheet.php
@@ -0,0 +1,13 @@
+<?php if ($timesheet['time_estimated'] > 0 || $timesheet['time_spent'] > 0): ?>
+
+<div class="page-header">
+ <h2><?= t('Time tracking') ?></h2>
+</div>
+
+<ul class="listing">
+ <li><?= t('Estimate:') ?> <strong><?= Helper\escape($timesheet['time_estimated']) ?></strong> <?= t('hours') ?></li>
+ <li><?= t('Spent:') ?> <strong><?= Helper\escape($timesheet['time_spent']) ?></strong> <?= t('hours') ?></li>
+ <li><?= t('Remaining:') ?> <strong><?= Helper\escape($timesheet['time_remaining']) ?></strong> <?= t('hours') ?></li>
+</ul>
+
+<?php endif ?> \ No newline at end of file
diff --git a/app/Template/user_edit.php b/app/Template/user_edit.php
new file mode 100644
index 00000000..14063d49
--- /dev/null
+++ b/app/Template/user_edit.php
@@ -0,0 +1,30 @@
+<div class="page-header">
+ <h2><?= t('Edit user') ?></h2>
+</div>
+<form method="post" action="?controller=user&amp;action=edit&amp;user_id=<?= $user['id'] ?>" autocomplete="off">
+
+ <?= Helper\form_csrf() ?>
+
+ <?= Helper\form_hidden('id', $values) ?>
+ <?= Helper\form_hidden('is_ldap_user', $values) ?>
+
+ <?= Helper\form_label(t('Username'), 'username') ?>
+ <?= Helper\form_text('username', $values, $errors, array('required', $values['is_ldap_user'] == 1 ? 'readonly' : '')) ?><br/>
+
+ <?= Helper\form_label(t('Name'), 'name') ?>
+ <?= Helper\form_text('name', $values, $errors) ?><br/>
+
+ <?= Helper\form_label(t('Email'), 'email') ?>
+ <?= Helper\form_email('email', $values, $errors) ?><br/>
+
+ <?= Helper\form_label(t('Default project'), 'default_project_id') ?>
+ <?= Helper\form_select('default_project_id', $projects, $values, $errors) ?><br/>
+
+ <?php if (Helper\is_admin()): ?>
+ <?= Helper\form_checkbox('is_admin', t('Administrator'), 1, isset($values['is_admin']) && $values['is_admin'] == 1 ? true : false) ?><br/>
+ <?php endif ?>
+
+ <div class="form-actions">
+ <input type="submit" value="<?= t('Save') ?>" class="btn btn-blue"/> <?= t('or') ?> <a href="?controller=user&amp;action=show&amp;user_id=<?= $user['id'] ?>"><?= t('cancel') ?></a>
+ </div>
+</form> \ No newline at end of file
diff --git a/app/Template/user_external.php b/app/Template/user_external.php
new file mode 100644
index 00000000..676b2c73
--- /dev/null
+++ b/app/Template/user_external.php
@@ -0,0 +1,39 @@
+<div class="page-header">
+ <h2><?= t('External authentications') ?></h2>
+</div>
+
+<?php if (GOOGLE_AUTH): ?>
+ <h3><i class="fa fa-google"></i> <?= t('Google Account') ?></h3>
+
+ <p class="listing">
+ <?php if (Helper\is_current_user($user['id'])): ?>
+ <?php if (empty($user['google_id'])): ?>
+ <a href="?controller=user&amp;action=google<?= Helper\param_csrf() ?>"><?= t('Link my Google Account') ?></a>
+ <?php else: ?>
+ <a href="?controller=user&amp;action=unlinkGoogle<?= Helper\param_csrf() ?>"><?= t('Unlink my Google Account') ?></a>
+ <?php endif ?>
+ <?php else: ?>
+ <?= empty($user['google_id']) ? t('No account linked.') : t('Account linked.') ?>
+ <?php endif ?>
+ </p>
+<?php endif ?>
+
+<?php if (GITHUB_AUTH): ?>
+ <h3><i class="fa fa-github"></i> <?= t('Github Account') ?></h3>
+
+ <p class="listing">
+ <?php if (Helper\is_current_user($user['id'])): ?>
+ <?php if (empty($user['github_id'])): ?>
+ <a href="?controller=user&amp;action=gitHub<?= Helper\param_csrf() ?>"><?= t('Link my GitHub Account') ?></a>
+ <?php else: ?>
+ <a href="?controller=user&amp;action=unlinkGitHub<?= Helper\param_csrf() ?>"><?= t('Unlink my GitHub Account') ?></a>
+ <?php endif ?>
+ <?php else: ?>
+ <?= empty($user['github_id']) ? t('No account linked.') : t('Account linked.') ?>
+ <?php endif ?>
+ </p>
+<?php endif ?>
+
+<?php if (! GOOGLE_AUTH && ! GITHUB_AUTH): ?>
+ <p class="alert"><?= t('No external authentication enabled.') ?></p>
+<?php endif ?>
diff --git a/app/Template/user_index.php b/app/Template/user_index.php
new file mode 100644
index 00000000..d4e1bbf9
--- /dev/null
+++ b/app/Template/user_index.php
@@ -0,0 +1,71 @@
+<section id="main">
+ <div class="page-header">
+ <h2><?= t('Users') ?><span id="page-counter"> (<?= $nb_users ?>)</span></h2>
+ <?php if (Helper\is_admin()): ?>
+ <ul>
+ <li><a href="?controller=user&amp;action=create"><?= t('New user') ?></a></li>
+ </ul>
+ <?php endif ?>
+ </div>
+ <section>
+ <?php if (empty($users)): ?>
+ <p class="alert"><?= t('No user') ?></p>
+ <?php else: ?>
+ <table>
+ <tr>
+ <th><?= t('Id') ?></th>
+ <th><?= t('Username') ?></th>
+ <th><?= t('Name') ?></th>
+ <th><?= t('Email') ?></th>
+ <th><?= t('Administrator') ?></th>
+ <th><?= t('Default project') ?></th>
+ <th><?= t('Notifications') ?></th>
+ <th><?= t('External accounts') ?></th>
+ <th><?= t('Account type') ?></th>
+ </tr>
+ <?php foreach ($users as $user): ?>
+ <tr>
+ <td>
+ <a href="?controller=user&amp;action=show&amp;user_id=<?= $user['id'] ?>">#<?= $user['id'] ?></a>
+ </td>
+ <td>
+ <a href="?controller=user&amp;action=show&amp;user_id=<?= $user['id'] ?>"><?= Helper\escape($user['username']) ?></a>
+ </td>
+ <td>
+ <?= Helper\escape($user['name']) ?>
+ </td>
+ <td>
+ <?= Helper\escape($user['email']) ?>
+ </td>
+ <td>
+ <?= $user['is_admin'] ? t('Yes') : t('No') ?>
+ </td>
+ <td>
+ <?= (isset($user['default_project_id']) && isset($projects[$user['default_project_id']])) ? Helper\escape($projects[$user['default_project_id']]) : t('None'); ?>
+ </td>
+ <td>
+ <?php if ($user['notifications_enabled'] == 1): ?>
+ <?= t('Enabled') ?>
+ <?php else: ?>
+ <?= t('Disabled') ?>
+ <?php endif ?>
+ </td>
+ <td>
+ <ul class="no-bullet">
+ <?php if ($user['google_id']): ?>
+ <li><i class="fa fa-google"></i> <?= t('Google account linked') ?></li>
+ <?php endif ?>
+ <?php if ($user['github_id']): ?>
+ <li><i class="fa fa-github"></i> <?= t('Github account linked') ?></li>
+ <?php endif ?>
+ </ul>
+ </td>
+ <td>
+ <?= $user['is_ldap_user'] ? t('Remote') : t('Local') ?>
+ </td>
+ </tr>
+ <?php endforeach ?>
+ </table>
+ <?php endif ?>
+ </section>
+</section>
diff --git a/app/Template/user_last.php b/app/Template/user_last.php
new file mode 100644
index 00000000..0b55b0d5
--- /dev/null
+++ b/app/Template/user_last.php
@@ -0,0 +1,24 @@
+<div class="page-header">
+ <h2><?= t('Last logins') ?></h2>
+</div>
+
+<?php if (empty($last_logins)): ?>
+ <p class="alert"><?= t('Never connected.') ?></p>
+<?php else: ?>
+ <table class="table-small">
+ <tr>
+ <th><?= t('Login date') ?></th>
+ <th><?= t('Authentication method') ?></th>
+ <th><?= t('IP address') ?></th>
+ <th><?= t('User agent') ?></th>
+ </tr>
+ <?php foreach($last_logins as $login): ?>
+ <tr>
+ <td><?= dt('%B %e, %Y at %k:%M %p', $login['date_creation']) ?></td>
+ <td><?= Helper\escape($login['auth_type']) ?></td>
+ <td><?= Helper\escape($login['ip']) ?></td>
+ <td><?= Helper\escape(Helper\summary($login['user_agent'])) ?></td>
+ </tr>
+ <?php endforeach ?>
+ </table>
+<?php endif ?> \ No newline at end of file
diff --git a/app/Template/user_layout.php b/app/Template/user_layout.php
new file mode 100644
index 00000000..7462b3f0
--- /dev/null
+++ b/app/Template/user_layout.php
@@ -0,0 +1,19 @@
+<section id="main">
+ <div class="page-header">
+ <h2><?= Helper\escape($user['name'] ?: $user['username']).' (#'.$user['id'].')' ?></h2>
+ <?php if (Helper\is_admin()): ?>
+ <ul>
+ <li><a href="?controller=user&amp;action=index"><?= t('All users') ?></a></li>
+ <li><a href="?controller=user&amp;action=create"><?= t('New user') ?></a></li>
+ </ul>
+ <?php endif ?>
+ </div>
+ <section class="user-show" id="user-section">
+
+ <?= Helper\template('user_sidebar', array('user' => $user)) ?>
+
+ <div class="user-show-main">
+ <?= $user_content_for_layout ?>
+ </div>
+ </section>
+</section> \ No newline at end of file
diff --git a/app/Template/user_login.php b/app/Template/user_login.php
new file mode 100644
index 00000000..cf92cd4d
--- /dev/null
+++ b/app/Template/user_login.php
@@ -0,0 +1,42 @@
+<div class="form-login">
+
+ <div class="page-header">
+ <h1><?= t('Sign in') ?></h1>
+ </div>
+
+ <?php if (isset($errors['login'])): ?>
+ <p class="alert alert-error"><?= Helper\escape($errors['login']) ?></p>
+ <?php endif ?>
+
+ <form method="post" action="?controller=user&amp;action=check&amp;redirect_query=<?= urlencode($redirect_query) ?>">
+
+ <?= Helper\form_csrf() ?>
+
+ <?= Helper\form_label(t('Username'), 'username') ?>
+ <?= Helper\form_text('username', $values, $errors, array('autofocus', 'required')) ?><br/>
+
+ <?= Helper\form_label(t('Password'), 'password') ?>
+ <?= Helper\form_password('password', $values, $errors, array('required')) ?>
+
+ <?= Helper\form_checkbox('remember_me', t('Remember Me'), 1) ?><br/>
+
+ <ul>
+ <?php if (GOOGLE_AUTH): ?>
+ <li>
+ <a href="?controller=user&amp;action=google"><?= t('Login with my Google Account') ?></a>
+ </li>
+ <?php endif ?>
+
+ <?php if (GITHUB_AUTH): ?>
+ <li>
+ <a href="?controller=user&amp;action=gitHub"><?= t('Login with my GitHub Account') ?></a>
+ </li>
+ <?php endif ?>
+ </ul>
+
+ <div class="form-actions">
+ <input type="submit" value="<?= t('Sign in') ?>" class="btn btn-blue"/>
+ </div>
+ </form>
+
+</div> \ No newline at end of file
diff --git a/app/Template/user_new.php b/app/Template/user_new.php
new file mode 100644
index 00000000..158813cb
--- /dev/null
+++ b/app/Template/user_new.php
@@ -0,0 +1,39 @@
+<section id="main">
+ <div class="page-header">
+ <h2><?= t('New user') ?></h2>
+ <ul>
+ <li><a href="?controller=user"><?= t('All users') ?></a></li>
+ </ul>
+ </div>
+ <section>
+ <form method="post" action="?controller=user&amp;action=save" autocomplete="off">
+
+ <?= Helper\form_csrf() ?>
+
+ <?= Helper\form_label(t('Username'), 'username') ?>
+ <?= Helper\form_text('username', $values, $errors, array('autofocus', 'required')) ?><br/>
+
+ <?= Helper\form_label(t('Name'), 'name') ?>
+ <?= Helper\form_text('name', $values, $errors) ?><br/>
+
+ <?= Helper\form_label(t('Email'), 'email') ?>
+ <?= Helper\form_email('email', $values, $errors) ?><br/>
+
+ <?= Helper\form_label(t('Password'), 'password') ?>
+ <?= Helper\form_password('password', $values, $errors, array('required')) ?><br/>
+
+ <?= Helper\form_label(t('Confirmation'), 'confirmation') ?>
+ <?= Helper\form_password('confirmation', $values, $errors, array('required')) ?><br/>
+
+ <?= Helper\form_label(t('Default project'), 'default_project_id') ?>
+ <?= Helper\form_select('default_project_id', $projects, $values, $errors) ?><br/>
+
+ <?= Helper\form_checkbox('is_admin', t('Administrator'), 1, isset($values['is_admin']) && $values['is_admin'] == 1 ? true : false) ?>
+
+ <div class="form-actions">
+ <input type="submit" value="<?= t('Save') ?>" class="btn btn-blue"/>
+ <?= t('or') ?> <a href="?controller=user"><?= t('cancel') ?></a>
+ </div>
+ </form>
+ </section>
+</section> \ No newline at end of file
diff --git a/app/Template/user_notifications.php b/app/Template/user_notifications.php
new file mode 100644
index 00000000..13dd9809
--- /dev/null
+++ b/app/Template/user_notifications.php
@@ -0,0 +1,22 @@
+<div class="page-header">
+ <h2><?= t('Email notifications') ?></h2>
+</div>
+
+<form method="post" action="?controller=user&amp;action=notifications&amp;user_id=<?= $user['id'] ?>" autocomplete="off">
+
+ <?= Helper\form_csrf() ?>
+
+ <?= Helper\form_checkbox('notifications_enabled', t('Enable email notifications'), '1', $notifications['notifications_enabled'] == 1) ?><br/>
+
+ <p><?= t('I want to receive notifications only for those projects:') ?><br/><br/></p>
+
+ <div class="form-checkbox-group">
+ <?php foreach ($projects as $project_id => $project_name): ?>
+ <?= Helper\form_checkbox('projects['.$project_id.']', $project_name, '1', isset($notifications['project_'.$project_id])) ?>
+ <?php endforeach ?>
+ </div>
+ <div class="form-actions">
+ <input type="submit" value="<?= t('Save') ?>" class="btn btn-blue"/>
+ <?= t('or') ?> <a href="?controller=user&amp;action=show&amp;user_id=<?= $user['id'] ?>"><?= t('cancel') ?></a>
+ </div>
+</form> \ No newline at end of file
diff --git a/app/Template/user_password.php b/app/Template/user_password.php
new file mode 100644
index 00000000..5da38595
--- /dev/null
+++ b/app/Template/user_password.php
@@ -0,0 +1,23 @@
+<div class="page-header">
+ <h2><?= t('Password modification') ?></h2>
+</div>
+
+<form method="post" action="?controller=user&amp;action=password&amp;user_id=<?= $user['id'] ?>" autocomplete="off">
+
+ <?= Helper\form_hidden('id', $values) ?>
+ <?= Helper\form_csrf() ?>
+
+ <?= Helper\form_label(t('Current password for the user "%s"', Helper\get_username()), 'current_password') ?>
+ <?= Helper\form_password('current_password', $values, $errors) ?><br/>
+
+ <?= Helper\form_label(t('New password for the user "%s"', Helper\get_username($user)), 'password') ?>
+ <?= Helper\form_password('password', $values, $errors) ?><br/>
+
+ <?= Helper\form_label(t('Confirmation'), 'confirmation') ?>
+ <?= Helper\form_password('confirmation', $values, $errors) ?><br/>
+
+ <div class="form-actions">
+ <input type="submit" value="<?= t('Save') ?>" class="btn btn-blue"/> <?= t('or') ?> <a href="?controller=user&amp;action=show&amp;user_id=<?= $user['id'] ?>"><?= t('cancel') ?></a>
+ </div>
+
+</form> \ No newline at end of file
diff --git a/app/Template/user_remove.php b/app/Template/user_remove.php
new file mode 100644
index 00000000..c20ccbba
--- /dev/null
+++ b/app/Template/user_remove.php
@@ -0,0 +1,12 @@
+<div class="page-header">
+ <h2><?= t('Remove user') ?></h2>
+</div>
+
+<div class="confirm">
+ <p class="alert alert-info"><?= t('Do you really want to remove this user: "%s"?', $user['name'] ?: $user['username']) ?></p>
+
+ <div class="form-actions">
+ <a href="?controller=user&amp;action=remove&amp;confirmation=yes&amp;user_id=<?= $user['id'].Helper\param_csrf() ?>" class="btn btn-red"><?= t('Yes') ?></a>
+ <?= t('or') ?> <a href="?controller=user&amp;action=show&amp;user_id=<?= $user['id'] ?>"><?= t('cancel') ?></a>
+ </div>
+</div> \ No newline at end of file
diff --git a/app/Template/user_sessions.php b/app/Template/user_sessions.php
new file mode 100644
index 00000000..b647d726
--- /dev/null
+++ b/app/Template/user_sessions.php
@@ -0,0 +1,26 @@
+<div class="page-header">
+ <h2><?= t('Persistent connections') ?></h2>
+</div>
+
+<?php if (empty($sessions)): ?>
+ <p class="alert"><?= t('No session.') ?></p>
+<?php else: ?>
+ <table class="table-small">
+ <tr>
+ <th><?= t('Creation date') ?></th>
+ <th><?= t('Expiration date') ?></th>
+ <th><?= t('IP address') ?></th>
+ <th><?= t('User agent') ?></th>
+ <th><?= t('Action') ?></th>
+ </tr>
+ <?php foreach($sessions as $session): ?>
+ <tr>
+ <td><?= dt('%B %e, %Y at %k:%M %p', $session['date_creation']) ?></td>
+ <td><?= dt('%B %e, %Y at %k:%M %p', $session['expiration']) ?></td>
+ <td><?= Helper\escape($session['ip']) ?></td>
+ <td><?= Helper\escape(Helper\summary($session['user_agent'])) ?></td>
+ <td><a href="?controller=user&amp;action=removeSession&amp;user_id=<?= $user['id'] ?>&amp;id=<?= $session['id'].Helper\param_csrf() ?>"><?= t('Remove') ?></a></td>
+ </tr>
+ <?php endforeach ?>
+ </table>
+<?php endif ?>
diff --git a/app/Template/user_show.php b/app/Template/user_show.php
new file mode 100644
index 00000000..1c843751
--- /dev/null
+++ b/app/Template/user_show.php
@@ -0,0 +1,12 @@
+<div class="page-header">
+ <h2><?= t('Summary') ?></h2>
+</div>
+<ul class="listing">
+ <li><?= t('Username:') ?> <strong><?= Helper\escape($user['username']) ?></strong></li>
+ <li><?= t('Name:') ?> <strong><?= Helper\escape($user['name']) ?></strong></li>
+ <li><?= t('Email:') ?> <strong><?= Helper\escape($user['email']) ?></strong></li>
+ <li><?= t('Default project:') ?> <strong><?= (isset($user['default_project_id']) && isset($projects[$user['default_project_id']])) ? Helper\escape($projects[$user['default_project_id']]) : t('None'); ?></strong></li>
+ <li><?= t('Notifications:') ?> <strong><?= $user['notifications_enabled'] == 1 ? t('Enabled') : t('Disabled') ?></strong></li>
+ <li><?= t('Group:') ?> <strong><?= $user['is_admin'] ? t('Administrator') : t('Regular user') ?></strong></li>
+ <li><?= t('Account type:') ?> <strong><?= $user['is_ldap_user'] ? t('Remote') : t('Local') ?></strong></li>
+</ul>
diff --git a/app/Template/user_sidebar.php b/app/Template/user_sidebar.php
new file mode 100644
index 00000000..9d8f8b46
--- /dev/null
+++ b/app/Template/user_sidebar.php
@@ -0,0 +1,42 @@
+<div class="project-show-sidebar">
+ <h2><?= t('Actions') ?></h2>
+ <div class="user-show-actions">
+ <ul>
+ <li>
+ <a href="?controller=user&amp;action=show&amp;user_id=<?= $user['id'] ?>"><?= t('Summary') ?></a>
+ </li>
+
+ <?php if (Helper\is_admin() || Helper\is_current_user($user['id'])): ?>
+ <li>
+ <a href="?controller=user&amp;action=edit&amp;user_id=<?= $user['id'] ?>"><?= t('Edit profile') ?></a>
+ </li>
+
+ <?php if ($user['is_ldap_user'] == 0): ?>
+ <li>
+ <a href="?controller=user&amp;action=password&amp;user_id=<?= $user['id'] ?>"><?= t('Change password') ?></a>
+ </li>
+ <?php endif ?>
+
+ <li>
+ <a href="?controller=user&amp;action=notifications&amp;user_id=<?= $user['id'] ?>"><?= t('Email notifications') ?></a>
+ </li>
+ <li>
+ <a href="?controller=user&amp;action=external&amp;user_id=<?= $user['id'] ?>"><?= t('External accounts') ?></a>
+ </li>
+ <li>
+ <a href="?controller=user&amp;action=last&amp;user_id=<?= $user['id'] ?>"><?= t('Last logins') ?></a>
+ </li>
+ <li>
+ <a href="?controller=user&amp;action=sessions&amp;user_id=<?= $user['id'] ?>"><?= t('Persistent connections') ?></a>
+ </li>
+ <?php endif ?>
+
+ <?php if (Helper\is_admin()): ?>
+ <li>
+ <a href="?controller=user&amp;action=remove&amp;user_id=<?= $user['id'] ?>"><?= t('Remove') ?></a>
+ </li>
+ <?php endif ?>
+
+ </ul>
+ </div>
+</div> \ No newline at end of file