add contract md folder support

This commit is contained in:
timurgordon
2025-05-01 03:56:55 +03:00
parent 457f3c8268
commit c05803ff58
15 changed files with 365 additions and 76 deletions

View File

@@ -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">

View File

@@ -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 %}