Commit Graph

14 Commits

Author SHA1 Message Date
872a7f17c3 Add a per-user sort order for the technician table
Settings has a "Sort rows by" choice: the technician list order (the
default, as before), technician name, Total open, Closed today or any
status column. Counts sort busiest first with ties by name, and the
sorted column's header gets an arrow. The browser does the sorting; the
server only validates and saves tableSort.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 11:35:39 -04:00
80a5e2c965 Add per-user closed statuses for the feed and ding
SDP closes a resolved ticket on its own after 2 or 3 days, so watching
only Closed gave the ding days late. Each user can now pick which
statuses count as closed for the feed (feedStatuses, defaulting to
STATUS_NAMES). With Resolved picked, tickets are timed by resolved_time
so the automatic close later doesn't ding again.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 11:27:17 -04:00
2f137afd5f Limit sign-in to allowed email domains
All checks were successful
Build and push image / build (push) Successful in 13s
Any Zoho account can approve the client, and an outside account got a
session that returned the .env site, group and technician names.
ALLOWED_EMAIL_DOMAINS is now required: the callback refuses other
domains and revokes their token, and every API call re-checks it so
older cookies stop working. /api/names also makes the caller's token
read from SDP before returning the shared names.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 21:29:25 -04:00
9479b122fa Save per-user settings on the server
Each user's sites, groups, technicians, timing, weather location and
hidden panels/columns are saved by Zoho email in DATA_DIR, merged over
the .env defaults and validated on PUT /api/settings. /api/names
suggests names from recent tickets, and weather is cached per zip from a
fixed list of campuses.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 21:04:22 -04:00
b6ef6a195c Replace shared device-code token with per-user Zoho sign-in
Each user now signs in with their own Zoho account through the web
OAuth flow (Server-based Application client), and every SDP query runs
with that user's token. Nobody who reaches the page can see data
without signing in.

- auth.js: authorization URL, code exchange, token renewal, revoke and
  user info, replacing the device-code flow.
- session.js: tokens kept in an AES-256-GCM encrypted, HttpOnly,
  SameSite=Lax cookie keyed by SESSION_SECRET. The access token renews
  when due, concurrent calls share one renewal, and sessions end after
  SESSION_DAYS.
- routes.js: /auth/login, /auth/callback (state checked), /auth/logout
  (revokes at Zoho); /api/session, /api/closed, /api/workload and
  /api/weather all need a sign-in.
- The server is stateless. boardService.js, tokenStore.js, ADMIN_KEY
  and data/token.json are gone. The page runs the checks itself and
  keeps the closed feed, backfilling 12 hours on first load.
- tickets.js: the closed feed query pages, and SDP 401s are rethrown
  so the user is signed out.
- server.js: PUBLIC_URL, trust proxy, security headers, /healthz.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 19:38:08 -04:00
3e79a24efd . 2026-10-15 19:07:07 -04:00
c75b5889cf Update credits and licensing 2026-10-15 15:38:59 -04:00
8c7b5fbd26 Slopify This Thang 2026-10-15 15:23:05 -04:00
Isaac
bccee24f19 Updated the readme to give more detailed setup and added a few comments to the server.js to describe the editable values. 2026-07-27 14:34:27 -04:00
Isaac
14bc03be93 Used AI to seperate the files a bit more. And fixed the bugs that were caused by it. 2026-07-27 13:58:13 -04:00
Isaac
d3f3387183 Separated server.js to make a modular setup should be a bit nicer now. Also fixed the weird bug where when clicking connect it would open a second tab instead of just opening zoho. 2026-07-27 13:36:08 -04:00
Isaac
d15838d970 UI and a few server.js changes 2026-07-27 13:13:43 -04:00
Isaac
a6796b343c Refixed the resolved tickets not showing after claude killed it. And added a sound whenever new tickets appear. It is in the script section of the html page not in the JS script as it would not work there. 2026-07-24 14:58:30 -04:00
Isaac
7a59fd0cd4 Gave claude my back end and it came up with this front end 2026-07-24 14:33:41 -04:00