hospital-management/templates/quality/indicators/quality_indicator_confirm_delete.html
2025-08-12 13:33:25 +03:00

347 lines
16 KiB
HTML

{% extends "base.html" %}
{% load static %}
{% block title %}Delete Quality Indicator - {{ block.super }}{% endblock %}
{% block content %}
<div class="container-fluid">
<!-- Page Header -->
<div class="d-flex justify-content-between align-items-center mb-4">
<div>
<h1 class="h3 mb-1">
<i class="fas fa-trash text-danger me-2"></i>Delete Quality Indicator
</h1>
<nav aria-label="breadcrumb">
<ol class="breadcrumb mb-0">
<li class="breadcrumb-item"><a href="{% url 'core:dashboard' %}">Dashboard</a></li>
<li class="breadcrumb-item"><a href="{% url 'quality:dashboard' %}">Quality</a></li>
<li class="breadcrumb-item"><a href="{% url 'quality:quality_indicator_list' %}">Indicators</a></li>
<li class="breadcrumb-item"><a href="{% url 'quality:quality_indicator_detail' object.pk %}">{{ object.name|truncatechars:20 }}</a></li>
<li class="breadcrumb-item active">Delete</li>
</ol>
</nav>
</div>
<div class="btn-group">
<a href="{% url 'quality:quality_indicator_detail' object.pk %}" class="btn btn-outline-secondary">
<i class="fas fa-arrow-left me-2"></i>Back to Indicator
</a>
</div>
</div>
<div class="row justify-content-center">
<div class="col-lg-8">
<!-- Warning Card -->
<div class="card border-danger mb-4">
<div class="card-header bg-danger text-white">
<h5 class="mb-0">
<i class="fas fa-exclamation-triangle me-2"></i>Confirm Deletion
</h5>
</div>
<div class="card-body">
<div class="alert alert-danger d-flex align-items-center" role="alert">
<i class="fas fa-exclamation-triangle fa-2x me-3"></i>
<div>
<h6 class="alert-heading mb-1">Warning: This action cannot be undone!</h6>
<p class="mb-0">You are about to permanently delete this quality indicator and all associated data.</p>
</div>
</div>
<!-- Indicator Information -->
<div class="row mb-4">
<div class="col-12">
<h6 class="text-muted mb-3">Indicator to be deleted:</h6>
<div class="bg-light p-3 rounded">
<div class="row">
<div class="col-md-8">
<h5 class="mb-2">{{ object.name }}</h5>
<p class="text-muted mb-2">{{ object.description|truncatechars:150 }}</p>
<div class="d-flex gap-2">
<span class="badge bg-primary">{{ object.get_category_display }}</span>
<span class="badge bg-info">{{ object.get_type_display }}</span>
{% if object.regulatory_requirement %}
<span class="badge bg-warning text-dark">Regulatory</span>
{% endif %}
</div>
</div>
<div class="col-md-4">
<div class="text-end">
<div class="mb-2">
<small class="text-muted">Created:</small><br>
<strong>{{ object.created_at|date:"M d, Y" }}</strong>
</div>
<div>
<small class="text-muted">Measurements:</small><br>
<strong>{{ object.measurements.count }}</strong>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Impact Assessment -->
<div class="row mb-4">
<div class="col-12">
<h6 class="text-muted mb-3">Impact Assessment:</h6>
<div class="row g-3">
<div class="col-md-4">
<div class="card border-warning">
<div class="card-body text-center">
<i class="fas fa-chart-bar fa-2x text-warning mb-2"></i>
<h4 class="text-warning mb-1">{{ object.measurements.count }}</h4>
<small class="text-muted">Measurements will be deleted</small>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card border-info">
<div class="card-body text-center">
<i class="fas fa-history fa-2x text-info mb-2"></i>
<h4 class="text-info mb-1">{{ object.measurements.count }}</h4>
<small class="text-muted">Historical data will be lost</small>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card border-danger">
<div class="card-body text-center">
<i class="fas fa-exclamation-triangle fa-2x text-danger mb-2"></i>
<h4 class="text-danger mb-1">
{% if object.regulatory_requirement %}YES{% else %}NO{% endif %}
</h4>
<small class="text-muted">Regulatory requirement</small>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Restrictions -->
{% if object.measurements.count > 0 or object.regulatory_requirement %}
<div class="alert alert-warning" role="alert">
<h6 class="alert-heading">
<i class="fas fa-shield-alt me-2"></i>Deletion Restrictions
</h6>
<ul class="mb-0">
{% if object.measurements.count > 0 %}
<li>This indicator has <strong>{{ object.measurements.count }} measurement(s)</strong> that will be permanently deleted</li>
{% endif %}
{% if object.regulatory_requirement %}
<li>This is a <strong>regulatory requirement</strong> - deletion may affect compliance</li>
{% endif %}
</ul>
</div>
{% endif %}
<!-- Alternative Actions -->
<div class="row mb-4">
<div class="col-12">
<h6 class="text-muted mb-3">Alternative Actions:</h6>
<div class="row g-3">
<div class="col-md-6">
<div class="card border-success">
<div class="card-body">
<h6 class="card-title text-success">
<i class="fas fa-pause-circle me-2"></i>Deactivate Instead
</h6>
<p class="card-text small">Keep the indicator and its data but mark it as inactive. This preserves historical data while stopping new measurements.</p>
<button type="button" class="btn btn-outline-success btn-sm" onclick="deactivateIndicator()">
<i class="fas fa-pause me-2"></i>Deactivate Indicator
</button>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card border-info">
<div class="card-body">
<h6 class="card-title text-info">
<i class="fas fa-archive me-2"></i>Archive Data
</h6>
<p class="card-text small">Export all measurement data before deletion to maintain historical records for compliance or analysis.</p>
<button type="button" class="btn btn-outline-info btn-sm" onclick="exportData()">
<i class="fas fa-download me-2"></i>Export Data First
</button>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Confirmation Form -->
<form method="post" id="deleteForm">
{% csrf_token %}
<!-- Confirmation Checkbox -->
<div class="form-check mb-3">
<input class="form-check-input" type="checkbox" id="confirmDeletion" required>
<label class="form-check-label" for="confirmDeletion">
I understand that this action will permanently delete the quality indicator
"<strong>{{ object.name }}</strong>" and all {{ object.measurements.count }} associated measurement(s).
</label>
</div>
{% if object.regulatory_requirement %}
<div class="form-check mb-3">
<input class="form-check-input" type="checkbox" id="confirmRegulatory" required>
<label class="form-check-label" for="confirmRegulatory">
I acknowledge that this is a regulatory requirement and deletion may affect compliance.
</label>
</div>
{% endif %}
<!-- Reason for Deletion -->
<div class="mb-3">
<label for="deletionReason" class="form-label">Reason for Deletion *</label>
<textarea class="form-control" id="deletionReason" name="deletion_reason" rows="3"
placeholder="Please provide a reason for deleting this quality indicator..." required></textarea>
<div class="form-text">This reason will be logged for audit purposes.</div>
</div>
<!-- Form Actions -->
<div class="d-flex justify-content-between">
<a href="{% url 'quality:quality_indicator_detail' object.pk %}" class="btn btn-outline-secondary">
<i class="fas fa-times me-2"></i>Cancel
</a>
<button type="submit" class="btn btn-danger" id="deleteButton" disabled>
<i class="fas fa-trash me-2"></i>Delete Quality Indicator
</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
<script>
// Form validation and confirmation
document.addEventListener('DOMContentLoaded', function() {
const confirmDeletion = document.getElementById('confirmDeletion');
const confirmRegulatory = document.getElementById('confirmRegulatory');
const deletionReason = document.getElementById('deletionReason');
const deleteButton = document.getElementById('deleteButton');
const deleteForm = document.getElementById('deleteForm');
function validateForm() {
const isConfirmed = confirmDeletion.checked;
const isRegulatoryConfirmed = !confirmRegulatory || confirmRegulatory.checked;
const hasReason = deletionReason.value.trim().length > 0;
deleteButton.disabled = !(isConfirmed && isRegulatoryConfirmed && hasReason);
}
// Add event listeners
confirmDeletion.addEventListener('change', validateForm);
if (confirmRegulatory) {
confirmRegulatory.addEventListener('change', validateForm);
}
deletionReason.addEventListener('input', validateForm);
// Form submission confirmation
deleteForm.addEventListener('submit', function(e) {
if (!confirm('Are you absolutely sure you want to delete this quality indicator? This action cannot be undone.')) {
e.preventDefault();
}
});
});
// Deactivate indicator instead of deleting
function deactivateIndicator() {
if (confirm('Deactivate this quality indicator instead of deleting it?')) {
fetch(`/quality/indicators/{{ object.pk }}/deactivate/`, {
method: 'POST',
headers: {
'X-CSRFToken': document.querySelector('[name=csrfmiddlewaretoken]').value,
'Content-Type': 'application/json',
},
})
.then(response => response.json())
.then(data => {
if (data.success) {
window.location.href = '{% url "quality:quality_indicator_detail" object.pk %}';
} else {
alert('Error deactivating indicator: ' + data.error);
}
});
}
}
// Export data before deletion
function exportData() {
window.location.href = `/quality/indicators/{{ object.pk }}/export/`;
}
</script>
<style>
.card {
box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
border: 1px solid rgba(0, 0, 0, 0.125);
}
.card-header {
border-bottom: 1px solid rgba(0, 0, 0, 0.125);
}
.btn {
border-radius: 0.375rem;
transition: all 0.15s ease-in-out;
}
.btn:hover:not(:disabled) {
transform: translateY(-1px);
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}
.btn:disabled {
opacity: 0.6;
cursor: not-allowed;
}
.form-check-input:checked {
background-color: #0d6efd;
border-color: #0d6efd;
}
.alert {
border-radius: 0.375rem;
}
.badge {
font-size: 0.75rem;
}
.card-body .card {
transition: transform 0.15s ease-in-out;
}
.card-body .card:hover {
transform: translateY(-2px);
}
@media (max-width: 768px) {
.d-flex.justify-content-between {
flex-direction: column;
gap: 1rem;
}
.btn-group {
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.card-body {
padding: 1rem;
}
.row.g-3 {
gap: 1rem !important;
}
}
</style>
{% endblock %}