diff --git a/app/routes/issues.py b/app/routes/issues.py index 06d75e2..e4f76db 100644 --- a/app/routes/issues.py +++ b/app/routes/issues.py @@ -449,13 +449,23 @@ def unfollow(issue_id): @login_required @supervisor_required def create(): + from app.models.project import Project form = IssueForm() facilities = Facility.query.filter_by(active=True).order_by(Facility.name).all() + projects = Project.query.filter_by(active=True).order_by(Project.name).all() staff = User.query.filter(User.role.in_(['admin', 'director', 'inspector'])).order_by(User.username).all() form.facility_id.choices = [(f.id, f.name) for f in facilities] form.assigned_to.choices = [(0, '— Unassigned —')] + [(u.id, u.username) for u in staff] + # On POST validation error: identify which contract the submitted facility + # belongs to so the contract selector can be restored on re-render. + selected_project_id = None + if form.facility_id.data: + _fac = db.session.get(Facility, form.facility_id.data) + if _fac: + selected_project_id = _fac.project_id + if form.validate_on_submit(): from app.routes.inspections import _save_photo photo_path = _save_photo(form.photo.data, subfolder='issue_photos') @@ -520,7 +530,8 @@ def create(): flash('Issue created.', 'success') return redirect(url_for('issues.index')) - return render_template('issues/form.html', form=form, title='Log New Issue') + return render_template('issues/form.html', form=form, title='Log New Issue', + projects=projects, selected_project_id=selected_project_id) # ── Supervisor verify resolved issue ───────────────────────────────────────── diff --git a/app/templates/issues/form.html b/app/templates/issues/form.html index 33c34af..8dfa229 100644 --- a/app/templates/issues/form.html +++ b/app/templates/issues/form.html @@ -10,13 +10,34 @@
- {% for field in [form.facility_id, form.severity, form.description, form.photo, form.assigned_to] %} + + {# Contract selector — UI only; narrows the facility list via AJAX #} +
+ + +
+ + {# Facility — populated by JS once a contract is chosen #} +
+ {{ form.facility_id.label(class="form-label fw-semibold") }} + {{ form.facility_id(class="form-select", id="facility_id") }} + {% for e in form.facility_id.errors %}
{{ e }}
{% endfor %} +
+ + {# Remaining fields #} + {% for field in [form.severity, form.description, form.photo, form.assigned_to] %}
{{ field.label(class="form-label fw-semibold") }} {{ field(class="form-select" if field.type == 'SelectField' else "form-control", rows=4 if field.type == 'TextAreaField' else none) }} {% for e in field.errors %}
{{ e }}
{% endfor %}
{% endfor %} +
Cancel @@ -27,3 +48,60 @@
{% endblock %} + +{% block extra_js %} + +{% endblock %} diff --git a/app/templates/issues/list.html b/app/templates/issues/list.html index 17cd518..de91c66 100644 --- a/app/templates/issues/list.html +++ b/app/templates/issues/list.html @@ -66,6 +66,7 @@ Reported Severity + Contract Facility / Area Description Status @@ -85,6 +86,10 @@ {{ issue.severity|title }} + + {% set _c = issue.resolved_facility.project if issue.resolved_facility else none %} + {{ _c.name if _c else '—' }} + {{ issue.resolved_facility.name if issue.resolved_facility else '—' }}
{{ issue.area.name if issue.area else '—' }} diff --git a/app/templates/issues/view.html b/app/templates/issues/view.html index b9a12ee..1b25fb3 100644 --- a/app/templates/issues/view.html +++ b/app/templates/issues/view.html @@ -17,6 +17,13 @@
Reported
{{ issue.reported_at.strftime('%Y-%m-%d %H:%M') }}
+
Contract
+
+ {% if issue.resolved_facility and issue.resolved_facility.project %} + {{ issue.resolved_facility.project.name }} + {% else %}—{% endif %} +
+
Facility
{{ issue.resolved_facility.name if issue.resolved_facility else '—' }}