@seatlayer/js 0.92.5 → 0.94.0

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.
@@ -644,6 +644,16 @@ interface EventCategoryAssignmentResult {
644
644
  categoryKey: string;
645
645
  revision: number;
646
646
  }
647
+ /** GET /category-assignments: what differs from the chart (list capped, count exact). */
648
+ interface EventCategoryDifferences {
649
+ chartAvailable: boolean;
650
+ differing: number;
651
+ units: Array<{
652
+ label: string;
653
+ categoryKey: string;
654
+ chartCategoryKey: string;
655
+ }>;
656
+ }
647
657
  type EventTableBookingMode = 'individual' | 'whole' | 'variable';
648
658
  interface EventTableBookingResult {
649
659
  ok: true;
@@ -901,6 +911,15 @@ declare class ManageApi {
901
911
  * snapshots retain their original configured value; future selection uses
902
912
  * the new category. Requires `event:categories:manage`. */
903
913
  setCategory(key: string, labels: string[], categoryKey: string): Promise<EventCategoryAssignmentResult>;
914
+ /**
915
+ * The inventory units this event sells under a different category than the
916
+ * chart currently does — what "Reset to chart defaults" would put back.
917
+ * Requires `event:view`.
918
+ */
919
+ categoryDifferences(key: string): Promise<EventCategoryDifferences>;
920
+ /** Put every unit (or only `labels`) back on the chart's category, in one
921
+ * write. Requires `event:categories:manage`. */
922
+ resetCategoriesToChart(key: string, labels?: string[]): Promise<EventCategoryAssignmentResult>;
904
923
  /** Change event-only table booking identity. The server refuses tables with
905
924
  * held/booked/blocked inventory or channel assignments that would be lost. */
906
925
  setTableBooking(key: string, tableIds: string[], mode: EventTableBookingMode, bounds?: {
@@ -1118,6 +1137,32 @@ declare class ManageApi {
1118
1137
  reportCsv(key: string): Promise<Blob>;
1119
1138
  }
1120
1139
 
1140
+ /**
1141
+ * The control room's View menu (plan item 5, slice D).
1142
+ *
1143
+ * Five toggles that change how the map READS, never what it holds: seat
1144
+ * labels, row labels, category colours, channel colours, booking momentum.
1145
+ * The letters are the ones seats.io operators already know (S · R · G · H ·
1146
+ * M), ridden on Shift because the tool tabs own the bare letters (S is
1147
+ * Sections, G is Categories, M is Monitor).
1148
+ *
1149
+ * The set is remembered per browser: an operator who works with labels off
1150
+ * keeps them off tomorrow. Storage is a convenience, never a dependency —
1151
+ * a private window or a blocked store simply starts from the defaults.
1152
+ *
1153
+ * Pure where it can be: the model, the markup and the storage rules are
1154
+ * here and tested without a cockpit; SeatManager owns the state and the
1155
+ * renderer calls.
1156
+ */
1157
+
1158
+ interface MapView {
1159
+ seatLabels: boolean;
1160
+ rowLabels: boolean;
1161
+ categoryColours: boolean;
1162
+ channelColours: boolean;
1163
+ momentum: boolean;
1164
+ }
1165
+
1121
1166
  /**
1122
1167
  * managerTypes — the SeatManager cockpit's public contract (options, the
1123
1168
  * capability set, the tallies/activity/connection payloads a host subscribes to)
@@ -1180,7 +1225,7 @@ interface SeatManagerActivity {
1180
1225
  }
1181
1226
  /** Fired after a successful organizer action, for host toasts/telemetry. */
1182
1227
  interface SeatManagerActionResult {
1183
- action: 'block' | 'unblock' | 'unblockAll' | 'cancelBooking' | 'setHoldTtl' | 'setCategory' | 'setTableBooking';
1228
+ action: 'block' | 'unblock' | 'unblockAll' | 'cancelBooking' | 'setHoldTtl' | 'setCategory' | 'resetCategories' | 'setTableBooking';
1184
1229
  labels: string[];
1185
1230
  count: number;
1186
1231
  }
@@ -1330,8 +1375,15 @@ interface SeatManagerOptions {
1330
1375
  }
1331
1376
  /** Realtime link state, as reported to the embedding host. */
1332
1377
  interface SeatManagerConnection {
1333
- /** `live` while the socket is open; `reconnecting` from drop until reopen. */
1334
- status: 'live' | 'reconnecting';
1378
+ /**
1379
+ * `live` while the socket is open; `reconnecting` from drop until reopen;
1380
+ * `ended` once the manage session cannot be renewed — the host's
1381
+ * `onTokenRefresh` kept failing (three times running, or with a refusal),
1382
+ * or a 401 arrived with no refresher wired. Nothing polls in `ended`: the
1383
+ * cockpit shows its own "session ended" card with a Try again, and a host
1384
+ * that mints tokens can call `retrySession()` after signing the user in.
1385
+ */
1386
+ status: 'live' | 'reconnecting' | 'ended';
1335
1387
  /**
1336
1388
  * `Date.now()` of the last snapshot or delta accepted from the server, or
1337
1389
  * null before the first one. This is the honest "as of" for whatever the host
@@ -1380,6 +1432,8 @@ declare class SeatManager {
1380
1432
  private activityPanel;
1381
1433
  private navigation;
1382
1434
  private movingMap;
1435
+ /** How a drag on the map chooses seats in the bulk tools: a box, or a freehand lasso (item 5, slice C). */
1436
+ private marqueeShape;
1383
1437
  private socketSnapshotSeen;
1384
1438
  private monitorRefreshTimer;
1385
1439
  /** `'auto'` is kept as asked, not as resolved — see {@link getThemeMode}. */
@@ -1434,6 +1488,12 @@ declare class SeatManager {
1434
1488
  private paintHandle;
1435
1489
  private trendWindowMinutes;
1436
1490
  private heatEnabled;
1491
+ /** The View menu (plan item 5, slice D): labels, colours, momentum — remembered per browser. */
1492
+ private mapView;
1493
+ /** The bar's Find box — its chooser reads every seat, not just the tool's selectable ones. */
1494
+ private barFind;
1495
+ /** The venue overview in the map's corner (plan item 7); null under the compact breakpoint. */
1496
+ private minimap;
1437
1497
  private followLive;
1438
1498
  private lastKpiValues;
1439
1499
  private activeKpiDeltas;
@@ -1459,6 +1519,10 @@ declare class SeatManager {
1459
1519
  private tokenExpiresAt;
1460
1520
  private tokenRefreshTimer;
1461
1521
  private tokenRefreshInFlight;
1522
+ /** Consecutive failed `onTokenRefresh` calls; three in a row end the session. */
1523
+ private tokenRefreshFailures;
1524
+ /** The manage session cannot be renewed: every poll and socket is down until `retrySession()`. */
1525
+ private sessionEnded;
1462
1526
  private sectionByObject;
1463
1527
  private sectionLabelById;
1464
1528
  private sectionsBase;
@@ -1489,6 +1553,16 @@ declare class SeatManager {
1489
1553
  * they do not for as long as a network fetch takes.
1490
1554
  */
1491
1555
  private channels;
1556
+ /**
1557
+ * The shared seat chooser for the tools that choose seats without a mode
1558
+ * object of their own (Block, Categories, Select) — plan item 5. Built per
1559
+ * rail paint, because what is selectable depends on the tool; its dialogs
1560
+ * mount through the manager's one modal primitive.
1561
+ */
1562
+ private chooser;
1563
+ private chooserDialog;
1564
+ /** GET /category-assignments for the Categories tool's Reset count; null until read. */
1565
+ private categoryDifferences;
1492
1566
  private channelCaps;
1493
1567
  private categoryCanManage;
1494
1568
  private tableCanManage;
@@ -1535,6 +1609,32 @@ declare class SeatManager {
1535
1609
  * has no channels", which is a lie about inventory.
1536
1610
  */
1537
1611
  private ensureChannels;
1612
+ /**
1613
+ * The adapter between the cockpit's internals and the shared seat chooser.
1614
+ * Every list the chooser offers is filtered to what THIS tool may select, so
1615
+ * a picker never adds a seat the tool would then refuse.
1616
+ */
1617
+ private buildChooserHost;
1618
+ /**
1619
+ * The bar's Find (plan item 5, slice D): one box for every tool. Its host
1620
+ * reads EVERY seat — an organizer looking for D-12 does not care whether
1621
+ * the current tool could select it — and Enter selects on the choosing
1622
+ * tools, frames on Inspect and Monitor. Highlight rides the renderer.
1623
+ */
1624
+ private wireBarFind;
1625
+ private isChoosingTool;
1626
+ /** Move the camera to these seats — Enter in the bar's Find on Inspect/Monitor. */
1627
+ private frameLabels;
1628
+ /** Find's highlight on the map: labels → ids; null clears. */
1629
+ private highlightLabels;
1630
+ /** A fresh chooser for the rail being painted (selectability is per tool). */
1631
+ private toolChooser;
1632
+ /**
1633
+ * The one line under every chooser: the count, what the tool says about the
1634
+ * selection, Select all and Clear. `data-ref` names are the tool's own so
1635
+ * its painters keep addressing them.
1636
+ */
1637
+ private toolSelectionBar;
1538
1638
  /** The adapter between the cockpit's internals and Channels mode. */
1539
1639
  private buildChannelsHost;
1540
1640
  /** Actual on-screen seat diameter, for the channel overlay's marks. The
@@ -1544,6 +1644,19 @@ declare class SeatManager {
1544
1644
  private seatPixelSize;
1545
1645
  /** Toggle the normalized sales-velocity outline overlay without changing seat colors. */
1546
1646
  setHeatOverlay(enabled: boolean): void;
1647
+ /**
1648
+ * The View menu (plan item 5, slice D): seat labels, row labels, category
1649
+ * colours, channel colours, booking momentum. Each is a toggle the map
1650
+ * applies at once; the whole set is remembered per browser so an operator
1651
+ * who works with labels off keeps them off tomorrow.
1652
+ */
1653
+ setMapView(patch: Partial<MapView>): void;
1654
+ getMapView(): MapView;
1655
+ private toggleMapView;
1656
+ /** Channel colours are the Channels tool's overlay; outside it there is nothing to colour by. */
1657
+ private channelColoursAvailable;
1658
+ private applyMapView;
1659
+ private paintMapViewMenu;
1547
1660
  /** Toggle opt-in camera following for new buyer hold/book events. */
1548
1661
  setFollowLive(enabled: boolean): void;
1549
1662
  /** Update background-tab repaint policy without rebuilding the board. */
@@ -1609,6 +1722,18 @@ declare class SeatManager {
1609
1722
  setToken(token: EventScopedManageToken, expiresAt?: number): void;
1610
1723
  private scheduleTokenRefresh;
1611
1724
  private rotateToken;
1725
+ /**
1726
+ * The manage session cannot be renewed. Every timer, poll and socket
1727
+ * stops; the map stays painted as it was, under a card that says so and
1728
+ * offers one Try again. The host hears `status: 'ended'` once.
1729
+ */
1730
+ private endSession;
1731
+ /**
1732
+ * Ask the host for a token once more — after it signed the user back in —
1733
+ * and, if it answers, pick the live stream up where it stopped.
1734
+ */
1735
+ retrySession(): Promise<boolean>;
1736
+ private paintSessionEnded;
1612
1737
  /** Bulk block the given labels (or the current selection when omitted). */
1613
1738
  block(labels?: string[], opts?: {
1614
1739
  releaseAt?: number;
@@ -1676,11 +1801,49 @@ declare class SeatManager {
1676
1801
  }>;
1677
1802
  setHoldTtl(ms: number | null): Promise<void>;
1678
1803
  zoomToFit(): void;
1804
+ /**
1805
+ * "−" walks back one level — seats → the section → the venue — the way the
1806
+ * buyer picker's does; leaving a focused section also drops the focus. A
1807
+ * renderer without the level walk falls back to the factor step.
1808
+ */
1809
+ private zoomOutStep;
1810
+ /**
1811
+ * What the map chrome reads: the camera, the focus, the floor, and the
1812
+ * live counts the minimap snapshot carries (plan item 7). Painted on every
1813
+ * view change, so the crumb and the pills never lag the camera.
1814
+ */
1815
+ private paintMapChrome;
1816
+ /** The renderer as a {@link MapCamera}, for the minimap and any other map chrome. */
1817
+ private mapCamera;
1818
+ /**
1819
+ * The venue overview in the map's corner. Not under the compact breakpoint
1820
+ * — the pills stay, the thumbnail goes — and rebuilt with the renderer so a
1821
+ * chart change never leaves a stale outline behind.
1822
+ */
1823
+ private syncMinimap;
1824
+ private cssVar;
1679
1825
  destroy(): void;
1680
1826
  private buildRenderer;
1827
+ /**
1828
+ * The organizer's facts on the map's hover card (plan item 5, slice D):
1829
+ * STATUS · CHANNEL · FOR SALE, in one glance. CHANNEL appears once the
1830
+ * Channels list has loaded — a guess would be worse than a missing cell.
1831
+ * FOR SALE is the buyer's truth: free, its section open and shown, and its
1832
+ * category sellable.
1833
+ */
1834
+ private hoverFactsFor;
1681
1835
  /** Block always uses a marquee. Channels only enables its marquee after the
1682
1836
  * organizer deliberately chooses Assign seats; Pan map keeps desktop drag
1683
1837
  * available for large charts. */
1838
+ /** A tap on a row label takes the row in every tool that chooses seats. */
1839
+ private rowLabelSelectable;
1840
+ /**
1841
+ * The two map intents a choosing tool offers beside the chooser's pickers:
1842
+ * drag a box, or draw a lasso. One is always on; the choice survives a
1843
+ * repaint and a tool switch (an operator who prefers the lasso keeps it).
1844
+ */
1845
+ private marqueeShapeChipsHtml;
1846
+ private wireMarqueeShapeChips;
1684
1847
  private isBulkSelectMode;
1685
1848
  /**
1686
1849
  * Block never touches held or booked inventory, so it cannot select it.
@@ -1845,6 +2008,7 @@ declare class SeatManager {
1845
2008
  */
1846
2009
  private railHeader;
1847
2010
  private paintFollowLiveButton;
2011
+ /** Booking momentum lives in the View menu now; this keeps the item and the status line current. */
1848
2012
  private paintHeatButton;
1849
2013
  private paintMomentumHelp;
1850
2014
  private paintFullscreenButton;
@@ -1866,6 +2030,15 @@ declare class SeatManager {
1866
2030
  /** Seats in a chart category that the operator may act on in this mode. */
1867
2031
  private categorySeats;
1868
2032
  private renderCategoriesRail;
2033
+ /**
2034
+ * "Reset to chart defaults" says how many seats it would move BEFORE it is
2035
+ * pressed, and is disabled when the answer is none — a button that says
2036
+ * "reset" over a chart-identical event would be a lie.
2037
+ */
2038
+ private loadCategoryDifferences;
2039
+ private paintCategoryReset;
2040
+ /** One click, no confirm (owner, 2026-09-20): the button already says what it will move. */
2041
+ resetCategoriesToChart(): Promise<void>;
1869
2042
  private paintCategorySelection;
1870
2043
  private renderTablesRail;
1871
2044
  private renderInspectRail;
@@ -1898,13 +2071,11 @@ declare class SeatManager {
1898
2071
  private paintLegend;
1899
2072
  private paintFeed;
1900
2073
  private renderBlockRail;
1901
- private toggleCategory;
1902
2074
  /** A category/filter is a real toggle: add the missing seats, or remove the
1903
2075
  * whole group when every eligible seat in it is already selected. */
1904
2076
  private toggleLabels;
1905
2077
  private isBlockSelectable;
1906
2078
  private paintSelBar;
1907
- private paintCategoryControls;
1908
2079
  private filteredBlockedSeats;
1909
2080
  private paintBlockedInventory;
1910
2081
  private confirmUnblockAll;
@@ -2132,7 +2303,14 @@ declare class ChannelsMode {
2132
2303
  private conflict;
2133
2304
  private dialog;
2134
2305
  private detent;
2135
- private seatListLimit;
2306
+ /**
2307
+ * The shared seat chooser (plan item 5): the sections/rows dialog, the
2308
+ * category picker, the seat list and Find. Channels was the first caller —
2309
+ * those dialogs were written here and moved out unchanged — and paints its
2310
+ * dialogs through this mode's own scrim so every Channels sheet shares one
2311
+ * focus trap.
2312
+ */
2313
+ private readonly chooser;
2136
2314
  /**
2137
2315
  * Hosted-link STATUS for the channel whose detail panel is open. This is the
2138
2316
  * listing projection — it carries no url and no capability, because no route
@@ -2167,6 +2345,7 @@ declare class ChannelsMode {
2167
2345
  private pollTimer;
2168
2346
  private layer;
2169
2347
  private canvas;
2348
+ private overlayVisible;
2170
2349
  /** undefined = not resolved yet, null = this environment has no 2d canvas. */
2171
2350
  private ctx;
2172
2351
  private bannerEl;
@@ -2177,10 +2356,6 @@ declare class ChannelsMode {
2177
2356
  private stagedDoneTimer;
2178
2357
  private lastSelectionCount;
2179
2358
  private lastCounts;
2180
- /** Rows are structural chart data — they do not move while the organizer is
2181
- * allocating. Deriving them walks every seat, so the view is cached for the
2182
- * lifetime of this mode entry and ordinary selection repaints stay O(1). */
2183
- private assignmentRowsCache;
2184
2359
  /** The markup currently in the rail. An identical repaint is skipped, which is
2185
2360
  * what keeps the organizer's scroll position (and open <select>) alive. */
2186
2361
  private railHtml;
@@ -2232,6 +2407,12 @@ declare class ChannelsMode {
2232
2407
  private loadAllocation;
2233
2408
  private channelById;
2234
2409
  private nameOf;
2410
+ /**
2411
+ * The channel a seat is allocated to, by name, for the map's hover card —
2412
+ * null until the list has loaded (the card then shows no CHANNEL cell rather
2413
+ * than a wrong "Public sale"). Unallocated = the public sale channel.
2414
+ */
2415
+ channelNameForLabel(label: string): string | null;
2235
2416
  private markerFor;
2236
2417
  /** Channels an organizer may assign INTO: public sale plus every live channel. */
2237
2418
  private assignableChannels;
@@ -2245,6 +2426,13 @@ declare class ChannelsMode {
2245
2426
  * the guards, the memoised 2D context, and the command the section hit targets
2246
2427
  * fire back into the rail.
2247
2428
  */
2429
+ /**
2430
+ * The View menu's "Channel colours" (plan item 5, slice D): the letter
2431
+ * flags and section tints are this tool's overlay, and the menu can put
2432
+ * them away while the tool stays open. Hidden = the canvas is cleared and
2433
+ * the flags are gone; the staged bar, banner and live line stay.
2434
+ */
2435
+ setOverlayVisible(visible: boolean): void;
2248
2436
  private paintOverlay;
2249
2437
  private setStaged;
2250
2438
  private paintStagedBar;
@@ -2348,24 +2536,8 @@ declare class ChannelsMode {
2348
2536
  /** Open a channel's detail panel and start its buyer-link read. */
2349
2537
  private openChannel;
2350
2538
  private railAction;
2351
- /** Derived once per mode entry — see `assignmentRowsCache`. */
2352
- private assignmentRows;
2353
2539
  private pickCategory;
2354
- /** A tiny modal chooser reusing the dialog primitive (focus trap + Escape). */
2355
- private promptChoice;
2356
- /**
2357
- * Add several whole sections, or several whole rows, in one operation.
2358
- *
2359
- * ADDITIVE by contract: the chooser starts from the labels already selected
2360
- * and only ever grows that set, so opening it never destroys a hard-won
2361
- * marquee or seat-list selection. The confirm button always states the net
2362
- * number of seats it will add, and refuses to exceed `MAX_ASSIGNMENT_UNITS`.
2363
- *
2364
- * Rows get the richer variant. A large venue has thousands of them, so they
2365
- * arrive collapsed under their section, with a section-level tri-state
2366
- * checkbox, a search across every row, and a render cap — the flat list used
2367
- * for sections would be an unusable wall of buttons.
2368
- */
2540
+ /** The additive sections/rows chooser — shared (seatChooser.ts); the dialog state keeps it re-renderable. */
2369
2541
  private renderScopeDialog;
2370
2542
  private openDialog;
2371
2543
  private renderDialog;
@@ -2461,6 +2633,7 @@ declare class ChannelsMode {
2461
2633
  * equivalent of canvas click / marquee / brush, grouped by section with
2462
2634
  * per-section select actions.
2463
2635
  */
2636
+ /** The keyboard seat list — shared (seatChooser.ts), with the channel beside each seat. */
2464
2637
  private renderSeatListDialog;
2465
2638
  private reloadLinks;
2466
2639
  /**
@@ -0,0 +1 @@
1
+ import{T as a,U as b,V as c}from"./chunk-DR5JXWLO.js";import"./chunk-RZ2VKZ44.js";import"./chunk-OSZ7DOEH.js";export{b as CHANNELS_CSS,c as ChannelsMode,a as bucketRowsHtml};