toga-ai 1.0.598 → 1.0.600
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -6,7 +6,7 @@ project: TOGa Desk
|
|
|
6
6
|
client: shared
|
|
7
7
|
type: feature
|
|
8
8
|
status: active
|
|
9
|
-
updated: 2026-
|
|
9
|
+
updated: 2026-08-17
|
|
10
10
|
owners: ["mhammontree"]
|
|
11
11
|
files:
|
|
12
12
|
- desk/includes/controllers/actions/tickets/add.php
|
|
@@ -52,6 +52,32 @@ downstream repair-order lifecycle (dispatch, scheduling, status) lives in
|
|
|
52
52
|
`RepairOrder`. In the `TYPE_ONSITESERVICE` branch it reads optional per-asset fields
|
|
53
53
|
(`installation`, `access-instructions`) — see the getVar gotcha below.
|
|
54
54
|
|
|
55
|
+
### Schedule dates are mandatory for INSTALLATION (analyst workflow — TRUE-80338)
|
|
56
|
+
**Creating an Installation MSO now requires both Delivery Date (`duedate`) and Installation Date
|
|
57
|
+
(`install-date`).** Analysts can no longer create an unscheduled installation.
|
|
58
|
+
|
|
59
|
+
- **The Schedule toggle is not offered for installation tickets.** The installation ticket-type
|
|
60
|
+
handler (`addNew.php` ~L1919–1928) force-checks `#scheduler`, adds `.required` to `#duedate` and
|
|
61
|
+
`#install-date`, shows `.schedule-required-indicator`, and **hides** `.schedule-toggle` (a class
|
|
62
|
+
on both the "Schedule" caption label and the switch label). Picking Support / New Equipment /
|
|
63
|
+
Repair restores the toggle, hides the indicator, and removes `.required` — those types keep the
|
|
64
|
+
dates optional.
|
|
65
|
+
- **The asterisk is a toggled `<span class="schedule-required-indicator"> *</span>`**, not label
|
|
66
|
+
text, because the same Schedule block is shared with Repair, where the dates stay optional.
|
|
67
|
+
- **Server-side backstop, before the first `save()`.** `add.php` ~L49–55 computes
|
|
68
|
+
`$scheduleDatesRequired` from the ticket type and `$scheduleDatesProvided` from the two dates,
|
|
69
|
+
and folds the guard into the existing `if (isset($ticketType) && …)` — the single `if` that
|
|
70
|
+
encloses **every** `save()`. Rejection reuses the existing generic status code `21`
|
|
71
|
+
(add-failed); a precise message would need a `statuscodes` migration and was left out of scope.
|
|
72
|
+
- **The date writes no longer depend on `scheduler` being posted:** ~L361 is
|
|
73
|
+
`if ($scheduleDatesRequired || (App_Page::varIsSet('scheduler') && …))`, and both dates are read
|
|
74
|
+
with `getVarIfSet()`, per the getVar gotcha below.
|
|
75
|
+
- **Support Department (`#departmentid`) is genuinely required** and its label now says
|
|
76
|
+
"Support Department *". It is enforced three ways: `class="required"` on the select feeds the
|
|
77
|
+
`.required` sweep that gates the disabled Create button; that sweep carries an extra explicit
|
|
78
|
+
`$('#departmentid').val() != 0` check (~L1821); and `add.php` reads it with the **throwing**
|
|
79
|
+
`getVar('departmentid')`.
|
|
80
|
+
|
|
55
81
|
### Address sourcing — per-person vs. client location (important)
|
|
56
82
|
There are **two** address sources, and they come from different tables:
|
|
57
83
|
- **End User Address dropdown (`#userlocation`)** is per **person**. `getinfo.php` (uid branch,
|
|
@@ -96,11 +122,40 @@ End User dropdown. Dropping that UNION is **long-standing, not a recent regressi
|
|
|
96
122
|
deadlock. **Fix:** the validator now also reads `newAddressCount = parseInt($('#newAddressCount')
|
|
97
123
|
.val())||0` and only blocks when `selectedValue == 0 AND newAddressCount == 0`, since the server
|
|
98
124
|
already supports the inline address.
|
|
125
|
+
- **Never `disable` a checkbox you still need posted.** For the forced-on Schedule case, `#scheduler`
|
|
126
|
+
is kept **checked and enabled** while hidden. A disabled checkbox does not post, so disabling it
|
|
127
|
+
would have silently stopped `scheduler=1` from reaching the server while everything still looked
|
|
128
|
+
correct in the UI. Hide, don't disable.
|
|
129
|
+
- **Validate before the first `save()`, not where the value is consumed.** The create block in
|
|
130
|
+
`add.php` writes people → addresses → managed service order → assets → repair orders in sequence
|
|
131
|
+
inside one `if`. Rejecting later (e.g. inside the per-asset loop at the `TYPE_ONSITESERVICE`
|
|
132
|
+
branch, where the dates are actually used) leaves **orphaned partial records**. There is no
|
|
133
|
+
transaction wrapping this flow.
|
|
134
|
+
- **`.required` classes toggled per ticket type must be cleared on every branch.** A pre-existing
|
|
135
|
+
leak added `.required` to `#duedate`/`#install-date` when Installation was picked but never
|
|
136
|
+
removed it, so it persisted after switching ticket type and wrongly gated the Create button. All
|
|
137
|
+
three non-installation handlers now `removeClass("required")`. Any new conditional required field
|
|
138
|
+
needs a matching clear in **every** sibling branch.
|
|
139
|
+
- **Label convention in this modal:** always-required fields append a literal `" *"` in the label
|
|
140
|
+
text (Ticket Type *, Contract *, End User *, Asset *, Repair Type *, First Name *, Support
|
|
141
|
+
Department *). **Conditionally**-required fields must instead use a toggled indicator span (see
|
|
142
|
+
`.schedule-required-indicator`) so the asterisk disappears with the requirement.
|
|
143
|
+
- **Known cosmetic bug (unfixed):** the Client radio-group label (`addNew.php` ~L27) is
|
|
144
|
+
`for="departmentid"` — a copy-paste leftover — so clicking "Client" moves focus to the Support
|
|
145
|
+
Department dropdown. A11y/cosmetic only; candidate follow-up ticket.
|
|
99
146
|
- The addNew modal has **no `<form>` tag of its own** — it depends entirely on the global
|
|
100
147
|
`#formModal` in `footer.php` and `$("form").submit()`. Anything that alters that global wrapper
|
|
101
148
|
(attributes, nesting) affects this flow.
|
|
102
149
|
|
|
103
150
|
## Change history
|
|
151
|
+
- 2026-08-17 — TRUE-80338: **Delivery Date + Installation Date are now required for INSTALLATION
|
|
152
|
+
MSOs** (analyst workflow change — demoed to Skyler and approved). The Schedule toggle is hidden
|
|
153
|
+
and force-checked for installation tickets; the asterisks are a toggled
|
|
154
|
+
`.schedule-required-indicator` span; a server-side backstop in `add.php` validates both dates
|
|
155
|
+
before the first `save()` (reusing status code 21) so a rejection cannot orphan partial records.
|
|
156
|
+
Also fixed a pre-existing `.required` leak on the two date fields when switching ticket type, and
|
|
157
|
+
added the missing required asterisk to Support Department. Recorded the "hide, don't disable a
|
|
158
|
+
checkbox you need posted" trap and the modal's required-label convention. (mhammontree)
|
|
104
159
|
- 2026-07-09 — TRUE-80100: documented the MSO create flow (entry, server action, per-person vs.
|
|
105
160
|
client-location address sourcing) and folded in three fixes: `getVar` → `getVarIfSet` for
|
|
106
161
|
optional request vars in the `TYPE_ONSITESERVICE` branch (server crash); `autocomplete` on
|
|
@@ -6,7 +6,7 @@ project: Tools
|
|
|
6
6
|
client: shared
|
|
7
7
|
type: feature
|
|
8
8
|
status: active
|
|
9
|
-
updated: 2026-08-
|
|
9
|
+
updated: 2026-08-18
|
|
10
10
|
owners: [kyalamarthi, jcardinal]
|
|
11
11
|
files:
|
|
12
12
|
- tools/assets/clickup/sprint-dashboard.html
|
|
@@ -51,8 +51,9 @@ The existing sprint board was left byte-for-byte unchanged — its component was
|
|
|
51
51
|
monitor poll is lifted into `Dashboard` and passed **down as props**, so the status panel and
|
|
52
52
|
the alert watcher share **one** fetch loop rather than polling twice.
|
|
53
53
|
|
|
54
|
-
Only the monitor fetch runs at `MONITOR_REFRESH_MS` (
|
|
55
|
-
existing 5-minute `AUTO_REFRESH_MS`.
|
|
54
|
+
Only the monitor fetch runs at `MONITOR_REFRESH_MS` (15s); sprint data stays on the page's
|
|
55
|
+
existing 5-minute `AUTO_REFRESH_MS`. At 15s, outage detection (beep/popup/blink) reacts within
|
|
56
|
+
~15s, and the ~250 KB cross-origin poll costs ~1 MB/min per open tab.
|
|
56
57
|
|
|
57
58
|
### Upstream contract — OneUptime public status-page overview API
|
|
58
59
|
|
|
@@ -114,7 +115,7 @@ them up is the bug:
|
|
|
114
115
|
|
|
115
116
|
| | Trigger | Drives | Why |
|
|
116
117
|
|---|---|---|---|
|
|
117
|
-
| **Event** | **Edge** — fires on the transition | beeps, popup, 5s blink | A level-triggered *event* re-alarms every
|
|
118
|
+
| **Event** | **Edge** — fires on the transition | beeps, popup, 5s blink | A level-triggered *event* re-alarms every 15s poll for a monitor that has been offline an hour, and the wall display becomes a siren nobody can silence. |
|
|
118
119
|
| **State** | **Level** — follows current state | standing edge tint, status circle | An edge-triggered *state* would show a clean screen when you open the page during an existing outage. **The board must never look healthy while it isn't.** |
|
|
119
120
|
|
|
120
121
|
**Event — `useMonitorAlerts`** compares each poll's non-operational rows against the previous
|
|
@@ -157,7 +158,7 @@ and no screen tint**: the level-triggered standing tint already clears itself wh
|
|
|
157
158
|
the set, and a green "all clear" popup/flash would fight the "the board only shouts when something
|
|
158
159
|
is wrong" design. So recovery is silent **visually** but audible. Two edge rules: the **first
|
|
159
160
|
poll is still the baseline** (opening the page mid-outage does not chime), and if a bad-state
|
|
160
|
-
change and a recovery land in the **same
|
|
161
|
+
change and a recovery land in the **same 15s poll the bad-state alert wins** that tick, avoiding
|
|
161
162
|
overlapping sounds (simultaneous transitions are rare).
|
|
162
163
|
|
|
163
164
|
**State — `standingRole(model)`** returns `critical` if any row is offline, else `warning` if any
|
|
@@ -194,11 +195,10 @@ Standing and blinking differ in intensity **and in animation tempo**, which is w
|
|
|
194
195
|
"still broken" distinguishable from "something just changed":
|
|
195
196
|
|
|
196
197
|
- `.alert-flash` (standing) — 12px rim, **slowly breathes** its opacity 0 → 1 → 0 on a
|
|
197
|
-
**
|
|
198
|
-
opacity: 1 } }`, applied `animation: alert-breathe
|
|
199
|
-
screen for hours, so the gentle
|
|
200
|
-
|
|
201
|
-
too subtle, full 0→1 over 10s too slow) to settle on full 0→1 over 7s.
|
|
198
|
+
**4-second ease-in-out loop** (`@keyframes alert-breathe { 0%,100% { opacity: 0 } 50% {
|
|
199
|
+
opacity: 1 } }`, applied `animation: alert-breathe 4s ease-in-out infinite` — a 4s cycle =
|
|
200
|
+
2s fade-in / 2s fade-out). It may sit on screen for hours, so the gentle breathe draws a
|
|
201
|
+
distant eye without reading as urgent. The tempo was tuned with the developer.
|
|
202
202
|
- `.alert-flash.is-blinking` (event) — 20px rim, `opacity: 1`, plus the fast **0.7s** pulse.
|
|
203
203
|
Its compound selector (0,2,0) out-specifies the standing breathe (0,1,0), so a just-changed
|
|
204
204
|
monitor shows the urgent fast blink, not the slow breathe.
|
|
@@ -245,7 +245,7 @@ Replace the direct browser → OneUptime poll with a small **server-side proxy e
|
|
|
245
245
|
Tools app (e.g. `/v2/monitors/status/`) that fetches upstream, reduces the payload to the
|
|
246
246
|
summary, and caches ~5s. Rationale:
|
|
247
247
|
|
|
248
|
-
- The browser currently pulls **~250 KB every
|
|
248
|
+
- The browser currently pulls **~250 KB every 15s (~1 MB/min per open tab)** to display about
|
|
249
249
|
six numbers; a proxy makes it ~1 KB.
|
|
250
250
|
- One upstream fetch is shared across **all** open displays instead of one per tab.
|
|
251
251
|
- It removes the cross-origin dependency, and therefore the CORS/autoplay coupling above.
|
|
@@ -254,6 +254,12 @@ summary, and caches ~5s. Rationale:
|
|
|
254
254
|
alerting really wants (today the baseline resets every time a tab reloads).
|
|
255
255
|
|
|
256
256
|
## Change history
|
|
257
|
+
- 2026-08-18 — Wall-display cadence tuning. The standing edge-tint breathe cycle changed from
|
|
258
|
+
5s to **4s** (`animation: alert-breathe 4s …` — 2s fade-in / 2s fade-out), and
|
|
259
|
+
`MONITOR_REFRESH_MS` changed from 5s to **15s**, so outage detection now reacts within ~15s
|
|
260
|
+
(was ~5s) and the ~250 KB cross-origin poll drops from ~3 MB/min to ~1 MB/min per open tab.
|
|
261
|
+
Also corrects prior doc drift: the breathe cycle had been documented as 7s but the code was
|
|
262
|
+
actually 5s. (jcardinal)
|
|
257
263
|
- 2026-08-14 — Generalised alert-sound synthesis and added a **recovery chime**. The old
|
|
258
264
|
`BEEP_COUNT`/`BEEP_HZ`/`BEEP_MS`/`BEEP_GAP_MS`/`BEEP_VOLUME` constants and the square-wave-only
|
|
259
265
|
`playBeeps` were replaced by a single per-role `ALERT_SOUND` table (count / freq / per-beep
|
package/knowledge/INDEX.md
CHANGED
|
@@ -19,7 +19,7 @@ _Auto-generated by `knowledge.js index`. Do not hand-edit._
|
|
|
19
19
|
## 2.0 framework
|
|
20
20
|
|
|
21
21
|
- **_underscore** (_Underscore) _(framework core)_ — 58 doc(s) → [2.0/apps/_underscore/INDEX.md](2.0/apps/_underscore/INDEX.md)
|
|
22
|
-
- **worker2** (Worker) —
|
|
22
|
+
- **worker2** (Worker) — 51 doc(s) → [2.0/apps/worker2/INDEX.md](2.0/apps/worker2/INDEX.md)
|
|
23
23
|
- **api2** (API) — 24 doc(s) → [2.0/apps/api2/INDEX.md](2.0/apps/api2/INDEX.md)
|
|
24
24
|
- **dbchanges2** (Database Changes) _(framework core)_ — 8 doc(s) → [2.0/apps/dbchanges2/INDEX.md](2.0/apps/dbchanges2/INDEX.md)
|
|
25
25
|
- **toga2-supply** (TOGa Supply) — 6 doc(s) → [2.0/apps/toga2-supply/INDEX.md](2.0/apps/toga2-supply/INDEX.md)
|
package/package.json
CHANGED