Deploy AIOS web (React glide grid + FastAPI slice)
Browse files- RELEASES.json +1 -1
- VERSION +1 -1
- web/src/customer-grid/CustomerGrid.tsx +27 -10
RELEASES.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
| 1 |
{
|
| 2 |
-
"current": "
|
| 3 |
"releases": [
|
| 4 |
{
|
| 5 |
"version": "v53",
|
|
|
|
| 1 |
{
|
| 2 |
+
"current": "507c54b",
|
| 3 |
"releases": [
|
| 4 |
{
|
| 5 |
"version": "v53",
|
VERSION
CHANGED
|
@@ -1 +1 @@
|
|
| 1 |
-
|
|
|
|
| 1 |
+
507c54b
|
web/src/customer-grid/CustomerGrid.tsx
CHANGED
|
@@ -4010,17 +4010,34 @@ function CustomerGridSurface({
|
|
| 4010 |
/* βββ end W18-B VOID (geometry) βββ */
|
| 4011 |
|
| 4012 |
// The record drawer resolves positions against what the MODE paints: the display slice for
|
| 4013 |
-
// grid/list (the cap is real there), the FULL pipeline for calendar/kanban
|
| 4014 |
-
// stack
|
| 4015 |
-
//
|
| 4016 |
-
//
|
| 4017 |
-
//
|
| 4018 |
-
//
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4019 |
const fullSetMode =
|
| 4020 |
-
displayMode === "calendar" || displayMode === "kanban" || displayMode === "
|
| 4021 |
-
|
| 4022 |
-
const
|
| 4023 |
-
|
| 4024 |
const detailIndex = detailPid !== null ? detailIdxMap.get(detailPid) : undefined;
|
| 4025 |
useEffect(() => {
|
| 4026 |
if (detailPid !== null && detailIndex === undefined) setDetailPid(null);
|
|
|
|
| 4010 |
/* βββ end W18-B VOID (geometry) βββ */
|
| 4011 |
|
| 4012 |
// The record drawer resolves positions against what the MODE paints: the display slice for
|
| 4013 |
+
// grid/list (the cap is real there), the FULL pipeline for calendar/kanban (a month or a
|
| 4014 |
+
// stack reaches past the cap by design β a drawer that refused those pids would close itself
|
| 4015 |
+
// on a card the user can plainly see).
|
| 4016 |
+
//
|
| 4017 |
+
// Map has one deliberately narrower exception to that rule. A saved Route is read from the
|
| 4018 |
+
// current scoped book so opening yesterday's route still shows its complete stop list even
|
| 4019 |
+
// when today's View filters a stop out. `MapView` can therefore ask the ordinary drawer to
|
| 4020 |
+
// open a pid that is not in `visibleRows`. Resolve Map's detail identity from that SAME
|
| 4021 |
+
// `scopedRows` universe: it is already after the table, permission, BU, and Cohort walls, and
|
| 4022 |
+
// is exactly what MapView receives as `allRows`. This is a drawer lookup only β it neither
|
| 4023 |
+
// changes the View's rows nor selection, route membership, or route order.
|
| 4024 |
+
const mapDetailRows = useMemo(
|
| 4025 |
+
() => scopedRows.map((record) => ({ kind: "data" as const, record })),
|
| 4026 |
+
[scopedRows]
|
| 4027 |
+
);
|
| 4028 |
+
const mapDetailPidToIndex = useMemo(
|
| 4029 |
+
() => new Map(mapDetailRows.map((row, index) => [row.record.pid, index])),
|
| 4030 |
+
[mapDetailRows]
|
| 4031 |
+
);
|
| 4032 |
+
// β WAVE-27 item 8 (C3) β `swipe` belongs here for calendar/kanban's own reason: the deck is
|
| 4033 |
+
// derived from `modeDataRows` (the FULL pipeline), so a card past the display cap is one the
|
| 4034 |
+
// user can plainly see, and a drawer that refused its pid would close itself on open. Map's
|
| 4035 |
+
// saved-stop case is the explicit scoped branch above, not another spelling of this rule.
|
| 4036 |
const fullSetMode =
|
| 4037 |
+
displayMode === "calendar" || displayMode === "kanban" || displayMode === "swipe";
|
| 4038 |
+
const detailRows = displayMode === "map" ? mapDetailRows : fullSetMode ? visibleRows : displayRows;
|
| 4039 |
+
const detailIdxMap = displayMode === "map" ? mapDetailPidToIndex
|
| 4040 |
+
: fullSetMode ? pidToIndex : displayPidToIndex;
|
| 4041 |
const detailIndex = detailPid !== null ? detailIdxMap.get(detailPid) : undefined;
|
| 4042 |
useEffect(() => {
|
| 4043 |
if (detailPid !== null && detailIndex === undefined) setDetailPid(null);
|