{% extends "base.html" %} {% block title %}Inspection #{{ inspection.id }} — Results{% endblock %} {% block extra_css %} {% endblock %} {% block content %}
{# Action bar #}
Back to Inspections
{% if current_user.role in ['admin','supervisor'] %}
{% endif %}
{# Header #}

{{ inspection.template.name }}

{{ inspection.facility.name }}{% if inspection.area %} · {{ inspection.area.name }}{% endif %}  ·  Inspector: {{ inspection.inspector.username }}
{{ inspection.status|replace('_',' ')|title }} {% if inspection.overall_score is not none %}
{{ inspection.overall_score }}%
{% endif %}
{# Meta row #}
Date {{ inspection.inspection_date.strftime('%B %d, %Y %H:%M') }}
{% if inspection.completed_at %}
Completed {{ inspection.completed_at.strftime('%B %d, %Y %H:%M') }}
{% endif %}
Template {{ inspection.template.name }}
Frequency {{ inspection.template.frequency|title }}
{# ── Build the filtered field set ────────────────────────────────────── Strategy: 1. Find all grid rows that contain at least one rated rating field. 2. Collect every field whose grid row overlaps a rated row. 3. Also collect section fields that immediately precede a rated group. 4. Re-number rows sequentially (1-based) so there are no gaps. #} {% if form_fields %} {# Step 1: collect grid row numbers that have a rated rating field #} {% set ns = namespace(rated_rows=[], section_rows=[], pending_section=none) %} {% for field in form_fields %} {% if field.type == 'section' %} {% set ns.pending_section = field %} {% elif field.type == 'rating' %} {% set score = form_data.get(field.id | string, '0') | int %} {% if score > 0 %} {# Mark every grid row this rating cell spans #} {% for r in range(field.row, field.row + field.rowSpan) %} {% if r not in ns.rated_rows %} {% set ns.rated_rows = ns.rated_rows + [r] %} {% endif %} {% endfor %} {# Attach pending section to these rows #} {% if ns.pending_section is not none %} {% set ns.section_rows = ns.section_rows + [(ns.pending_section, field.row)] %} {% set ns.pending_section = none %} {% endif %} {% else %} {% set ns.pending_section = ns.pending_section %} {% endif %} {% else %} {% set ns.pending_section = ns.pending_section %} {% endif %} {% endfor %} {# Step 2: collect fields whose rows overlap rated_rows, plus section fields #} {# Build list of (original_row, field) tuples to sort and re-number #} {% set ns2 = namespace(visible=[], section_emitted=[]) %} {# First pass: emit section fields just before the first rated row they precede #} {% for sec_field, first_rated_row in ns.section_rows %} {% if first_rated_row not in ns2.section_emitted %} {% set ns2.visible = ns2.visible + [(first_rated_row - 0.5, sec_field)] %} {% set ns2.section_emitted = ns2.section_emitted + [first_rated_row] %} {% endif %} {% endfor %} {# Second pass: all fields whose row range overlaps rated_rows #} {% for field in form_fields %} {% if field.type not in ('section', 'label', 'button_submit', 'button_print', 'button_email') %} {% set overlaps = namespace(found=false) %} {% for r in range(field.row, field.row + field.rowSpan) %} {% if r in ns.rated_rows %} {% set overlaps.found = true %} {% endif %} {% endfor %} {% if overlaps.found %} {% set ns2.visible = ns2.visible + [(field.row, field)] %} {% endif %} {% endif %} {% endfor %} {# Step 3: sort visible list by sort_key (first element of tuple) #} {# Jinja2 can't sort tuples directly, so use dictsort workaround via a temp dict #} {# Instead, render in original form_fields order (already sorted by row,col) #} {# Simpler approach: single pass in original order, re-number rows on the fly #} {# Map original_row -> new_row using the sorted rated_rows list #} {% set sorted_rated = ns.rated_rows | sort %} {# Build row mapping: original row number -> compact row number #} {# Sections get row = (first rated row they precede) - 1 in new numbering #} {# We assign new row numbers: section=1, then its data rows=2,3,... etc. #} {# Final render: walk form_fields in order, emit only visible ones with remapped rows #} {% set remap = namespace(out_row=1, last_orig_row=-1, pending_sec=none, pending_sec_orig_row=-1) %}
{% for field in form_fields %} {% set ftype = field.type %} {# Track pending section #} {% if ftype == 'section' %} {% set remap.pending_sec = field %} {% set remap.pending_sec_orig_row = field.row %} {% elif ftype in ('label', 'button_submit', 'button_print', 'button_email') %} {# skip #} {% else %} {# Check if this field overlaps any rated row #} {% set vis = namespace(show=false) %} {% for r in range(field.row, field.row + field.rowSpan) %} {% if r in ns.rated_rows %}{% set vis.show = true %}{% endif %} {% endfor %} {% if vis.show %} {# Flush pending section first #} {% if remap.pending_sec is not none %} {# Section: 1 row tall, spanning all 12 cols #}
{{ remap.pending_sec.label }}
{% set remap.out_row = remap.out_row + 1 %} {% set remap.pending_sec = none %} {% set remap.last_orig_row = -1 %} {% endif %} {# Advance out_row when the original row changes #} {% if field.row != remap.last_orig_row and remap.last_orig_row != -1 %} {% set remap.out_row = remap.out_row + 1 %} {% endif %} {% set remap.last_orig_row = field.row %} {# Render the field at its original col/colSpan but remapped row #}
{% set fid = field.id | string %} {% set val = form_data.get(fid, '') %} {% if ftype == 'rating' %} {{ field.label }}
{% set score = val | int %} {% if score > 0 %} {% for i in range(1,6) %}{{ '★' if i <= score else '☆' }}{% endfor %} {{ score }}/5 {% else %} Not rated {% endif %}
{% elif ftype == 'image' %} {{ field.label }}
{% if val %} {% else %} No photo {% endif %}
{% elif ftype == 'signature' %} {{ field.label }}
{% if val and val.startswith('data:') %} {% else %} No signature {% endif %}
{% elif ftype == 'checkbox' %} {{ field.label }}
{% if val == 'yes' %} Yes {% else %} No{% endif %}
{% elif ftype == 'checkbox_group' %} {{ field.label }}
{% if val and val is iterable and val is not string %} {% for item in val %}{{ item }}{% endfor %} {% else %}None{% endif %}
{% elif ftype == 'table' %} {{ field.label }}
{% if val and val is iterable and val is not string %} {% for hdr in (field.col_headers or ['Col']) %}{% endfor %}{% for row in val %}{% for hdr in (field.col_headers or ['Col']) %}{% endfor %}{% endfor %}
{{ hdr }}
{{ row.get(hdr,'') }}
{% else %}No data{% endif %}
{% else %} {# text, number, date, email, radio, select, textarea #} {{ field.label }}
{{ val or '—' }}
{% endif %}
{# /fg-cell #} {% endif %} {% endif %} {% endfor %}
{# /form-grid #} {% if not ns.rated_rows %}

No rated fields in this inspection.

{% endif %} {% else %}

No form fields found for this template.

{% endif %} {# Issues #} {% if issues %}
Issues Logged ({{ issues|length }})
{% for issue in issues %} {% endfor %}
SeverityAreaDescriptionStatus
{{ issue.severity|title }} {{ issue.area.name }} {{ issue.description[:80] }}{% if issue.description|length > 80 %}…{% endif %} {{ issue.status|replace('_',' ')|title }} View
{% endif %}
{# Media lightbox #}
Photo
{% endblock %} {% block extra_js %} {% endblock %}