Quick Start
Type a city name (e.g.
Mesa, AZ) and click Add City. This creates a slot that CSVs can be uploaded into.
On the Settings page, drag your export CSV directly onto the city's drop zone, or click the zone to browse. Only
.csv files are accepted.
Navigate to Overview to see gig counts, aging, and status breakdowns across all cities. The dashboard updates immediately after each upload.
Each time you upload a new CSV for a city, a snapshot is recorded. After two uploads you'll see trend charts and +/− delta columns on the dashboard.
Managing Cities & Files
Adding a city
Go to Settings and type a name in the Add City box. The name you type is exactly what appears on the dashboard — use whatever label makes sense to you (e.g. Logan, Logan, UT, Logan Utah).
Uploading a CSV
Drag a CSV file onto a city's drop zone. You can also drop multiple files at once onto the same city. The file is saved to the /data folder on the server and linked to that city. Files uploaded this way are the only ones the dashboard reads — nothing is auto-detected from the folder.
Removing a file
Click Remove next to any file inside a city block. The file is deleted from the server immediately.
Deleting a city
Click Delete in the city header. This removes the city, unlinks all its files, and deletes those files from the server. The action asks for confirmation first.
CSV Formats
The app handles two export formats automatically. You don't need to rename or convert files — just drop them in.
Format A AddMarkup exports
Exported from ArcGIS with "AddMarkup" in the filename (e.g. Google_ECC_AZ_Mesa_AddMarkup_…csv). Uses column names like gigstatus, gigtype, datecreated, crewsupervisor, constructioncrew.
Format B Open Gig List exports
Exported as a flat gig list (e.g. Open Gig List.csv). Uses column names like gig_status, gig_type, created_date, supervisor, crew. The city name comes from the city you selected in Settings — not from the filename or any column.
Column name variations
The app uses an alias table to map many common column name spellings to the same field. If a future export uses a slightly different header name, it will still be recognized as long as it matches a known alias. Fields that can't be matched are left blank.
Fields Explained
| Field | What it means | Source column(s) |
|---|---|---|
| city | The city label you assigned in Settings when uploading the file. | set by you |
| status | Current workflow state of the gig. Stored in uppercase (e.g. OPEN, MISSING_PHOTO, CMPLT). |
gigstatus, gig_status, workflow_status |
| gig_type | The type of work. Normalized to Title_Case with underscores (e.g. Restoration_Trench, Conduit_Length). Known abbreviations are expanded automatically. |
gigtype, gig_type, work_type |
| critical | Whether the gig is flagged critical. Values: Yes / No. |
critical |
| origin | Who originated the gig (e.g. ECC, SEA). |
origin |
| supervisor | Assigned crew supervisor ID or name. Shown as Unassigned if blank. |
crewsupervisor, supervisor, assigned_to |
| crew | Construction crew assigned. Shown as Unassigned if blank. |
constructioncrew, crew |
| created_date | Date the gig was created. Parsed from ISO format (YYYY-MM-DD or YYYY-MM-DDTHH:MM:SS). |
datecreated, created_date |
| age_days | Number of days since created_date as of when the dashboard loads. Blank if no creation date exists. |
calculated |
| comments | Free-text notes attached to the gig. | comments |
Overview Stats
The four stat cards at the top of the Overview page show totals across all cities:
- Total Gigs — every row across all uploaded CSVs.
- Cities Tracked — number of cities with at least one uploaded file.
- Gigs Over 30 Days — gigs whose
age_daysexceeds 30, regardless of status. - Avg Age (days) — mean age across all gigs that have a creation date.
City Rankings Table
Every column header is clickable to sort. Click again to reverse direction. The columns are:
| Column | What it shows |
|---|---|
| Total | All gigs for the city. |
| Open | Gigs with status exactly OPEN. |
| Over 30d | Gigs older than 30 days (any status). |
| Δ Total | Change in total gig count vs. the previous upload for that city. Green = fewer gigs, red = more. — until 2 uploads exist. |
| Δ Over 30d | Change in over-30 count vs. previous upload. Green = fewer aging gigs, red = more. |
| Critical | Gigs flagged as critical. |
| Avg Age | Mean age in days for all gigs with a creation date. |
| Oldest | Age in days of the single oldest gig. |
| Top Type | The most common gig type for that city, with its count. |
| Type Count | Number of distinct gig types present. |
All Gigs Page
Shows every individual gig row. Use the filter dropdowns at the top to narrow by city, status, or gig type. Click any column header to sort.
The Export CSV button downloads the currently filtered and sorted view as a single CSV file — useful for sharing a subset of gigs.
Trends & History
Every time you upload a CSV for a city, the app records a snapshot: the date, total gig count, open count, and over-30 count for that city at that moment. Snapshots are stored in /data/snapshots.json.
The Trends panel on the Overview page shows a small chart per city once at least two uploads exist. Each chart has:
- A solid red line — total gig count over time.
- A dashed amber line — gigs over 30 days over time.
- A delta badge in the top-left corner showing the change from the second-to-last upload to the most recent one.
The Δ columns in the City Rankings table show the same last-to-previous delta in numeric form.
Gig Statuses
Statuses come directly from the CSV and are stored in uppercase. Common values seen in these exports:
| Status | Meaning |
|---|---|
| OPEN | Gig is active and awaiting action. |
| MISSING_PHOTO | Work is complete but a photo is required before closing. Tracked separately from Open. |
| CMPLT | Gig is complete. |
| INPROG | Work is in progress. |
| QCINPROG | QC review is in progress. |
Any other status values found in the CSV will appear on the dashboard as-is.
Aging Buckets
The Aging table on the Overview page groups gigs by how old they are. Age is calculated from created_date to today's date each time the page loads.
The color coding on individual age cells in the Gig List follows the same scale — green for new, amber for aging, red/bold for old.
Gigs with no created_date in the CSV appear in the Unknown bucket and are excluded from average age calculations.