442 lines
20 KiB
HTML
442 lines
20 KiB
HTML
{% extends 'base.html' %}
|
|
{% load static %}
|
|
|
|
{% block title %}Delete Imaging Series - {{ series.series_description|default:"Series" }} - Hospital Management{% endblock %}
|
|
|
|
{% block content %}
|
|
<div class="content">
|
|
<div class="container-fluid">
|
|
<!-- Page Header -->
|
|
<div class="row">
|
|
<div class="col-12">
|
|
<div class="page-header">
|
|
<div class="page-title">
|
|
<h4>Delete Imaging Series</h4>
|
|
<h6>Confirm deletion of Series {{ series.series_number }}</h6>
|
|
</div>
|
|
<div class="page-btn">
|
|
<a href="{% url 'radiology:imaging_series_detail' series.pk %}" class="btn btn-secondary">
|
|
<i class="fas fa-arrow-left me-1"></i>Back to Series
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Warning Alert -->
|
|
<div class="row mb-4">
|
|
<div class="col-12">
|
|
<div class="alert alert-danger" role="alert">
|
|
<div class="d-flex align-items-center">
|
|
<i class="fas fa-exclamation-triangle fa-2x me-3"></i>
|
|
<div>
|
|
<h5 class="alert-heading mb-1">Warning: Permanent Deletion</h5>
|
|
<p class="mb-0">This action cannot be undone. All associated images and data will be permanently deleted.</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Series Information -->
|
|
<div class="row mb-4">
|
|
<div class="col-12">
|
|
<div class="card border-danger">
|
|
<div class="card-header bg-danger text-white">
|
|
<h5 class="card-title mb-0">
|
|
<i class="fas fa-layer-group me-2"></i>Series to be Deleted
|
|
</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<div class="row">
|
|
<div class="col-md-6">
|
|
<div class="info-group">
|
|
<label class="form-label">Series Number:</label>
|
|
<p class="fw-bold">{{ series.series_number }}</p>
|
|
</div>
|
|
<div class="info-group">
|
|
<label class="form-label">Series Description:</label>
|
|
<p>{{ series.series_description|default:"No description" }}</p>
|
|
</div>
|
|
<div class="info-group">
|
|
<label class="form-label">Protocol Name:</label>
|
|
<p>{{ series.protocol_name|default:"N/A" }}</p>
|
|
</div>
|
|
<div class="info-group">
|
|
<label class="form-label">Modality:</label>
|
|
<p><span class="badge bg-primary">{{ series.get_modality_display }}</span></p>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<div class="info-group">
|
|
<label class="form-label">Series Instance UID:</label>
|
|
<p class="text-monospace small">{{ series.series_instance_uid }}</p>
|
|
</div>
|
|
<div class="info-group">
|
|
<label class="form-label">Series Date:</label>
|
|
<p>{{ series.series_date|date:"F d, Y" }}</p>
|
|
</div>
|
|
<div class="info-group">
|
|
<label class="form-label">Series Time:</label>
|
|
<p>{{ series.series_time|time:"H:i:s" }}</p>
|
|
</div>
|
|
<div class="info-group">
|
|
<label class="form-label">Number of Images:</label>
|
|
<p class="fw-bold text-danger">{{ series.number_of_images|default:0 }}</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Study Context -->
|
|
<div class="row mb-4">
|
|
<div class="col-12">
|
|
<div class="card">
|
|
<div class="card-header">
|
|
<h5 class="card-title">
|
|
<i class="fas fa-folder-open me-2"></i>Study Context
|
|
</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<div class="row">
|
|
<div class="col-md-3">
|
|
<div class="info-group">
|
|
<label class="form-label">Patient:</label>
|
|
<p class="fw-bold">{{ series.study.patient.get_full_name }}</p>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-3">
|
|
<div class="info-group">
|
|
<label class="form-label">Study Description:</label>
|
|
<p>{{ series.study.study_description }}</p>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-3">
|
|
<div class="info-group">
|
|
<label class="form-label">Accession Number:</label>
|
|
<p>{{ series.study.accession_number }}</p>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-3">
|
|
<div class="info-group">
|
|
<label class="form-label">Study Date:</label>
|
|
<p>{{ series.study.study_date|date:"M d, Y" }}</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Impact Analysis -->
|
|
<div class="row mb-4">
|
|
<div class="col-12">
|
|
<div class="card border-warning">
|
|
<div class="card-header bg-warning">
|
|
<h5 class="card-title mb-0">
|
|
<i class="fas fa-exclamation-circle me-2"></i>Deletion Impact Analysis
|
|
</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<div class="row">
|
|
<div class="col-md-6">
|
|
<h6 class="text-danger">Data to be Deleted:</h6>
|
|
<ul class="list-unstyled">
|
|
<li><i class="fas fa-times text-danger me-2"></i>{{ series.number_of_images|default:0 }} DICOM images</li>
|
|
<li><i class="fas fa-times text-danger me-2"></i>Series metadata and technical parameters</li>
|
|
<li><i class="fas fa-times text-danger me-2"></i>Associated annotations and measurements</li>
|
|
<li><i class="fas fa-times text-danger me-2"></i>Processing history and logs</li>
|
|
{% if series.reports.exists %}
|
|
<li><i class="fas fa-times text-danger me-2"></i>{{ series.reports.count }} associated report(s)</li>
|
|
{% endif %}
|
|
</ul>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<h6 class="text-info">What will remain:</h6>
|
|
<ul class="list-unstyled">
|
|
<li><i class="fas fa-check text-success me-2"></i>Parent study will remain intact</li>
|
|
<li><i class="fas fa-check text-success me-2"></i>Other series in the study</li>
|
|
<li><i class="fas fa-check text-success me-2"></i>Patient information</li>
|
|
<li><i class="fas fa-check text-success me-2"></i>Study-level reports</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
{% if blocking_conditions %}
|
|
<div class="alert alert-danger mt-3">
|
|
<h6 class="alert-heading">
|
|
<i class="fas fa-ban me-2"></i>Deletion Blocked
|
|
</h6>
|
|
<p class="mb-2">This series cannot be deleted due to the following conditions:</p>
|
|
<ul class="mb-0">
|
|
{% for condition in blocking_conditions %}
|
|
<li>{{ condition }}</li>
|
|
{% endfor %}
|
|
</ul>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Alternative Actions -->
|
|
{% if not blocking_conditions %}
|
|
<div class="row mb-4">
|
|
<div class="col-12">
|
|
<div class="card">
|
|
<div class="card-header">
|
|
<h5 class="card-title">
|
|
<i class="fas fa-lightbulb me-2"></i>Alternative Actions
|
|
</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<p class="text-muted mb-3">Consider these alternatives before permanently deleting the series:</p>
|
|
<div class="row">
|
|
<div class="col-md-6">
|
|
<div class="alternative-action">
|
|
<h6><i class="fas fa-archive text-warning me-2"></i>Archive Series</h6>
|
|
<p class="text-muted">Move the series to archive storage instead of deleting</p>
|
|
<button class="btn btn-outline-warning btn-sm" onclick="archiveSeries()">
|
|
<i class="fas fa-archive me-1"></i>Archive Instead
|
|
</button>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<div class="alternative-action">
|
|
<h6><i class="fas fa-download text-info me-2"></i>Backup First</h6>
|
|
<p class="text-muted">Download a backup before deletion</p>
|
|
<a href="{% url 'radiology:imaging_series_download' series.pk %}"
|
|
class="btn btn-outline-info btn-sm">
|
|
<i class="fas fa-download me-1"></i>Download Backup
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
<!-- Confirmation Form -->
|
|
{% if not blocking_conditions %}
|
|
<div class="row">
|
|
<div class="col-12">
|
|
<div class="card border-danger">
|
|
<div class="card-header bg-danger text-white">
|
|
<h5 class="card-title mb-0">
|
|
<i class="fas fa-trash me-2"></i>Confirm Deletion
|
|
</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<form method="post" id="delete-form">
|
|
{% csrf_token %}
|
|
|
|
<div class="form-group mb-3">
|
|
<label class="form-label">
|
|
<strong>Type "DELETE" to confirm:</strong>
|
|
</label>
|
|
<input type="text" class="form-control" id="confirmation-input"
|
|
placeholder="Type DELETE to confirm deletion" required>
|
|
<small class="form-text text-muted">
|
|
This confirmation is required to prevent accidental deletion.
|
|
</small>
|
|
</div>
|
|
|
|
<div class="form-group mb-3">
|
|
<label class="form-label">Reason for Deletion:</label>
|
|
<select class="form-select" name="deletion_reason" required>
|
|
<option value="">Select a reason...</option>
|
|
<option value="duplicate">Duplicate series</option>
|
|
<option value="poor_quality">Poor image quality</option>
|
|
<option value="wrong_patient">Wrong patient</option>
|
|
<option value="technical_error">Technical error</option>
|
|
<option value="patient_request">Patient request</option>
|
|
<option value="other">Other</option>
|
|
</select>
|
|
</div>
|
|
|
|
<div class="form-group mb-4">
|
|
<label class="form-label">Additional Notes:</label>
|
|
<textarea class="form-control" name="deletion_notes" rows="3"
|
|
placeholder="Optional: Provide additional details about the deletion..."></textarea>
|
|
</div>
|
|
|
|
<div class="form-check mb-4">
|
|
<input class="form-check-input" type="checkbox" id="confirm-understanding" required>
|
|
<label class="form-check-label" for="confirm-understanding">
|
|
<strong>I understand that this action is permanent and cannot be undone</strong>
|
|
</label>
|
|
</div>
|
|
|
|
<div class="d-flex justify-content-between align-items-center">
|
|
<div class="action-buttons">
|
|
<a href="{% url 'radiology:imaging_series_detail' series.pk %}"
|
|
class="btn btn-secondary me-2">
|
|
<i class="fas fa-times me-1"></i>Cancel
|
|
</a>
|
|
<button type="button" class="btn btn-outline-warning me-2" onclick="archiveSeries()">
|
|
<i class="fas fa-archive me-1"></i>Archive Instead
|
|
</button>
|
|
</div>
|
|
<div class="danger-actions">
|
|
<button type="submit" class="btn btn-danger" id="delete-btn" disabled>
|
|
<i class="fas fa-trash me-1"></i>Permanently Delete Series
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% else %}
|
|
<!-- Blocked Deletion Actions -->
|
|
<div class="row">
|
|
<div class="col-12">
|
|
<div class="card">
|
|
<div class="card-body text-center">
|
|
<i class="fas fa-ban fa-3x text-danger mb-3"></i>
|
|
<h5 class="text-danger">Deletion Not Allowed</h5>
|
|
<p class="text-muted">This series cannot be deleted due to the conditions listed above.</p>
|
|
<a href="{% url 'radiology:imaging_series_detail' series.pk %}" class="btn btn-primary">
|
|
<i class="fas fa-arrow-left me-1"></i>Return to Series
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
|
|
<script>
|
|
$(document).ready(function() {
|
|
// Enable delete button only when conditions are met
|
|
$('#confirmation-input, #confirm-understanding').on('input change', function() {
|
|
validateForm();
|
|
});
|
|
|
|
// Form submission validation
|
|
$('#delete-form').on('submit', function(e) {
|
|
if (!validateForm()) {
|
|
e.preventDefault();
|
|
alert('Please complete all required fields and confirmations.');
|
|
} else {
|
|
if (!confirm('Are you absolutely sure you want to permanently delete this imaging series? This action cannot be undone.')) {
|
|
e.preventDefault();
|
|
}
|
|
}
|
|
});
|
|
});
|
|
|
|
function validateForm() {
|
|
const confirmationText = $('#confirmation-input').val().trim().toUpperCase();
|
|
const confirmationChecked = $('#confirm-understanding').is(':checked');
|
|
const reasonSelected = $('select[name="deletion_reason"]').val();
|
|
|
|
const isValid = confirmationText === 'DELETE' && confirmationChecked && reasonSelected;
|
|
|
|
$('#delete-btn').prop('disabled', !isValid);
|
|
|
|
if (isValid) {
|
|
$('#delete-btn').removeClass('btn-outline-danger').addClass('btn-danger');
|
|
} else {
|
|
$('#delete-btn').removeClass('btn-danger').addClass('btn-outline-danger');
|
|
}
|
|
|
|
return isValid;
|
|
}
|
|
|
|
function archiveSeries() {
|
|
if (confirm('Archive this series instead of deleting it?')) {
|
|
// AJAX call to archive series
|
|
$.ajax({
|
|
url: '{% url "radiology:imaging_series_archive" series.pk %}',
|
|
method: 'POST',
|
|
data: {
|
|
'csrfmiddlewaretoken': $('[name=csrfmiddlewaretoken]').val()
|
|
},
|
|
success: function(response) {
|
|
alert('Series has been archived successfully.');
|
|
window.location.href = '{% url "radiology:imaging_series_list" series.study.pk %}';
|
|
},
|
|
error: function() {
|
|
alert('Error archiving series. Please try again.');
|
|
}
|
|
});
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style>
|
|
.info-group {
|
|
margin-bottom: 15px;
|
|
}
|
|
|
|
.info-group .form-label {
|
|
font-weight: 600;
|
|
color: #495057;
|
|
margin-bottom: 5px;
|
|
}
|
|
|
|
.info-group p {
|
|
margin-bottom: 0;
|
|
color: #6c757d;
|
|
}
|
|
|
|
.alternative-action {
|
|
padding: 15px;
|
|
border: 1px solid #e9ecef;
|
|
border-radius: 5px;
|
|
margin-bottom: 15px;
|
|
}
|
|
|
|
.alternative-action h6 {
|
|
margin-bottom: 10px;
|
|
}
|
|
|
|
.alternative-action p {
|
|
margin-bottom: 10px;
|
|
font-size: 14px;
|
|
}
|
|
|
|
.action-buttons .btn {
|
|
margin-right: 10px;
|
|
}
|
|
|
|
.danger-actions {
|
|
margin-left: auto;
|
|
}
|
|
|
|
#delete-btn:disabled {
|
|
opacity: 0.6;
|
|
cursor: not-allowed;
|
|
}
|
|
|
|
/* Mobile Responsive */
|
|
@media (max-width: 768px) {
|
|
.d-flex.justify-content-between {
|
|
flex-direction: column;
|
|
gap: 15px;
|
|
}
|
|
|
|
.action-buttons {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 10px;
|
|
}
|
|
|
|
.action-buttons .btn {
|
|
margin-right: 0;
|
|
}
|
|
}
|
|
</style>
|
|
{% endblock %}
|
|
|