add contract md folder support
This commit is contained in:
@@ -1,3 +1,5 @@
|
||||
{% import "contracts/macros/contract_macros.html" as contract_macros %}
|
||||
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}Contract Details{% endblock %}
|
||||
@@ -41,6 +43,11 @@
|
||||
<i class="bi bi-clock-history me-1"></i> Activity
|
||||
</button>
|
||||
</li>
|
||||
<li class="nav-item" role="presentation">
|
||||
<button class="nav-link" id="signatures-tab" data-bs-toggle="tab" data-bs-target="#signatures" type="button" role="tab" aria-controls="signatures" aria-selected="false">
|
||||
<i class="bi bi-pencil-square me-1"></i> Signatures
|
||||
</button>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<div class="tab-content" id="contractTabsContent">
|
||||
@@ -53,83 +60,52 @@
|
||||
<div class="card-header d-flex justify-content-between align-items-center">
|
||||
<h5 class="mb-0">Contract Document</h5>
|
||||
{% if contract.status == 'Signed' %}
|
||||
<span class="badge bg-success">SIGNED</span>
|
||||
<span class="badge bg-success">SIGNED</span>
|
||||
{% elif contract.status == 'Active' %}
|
||||
<span class="badge bg-success">ACTIVE</span>
|
||||
<span class="badge bg-success">ACTIVE</span>
|
||||
{% elif contract.status == 'PendingSignatures' %}
|
||||
<span class="badge bg-warning text-dark">PENDING</span>
|
||||
<span class="badge bg-warning text-dark">PENDING</span>
|
||||
{% elif contract.status == 'Draft' %}
|
||||
<span class="badge bg-secondary">DRAFT</span>
|
||||
<span class="badge bg-secondary">DRAFT</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="card-body bg-light">
|
||||
{% if contract.revisions|length > 0 %}
|
||||
{% if contract_section_content_error is defined %}
|
||||
<div class="alert alert-danger">{{ contract_section_content_error }}</div>
|
||||
{% endif %}
|
||||
{% if contract_section_content is defined %}
|
||||
<div class="row">
|
||||
<div class="col-md-3">
|
||||
<div class="list-group mb-3">
|
||||
{% set section_param = section | default(value=toc[0].file) %}
|
||||
{{ contract_macros::render_toc(items=toc, section_param=section_param) }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-9">
|
||||
<div class="bg-white p-4 border rounded">
|
||||
{{ contract_section_content | safe }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% elif contract.revisions|length > 0 %}
|
||||
{% set latest_revision = contract.latest_revision %}
|
||||
<div class="bg-white p-4 border rounded">
|
||||
{{ latest_revision.content|safe }}
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="text-center py-5 text-muted">
|
||||
<p>No content has been added to this contract yet.</p>
|
||||
<div class="alert alert-warning text-center py-5">
|
||||
<p>
|
||||
{% if contract_section_content_error is defined %}
|
||||
{{ contract_section_content_error }}
|
||||
{% else %}
|
||||
No content or markdown sections could be loaded for this contract. Please check the contract's content directory and Table of Contents configuration.
|
||||
{% endif %}
|
||||
</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Signature Areas -->
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
<h5 class="mb-0">Signatures</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
{% for signer in contract.signers %}
|
||||
<div class="col-md-6 mb-4">
|
||||
<div class="card h-100 {% if signer.status == 'Signed' %}border-success{% elif signer.status == 'Rejected' %}border-danger{% else %}border-warning{% endif %}">
|
||||
<div class="card-header d-flex justify-content-between align-items-center">
|
||||
<h6 class="mb-0">{{ signer.name }}</h6>
|
||||
<span class="badge {% if signer.status == 'Signed' %}bg-success{% elif signer.status == 'Rejected' %}bg-danger{% else %}bg-warning text-dark{% endif %}">
|
||||
{{ signer.status }}
|
||||
</span>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<p class="text-muted mb-2">{{ signer.email }}</p>
|
||||
|
||||
{% if signer.status == 'Signed' %}
|
||||
<div class="text-center border-top pt-3">
|
||||
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/e/e4/Signature_of_John_Hancock.svg/1280px-Signature_of_John_Hancock.svg.png" alt="Signature" class="img-fluid" style="max-height: 60px;">
|
||||
<div class="small text-muted mt-2">Signed on {{ signer.signed_at }}</div>
|
||||
</div>
|
||||
{% elif signer.status == 'Rejected' %}
|
||||
<div class="alert alert-danger mt-3">
|
||||
<i class="bi bi-x-circle me-2"></i> Rejected on {{ signer.signed_at }}
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="text-center mt-3">
|
||||
<p class="text-muted mb-2">Waiting for signature...</p>
|
||||
{% if not user_has_signed %}
|
||||
<button class="btn btn-primary btn-sm btn-sign" data-signer-id="{{ signer.id }}">
|
||||
<i class="bi bi-pen me-1"></i> Sign Here
|
||||
</button>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if signer.comments %}
|
||||
<div class="mt-3">
|
||||
<p class="small text-muted mb-1">Comments:</p>
|
||||
<p class="small">{{ signer.comments }}</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-3">
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
@@ -168,7 +144,6 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
<h5 class="mb-0">Signers Status</h5>
|
||||
@@ -195,7 +170,6 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
<h5 class="mb-0">Contract Info</h5>
|
||||
@@ -223,7 +197,86 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- Signatures Tab -->
|
||||
<div class="tab-pane fade" id="signatures" role="tabpanel" aria-labelledby="signatures-tab">
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
<h5 class="mb-0">Signatures</h5>
|
||||
</div>
|
||||
<div class="card-body p-0">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-hover align-middle mb-0">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">Name</th>
|
||||
<th scope="col">Email</th>
|
||||
<th scope="col">Status</th>
|
||||
<th scope="col">Signed At</th>
|
||||
<th scope="col">Comments</th>
|
||||
<th scope="col">Actions</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for signer in contract.signers %}
|
||||
<tr class="{% if signer.status == 'Signed' %}table-success{% elif signer.status == 'Rejected' %}table-danger{% elif signer.status == 'Pending' %}table-warning{% endif %}">
|
||||
<td>{{ signer.name }}</td>
|
||||
<td>{{ signer.email }}</td>
|
||||
<td>
|
||||
<span class="badge {% if signer.status == 'Signed' %}bg-success{% elif signer.status == 'Rejected' %}bg-danger{% else %}bg-warning text-dark{% endif %}">
|
||||
{{ signer.status }}
|
||||
</span>
|
||||
</td>
|
||||
<td>
|
||||
{% if signer.status == 'Signed' or signer.status == 'Rejected' %}
|
||||
{{ signer.signed_at }}
|
||||
{% else %}
|
||||
<span class="text-muted">--</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
{% if signer.comments %}
|
||||
<span class="small">{{ signer.comments }}</span>
|
||||
{% else %}
|
||||
<span class="text-muted">--</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
{% if signer.status == 'Signed' %}
|
||||
<a href="/contracts/{{ contract.id }}/signed/{{ signer.id }}" class="btn btn-outline-primary btn-sm" target="_blank">
|
||||
<i class="bi bi-eye"></i> View Signed Document
|
||||
</a>
|
||||
{% elif signer.status == 'Rejected' %}
|
||||
<button class="btn btn-outline-secondary btn-sm" disabled title="Rejected">
|
||||
<i class="bi bi-x-circle"></i> Rejected
|
||||
</button>
|
||||
<button class="btn btn-outline-warning btn-sm">
|
||||
<i class="bi bi-bell"></i> Remind to Sign
|
||||
</button>
|
||||
{% else %}
|
||||
{% if current_user is defined and not user_has_signed and signer.email == current_user.email %}
|
||||
<button class="btn btn-primary btn-sm btn-sign" data-signer-id="{{ signer.id }}">
|
||||
<i class="bi bi-pen"></i> Sign Here
|
||||
</button>
|
||||
{% endif %}
|
||||
<button class="btn btn-outline-warning btn-sm">
|
||||
<i class="bi bi-bell"></i> Remind to Sign
|
||||
</button>
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Details Tab -->
|
||||
<div class="tab-pane fade" id="details" role="tabpanel" aria-labelledby="details-tab">
|
||||
<div class="row">
|
||||
|
@@ -0,0 +1,10 @@
|
||||
{% macro render_toc(items, section_param) %}
|
||||
{% for item in items %}
|
||||
<a href="?section={{ item.file }}" class="list-group-item list-group-item-action{% if section_param == item.file %} active{% endif %}">{{ item.title }}</a>
|
||||
{% if item.children and item.children | length > 0 %}
|
||||
<div class="ms-3">
|
||||
{{ self::render_toc(items=item.children, section_param=section_param) }}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% endmacro %}
|
Reference in New Issue
Block a user