203 lines
10 KiB
HTML
203 lines
10 KiB
HTML
{% extends "base.html" %}
|
|
{% block content %}
|
|
<div class="breadcrumb">
|
|
{% if domain %}<span style="color: {{ domain.color or '#4F6EF7' }}">{{ domain.name }}</span><span class="sep">/</span>{% endif %}
|
|
{% if area %}<span>{{ area.name }}</span><span class="sep">/</span>{% endif %}
|
|
<span>{{ item.name }}</span>
|
|
</div>
|
|
|
|
<div class="detail-header">
|
|
<div class="flex items-center justify-between">
|
|
<h1 class="detail-title">{{ item.name }}</h1>
|
|
<div class="flex gap-2">
|
|
<a href="/projects/{{ item.id }}/edit" class="btn btn-secondary btn-sm">Edit</a>
|
|
<form action="/projects/{{ item.id }}/delete" method="post" data-confirm="Delete this project?" style="display:inline">
|
|
<button class="btn btn-danger btn-sm">Delete</button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
<div class="detail-meta mt-2">
|
|
<span class="status-badge status-{{ item.status }}">{{ item.status|replace('_', ' ') }}</span>
|
|
<span class="detail-meta-item"><span class="priority-dot priority-{{ item.priority }}"></span> P{{ item.priority }}</span>
|
|
{% if item.target_date %}<span class="detail-meta-item">Target: {{ item.target_date }}</span>{% endif %}
|
|
</div>
|
|
<a href="/tasks/?project_id={{ item.id }}" class="stat-card-link" style="max-width: 300px; display: block; margin-top: 8px;">
|
|
<div class="progress-bar"><div class="progress-fill" style="width: {{ progress }}%"></div></div>
|
|
<div class="progress-text">{{ done_count }}/{{ task_count }} tasks complete ({{ progress }}%)</div>
|
|
</a>
|
|
</div>
|
|
|
|
{% if item.description %}
|
|
<div class="card mb-4"><div class="detail-body">{{ item.description }}</div></div>
|
|
{% endif %}
|
|
|
|
<!-- Tabs -->
|
|
<div class="tab-strip">
|
|
<a href="/projects/{{ item.id }}?tab=tasks" class="tab-item {{ 'active' if tab == 'tasks' }}">Tasks ({{ tasks|length }})</a>
|
|
<a href="/projects/{{ item.id }}?tab=notes" class="tab-item {{ 'active' if tab == 'notes' }}">Notes{% if counts.notes %} ({{ counts.notes }}){% endif %}</a>
|
|
<a href="/projects/{{ item.id }}?tab=links" class="tab-item {{ 'active' if tab == 'links' }}">Links{% if counts.links %} ({{ counts.links }}){% endif %}</a>
|
|
<a href="/projects/{{ item.id }}?tab=files" class="tab-item {{ 'active' if tab == 'files' }}">Files{% if counts.files %} ({{ counts.files }}){% endif %}</a>
|
|
<a href="/projects/{{ item.id }}?tab=lists" class="tab-item {{ 'active' if tab == 'lists' }}">Lists{% if counts.lists %} ({{ counts.lists }}){% endif %}</a>
|
|
<a href="/projects/{{ item.id }}?tab=decisions" class="tab-item {{ 'active' if tab == 'decisions' }}">Decisions{% if counts.decisions %} ({{ counts.decisions }}){% endif %}</a>
|
|
<a href="/projects/{{ item.id }}?tab=meetings" class="tab-item {{ 'active' if tab == 'meetings' }}">Meetings{% if counts.meetings %} ({{ counts.meetings }}){% endif %}</a>
|
|
<a href="/projects/{{ item.id }}?tab=processes" class="tab-item {{ 'active' if tab == 'processes' }}">Processes</a>
|
|
<a href="/projects/{{ item.id }}?tab=contacts" class="tab-item {{ 'active' if tab == 'contacts' }}">Contacts{% if counts.contacts %} ({{ counts.contacts }}){% endif %}</a>
|
|
</div>
|
|
|
|
{% if tab == 'tasks' %}
|
|
<form class="quick-add" action="/tasks/quick-add" method="post">
|
|
<input type="hidden" name="domain_id" value="{{ item.domain_id }}">
|
|
<input type="hidden" name="project_id" value="{{ item.id }}">
|
|
<input type="text" name="title" placeholder="Quick add task to this project..." required>
|
|
<button type="submit" class="btn btn-primary btn-sm">Add</button>
|
|
</form>
|
|
<a href="/tasks/create?domain_id={{ item.domain_id }}&project_id={{ item.id }}" class="btn btn-ghost btn-sm mb-3">+ Full Task Form</a>
|
|
|
|
{% for t in tasks %}
|
|
<div class="list-row {{ 'completed' if t.status == 'done' }}">
|
|
<div class="row-check">
|
|
<form action="/tasks/{{ t.id }}/toggle" method="post" style="display:inline">
|
|
<input type="checkbox" id="pt-{{ t.id }}" {{ 'checked' if t.status == 'done' }} onchange="this.form.submit()">
|
|
<label for="pt-{{ t.id }}"></label>
|
|
</form>
|
|
</div>
|
|
<span class="priority-dot priority-{{ t.priority }}"></span>
|
|
<span class="row-title"><a href="/tasks/{{ t.id }}">{{ t.title }}</a></span>
|
|
{% if t.due_date %}<span class="row-meta">{{ t.due_date }}</span>{% endif %}
|
|
<span class="status-badge status-{{ t.status }}">{{ t.status|replace('_', ' ') }}</span>
|
|
<div class="row-actions">
|
|
<a href="/tasks/{{ t.id }}/edit" class="btn btn-ghost btn-xs">Edit</a>
|
|
</div>
|
|
</div>
|
|
{% else %}
|
|
<div class="empty-state"><div class="empty-state-text">No tasks yet</div></div>
|
|
{% endfor %}
|
|
|
|
{% elif tab == 'notes' %}
|
|
<a href="/notes/create?domain_id={{ item.domain_id }}&project_id={{ item.id }}" class="btn btn-ghost btn-sm mb-3">+ New Note</a>
|
|
{% for n in notes %}
|
|
<div class="list-row">
|
|
<span class="row-title"><a href="/notes/{{ n.id }}">{{ n.title }}</a></span>
|
|
<span class="row-meta">{{ n.updated_at.strftime('%Y-%m-%d') if n.updated_at else '' }}</span>
|
|
</div>
|
|
{% else %}
|
|
<div class="empty-state"><div class="empty-state-text">No notes yet</div></div>
|
|
{% endfor %}
|
|
|
|
{% elif tab == 'links' %}
|
|
<a href="/links/create?domain_id={{ item.domain_id }}&project_id={{ item.id }}" class="btn btn-ghost btn-sm mb-3">+ New Link</a>
|
|
{% for l in links %}
|
|
<div class="list-row">
|
|
<span class="row-title"><a href="{{ l.url }}" target="_blank">{{ l.label }}</a></span>
|
|
<span class="row-meta">{{ l.url[:50] }}{% if l.url|length > 50 %}...{% endif %}</span>
|
|
<div class="row-actions">
|
|
<a href="/links/{{ l.id }}/edit" class="btn btn-ghost btn-xs">Edit</a>
|
|
</div>
|
|
</div>
|
|
{% else %}
|
|
<div class="empty-state"><div class="empty-state-text">No links yet</div></div>
|
|
{% endfor %}
|
|
|
|
{% elif tab == 'files' %}
|
|
<a href="/files/upload?context_type=project&context_id={{ item.id }}" class="btn btn-ghost btn-sm mb-3">+ Upload File</a>
|
|
{% for f in tab_data %}
|
|
<div class="list-row">
|
|
<span class="row-title"><a href="/files/{{ f.id }}">{{ f.original_filename }}</a></span>
|
|
<span class="row-meta">{{ f.created_at.strftime('%Y-%m-%d') if f.created_at else '' }}</span>
|
|
</div>
|
|
{% else %}
|
|
<div class="empty-state"><div class="empty-state-text">No files attached to this project</div></div>
|
|
{% endfor %}
|
|
|
|
{% elif tab == 'lists' %}
|
|
<a href="/lists/create?domain_id={{ item.domain_id }}&project_id={{ item.id }}" class="btn btn-ghost btn-sm mb-3">+ New List</a>
|
|
{% for l in tab_data %}
|
|
<div class="list-row">
|
|
<span class="row-title"><a href="/lists/{{ l.id }}">{{ l.name }}</a></span>
|
|
<span class="row-meta">{{ l.item_count }} items</span>
|
|
</div>
|
|
{% else %}
|
|
<div class="empty-state"><div class="empty-state-text">No lists linked to this project</div></div>
|
|
{% endfor %}
|
|
|
|
{% elif tab == 'decisions' %}
|
|
<a href="/decisions/create?project_id={{ item.id }}" class="btn btn-ghost btn-sm mb-3">+ New Decision</a>
|
|
{% for d in tab_data %}
|
|
<div class="list-row">
|
|
<span class="row-title"><a href="/decisions/{{ d.id }}">{{ d.title }}</a></span>
|
|
<span class="status-badge status-{{ d.status }}">{{ d.status }}</span>
|
|
</div>
|
|
{% else %}
|
|
<div class="empty-state"><div class="empty-state-text">No decisions linked to this project</div></div>
|
|
{% endfor %}
|
|
|
|
{% elif tab == 'meetings' %}
|
|
<a href="/meetings/create" class="btn btn-ghost btn-sm mb-3">+ New Meeting</a>
|
|
<div class="card mb-4">
|
|
<form action="/projects/{{ item.id }}/meetings/add" method="post" class="flex gap-2 items-end" style="padding: 12px;">
|
|
<div class="form-group" style="flex:1; margin:0;">
|
|
<label class="form-label">Meeting</label>
|
|
<select name="meeting_id" class="form-select" required>
|
|
<option value="">Select meeting...</option>
|
|
{% for m in all_meetings %}
|
|
<option value="{{ m.id }}">{{ m.title }} ({{ m.meeting_date }})</option>
|
|
{% endfor %}
|
|
</select>
|
|
</div>
|
|
<button type="submit" class="btn btn-primary btn-sm">Add</button>
|
|
</form>
|
|
</div>
|
|
{% for m in tab_data %}
|
|
<div class="list-row">
|
|
<span class="row-title"><a href="/meetings/{{ m.id }}">{{ m.title }}</a></span>
|
|
<span class="row-meta">{{ m.meeting_date }}</span>
|
|
<span class="status-badge status-{{ m.status }}">{{ m.status }}</span>
|
|
<div class="row-actions">
|
|
<form action="/projects/{{ item.id }}/meetings/{{ m.id }}/remove" method="post" style="display:inline">
|
|
<button class="btn btn-ghost btn-xs" title="Remove">Remove</button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
{% else %}
|
|
<div class="empty-state"><div class="empty-state-text">No meetings linked to this project</div></div>
|
|
{% endfor %}
|
|
|
|
{% elif tab == 'processes' %}
|
|
<div class="empty-state"><div class="empty-state-text">Process management coming soon</div></div>
|
|
|
|
{% elif tab == 'contacts' %}
|
|
<div class="card mb-4">
|
|
<form action="/projects/{{ item.id }}/contacts/add" method="post" class="flex gap-2 items-end" style="padding: 12px;">
|
|
<div class="form-group" style="flex:1; margin:0;">
|
|
<label class="form-label">Contact</label>
|
|
<select name="contact_id" class="form-select" required>
|
|
<option value="">Select contact...</option>
|
|
{% for c in all_contacts %}
|
|
<option value="{{ c.id }}">{{ c.first_name }} {{ c.last_name or '' }}</option>
|
|
{% endfor %}
|
|
</select>
|
|
</div>
|
|
<div class="form-group" style="flex:1; margin:0;">
|
|
<label class="form-label">Role</label>
|
|
<input type="text" name="role" class="form-input" placeholder="e.g. lead, contributor...">
|
|
</div>
|
|
<button type="submit" class="btn btn-primary btn-sm">Add</button>
|
|
</form>
|
|
</div>
|
|
{% for c in tab_data %}
|
|
<div class="list-row">
|
|
<span class="row-title"><a href="/contacts/{{ c.id }}">{{ c.first_name }} {{ c.last_name or '' }}</a></span>
|
|
{% if c.role %}<span class="row-tag">{{ c.role }}</span>{% endif %}
|
|
<span class="row-meta">{{ c.linked_at.strftime('%Y-%m-%d') if c.linked_at else '' }}</span>
|
|
<div class="row-actions">
|
|
<form action="/projects/{{ item.id }}/contacts/{{ c.id }}/remove" method="post" style="display:inline">
|
|
<button class="btn btn-ghost btn-xs" title="Remove">Remove</button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
{% else %}
|
|
<div class="empty-state"><div class="empty-state-text">No contacts linked to this project</div></div>
|
|
{% endfor %}
|
|
{% endif %}
|
|
{% endblock %}
|