Marwan Alwali 610e165e17 update
2025-09-04 19:19:52 +03:00

431 lines
24 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{% extends "base.html" %}
{% load static %}
{% block title %}{{ object.room_number }} - Operating Room Details - {{ 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-procedures me-2"></i>OR {{ object.room_number }} - {{ object.room_name }}
</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 'operating_theatre:dashboard' %}">Operating Theatre</a></li>
<li class="breadcrumb-item"><a href="{% url 'operating_theatre:operating_room_list' %}">Operating Rooms</a></li>
<li class="breadcrumb-item active">{{ object.room_number }}</li>
</ol>
</nav>
</div>
<div class="btn-group">
<a href="{% url 'operating_theatre:operating_room_update' object.pk %}" class="btn btn-primary">
<i class="fas fa-edit me-2"></i>Edit Room
</a>
<div class="btn-group">
<button type="button" class="btn btn-outline-secondary dropdown-toggle" data-bs-toggle="dropdown">
<i class="fas fa-cog me-2"></i>Actions
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#" onclick="updateStatus('AVAILABLE')">
<i class="fas fa-check-circle me-2 text-success"></i>Set Available
</a></li>
<li><a class="dropdown-item" href="#" onclick="updateStatus('CLEANING')">
<i class="fas fa-broom me-2 text-info"></i>Set Cleaning
</a></li>
<li><a class="dropdown-item" href="#" onclick="updateStatus('MAINTENANCE')">
<i class="fas fa-tools me-2 text-warning"></i>Set Maintenance
</a></li>
<li><a class="dropdown-item" href="#" onclick="updateStatus('OUT_OF_ORDER')">
<i class="fas fa-exclamation-triangle me-2 text-danger"></i>Out of Order
</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#" onclick="printRoom()">
<i class="fas fa-print me-2"></i>Print Details
</a></li>
<li><a class="dropdown-item" href="#" onclick="exportRoom()">
<i class="fas fa-download me-2"></i>Export Data
</a></li>
</ul>
</div>
</div>
</div>
<!-- Status Alert -->
{% if object.status != 'AVAILABLE' %}
<div class="alert alert-{% if object.status == 'OCCUPIED' %}warning{% elif object.status == 'MAINTENANCE' or object.status == 'OUT_OF_ORDER' %}danger{% else %}info{% endif %} mb-4">
<div class="d-flex align-items-center">
<i class="fas fa-{% if object.status == 'OCCUPIED' %}user-md{% elif object.status == 'MAINTENANCE' %}tools{% elif object.status == 'OUT_OF_ORDER' %}exclamation-triangle{% else %}info-circle{% endif %} me-2"></i>
<div>
<strong>Room Status: {{ object.get_status_display }}</strong>
{% if object.current_case %}
<div class="small">Current Case: {{ object.current_case.primary_procedure }} — {{ object.current_case.patient }}</div>
{% endif %}
</div>
</div>
</div>
{% endif %}
<div class="row">
<!-- Main column -->
<div class="col-lg-8">
<!-- Room Information -->
<div class="panel panel-inverse mb-4">
<div class="panel-heading">
<h4 class="panel-title">
<i class="fas fa-info-circle me-2"></i>Room Information
</h4>
<div class="panel-heading-btn">
<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">
<div class="col-md-6">
<table class="table table-borderless">
<tr><td class="fw-semibold">Room Number:</td><td>{{ object.room_number }}</td></tr>
<tr><td class="fw-semibold">Room Name:</td><td>{{ object.room_name }}</td></tr>
<tr><td class="fw-semibold">Room Type:</td><td><span class="badge bg-info">{{ object.get_room_type_display }}</span></td></tr>
<tr>
<td class="fw-semibold">Status:</td>
<td>
<span class="badge bg-{% if object.status == 'AVAILABLE' %}success{% elif object.status == 'OCCUPIED' %}warning{% elif object.status == 'MAINTENANCE' %}danger{% else %}secondary{% endif %}">
{{ object.get_status_display }}
</span>
</td>
</tr>
<tr><td class="fw-semibold">Floor:</td><td>Floor {{ object.floor_number }}</td></tr>
</table>
</div>
<div class="col-md-6">
<table class="table table-borderless">
<tr><td class="fw-semibold">Building:</td><td>{{ object.building|default:"Not specified" }}</td></tr>
<tr><td class="fw-semibold">Wing:</td><td>{{ object.wing|default:"Not specified" }}</td></tr>
<tr><td class="fw-semibold">Room Size:</td><td>{{ object.room_size|default:"Not specified" }}{% if object.room_size %} m²{% endif %}</td></tr>
<tr><td class="fw-semibold">Ceiling Height:</td><td>{{ object.ceiling_height|default:"Not specified" }}{% if object.ceiling_height %} m{% endif %}</td></tr>
<tr>
<td class="fw-semibold">Emergency Cases:</td>
<td>
{% if object.accepts_emergency %}
<span class="badge bg-success">Accepts</span>
{% else %}
<span class="badge bg-secondary">Does not accept</span>
{% endif %}
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
<!-- Capabilities & Equipment -->
<div class="panel panel-inverse mb-4">
<div class="panel-heading">
<h4 class="panel-title">
<i class="fas fa-cogs me-2"></i>Capabilities & Equipment
</h4>
<div class="panel-heading-btn">
<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">
<div class="col-md-6">
<h6 class="fw-semibold mb-3">Surgical Capabilities</h6>
<div class="d-flex flex-wrap gap-2 mb-3">
{% if object.supports_robotic %}<span class="badge bg-primary">Robotic Surgery</span>{% endif %}
{% if object.supports_laparoscopic %}<span class="badge bg-info">Laparoscopic</span>{% endif %}
{% if object.supports_microscopy %}<span class="badge bg-success">Microscopy</span>{% endif %}
{% if object.supports_laser %}<span class="badge bg-warning">Laser Surgery</span>{% endif %}
</div>
<h6 class="fw-semibold mb-3">Imaging Capabilities</h6>
<div class="d-flex flex-wrap gap-2">
{% if object.has_c_arm %}<span class="badge bg-secondary">C-Arm</span>{% endif %}
{% if object.has_ct %}<span class="badge bg-secondary">Intraop CT</span>{% endif %}
{% if object.has_mri %}<span class="badge bg-secondary">Intraop MRI</span>{% endif %}
{% if object.has_ultrasound %}<span class="badge bg-secondary">Ultrasound</span>{% endif %}
{% if object.has_neuromonitoring %}<span class="badge bg-secondary">Neuromonitoring</span>{% endif %}
</div>
</div>
<div class="col-md-6">
<h6 class="fw-semibold mb-3">Equipment List</h6>
{% if object.equipment_list %}
<ul class="list-unstyled">
{% for equipment in object.equipment_list %}
<li><i class="fas fa-check text-success me-2"></i>{{ equipment }}</li>
{% endfor %}
</ul>
{% else %}
<p class="text-muted">No equipment list specified</p>
{% endif %}
<h6 class="fw-semibold mb-3">Special Features</h6>
{% if object.special_features %}
<ul class="list-unstyled">
{% for feature in object.special_features %}
<li><i class="fas fa-star text-warning me-2"></i>{{ feature }}</li>
{% endfor %}
</ul>
{% else %}
<p class="text-muted">No special features specified</p>
{% endif %}
</div>
</div>
</div>
</div>
<!-- Environmental Controls -->
<div class="panel panel-inverse mb-4">
<div class="panel-heading">
<h4 class="panel-title">
<i class="fas fa-thermometer-half me-2"></i>Environmental Controls
</h4>
<div class="panel-heading-btn">
<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">
<div class="col-md-6">
<div class="mb-3">
<label class="form-label fw-semibold">Temperature Range</label>
<div class="progress" style="height: 20px;">
<div class="progress-bar bg-info" style="width: 100%;">
{{ object.temperature_min }}°C {{ object.temperature_max }}°C
</div>
</div>
</div>
<div class="mb-3">
<label class="form-label fw-semibold">Humidity Range</label>
<div class="progress" style="height: 20px;">
<div class="progress-bar bg-success" style="width: 100%;">
{{ object.humidity_min }}% {{ object.humidity_max }}%
</div>
</div>
</div>
</div>
<div class="col-md-6">
<table class="table table-borderless">
<tr><td class="fw-semibold">Air Changes/Hour:</td><td>{{ object.air_changes_per_hour }}</td></tr>
<tr>
<td class="fw-semibold">Pressure:</td>
<td>
{% if object.positive_pressure %}
<span class="badge bg-success">Positive</span>
{% else %}
<span class="badge bg-warning">Negative</span>
{% endif %}
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
<!-- Current Case -->
{% if object.current_case %}
<div class="panel panel-inverse mb-4 current-case">
<div class="panel-heading">
<h4 class="panel-title">
<i class="fas fa-user-md me-2"></i>Current Case
</h4>
<div class="panel-heading-btn">
<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">
<div class="col-md-6">
<table class="table table-borderless">
<tr><td class="fw-semibold">Case Number:</td><td>{{ object.current_case.case_number }}</td></tr>
<tr><td class="fw-semibold">Patient:</td><td>{{ object.current_case.patient }}</td></tr>
<tr><td class="fw-semibold">Primary Surgeon:</td><td>{{ object.current_case.primary_surgeon }}</td></tr>
<tr><td class="fw-semibold">Procedure:</td><td>{{ object.current_case.primary_procedure }}</td></tr>
</table>
</div>
<div class="col-md-6">
<table class="table table-borderless">
<tr>
<td class="fw-semibold">Start Time:</td>
<td>
{% if object.current_case.actual_start %}
{{ object.current_case.actual_start|date:"M d, H:i" }}
{% else %}
Not started
{% endif %}
</td>
</tr>
<tr>
<td class="fw-semibold">Estimated/Actual End:</td>
<td>
{% if object.current_case.actual_end %}
{{ object.current_case.actual_end|date:"M d, H:i" }}
{% else %}
{{ object.current_case.scheduled_start|date:"M d, H:i" }} + {{ object.current_case.estimated_duration }} min
{% endif %}
</td>
</tr>
<tr><td class="fw-semibold">Case Type:</td><td><span class="badge bg-warning">{{ object.current_case.get_case_type_display }}</span></td></tr>
<tr><td class="fw-semibold">Status:</td><td><span class="badge bg-info">{{ object.current_case.get_status_display }}</span></td></tr>
</table>
</div>
</div>
<div class="mt-3">
<a href="{% url 'operating_theatre:surgical_case_detail' object.current_case.pk %}" class="btn btn-outline-primary">
<i class="fas fa-eye me-2"></i>View Case Details
</a>
</div>
</div>
</div>
{% endif %}
</div>
<!-- Sidebar -->
<div class="col-lg-4">
<!-- Quick Stats -->
<div class="panel panel-inverse mb-4">
<div class="panel-heading">
<h4 class="panel-title">
<i class="fas fa-chart-bar me-2"></i>Quick Stats
</h4>
<div class="panel-heading-btn">
<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 text-center">
<div class="col-6 mb-3">
<div class="h4 text-primary mb-1">{{ room_stats.total_cases|default:0 }}</div>
<div class="small text-muted">Total Cases</div>
</div>
<div class="col-6 mb-3">
<div class="h4 text-success mb-1">
{% if room_stats.average_case_duration %}
{{ room_stats.average_case_duration }}
{% else %}
0
{% endif %}
</div>
<div class="small text-muted">Avg Duration</div>
</div>
<div class="col-6">
<div class="h4 text-info mb-1">{{ object.turnover_time }}</div>
<div class="small text-muted">Std Turnover (min)</div>
</div>
<div class="col-6">
<div class="h4 text-warning mb-1">{{ room_stats.cases_this_month|default:0 }}</div>
<div class="small text-muted">Cases This Month</div>
</div>
</div>
</div>
</div>
<!-- Staffing Requirements -->
<div class="panel panel-inverse mb-4">
<div class="panel-heading">
<h4 class="panel-title">
<i class="fas fa-users me-2"></i>Staffing Requirements
</h4>
<div class="panel-heading-btn">
<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="d-flex justify-content-between align-items-center mb-2">
<span>Required Nurses:</span><span class="badge bg-primary">{{ object.required_nurses }}</span>
</div>
<div class="d-flex justify-content-between align-items-center mb-2">
<span>Required Technicians:</span><span class="badge bg-info">{{ object.required_techs }}</span>
</div>
<div class="d-flex justify-content-between align-items-center">
<span>Max Case Duration:</span><span class="badge bg-warning">{{ object.max_case_duration }} min</span>
</div>
</div>
</div>
<!-- Recent Activity -->
<div class="panel panel-inverse mb-4">
<div class="panel-heading">
<h4 class="panel-title">
<i class="fas fa-history me-2"></i>Recent Activity
</h4>
<div class="panel-heading-btn">
<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">
{% if recent_cases %}
{% for case in recent_cases %}
<div class="d-flex align-items-center mb-3">
<div class="bg-primary bg-gradient rounded-circle d-flex align-items-center justify-content-center me-3" style="width: 32px; height: 32px;">
<i class="fas fa-user-md text-white small"></i>
</div>
<div class="flex-grow-1">
<div class="fw-semibold small">{{ case.primary_procedure|truncatechars:30 }}</div>
<div class="text-muted small">{{ case.patient }} — {{ case.scheduled_start|date:"M d, H:i" }}</div>
</div>
<span class="badge bg-{% if case.status == 'COMPLETED' %}success{% elif case.status == 'IN_PROGRESS' %}warning{% else %}secondary{% endif %}">
{{ case.get_status_display }}
</span>
</div>
{% endfor %}
{% else %}
<p class="text-muted">No recent activity</p>
{% endif %}
</div>
</div>
</div>
</div>
</div>
<script>
// CSRF from cookie
function getCookie(name) {
const value = `; ${document.cookie}`;
const parts = value.split(`; ${name}=`);
if (parts.length === 2) return parts.pop().split(';').shift();
}
function updateStatus(status) {
if (!confirm(`Are you sure you want to set this room to ${status}?`)) return;
fetch(`{% url 'operating_theatre:update_room_status' object.pk %}`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRFToken': getCookie('csrftoken')
},
body: JSON.stringify({ status })
})
.then(r => r.json())
.then(data => data.success ? location.reload() : alert('Error updating room status: ' + (data.error || 'Unknown error')))
.catch(() => alert('Network error updating room status'));
}
function printRoom() { window.print(); }
function exportRoom() { window.open(`${window.location.pathname}?export=pdf`); }
// Auto-refresh current case info every 30 seconds (panel has .current-case class)
setInterval(function() {
if (document.querySelector('.panel.current-case')) {
location.reload();
}
}, 30000);
</script>
<style>
@media print {
.btn, .dropdown, nav, .panel-heading .fa-cog { display: none !important; }
.panel { border: 1px solid #dee2e6 !important; box-shadow: none !important; }
}
.progress { background-color: #e9ecef; }
.badge { font-size: 0.75rem; }
.table-borderless td { padding: 0.5rem 0; }
{#.panel-title { color: #495057; }#}
.bg-gradient { background-image: linear-gradient(180deg, rgba(255,255,255,.15), rgba(255,255,255,0)); }
</style>
{% endblock %}