HH/templates/complaints/sla_management_form.html
2026-07-11 19:24:28 +03:00

349 lines
12 KiB
HTML

{% extends 'layouts/base.html' %}
{% load static %}
{% load i18n %}
{% block title %}{{ title }} | {{ hospital.name }}{% endblock %}
{% block extra_css %}
<style>
:root {
--hh-navy: #005696;
--hh-blue: #007bbd;
--hh-light: #eef6fb;
--hh-slate: #64748b;
}
.page-header-gradient {
background: linear-gradient(135deg, #005696 0%, #0069a8 50%, #007bbd 100%);
color: white;
padding: 1.5rem 2rem;
border-radius: 1rem;
margin-bottom: 1.5rem;
box-shadow: 0 10px 15px -3px rgba(0, 86, 150, 0.2);
}
.section-card {
background: white;
border-radius: 1rem;
border: 2px solid #e2e8f0;
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
overflow: hidden;
transition: all 0.3s ease;
margin-bottom: 1.5rem;
}
.section-card:hover {
border-color: #005696;
box-shadow: 0 10px 25px -5px rgba(0, 86, 150, 0.15);
}
.section-header {
padding: 1rem 1.5rem;
border-bottom: 2px solid #e2e8f0;
background: linear-gradient(to right, #f8fafc, #f1f5f9);
display: flex;
align-items: center;
gap: 0.75rem;
}
.text-navy {
color: #005696;
}
.text-blue {
color: #007bbd;
}
.text-slate {
color: #64748b;
}
.bg-navy {
background-color: #005696;
}
.bg-blue {
background-color: #007bbd;
}
.bg-light {
background-color: #eef6fb;
}
.hover\:bg-blue-50:hover {
background-color: #eff6ff;
}
.hover\:bg-green-50:hover {
background-color: #f0fdf4;
}
.hover\:bg-slate-100:hover {
background-color: #f1f5f9;
}
/* Form Styles */
form input[type="text"],
form input[type="email"],
form input[type="number"],
form select,
form textarea {
width: 100%;
padding: 0.75rem 1rem;
border: 2px solid #e2e8f0;
border-radius: 0.75rem;
font-size: 0.875rem;
transition: all 0.2s ease;
background-color: white;
}
form input[type="text"]:focus,
form input[type="email"]:focus,
form input[type="number"]:focus,
form select:focus,
form textarea:focus {
outline: none;
border-color: #005696;
box-shadow: 0 0 0 3px rgba(0, 86, 150, 0.1);
}
form input[type="checkbox"] {
width: 1.25rem;
height: 1.25rem;
accent-color: #005696;
cursor: pointer;
}
</style>
{% endblock %}
{% block content %}
<!-- Page Header -->
<div class="page-header-gradient">
<div class="flex justify-between items-center">
<div>
<h1 class="text-2xl font-bold mb-1">
<i data-lucide="settings-2" class="w-6 h-6 inline-block mr-2"></i>
{{ title }}
</h1>
<p class="text-blue-100 text-sm">{% trans "Configure SLA parameters for complaint resolution" %}</p>
</div>
<a href="{% url 'complaints:sla_management' %}"
class="inline-flex items-center px-4 py-2.5 bg-white/10 border-2 border-white/30 text-white font-medium rounded-xl hover:bg-white hover:text-navy transition">
<i data-lucide="arrow-left" class="w-4 h-4 mr-2"></i>
{% trans "Back to List" %}
</a>
</div>
</div>
<div class="grid grid-cols-1 lg:grid-cols-3 gap-6">
<div class="lg:col-span-2">
<!-- Form -->
<form method="post" class="space-y-6">
{% csrf_token %}
<!-- Hospital (Hidden) -->
<input type="hidden" name="hospital" value="{{ hospital.id }}">
<!-- Configuration Type -->
<div class="section-card">
<div class="section-header p-6">
<h2 class="text-lg font-bold text-navy m-0">{% trans "Configuration Type" %}</h2>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 gap-4 p-6">
<!-- Source-Based -->
<div class="border-2 border-blue-200 bg-blue-50 rounded-xl p-4">
<div class="flex items-start gap-3">
<div class="w-10 h-10 bg-blue-100 rounded-lg flex items-center justify-center flex-shrink-0">
<i data-lucide="layers" class="w-5 h-5 text-blue-600"></i>
</div>
<div class="flex-1">
<label class="block text-sm font-bold text-navy mb-2">
{{ form.source.label }}
</label>
<div class="mb-1">
{{ form.source }}
</div>
<p class="text-xs text-slate">
{% trans "Select a source for source-based SLA, or leave empty for severity-based" %}
</p>
{% if form.source.errors %}
<p class="mt-1 text-xs text-red-600">{{ form.source.errors.0 }}</p>
{% endif %}
</div>
</div>
</div>
<!-- Severity-Based -->
<div class="border-2 border-purple-200 bg-purple-50 rounded-xl p-4">
<div class="flex items-start gap-3">
<div class="w-10 h-10 bg-purple-100 rounded-lg flex items-center justify-center flex-shrink-0">
<i data-lucide="tag" class="w-5 h-5 text-purple-600"></i>
</div>
<div class="flex-1">
<label class="block text-sm font-bold text-navy mb-2">
{% trans "Severity" %}
</label>
<div class="mb-1">
{{ form.severity }}
</div>
<p class="text-xs text-slate">
{% trans "Select a severity level for this SLA configuration" %}
</p>
{% if form.severity.errors %}
<p class="mt-1 text-xs text-red-600">{{ form.severity.errors.0 }}</p>
{% endif %}
</div>
</div>
</div>
</div>
</div>
<!-- SLA Deadline -->
<div class="section-card">
<div class="section-header p-6">
<h2 class="text-lg font-bold text-navy m-0">
<i data-lucide="clock" class="w-5 h-5 inline-block mr-2"></i>
{% trans "SLA Deadline" %}
</h2>
</div>
<div class="max-w-md p-6">
<label class="block text-sm font-bold text-navy mb-2">
{{ form.sla_hours.label }}
</label>
<div class="relative">
{{ form.sla_hours }}
<span class="absolute right-4 top-1/2 -translate-y-1/2 text-slate font-medium">{% trans "hours" %}</span>
</div>
<p class="text-sm text-slate mt-2">
{{ form.sla_hours.help_text }}
</p>
{% if form.sla_hours.errors %}
<p class="mt-1 text-sm text-red-600">{{ form.sla_hours.errors.0 }}</p>
{% endif %}
</div>
</div>
<!-- Reminder Configuration -->
<div class="section-card">
<div class="section-header p-6">
<h2 class="text-lg font-bold text-navy m-0">
<i data-lucide="bell" class="w-5 h-5 inline-block mr-2"></i>
{% trans "Reminder Configuration" %}
</h2>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 gap-6 p-6">
<!-- First Reminder -->
<div>
<label class="block text-sm font-bold text-navy mb-2">
{% trans "First Reminder" %}
</label>
<div class="relative">
{{ form.reminder_hours_before }}
<span class="absolute right-4 top-1/2 -translate-y-1/2 text-slate text-sm">{% trans "hours before deadline" %}</span>
</div>
<p class="text-xs text-slate mt-2">
{% trans "Set to 0 to disable" %}
</p>
{% if form.reminder_hours_before.errors %}
<p class="mt-1 text-xs text-red-600">{{ form.reminder_hours_before.errors.0 }}</p>
{% endif %}
</div>
<!-- Second Reminder -->
<div>
<label class="block text-sm font-bold text-navy mb-2">
{% trans "Second Reminder" %}
</label>
<div class="relative">
{{ form.second_reminder_hours_before }}
<span class="absolute right-4 top-1/2 -translate-y-1/2 text-slate text-sm">{% trans "hours before deadline" %}</span>
</div>
<p class="text-xs text-slate mt-2">
{% trans "Set to 0 to disable" %}
</p>
{% if form.second_reminder_hours_before.errors %}
<p class="mt-1 text-xs text-red-600">{{ form.second_reminder_hours_before.errors.0 }}</p>
{% endif %}
</div>
</div>
</div>
<!-- Status -->
<div class="section-card">
<div class="flex items-center justify-between p-6">
<div>
<h3 class="text-lg font-bold text-navy">{% trans "Configuration Status" %}</h3>
<p class="text-sm text-slate mt-1">{% trans "Enable or disable this SLA configuration" %}</p>
</div>
<div class="flex items-center gap-3">
<span class="text-sm font-bold text-navy">{% trans "Active" %}</span>
{{ form.is_active }}
</div>
</div>
</div>
<!-- Submit Buttons -->
<div class="flex items-center justify-end gap-4">
<a href="{% url 'complaints:sla_management' %}"
class="px-6 py-3 border-2 border-slate-300 text-slate-700 font-bold rounded-xl hover:bg-slate-50 transition">
{% trans "Cancel" %}
</a>
<button type="submit"
class="px-6 py-3 bg-navy text-white font-bold rounded-xl hover:bg-blue transition shadow-lg shadow-navy/20">
{{ action }} {% trans "Configuration" %}
</button>
</div>
</form>
</div>
<!-- Helper Sidebar -->
<div class="lg:col-span-1">
<div class="sticky top-6 space-y-4">
<div class="section-card">
<div class="section-header p-4">
<i data-lucide="help-circle" class="w-5 h-5 text-navy"></i>
<h3 class="text-base font-bold text-navy">{% trans "Quick Guide" %}</h3>
</div>
<div class="p-4 space-y-4 text-sm text-slate">
<div>
<p class="font-bold text-navy">{% trans "Configuration Type" %}</p>
<p class="mt-1">{% trans "Choose a Source (e.g. MOH, CCHI) for source-specific deadlines. Or leave empty and pick a Severity for severity-based deadlines. Source configs take precedence." %}</p>
</div>
<div>
<p class="font-bold text-navy">{% trans "SLA Deadline" %}</p>
<p class="mt-1">{% trans "Total hours from complaint creation until the deadline. Example: 72 hours = due in 3 days." %}</p>
</div>
<div>
<p class="font-bold text-navy">{% trans "First Reminder" %}</p>
<p class="mt-1">{% trans "Hours before the SLA deadline when the first reminder email is sent to the assignee. Example: 6 = remind 6 hours before deadline. Set to 0 to disable." %}</p>
</div>
<div>
<p class="font-bold text-navy">{% trans "Second Reminder" %}</p>
<p class="mt-1">{% trans "Hours before the SLA deadline when a follow-up reminder is sent. Must be closer to deadline than the first reminder (smaller number). Set to 0 to disable." %}</p>
</div>
<div>
<p class="font-bold text-navy">{% trans "Status" %}</p>
<p class="mt-1">{% trans "Only Active configs are used. Inactive configs are ignored." %}</p>
</div>
</div>
</div>
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
lucide.createIcons();
});
</script>
{% endblock %}