Sprint 3: Alpine.js Dashboards — Login, CS/FM/CEO Views, Ticket Management #3

Merged
abiba-bot merged 7 commits from fm/denya-onecare-s3 into main 2026-07-23 19:36:35 +00:00
5 changed files with 17 additions and 7 deletions
Showing only changes of commit 3dc383e62d - Show all commits
-2
View File
@@ -2,8 +2,6 @@
from __future__ import annotations
from __future__ import annotations
from pathlib import Path
from fastapi import APIRouter, Request
+1
View File
@@ -46,6 +46,7 @@ class TicketUpdate(BaseModel):
eta: datetime | None = None
cost: Decimal | None = None
parts_used: str | None = None
note: str | None = None
class TicketTimelineOut(BaseModel):
+12
View File
@@ -275,6 +275,18 @@ async def update_ticket(
ticket.status = new_status
# Handle standalone note (no status change)
note_only = data.get("note")
if note_only and (new_status is None or new_status == ticket.status):
await _log_status_change(
db,
ticket.id,
from_status=ticket.status,
to_status=ticket.status,
note=note_only,
user_id=user.id if user else None,
)
# Update other fields
for field in ("unit_id", "category_id", "priority", "reporter", "reported_via",
"description", "assigned_to", "eta", "cost", "parts_used"):
+3 -4
View File
@@ -311,7 +311,7 @@
async init() {
await this.loadTicket();
if (this.isFM || this.isAdmin) {
if (app().isFM || app().isAdmin) {
await this.loadTechnicians();
}
},
@@ -392,9 +392,8 @@
if (!this.noteForm.note.trim()) return;
this.noteSubmitting = true;
try {
// Use status update endpoint to add a note without changing status
const updated = await app().apiPost(`/api/tickets/${this.ticketId}/status`, {
status: this.ticket.status,
// Use PATCH endpoint which now supports note-only updates
const updated = await app().apiPatch(`/api/tickets/${this.ticketId}`, {
note: this.noteForm.note
});
this.ticket = updated;
+1 -1
View File
@@ -244,7 +244,7 @@
const payload = {
description: this.form.description,
priority: this.form.priority || null,
reporter: this.form.reporter || this.user.full_name,
reporter: this.form.reporter || app().user.full_name,
reported_via: this.form.reported_via || 'walk-in',
category_id: this.form.category_id ? parseInt(this.form.category_id) : (this.form.category_main ? parseInt(this.form.category_main) : null),
};