@seatlayer/js 0.18.1 → 0.20.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.
- package/dist/index.cjs +587 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +152 -3
- package/dist/index.d.ts +152 -3
- package/dist/index.js +585 -6
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { PickerSeat, SeatHoverDetails, PickerTransport, ChartDoc, ChartTheme, ExpandedSeat } from '@seatlayer/core';
|
|
1
|
+
import { PickerSeat, SeatHoverDetails, PickerTransport, ChartDoc, AvailabilityRule, ChartTheme, ExpandedSeat } from '@seatlayer/core';
|
|
2
2
|
export { ExpandedSeat, SeatHoverDetails } from '@seatlayer/core';
|
|
3
3
|
|
|
4
4
|
/**
|
|
@@ -254,6 +254,12 @@ interface EmbeddedDesignerOptions {
|
|
|
254
254
|
* Only used when `showLoadingState` is enabled.
|
|
255
255
|
*/
|
|
256
256
|
loadingTimeoutMs?: number;
|
|
257
|
+
/**
|
|
258
|
+
* Auto-grow the iframe to the height the Designer reports over the resize
|
|
259
|
+
* protocol (`seatlayer.designer.resize`). Defaults to `true`. Set `false` when
|
|
260
|
+
* the host sizes the iframe itself (e.g. a fixed-height chrome).
|
|
261
|
+
*/
|
|
262
|
+
autoResize?: boolean;
|
|
257
263
|
/**
|
|
258
264
|
* Called when the user presses "Try again" on the error card. Use it to mint a
|
|
259
265
|
* fresh Designer session and call `setDesignerUrl()` with the new URL, which
|
|
@@ -276,6 +282,13 @@ declare class EmbeddedDesigner {
|
|
|
276
282
|
private timeoutTimer;
|
|
277
283
|
private phase;
|
|
278
284
|
private restoreContainerPosition;
|
|
285
|
+
private pinned;
|
|
286
|
+
private frameStyleBeforeFs;
|
|
287
|
+
private docOverflowBeforeFs;
|
|
288
|
+
private bodyOverflowBeforeFs;
|
|
289
|
+
private fsKeyHandler;
|
|
290
|
+
/** Latest height (px string) the Designer reported; re-applied after unpin. */
|
|
291
|
+
private lastAutoHeight;
|
|
279
292
|
constructor(options: EmbeddedDesignerOptions);
|
|
280
293
|
mount(): HTMLIFrameElement;
|
|
281
294
|
/** Replace the iframe instead of assigning a new fragment to an existing one. */
|
|
@@ -283,6 +296,15 @@ declare class EmbeddedDesigner {
|
|
|
283
296
|
getIframe(): HTMLIFrameElement | null;
|
|
284
297
|
destroy(): void;
|
|
285
298
|
private loadingStateEnabled;
|
|
299
|
+
private autoResizeEnabled;
|
|
300
|
+
/**
|
|
301
|
+
* Pin the iframe over the host page as a viewport-filling overlay. We save the
|
|
302
|
+
* iframe's inline style and the document scroll state so `unpinFullscreen`
|
|
303
|
+
* restores everything exactly. Escape (host-side) also exits.
|
|
304
|
+
*/
|
|
305
|
+
private pinFullscreen;
|
|
306
|
+
/** Undo `pinFullscreen`: restore the iframe style + scroll lock. Idempotent. */
|
|
307
|
+
private unpinFullscreen;
|
|
286
308
|
private clearTimeoutTimer;
|
|
287
309
|
private ensureContainerPositioned;
|
|
288
310
|
private restoreContainerStyle;
|
|
@@ -564,14 +586,51 @@ declare class SeatPicker {
|
|
|
564
586
|
private fsFallback;
|
|
565
587
|
private fsChangeHandler;
|
|
566
588
|
private fsEscHandler;
|
|
589
|
+
/** True once we've asked the host page to pin us fullscreen (framed, no native). */
|
|
590
|
+
private framedFs;
|
|
591
|
+
/** Last height (px) posted to a host frame; dedupes redundant reports. */
|
|
592
|
+
private lastPostedHeight;
|
|
567
593
|
/**
|
|
568
594
|
* Eager sightline preview for the confirm card: a cheap generated forward
|
|
569
595
|
* view (or the organizer's real photo) plus a "Nm to stage · clear
|
|
570
596
|
* sightline" line — the premium at-a-glance moment; click opens the 360.
|
|
571
597
|
*/
|
|
572
598
|
private confirmThumbHtml;
|
|
599
|
+
/** True when the picker is rendered inside an iframe (snippet embed at /e/:key). */
|
|
600
|
+
private isFramed;
|
|
601
|
+
/**
|
|
602
|
+
* Post a widget→host message when framed. targetOrigin is '*' because the
|
|
603
|
+
* payload carries nothing sensitive (a height number / a fullscreen flag);
|
|
604
|
+
* hosts verify `event.origin` on their side (see `attachPickerFrame`).
|
|
605
|
+
*/
|
|
606
|
+
private postToHost;
|
|
607
|
+
/**
|
|
608
|
+
* Height (px) to advertise to a host frame.
|
|
609
|
+
*
|
|
610
|
+
* The picker fills whatever box it's given: `.sl-picker` is `height:100%;
|
|
611
|
+
* overflow:hidden`, and the /e/:key shell mounts it `position:fixed; inset:0`.
|
|
612
|
+
* So it has no intrinsic *document* height to read — `scrollHeight` just
|
|
613
|
+
* collapses to the current viewport, which for a framed embed would echo the
|
|
614
|
+
* host's own iframe height straight back (a circular value). We therefore
|
|
615
|
+
* report a width-driven *desired* height: a pleasant landscape box on desktop,
|
|
616
|
+
* taller on narrow widths where the bottom sheet needs room, clamped to the
|
|
617
|
+
* widget's `min-height` of 420. Width is host-controlled and never moves in
|
|
618
|
+
* response to the height we report, so this cannot feedback-loop.
|
|
619
|
+
*/
|
|
620
|
+
private measureFramedHeight;
|
|
621
|
+
/** Post `seatlayer:height` to the host when framed and the value changed. */
|
|
622
|
+
private reportFramedHeight;
|
|
573
623
|
/** Full screen via the native API, falling back to a fixed-position overlay (iOS Safari). */
|
|
574
624
|
private toggleFullscreen;
|
|
625
|
+
/**
|
|
626
|
+
* Native element-fullscreen was unavailable or rejected. When framed, a CSS
|
|
627
|
+
* `.sl-fs` overlay can't escape the iframe, so we ask the host page to pin us
|
|
628
|
+
* (`seatlayer:fullscreen`). Otherwise (iOS Safari, same document) fall back to
|
|
629
|
+
* the `.sl-fs` overlay as before.
|
|
630
|
+
*/
|
|
631
|
+
private enterFsFallback;
|
|
632
|
+
/** Toggle host-driven (framed) fullscreen: post the flag + own the Esc key. */
|
|
633
|
+
private setFramedFs;
|
|
575
634
|
private setFsFallback;
|
|
576
635
|
private cbEl;
|
|
577
636
|
private modalScrim;
|
|
@@ -805,6 +864,45 @@ declare class SeatPicker {
|
|
|
805
864
|
destroy(): void;
|
|
806
865
|
}
|
|
807
866
|
|
|
867
|
+
/**
|
|
868
|
+
* Host-side helper for embedding the SeatLayer picker as an iframe.
|
|
869
|
+
*
|
|
870
|
+
* The picker (the /e/:key page, mounted `position:fixed; inset:0`) reports its
|
|
871
|
+
* desired height and fullscreen intent to whatever page frames it, using the
|
|
872
|
+
* picker wire contract:
|
|
873
|
+
*
|
|
874
|
+
* • `{ type: 'seatlayer:height', px:number }` — grow the iframe to `px`.
|
|
875
|
+
* • `{ type: 'seatlayer:fullscreen', on:boolean }` — pin/unpin over the host.
|
|
876
|
+
*
|
|
877
|
+
* A framed picker cannot escape its own iframe with CSS, so it delegates both
|
|
878
|
+
* concerns to the host. `attachPickerFrame` wires those two behaviours onto a
|
|
879
|
+
* picker iframe and returns a detach function that tears everything back down.
|
|
880
|
+
*/
|
|
881
|
+
interface AttachPickerFrameOptions {
|
|
882
|
+
/**
|
|
883
|
+
* Origin to accept messages from. Defaults to the origin parsed from
|
|
884
|
+
* `iframe.src`. Messages from any other origin (or any other window) are
|
|
885
|
+
* ignored — the picker posts with `targetOrigin:'*'`, so the host is the side
|
|
886
|
+
* that must verify `event.origin`.
|
|
887
|
+
*/
|
|
888
|
+
origin?: string;
|
|
889
|
+
}
|
|
890
|
+
/**
|
|
891
|
+
* Attach the picker resize + fullscreen protocol to a picker iframe.
|
|
892
|
+
*
|
|
893
|
+
* ```ts
|
|
894
|
+
* const iframe = document.querySelector('iframe#seatlayer')!;
|
|
895
|
+
* const detach = attachPickerFrame(iframe);
|
|
896
|
+
* // …later, when removing the embed:
|
|
897
|
+
* detach();
|
|
898
|
+
* ```
|
|
899
|
+
*
|
|
900
|
+
* @param iframe The `<iframe>` element pointing at a SeatLayer picker embed.
|
|
901
|
+
* @param opts Optional `{ origin }` override for the accepted message origin.
|
|
902
|
+
* @returns A detach function: removes the listener and restores any pinned state.
|
|
903
|
+
*/
|
|
904
|
+
declare function attachPickerFrame(iframe: HTMLIFrameElement, opts?: AttachPickerFrameOptions): () => void;
|
|
905
|
+
|
|
808
906
|
/**
|
|
809
907
|
* Organizer manage-surface client for workers/api (the `/v1/events/:key/*`
|
|
810
908
|
* inventory routes + the public realtime channel). Companion to api.ts (the
|
|
@@ -1006,6 +1104,22 @@ declare class ManageApi {
|
|
|
1006
1104
|
ok: true;
|
|
1007
1105
|
holdTtlMs: number | null;
|
|
1008
1106
|
}>;
|
|
1107
|
+
/** The organizer's current per section/zone availability windows (needs
|
|
1108
|
+
* `event:view`). Ids absent from `rules` are open / on sale. */
|
|
1109
|
+
availability(key: string): Promise<{
|
|
1110
|
+
rules: Record<string, AvailabilityRule>;
|
|
1111
|
+
}>;
|
|
1112
|
+
/** Replace the availability windows for a set of section/zone ids (needs
|
|
1113
|
+
* `event:block`). Ids absent from `rules` become open / on sale; a zone rule
|
|
1114
|
+
* cascades to its sections. The worker derives each id's seat labels, so
|
|
1115
|
+
* `labels` on the sent rules is best-effort. Resolves with the authoritative
|
|
1116
|
+
* effective `hidden` set (a due rule may fire at once) and the server-cleaned
|
|
1117
|
+
* `rules` map (fired timed/threshold windows dropped). */
|
|
1118
|
+
setAvailability(key: string, rules: Record<string, AvailabilityRule>): Promise<{
|
|
1119
|
+
ok: true;
|
|
1120
|
+
hidden: string[];
|
|
1121
|
+
rules: Record<string, AvailabilityRule>;
|
|
1122
|
+
}>;
|
|
1009
1123
|
report(key: string): Promise<ReportResult>;
|
|
1010
1124
|
controlRoom(key: string, windowMinutes?: number): Promise<ControlRoomSnapshot>;
|
|
1011
1125
|
log(key: string, opts?: {
|
|
@@ -1039,7 +1153,7 @@ declare class ManageApi {
|
|
|
1039
1153
|
* {@link ManageApi}. Box office + Sections + full Reports UI are M2/M3.
|
|
1040
1154
|
*/
|
|
1041
1155
|
|
|
1042
|
-
type SeatManagerMode = 'view' | 'inspect' | 'block';
|
|
1156
|
+
type SeatManagerMode = 'view' | 'inspect' | 'block' | 'sections';
|
|
1043
1157
|
/** DO seat status — 'blocked' has no engine analogue (→ 'not_for_sale'). */
|
|
1044
1158
|
type DoStatus = 'free' | 'held' | 'booked' | 'blocked';
|
|
1045
1159
|
/** Live KPI snapshot pushed to `onTallies` on every state change. */
|
|
@@ -1179,6 +1293,11 @@ declare class SeatManager {
|
|
|
1179
1293
|
private tokenRefreshInFlight;
|
|
1180
1294
|
private sectionByObject;
|
|
1181
1295
|
private sectionLabelById;
|
|
1296
|
+
private sectionsBase;
|
|
1297
|
+
private availabilityRules;
|
|
1298
|
+
private effectiveHidden;
|
|
1299
|
+
private effectiveClosed;
|
|
1300
|
+
private availabilitySaving;
|
|
1182
1301
|
private lastSyncedAt;
|
|
1183
1302
|
private blockedQuery;
|
|
1184
1303
|
private blockedSection;
|
|
@@ -1284,6 +1403,36 @@ declare class SeatManager {
|
|
|
1284
1403
|
private paintMonitorInsights;
|
|
1285
1404
|
private applyHeatOverlay;
|
|
1286
1405
|
private renderInspectRail;
|
|
1406
|
+
/** Pull the organizer's availability rules (event:view). Called on load and on
|
|
1407
|
+
* every WS (re)connect, mirroring how the other panels re-hydrate. `closed` is
|
|
1408
|
+
* deterministic from the rules; `hidden` (which folds in already-due timed /
|
|
1409
|
+
* threshold windows) comes from the snapshot + WS effective set. */
|
|
1410
|
+
private refreshAvailability;
|
|
1411
|
+
/** Run a token-authed op; on a 401 re-mint via onTokenRefresh and retry once. */
|
|
1412
|
+
private withAuthRetry;
|
|
1413
|
+
private closedIdsFromRules;
|
|
1414
|
+
/** Adopt a new effective hidden/closed set (from a snapshot or WS broadcast) and
|
|
1415
|
+
* repaint the rail + canvas when it actually moves. */
|
|
1416
|
+
private updateEffectiveAvailability;
|
|
1417
|
+
/** Canvas read of the availability state: dim hidden sections to a whisper,
|
|
1418
|
+
* half-light closed sections, leave open sections normal. Only in Sections mode;
|
|
1419
|
+
* cleared in every other tool. */
|
|
1420
|
+
private applySectionCanvasTreatment;
|
|
1421
|
+
/** Zone-grouped render tree: each zone header then its sections (which follow the
|
|
1422
|
+
* zone window), then loose sections + the ungrouped bucket. Effective hidden /
|
|
1423
|
+
* closed come from the live sets, rules from the organizer map. */
|
|
1424
|
+
private buildSectionRows;
|
|
1425
|
+
private renderSectionsRail;
|
|
1426
|
+
private sectionRowHtml;
|
|
1427
|
+
private wireSectionRail;
|
|
1428
|
+
/** Change one row's availability mode. A zone rule subsumes its child section
|
|
1429
|
+
* rules, so those are dropped from the map (the zone window is the truth). */
|
|
1430
|
+
private setSectionMode;
|
|
1431
|
+
/** Edit a timed reveal time / threshold percent on an existing row rule. */
|
|
1432
|
+
private setSectionRulePatch;
|
|
1433
|
+
/** Optimistically adopt the new rules, then reconcile with the server-cleaned
|
|
1434
|
+
* map + effective hidden/closed sets. Rolls back the rules on failure. */
|
|
1435
|
+
private persistAvailability;
|
|
1287
1436
|
private paintLegend;
|
|
1288
1437
|
private paintFeed;
|
|
1289
1438
|
private renderBlockRail;
|
|
@@ -1305,4 +1454,4 @@ declare class SeatManager {
|
|
|
1305
1454
|
private fail;
|
|
1306
1455
|
}
|
|
1307
1456
|
|
|
1308
|
-
export { ApiError, type BestAvailableResult, type CheckoutHandoff, type CheckoutLineItem, type ControlRoomActivityEntry, type ControlRoomSectionMetric, type ControlRoomSnapshot, EmbeddedDesigner, type EmbeddedDesignerEventType, type EmbeddedDesignerMessage, type EmbeddedDesignerOptions, type GAAreaAvailability, type HoldConflict, type HoldLineItem, type HoldResult, type LogEntry, type LogPage, ManageApi, ManageApiError, type ReportByStatus, type ReportCategoryMeta, type ReportCategoryRow, type ReportResult, type ResumedHoldResult, SeatManager, type SeatManagerActionResult, type SeatManagerActivity, type SeatManagerMode, type SeatManagerOptions, type SeatManagerTallies, SeatPicker, type SeatPickerOptions, type SeatPickerTheme, SeatingChart, type SeatingChartOptions, type SelectedSeat };
|
|
1457
|
+
export { ApiError, type AttachPickerFrameOptions, type BestAvailableResult, type CheckoutHandoff, type CheckoutLineItem, type ControlRoomActivityEntry, type ControlRoomSectionMetric, type ControlRoomSnapshot, EmbeddedDesigner, type EmbeddedDesignerEventType, type EmbeddedDesignerMessage, type EmbeddedDesignerOptions, type GAAreaAvailability, type HoldConflict, type HoldLineItem, type HoldResult, type LogEntry, type LogPage, ManageApi, ManageApiError, type ReportByStatus, type ReportCategoryMeta, type ReportCategoryRow, type ReportResult, type ResumedHoldResult, SeatManager, type SeatManagerActionResult, type SeatManagerActivity, type SeatManagerMode, type SeatManagerOptions, type SeatManagerTallies, SeatPicker, type SeatPickerOptions, type SeatPickerTheme, SeatingChart, type SeatingChartOptions, type SelectedSeat, attachPickerFrame };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { PickerSeat, SeatHoverDetails, PickerTransport, ChartDoc, ChartTheme, ExpandedSeat } from '@seatlayer/core';
|
|
1
|
+
import { PickerSeat, SeatHoverDetails, PickerTransport, ChartDoc, AvailabilityRule, ChartTheme, ExpandedSeat } from '@seatlayer/core';
|
|
2
2
|
export { ExpandedSeat, SeatHoverDetails } from '@seatlayer/core';
|
|
3
3
|
|
|
4
4
|
/**
|
|
@@ -254,6 +254,12 @@ interface EmbeddedDesignerOptions {
|
|
|
254
254
|
* Only used when `showLoadingState` is enabled.
|
|
255
255
|
*/
|
|
256
256
|
loadingTimeoutMs?: number;
|
|
257
|
+
/**
|
|
258
|
+
* Auto-grow the iframe to the height the Designer reports over the resize
|
|
259
|
+
* protocol (`seatlayer.designer.resize`). Defaults to `true`. Set `false` when
|
|
260
|
+
* the host sizes the iframe itself (e.g. a fixed-height chrome).
|
|
261
|
+
*/
|
|
262
|
+
autoResize?: boolean;
|
|
257
263
|
/**
|
|
258
264
|
* Called when the user presses "Try again" on the error card. Use it to mint a
|
|
259
265
|
* fresh Designer session and call `setDesignerUrl()` with the new URL, which
|
|
@@ -276,6 +282,13 @@ declare class EmbeddedDesigner {
|
|
|
276
282
|
private timeoutTimer;
|
|
277
283
|
private phase;
|
|
278
284
|
private restoreContainerPosition;
|
|
285
|
+
private pinned;
|
|
286
|
+
private frameStyleBeforeFs;
|
|
287
|
+
private docOverflowBeforeFs;
|
|
288
|
+
private bodyOverflowBeforeFs;
|
|
289
|
+
private fsKeyHandler;
|
|
290
|
+
/** Latest height (px string) the Designer reported; re-applied after unpin. */
|
|
291
|
+
private lastAutoHeight;
|
|
279
292
|
constructor(options: EmbeddedDesignerOptions);
|
|
280
293
|
mount(): HTMLIFrameElement;
|
|
281
294
|
/** Replace the iframe instead of assigning a new fragment to an existing one. */
|
|
@@ -283,6 +296,15 @@ declare class EmbeddedDesigner {
|
|
|
283
296
|
getIframe(): HTMLIFrameElement | null;
|
|
284
297
|
destroy(): void;
|
|
285
298
|
private loadingStateEnabled;
|
|
299
|
+
private autoResizeEnabled;
|
|
300
|
+
/**
|
|
301
|
+
* Pin the iframe over the host page as a viewport-filling overlay. We save the
|
|
302
|
+
* iframe's inline style and the document scroll state so `unpinFullscreen`
|
|
303
|
+
* restores everything exactly. Escape (host-side) also exits.
|
|
304
|
+
*/
|
|
305
|
+
private pinFullscreen;
|
|
306
|
+
/** Undo `pinFullscreen`: restore the iframe style + scroll lock. Idempotent. */
|
|
307
|
+
private unpinFullscreen;
|
|
286
308
|
private clearTimeoutTimer;
|
|
287
309
|
private ensureContainerPositioned;
|
|
288
310
|
private restoreContainerStyle;
|
|
@@ -564,14 +586,51 @@ declare class SeatPicker {
|
|
|
564
586
|
private fsFallback;
|
|
565
587
|
private fsChangeHandler;
|
|
566
588
|
private fsEscHandler;
|
|
589
|
+
/** True once we've asked the host page to pin us fullscreen (framed, no native). */
|
|
590
|
+
private framedFs;
|
|
591
|
+
/** Last height (px) posted to a host frame; dedupes redundant reports. */
|
|
592
|
+
private lastPostedHeight;
|
|
567
593
|
/**
|
|
568
594
|
* Eager sightline preview for the confirm card: a cheap generated forward
|
|
569
595
|
* view (or the organizer's real photo) plus a "Nm to stage · clear
|
|
570
596
|
* sightline" line — the premium at-a-glance moment; click opens the 360.
|
|
571
597
|
*/
|
|
572
598
|
private confirmThumbHtml;
|
|
599
|
+
/** True when the picker is rendered inside an iframe (snippet embed at /e/:key). */
|
|
600
|
+
private isFramed;
|
|
601
|
+
/**
|
|
602
|
+
* Post a widget→host message when framed. targetOrigin is '*' because the
|
|
603
|
+
* payload carries nothing sensitive (a height number / a fullscreen flag);
|
|
604
|
+
* hosts verify `event.origin` on their side (see `attachPickerFrame`).
|
|
605
|
+
*/
|
|
606
|
+
private postToHost;
|
|
607
|
+
/**
|
|
608
|
+
* Height (px) to advertise to a host frame.
|
|
609
|
+
*
|
|
610
|
+
* The picker fills whatever box it's given: `.sl-picker` is `height:100%;
|
|
611
|
+
* overflow:hidden`, and the /e/:key shell mounts it `position:fixed; inset:0`.
|
|
612
|
+
* So it has no intrinsic *document* height to read — `scrollHeight` just
|
|
613
|
+
* collapses to the current viewport, which for a framed embed would echo the
|
|
614
|
+
* host's own iframe height straight back (a circular value). We therefore
|
|
615
|
+
* report a width-driven *desired* height: a pleasant landscape box on desktop,
|
|
616
|
+
* taller on narrow widths where the bottom sheet needs room, clamped to the
|
|
617
|
+
* widget's `min-height` of 420. Width is host-controlled and never moves in
|
|
618
|
+
* response to the height we report, so this cannot feedback-loop.
|
|
619
|
+
*/
|
|
620
|
+
private measureFramedHeight;
|
|
621
|
+
/** Post `seatlayer:height` to the host when framed and the value changed. */
|
|
622
|
+
private reportFramedHeight;
|
|
573
623
|
/** Full screen via the native API, falling back to a fixed-position overlay (iOS Safari). */
|
|
574
624
|
private toggleFullscreen;
|
|
625
|
+
/**
|
|
626
|
+
* Native element-fullscreen was unavailable or rejected. When framed, a CSS
|
|
627
|
+
* `.sl-fs` overlay can't escape the iframe, so we ask the host page to pin us
|
|
628
|
+
* (`seatlayer:fullscreen`). Otherwise (iOS Safari, same document) fall back to
|
|
629
|
+
* the `.sl-fs` overlay as before.
|
|
630
|
+
*/
|
|
631
|
+
private enterFsFallback;
|
|
632
|
+
/** Toggle host-driven (framed) fullscreen: post the flag + own the Esc key. */
|
|
633
|
+
private setFramedFs;
|
|
575
634
|
private setFsFallback;
|
|
576
635
|
private cbEl;
|
|
577
636
|
private modalScrim;
|
|
@@ -805,6 +864,45 @@ declare class SeatPicker {
|
|
|
805
864
|
destroy(): void;
|
|
806
865
|
}
|
|
807
866
|
|
|
867
|
+
/**
|
|
868
|
+
* Host-side helper for embedding the SeatLayer picker as an iframe.
|
|
869
|
+
*
|
|
870
|
+
* The picker (the /e/:key page, mounted `position:fixed; inset:0`) reports its
|
|
871
|
+
* desired height and fullscreen intent to whatever page frames it, using the
|
|
872
|
+
* picker wire contract:
|
|
873
|
+
*
|
|
874
|
+
* • `{ type: 'seatlayer:height', px:number }` — grow the iframe to `px`.
|
|
875
|
+
* • `{ type: 'seatlayer:fullscreen', on:boolean }` — pin/unpin over the host.
|
|
876
|
+
*
|
|
877
|
+
* A framed picker cannot escape its own iframe with CSS, so it delegates both
|
|
878
|
+
* concerns to the host. `attachPickerFrame` wires those two behaviours onto a
|
|
879
|
+
* picker iframe and returns a detach function that tears everything back down.
|
|
880
|
+
*/
|
|
881
|
+
interface AttachPickerFrameOptions {
|
|
882
|
+
/**
|
|
883
|
+
* Origin to accept messages from. Defaults to the origin parsed from
|
|
884
|
+
* `iframe.src`. Messages from any other origin (or any other window) are
|
|
885
|
+
* ignored — the picker posts with `targetOrigin:'*'`, so the host is the side
|
|
886
|
+
* that must verify `event.origin`.
|
|
887
|
+
*/
|
|
888
|
+
origin?: string;
|
|
889
|
+
}
|
|
890
|
+
/**
|
|
891
|
+
* Attach the picker resize + fullscreen protocol to a picker iframe.
|
|
892
|
+
*
|
|
893
|
+
* ```ts
|
|
894
|
+
* const iframe = document.querySelector('iframe#seatlayer')!;
|
|
895
|
+
* const detach = attachPickerFrame(iframe);
|
|
896
|
+
* // …later, when removing the embed:
|
|
897
|
+
* detach();
|
|
898
|
+
* ```
|
|
899
|
+
*
|
|
900
|
+
* @param iframe The `<iframe>` element pointing at a SeatLayer picker embed.
|
|
901
|
+
* @param opts Optional `{ origin }` override for the accepted message origin.
|
|
902
|
+
* @returns A detach function: removes the listener and restores any pinned state.
|
|
903
|
+
*/
|
|
904
|
+
declare function attachPickerFrame(iframe: HTMLIFrameElement, opts?: AttachPickerFrameOptions): () => void;
|
|
905
|
+
|
|
808
906
|
/**
|
|
809
907
|
* Organizer manage-surface client for workers/api (the `/v1/events/:key/*`
|
|
810
908
|
* inventory routes + the public realtime channel). Companion to api.ts (the
|
|
@@ -1006,6 +1104,22 @@ declare class ManageApi {
|
|
|
1006
1104
|
ok: true;
|
|
1007
1105
|
holdTtlMs: number | null;
|
|
1008
1106
|
}>;
|
|
1107
|
+
/** The organizer's current per section/zone availability windows (needs
|
|
1108
|
+
* `event:view`). Ids absent from `rules` are open / on sale. */
|
|
1109
|
+
availability(key: string): Promise<{
|
|
1110
|
+
rules: Record<string, AvailabilityRule>;
|
|
1111
|
+
}>;
|
|
1112
|
+
/** Replace the availability windows for a set of section/zone ids (needs
|
|
1113
|
+
* `event:block`). Ids absent from `rules` become open / on sale; a zone rule
|
|
1114
|
+
* cascades to its sections. The worker derives each id's seat labels, so
|
|
1115
|
+
* `labels` on the sent rules is best-effort. Resolves with the authoritative
|
|
1116
|
+
* effective `hidden` set (a due rule may fire at once) and the server-cleaned
|
|
1117
|
+
* `rules` map (fired timed/threshold windows dropped). */
|
|
1118
|
+
setAvailability(key: string, rules: Record<string, AvailabilityRule>): Promise<{
|
|
1119
|
+
ok: true;
|
|
1120
|
+
hidden: string[];
|
|
1121
|
+
rules: Record<string, AvailabilityRule>;
|
|
1122
|
+
}>;
|
|
1009
1123
|
report(key: string): Promise<ReportResult>;
|
|
1010
1124
|
controlRoom(key: string, windowMinutes?: number): Promise<ControlRoomSnapshot>;
|
|
1011
1125
|
log(key: string, opts?: {
|
|
@@ -1039,7 +1153,7 @@ declare class ManageApi {
|
|
|
1039
1153
|
* {@link ManageApi}. Box office + Sections + full Reports UI are M2/M3.
|
|
1040
1154
|
*/
|
|
1041
1155
|
|
|
1042
|
-
type SeatManagerMode = 'view' | 'inspect' | 'block';
|
|
1156
|
+
type SeatManagerMode = 'view' | 'inspect' | 'block' | 'sections';
|
|
1043
1157
|
/** DO seat status — 'blocked' has no engine analogue (→ 'not_for_sale'). */
|
|
1044
1158
|
type DoStatus = 'free' | 'held' | 'booked' | 'blocked';
|
|
1045
1159
|
/** Live KPI snapshot pushed to `onTallies` on every state change. */
|
|
@@ -1179,6 +1293,11 @@ declare class SeatManager {
|
|
|
1179
1293
|
private tokenRefreshInFlight;
|
|
1180
1294
|
private sectionByObject;
|
|
1181
1295
|
private sectionLabelById;
|
|
1296
|
+
private sectionsBase;
|
|
1297
|
+
private availabilityRules;
|
|
1298
|
+
private effectiveHidden;
|
|
1299
|
+
private effectiveClosed;
|
|
1300
|
+
private availabilitySaving;
|
|
1182
1301
|
private lastSyncedAt;
|
|
1183
1302
|
private blockedQuery;
|
|
1184
1303
|
private blockedSection;
|
|
@@ -1284,6 +1403,36 @@ declare class SeatManager {
|
|
|
1284
1403
|
private paintMonitorInsights;
|
|
1285
1404
|
private applyHeatOverlay;
|
|
1286
1405
|
private renderInspectRail;
|
|
1406
|
+
/** Pull the organizer's availability rules (event:view). Called on load and on
|
|
1407
|
+
* every WS (re)connect, mirroring how the other panels re-hydrate. `closed` is
|
|
1408
|
+
* deterministic from the rules; `hidden` (which folds in already-due timed /
|
|
1409
|
+
* threshold windows) comes from the snapshot + WS effective set. */
|
|
1410
|
+
private refreshAvailability;
|
|
1411
|
+
/** Run a token-authed op; on a 401 re-mint via onTokenRefresh and retry once. */
|
|
1412
|
+
private withAuthRetry;
|
|
1413
|
+
private closedIdsFromRules;
|
|
1414
|
+
/** Adopt a new effective hidden/closed set (from a snapshot or WS broadcast) and
|
|
1415
|
+
* repaint the rail + canvas when it actually moves. */
|
|
1416
|
+
private updateEffectiveAvailability;
|
|
1417
|
+
/** Canvas read of the availability state: dim hidden sections to a whisper,
|
|
1418
|
+
* half-light closed sections, leave open sections normal. Only in Sections mode;
|
|
1419
|
+
* cleared in every other tool. */
|
|
1420
|
+
private applySectionCanvasTreatment;
|
|
1421
|
+
/** Zone-grouped render tree: each zone header then its sections (which follow the
|
|
1422
|
+
* zone window), then loose sections + the ungrouped bucket. Effective hidden /
|
|
1423
|
+
* closed come from the live sets, rules from the organizer map. */
|
|
1424
|
+
private buildSectionRows;
|
|
1425
|
+
private renderSectionsRail;
|
|
1426
|
+
private sectionRowHtml;
|
|
1427
|
+
private wireSectionRail;
|
|
1428
|
+
/** Change one row's availability mode. A zone rule subsumes its child section
|
|
1429
|
+
* rules, so those are dropped from the map (the zone window is the truth). */
|
|
1430
|
+
private setSectionMode;
|
|
1431
|
+
/** Edit a timed reveal time / threshold percent on an existing row rule. */
|
|
1432
|
+
private setSectionRulePatch;
|
|
1433
|
+
/** Optimistically adopt the new rules, then reconcile with the server-cleaned
|
|
1434
|
+
* map + effective hidden/closed sets. Rolls back the rules on failure. */
|
|
1435
|
+
private persistAvailability;
|
|
1287
1436
|
private paintLegend;
|
|
1288
1437
|
private paintFeed;
|
|
1289
1438
|
private renderBlockRail;
|
|
@@ -1305,4 +1454,4 @@ declare class SeatManager {
|
|
|
1305
1454
|
private fail;
|
|
1306
1455
|
}
|
|
1307
1456
|
|
|
1308
|
-
export { ApiError, type BestAvailableResult, type CheckoutHandoff, type CheckoutLineItem, type ControlRoomActivityEntry, type ControlRoomSectionMetric, type ControlRoomSnapshot, EmbeddedDesigner, type EmbeddedDesignerEventType, type EmbeddedDesignerMessage, type EmbeddedDesignerOptions, type GAAreaAvailability, type HoldConflict, type HoldLineItem, type HoldResult, type LogEntry, type LogPage, ManageApi, ManageApiError, type ReportByStatus, type ReportCategoryMeta, type ReportCategoryRow, type ReportResult, type ResumedHoldResult, SeatManager, type SeatManagerActionResult, type SeatManagerActivity, type SeatManagerMode, type SeatManagerOptions, type SeatManagerTallies, SeatPicker, type SeatPickerOptions, type SeatPickerTheme, SeatingChart, type SeatingChartOptions, type SelectedSeat };
|
|
1457
|
+
export { ApiError, type AttachPickerFrameOptions, type BestAvailableResult, type CheckoutHandoff, type CheckoutLineItem, type ControlRoomActivityEntry, type ControlRoomSectionMetric, type ControlRoomSnapshot, EmbeddedDesigner, type EmbeddedDesignerEventType, type EmbeddedDesignerMessage, type EmbeddedDesignerOptions, type GAAreaAvailability, type HoldConflict, type HoldLineItem, type HoldResult, type LogEntry, type LogPage, ManageApi, ManageApiError, type ReportByStatus, type ReportCategoryMeta, type ReportCategoryRow, type ReportResult, type ResumedHoldResult, SeatManager, type SeatManagerActionResult, type SeatManagerActivity, type SeatManagerMode, type SeatManagerOptions, type SeatManagerTallies, SeatPicker, type SeatPickerOptions, type SeatPickerTheme, SeatingChart, type SeatingChartOptions, type SelectedSeat, attachPickerFrame };
|