1121 lines
35 KiB
HTML
1121 lines
35 KiB
HTML
{% extends 'base.html' %}
|
|
{% load static %}
|
|
|
|
{% block title %}Delete Risk Assessment - {{ assessment.title }}{% endblock %}
|
|
|
|
{% block extra_css %}
|
|
<style>
|
|
.delete-header {
|
|
background: linear-gradient(135deg, #dc3545 0%, #c82333 100%);
|
|
color: white;
|
|
border-radius: 0.5rem;
|
|
padding: 2rem;
|
|
margin-bottom: 2rem;
|
|
}
|
|
|
|
.delete-layout {
|
|
display: grid;
|
|
grid-template-columns: 2fr 1fr;
|
|
gap: 2rem;
|
|
margin-bottom: 2rem;
|
|
}
|
|
|
|
.delete-main {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 2rem;
|
|
}
|
|
|
|
.delete-sidebar {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 1.5rem;
|
|
}
|
|
|
|
.section-card {
|
|
background: white;
|
|
border: 1px solid #dee2e6;
|
|
border-radius: 0.5rem;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.section-header {
|
|
background: #f8f9fa;
|
|
border-bottom: 1px solid #dee2e6;
|
|
padding: 1rem 1.5rem;
|
|
font-weight: 600;
|
|
color: #495057;
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.5rem;
|
|
}
|
|
|
|
.section-content {
|
|
padding: 1.5rem;
|
|
}
|
|
|
|
.warning-box {
|
|
background: #fff3cd;
|
|
border: 1px solid #ffeaa7;
|
|
border-left: 4px solid #ffc107;
|
|
border-radius: 0.375rem;
|
|
padding: 1rem;
|
|
margin-bottom: 1.5rem;
|
|
}
|
|
|
|
.warning-icon {
|
|
color: #856404;
|
|
font-size: 1.25rem;
|
|
margin-right: 0.5rem;
|
|
}
|
|
|
|
.warning-title {
|
|
font-weight: 600;
|
|
color: #856404;
|
|
margin-bottom: 0.5rem;
|
|
}
|
|
|
|
.warning-text {
|
|
color: #856404;
|
|
margin: 0;
|
|
}
|
|
|
|
.danger-box {
|
|
background: #f8d7da;
|
|
border: 1px solid #f5c6cb;
|
|
border-left: 4px solid #dc3545;
|
|
border-radius: 0.375rem;
|
|
padding: 1rem;
|
|
margin-bottom: 1.5rem;
|
|
}
|
|
|
|
.danger-icon {
|
|
color: #721c24;
|
|
font-size: 1.25rem;
|
|
margin-right: 0.5rem;
|
|
}
|
|
|
|
.danger-title {
|
|
font-weight: 600;
|
|
color: #721c24;
|
|
margin-bottom: 0.5rem;
|
|
}
|
|
|
|
.danger-text {
|
|
color: #721c24;
|
|
margin: 0;
|
|
}
|
|
|
|
.assessment-info {
|
|
display: grid;
|
|
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
|
|
gap: 1rem;
|
|
margin-bottom: 1.5rem;
|
|
}
|
|
|
|
.info-item {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 0.25rem;
|
|
}
|
|
|
|
.info-label {
|
|
font-size: 0.75rem;
|
|
color: #6c757d;
|
|
font-weight: 600;
|
|
text-transform: uppercase;
|
|
}
|
|
|
|
.info-value {
|
|
font-size: 0.875rem;
|
|
color: #495057;
|
|
font-weight: 500;
|
|
}
|
|
|
|
.risk-level-badge {
|
|
padding: 0.375rem 0.75rem;
|
|
border-radius: 0.25rem;
|
|
font-size: 0.75rem;
|
|
font-weight: 600;
|
|
text-transform: uppercase;
|
|
display: inline-block;
|
|
}
|
|
|
|
.risk-critical { background: #dc3545; color: white; }
|
|
.risk-high { background: #fd7e14; color: white; }
|
|
.risk-medium { background: #ffc107; color: #212529; }
|
|
.risk-low { background: #28a745; color: white; }
|
|
|
|
.impact-list {
|
|
list-style: none;
|
|
padding: 0;
|
|
margin: 0;
|
|
}
|
|
|
|
.impact-item {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.75rem;
|
|
padding: 0.75rem;
|
|
border-bottom: 1px solid #f0f0f0;
|
|
transition: background 0.2s;
|
|
}
|
|
|
|
.impact-item:hover {
|
|
background: #f8f9fa;
|
|
}
|
|
|
|
.impact-item:last-child {
|
|
border-bottom: none;
|
|
}
|
|
|
|
.impact-icon {
|
|
width: 32px;
|
|
height: 32px;
|
|
border-radius: 50%;
|
|
background: #dc3545;
|
|
color: white;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
font-size: 0.875rem;
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
.impact-content {
|
|
flex: 1;
|
|
}
|
|
|
|
.impact-title {
|
|
font-weight: 600;
|
|
color: #495057;
|
|
margin-bottom: 0.25rem;
|
|
}
|
|
|
|
.impact-description {
|
|
font-size: 0.875rem;
|
|
color: #6c757d;
|
|
}
|
|
|
|
.impact-count {
|
|
font-size: 0.875rem;
|
|
font-weight: 600;
|
|
color: #dc3545;
|
|
background: #fff5f5;
|
|
padding: 0.25rem 0.5rem;
|
|
border-radius: 0.25rem;
|
|
}
|
|
|
|
.mitigation-item {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.75rem;
|
|
padding: 0.75rem;
|
|
border: 1px solid #dee2e6;
|
|
border-radius: 0.375rem;
|
|
margin-bottom: 0.75rem;
|
|
background: white;
|
|
transition: all 0.2s;
|
|
}
|
|
|
|
.mitigation-item:hover {
|
|
border-color: #dc3545;
|
|
background: #fff5f5;
|
|
}
|
|
|
|
.mitigation-icon {
|
|
width: 32px;
|
|
height: 32px;
|
|
border-radius: 0.375rem;
|
|
background: #dc3545;
|
|
color: white;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
font-size: 0.875rem;
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
.mitigation-info {
|
|
flex: 1;
|
|
}
|
|
|
|
.mitigation-title {
|
|
font-weight: 600;
|
|
color: #495057;
|
|
margin-bottom: 0.25rem;
|
|
}
|
|
|
|
.mitigation-meta {
|
|
font-size: 0.75rem;
|
|
color: #6c757d;
|
|
}
|
|
|
|
.mitigation-status {
|
|
font-size: 0.75rem;
|
|
font-weight: 600;
|
|
color: #28a745;
|
|
}
|
|
|
|
.team-member {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.75rem;
|
|
padding: 0.75rem;
|
|
border-bottom: 1px solid #f0f0f0;
|
|
transition: background 0.2s;
|
|
}
|
|
|
|
.team-member:hover {
|
|
background: #f8f9fa;
|
|
}
|
|
|
|
.member-avatar {
|
|
width: 40px;
|
|
height: 40px;
|
|
border-radius: 50%;
|
|
background: #dc3545;
|
|
color: white;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
font-weight: 600;
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
.member-info {
|
|
flex: 1;
|
|
}
|
|
|
|
.member-name {
|
|
font-weight: 600;
|
|
color: #495057;
|
|
margin-bottom: 0.25rem;
|
|
}
|
|
|
|
.member-role {
|
|
font-size: 0.75rem;
|
|
color: #6c757d;
|
|
}
|
|
|
|
.confirmation-section {
|
|
background: #f8f9fa;
|
|
border: 2px solid #dee2e6;
|
|
border-radius: 0.5rem;
|
|
padding: 1.5rem;
|
|
margin-bottom: 2rem;
|
|
}
|
|
|
|
.confirmation-title {
|
|
font-size: 1.25rem;
|
|
font-weight: 600;
|
|
color: #495057;
|
|
margin-bottom: 1rem;
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.5rem;
|
|
}
|
|
|
|
.confirmation-steps {
|
|
list-style: none;
|
|
padding: 0;
|
|
margin: 0;
|
|
}
|
|
|
|
.confirmation-step {
|
|
display: flex;
|
|
align-items: start;
|
|
gap: 0.75rem;
|
|
margin-bottom: 1rem;
|
|
padding: 0.75rem;
|
|
background: white;
|
|
border-radius: 0.375rem;
|
|
border: 1px solid #dee2e6;
|
|
}
|
|
|
|
.step-number {
|
|
width: 24px;
|
|
height: 24px;
|
|
border-radius: 50%;
|
|
background: #dc3545;
|
|
color: white;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
font-size: 0.75rem;
|
|
font-weight: 600;
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
.step-content {
|
|
flex: 1;
|
|
}
|
|
|
|
.step-title {
|
|
font-weight: 600;
|
|
color: #495057;
|
|
margin-bottom: 0.25rem;
|
|
}
|
|
|
|
.step-description {
|
|
font-size: 0.875rem;
|
|
color: #6c757d;
|
|
}
|
|
|
|
.confirmation-checkbox {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.75rem;
|
|
padding: 1rem;
|
|
background: #fff5f5;
|
|
border: 2px solid #dc3545;
|
|
border-radius: 0.375rem;
|
|
margin-bottom: 1.5rem;
|
|
}
|
|
|
|
.confirmation-checkbox input[type="checkbox"] {
|
|
width: 20px;
|
|
height: 20px;
|
|
accent-color: #dc3545;
|
|
}
|
|
|
|
.confirmation-text {
|
|
font-weight: 600;
|
|
color: #721c24;
|
|
}
|
|
|
|
.delete-actions {
|
|
background: white;
|
|
border: 1px solid #dee2e6;
|
|
border-radius: 0.5rem;
|
|
padding: 1.5rem;
|
|
display: flex;
|
|
justify-content: between;
|
|
align-items: center;
|
|
gap: 1rem;
|
|
}
|
|
|
|
.btn-group {
|
|
display: flex;
|
|
gap: 0.5rem;
|
|
}
|
|
|
|
.alternative-actions {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 0.5rem;
|
|
}
|
|
|
|
.alternative-text {
|
|
font-size: 0.875rem;
|
|
color: #6c757d;
|
|
margin-bottom: 0.5rem;
|
|
}
|
|
|
|
.stats-grid {
|
|
display: grid;
|
|
grid-template-columns: repeat(2, 1fr);
|
|
gap: 1rem;
|
|
}
|
|
|
|
.stat-item {
|
|
text-align: center;
|
|
padding: 1rem;
|
|
background: #f8f9fa;
|
|
border-radius: 0.375rem;
|
|
}
|
|
|
|
.stat-number {
|
|
font-size: 1.5rem;
|
|
font-weight: bold;
|
|
color: #dc3545;
|
|
margin-bottom: 0.25rem;
|
|
}
|
|
|
|
.stat-label {
|
|
font-size: 0.75rem;
|
|
color: #6c757d;
|
|
font-weight: 600;
|
|
text-transform: uppercase;
|
|
}
|
|
|
|
.risk-matrix-preview {
|
|
display: grid;
|
|
grid-template-columns: repeat(2, 1fr);
|
|
gap: 1rem;
|
|
margin-bottom: 1rem;
|
|
}
|
|
|
|
.matrix-item {
|
|
text-align: center;
|
|
padding: 1rem;
|
|
background: #f8f9fa;
|
|
border-radius: 0.375rem;
|
|
}
|
|
|
|
.matrix-value {
|
|
font-size: 1.5rem;
|
|
font-weight: bold;
|
|
color: #dc3545;
|
|
margin-bottom: 0.25rem;
|
|
}
|
|
|
|
.matrix-label {
|
|
font-size: 0.75rem;
|
|
color: #6c757d;
|
|
font-weight: 600;
|
|
text-transform: uppercase;
|
|
}
|
|
|
|
@media (max-width: 1200px) {
|
|
.delete-layout {
|
|
grid-template-columns: 1fr;
|
|
gap: 1.5rem;
|
|
}
|
|
|
|
.delete-sidebar {
|
|
order: -1;
|
|
}
|
|
}
|
|
|
|
@media (max-width: 768px) {
|
|
.delete-header {
|
|
padding: 1.5rem;
|
|
}
|
|
|
|
.assessment-info {
|
|
grid-template-columns: 1fr;
|
|
}
|
|
|
|
.stats-grid {
|
|
grid-template-columns: 1fr;
|
|
}
|
|
|
|
.risk-matrix-preview {
|
|
grid-template-columns: 1fr;
|
|
}
|
|
|
|
.delete-actions {
|
|
flex-direction: column;
|
|
align-items: stretch;
|
|
}
|
|
|
|
.btn-group {
|
|
justify-content: center;
|
|
}
|
|
}
|
|
|
|
@media print {
|
|
.delete-sidebar, .delete-actions {
|
|
display: none !important;
|
|
}
|
|
|
|
.delete-layout {
|
|
grid-template-columns: 1fr;
|
|
}
|
|
|
|
.section-header {
|
|
background: none;
|
|
border-bottom: 2px solid #000;
|
|
color: #000;
|
|
}
|
|
}
|
|
</style>
|
|
{% endblock %}
|
|
|
|
{% block content %}
|
|
<div id="content" class="app-content">
|
|
<!-- Page Header -->
|
|
<div class="d-flex align-items-center mb-3">
|
|
<div>
|
|
<ol class="breadcrumb">
|
|
<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:risk_assessment_list' %}">Risk Assessments</a></li>
|
|
<li class="breadcrumb-item"><a href="{% url 'quality:risk_assessment_detail' assessment.id %}">{{ assessment.title|truncatechars:20 }}</a></li>
|
|
<li class="breadcrumb-item active">Delete</li>
|
|
</ol>
|
|
<h1 class="page-header mb-0">
|
|
<i class="fas fa-trash me-2"></i>Delete Risk Assessment
|
|
</h1>
|
|
</div>
|
|
<div class="ms-auto">
|
|
<a href="{% url 'quality:risk_assessment_detail' assessment.id %}" class="btn btn-outline-secondary">
|
|
<i class="fas fa-arrow-left me-1"></i>Back to Assessment
|
|
</a>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Delete Header -->
|
|
<div class="delete-header">
|
|
<div class="row align-items-center">
|
|
<div class="col-md-8">
|
|
<h2 class="mb-2">
|
|
<i class="fas fa-exclamation-triangle me-2"></i>
|
|
Delete Risk Assessment: {{ assessment.title }}
|
|
</h2>
|
|
<p class="mb-0">This action will permanently delete the risk assessment and all associated data. Please review the impact before proceeding.</p>
|
|
</div>
|
|
<div class="col-md-4 text-md-end">
|
|
<div class="stats-grid">
|
|
<div class="stat-item">
|
|
<div class="stat-number">{{ assessment.mitigation_actions.count|default:0 }}</div>
|
|
<div class="stat-label">Mitigations</div>
|
|
</div>
|
|
<div class="stat-item">
|
|
<div class="stat-number">{{ assessment.team_members.count|default:0 }}</div>
|
|
<div class="stat-label">Team Members</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="delete-layout">
|
|
<!-- Main Content -->
|
|
<div class="delete-main">
|
|
<!-- Warning Messages -->
|
|
<div class="danger-box">
|
|
<div class="d-flex align-items-start">
|
|
<i class="fas fa-exclamation-triangle danger-icon"></i>
|
|
<div>
|
|
<div class="danger-title">Permanent Deletion Warning</div>
|
|
<div class="danger-text">
|
|
This action cannot be undone. All assessment data, including risk analysis,
|
|
mitigation actions, team assignments, and historical records will be permanently deleted.
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{% if assessment.status == 'approved' %}
|
|
<div class="warning-box">
|
|
<div class="d-flex align-items-start">
|
|
<i class="fas fa-exclamation-circle warning-icon"></i>
|
|
<div>
|
|
<div class="warning-title">Approved Assessment Warning</div>
|
|
<div class="warning-text">
|
|
This assessment has been approved and is part of your organization's risk management framework.
|
|
Consider archiving instead of deleting to preserve compliance records.
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
<!-- Assessment Information -->
|
|
<div class="section-card">
|
|
<div class="section-header">
|
|
<i class="fas fa-info-circle"></i>
|
|
Assessment Information
|
|
</div>
|
|
<div class="section-content">
|
|
<div class="assessment-info">
|
|
<div class="info-item">
|
|
<div class="info-label">Assessment Title</div>
|
|
<div class="info-value">{{ assessment.title }}</div>
|
|
</div>
|
|
|
|
<div class="info-item">
|
|
<div class="info-label">Assessment ID</div>
|
|
<div class="info-value">{{ assessment.assessment_id|default:assessment.id }}</div>
|
|
</div>
|
|
|
|
<div class="info-item">
|
|
<div class="info-label">Risk Level</div>
|
|
<div class="info-value">
|
|
<span class="risk-level-badge risk-{{ assessment.risk_level|lower }}">
|
|
{{ assessment.get_risk_level_display }}
|
|
</span>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="info-item">
|
|
<div class="info-label">Department</div>
|
|
<div class="info-value">{{ assessment.department.name|default:"Not specified" }}</div>
|
|
</div>
|
|
|
|
<div class="info-item">
|
|
<div class="info-label">Assessor</div>
|
|
<div class="info-value">{{ assessment.assessor.get_full_name|default:"Not assigned" }}</div>
|
|
</div>
|
|
|
|
<div class="info-item">
|
|
<div class="info-label">Status</div>
|
|
<div class="info-value">{{ assessment.get_status_display }}</div>
|
|
</div>
|
|
|
|
<div class="info-item">
|
|
<div class="info-label">Created</div>
|
|
<div class="info-value">{{ assessment.created_at|date:"M d, Y" }}</div>
|
|
</div>
|
|
|
|
<div class="info-item">
|
|
<div class="info-label">Last Updated</div>
|
|
<div class="info-value">{{ assessment.updated_at|date:"M d, Y" }}</div>
|
|
</div>
|
|
|
|
<div class="info-item">
|
|
<div class="info-label">Risk Score</div>
|
|
<div class="info-value">{{ assessment.risk_score|default:"Not calculated" }}</div>
|
|
</div>
|
|
|
|
<div class="info-item">
|
|
<div class="info-label">Next Review</div>
|
|
<div class="info-value">{{ assessment.next_review_date|date:"M d, Y"|default:"Not scheduled" }}</div>
|
|
</div>
|
|
</div>
|
|
|
|
{% if assessment.description %}
|
|
<div class="mt-3">
|
|
<div class="info-label">Description</div>
|
|
<div class="info-value">{{ assessment.description }}</div>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Impact Analysis -->
|
|
<div class="section-card">
|
|
<div class="section-header">
|
|
<i class="fas fa-chart-line"></i>
|
|
Deletion Impact Analysis
|
|
</div>
|
|
<div class="section-content">
|
|
<ul class="impact-list">
|
|
<li class="impact-item">
|
|
<div class="impact-icon">
|
|
<i class="fas fa-shield-alt"></i>
|
|
</div>
|
|
<div class="impact-content">
|
|
<div class="impact-title">Mitigation Actions</div>
|
|
<div class="impact-description">
|
|
{{ assessment.mitigation_actions.count }} mitigation action{{ assessment.mitigation_actions.count|pluralize }} will be permanently deleted
|
|
</div>
|
|
</div>
|
|
<div class="impact-count">{{ assessment.mitigation_actions.count }}</div>
|
|
</li>
|
|
|
|
<li class="impact-item">
|
|
<div class="impact-icon">
|
|
<i class="fas fa-users"></i>
|
|
</div>
|
|
<div class="impact-content">
|
|
<div class="impact-title">Team Access</div>
|
|
<div class="impact-description">
|
|
{{ assessment.team_members.count|default:0 }} team member{{ assessment.team_members.count|pluralize }} will lose access to this assessment
|
|
</div>
|
|
</div>
|
|
<div class="impact-count">{{ assessment.team_members.count|default:0 }}</div>
|
|
</li>
|
|
|
|
<li class="impact-item">
|
|
<div class="impact-icon">
|
|
<i class="fas fa-bell"></i>
|
|
</div>
|
|
<div class="impact-content">
|
|
<div class="impact-title">Active Alerts</div>
|
|
<div class="impact-description">
|
|
All configured alerts and notifications will be removed
|
|
</div>
|
|
</div>
|
|
<div class="impact-count">{{ assessment.alerts.count|default:0 }}</div>
|
|
</li>
|
|
|
|
<li class="impact-item">
|
|
<div class="impact-icon">
|
|
<i class="fas fa-file-alt"></i>
|
|
</div>
|
|
<div class="impact-content">
|
|
<div class="impact-title">Documents & Reports</div>
|
|
<div class="impact-description">
|
|
Associated documents and historical reports will no longer be accessible
|
|
</div>
|
|
</div>
|
|
<div class="impact-count">{{ assessment.documents.count|default:0 }}</div>
|
|
</li>
|
|
|
|
<li class="impact-item">
|
|
<div class="impact-icon">
|
|
<i class="fas fa-history"></i>
|
|
</div>
|
|
<div class="impact-content">
|
|
<div class="impact-title">Activity History</div>
|
|
<div class="impact-description">
|
|
Complete activity timeline and audit trail will be permanently deleted
|
|
</div>
|
|
</div>
|
|
<div class="impact-count">{{ assessment.activities.count|default:0 }}</div>
|
|
</li>
|
|
|
|
<li class="impact-item">
|
|
<div class="impact-icon">
|
|
<i class="fas fa-chart-bar"></i>
|
|
</div>
|
|
<div class="impact-content">
|
|
<div class="impact-title">Risk Analytics</div>
|
|
<div class="impact-description">
|
|
Risk trend data and performance metrics will be lost
|
|
</div>
|
|
</div>
|
|
<div class="impact-count">∞</div>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Confirmation Steps -->
|
|
<div class="confirmation-section">
|
|
<div class="confirmation-title">
|
|
<i class="fas fa-clipboard-check"></i>
|
|
Deletion Confirmation Process
|
|
</div>
|
|
|
|
<ol class="confirmation-steps">
|
|
<li class="confirmation-step">
|
|
<div class="step-number">1</div>
|
|
<div class="step-content">
|
|
<div class="step-title">Review Impact</div>
|
|
<div class="step-description">
|
|
Carefully review all data that will be permanently deleted above
|
|
</div>
|
|
</div>
|
|
</li>
|
|
|
|
<li class="confirmation-step">
|
|
<div class="step-number">2</div>
|
|
<div class="step-content">
|
|
<div class="step-title">Export Data</div>
|
|
<div class="step-description">
|
|
Export assessment data and reports for backup before deletion
|
|
</div>
|
|
</div>
|
|
</li>
|
|
|
|
<li class="confirmation-step">
|
|
<div class="step-number">3</div>
|
|
<div class="step-content">
|
|
<div class="step-title">Notify Team</div>
|
|
<div class="step-description">
|
|
Inform team members about the assessment deletion
|
|
</div>
|
|
</div>
|
|
</li>
|
|
|
|
<li class="confirmation-step">
|
|
<div class="step-number">4</div>
|
|
<div class="step-content">
|
|
<div class="step-title">Confirm Deletion</div>
|
|
<div class="step-description">
|
|
Check the confirmation box and proceed with deletion
|
|
</div>
|
|
</div>
|
|
</li>
|
|
</ol>
|
|
|
|
<form method="post" id="delete-form">
|
|
{% csrf_token %}
|
|
|
|
<div class="confirmation-checkbox">
|
|
<input type="checkbox" id="confirm-delete" name="confirm_delete" required>
|
|
<label for="confirm-delete" class="confirmation-text">
|
|
I understand that this action cannot be undone and will permanently delete
|
|
"{{ assessment.title }}" and all associated data.
|
|
</label>
|
|
</div>
|
|
|
|
<div class="form-group">
|
|
<label class="form-label">Type assessment title to confirm:</label>
|
|
<input type="text" class="form-control" id="assessment-title-confirm"
|
|
placeholder="Enter: {{ assessment.title }}" required>
|
|
<div class="form-text">Type the exact assessment title to enable deletion</div>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Sidebar -->
|
|
<div class="delete-sidebar">
|
|
<!-- Risk Matrix -->
|
|
<div class="section-card">
|
|
<div class="section-header">
|
|
<i class="fas fa-chart-area"></i>
|
|
Risk Matrix
|
|
</div>
|
|
<div class="section-content">
|
|
<div class="risk-matrix-preview">
|
|
<div class="matrix-item">
|
|
<div class="matrix-value">{{ assessment.likelihood|default:"-" }}</div>
|
|
<div class="matrix-label">Likelihood</div>
|
|
</div>
|
|
|
|
<div class="matrix-item">
|
|
<div class="matrix-value">{{ assessment.impact|default:"-" }}</div>
|
|
<div class="matrix-label">Impact</div>
|
|
</div>
|
|
|
|
<div class="matrix-item">
|
|
<div class="matrix-value">{{ assessment.risk_score|default:"-" }}</div>
|
|
<div class="matrix-label">Risk Score</div>
|
|
</div>
|
|
|
|
<div class="matrix-item">
|
|
<div class="matrix-value">{{ assessment.residual_risk|default:"-" }}</div>
|
|
<div class="matrix-label">Residual Risk</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="assessment-info">
|
|
<div class="info-item">
|
|
<div class="info-label">Current Risk Level</div>
|
|
<div class="info-value">
|
|
<span class="risk-level-badge risk-{{ assessment.risk_level|lower }}">
|
|
{{ assessment.get_risk_level_display }}
|
|
</span>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="info-item">
|
|
<div class="info-label">Assessment Date</div>
|
|
<div class="info-value">{{ assessment.assessment_date|date:"M d, Y"|default:"Not set" }}</div>
|
|
</div>
|
|
|
|
<div class="info-item">
|
|
<div class="info-label">Next Review</div>
|
|
<div class="info-value">{{ assessment.next_review_date|date:"M d, Y"|default:"Not scheduled" }}</div>
|
|
</div>
|
|
|
|
<div class="info-item">
|
|
<div class="info-label">Days Active</div>
|
|
<div class="info-value">{{ assessment.days_since_created|default:0 }}</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Mitigation Actions -->
|
|
{% if assessment.mitigation_actions.exists %}
|
|
<div class="section-card">
|
|
<div class="section-header">
|
|
<i class="fas fa-shield-alt"></i>
|
|
Mitigation Actions ({{ assessment.mitigation_actions.count }})
|
|
</div>
|
|
<div class="section-content">
|
|
{% for mitigation in assessment.mitigation_actions.all %}
|
|
<div class="mitigation-item">
|
|
<div class="mitigation-icon">
|
|
<i class="fas fa-shield-alt"></i>
|
|
</div>
|
|
<div class="mitigation-info">
|
|
<div class="mitigation-title">{{ mitigation.title|truncatechars:30 }}</div>
|
|
<div class="mitigation-meta">
|
|
Due: {{ mitigation.due_date|date:"M d, Y"|default:"Not set" }}
|
|
</div>
|
|
<div class="mitigation-status">{{ mitigation.get_status_display }}</div>
|
|
</div>
|
|
</div>
|
|
{% endfor %}
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
<!-- Team Members -->
|
|
{% if assessment.team_members.exists %}
|
|
<div class="section-card">
|
|
<div class="section-header">
|
|
<i class="fas fa-users"></i>
|
|
Affected Team Members
|
|
</div>
|
|
<div class="section-content">
|
|
{% for member in assessment.team_members.all %}
|
|
<div class="team-member">
|
|
<div class="member-avatar">
|
|
{{ member.first_name.0|upper }}{{ member.last_name.0|upper }}
|
|
</div>
|
|
<div class="member-info">
|
|
<div class="member-name">{{ member.get_full_name }}</div>
|
|
<div class="member-role">{{ member.email }}</div>
|
|
</div>
|
|
</div>
|
|
{% endfor %}
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
<!-- Alternative Actions -->
|
|
<div class="section-card">
|
|
<div class="section-header">
|
|
<i class="fas fa-lightbulb"></i>
|
|
Alternative Actions
|
|
</div>
|
|
<div class="section-content">
|
|
<div class="alternative-text">
|
|
Consider these alternatives to permanent deletion:
|
|
</div>
|
|
|
|
<div class="alternative-actions">
|
|
<button type="button" class="btn btn-outline-warning btn-sm" onclick="archiveAssessment()">
|
|
<i class="fas fa-archive me-1"></i>Archive Assessment
|
|
</button>
|
|
|
|
<button type="button" class="btn btn-outline-info btn-sm" onclick="deactivateAssessment()">
|
|
<i class="fas fa-pause me-1"></i>Deactivate Assessment
|
|
</button>
|
|
|
|
<button type="button" class="btn btn-outline-success btn-sm" onclick="exportAssessment()">
|
|
<i class="fas fa-download me-1"></i>Export Data
|
|
</button>
|
|
|
|
<a href="{% url 'quality:risk_assessment_edit' assessment.id %}" class="btn btn-outline-primary btn-sm">
|
|
<i class="fas fa-edit me-1"></i>Edit Instead
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Deletion History -->
|
|
<div class="section-card">
|
|
<div class="section-header">
|
|
<i class="fas fa-history"></i>
|
|
Recent Deletions
|
|
</div>
|
|
<div class="section-content">
|
|
{% for deleted_assessment in recent_deletions %}
|
|
<div class="mitigation-item">
|
|
<div class="mitigation-icon" style="background: #6c757d;">
|
|
<i class="fas fa-trash"></i>
|
|
</div>
|
|
<div class="mitigation-info">
|
|
<div class="mitigation-title">{{ deleted_assessment.title|truncatechars:25 }}</div>
|
|
<div class="mitigation-meta">Deleted {{ deleted_assessment.deleted_at|timesince }} ago</div>
|
|
</div>
|
|
</div>
|
|
{% empty %}
|
|
<div class="text-center py-3 text-muted">
|
|
<i class="fas fa-history fa-2x mb-2"></i>
|
|
<p>No recent deletions</p>
|
|
</div>
|
|
{% endfor %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Delete Actions -->
|
|
<div class="delete-actions">
|
|
<div class="alternative-text">
|
|
<strong>Need help?</strong> Contact your system administrator if you're unsure about deleting this assessment.
|
|
</div>
|
|
|
|
<div class="btn-group">
|
|
<a href="{% url 'quality:risk_assessment_detail' assessment.id %}" class="btn btn-outline-secondary">
|
|
<i class="fas fa-arrow-left me-1"></i>Cancel
|
|
</a>
|
|
<button type="button" class="btn btn-outline-info" onclick="exportAssessment()">
|
|
<i class="fas fa-download me-1"></i>Export First
|
|
</button>
|
|
<button type="submit" form="delete-form" class="btn btn-danger" id="delete-btn" disabled>
|
|
<i class="fas fa-trash me-1"></i>Delete Assessment
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endblock %}
|
|
|
|
{% block extra_js %}
|
|
<script>
|
|
$(document).ready(function() {
|
|
// Enable delete button only when conditions are met
|
|
function checkDeleteConditions() {
|
|
const confirmChecked = $('#confirm-delete').is(':checked');
|
|
const titleMatch = $('#assessment-title-confirm').val() === '{{ assessment.title }}';
|
|
|
|
$('#delete-btn').prop('disabled', !(confirmChecked && titleMatch));
|
|
}
|
|
|
|
$('#confirm-delete, #assessment-title-confirm').on('change keyup', checkDeleteConditions);
|
|
|
|
// Form submission confirmation
|
|
$('#delete-form').on('submit', function(e) {
|
|
if (!confirm('Are you absolutely sure you want to delete this risk assessment? This action cannot be undone.')) {
|
|
e.preventDefault();
|
|
}
|
|
});
|
|
});
|
|
|
|
function archiveAssessment() {
|
|
if (confirm('Archive this assessment instead of deleting it?')) {
|
|
fetch(`/quality/risk-assessments/{{ assessment.id }}/archive/`, {
|
|
method: 'POST',
|
|
headers: {
|
|
'X-CSRFToken': document.querySelector('[name=csrfmiddlewaretoken]').value
|
|
}
|
|
})
|
|
.then(response => response.json())
|
|
.then(data => {
|
|
if (data.success) {
|
|
showAlert('Assessment archived successfully', 'success');
|
|
setTimeout(() => {
|
|
window.location.href = '{% url "quality:risk_assessment_detail" assessment.id %}';
|
|
}, 1500);
|
|
} else {
|
|
showAlert('Error archiving assessment', 'danger');
|
|
}
|
|
})
|
|
.catch(error => {
|
|
showAlert('Error archiving assessment', 'danger');
|
|
});
|
|
}
|
|
}
|
|
|
|
function deactivateAssessment() {
|
|
if (confirm('Deactivate this assessment instead of deleting it?')) {
|
|
fetch(`/quality/risk-assessments/{{ assessment.id }}/deactivate/`, {
|
|
method: 'POST',
|
|
headers: {
|
|
'X-CSRFToken': document.querySelector('[name=csrfmiddlewaretoken]').value
|
|
}
|
|
})
|
|
.then(response => response.json())
|
|
.then(data => {
|
|
if (data.success) {
|
|
showAlert('Assessment deactivated successfully', 'success');
|
|
setTimeout(() => {
|
|
window.location.href = '{% url "quality:risk_assessment_detail" assessment.id %}';
|
|
}, 1500);
|
|
} else {
|
|
showAlert('Error deactivating assessment', 'danger');
|
|
}
|
|
})
|
|
.catch(error => {
|
|
showAlert('Error deactivating assessment', 'danger');
|
|
});
|
|
}
|
|
}
|
|
|
|
function exportAssessment() {
|
|
showAlert('Preparing assessment export...', 'info');
|
|
window.open(`/quality/risk-assessments/{{ assessment.id }}/export/`, '_blank');
|
|
}
|
|
|
|
function showAlert(message, type) {
|
|
const alertDiv = document.createElement('div');
|
|
alertDiv.className = `alert alert-${type} alert-dismissible fade show position-fixed`;
|
|
alertDiv.style.cssText = 'top: 20px; right: 20px; z-index: 1060; min-width: 300px;';
|
|
alertDiv.innerHTML = `
|
|
${message}
|
|
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
|
|
`;
|
|
|
|
document.body.appendChild(alertDiv);
|
|
|
|
setTimeout(() => {
|
|
if (alertDiv.parentNode) {
|
|
alertDiv.remove();
|
|
}
|
|
}, 5000);
|
|
}
|
|
</script>
|
|
{% endblock %}
|
|
|