- Added filtering of proposals by status (Draft, Active, Approved, Rejected, Cancelled). - Added searching of proposals by title and description. - Improved UI to persist filter and search values. - Added a "No proposals found" message for better UX.
150 lines
7.1 KiB
HTML
150 lines
7.1 KiB
HTML
{% extends "base.html" %}
|
|
|
|
{% block title %}Proposals - Governance Dashboard{% endblock %}
|
|
|
|
{% block content %}
|
|
<!-- Success message if present -->
|
|
{% if success %}
|
|
<div class="row mb-4">
|
|
<div class="col-12">
|
|
<div class="alert alert-success alert-dismissible fade show" role="alert">
|
|
{{ success }}
|
|
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
<!-- Navigation Tabs -->
|
|
<div class="row mb-3">
|
|
<div class="col-12">
|
|
<ul class="nav nav-tabs">
|
|
<li class="nav-item">
|
|
<a class="nav-link" href="/governance">Dashboard</a>
|
|
</li>
|
|
<li class="nav-item">
|
|
<a class="nav-link active" href="/governance/proposals">All Proposals</a>
|
|
</li>
|
|
<li class="nav-item">
|
|
<a class="nav-link" href="/governance/my-votes">My Votes</a>
|
|
</li>
|
|
<li class="nav-item">
|
|
<a class="nav-link" href="/governance/create">Create Proposal</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-12">
|
|
<div class="alert alert-info alert-dismissible fade show">
|
|
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
|
|
<h5><i class="bi bi-info-circle"></i> About Proposals</h5>
|
|
<p>Proposals are formal requests for changes to the platform that require community approval. Each proposal
|
|
includes a detailed description, implementation plan, and voting period. Browse the list below to see all
|
|
active and past proposals.</p>
|
|
<div class="mt-2">
|
|
<a href="/governance/proposal-guidelines" class="btn btn-sm btn-outline-primary"><i
|
|
class="bi bi-file-text"></i> Proposal Guidelines</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Filter Controls -->
|
|
<div class="row mb-4">
|
|
<div class="col-12">
|
|
<div class="card">
|
|
<div class="card-body">
|
|
<form action="/governance/proposals" method="get" class="row g-3">
|
|
<div class="col-md-4">
|
|
<label for="status" class="form-label">Status</label>
|
|
<select class="form-select" id="status" name="status">
|
|
<option value="" {% if not status_filter or status_filter == "" %}selected{% endif %}>All Statuses</option>
|
|
<option value="Draft" {% if status_filter == "Draft" %}selected{% endif %}>Draft</option>
|
|
<option value="Active" {% if status_filter == "Active" %}selected{% endif %}>Active</option>
|
|
<option value="Approved" {% if status_filter == "Approved" %}selected{% endif %}>Approved</option>
|
|
<option value="Rejected" {% if status_filter == "Rejected" %}selected{% endif %}>Rejected</option>
|
|
<option value="Cancelled" {% if status_filter == "Cancelled" %}selected{% endif %}>Cancelled</option>
|
|
</select>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<label for="search" class="form-label">Search</label>
|
|
<input type="text" class="form-control" id="search" name="search"
|
|
placeholder="Search by title or description" value="{% if search_filter %}{{ search_filter }}{% endif %}">
|
|
</div>
|
|
<div class="col-md-2 d-flex align-items-end">
|
|
<button type="submit" class="btn btn-primary w-100">Filter</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Proposals List -->
|
|
<div class="row mb-4">
|
|
<div class="col-12">
|
|
<div class="card">
|
|
<div class="card-header d-flex justify-content-between align-items-center">
|
|
<h5 class="mb-0">All Proposals</h5>
|
|
<a href="/governance/create" class="btn btn-sm btn-primary">Create New Proposal</a>
|
|
</div>
|
|
<div class="card-body">
|
|
{% if proposals and proposals|length > 0 %}
|
|
<div class="table-responsive">
|
|
<table class="table table-hover">
|
|
<thead>
|
|
<tr>
|
|
<th>Title</th>
|
|
<th>Creator</th>
|
|
<th>Status</th>
|
|
<th>Created</th>
|
|
<th>Voting Period</th>
|
|
<th>Actions</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for proposal in proposals %}
|
|
<tr>
|
|
<td>{{ proposal.title }}</td>
|
|
<td>{{ proposal.creator_name }}</td>
|
|
<td>
|
|
<span
|
|
class="badge {% if proposal.status == 'Active' %}bg-success{% elif proposal.status == 'Approved' %}bg-primary{% elif proposal.status == 'Rejected' %}bg-danger{% elif proposal.status == 'Draft' %}bg-secondary{% else %}bg-warning{% endif %}">
|
|
{{ proposal.status }}
|
|
</span>
|
|
</td>
|
|
<td>{{ proposal.created_at | date(format="%Y-%m-%d") }}</td>
|
|
<td>
|
|
{% if proposal.voting_starts_at and proposal.voting_ends_at %}
|
|
{{ proposal.voting_starts_at | date(format="%Y-%m-%d") }} to {{
|
|
proposal.voting_ends_at | date(format="%Y-%m-%d") }}
|
|
{% else %}
|
|
Not set
|
|
{% endif %}
|
|
</td>
|
|
<td>
|
|
<a href="/governance/proposals/{{ proposal.base_data.id }}"
|
|
class="btn btn-sm btn-primary">View</a>
|
|
</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
{% else %}
|
|
<div class="alert alert-info text-center py-5">
|
|
<i class="bi bi-info-circle fs-1 mb-3"></i>
|
|
<h5>No proposals found</h5>
|
|
{% if status_filter or search_filter %}
|
|
<p>No proposals match your current filter criteria. Try adjusting your filters or <a href="/governance/proposals" class="alert-link">view all proposals</a>.</p>
|
|
{% else %}
|
|
<p>There are no proposals in the system yet.</p>
|
|
{% endif %}
|
|
<a href="/governance/create" class="btn btn-primary mt-3">Create New Proposal</a>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endblock %} |