|
- <?php
- $taskColumns = [
- 'backlog' => 'Backlog',
- 'in-progress' => 'In progress',
- 'review' => 'In review',
- 'blocked' => 'Blocked',
- 'done' => 'Done',
- ];
- ?>
-
- <section class="stack">
- <div class="project-header">
- <div class="project-hero">
- <div class="project-top">
- <div>
- <span class="eyebrow"><?= e($project['code']) ?></span>
- <h1><?= e($project['name']) ?></h1>
- <p><?= e($project['description']) ?></p>
- </div>
- <div class="board-actions">
- <a class="button button-secondary" href="/projects">Back to projects</a>
- <a class="button button-ghost" href="/activity">Activity feed</a>
- </div>
- </div>
-
- <div class="badge-row">
- <span class="status-pill <?= e($project['health_class']) ?>"><?= e($project['status_label']) ?></span>
- <span class="status-pill is-blue"><?= e($project['throughput']) ?></span>
- <span class="status-pill is-amber">Owner: <?= e($project['owner_name']) ?></span>
- <span class="status-pill is-neutral">Last update: <?= e(format_date($project['latest_activity'], 'M j, Y · H:i')) ?></span>
- </div>
-
- <div class="progress"><span style="width: <?= e((string) $project['progress_percent']) ?>%"></span></div>
-
- <div class="project-meta-grid">
- <div class="meta-card"><span>Client</span><strong><?= e($project['client_name']) ?></strong></div>
- <div class="meta-card"><span>Budget</span><strong><?= e($project['budget_label']) ?></strong></div>
- <div class="meta-card"><span>Due date</span><strong><?= e($project['due_label']) ?></strong></div>
- <div class="meta-card"><span>Tasks</span><strong><?= e((string) $project['task_count']) ?> total / <?= e((string) $project['done_task_count']) ?> done</strong></div>
- </div>
-
- <div class="project-actions">
- <form method="post" action="/projects/<?= e((string) $project['id']) ?>/status" class="board-actions">
- <?= csrf_field() ?>
- <label class="field">
- <span>Project status</span>
- <select class="select" name="status">
- <?php foreach (['planned','active','at-risk','paused','done'] as $status): ?>
- <option value="<?= e($status) ?>" <?= $project['status'] === $status ? 'selected' : '' ?>><?= e(project_status_label($status)) ?></option>
- <?php endforeach; ?>
- </select>
- </label>
- <button class="button button-primary" type="submit">Update status</button>
- </form>
- </div>
- </div>
- </div>
-
- <div class="shell">
- <div class="board-shell">
- <div class="board-header">
- <div>
- <span class="eyebrow">Kanban board</span>
- <h2>Task flow</h2>
- </div>
- <div class="board-actions">
- <span class="tag is-neutral"><?= e((string) count($project['members'])) ?> team members</span>
- <span class="tag is-amber"><?= e((string) $project['blocked_task_count']) ?> blocked</span>
- <span class="tag is-red"><?= e((string) $project['overdue_task_count']) ?> overdue</span>
- </div>
- </div>
-
- <div class="board">
- <?php foreach ($taskColumns as $status => $label): ?>
- <section class="column">
- <header>
- <h3><?= e($label) ?></h3>
- <span class="count"><?= e((string) count($project['task_buckets'][$status])) ?></span>
- </header>
- <?php foreach ($project['task_buckets'][$status] as $task): ?>
- <article class="task-card" id="task-<?= e((string) $task['id']) ?>">
- <header>
- <div>
- <span class="mini-pill <?= e($task['status_class']) ?>"><?= e($task['priority']) ?></span>
- <h4><?= e($task['title']) ?></h4>
- </div>
- <span class="kicker"><?= e(format_date($task['due_date'])) ?></span>
- </header>
- <div class="task-body">
- <p><?= e($task['description']) ?></p>
- <div class="task-meta">
- <span class="mini-pill is-neutral">Assigned to <?= e($task['assignee']) ?></span>
- <span class="mini-pill is-blue"><?= e($task['estimate_hours'] !== null ? (string) $task['estimate_hours'] . 'h' : 'No estimate') ?></span>
- </div>
- </div>
- <footer>
- <form method="post" action="/tasks/<?= e((string) $task['id']) ?>/status" class="task-actions">
- <?= csrf_field() ?>
- <select class="select" name="status">
- <?php foreach ($taskStatusOptions as $option): ?>
- <option value="<?= e($option) ?>" <?= $task['status'] === $option ? 'selected' : '' ?>><?= e(task_status_label($option)) ?></option>
- <?php endforeach; ?>
- </select>
- <button class="button button-ghost" type="submit">Move</button>
- </form>
- </footer>
- </article>
- <?php endforeach; ?>
- </section>
- <?php endforeach; ?>
- </div>
- </div>
-
- <aside class="side-stack">
- <section class="panel">
- <div class="block-title">
- <div>
- <span class="eyebrow">Team</span>
- <h2>Project members</h2>
- </div>
- </div>
- <div class="members-list">
- <?php foreach ($project['members'] as $member): ?>
- <div class="member-chip">
- <div>
- <strong><?= e($member['full_name']) ?></strong>
- <small><?= e($member['role']) ?></small>
- </div>
- <span class="tag is-neutral"><?= e((string) $member['allocation_percent']) ?>%</span>
- </div>
- <?php endforeach; ?>
- </div>
- </section>
-
- <section class="panel">
- <div class="block-title">
- <div>
- <span class="eyebrow">Add task</span>
- <h2>New work item</h2>
- </div>
- </div>
-
- <?php if (!empty($taskErrors['_token'])): ?>
- <div class="alert alert-error"><?= e($taskErrors['_token'][0]) ?></div>
- <?php endif; ?>
-
- <form class="task-form" method="post" action="/projects/<?= e((string) $project['id']) ?>/tasks">
- <?= csrf_field() ?>
- <label class="field">
- <span>Task title</span>
- <input class="input" type="text" name="title" maxlength="140" value="<?= e($taskOld['title']) ?>" required>
- <?php if (!empty($taskErrors['title'])): ?><small class="field-error"><?= e($taskErrors['title'][0]) ?></small><?php endif; ?>
- </label>
-
- <label class="field">
- <span>Description</span>
- <textarea class="textarea" name="description" maxlength="800" required><?= e($taskOld['description']) ?></textarea>
- </label>
-
- <div class="form-grid">
- <label class="field">
- <span>Priority</span>
- <select class="select" name="priority">
- <?php foreach ($priorityOptions as $option): ?>
- <option value="<?= e($option) ?>" <?= $taskOld['priority'] === $option ? 'selected' : '' ?>><?= e(ucfirst($option)) ?></option>
- <?php endforeach; ?>
- </select>
- </label>
-
- <label class="field">
- <span>Status</span>
- <select class="select" name="status">
- <?php foreach ($taskStatusOptions as $option): ?>
- <option value="<?= e($option) ?>" <?= $taskOld['status'] === $option ? 'selected' : '' ?>><?= e(task_status_label($option)) ?></option>
- <?php endforeach; ?>
- </select>
- </label>
-
- <label class="field">
- <span>Assignee</span>
- <input class="input" type="text" name="assignee" maxlength="100" value="<?= e($taskOld['assignee']) ?>" required>
- </label>
-
- <label class="field">
- <span>Estimate hours</span>
- <input class="input" type="number" step="0.5" min="0" name="estimate_hours" value="<?= e($taskOld['estimate_hours']) ?>">
- </label>
- </div>
-
- <label class="field">
- <span>Due date</span>
- <input class="input" type="date" name="due_date" value="<?= e($taskOld['due_date']) ?>">
- </label>
-
- <button class="button button-primary" type="submit">Add task</button>
- </form>
- </section>
-
- <section class="panel">
- <div class="block-title">
- <div>
- <span class="eyebrow">Timeline</span>
- <h2>Recent activity</h2>
- </div>
- </div>
- <div class="list">
- <?php foreach ($activity as $item): ?>
- <div class="feed-item">
- <header>
- <strong><?= e($item['headline']) ?></strong>
- <span class="kicker"><?= e(format_date($item['created_at'], 'M j · H:i')) ?></span>
- </header>
- <p><?= e($item['detail']) ?></p>
- </div>
- <?php endforeach; ?>
- </div>
- </section>
- </aside>
- </div>
- </section>
|