715 lines
32 KiB
HTML
715 lines
32 KiB
HTML
{% extends "base.html" %}
|
|
{% load static %}
|
|
|
|
{% block title %}{{ object.consent_form.title }} - Patient Consent{% endblock %}
|
|
|
|
{% block content %}
|
|
<!-- BEGIN breadcrumb -->
|
|
<ol class="breadcrumb float-xl-end">
|
|
<li class="breadcrumb-item"><a href="{% url 'core:dashboard' %}">Dashboard</a></li>
|
|
<li class="breadcrumb-item"><a href="{% url 'patients:patient_list' %}">Patients</a></li>
|
|
<li class="breadcrumb-item"><a href="{% url 'patients:patient_consent_list' %}">Patient Consents</a></li>
|
|
<li class="breadcrumb-item active">{{ object.consent_form.title|truncatechars:30 }}</li>
|
|
</ol>
|
|
<!-- END breadcrumb -->
|
|
|
|
<!-- BEGIN page-header -->
|
|
<h1 class="page-header">
|
|
Patient Consent Details
|
|
<small>{{ object.consent_form.title }}</small>
|
|
</h1>
|
|
<!-- END page-header -->
|
|
|
|
<div class="row">
|
|
<div class="col-xl-8">
|
|
<!-- BEGIN panel -->
|
|
<div class="panel panel-inverse">
|
|
<div class="panel-heading">
|
|
<h4 class="panel-title">Consent Information</h4>
|
|
<div class="panel-heading-btn">
|
|
{% if object.status == 'PENDING' %}
|
|
<button type="button" class="btn btn-success btn-sm me-2" onclick="signConsent()">
|
|
<i class="fa fa-signature me-2"></i>Sign Consent
|
|
</button>
|
|
{% endif %}
|
|
<button type="button" class="btn btn-info btn-sm me-2" onclick="viewDocument()">
|
|
<i class="fa fa-file-pdf me-2"></i>View Document
|
|
</button>
|
|
<button type="button" class="btn btn-secondary btn-sm me-2" onclick="printConsent()">
|
|
<i class="fa fa-print me-2"></i>Print
|
|
</button>
|
|
<a href="javascript:;" class="btn btn-xs btn-icon btn-default" data-toggle="panel-expand"><i class="fa fa-expand"></i></a>
|
|
</div>
|
|
</div>
|
|
<div class="panel-body">
|
|
<div class="row mb-4">
|
|
<div class="col-md-6">
|
|
<h6>Patient Information</h6>
|
|
<table class="table table-borderless">
|
|
<tr>
|
|
<td class="fw-bold" width="120">Name:</td>
|
|
<td>
|
|
<a href="{% url 'patients:patient_detail' object.patient.pk %}" class="text-decoration-none">
|
|
{{ object.patient.get_full_name }}
|
|
</a>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="fw-bold">Patient ID:</td>
|
|
<td>{{ object.patient.patient_id }}</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="fw-bold">Date of Birth:</td>
|
|
<td>{{ object.patient.date_of_birth|date:"M d, Y" }}</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="fw-bold">Age:</td>
|
|
<td>{{ object.patient.age }} years</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="fw-bold">Gender:</td>
|
|
<td>{{ object.patient.get_gender_display }}</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="fw-bold">Contact:</td>
|
|
<td>
|
|
<div>{{ object.patient.phone_number }}</div>
|
|
<div class="small text-muted">{{ object.patient.email }}</div>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<h6>Consent Form Details</h6>
|
|
<table class="table table-borderless">
|
|
<tr>
|
|
<td class="fw-bold" width="120">Form Title:</td>
|
|
<td>
|
|
<a href="{% url 'patients:consent_form_detail' object.consent_form.pk %}" class="text-decoration-none">
|
|
{{ object.consent_form.title }}
|
|
</a>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="fw-bold">Category:</td>
|
|
<td>
|
|
<span class="badge bg-{% if object.consent_form.category == 'SURGICAL' %}danger{% elif object.consent_form.category == 'TREATMENT' %}primary{% elif object.consent_form.category == 'RESEARCH' %}info{% elif object.consent_form.category == 'PRIVACY' %}dark{% elif object.consent_form.category == 'FINANCIAL' %}success{% else %}secondary{% endif %}">
|
|
{{ object.consent_form.get_category_display }}
|
|
</span>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="fw-bold">Version:</td>
|
|
<td><span class="badge bg-light text-dark">v{{ object.consent_form.version }}</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="fw-bold">Required:</td>
|
|
<td>
|
|
{% if object.consent_form.is_required %}
|
|
<span class="text-danger">
|
|
<i class="fa fa-exclamation-triangle me-1"></i>Required
|
|
</span>
|
|
{% else %}
|
|
<span class="text-muted">Optional</span>
|
|
{% endif %}
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="fw-bold">Description:</td>
|
|
<td>{{ object.consent_form.description }}</td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row mb-4">
|
|
<div class="col-md-6">
|
|
<h6>Request Information</h6>
|
|
<table class="table table-borderless">
|
|
<tr>
|
|
<td class="fw-bold" width="120">Status:</td>
|
|
<td>
|
|
<span class="badge bg-{% if object.status == 'SIGNED' %}success{% elif object.status == 'PENDING' %}warning{% elif object.status == 'EXPIRED' %}danger{% elif object.status == 'REVOKED' %}secondary{% else %}info{% endif %}">
|
|
{{ object.get_status_display }}
|
|
</span>
|
|
{% if object.is_urgent %}
|
|
<span class="badge bg-danger ms-2">Urgent</span>
|
|
{% endif %}
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="fw-bold">Requested:</td>
|
|
<td>{{ object.requested_at|date:"M d, Y H:i" }}</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="fw-bold">Requested By:</td>
|
|
<td>{{ object.requested_by.get_full_name|default:"System" }}</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="fw-bold">Due Date:</td>
|
|
<td>
|
|
{% if object.due_date %}
|
|
{{ object.due_date|date:"M d, Y" }}
|
|
{% if object.is_overdue %}
|
|
<span class="text-danger ms-2">Overdue</span>
|
|
{% endif %}
|
|
{% else %}
|
|
<span class="text-muted">No due date</span>
|
|
{% endif %}
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="fw-bold">Notes:</td>
|
|
<td>{{ object.notes|default:"No notes" }}</td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<h6>Signature Information</h6>
|
|
<table class="table table-borderless">
|
|
<tr>
|
|
<td class="fw-bold" width="120">Signed:</td>
|
|
<td>
|
|
{% if object.signed_at %}
|
|
{{ object.signed_at|date:"M d, Y H:i" }}
|
|
{% else %}
|
|
<span class="text-muted">Not signed</span>
|
|
{% endif %}
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="fw-bold">Signed By:</td>
|
|
<td>
|
|
{% if object.signed_by %}
|
|
<div>{{ object.signed_by.get_full_name }}</div>
|
|
<div class="small text-muted">{{ object.signed_by.relationship|default:"Patient" }}</div>
|
|
{% else %}
|
|
<span class="text-muted">Not signed</span>
|
|
{% endif %}
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="fw-bold">Witness:</td>
|
|
<td>
|
|
{% if object.witness %}
|
|
<div>{{ object.witness.get_full_name }}</div>
|
|
<div class="small text-muted">{{ object.witness.title|default:"Witness" }}</div>
|
|
{% else %}
|
|
<span class="text-muted">No witness</span>
|
|
{% endif %}
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="fw-bold">Expires:</td>
|
|
<td>
|
|
{% if object.expires_at %}
|
|
{{ object.expires_at|date:"M d, Y" }}
|
|
{% if object.is_expired %}
|
|
<span class="text-danger ms-2">Expired</span>
|
|
{% elif object.is_expiring_soon %}
|
|
<span class="text-warning ms-2">Expiring Soon</span>
|
|
{% endif %}
|
|
{% else %}
|
|
<span class="text-muted">No expiration</span>
|
|
{% endif %}
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="fw-bold">IP Address:</td>
|
|
<td>{{ object.ip_address|default:"Not recorded" }}</td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Signature Details -->
|
|
{% if object.status == 'SIGNED' %}
|
|
<div class="card border-success mb-4">
|
|
<div class="card-header bg-success text-white">
|
|
<h6 class="card-title mb-0">
|
|
<i class="fa fa-signature me-2"></i>Digital Signature Details
|
|
</h6>
|
|
</div>
|
|
<div class="card-body">
|
|
<div class="row">
|
|
<div class="col-md-6">
|
|
<div class="mb-3">
|
|
<strong>Signature Method:</strong>
|
|
<span class="ms-2">{{ object.signature_method|default:"Electronic" }}</span>
|
|
</div>
|
|
<div class="mb-3">
|
|
<strong>Device Used:</strong>
|
|
<span class="ms-2">{{ object.device_info|default:"Not recorded" }}</span>
|
|
</div>
|
|
<div class="mb-3">
|
|
<strong>Browser:</strong>
|
|
<span class="ms-2">{{ object.browser_info|default:"Not recorded" }}</span>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<div class="mb-3">
|
|
<strong>Signature Hash:</strong>
|
|
<span class="ms-2 font-monospace small">{{ object.signature_hash|default:"Not available" }}</span>
|
|
</div>
|
|
<div class="mb-3">
|
|
<strong>Verification Status:</strong>
|
|
<span class="ms-2">
|
|
{% if object.is_signature_valid %}
|
|
<span class="text-success">
|
|
<i class="fa fa-check-circle me-1"></i>Valid
|
|
</span>
|
|
{% else %}
|
|
<span class="text-danger">
|
|
<i class="fa fa-exclamation-triangle me-1"></i>Invalid
|
|
</span>
|
|
{% endif %}
|
|
</span>
|
|
</div>
|
|
<div class="mb-3">
|
|
<strong>Timestamp:</strong>
|
|
<span class="ms-2">{{ object.signed_at|date:"M d, Y H:i:s T" }}</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{% if object.signature_image %}
|
|
<div class="mt-3">
|
|
<strong>Signature Image:</strong>
|
|
<div class="mt-2">
|
|
<img src="{{ object.signature_image.url }}" alt="Signature" class="img-fluid border" style="max-height: 100px;">
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
<!-- Consent Form Content -->
|
|
<div class="card mb-4">
|
|
<div class="card-header">
|
|
<h6 class="card-title mb-0">Consent Form Content</h6>
|
|
</div>
|
|
<div class="card-body">
|
|
<div class="consent-content">
|
|
{{ object.consent_form.content|safe }}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Activity Timeline -->
|
|
<div class="card">
|
|
<div class="card-header">
|
|
<h6 class="card-title mb-0">Activity Timeline</h6>
|
|
</div>
|
|
<div class="card-body">
|
|
<div class="timeline">
|
|
<div class="timeline-item">
|
|
<div class="timeline-marker bg-primary"></div>
|
|
<div class="timeline-content">
|
|
<h6 class="timeline-title">Consent Requested</h6>
|
|
<p class="timeline-description">
|
|
Consent form "{{ object.consent_form.title }}" was requested for {{ object.patient.get_full_name }}.
|
|
</p>
|
|
<div class="timeline-date">{{ object.requested_at|date:"M d, Y H:i" }}</div>
|
|
<div class="timeline-user">by {{ object.requested_by.get_full_name|default:"System" }}</div>
|
|
</div>
|
|
</div>
|
|
|
|
{% if object.notification_sent_at %}
|
|
<div class="timeline-item">
|
|
<div class="timeline-marker bg-info"></div>
|
|
<div class="timeline-content">
|
|
<h6 class="timeline-title">Notification Sent</h6>
|
|
<p class="timeline-description">
|
|
Patient was notified about the consent request.
|
|
</p>
|
|
<div class="timeline-date">{{ object.notification_sent_at|date:"M d, Y H:i" }}</div>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% for reminder in object.reminders.all %}
|
|
<div class="timeline-item">
|
|
<div class="timeline-marker bg-warning"></div>
|
|
<div class="timeline-content">
|
|
<h6 class="timeline-title">Reminder Sent</h6>
|
|
<p class="timeline-description">
|
|
Reminder notification was sent to the patient.
|
|
</p>
|
|
<div class="timeline-date">{{ reminder.sent_at|date:"M d, Y H:i" }}</div>
|
|
<div class="timeline-user">by {{ reminder.sent_by.get_full_name }}</div>
|
|
</div>
|
|
</div>
|
|
{% endfor %}
|
|
|
|
{% if object.signed_at %}
|
|
<div class="timeline-item">
|
|
<div class="timeline-marker bg-success"></div>
|
|
<div class="timeline-content">
|
|
<h6 class="timeline-title">Consent Signed</h6>
|
|
<p class="timeline-description">
|
|
Consent form was digitally signed.
|
|
</p>
|
|
<div class="timeline-date">{{ object.signed_at|date:"M d, Y H:i" }}</div>
|
|
<div class="timeline-user">by {{ object.signed_by.get_full_name }}</div>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% if object.status == 'REVOKED' %}
|
|
<div class="timeline-item">
|
|
<div class="timeline-marker bg-danger"></div>
|
|
<div class="timeline-content">
|
|
<h6 class="timeline-title">Consent Revoked</h6>
|
|
<p class="timeline-description">
|
|
Consent was revoked.
|
|
</p>
|
|
<div class="timeline-date">{{ object.revoked_at|date:"M d, Y H:i" }}</div>
|
|
<div class="timeline-user">by {{ object.revoked_by.get_full_name }}</div>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<!-- END panel -->
|
|
</div>
|
|
|
|
<div class="col-xl-4">
|
|
<!-- BEGIN panel -->
|
|
<div class="panel panel-inverse">
|
|
<div class="panel-heading">
|
|
<h4 class="panel-title">Quick Actions</h4>
|
|
</div>
|
|
<div class="panel-body">
|
|
<div class="d-grid gap-2">
|
|
{% if object.status == 'PENDING' %}
|
|
<button type="button" class="btn btn-success" onclick="signConsent()">
|
|
<i class="fa fa-signature me-2"></i>Sign Consent
|
|
</button>
|
|
<button type="button" class="btn btn-warning" onclick="sendReminder()">
|
|
<i class="fa fa-bell me-2"></i>Send Reminder
|
|
</button>
|
|
{% endif %}
|
|
|
|
<button type="button" class="btn btn-info" onclick="viewDocument()">
|
|
<i class="fa fa-file-pdf me-2"></i>View Document
|
|
</button>
|
|
|
|
<button type="button" class="btn btn-secondary" onclick="downloadConsent()">
|
|
<i class="fa fa-download me-2"></i>Download PDF
|
|
</button>
|
|
|
|
<button type="button" class="btn btn-outline-secondary" onclick="printConsent()">
|
|
<i class="fa fa-print me-2"></i>Print
|
|
</button>
|
|
|
|
{% if object.status == 'SIGNED' and object.expires_at %}
|
|
<button type="button" class="btn btn-outline-primary" onclick="renewConsent()">
|
|
<i class="fa fa-refresh me-2"></i>Renew Consent
|
|
</button>
|
|
{% endif %}
|
|
|
|
{% if object.status in 'PENDING,SIGNED' %}
|
|
<button type="button" class="btn btn-outline-danger" onclick="revokeConsent()">
|
|
<i class="fa fa-times me-2"></i>Revoke Consent
|
|
</button>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<!-- END panel -->
|
|
|
|
<!-- BEGIN panel -->
|
|
<div class="panel panel-inverse">
|
|
<div class="panel-heading">
|
|
<h4 class="panel-title">Consent Status</h4>
|
|
</div>
|
|
<div class="panel-body">
|
|
<div class="text-center mb-3">
|
|
<div class="fs-48px">
|
|
{% if object.status == 'SIGNED' %}
|
|
<i class="fa fa-check-circle text-success"></i>
|
|
{% elif object.status == 'PENDING' %}
|
|
<i class="fa fa-clock text-warning"></i>
|
|
{% elif object.status == 'EXPIRED' %}
|
|
<i class="fa fa-exclamation-triangle text-danger"></i>
|
|
{% elif object.status == 'REVOKED' %}
|
|
<i class="fa fa-times-circle text-secondary"></i>
|
|
{% else %}
|
|
<i class="fa fa-question-circle text-info"></i>
|
|
{% endif %}
|
|
</div>
|
|
<div class="fs-18px fw-bold mt-2">{{ object.get_status_display }}</div>
|
|
</div>
|
|
|
|
{% if object.status == 'PENDING' %}
|
|
<div class="alert alert-warning">
|
|
<h6 class="alert-heading">Pending Signature</h6>
|
|
<p class="mb-0">This consent is waiting for patient signature.</p>
|
|
{% if object.due_date %}
|
|
<p class="mb-0 mt-2">
|
|
<strong>Due:</strong> {{ object.due_date|date:"M d, Y" }}
|
|
{% if object.is_overdue %}
|
|
<span class="text-danger">(Overdue)</span>
|
|
{% endif %}
|
|
</p>
|
|
{% endif %}
|
|
</div>
|
|
{% elif object.status == 'SIGNED' %}
|
|
<div class="alert alert-success">
|
|
<h6 class="alert-heading">Signed</h6>
|
|
<p class="mb-0">This consent has been digitally signed.</p>
|
|
{% if object.expires_at %}
|
|
<p class="mb-0 mt-2">
|
|
<strong>Expires:</strong> {{ object.expires_at|date:"M d, Y" }}
|
|
{% if object.is_expiring_soon %}
|
|
<span class="text-warning">(Expiring Soon)</span>
|
|
{% endif %}
|
|
</p>
|
|
{% endif %}
|
|
</div>
|
|
{% elif object.status == 'EXPIRED' %}
|
|
<div class="alert alert-danger">
|
|
<h6 class="alert-heading">Expired</h6>
|
|
<p class="mb-0">This consent has expired and needs to be renewed.</p>
|
|
</div>
|
|
{% elif object.status == 'REVOKED' %}
|
|
<div class="alert alert-secondary">
|
|
<h6 class="alert-heading">Revoked</h6>
|
|
<p class="mb-0">This consent has been revoked.</p>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
<!-- END panel -->
|
|
|
|
<!-- BEGIN panel -->
|
|
<div class="panel panel-inverse">
|
|
<div class="panel-heading">
|
|
<h4 class="panel-title">Related Information</h4>
|
|
</div>
|
|
<div class="panel-body">
|
|
<div class="mb-3">
|
|
<h6>Patient</h6>
|
|
<div class="d-flex align-items-center">
|
|
<div class="me-3">
|
|
<div class="w-40px h-40px bg-primary rounded-circle d-flex align-items-center justify-content-center">
|
|
<i class="fa fa-user text-white"></i>
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<div class="fw-bold">
|
|
<a href="{% url 'patients:patient_detail' object.patient.pk %}" class="text-decoration-none">
|
|
{{ object.patient.get_full_name }}
|
|
</a>
|
|
</div>
|
|
<div class="small text-muted">{{ object.patient.patient_id }}</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="mb-3">
|
|
<h6>Consent Form</h6>
|
|
<div class="d-flex align-items-center">
|
|
<div class="me-3">
|
|
<div class="w-40px h-40px bg-info rounded-circle d-flex align-items-center justify-content-center">
|
|
<i class="fa fa-file-text text-white"></i>
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<div class="fw-bold">
|
|
<a href="{% url 'patients:consent_form_detail' object.consent_form.pk %}" class="text-decoration-none">
|
|
{{ object.consent_form.title }}
|
|
</a>
|
|
</div>
|
|
<div class="small text-muted">{{ object.consent_form.get_category_display }}</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{% if object.signed_by and object.signed_by != object.patient %}
|
|
<div class="mb-3">
|
|
<h6>Signed By</h6>
|
|
<div class="d-flex align-items-center">
|
|
<div class="me-3">
|
|
<div class="w-40px h-40px bg-success rounded-circle d-flex align-items-center justify-content-center">
|
|
<i class="fa fa-signature text-white"></i>
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<div class="fw-bold">{{ object.signed_by.get_full_name }}</div>
|
|
<div class="small text-muted">{{ object.signed_by.relationship|default:"Guardian" }}</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% if object.witness %}
|
|
<div class="mb-3">
|
|
<h6>Witness</h6>
|
|
<div class="d-flex align-items-center">
|
|
<div class="me-3">
|
|
<div class="w-40px h-40px bg-warning rounded-circle d-flex align-items-center justify-content-center">
|
|
<i class="fa fa-eye text-white"></i>
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<div class="fw-bold">{{ object.witness.get_full_name }}</div>
|
|
<div class="small text-muted">{{ object.witness.title|default:"Witness" }}</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
<!-- END panel -->
|
|
</div>
|
|
</div>
|
|
{% endblock %}
|
|
|
|
{% block css %}
|
|
<style>
|
|
.timeline {
|
|
position: relative;
|
|
padding-left: 30px;
|
|
}
|
|
|
|
.timeline::before {
|
|
content: '';
|
|
position: absolute;
|
|
left: 15px;
|
|
top: 0;
|
|
bottom: 0;
|
|
width: 2px;
|
|
background: #dee2e6;
|
|
}
|
|
|
|
.timeline-item {
|
|
position: relative;
|
|
margin-bottom: 30px;
|
|
}
|
|
|
|
.timeline-marker {
|
|
position: absolute;
|
|
left: -22px;
|
|
top: 0;
|
|
width: 14px;
|
|
height: 14px;
|
|
border-radius: 50%;
|
|
border: 2px solid #fff;
|
|
}
|
|
|
|
.timeline-content {
|
|
background: #f8f9fa;
|
|
padding: 15px;
|
|
border-radius: 8px;
|
|
border-left: 3px solid #007bff;
|
|
}
|
|
|
|
.timeline-title {
|
|
margin-bottom: 5px;
|
|
font-size: 14px;
|
|
font-weight: 600;
|
|
}
|
|
|
|
.timeline-description {
|
|
margin-bottom: 10px;
|
|
font-size: 13px;
|
|
color: #6c757d;
|
|
}
|
|
|
|
.timeline-date {
|
|
font-size: 12px;
|
|
color: #6c757d;
|
|
font-weight: 500;
|
|
}
|
|
|
|
.timeline-user {
|
|
font-size: 11px;
|
|
color: #6c757d;
|
|
font-style: italic;
|
|
}
|
|
|
|
.consent-content {
|
|
max-height: 400px;
|
|
overflow-y: auto;
|
|
border: 1px solid #dee2e6;
|
|
padding: 15px;
|
|
border-radius: 5px;
|
|
background: #f8f9fa;
|
|
}
|
|
</style>
|
|
{% endblock %}
|
|
|
|
{% block js %}
|
|
<script>
|
|
function signConsent() {
|
|
window.location.href = '{% url "patients:sign_patient_consent" object.pk %}';
|
|
}
|
|
|
|
function viewDocument() {
|
|
window.open('{% url "patients:patient_consent_document" object.pk %}', '_blank');
|
|
}
|
|
|
|
function downloadConsent() {
|
|
window.open('{% url "patients:download_patient_consent" object.pk %}', '_blank');
|
|
}
|
|
|
|
function printConsent() {
|
|
window.open('{% url "patients:print_patient_consent" object.pk %}', '_blank');
|
|
}
|
|
|
|
function sendReminder() {
|
|
if (confirm('Send reminder to patient?')) {
|
|
$.ajax({
|
|
url: '{% url "patients:send_consent_reminder" object.pk %}',
|
|
method: 'POST',
|
|
success: function() {
|
|
toastr.success('Reminder sent successfully');
|
|
location.reload();
|
|
},
|
|
error: function() {
|
|
toastr.error('Failed to send reminder');
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
function renewConsent() {
|
|
if (confirm('Create renewal request for this consent?')) {
|
|
$.ajax({
|
|
url: '{% url "patients:renew_patient_consent" object.pk %}',
|
|
method: 'POST',
|
|
success: function() {
|
|
toastr.success('Renewal request created');
|
|
location.reload();
|
|
},
|
|
error: function() {
|
|
toastr.error('Failed to create renewal request');
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
function revokeConsent() {
|
|
if (confirm('Revoke this consent? This action cannot be undone.')) {
|
|
$.ajax({
|
|
url: '{% url "patients:revoke_patient_consent" object.pk %}',
|
|
method: 'POST',
|
|
success: function() {
|
|
toastr.success('Consent revoked successfully');
|
|
location.reload();
|
|
},
|
|
error: function() {
|
|
toastr.error('Failed to revoke consent');
|
|
}
|
|
});
|
|
}
|
|
}
|
|
</script>
|
|
{% endblock %}
|
|
|