toga-ai 1.0.714 → 1.0.716
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.
- package/knowledge/1.0/apps/worker/features/netsuite-togasupply-per-client-sync.md +40 -1
- package/knowledge/2.0/apps/toga-blox/INDEX.md +2 -2
- package/knowledge/2.0/apps/toga-blox/features/blox-authoring-defects.md +35 -2
- package/knowledge/2.0/apps/toga-blox/features/primary-table-templates.md +63 -2
- package/knowledge/2.0/apps/toga-blox/features/table.md +7 -2
- package/knowledge/2.0/apps/toga-blox/workflows/local-link-into-a-consumer-app.md +16 -0
- package/package.json +1 -1
|
@@ -6,7 +6,7 @@ project: Worker
|
|
|
6
6
|
client: shared
|
|
7
7
|
type: feature
|
|
8
8
|
status: active
|
|
9
|
-
updated: 2026-08-
|
|
9
|
+
updated: 2026-08-31
|
|
10
10
|
owners: ["dfranks", "bala", "jcardinal", "mhammontree", "snaredla"]
|
|
11
11
|
files:
|
|
12
12
|
- worker/crons/toga2/netsuite/common_sync_togasupply.php
|
|
@@ -732,6 +732,35 @@ Parameters are stored **per client DB** but accessed **through the TOGa2 API**,
|
|
|
732
732
|
line). **Fix (`library`):** skip lines whose `adjustQtyBy` is null in **BOTH** passes over
|
|
733
733
|
`inventoryList->inventory` (the item-build pass and the serial/unit pass). Shared fix; unblocked NYCHH
|
|
734
734
|
inventory adjustments.
|
|
735
|
+
- **⚠ Item-receipt sync froze on a PARTIAL receipt's NULL-quantity PO lines — the item-receipt TWIN of the
|
|
736
|
+
inventory-adjustment NULL-quantity fix above (fixed 2026-08-31).** For a partial item receipt NetSuite
|
|
737
|
+
returns **all** the PO's linked lines but sets `quantity=null` on the lines **not received on this
|
|
738
|
+
receipt** (SuiteQL `transactionline.quantity` is NULL for an un-received PO line). The REST shim
|
|
739
|
+
`App_Api_Netsuite_Rest::fetchItemReceiptById` (`rest.php` ~L2196) faithfully carries that null, and
|
|
740
|
+
`syncItemReceiptFromNetsuite` wrote those null lines into the `POST /v2/item-receipts` payload →
|
|
741
|
+
`ItemReceiptItems.quantity` is `NOT NULL` → api2 `EV-10` / MySQL **1048** "Column 'quantity' cannot be
|
|
742
|
+
null", the section threw (no per-record try/catch — fail-loud by design), and froze at `1-RUNNING`
|
|
743
|
+
re-trying the same poison receipt every 5 min. Seen on **NYCHH** ITEM_RECEIPTS: stuck on receipt **#22302**
|
|
744
|
+
(NetSuite internalId 3425518, dated 2023-05-01; 5 PO lines, 2 received qty 260, 3 returned null), watermark
|
|
745
|
+
frozen at 2023-05-01, throwing every run (`Logs.Issue 578`, "Invalid API Response" from
|
|
746
|
+
`send()` `toga2.php:3517`). **Fix (`library`):** skip line items whose `quantity` **`is_null`** (NOT
|
|
747
|
+
`empty`, so a legitimate received qty of 0 still writes) in **BOTH** passes over
|
|
748
|
+
`$nsItemReceipt->itemList->item` — the payload-build loop (~L3376) and the unit/serial pass (~L3538).
|
|
749
|
+
Shared fix; no signature change, no SQL. Recovery is automatic: the watermark sits at the failing window's
|
|
750
|
+
start, so on deploy the section self-heals (RUNNING→IDLE, watermark advances past #22302, window regrows).
|
|
751
|
+
Diagnosis chain (reinforces the playbook above): `Client_Nychh.Parameters` to localize the stuck section
|
|
752
|
+
(`1-RUNNING` + frozen watermark) → `Logs.Event` filtered by `clientId=3` for the crash file:line +
|
|
753
|
+
`transactionId` (`Logs.Event` carries `clientId`, `Logs.Issue` does not) → `Logs_Nychh.Api` on that
|
|
754
|
+
`transactionId` for the untruncated `EV-10`/1048 rejection and the payload showing the `quantity:null`
|
|
755
|
+
lines.
|
|
756
|
+
- **⚠ OPEN, not yet root-caused (found 2026-08-31): NYCHH ITEM_FULFILLMENTS watermark frozen at 2021-12-29.**
|
|
757
|
+
`NETSUITE_EXECUTION_MODE_ITEM_FULFILLMENTS='3-IDLE'` with the window collapsed to ~3s (it has been
|
|
758
|
+
throwing recently) but currently **IDLE** — so it crawls a few seconds per run rather than sitting in a
|
|
759
|
+
hard `1-RUNNING` freeze. Distinct from the fixed ITEM_RECEIPTS freeze above; needs its own investigation.
|
|
760
|
+
Context: the 2026-08-31 full 19-client togasupply prod sweep found all other clients healthy
|
|
761
|
+
(`864000-IDLE`) except Elite SALES_ORDERS `864000-RUNNING` (healthy mid-run, large window, not stuck) and
|
|
762
|
+
AIG SALES_ORDERS `8-RUNNING` (the known held account, already documented). Only NYCHH ITEM_RECEIPTS was in
|
|
763
|
+
a true `1-RUNNING` freeze.
|
|
735
764
|
- **⚠ Item-fulfillment stale-item prune must delete tracking-number children before the unit AND the item
|
|
736
765
|
(fixed 2026-08-30).** In `syncItemFulfillmentFromNetsuite`'s cleanup loop, deleting a stale
|
|
737
766
|
item-fulfillment-item-**unit** failed api2 `EV-11` / MySQL **1451** (FK
|
|
@@ -792,6 +821,16 @@ Parameters are stored **per client DB** but accessed **through the TOGa2 API**,
|
|
|
792
821
|
|
|
793
822
|
## Change history
|
|
794
823
|
|
|
824
|
+
- 2026-08-31 — **Item-receipt partial-receipt NULL-quantity fix (shared, `library`).**
|
|
825
|
+
`syncItemReceiptFromNetsuite` now **skips line items whose `quantity` is null** (unreceived PO lines on a
|
|
826
|
+
partial receipt) in both passes over `$nsItemReceipt->itemList->item` (payload-build ~L3376 + unit/serial
|
|
827
|
+
~L3538), guarded on `is_null` so a received qty of 0 still writes. This is the item-receipt twin of the
|
|
828
|
+
2026-08-30 inventory-adjustment NULL-quantity skip — the receipt path never got that guard. It unfroze
|
|
829
|
+
NYCHH ITEM_RECEIPTS (stuck `1-RUNNING` on receipt #22302 / NetSuite 3425518 / 2023-05-01 → `EV-10`/1048
|
|
830
|
+
"quantity cannot be null", `Logs.Issue 578`); self-heals on deploy. Also flagged an OPEN item: NYCHH
|
|
831
|
+
ITEM_FULFILLMENTS watermark frozen at 2021-12-29 (`3-IDLE`, window collapsed to ~3s), not yet root-caused.
|
|
832
|
+
19-client sweep otherwise healthy. `library` only, no SQL, `php -l` clean; not deployed at capture time.
|
|
833
|
+
(jcardinal)
|
|
795
834
|
- 2026-08-31 — **Invoice + serial-unit + duplicate-Item root-cause fixes (shared, `library`).**
|
|
796
835
|
`syncInvoiceFromNetsuite` now assigns a **sequential 1..N invoice `lineNumber`** (NetSuite reuses `line`
|
|
797
836
|
across multi-SO invoices → `InvoiceItems UNIQUE(invoiceId,lineNumber)` 1062 → atomic rollback → NYCHH
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
| [AdvancedSelect (virtualized single/multi select)](features/advanced-select.md) | `AdvancedSelect<T>` is a **fully controlled, virtualized** single/multi select built from scratch (not react-select) on **`@tanstack/react-virtual`**, for large | toga-blox/src/components/AdvancedSelect/AdvancedSelect.tsx, toga-blox/src/components/AdvancedSelect/AdvancedSelect.types.ts, toga-blox/src/components/AdvancedSelect/AdvancedSelect.module.css |
|
|
8
8
|
| [API client (axios wrapper, auth, table-data fetchers)](features/api-client.md) | `src/api/` is a thin **axios** wrapper that standardizes the **2.0 API envelope**, manages auth (Bearer + refresh), serializes complex query options, and provid | toga-blox/src/reactQuery/queryHelpers.ts, toga-blox/src/api/index.ts, toga-blox/src/api/axiosInstance.ts, toga-blox/src/api/apiFunctions.ts, toga-blox/src/api/auth.ts, toga-blox/src/api/genericApi.ts, toga-blox/src/api/types.ts, toga-blox/src/api/tableData |
|
|
9
9
|
| [BaseInput (react-hook-form field factory)](features/base-input.md) | `BaseInput` is a **form-field factory** driven by react-hook-form. | toga-blox/src/components/BaseInput/BaseInput.tsx, toga-blox/src/components/BaseInput/BaseInput.types.ts, toga-blox/src/components/BaseInput/BaseInput.module.css, toga-blox/src/components/BaseInput/components |
|
|
10
|
-
| [blox authoring defect backlog (fix IN blox, not around it)](features/blox-authoring-defects.md) | The standing list of **defects to fix inside `@agilant/toga-blox`**. | toga-blox/src/components/BaseButton, toga-blox/src/api/auth.ts, toga-blox/src/api/axiosInstance.ts, toga-blox/src/reactQuery/queryHelpers.ts, toga-blox/src/components/BaseInput, toga-blox/tsconfig.json, toga-blox/package.json |
|
|
11
|
-
| [Primary Table templates (server/client, sizing, virtualization)](features/primary-table-templates.md) | `src/templates/PrimaryTable/` is the **production, wired-up table** built on the [Table component](table.md). | toga-blox/src/components/Table/themeConfig/toga.module.css, toga-blox/src/templates/PrimaryTable/PrimaryTable.tsx, toga-blox/src/templates/PrimaryTable/PrimaryTableServerTemplate.tsx, toga-blox/src/templates/PrimaryTable/PrimaryTableClientTemplate.tsx, toga-blox/src/templates/PrimaryTable/PrimaryTableHeaderCell.tsx, toga-blox/src/templates/PrimaryTable/PrimaryTableBodyCell.tsx, toga-blox/src/templates/PrimaryTable/PrimaryTableRow.tsx, toga-blox/src/templates/PrimaryTable/PrimaryTableExpandableRow.tsx, toga-blox/src/templates/PrimaryTable/types.ts |
|
|
10
|
+
| [blox authoring defect backlog (fix IN blox, not around it)](features/blox-authoring-defects.md) | The standing list of **defects to fix inside `@agilant/toga-blox`**. | toga-blox/src/components/BaseButton, toga-blox/src/components/Table/themeConfig/toga.module.css, toga-blox/src/api/auth.ts, toga-blox/src/api/axiosInstance.ts, toga-blox/src/reactQuery/queryHelpers.ts, toga-blox/src/components/BaseInput, toga-blox/tsconfig.json, toga-blox/package.json |
|
|
11
|
+
| [Primary Table templates (server/client, sizing, virtualization)](features/primary-table-templates.md) | `src/templates/PrimaryTable/` is the **production, wired-up table** built on the [Table component](table.md). | toga-blox/src/components/Table/themeConfig/toga.module.css, toga25-supply/src/themeConfig.json, toga-blox/src/templates/PrimaryTable/PrimaryTable.tsx, toga-blox/src/templates/PrimaryTable/PrimaryTableServerTemplate.tsx, toga-blox/src/templates/PrimaryTable/PrimaryTableClientTemplate.tsx, toga-blox/src/templates/PrimaryTable/PrimaryTableHeaderCell.tsx, toga-blox/src/templates/PrimaryTable/PrimaryTableBodyCell.tsx, toga-blox/src/templates/PrimaryTable/PrimaryTableRow.tsx, toga-blox/src/templates/PrimaryTable/PrimaryTableExpandableRow.tsx, toga-blox/src/templates/PrimaryTable/types.ts |
|
|
12
12
|
| [TableRecordModal (record-detail modal shell)](features/table-record-modal.md) | `TableRecordModal` is a **generic, presentational modal shell** for showing a single table record (row) in detail — typically opened from a table row click. | toga-blox/src/components/TableRecordModal/TableRecordModal.tsx, toga-blox/src/components/TableRecordModal/index.ts, toga-blox/src/components/TableRecordModal/tableRecordModal.module.css |
|
|
13
13
|
| [Table component (cells, action cells, filters & sorts, hooks, theming)](features/table.md) | The `Table` component (`src/components/Table/`) is the **TanStack Table v8** building block behind the [Primary Table templates](primary-table-templates.md). | toga-blox/src/components/Table/hooks/useFetchTablePageMeta.ts, toga-blox/src/api/types.ts, toga-blox/src/components/Table/index.ts, toga-blox/src/components/Table/types.ts, toga-blox/src/components/Table/utils/buildTanstackColumns.tsx, toga-blox/src/components/Table/utils/resolveCellType.tsx, toga-blox/src/components/Table/components/cellTypes, toga-blox/src/components/Table/components/actionCells, toga-blox/src/components/Table/components/columnFiltersAndSorts, toga-blox/src/components/Table/hooks, toga-blox/src/components/Table/themeConfig |
|
|
14
14
|
| [Talos AI-Assistant Component (launcher + docked/drawer chat panel)](features/talos-assistant.md) | `Talos` is a **shared, pure-UI** AI-assistant component in `@agilant/toga-blox`: a header launcher button (`TalosLauncher`) plus a chat panel (`TalosPanel`) tha | toga-blox/src/components/Talos/TalosLauncher.tsx, toga-blox/src/components/Talos/TalosPanel.tsx, toga-blox/src/components/Talos/TalosMessage.tsx, toga-blox/src/components/Talos/types.ts, toga-blox/src/components/Talos/theme.ts, toga-blox/src/components/Talos/helpers.tsx, toga-blox/src/components/Talos/stub.ts, toga-blox/src/components/Talos/Talos.module.css, toga-blox/src/components/Talos/index.ts, toga-blox/src/components/index.ts |
|
|
@@ -6,10 +6,11 @@ project: TOGa Blox
|
|
|
6
6
|
client: shared
|
|
7
7
|
type: feature
|
|
8
8
|
status: active
|
|
9
|
-
updated: 2026-08-
|
|
10
|
-
owners: [apeterson]
|
|
9
|
+
updated: 2026-08-31
|
|
10
|
+
owners: [apeterson, tcox]
|
|
11
11
|
files:
|
|
12
12
|
- toga-blox/src/components/BaseButton
|
|
13
|
+
- toga-blox/src/components/Table/themeConfig/toga.module.css
|
|
13
14
|
- toga-blox/src/api/auth.ts
|
|
14
15
|
- toga-blox/src/api/axiosInstance.ts
|
|
15
16
|
- toga-blox/src/reactQuery/queryHelpers.ts
|
|
@@ -108,6 +109,32 @@ declarations to the base button class. Until then a consumer must compensate at
|
|
|
108
109
|
[surface-frontend](../../toga25-supply/features/surface-frontend.md)). **Do not patch the shared blox
|
|
109
110
|
stylesheet from a consumer**: every one of the ~40 call sites inherits it.
|
|
110
111
|
|
|
112
|
+
### 5. Hardcoded visual values in the shared stylesheets are unremovable by a consumer
|
|
113
|
+
|
|
114
|
+
**Mechanism.** blox styles are scoped CSS Modules driven by host tokens (frontend standard §13e), but
|
|
115
|
+
several declarations still carry **literal** values instead of `var(--token, <value>)`. A literal has
|
|
116
|
+
no escape hatch: the consuming app cannot override a class it cannot name, and the host-token layer
|
|
117
|
+
is the only supported styling surface.
|
|
118
|
+
|
|
119
|
+
**Consumer symptom.** "The design says remove this and I can't." Worked example (2026-08-31): the
|
|
120
|
+
`supply`-skin table card shadow was a literal `box-shadow: 0 1px 3px rgba(0,0,0,0.1)` on
|
|
121
|
+
`.tableAndPaginationInner.supply` / `.tableWrapper.supply`, so a toga25-supply design review that
|
|
122
|
+
required *no* table shadow had nothing to set. **Fixed for that property** —
|
|
123
|
+
`var(--primaryTable-box-shadow, 0 1px 3px rgba(0,0,0,0.1))`. The class of defect remains: audit the
|
|
124
|
+
rest of `toga.module.css` and the other component stylesheets the same way.
|
|
125
|
+
|
|
126
|
+
**Fix direction.** When a literal is found, convert it in place to
|
|
127
|
+
`var(--<component>-<prop>, <the existing literal>)`. The fallback makes this **non-breaking** — every
|
|
128
|
+
consumer that defines nothing keeps the exact historical look — so it does not need the coordinated
|
|
129
|
+
bump the other defects here do. Do **not** solve it by patching the shared stylesheet from a consumer
|
|
130
|
+
or by `!important` in app CSS.
|
|
131
|
+
|
|
132
|
+
**Related smell — literals that reference tokens no app defines.** `.headerCell.edgeLeft::after` /
|
|
133
|
+
`.edgeRight::before` styled a divider with `--toga-color-border-default`, a token no consuming app
|
|
134
|
+
declares, on class names `getStickyClass` never emits. Dead rules like this look authoritative when
|
|
135
|
+
someone greps for the divider. Both were deleted 2026-08-31; grep the emitting code before trusting a
|
|
136
|
+
CSS rule, and check the token it names actually exists in a host theme.
|
|
137
|
+
|
|
111
138
|
## Already-known authoring items (carried over from §22)
|
|
112
139
|
|
|
113
140
|
These are long-standing and were previously recorded only as consumer-side advice:
|
|
@@ -141,6 +168,12 @@ These are long-standing and were previously recorded only as consumer-side advic
|
|
|
141
168
|
time**, with no PR. Sequence auth fixes deliberately.
|
|
142
169
|
|
|
143
170
|
## Change history
|
|
171
|
+
- 2026-08-31 — Added styling defect **5: hardcoded visual values in the shared stylesheets cannot be
|
|
172
|
+
removed by a consumer** — a literal has no host-token escape hatch. Worked example: the `supply`
|
|
173
|
+
table card shadow, which a toga25-supply design review needed gone; converted to
|
|
174
|
+
`var(--primaryTable-box-shadow, <old literal>)`, which is non-breaking because the fallback
|
|
175
|
+
preserves the historical look. Recorded the related smell of dead CSS naming tokens/classes that
|
|
176
|
+
nothing emits (`edgeLeft`/`edgeRight` + `--toga-color-border-default`, both deleted). (tcox)
|
|
144
177
|
- 2026-08-28 — Added styling defect **4: `BaseButton` `primary` vs `primaryAction` are not
|
|
145
178
|
interchangeable** — `.primaryBtnAction` sets font-size **and** `height: 26px`, `.primaryBtn` sets
|
|
146
179
|
neither, so swapping variants silently changes type size and button height. Found wiring the
|
|
@@ -6,10 +6,11 @@ project: TOGa Blox
|
|
|
6
6
|
client: shared
|
|
7
7
|
type: feature
|
|
8
8
|
status: active
|
|
9
|
-
updated: 2026-08-
|
|
10
|
-
owners: [apeterson]
|
|
9
|
+
updated: 2026-08-31
|
|
10
|
+
owners: [apeterson, tcox]
|
|
11
11
|
files:
|
|
12
12
|
- toga-blox/src/components/Table/themeConfig/toga.module.css
|
|
13
|
+
- toga25-supply/src/themeConfig.json
|
|
13
14
|
- toga-blox/src/templates/PrimaryTable/PrimaryTable.tsx
|
|
14
15
|
- toga-blox/src/templates/PrimaryTable/PrimaryTableServerTemplate.tsx
|
|
15
16
|
- toga-blox/src/templates/PrimaryTable/PrimaryTableClientTemplate.tsx
|
|
@@ -83,6 +84,40 @@ spacer rows computed from the virtualizer item `.start`/`.end` minus `scrollMarg
|
|
|
83
84
|
`supply-modal-table` skin **disables virtualization** (renders all rows, min-height 300px).
|
|
84
85
|
Sticky columns use a `--sticky-offset` CSS variable summed from neighboring column widths.
|
|
85
86
|
|
|
87
|
+
## Sticky columns: the divider line and first-column padding
|
|
88
|
+
|
|
89
|
+
**The fixed-column divider is a rendered `<span>`, not a pseudo-element.**
|
|
90
|
+
`PrimaryTableHeaderCell` / `PrimaryTableBodyCell` render an absolutely-positioned 1px
|
|
91
|
+
`.stickyEdgeLine` (+ `.stickyEdgeLineLeft` / `.stickyEdgeLineRight`) inside the sticky cell,
|
|
92
|
+
colored `--primaryTable-border-default`. The header variant (`.headerEdgeLine`) is
|
|
93
|
+
`height: calc(100% + 1px)` so it covers the 1px transparent collapsed border on
|
|
94
|
+
`.bodyRow:first-child` — without the overhang a white seam shows between the header's line and
|
|
95
|
+
the first row's. Header cells are never clipped (`truncateCells` sets `overflow:hidden` on
|
|
96
|
+
`.bodyCell` only), so the overhang is safe.
|
|
97
|
+
|
|
98
|
+
**A sticky FIRST column needs its own padding rule.** `.bodyCell.stickyCell` (`padding: 12px 16px`)
|
|
99
|
+
and `.bodyCell:first-child` (`padding: 10px 25px 10px 20px`) have **equal specificity**, so the
|
|
100
|
+
later one in the file wins — a left-pinned first column silently dropped to 16px left padding
|
|
101
|
+
while `.headerCell:first-child` kept 20px, misaligning header against body.
|
|
102
|
+
`.bodyCell.stickyCell:first-child` restores the 20px, and it **must sit after
|
|
103
|
+
`.bodyCell.stickyCell` and before `.bodyCell.stickyCell.actionCell`** so a start-positioned action
|
|
104
|
+
column still wins its `padding: 0`.
|
|
105
|
+
|
|
106
|
+
## Host tokens in `toga.module.css`
|
|
107
|
+
|
|
108
|
+
Design tokens are `--primaryTable-*`; blox ships **class rules only, zero token values** (see
|
|
109
|
+
frontend standard §13e), so each is written `var(--token, <historical value>)` and the fallback is
|
|
110
|
+
what preserves the existing look for consumers that never define it.
|
|
111
|
+
|
|
112
|
+
- **`--primaryTable-box-shadow`** — the `supply`-skin card shadow on
|
|
113
|
+
`.tableAndPaginationInner.supply` and `.tableWrapper.supply`. Fallback
|
|
114
|
+
`0 1px 3px rgba(0,0,0,0.1)` (the value that used to be hardcoded). `toga25-supply` sets
|
|
115
|
+
`"--primaryTable-box-shadow": "none"` in its `src/themeConfig.json` DEFAULT theme to remove the
|
|
116
|
+
shadow app-wide for every client build. The `desk` / nested skins set `box-shadow: none`
|
|
117
|
+
directly and are unaffected.
|
|
118
|
+
- **`--primaryTable-border-default`** — every table rule line, including the sticky edge line.
|
|
119
|
+
`toga25-supply` resolves it to `--gray-300` (#D4D5D8).
|
|
120
|
+
|
|
86
121
|
## The "Show more" hover affordance is CSS-driven, not JS-driven
|
|
87
122
|
|
|
88
123
|
A truncated body cell reveals its "Show more" toggle **on hover via CSS only**:
|
|
@@ -106,6 +141,15 @@ runs unconditionally — it no longer no-ops while `isExpanded`.
|
|
|
106
141
|
cell's text ellipsizes marginally earlier until the next `mouseleave`. Cosmetically invisible;
|
|
107
142
|
clearing it properly would need a per-cell scroll listener.
|
|
108
143
|
|
|
144
|
+
- **Don't hardcode a themeable value in `toga.module.css`.** A hardcoded property is unremovable by
|
|
145
|
+
a consuming app — there is no `!important` escape hatch through the host-token layer. Expose it as
|
|
146
|
+
`var(--primaryTable-<prop>, <the current hardcoded value>)`: the app gains control and every other
|
|
147
|
+
consumer keeps the historical look with no change.
|
|
148
|
+
- **`edgeLeft` / `edgeRight` were dead classes.** `.headerCell.edgeLeft::after` /
|
|
149
|
+
`.headerCell.edgeRight::before` were removed (2026-08-31) — `getStickyClass` never emitted those
|
|
150
|
+
class names in `src` **or** the published `dist`, and they referenced
|
|
151
|
+
`--toga-color-border-default`, a token no consuming app defines. Chasing the fixed-column divider
|
|
152
|
+
through them is a dead end; it is the `stickyEdgeLine` span above.
|
|
109
153
|
- Frozen widths measure only **mounted** rows; virtualized tables size from the first paint set.
|
|
110
154
|
- **Header labels must never abbreviate or overlap.** The full header width is a hard floor
|
|
111
155
|
(above `maxColumnWidth`, `minColumnWidth`, and pinned `columnWidths`). Measure header width
|
|
@@ -120,6 +164,23 @@ runs unconditionally — it no longer no-ops while `isExpanded`.
|
|
|
120
164
|
not the column set.
|
|
121
165
|
|
|
122
166
|
## Change history
|
|
167
|
+
- 2026-08-31 — Host-tokenized the `supply`-skin table shadow: `.tableAndPaginationInner.supply` /
|
|
168
|
+
`.tableWrapper.supply` now use `box-shadow: var(--primaryTable-box-shadow, 0 1px 3px rgba(0,0,0,0.1))`,
|
|
169
|
+
adding `--primaryTable-box-shadow` to the host-token set (a design review needed the shadow gone and
|
|
170
|
+
no token existed; the fallback keeps every other consumer identical). `toga25-supply` sets it to
|
|
171
|
+
`none` in `src/themeConfig.json`. Also **removed dead** `.headerCell.edgeLeft::after` /
|
|
172
|
+
`.edgeRight::before` (never emitted by `getStickyClass` in src or dist; referenced an undefined
|
|
173
|
+
token) and documented the real `stickyEdgeLine` divider. Also fixed a latent misalignment: added
|
|
174
|
+
`.bodyCell.stickyCell:first-child { padding: 10px 25px 10px 20px }` (equal-specificity clash where
|
|
175
|
+
`.bodyCell.stickyCell` beat `.bodyCell:first-child`), placed before `.actionCell` so action columns
|
|
176
|
+
keep `padding: 0`. Blox side is working-tree-only on `TRUE-80767` — unpublished. (tcox)
|
|
177
|
+
- 2026-08-31 — Verified the June-19 table clipping / overlapping-text report is **fully resolved** in
|
|
178
|
+
the production-channel release `1.1.1-production.139` that `toga25-supply` consumes: the Aug-17
|
|
179
|
+
`headerFloors` hard-floor + deterministic header measurement, the Aug-26 CSS-hover "Show more"
|
|
180
|
+
toggle fix, and the Aug-26 `NEVER_EXPANDABLE_TYPES` status-badge fix are all physically present in
|
|
181
|
+
the installed `dist`. Timeline for context: resizable columns + `table-layout: fixed` landed
|
|
182
|
+
2026-06-16 (`de00d067`) with the truncation system only half-built, so June-19 caught a mid-rollout
|
|
183
|
+
state; the durable fixes landed 2026-07-21 → 2026-08-26. No code change. (tcox)
|
|
123
184
|
- 2026-08-26 — Fixed: the "Show more" toggle got stuck visible on cells the mouse was not hovering.
|
|
124
185
|
`.toggle` already had `opacity: 0` + a CSS hover rule, but `PrimaryTableBodyCell` inline-set
|
|
125
186
|
`opacity: 1` unconditionally (inline beats the cascade), so visibility depended entirely on the
|
|
@@ -6,8 +6,8 @@ project: TOGa Blox
|
|
|
6
6
|
client: shared
|
|
7
7
|
type: feature
|
|
8
8
|
status: active
|
|
9
|
-
updated: 2026-08-
|
|
10
|
-
owners: [apeterson]
|
|
9
|
+
updated: 2026-08-31
|
|
10
|
+
owners: [apeterson, tcox]
|
|
11
11
|
files:
|
|
12
12
|
- toga-blox/src/components/Table/hooks/useFetchTablePageMeta.ts
|
|
13
13
|
- toga-blox/src/api/types.ts
|
|
@@ -217,6 +217,11 @@ layer and emits it — see
|
|
|
217
217
|
requires `npm run build` before it takes effect at runtime.
|
|
218
218
|
|
|
219
219
|
## Change history
|
|
220
|
+
- 2026-08-31 — Verified the `NEVER_EXPANDABLE_TYPES` status-badge fix (and the related header/
|
|
221
|
+
truncation fixes) are present in the **production-channel** release `1.1.1-production.139`, not just
|
|
222
|
+
the `sandbox-client` build below — the June-19 clipping/overlapping-text report is closed for
|
|
223
|
+
`toga25-supply`. See
|
|
224
|
+
[primary-table-templates](primary-table-templates.md). No code change. (tcox)
|
|
220
225
|
- 2026-08-26 — Fixed: status columns rendered as truncated text with a "Show more" toggle instead of
|
|
221
226
|
a badge. Root cause was in `resolveCellType` — the `isExpandableCell` branch **discards** the
|
|
222
227
|
rendered `content` and re-renders the raw `value` in `ExpandableCell`. Added
|
|
@@ -127,6 +127,18 @@ The consumer reads blox's `dist`, so rebuild blox after every change.
|
|
|
127
127
|
|
|
128
128
|
## Gotchas
|
|
129
129
|
|
|
130
|
+
- **Confirm the link actually exists before you trust it — docs and memory go stale.**
|
|
131
|
+
Verified 2026-08-31: `toga25-supply/node_modules/@agilant/toga-blox` is a **real registry install**
|
|
132
|
+
pinned exactly at `1.1.1-production.139`, **not** a junction to `toga-blox-npm` (checked with
|
|
133
|
+
PowerShell `(Get-Item <path>).LinkType` → empty). Its architecture doc still claimed a symlink. On a
|
|
134
|
+
registry install, editing blox `src` — even rebuilding blox — reaches the app **only** via publish +
|
|
135
|
+
pin bump ([dynamic-publish-pipeline](./dynamic-publish-pipeline.md)). Check `LinkType` (or
|
|
136
|
+
`ls -l` / `fsutil reparsepoint query`) first; the symptom of getting this wrong is "my change does
|
|
137
|
+
nothing" with a perfectly good build.
|
|
138
|
+
- **The urgent-case escape hatch is patching the INSTALLED `dist`, and it is ephemeral.** Mirroring
|
|
139
|
+
the source edit into `node_modules/@agilant/toga-blox/dist/**` gives immediate dev visibility, but
|
|
140
|
+
the next `npm install` / `npm ci` (and every CI build) wipes it. It is a preview, never a
|
|
141
|
+
deliverable — the change still has to publish and the consumer still has to bump its pin.
|
|
130
142
|
- **`prebuild` does `rm -rf dist`.** A consumer dev server that requests a chunk mid-rebuild
|
|
131
143
|
serves a 500 and then recovers on the next compile. It is not a real failure — rebuild, reload.
|
|
132
144
|
- **`.next/dev` is locked per app.** A second `next dev` refuses to start while another instance
|
|
@@ -142,6 +154,10 @@ The consumer reads blox's `dist`, so rebuild blox after every change.
|
|
|
142
154
|
drags every component's CSS into the consumer bundle.
|
|
143
155
|
|
|
144
156
|
## Change history
|
|
157
|
+
- 2026-08-31 — Added the "is it actually linked?" check: `toga25-supply` is on a **real registry
|
|
158
|
+
install** of `1.1.1-production.139` (`LinkType` empty), not a junction, so blox source edits reach
|
|
159
|
+
it only through publish + pin bump; and recorded that the urgent-case **installed-`dist` patch** is
|
|
160
|
+
ephemeral (wiped by the next `npm install`, never present in CI). (tcox)
|
|
145
161
|
- 2026-08-31 — Closed out the duplicate-`react-query` case with the parts that made it hard:
|
|
146
162
|
**both copies were the SAME version (5.101.4)** — identity, not version, is what breaks context;
|
|
147
163
|
`optimizeDeps.include` pre-bundles blox with its nested copy so the throw appears to originate
|
package/package.json
CHANGED