HH/templates/observations/partials/observation_timeline_panel.html
ismail 7369d08012
All checks were successful
Build and Push Docker Image / build (push) Successful in 4m14s
feat: unified reference numbers + feedback modules QA audit
Reference numbers (unified scheme PREFIX-YYYYMM-HOSP-NNNN, e.g. CMP-202606-HHN-0001):
- new ReferenceSequence model + generate_reference() helper (apps/core)
- Complaint/Inquiry/Observation/Appreciation/Suggestion emit unified refs via save()
- prefix-based auto-routing in public track API (CMP/INQ/OBS trackable; APR/SGT internal-only)
- removed legacy CMP-/INQ- generators in ui_views, integrations, px_sources
- migrations: core.0003_referencesequence, appreciation.0006, feedback.0008, observations.0012
- unit tests (format, sanitization, monthly reset, 40-thread concurrency)

QA audit:
- isolated E2E hospital sandbox mirroring HH-N + 10 role users (create_e2e_isolated_env)
- feedback-modules-audit.spec.ts + audit helper (headed, run-to-completion)
- reports/feedback-modules-qa-report.md

Also bundles accumulated in-progress work across complaints, observations,
organizations, templates, and other modules.
2026-06-14 14:29:23 +03:00

46 lines
2.2 KiB
HTML

{% load i18n %}
<section class="bg-white rounded-2xl p-6 shadow-sm border border-slate-100">
<h3 class="text-xl font-bold text-navy mb-6">{% trans "Timeline" %}</h3>
{% if not stage_timeline.stages %}
<div class="text-center py-12">
<i data-lucide="clock-history" class="w-16 h-16 mx-auto text-slate-300 mb-4"></i>
<p class="text-slate">{% trans "No activity recorded yet" %}</p>
</div>
{% else %}
<div class="relative">
{% for stage in stage_timeline.stages %}
<div class="relative pl-10 pb-6 {% if not forloop.last %}border-l-2 border-slate-200 ml-[5px]{% else %}ml-[5px]{% endif %}">
<div class="absolute left-0 top-0 w-7 h-7 rounded-full {{ stage.color }} ring-4 ring-white -translate-x-[11px] flex items-center justify-center">
<i data-lucide="{{ stage.icon }}" class="w-4 h-4 text-white"></i>
</div>
<div class="flex items-baseline justify-between gap-4">
<div>
<p class="text-sm font-semibold text-navy">{{ stage.label }}</p>
<p class="text-xs text-slate">{{ stage.timestamp|date:"d M Y, h:i A" }}</p>
{% if stage.performed_by %}
<p class="text-[10px] text-slate-400 mt-0.5 flex items-center gap-1">
<i data-lucide="user" class="w-3 h-3"></i> {{ stage.performed_by }}
</p>
{% endif %}
</div>
{% if stage.duration_from_prev %}
<span class="shrink-0 px-2 py-0.5 rounded-md text-[11px] font-bold bg-slate-100 text-slate-500">
{{ stage.duration_from_prev }}
</span>
{% endif %}
</div>
</div>
{% endfor %}
</div>
{% if stage_timeline.total_time %}
<div class="mt-2 pt-4 border-t-2 border-slate-200 flex items-center justify-between">
<span class="text-sm font-bold text-navy">{% trans "Total Time" %}</span>
<span class="px-3 py-1 rounded-lg text-sm font-bold bg-navy text-white">
{{ stage_timeline.total_time }}
</span>
</div>
{% endif %}
{% endif %}
</section>