@seatlayer/angular 0.64.0 → 0.67.15
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/README.md +153 -20
- package/dist/README.md +153 -20
- package/dist/fesm2022/seatlayer-angular.mjs +3 -3
- package/dist/fesm2022/seatlayer-angular.mjs.map +1 -1
- package/dist/index.d.ts +181 -9
- package/package.json +21 -12
- package/dist/seating-chart.component.d.ts +0 -180
package/README.md
CHANGED
|
@@ -1,20 +1,42 @@
|
|
|
1
|
-
#
|
|
1
|
+
# SeatLayer Angular Seat Map SDK for Reserved Seating
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/@seatlayer/angular)
|
|
4
4
|
[](https://www.npmjs.com/package/@seatlayer/angular)
|
|
5
5
|
[](https://angular.dev/)
|
|
6
|
+
[](https://www.typescriptlang.org/)
|
|
6
7
|
[](../../LICENSE)
|
|
7
8
|
|
|
8
|
-
The official Angular wrapper for SeatLayer reserved seating
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
`attachPickerFrame` helpers exported by this package; they are not additional
|
|
12
|
-
Angular components.
|
|
9
|
+
The official Angular wrapper for SeatLayer reserved seating. Render an
|
|
10
|
+
interactive seating chart with live seat availability inside an Angular app, let
|
|
11
|
+
buyers pick seats, and take a temporary hold on the inventory they choose.
|
|
13
12
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
The buyer modal and iframe integration stay framework-agnostic: this package
|
|
14
|
+
also re-exports the plain JavaScript `SeatPickerWidget` class and the
|
|
15
|
+
`attachPickerFrame` helper, so an Angular host depends on one package.
|
|
16
|
+
|
|
17
|
+
[SeatLayer Angular SDK on npm](https://www.npmjs.com/package/@seatlayer/angular) ·
|
|
18
|
+
[Angular seat-map documentation](https://docs.seatlayer.io/buyer-sdk/seat-picker/) ·
|
|
19
|
+
[SeatLayer reserved-seating platform](https://seatlayer.io/) ·
|
|
20
|
+
[Buyer seat-map demo](https://app.seatlayer.io/demo/play/grand-theatre) ·
|
|
21
|
+
[SeatLayer JavaScript seat map SDK](https://www.npmjs.com/package/@seatlayer/js) ·
|
|
22
|
+
[SeatLayer React seat map SDK](https://www.npmjs.com/package/@seatlayer/react) ·
|
|
23
|
+
[SeatLayer Vue seat map SDK](https://www.npmjs.com/package/@seatlayer/vue) ·
|
|
24
|
+
[SeatLayer AI Toolkit](https://github.com/seatlayer/seatlayer-ai-toolkit)
|
|
25
|
+
|
|
26
|
+
## What is included
|
|
27
|
+
|
|
28
|
+
- `SeatLayerSeatingChartComponent` — one standalone Angular component with the
|
|
29
|
+
`seatlayer-seating-chart` selector.
|
|
30
|
+
- `SeatPickerWidget` — the framework-agnostic one-call buyer modal.
|
|
31
|
+
- `attachPickerFrame` — the host-side iframe helper for embedded pickers.
|
|
32
|
+
- An Angular Package Format build (`fesm2022`) with TypeScript declarations at
|
|
33
|
+
`dist/index.d.ts`.
|
|
34
|
+
|
|
35
|
+
## Requirements
|
|
36
|
+
|
|
37
|
+
- Angular 17 or newer (`@angular/core` and `@angular/common` are peer
|
|
38
|
+
dependencies).
|
|
39
|
+
- A browser DOM: the chart is created when the component initialises.
|
|
18
40
|
|
|
19
41
|
## Install
|
|
20
42
|
|
|
@@ -22,10 +44,9 @@ Angular components.
|
|
|
22
44
|
npm install @seatlayer/angular
|
|
23
45
|
```
|
|
24
46
|
|
|
25
|
-
|
|
26
|
-
directly, no NgModule needed.
|
|
47
|
+
The component is **standalone** — import it directly, no NgModule needed.
|
|
27
48
|
|
|
28
|
-
##
|
|
49
|
+
## Quick start
|
|
29
50
|
|
|
30
51
|
```ts
|
|
31
52
|
import { Component, ViewChild } from '@angular/core';
|
|
@@ -74,6 +95,10 @@ export class CheckoutComponent {
|
|
|
74
95
|
| `colorblindSafe` | `boolean` | Render colorblind-safe seat glyphs. |
|
|
75
96
|
| `seatTooltip` | `boolean` | Set `false` to draw your own popover from `(seatHover)`. |
|
|
76
97
|
| `messages` | `object` | Copy overrides. Read once per rebuild. |
|
|
98
|
+
| `initialView` | `RendererViewMode` | Initial 2D projection, read once per rebuild. |
|
|
99
|
+
| `errorDisplay` | `'message' \| 'none'` | `'message'` (default) shows a notice with Try again; `'none'` is silent. |
|
|
100
|
+
| `buyerAccessTokenProvider` | `BuyerAccessTokenProvider` | Sales Channels: mint a buyer access session on demand from your backend. |
|
|
101
|
+
| `buyerAccessToken` | `string \| BuyerAccessToken` | One-shot session for hosts that own the lifecycle. Cannot be renewed. |
|
|
77
102
|
|
|
78
103
|
`numberOfPlacesToSelect`, `selectionValidators`, and the other identity inputs rebuild the
|
|
79
104
|
canvas. `selectedObjects` and `selectableObjects` are initial values; use the
|
|
@@ -96,6 +121,9 @@ mid-selection because an array instance changed.
|
|
|
96
121
|
| `(deckTap)` | `string` (floor id) |
|
|
97
122
|
| `(hint)` | `string \| null` — `null` clears the hint |
|
|
98
123
|
| `(seatHover)` | `SeatHoverDetails \| null` — `null` when the pointer leaves |
|
|
124
|
+
| `(accessExpired)` | `BuyerAccessExpiredEvent` |
|
|
125
|
+
| `(accessUnavailable)` | `BuyerAccessUnavailableEvent` |
|
|
126
|
+
| `(selectedObjectUnavailable)` | `SelectedObjectUnavailableEvent` |
|
|
99
127
|
|
|
100
128
|
> `(errored)` rather than `(error)`: `error` collides with the native DOM error
|
|
101
129
|
> event on the host element, which would fire your handler for unrelated
|
|
@@ -111,7 +139,10 @@ Via a template ref (`#chart`):
|
|
|
111
139
|
`deselectCategories` · `setSelectableObjects` · `setMaxSelection` ·
|
|
112
140
|
`getSelectionValidity` ·
|
|
113
141
|
`getFloors` · `setFloor` · `setColorblindSafe` · `zoomIn` · `zoomOut` ·
|
|
114
|
-
`zoomToFit`
|
|
142
|
+
`zoomToFit` · `refreshAccess`
|
|
143
|
+
|
|
144
|
+
Calling any of them before the chart exists returns an empty answer rather than
|
|
145
|
+
throwing, so a template ref used one frame early is safe.
|
|
115
146
|
|
|
116
147
|
> `holdSelection()` rather than `hold()`: `hold` is already the name of the
|
|
117
148
|
> `@Output`, and a class cannot have both.
|
|
@@ -129,13 +160,115 @@ re-enters the zone only to emit, which is the only part Angular needs to see.
|
|
|
129
160
|
- `attachPickerFrame` — raw framework-agnostic JavaScript iframe helper; grows on `seatlayer:height` and
|
|
130
161
|
pins on `seatlayer:fullscreen`.
|
|
131
162
|
|
|
132
|
-
##
|
|
163
|
+
## Security boundary
|
|
164
|
+
|
|
165
|
+
The Angular app **selects and holds** inventory. Your trusted backend **inspects
|
|
166
|
+
and books** the hold after payment or order validation.
|
|
167
|
+
|
|
168
|
+
- Never ship a SeatLayer secret key in browser code or a bundled environment
|
|
169
|
+
file.
|
|
170
|
+
- Send only the `holdId` and your normal checkout context to your backend.
|
|
171
|
+
- Calculate the charge from server-inspected hold items, not from browser input.
|
|
172
|
+
- Reuse your stable order id as `bookingRef` so a retried booking is idempotent.
|
|
173
|
+
|
|
174
|
+
Read [how the integration works](https://docs.seatlayer.io/start/how-it-works/)
|
|
175
|
+
before connecting checkout.
|
|
176
|
+
|
|
177
|
+
## Architecture
|
|
178
|
+
|
|
179
|
+
This package is a thin Angular layer over
|
|
180
|
+
[`@seatlayer/js`](https://www.npmjs.com/package/@seatlayer/js), the
|
|
181
|
+
framework-agnostic browser runtime. The component's template is a single
|
|
182
|
+
`<div>`, `ngOnChanges` decides which inputs rebuild the chart, and the
|
|
183
|
+
imperative methods forward to the runtime handle. Chart geometry, availability,
|
|
184
|
+
and holds come from the SeatLayer API at runtime.
|
|
185
|
+
|
|
186
|
+
## Frequently asked questions
|
|
187
|
+
|
|
188
|
+
### How do I add a seat map to an Angular app?
|
|
189
|
+
|
|
190
|
+
Install `@seatlayer/angular`, import the standalone
|
|
191
|
+
`SeatLayerSeatingChartComponent`, and put `<seatlayer-seating-chart
|
|
192
|
+
event="ev_…">` on screen inside a block with a definite height. That is a
|
|
193
|
+
complete interactive seating chart with live availability; the
|
|
194
|
+
[seat-picker documentation](https://docs.seatlayer.io/buyer-sdk/seat-picker/)
|
|
195
|
+
covers inputs, outputs, holds, and checkout in depth.
|
|
196
|
+
|
|
197
|
+
### Is this a real Angular component or an iframe?
|
|
198
|
+
|
|
199
|
+
`SeatLayerSeatingChartComponent` is a real standalone Angular component whose
|
|
200
|
+
template is a plain `<div>` in your own tree — no iframe and no stylesheet of
|
|
201
|
+
its own. Its render loop and pointer handlers are created outside the Angular
|
|
202
|
+
zone and re-enter it only to emit, so a running chart does not schedule change
|
|
203
|
+
detection on every frame. If you would rather embed the buyer picker in an iframe,
|
|
204
|
+
`attachPickerFrame` is exported for that.
|
|
205
|
+
|
|
206
|
+
### How do temporary seat holds work?
|
|
207
|
+
|
|
208
|
+
When a buyer commits to a selection, `holdSelection()` reserves that inventory
|
|
209
|
+
against concurrent buyers for a limited checkout window and returns an opaque
|
|
210
|
+
`holdId`. The hold lapses on its own if checkout never completes —
|
|
211
|
+
`(holdExpired)` tells the app to return the buyer to the map — and
|
|
212
|
+
`resumeHold()` restores it after a same-tab checkout navigation or a reload.
|
|
213
|
+
This is what prevents double-selling without locking seats forever.
|
|
214
|
+
|
|
215
|
+
### Can I use my own payment provider?
|
|
216
|
+
|
|
217
|
+
Yes. Nothing in this package takes a payment. The browser hands your code a
|
|
218
|
+
`holdId` and priced line items, your backend charges through whatever provider
|
|
219
|
+
you already use, and it then books the hold through the
|
|
220
|
+
[server-side checkout flow](https://docs.seatlayer.io/buyer-sdk/holds-and-checkout/).
|
|
221
|
+
|
|
222
|
+
### Can I evaluate it without a SeatLayer account?
|
|
223
|
+
|
|
224
|
+
You can explore a live seating chart in the browser at the
|
|
225
|
+
[buyer seat-map demo](https://app.seatlayer.io/demo/play/grand-theatre) with no
|
|
226
|
+
account. Rendering your own venue needs an event key, because the chart and its
|
|
227
|
+
availability are served by the SeatLayer API — create a free test event for
|
|
228
|
+
that, which books no real inventory.
|
|
229
|
+
|
|
230
|
+
## Continue your Angular integration
|
|
231
|
+
|
|
232
|
+
- [Follow the buyer SDK installation guide](https://docs.seatlayer.io/buyer-sdk/install/)
|
|
233
|
+
for the full browser integration, options, and events.
|
|
234
|
+
- [Connect seat holds to secure server-side checkout](https://docs.seatlayer.io/buyer-sdk/holds-and-checkout/)
|
|
235
|
+
without putting booking credentials in the browser.
|
|
236
|
+
- [Run the complete checkout example](https://docs.seatlayer.io/examples/complete-checkout/)
|
|
237
|
+
to connect a buyer hold id to payment and idempotent booking.
|
|
238
|
+
- [Compare SeatLayer's mobile seat map SDKs](https://docs.seatlayer.io/buyer-sdk/mobile/)
|
|
239
|
+
when the same event also has to render in native iOS, Android, Flutter, or
|
|
240
|
+
React Native apps.
|
|
241
|
+
- [Read the embedded Designer guide](https://docs.seatlayer.io/platform/embedded-designer/)
|
|
242
|
+
to let organizers draw their own venues inside your product.
|
|
243
|
+
- [Explore the 3D seating chart](https://seatlayer.io/3d-seat-map/) for the
|
|
244
|
+
interactive venue view buyers can switch to from the map.
|
|
245
|
+
- [Point AI coding agents at the SeatLayer docs index](https://docs.seatlayer.io/llms.txt)
|
|
246
|
+
(`llms.txt`) for an agent-readable map of the documentation.
|
|
247
|
+
|
|
248
|
+
## SeatLayer SDK ecosystem
|
|
249
|
+
|
|
250
|
+
| Surface | Package or source |
|
|
251
|
+
| --- | --- |
|
|
252
|
+
| JavaScript | [`@seatlayer/js`](https://www.npmjs.com/package/@seatlayer/js) |
|
|
253
|
+
| React | [`@seatlayer/react`](https://www.npmjs.com/package/@seatlayer/react) |
|
|
254
|
+
| Vue | [`@seatlayer/vue`](https://www.npmjs.com/package/@seatlayer/vue) |
|
|
255
|
+
| Angular | [`@seatlayer/angular`](https://www.npmjs.com/package/@seatlayer/angular) (this package) |
|
|
256
|
+
| React Native | [`@seatlayer/react-native`](https://www.npmjs.com/package/@seatlayer/react-native) |
|
|
257
|
+
| iOS | [`seatlayer-ios`](https://github.com/seatlayer/seatlayer-ios) |
|
|
258
|
+
| Flutter | [`seatlayer`](https://pub.dev/packages/seatlayer) |
|
|
259
|
+
| Android | [`seatlayer-android`](https://github.com/seatlayer/seatlayer-android) |
|
|
260
|
+
| Server SDKs | [Node.js, Python, PHP, Ruby, .NET, Java, and Go](https://docs.seatlayer.io/server-sdk/install/) |
|
|
261
|
+
|
|
262
|
+
## Development
|
|
263
|
+
|
|
264
|
+
```bash
|
|
265
|
+
pnpm install
|
|
266
|
+
pnpm verify
|
|
267
|
+
```
|
|
133
268
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
- [`@seatlayer/js`](https://www.npmjs.com/package/@seatlayer/js) — framework-agnostic core
|
|
137
|
-
- [Server SDKs](https://docs.seatlayer.io/server-sdk/install/) — Node.js, Python, PHP, Java, Go, Ruby, .NET
|
|
269
|
+
Source, issues, and contribution guidance live in
|
|
270
|
+
[seatlayer/seatlayer-sdk](https://github.com/seatlayer/seatlayer-sdk).
|
|
138
271
|
|
|
139
272
|
## License
|
|
140
273
|
|
|
141
|
-
MIT
|
|
274
|
+
MIT © SeatLayer
|
package/dist/README.md
CHANGED
|
@@ -1,20 +1,42 @@
|
|
|
1
|
-
#
|
|
1
|
+
# SeatLayer Angular Seat Map SDK for Reserved Seating
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/@seatlayer/angular)
|
|
4
4
|
[](https://www.npmjs.com/package/@seatlayer/angular)
|
|
5
5
|
[](https://angular.dev/)
|
|
6
|
+
[](https://www.typescriptlang.org/)
|
|
6
7
|
[](../../LICENSE)
|
|
7
8
|
|
|
8
|
-
The official Angular wrapper for SeatLayer reserved seating
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
`attachPickerFrame` helpers exported by this package; they are not additional
|
|
12
|
-
Angular components.
|
|
9
|
+
The official Angular wrapper for SeatLayer reserved seating. Render an
|
|
10
|
+
interactive seating chart with live seat availability inside an Angular app, let
|
|
11
|
+
buyers pick seats, and take a temporary hold on the inventory they choose.
|
|
13
12
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
The buyer modal and iframe integration stay framework-agnostic: this package
|
|
14
|
+
also re-exports the plain JavaScript `SeatPickerWidget` class and the
|
|
15
|
+
`attachPickerFrame` helper, so an Angular host depends on one package.
|
|
16
|
+
|
|
17
|
+
[SeatLayer Angular SDK on npm](https://www.npmjs.com/package/@seatlayer/angular) ·
|
|
18
|
+
[Angular seat-map documentation](https://docs.seatlayer.io/buyer-sdk/seat-picker/) ·
|
|
19
|
+
[SeatLayer reserved-seating platform](https://seatlayer.io/) ·
|
|
20
|
+
[Buyer seat-map demo](https://app.seatlayer.io/demo/play/grand-theatre) ·
|
|
21
|
+
[SeatLayer JavaScript seat map SDK](https://www.npmjs.com/package/@seatlayer/js) ·
|
|
22
|
+
[SeatLayer React seat map SDK](https://www.npmjs.com/package/@seatlayer/react) ·
|
|
23
|
+
[SeatLayer Vue seat map SDK](https://www.npmjs.com/package/@seatlayer/vue) ·
|
|
24
|
+
[SeatLayer AI Toolkit](https://github.com/seatlayer/seatlayer-ai-toolkit)
|
|
25
|
+
|
|
26
|
+
## What is included
|
|
27
|
+
|
|
28
|
+
- `SeatLayerSeatingChartComponent` — one standalone Angular component with the
|
|
29
|
+
`seatlayer-seating-chart` selector.
|
|
30
|
+
- `SeatPickerWidget` — the framework-agnostic one-call buyer modal.
|
|
31
|
+
- `attachPickerFrame` — the host-side iframe helper for embedded pickers.
|
|
32
|
+
- An Angular Package Format build (`fesm2022`) with TypeScript declarations at
|
|
33
|
+
`dist/index.d.ts`.
|
|
34
|
+
|
|
35
|
+
## Requirements
|
|
36
|
+
|
|
37
|
+
- Angular 17 or newer (`@angular/core` and `@angular/common` are peer
|
|
38
|
+
dependencies).
|
|
39
|
+
- A browser DOM: the chart is created when the component initialises.
|
|
18
40
|
|
|
19
41
|
## Install
|
|
20
42
|
|
|
@@ -22,10 +44,9 @@ Angular components.
|
|
|
22
44
|
npm install @seatlayer/angular
|
|
23
45
|
```
|
|
24
46
|
|
|
25
|
-
|
|
26
|
-
directly, no NgModule needed.
|
|
47
|
+
The component is **standalone** — import it directly, no NgModule needed.
|
|
27
48
|
|
|
28
|
-
##
|
|
49
|
+
## Quick start
|
|
29
50
|
|
|
30
51
|
```ts
|
|
31
52
|
import { Component, ViewChild } from '@angular/core';
|
|
@@ -74,6 +95,10 @@ export class CheckoutComponent {
|
|
|
74
95
|
| `colorblindSafe` | `boolean` | Render colorblind-safe seat glyphs. |
|
|
75
96
|
| `seatTooltip` | `boolean` | Set `false` to draw your own popover from `(seatHover)`. |
|
|
76
97
|
| `messages` | `object` | Copy overrides. Read once per rebuild. |
|
|
98
|
+
| `initialView` | `RendererViewMode` | Initial 2D projection, read once per rebuild. |
|
|
99
|
+
| `errorDisplay` | `'message' \| 'none'` | `'message'` (default) shows a notice with Try again; `'none'` is silent. |
|
|
100
|
+
| `buyerAccessTokenProvider` | `BuyerAccessTokenProvider` | Sales Channels: mint a buyer access session on demand from your backend. |
|
|
101
|
+
| `buyerAccessToken` | `string \| BuyerAccessToken` | One-shot session for hosts that own the lifecycle. Cannot be renewed. |
|
|
77
102
|
|
|
78
103
|
`numberOfPlacesToSelect`, `selectionValidators`, and the other identity inputs rebuild the
|
|
79
104
|
canvas. `selectedObjects` and `selectableObjects` are initial values; use the
|
|
@@ -96,6 +121,9 @@ mid-selection because an array instance changed.
|
|
|
96
121
|
| `(deckTap)` | `string` (floor id) |
|
|
97
122
|
| `(hint)` | `string \| null` — `null` clears the hint |
|
|
98
123
|
| `(seatHover)` | `SeatHoverDetails \| null` — `null` when the pointer leaves |
|
|
124
|
+
| `(accessExpired)` | `BuyerAccessExpiredEvent` |
|
|
125
|
+
| `(accessUnavailable)` | `BuyerAccessUnavailableEvent` |
|
|
126
|
+
| `(selectedObjectUnavailable)` | `SelectedObjectUnavailableEvent` |
|
|
99
127
|
|
|
100
128
|
> `(errored)` rather than `(error)`: `error` collides with the native DOM error
|
|
101
129
|
> event on the host element, which would fire your handler for unrelated
|
|
@@ -111,7 +139,10 @@ Via a template ref (`#chart`):
|
|
|
111
139
|
`deselectCategories` · `setSelectableObjects` · `setMaxSelection` ·
|
|
112
140
|
`getSelectionValidity` ·
|
|
113
141
|
`getFloors` · `setFloor` · `setColorblindSafe` · `zoomIn` · `zoomOut` ·
|
|
114
|
-
`zoomToFit`
|
|
142
|
+
`zoomToFit` · `refreshAccess`
|
|
143
|
+
|
|
144
|
+
Calling any of them before the chart exists returns an empty answer rather than
|
|
145
|
+
throwing, so a template ref used one frame early is safe.
|
|
115
146
|
|
|
116
147
|
> `holdSelection()` rather than `hold()`: `hold` is already the name of the
|
|
117
148
|
> `@Output`, and a class cannot have both.
|
|
@@ -129,13 +160,115 @@ re-enters the zone only to emit, which is the only part Angular needs to see.
|
|
|
129
160
|
- `attachPickerFrame` — raw framework-agnostic JavaScript iframe helper; grows on `seatlayer:height` and
|
|
130
161
|
pins on `seatlayer:fullscreen`.
|
|
131
162
|
|
|
132
|
-
##
|
|
163
|
+
## Security boundary
|
|
164
|
+
|
|
165
|
+
The Angular app **selects and holds** inventory. Your trusted backend **inspects
|
|
166
|
+
and books** the hold after payment or order validation.
|
|
167
|
+
|
|
168
|
+
- Never ship a SeatLayer secret key in browser code or a bundled environment
|
|
169
|
+
file.
|
|
170
|
+
- Send only the `holdId` and your normal checkout context to your backend.
|
|
171
|
+
- Calculate the charge from server-inspected hold items, not from browser input.
|
|
172
|
+
- Reuse your stable order id as `bookingRef` so a retried booking is idempotent.
|
|
173
|
+
|
|
174
|
+
Read [how the integration works](https://docs.seatlayer.io/start/how-it-works/)
|
|
175
|
+
before connecting checkout.
|
|
176
|
+
|
|
177
|
+
## Architecture
|
|
178
|
+
|
|
179
|
+
This package is a thin Angular layer over
|
|
180
|
+
[`@seatlayer/js`](https://www.npmjs.com/package/@seatlayer/js), the
|
|
181
|
+
framework-agnostic browser runtime. The component's template is a single
|
|
182
|
+
`<div>`, `ngOnChanges` decides which inputs rebuild the chart, and the
|
|
183
|
+
imperative methods forward to the runtime handle. Chart geometry, availability,
|
|
184
|
+
and holds come from the SeatLayer API at runtime.
|
|
185
|
+
|
|
186
|
+
## Frequently asked questions
|
|
187
|
+
|
|
188
|
+
### How do I add a seat map to an Angular app?
|
|
189
|
+
|
|
190
|
+
Install `@seatlayer/angular`, import the standalone
|
|
191
|
+
`SeatLayerSeatingChartComponent`, and put `<seatlayer-seating-chart
|
|
192
|
+
event="ev_…">` on screen inside a block with a definite height. That is a
|
|
193
|
+
complete interactive seating chart with live availability; the
|
|
194
|
+
[seat-picker documentation](https://docs.seatlayer.io/buyer-sdk/seat-picker/)
|
|
195
|
+
covers inputs, outputs, holds, and checkout in depth.
|
|
196
|
+
|
|
197
|
+
### Is this a real Angular component or an iframe?
|
|
198
|
+
|
|
199
|
+
`SeatLayerSeatingChartComponent` is a real standalone Angular component whose
|
|
200
|
+
template is a plain `<div>` in your own tree — no iframe and no stylesheet of
|
|
201
|
+
its own. Its render loop and pointer handlers are created outside the Angular
|
|
202
|
+
zone and re-enter it only to emit, so a running chart does not schedule change
|
|
203
|
+
detection on every frame. If you would rather embed the buyer picker in an iframe,
|
|
204
|
+
`attachPickerFrame` is exported for that.
|
|
205
|
+
|
|
206
|
+
### How do temporary seat holds work?
|
|
207
|
+
|
|
208
|
+
When a buyer commits to a selection, `holdSelection()` reserves that inventory
|
|
209
|
+
against concurrent buyers for a limited checkout window and returns an opaque
|
|
210
|
+
`holdId`. The hold lapses on its own if checkout never completes —
|
|
211
|
+
`(holdExpired)` tells the app to return the buyer to the map — and
|
|
212
|
+
`resumeHold()` restores it after a same-tab checkout navigation or a reload.
|
|
213
|
+
This is what prevents double-selling without locking seats forever.
|
|
214
|
+
|
|
215
|
+
### Can I use my own payment provider?
|
|
216
|
+
|
|
217
|
+
Yes. Nothing in this package takes a payment. The browser hands your code a
|
|
218
|
+
`holdId` and priced line items, your backend charges through whatever provider
|
|
219
|
+
you already use, and it then books the hold through the
|
|
220
|
+
[server-side checkout flow](https://docs.seatlayer.io/buyer-sdk/holds-and-checkout/).
|
|
221
|
+
|
|
222
|
+
### Can I evaluate it without a SeatLayer account?
|
|
223
|
+
|
|
224
|
+
You can explore a live seating chart in the browser at the
|
|
225
|
+
[buyer seat-map demo](https://app.seatlayer.io/demo/play/grand-theatre) with no
|
|
226
|
+
account. Rendering your own venue needs an event key, because the chart and its
|
|
227
|
+
availability are served by the SeatLayer API — create a free test event for
|
|
228
|
+
that, which books no real inventory.
|
|
229
|
+
|
|
230
|
+
## Continue your Angular integration
|
|
231
|
+
|
|
232
|
+
- [Follow the buyer SDK installation guide](https://docs.seatlayer.io/buyer-sdk/install/)
|
|
233
|
+
for the full browser integration, options, and events.
|
|
234
|
+
- [Connect seat holds to secure server-side checkout](https://docs.seatlayer.io/buyer-sdk/holds-and-checkout/)
|
|
235
|
+
without putting booking credentials in the browser.
|
|
236
|
+
- [Run the complete checkout example](https://docs.seatlayer.io/examples/complete-checkout/)
|
|
237
|
+
to connect a buyer hold id to payment and idempotent booking.
|
|
238
|
+
- [Compare SeatLayer's mobile seat map SDKs](https://docs.seatlayer.io/buyer-sdk/mobile/)
|
|
239
|
+
when the same event also has to render in native iOS, Android, Flutter, or
|
|
240
|
+
React Native apps.
|
|
241
|
+
- [Read the embedded Designer guide](https://docs.seatlayer.io/platform/embedded-designer/)
|
|
242
|
+
to let organizers draw their own venues inside your product.
|
|
243
|
+
- [Explore the 3D seating chart](https://seatlayer.io/3d-seat-map/) for the
|
|
244
|
+
interactive venue view buyers can switch to from the map.
|
|
245
|
+
- [Point AI coding agents at the SeatLayer docs index](https://docs.seatlayer.io/llms.txt)
|
|
246
|
+
(`llms.txt`) for an agent-readable map of the documentation.
|
|
247
|
+
|
|
248
|
+
## SeatLayer SDK ecosystem
|
|
249
|
+
|
|
250
|
+
| Surface | Package or source |
|
|
251
|
+
| --- | --- |
|
|
252
|
+
| JavaScript | [`@seatlayer/js`](https://www.npmjs.com/package/@seatlayer/js) |
|
|
253
|
+
| React | [`@seatlayer/react`](https://www.npmjs.com/package/@seatlayer/react) |
|
|
254
|
+
| Vue | [`@seatlayer/vue`](https://www.npmjs.com/package/@seatlayer/vue) |
|
|
255
|
+
| Angular | [`@seatlayer/angular`](https://www.npmjs.com/package/@seatlayer/angular) (this package) |
|
|
256
|
+
| React Native | [`@seatlayer/react-native`](https://www.npmjs.com/package/@seatlayer/react-native) |
|
|
257
|
+
| iOS | [`seatlayer-ios`](https://github.com/seatlayer/seatlayer-ios) |
|
|
258
|
+
| Flutter | [`seatlayer`](https://pub.dev/packages/seatlayer) |
|
|
259
|
+
| Android | [`seatlayer-android`](https://github.com/seatlayer/seatlayer-android) |
|
|
260
|
+
| Server SDKs | [Node.js, Python, PHP, Ruby, .NET, Java, and Go](https://docs.seatlayer.io/server-sdk/install/) |
|
|
261
|
+
|
|
262
|
+
## Development
|
|
263
|
+
|
|
264
|
+
```bash
|
|
265
|
+
pnpm install
|
|
266
|
+
pnpm verify
|
|
267
|
+
```
|
|
133
268
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
- [`@seatlayer/js`](https://www.npmjs.com/package/@seatlayer/js) — framework-agnostic core
|
|
137
|
-
- [Server SDKs](https://docs.seatlayer.io/server-sdk/install/) — Node.js, Python, PHP, Java, Go, Ruby, .NET
|
|
269
|
+
Source, issues, and contribution guidance live in
|
|
270
|
+
[seatlayer/seatlayer-sdk](https://github.com/seatlayer/seatlayer-sdk).
|
|
138
271
|
|
|
139
272
|
## License
|
|
140
273
|
|
|
141
|
-
MIT
|
|
274
|
+
MIT © SeatLayer
|
|
@@ -281,10 +281,10 @@ class SeatLayerSeatingChartComponent {
|
|
|
281
281
|
this.chart?.destroy();
|
|
282
282
|
this.chart = null;
|
|
283
283
|
}
|
|
284
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
285
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
|
|
284
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.29", ngImport: i0, type: SeatLayerSeatingChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
285
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.29", type: SeatLayerSeatingChartComponent, isStandalone: true, selector: "seatlayer-seating-chart", inputs: { event: "event", apiBase: "apiBase", maxSelection: "maxSelection", selectedObjects: "selectedObjects", selectableObjects: "selectableObjects", numberOfPlacesToSelect: "numberOfPlacesToSelect", selectionValidators: "selectionValidators", publicKey: "publicKey", locale: "locale", currency: "currency", colorblindSafe: "colorblindSafe", initialView: "initialView", errorDisplay: "errorDisplay", seatTooltip: "seatTooltip", messages: "messages", buyerAccessTokenProvider: "buyerAccessTokenProvider", buyerAccessToken: "buyerAccessToken" }, outputs: { selectionChange: "selectionChange", selectionValidityChange: "selectionValidityChange", selectionValid: "selectionValid", selectionInvalid: "selectionInvalid", selectionLimit: "selectionLimit", hold: "hold", holdRestored: "holdRestored", holdExpired: "holdExpired", gaClick: "gaClick", errored: "errored", deckTap: "deckTap", hint: "hint", seatHover: "seatHover", accessExpired: "accessExpired", accessUnavailable: "accessUnavailable", selectedObjectUnavailable: "selectedObjectUnavailable" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: '<div #container class="seatlayer-container"></div>', isInline: true, styles: [":host{display:block}.seatlayer-container{width:100%;height:100%}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
286
286
|
}
|
|
287
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
287
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.29", ngImport: i0, type: SeatLayerSeatingChartComponent, decorators: [{
|
|
288
288
|
type: Component,
|
|
289
289
|
args: [{ selector: 'seatlayer-seating-chart', standalone: true, template: '<div #container class="seatlayer-container"></div>', changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block}.seatlayer-container{width:100%;height:100%}\n"] }]
|
|
290
290
|
}], ctorParameters: () => [], propDecorators: { event: [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seatlayer-angular.mjs","sources":["../../src/seating-chart.component.ts","../../src/index.ts","../../src/seatlayer-angular.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n EventEmitter,\n Input,\n NgZone,\n OnChanges,\n Output,\n SimpleChanges,\n ViewChild,\n inject,\n} from '@angular/core';\nimport {\n SeatingChart as CoreSeatingChart,\n SEATING_CHART_IDENTITY_PROPS,\n bindSeatingChartHandle,\n buildSeatingChartOptions,\n type RendererViewMode,\n type SeatingChartHandle,\n type SeatingChartOptions,\n type SelectedSeat,\n type HoldResult,\n type BestAvailableResult,\n type GAAreaAvailability,\n type SeatHoverDetails,\n type PickerSelectionValidity,\n type PickerSelectionValidator,\n type BuyerAccessToken,\n type BuyerAccessTokenProvider,\n type BuyerAccessExpiredEvent,\n type BuyerAccessUnavailableEvent,\n type SelectedObjectUnavailableEvent,\n} from '@seatlayer/js';\n\n/**\n * Angular wrapper around the framework-agnostic `@seatlayer/js` SDK.\n *\n * Standalone, so it is imported directly rather than through an NgModule.\n *\n * The canvas is created once and torn down on destroy. Only the inputs that\n * change the chart's identity (`SEATING_CHART_IDENTITY_PROPS`: `event`,\n * `apiBase`, `maxSelection`, `numberOfPlacesToSelect`, `publicKey`, `locale`, `currency`,\n * `colorblindSafe`, `initialView`, `errorDisplay`) trigger a rebuild, so an\n * unrelated change-detection pass never destroys the canvas mid-selection.\n *\n * @example\n * ```html\n * <seatlayer-seating-chart\n * #chart\n * event=\"summer-gala\"\n * (selectionChange)=\"onSelectionChange($event)\"\n * (hold)=\"onHold($event)\"\n * />\n * <button (click)=\"chart.hold()\">Continue</button>\n * ```\n */\n@Component({\n selector: 'seatlayer-seating-chart',\n standalone: true,\n template: '<div #container class=\"seatlayer-container\"></div>',\n styles: [':host { display: block; } .seatlayer-container { width: 100%; height: 100%; }'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SeatLayerSeatingChartComponent implements OnChanges {\n /** Event key to render. Changing it rebuilds the chart. */\n @Input({ required: true }) event!: string;\n\n /** API base URL. Defaults to the public API. */\n @Input() apiBase?: string;\n\n /** Cap on how many seats a buyer may select. */\n @Input() maxSelection?: number;\n\n /** Object ids or public labels selected after availability loads. */\n @Input() selectedObjects?: string[];\n\n /** Object ids or public labels the buyer may select. */\n @Input() selectableObjects?: string[] | null;\n\n /** Exact ticket count required for a valid selection. */\n @Input() numberOfPlacesToSelect?: number;\n\n /** Local buyer selection guards. Changing them rebuilds the chart. */\n @Input() selectionValidators?: PickerSelectionValidator[];\n\n /** Publishable key, when your integration uses one. */\n @Input() publicKey?: string;\n\n /** BCP-47 locale for built-in copy. */\n @Input() locale?: string;\n\n /** ISO currency for price formatting. */\n @Input() currency?: string;\n\n /** Render with colorblind-safe seat glyphs. */\n @Input() colorblindSafe?: boolean;\n\n /**\n * Initial canvas projection. Read once when the chart is built, so changing\n * it rebuilds.\n * @deprecated `'isometric'` and `'perspective'` are retired in favour of the\n * real 3D venue view; use `'flat'`.\n */\n @Input() initialView?: RendererViewMode;\n\n /**\n * What the BUYER sees when the chart cannot load: `'message'` (default) is a\n * styleable notice with a Try again button, `'none'` is silent for hosts that\n * render their own failure UI from `errored`.\n */\n @Input() errorDisplay?: 'message' | 'none';\n\n /** Show the built-in seat tooltip. Set false to draw your own from `seatHover`. */\n @Input() seatTooltip?: boolean;\n\n /** Copy overrides, read once per rebuild. */\n @Input() messages?: SeatingChartOptions['messages'];\n\n /**\n * Sales Channels: mint a buyer access session on demand. Called with a\n * `reason`; returns `{ token, expiresAt }` from YOUR backend. The token is\n * held in memory only — never storage, never a URL, never a log.\n */\n @Input() buyerAccessTokenProvider?: BuyerAccessTokenProvider;\n\n /** One-shot session for hosts that own the lifecycle. Cannot be renewed. */\n @Input() buyerAccessToken?: string | BuyerAccessToken;\n\n /** The buyer's selection changed. */\n @Output() readonly selectionChange: EventEmitter<SelectedSeat[]> = new EventEmitter<SelectedSeat[]>();\n\n /** Exact-count state changed. */\n @Output() readonly selectionValidityChange: EventEmitter<PickerSelectionValidity> =\n new EventEmitter<PickerSelectionValidity>();\n\n /** The exact count was reached. */\n @Output() readonly selectionValid: EventEmitter<SelectedSeat[]> = new EventEmitter<SelectedSeat[]>();\n\n /** The selection is not at the exact count. */\n @Output() readonly selectionInvalid: EventEmitter<PickerSelectionValidity> =\n new EventEmitter<PickerSelectionValidity>();\n\n /** The active selection cap was reached. */\n @Output() readonly selectionLimit: EventEmitter<number> = new EventEmitter<number>();\n\n /** A hold succeeded. */\n @Output() readonly hold: EventEmitter<HoldResult> = new EventEmitter<HoldResult>();\n\n /** A previous hold was restored on mount. */\n @Output() readonly holdRestored: EventEmitter<HoldResult> = new EventEmitter<HoldResult>();\n\n /** The active hold lapsed. */\n @Output() readonly holdExpired: EventEmitter<void> = new EventEmitter<void>();\n\n /** A GA area was clicked. */\n @Output() readonly gaClick: EventEmitter<GAAreaAvailability> = new EventEmitter<GAAreaAvailability>();\n\n /** Something failed — a network error, a rejected hold. */\n @Output() readonly errored: EventEmitter<unknown> = new EventEmitter<unknown>();\n\n /** A floor deck was tapped in the 3D view. */\n @Output() readonly deckTap: EventEmitter<string> = new EventEmitter<string>();\n\n /** A transient hint worth showing the buyer, or `null` to clear it. */\n @Output() readonly hint: EventEmitter<string | null> = new EventEmitter<string | null>();\n\n /** The pointer moved onto a seat, or off one (`null`). */\n @Output() readonly seatHover: EventEmitter<SeatHoverDetails | null> = new EventEmitter<SeatHoverDetails | null>();\n\n /** The buyer access session lapsed; `refreshed` says whether it recovered. */\n @Output() readonly accessExpired: EventEmitter<BuyerAccessExpiredEvent> =\n new EventEmitter<BuyerAccessExpiredEvent>();\n\n /** Private inventory is unavailable and refreshing will not fix it. */\n @Output() readonly accessUnavailable: EventEmitter<BuyerAccessUnavailableEvent> =\n new EventEmitter<BuyerAccessUnavailableEvent>();\n\n /** Selected-but-unheld units stopped being selectable. */\n @Output() readonly selectedObjectUnavailable: EventEmitter<SelectedObjectUnavailableEvent> =\n new EventEmitter<SelectedObjectUnavailableEvent>();\n\n @ViewChild('container', { static: true })\n private readonly container!: ElementRef<HTMLDivElement>;\n\n private readonly zone = inject(NgZone);\n private chart: CoreSeatingChart | null = null;\n\n /**\n * Inputs that require tearing the canvas down and rebuilding it. The shared\n * list from `@seatlayer/js`, not a hand-copied one — this is exactly the place\n * Angular fell two inputs behind React.\n */\n private static readonly REBUILD_INPUTS = SEATING_CHART_IDENTITY_PROPS;\n\n /**\n * The canonical forwarding object. Every imperative method below is a\n * one-line delegate to it, so the component cannot forward a method the other\n * wrappers do not, or miss one they do.\n */\n private readonly handle: SeatingChartHandle = bindSeatingChartHandle(() => this.chart);\n\n constructor() {\n inject(DestroyRef).onDestroy(() => this.destroy());\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n const needsRebuild = SeatLayerSeatingChartComponent.REBUILD_INPUTS.some((name) => name in changes);\n if (needsRebuild) {\n this.build();\n }\n }\n\n // ---------- imperative API, for a template ref ----------\n\n /** Hold the current selection. Resolves the hold, or `null` on a 409 conflict. */\n holdSelection(options?: { ttlMs?: number }): Promise<HoldResult | null> {\n return this.handle.hold(options);\n }\n\n /** Restore an active hold by its opaque id. */\n resumeHold(holdId: string): Promise<HoldResult | null> {\n return this.handle.resumeHold(holdId);\n }\n\n /** Current active hold known to the chart. */\n getCurrentHold(): HoldResult | null {\n return this.handle.getCurrentHold();\n }\n\n /** GA areas with live remaining capacity. */\n getGAAreas(): GAAreaAvailability[] {\n return this.handle.getGAAreas();\n }\n\n /** Atomically hold a quantity from one GA area. */\n holdGA(\n areaId: string,\n qty: number,\n options?: { tierId?: string | null; ttlMs?: number },\n ): Promise<HoldResult | null> {\n return this.handle.holdGA(areaId, qty, options);\n }\n\n /** Ask the server for the `qty` best free seats and hold them atomically. */\n bestAvailable(qty: number, categoryKey?: string): Promise<BestAvailableResult | null> {\n return this.handle.bestAvailable(qty, categoryKey);\n }\n\n /** Release the current hold (if any). */\n release(): Promise<void> {\n return this.handle.release();\n }\n\n /** Release some held labels while keeping the remainder active. */\n releaseLabels(labels: string[]): Promise<boolean> {\n return this.handle.releaseLabels(labels);\n }\n\n /** The current selection, with prices resolved from the chart categories. */\n getSelection(): SelectedSeat[] {\n return this.handle.getSelection();\n }\n\n selectObjects(objects: string[]): SelectedSeat[] {\n return this.handle.selectObjects(objects);\n }\n\n deselectObjects(objects: string[]): void {\n this.handle.deselectObjects(objects);\n }\n\n clearSelection(): void {\n this.handle.clearSelection();\n }\n\n selectCategories(categoryKeys: string[]): SelectedSeat[] {\n return this.handle.selectCategories(categoryKeys);\n }\n\n deselectCategories(categoryKeys: string[]): void {\n this.handle.deselectCategories(categoryKeys);\n }\n\n setSelectableObjects(objects: string[] | null): void {\n this.handle.setSelectableObjects(objects);\n }\n\n setMaxSelection(maxSelection: number): void {\n this.handle.setMaxSelection(maxSelection);\n }\n\n getSelectionValidity(): PickerSelectionValidity | null {\n return this.handle.getSelectionValidity();\n }\n\n /** Choose a ticket tier for a selected seat; `null` reverts to the default. */\n setSeatTier(seatId: string, tierId: string | null): void {\n this.handle.setSeatTier(seatId, tierId);\n }\n\n /** Floors of a multi-floor chart. Empty before the first render. */\n getFloors(): { id: string; name: string }[] {\n return this.handle.getFloors();\n }\n\n /** Switch the shown floor (2D). No-ops on single-floor charts. */\n setFloor(floorId: string): void {\n this.handle.setFloor(floorId);\n }\n\n /** Toggle colorblind-safe rendering at runtime. */\n setColorblindSafe(on: boolean): void {\n this.handle.setColorblindSafe(on);\n }\n\n /** Zoom in one step (same increment as the wheel/pinch gesture). */\n zoomIn(): void {\n this.handle.zoomIn();\n }\n\n /** Zoom out one step. */\n zoomOut(): void {\n this.handle.zoomOut();\n }\n\n /** Reset the camera so the whole chart fits the container. */\n zoomToFit(): void {\n this.handle.zoomToFit();\n }\n\n /**\n * Re-acquire the buyer access session after your app re-authorizes the buyer\n * (Sales Channels). Resolves false when the chart is not access-scoped.\n */\n refreshAccess(): Promise<boolean> {\n return this.handle.refreshAccess();\n }\n\n // ---------- internals ----------\n\n private build(): void {\n const element = this.container?.nativeElement;\n if (!element) return;\n\n this.destroy();\n\n // The chart runs a rAF render loop and pointer handlers. Left inside the\n // Angular zone, every frame would schedule change detection for the whole\n // application — so it is built outside, and each callback re-enters the zone\n // only to emit, which is the only part Angular needs to see.\n this.zone.runOutsideAngular(() => {\n const emit = <T>(emitter: EventEmitter<T>, value: T) =>\n this.zone.run(() => emitter.emit(value));\n\n const instance = new CoreSeatingChart(buildSeatingChartOptions(\n element,\n {\n event: this.event,\n apiBase: this.apiBase,\n maxSelection: this.maxSelection,\n selectedObjects: this.selectedObjects,\n selectableObjects: this.selectableObjects,\n numberOfPlacesToSelect: this.numberOfPlacesToSelect,\n selectionValidators: this.selectionValidators,\n publicKey: this.publicKey,\n locale: this.locale,\n currency: this.currency,\n colorblindSafe: this.colorblindSafe,\n initialView: this.initialView,\n errorDisplay: this.errorDisplay,\n messages: this.messages,\n seatTooltip: this.seatTooltip,\n buyerAccessTokenProvider: this.buyerAccessTokenProvider,\n buyerAccessToken: this.buyerAccessToken,\n },\n {\n onSelectionChange: (seats) => emit(this.selectionChange, seats),\n onSelectionValidityChange: (state) => emit(this.selectionValidityChange, state),\n onSelectionValid: (seats) => emit(this.selectionValid, seats),\n onSelectionInvalid: (state) => emit(this.selectionInvalid, state),\n onSelectionLimit: (max) => emit(this.selectionLimit, max),\n onHold: (result) => emit(this.hold, result),\n onHoldRestored: (result) => emit(this.holdRestored, result),\n onHoldExpired: () => this.zone.run(() => this.holdExpired.emit()),\n onGAClick: (area) => emit(this.gaClick, area),\n onError: (error) => emit(this.errored, error),\n onDeckTap: (floorId) => emit(this.deckTap, floorId),\n onHint: (message) => emit(this.hint, message),\n onSeatHover: (details) => emit(this.seatHover, details),\n onAccessExpired: (state) => emit(this.accessExpired, state),\n onAccessUnavailable: (state) => emit(this.accessUnavailable, state),\n onSelectedObjectUnavailable: (state) => emit(this.selectedObjectUnavailable, state),\n },\n ));\n\n this.chart = instance;\n void instance.render();\n });\n }\n\n private destroy(): void {\n this.chart?.destroy();\n this.chart = null;\n }\n}\n","/**\n * @seatlayer/angular — the Angular wrapper for the SeatLayer embed SDK.\n *\n * The component is standalone; import it directly rather than through an\n * NgModule.\n */\nexport { SeatLayerSeatingChartComponent } from './seating-chart.component';\n\nexport type {\n SelectedSeat,\n HoldResult,\n BestAvailableResult,\n GAAreaAvailability,\n HoldLineItem,\n SeatHoverDetails,\n} from '@seatlayer/js';\n\n// Sales Channels — buyer access sessions for private channel inventory.\nexport type {\n BuyerAccessToken,\n BuyerAccessTokenProvider,\n BuyerAccessRefreshReason,\n BuyerAccessUnavailableReason,\n BuyerAccessExpiredEvent,\n BuyerAccessUnavailableEvent,\n SelectedObjectUnavailableEvent,\n} from '@seatlayer/js';\n\n// The framework-agnostic widget class — for the one-call modal (SeatPickerWidget.open()).\nexport { SeatPicker as SeatPickerWidget } from '@seatlayer/js';\n\n// Host-side embed helper: grows the iframe on `seatlayer:height` and pins it on\n// `seatlayer:fullscreen`. Angular hosts depend on this package alone, so it has to\n// be reachable here rather than only from @seatlayer/js.\nexport { attachPickerFrame } from '@seatlayer/js';\nexport type { AttachPickerFrameOptions } from '@seatlayer/js';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["CoreSeatingChart"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"seatlayer-angular.mjs","sources":["../../src/seating-chart.component.ts","../../src/index.ts","../../src/seatlayer-angular.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n EventEmitter,\n Input,\n NgZone,\n OnChanges,\n Output,\n SimpleChanges,\n ViewChild,\n inject,\n} from '@angular/core';\nimport {\n SeatingChart as CoreSeatingChart,\n SEATING_CHART_IDENTITY_PROPS,\n bindSeatingChartHandle,\n buildSeatingChartOptions,\n type RendererViewMode,\n type SeatingChartHandle,\n type SeatingChartOptions,\n type SelectedSeat,\n type HoldResult,\n type BestAvailableResult,\n type GAAreaAvailability,\n type SeatHoverDetails,\n type PickerSelectionValidity,\n type PickerSelectionValidator,\n type BuyerAccessToken,\n type BuyerAccessTokenProvider,\n type BuyerAccessExpiredEvent,\n type BuyerAccessUnavailableEvent,\n type SelectedObjectUnavailableEvent,\n} from '@seatlayer/js';\n\n/**\n * Angular wrapper around the framework-agnostic `@seatlayer/js` SDK.\n *\n * Standalone, so it is imported directly rather than through an NgModule.\n *\n * The canvas is created once and torn down on destroy. Only the inputs that\n * change the chart's identity (`SEATING_CHART_IDENTITY_PROPS`: `event`,\n * `apiBase`, `maxSelection`, `numberOfPlacesToSelect`, `publicKey`, `locale`, `currency`,\n * `colorblindSafe`, `initialView`, `errorDisplay`) trigger a rebuild, so an\n * unrelated change-detection pass never destroys the canvas mid-selection.\n *\n * @example\n * ```html\n * <seatlayer-seating-chart\n * #chart\n * event=\"summer-gala\"\n * (selectionChange)=\"onSelectionChange($event)\"\n * (hold)=\"onHold($event)\"\n * />\n * <button (click)=\"chart.hold()\">Continue</button>\n * ```\n */\n@Component({\n selector: 'seatlayer-seating-chart',\n standalone: true,\n template: '<div #container class=\"seatlayer-container\"></div>',\n styles: [':host { display: block; } .seatlayer-container { width: 100%; height: 100%; }'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SeatLayerSeatingChartComponent implements OnChanges {\n /** Event key to render. Changing it rebuilds the chart. */\n @Input({ required: true }) event!: string;\n\n /** API base URL. Defaults to the public API. */\n @Input() apiBase?: string;\n\n /** Cap on how many seats a buyer may select. */\n @Input() maxSelection?: number;\n\n /** Object ids or public labels selected after availability loads. */\n @Input() selectedObjects?: string[];\n\n /** Object ids or public labels the buyer may select. */\n @Input() selectableObjects?: string[] | null;\n\n /** Exact ticket count required for a valid selection. */\n @Input() numberOfPlacesToSelect?: number;\n\n /** Local buyer selection guards. Changing them rebuilds the chart. */\n @Input() selectionValidators?: PickerSelectionValidator[];\n\n /** Publishable key, when your integration uses one. */\n @Input() publicKey?: string;\n\n /** BCP-47 locale for built-in copy. */\n @Input() locale?: string;\n\n /** ISO currency for price formatting. */\n @Input() currency?: string;\n\n /** Render with colorblind-safe seat glyphs. */\n @Input() colorblindSafe?: boolean;\n\n /**\n * Initial canvas projection. Read once when the chart is built, so changing\n * it rebuilds.\n * @deprecated `'isometric'` and `'perspective'` are retired in favour of the\n * real 3D venue view; use `'flat'`.\n */\n @Input() initialView?: RendererViewMode;\n\n /**\n * What the BUYER sees when the chart cannot load: `'message'` (default) is a\n * styleable notice with a Try again button, `'none'` is silent for hosts that\n * render their own failure UI from `errored`.\n */\n @Input() errorDisplay?: 'message' | 'none';\n\n /** Show the built-in seat tooltip. Set false to draw your own from `seatHover`. */\n @Input() seatTooltip?: boolean;\n\n /** Copy overrides, read once per rebuild. */\n @Input() messages?: SeatingChartOptions['messages'];\n\n /**\n * Sales Channels: mint a buyer access session on demand. Called with a\n * `reason`; returns `{ token, expiresAt }` from YOUR backend. The token is\n * held in memory only — never storage, never a URL, never a log.\n */\n @Input() buyerAccessTokenProvider?: BuyerAccessTokenProvider;\n\n /** One-shot session for hosts that own the lifecycle. Cannot be renewed. */\n @Input() buyerAccessToken?: string | BuyerAccessToken;\n\n /** The buyer's selection changed. */\n @Output() readonly selectionChange: EventEmitter<SelectedSeat[]> = new EventEmitter<SelectedSeat[]>();\n\n /** Exact-count state changed. */\n @Output() readonly selectionValidityChange: EventEmitter<PickerSelectionValidity> =\n new EventEmitter<PickerSelectionValidity>();\n\n /** The exact count was reached. */\n @Output() readonly selectionValid: EventEmitter<SelectedSeat[]> = new EventEmitter<SelectedSeat[]>();\n\n /** The selection is not at the exact count. */\n @Output() readonly selectionInvalid: EventEmitter<PickerSelectionValidity> =\n new EventEmitter<PickerSelectionValidity>();\n\n /** The active selection cap was reached. */\n @Output() readonly selectionLimit: EventEmitter<number> = new EventEmitter<number>();\n\n /** A hold succeeded. */\n @Output() readonly hold: EventEmitter<HoldResult> = new EventEmitter<HoldResult>();\n\n /** A previous hold was restored on mount. */\n @Output() readonly holdRestored: EventEmitter<HoldResult> = new EventEmitter<HoldResult>();\n\n /** The active hold lapsed. */\n @Output() readonly holdExpired: EventEmitter<void> = new EventEmitter<void>();\n\n /** A GA area was clicked. */\n @Output() readonly gaClick: EventEmitter<GAAreaAvailability> = new EventEmitter<GAAreaAvailability>();\n\n /** Something failed — a network error, a rejected hold. */\n @Output() readonly errored: EventEmitter<unknown> = new EventEmitter<unknown>();\n\n /** A floor deck was tapped in the 3D view. */\n @Output() readonly deckTap: EventEmitter<string> = new EventEmitter<string>();\n\n /** A transient hint worth showing the buyer, or `null` to clear it. */\n @Output() readonly hint: EventEmitter<string | null> = new EventEmitter<string | null>();\n\n /** The pointer moved onto a seat, or off one (`null`). */\n @Output() readonly seatHover: EventEmitter<SeatHoverDetails | null> = new EventEmitter<SeatHoverDetails | null>();\n\n /** The buyer access session lapsed; `refreshed` says whether it recovered. */\n @Output() readonly accessExpired: EventEmitter<BuyerAccessExpiredEvent> =\n new EventEmitter<BuyerAccessExpiredEvent>();\n\n /** Private inventory is unavailable and refreshing will not fix it. */\n @Output() readonly accessUnavailable: EventEmitter<BuyerAccessUnavailableEvent> =\n new EventEmitter<BuyerAccessUnavailableEvent>();\n\n /** Selected-but-unheld units stopped being selectable. */\n @Output() readonly selectedObjectUnavailable: EventEmitter<SelectedObjectUnavailableEvent> =\n new EventEmitter<SelectedObjectUnavailableEvent>();\n\n @ViewChild('container', { static: true })\n private readonly container!: ElementRef<HTMLDivElement>;\n\n private readonly zone = inject(NgZone);\n private chart: CoreSeatingChart | null = null;\n\n /**\n * Inputs that require tearing the canvas down and rebuilding it. The shared\n * list from `@seatlayer/js`, not a hand-copied one — this is exactly the place\n * Angular fell two inputs behind React.\n */\n private static readonly REBUILD_INPUTS = SEATING_CHART_IDENTITY_PROPS;\n\n /**\n * The canonical forwarding object. Every imperative method below is a\n * one-line delegate to it, so the component cannot forward a method the other\n * wrappers do not, or miss one they do.\n */\n private readonly handle: SeatingChartHandle = bindSeatingChartHandle(() => this.chart);\n\n constructor() {\n inject(DestroyRef).onDestroy(() => this.destroy());\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n const needsRebuild = SeatLayerSeatingChartComponent.REBUILD_INPUTS.some((name) => name in changes);\n if (needsRebuild) {\n this.build();\n }\n }\n\n // ---------- imperative API, for a template ref ----------\n\n /** Hold the current selection. Resolves the hold, or `null` on a 409 conflict. */\n holdSelection(options?: { ttlMs?: number }): Promise<HoldResult | null> {\n return this.handle.hold(options);\n }\n\n /** Restore an active hold by its opaque id. */\n resumeHold(holdId: string): Promise<HoldResult | null> {\n return this.handle.resumeHold(holdId);\n }\n\n /** Current active hold known to the chart. */\n getCurrentHold(): HoldResult | null {\n return this.handle.getCurrentHold();\n }\n\n /** GA areas with live remaining capacity. */\n getGAAreas(): GAAreaAvailability[] {\n return this.handle.getGAAreas();\n }\n\n /** Atomically hold a quantity from one GA area. */\n holdGA(\n areaId: string,\n qty: number,\n options?: { tierId?: string | null; ttlMs?: number },\n ): Promise<HoldResult | null> {\n return this.handle.holdGA(areaId, qty, options);\n }\n\n /** Ask the server for the `qty` best free seats and hold them atomically. */\n bestAvailable(qty: number, categoryKey?: string): Promise<BestAvailableResult | null> {\n return this.handle.bestAvailable(qty, categoryKey);\n }\n\n /** Release the current hold (if any). */\n release(): Promise<void> {\n return this.handle.release();\n }\n\n /** Release some held labels while keeping the remainder active. */\n releaseLabels(labels: string[]): Promise<boolean> {\n return this.handle.releaseLabels(labels);\n }\n\n /** The current selection, with prices resolved from the chart categories. */\n getSelection(): SelectedSeat[] {\n return this.handle.getSelection();\n }\n\n selectObjects(objects: string[]): SelectedSeat[] {\n return this.handle.selectObjects(objects);\n }\n\n deselectObjects(objects: string[]): void {\n this.handle.deselectObjects(objects);\n }\n\n clearSelection(): void {\n this.handle.clearSelection();\n }\n\n selectCategories(categoryKeys: string[]): SelectedSeat[] {\n return this.handle.selectCategories(categoryKeys);\n }\n\n deselectCategories(categoryKeys: string[]): void {\n this.handle.deselectCategories(categoryKeys);\n }\n\n setSelectableObjects(objects: string[] | null): void {\n this.handle.setSelectableObjects(objects);\n }\n\n setMaxSelection(maxSelection: number): void {\n this.handle.setMaxSelection(maxSelection);\n }\n\n getSelectionValidity(): PickerSelectionValidity | null {\n return this.handle.getSelectionValidity();\n }\n\n /** Choose a ticket tier for a selected seat; `null` reverts to the default. */\n setSeatTier(seatId: string, tierId: string | null): void {\n this.handle.setSeatTier(seatId, tierId);\n }\n\n /** Floors of a multi-floor chart. Empty before the first render. */\n getFloors(): { id: string; name: string }[] {\n return this.handle.getFloors();\n }\n\n /** Switch the shown floor (2D). No-ops on single-floor charts. */\n setFloor(floorId: string): void {\n this.handle.setFloor(floorId);\n }\n\n /** Toggle colorblind-safe rendering at runtime. */\n setColorblindSafe(on: boolean): void {\n this.handle.setColorblindSafe(on);\n }\n\n /** Zoom in one step (same increment as the wheel/pinch gesture). */\n zoomIn(): void {\n this.handle.zoomIn();\n }\n\n /** Zoom out one step. */\n zoomOut(): void {\n this.handle.zoomOut();\n }\n\n /** Reset the camera so the whole chart fits the container. */\n zoomToFit(): void {\n this.handle.zoomToFit();\n }\n\n /**\n * Re-acquire the buyer access session after your app re-authorizes the buyer\n * (Sales Channels). Resolves false when the chart is not access-scoped.\n */\n refreshAccess(): Promise<boolean> {\n return this.handle.refreshAccess();\n }\n\n // ---------- internals ----------\n\n private build(): void {\n const element = this.container?.nativeElement;\n if (!element) return;\n\n this.destroy();\n\n // The chart runs a rAF render loop and pointer handlers. Left inside the\n // Angular zone, every frame would schedule change detection for the whole\n // application — so it is built outside, and each callback re-enters the zone\n // only to emit, which is the only part Angular needs to see.\n this.zone.runOutsideAngular(() => {\n const emit = <T>(emitter: EventEmitter<T>, value: T) =>\n this.zone.run(() => emitter.emit(value));\n\n const instance = new CoreSeatingChart(buildSeatingChartOptions(\n element,\n {\n event: this.event,\n apiBase: this.apiBase,\n maxSelection: this.maxSelection,\n selectedObjects: this.selectedObjects,\n selectableObjects: this.selectableObjects,\n numberOfPlacesToSelect: this.numberOfPlacesToSelect,\n selectionValidators: this.selectionValidators,\n publicKey: this.publicKey,\n locale: this.locale,\n currency: this.currency,\n colorblindSafe: this.colorblindSafe,\n initialView: this.initialView,\n errorDisplay: this.errorDisplay,\n messages: this.messages,\n seatTooltip: this.seatTooltip,\n buyerAccessTokenProvider: this.buyerAccessTokenProvider,\n buyerAccessToken: this.buyerAccessToken,\n },\n {\n onSelectionChange: (seats) => emit(this.selectionChange, seats),\n onSelectionValidityChange: (state) => emit(this.selectionValidityChange, state),\n onSelectionValid: (seats) => emit(this.selectionValid, seats),\n onSelectionInvalid: (state) => emit(this.selectionInvalid, state),\n onSelectionLimit: (max) => emit(this.selectionLimit, max),\n onHold: (result) => emit(this.hold, result),\n onHoldRestored: (result) => emit(this.holdRestored, result),\n onHoldExpired: () => this.zone.run(() => this.holdExpired.emit()),\n onGAClick: (area) => emit(this.gaClick, area),\n onError: (error) => emit(this.errored, error),\n onDeckTap: (floorId) => emit(this.deckTap, floorId),\n onHint: (message) => emit(this.hint, message),\n onSeatHover: (details) => emit(this.seatHover, details),\n onAccessExpired: (state) => emit(this.accessExpired, state),\n onAccessUnavailable: (state) => emit(this.accessUnavailable, state),\n onSelectedObjectUnavailable: (state) => emit(this.selectedObjectUnavailable, state),\n },\n ));\n\n this.chart = instance;\n void instance.render();\n });\n }\n\n private destroy(): void {\n this.chart?.destroy();\n this.chart = null;\n }\n}\n","/**\n * @seatlayer/angular — the Angular wrapper for the SeatLayer embed SDK.\n *\n * The component is standalone; import it directly rather than through an\n * NgModule.\n */\nexport { SeatLayerSeatingChartComponent } from './seating-chart.component';\n\nexport type {\n SelectedSeat,\n HoldResult,\n BestAvailableResult,\n GAAreaAvailability,\n HoldLineItem,\n SeatHoverDetails,\n} from '@seatlayer/js';\n\n// Sales Channels — buyer access sessions for private channel inventory.\nexport type {\n BuyerAccessToken,\n BuyerAccessTokenProvider,\n BuyerAccessRefreshReason,\n BuyerAccessUnavailableReason,\n BuyerAccessExpiredEvent,\n BuyerAccessUnavailableEvent,\n SelectedObjectUnavailableEvent,\n} from '@seatlayer/js';\n\n// The framework-agnostic widget class — for the one-call modal (SeatPickerWidget.open()).\nexport { SeatPicker as SeatPickerWidget } from '@seatlayer/js';\n\n// Host-side embed helper: grows the iframe on `seatlayer:height` and pins it on\n// `seatlayer:fullscreen`. Angular hosts depend on this package alone, so it has to\n// be reachable here rather than only from @seatlayer/js.\nexport { attachPickerFrame } from '@seatlayer/js';\nexport type { AttachPickerFrameOptions } from '@seatlayer/js';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["CoreSeatingChart"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,12 +1,184 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { OnChanges, EventEmitter, SimpleChanges } from '@angular/core';
|
|
3
|
+
import { PickerSelectionValidator, RendererViewMode, SeatingChartOptions, BuyerAccessTokenProvider, BuyerAccessToken, SelectedSeat, PickerSelectionValidity, HoldResult, GAAreaAvailability, SeatHoverDetails, BuyerAccessExpiredEvent, BuyerAccessUnavailableEvent, SelectedObjectUnavailableEvent, BestAvailableResult } from '@seatlayer/js';
|
|
4
|
+
export { AttachPickerFrameOptions, BestAvailableResult, BuyerAccessExpiredEvent, BuyerAccessRefreshReason, BuyerAccessToken, BuyerAccessTokenProvider, BuyerAccessUnavailableEvent, BuyerAccessUnavailableReason, GAAreaAvailability, HoldLineItem, HoldResult, SeatHoverDetails, SeatPicker as SeatPickerWidget, SelectedObjectUnavailableEvent, SelectedSeat, attachPickerFrame } from '@seatlayer/js';
|
|
5
|
+
|
|
1
6
|
/**
|
|
2
|
-
*
|
|
7
|
+
* Angular wrapper around the framework-agnostic `@seatlayer/js` SDK.
|
|
3
8
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
9
|
+
* Standalone, so it is imported directly rather than through an NgModule.
|
|
10
|
+
*
|
|
11
|
+
* The canvas is created once and torn down on destroy. Only the inputs that
|
|
12
|
+
* change the chart's identity (`SEATING_CHART_IDENTITY_PROPS`: `event`,
|
|
13
|
+
* `apiBase`, `maxSelection`, `numberOfPlacesToSelect`, `publicKey`, `locale`, `currency`,
|
|
14
|
+
* `colorblindSafe`, `initialView`, `errorDisplay`) trigger a rebuild, so an
|
|
15
|
+
* unrelated change-detection pass never destroys the canvas mid-selection.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```html
|
|
19
|
+
* <seatlayer-seating-chart
|
|
20
|
+
* #chart
|
|
21
|
+
* event="summer-gala"
|
|
22
|
+
* (selectionChange)="onSelectionChange($event)"
|
|
23
|
+
* (hold)="onHold($event)"
|
|
24
|
+
* />
|
|
25
|
+
* <button (click)="chart.hold()">Continue</button>
|
|
26
|
+
* ```
|
|
6
27
|
*/
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
28
|
+
declare class SeatLayerSeatingChartComponent implements OnChanges {
|
|
29
|
+
/** Event key to render. Changing it rebuilds the chart. */
|
|
30
|
+
event: string;
|
|
31
|
+
/** API base URL. Defaults to the public API. */
|
|
32
|
+
apiBase?: string;
|
|
33
|
+
/** Cap on how many seats a buyer may select. */
|
|
34
|
+
maxSelection?: number;
|
|
35
|
+
/** Object ids or public labels selected after availability loads. */
|
|
36
|
+
selectedObjects?: string[];
|
|
37
|
+
/** Object ids or public labels the buyer may select. */
|
|
38
|
+
selectableObjects?: string[] | null;
|
|
39
|
+
/** Exact ticket count required for a valid selection. */
|
|
40
|
+
numberOfPlacesToSelect?: number;
|
|
41
|
+
/** Local buyer selection guards. Changing them rebuilds the chart. */
|
|
42
|
+
selectionValidators?: PickerSelectionValidator[];
|
|
43
|
+
/** Publishable key, when your integration uses one. */
|
|
44
|
+
publicKey?: string;
|
|
45
|
+
/** BCP-47 locale for built-in copy. */
|
|
46
|
+
locale?: string;
|
|
47
|
+
/** ISO currency for price formatting. */
|
|
48
|
+
currency?: string;
|
|
49
|
+
/** Render with colorblind-safe seat glyphs. */
|
|
50
|
+
colorblindSafe?: boolean;
|
|
51
|
+
/**
|
|
52
|
+
* Initial canvas projection. Read once when the chart is built, so changing
|
|
53
|
+
* it rebuilds.
|
|
54
|
+
* @deprecated `'isometric'` and `'perspective'` are retired in favour of the
|
|
55
|
+
* real 3D venue view; use `'flat'`.
|
|
56
|
+
*/
|
|
57
|
+
initialView?: RendererViewMode;
|
|
58
|
+
/**
|
|
59
|
+
* What the BUYER sees when the chart cannot load: `'message'` (default) is a
|
|
60
|
+
* styleable notice with a Try again button, `'none'` is silent for hosts that
|
|
61
|
+
* render their own failure UI from `errored`.
|
|
62
|
+
*/
|
|
63
|
+
errorDisplay?: 'message' | 'none';
|
|
64
|
+
/** Show the built-in seat tooltip. Set false to draw your own from `seatHover`. */
|
|
65
|
+
seatTooltip?: boolean;
|
|
66
|
+
/** Copy overrides, read once per rebuild. */
|
|
67
|
+
messages?: SeatingChartOptions['messages'];
|
|
68
|
+
/**
|
|
69
|
+
* Sales Channels: mint a buyer access session on demand. Called with a
|
|
70
|
+
* `reason`; returns `{ token, expiresAt }` from YOUR backend. The token is
|
|
71
|
+
* held in memory only — never storage, never a URL, never a log.
|
|
72
|
+
*/
|
|
73
|
+
buyerAccessTokenProvider?: BuyerAccessTokenProvider;
|
|
74
|
+
/** One-shot session for hosts that own the lifecycle. Cannot be renewed. */
|
|
75
|
+
buyerAccessToken?: string | BuyerAccessToken;
|
|
76
|
+
/** The buyer's selection changed. */
|
|
77
|
+
readonly selectionChange: EventEmitter<SelectedSeat[]>;
|
|
78
|
+
/** Exact-count state changed. */
|
|
79
|
+
readonly selectionValidityChange: EventEmitter<PickerSelectionValidity>;
|
|
80
|
+
/** The exact count was reached. */
|
|
81
|
+
readonly selectionValid: EventEmitter<SelectedSeat[]>;
|
|
82
|
+
/** The selection is not at the exact count. */
|
|
83
|
+
readonly selectionInvalid: EventEmitter<PickerSelectionValidity>;
|
|
84
|
+
/** The active selection cap was reached. */
|
|
85
|
+
readonly selectionLimit: EventEmitter<number>;
|
|
86
|
+
/** A hold succeeded. */
|
|
87
|
+
readonly hold: EventEmitter<HoldResult>;
|
|
88
|
+
/** A previous hold was restored on mount. */
|
|
89
|
+
readonly holdRestored: EventEmitter<HoldResult>;
|
|
90
|
+
/** The active hold lapsed. */
|
|
91
|
+
readonly holdExpired: EventEmitter<void>;
|
|
92
|
+
/** A GA area was clicked. */
|
|
93
|
+
readonly gaClick: EventEmitter<GAAreaAvailability>;
|
|
94
|
+
/** Something failed — a network error, a rejected hold. */
|
|
95
|
+
readonly errored: EventEmitter<unknown>;
|
|
96
|
+
/** A floor deck was tapped in the 3D view. */
|
|
97
|
+
readonly deckTap: EventEmitter<string>;
|
|
98
|
+
/** A transient hint worth showing the buyer, or `null` to clear it. */
|
|
99
|
+
readonly hint: EventEmitter<string | null>;
|
|
100
|
+
/** The pointer moved onto a seat, or off one (`null`). */
|
|
101
|
+
readonly seatHover: EventEmitter<SeatHoverDetails | null>;
|
|
102
|
+
/** The buyer access session lapsed; `refreshed` says whether it recovered. */
|
|
103
|
+
readonly accessExpired: EventEmitter<BuyerAccessExpiredEvent>;
|
|
104
|
+
/** Private inventory is unavailable and refreshing will not fix it. */
|
|
105
|
+
readonly accessUnavailable: EventEmitter<BuyerAccessUnavailableEvent>;
|
|
106
|
+
/** Selected-but-unheld units stopped being selectable. */
|
|
107
|
+
readonly selectedObjectUnavailable: EventEmitter<SelectedObjectUnavailableEvent>;
|
|
108
|
+
private readonly container;
|
|
109
|
+
private readonly zone;
|
|
110
|
+
private chart;
|
|
111
|
+
/**
|
|
112
|
+
* Inputs that require tearing the canvas down and rebuilding it. The shared
|
|
113
|
+
* list from `@seatlayer/js`, not a hand-copied one — this is exactly the place
|
|
114
|
+
* Angular fell two inputs behind React.
|
|
115
|
+
*/
|
|
116
|
+
private static readonly REBUILD_INPUTS;
|
|
117
|
+
/**
|
|
118
|
+
* The canonical forwarding object. Every imperative method below is a
|
|
119
|
+
* one-line delegate to it, so the component cannot forward a method the other
|
|
120
|
+
* wrappers do not, or miss one they do.
|
|
121
|
+
*/
|
|
122
|
+
private readonly handle;
|
|
123
|
+
constructor();
|
|
124
|
+
ngOnChanges(changes: SimpleChanges): void;
|
|
125
|
+
/** Hold the current selection. Resolves the hold, or `null` on a 409 conflict. */
|
|
126
|
+
holdSelection(options?: {
|
|
127
|
+
ttlMs?: number;
|
|
128
|
+
}): Promise<HoldResult | null>;
|
|
129
|
+
/** Restore an active hold by its opaque id. */
|
|
130
|
+
resumeHold(holdId: string): Promise<HoldResult | null>;
|
|
131
|
+
/** Current active hold known to the chart. */
|
|
132
|
+
getCurrentHold(): HoldResult | null;
|
|
133
|
+
/** GA areas with live remaining capacity. */
|
|
134
|
+
getGAAreas(): GAAreaAvailability[];
|
|
135
|
+
/** Atomically hold a quantity from one GA area. */
|
|
136
|
+
holdGA(areaId: string, qty: number, options?: {
|
|
137
|
+
tierId?: string | null;
|
|
138
|
+
ttlMs?: number;
|
|
139
|
+
}): Promise<HoldResult | null>;
|
|
140
|
+
/** Ask the server for the `qty` best free seats and hold them atomically. */
|
|
141
|
+
bestAvailable(qty: number, categoryKey?: string): Promise<BestAvailableResult | null>;
|
|
142
|
+
/** Release the current hold (if any). */
|
|
143
|
+
release(): Promise<void>;
|
|
144
|
+
/** Release some held labels while keeping the remainder active. */
|
|
145
|
+
releaseLabels(labels: string[]): Promise<boolean>;
|
|
146
|
+
/** The current selection, with prices resolved from the chart categories. */
|
|
147
|
+
getSelection(): SelectedSeat[];
|
|
148
|
+
selectObjects(objects: string[]): SelectedSeat[];
|
|
149
|
+
deselectObjects(objects: string[]): void;
|
|
150
|
+
clearSelection(): void;
|
|
151
|
+
selectCategories(categoryKeys: string[]): SelectedSeat[];
|
|
152
|
+
deselectCategories(categoryKeys: string[]): void;
|
|
153
|
+
setSelectableObjects(objects: string[] | null): void;
|
|
154
|
+
setMaxSelection(maxSelection: number): void;
|
|
155
|
+
getSelectionValidity(): PickerSelectionValidity | null;
|
|
156
|
+
/** Choose a ticket tier for a selected seat; `null` reverts to the default. */
|
|
157
|
+
setSeatTier(seatId: string, tierId: string | null): void;
|
|
158
|
+
/** Floors of a multi-floor chart. Empty before the first render. */
|
|
159
|
+
getFloors(): {
|
|
160
|
+
id: string;
|
|
161
|
+
name: string;
|
|
162
|
+
}[];
|
|
163
|
+
/** Switch the shown floor (2D). No-ops on single-floor charts. */
|
|
164
|
+
setFloor(floorId: string): void;
|
|
165
|
+
/** Toggle colorblind-safe rendering at runtime. */
|
|
166
|
+
setColorblindSafe(on: boolean): void;
|
|
167
|
+
/** Zoom in one step (same increment as the wheel/pinch gesture). */
|
|
168
|
+
zoomIn(): void;
|
|
169
|
+
/** Zoom out one step. */
|
|
170
|
+
zoomOut(): void;
|
|
171
|
+
/** Reset the camera so the whole chart fits the container. */
|
|
172
|
+
zoomToFit(): void;
|
|
173
|
+
/**
|
|
174
|
+
* Re-acquire the buyer access session after your app re-authorizes the buyer
|
|
175
|
+
* (Sales Channels). Resolves false when the chart is not access-scoped.
|
|
176
|
+
*/
|
|
177
|
+
refreshAccess(): Promise<boolean>;
|
|
178
|
+
private build;
|
|
179
|
+
private destroy;
|
|
180
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SeatLayerSeatingChartComponent, never>;
|
|
181
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<SeatLayerSeatingChartComponent, "seatlayer-seating-chart", never, { "event": { "alias": "event"; "required": true; }; "apiBase": { "alias": "apiBase"; "required": false; }; "maxSelection": { "alias": "maxSelection"; "required": false; }; "selectedObjects": { "alias": "selectedObjects"; "required": false; }; "selectableObjects": { "alias": "selectableObjects"; "required": false; }; "numberOfPlacesToSelect": { "alias": "numberOfPlacesToSelect"; "required": false; }; "selectionValidators": { "alias": "selectionValidators"; "required": false; }; "publicKey": { "alias": "publicKey"; "required": false; }; "locale": { "alias": "locale"; "required": false; }; "currency": { "alias": "currency"; "required": false; }; "colorblindSafe": { "alias": "colorblindSafe"; "required": false; }; "initialView": { "alias": "initialView"; "required": false; }; "errorDisplay": { "alias": "errorDisplay"; "required": false; }; "seatTooltip": { "alias": "seatTooltip"; "required": false; }; "messages": { "alias": "messages"; "required": false; }; "buyerAccessTokenProvider": { "alias": "buyerAccessTokenProvider"; "required": false; }; "buyerAccessToken": { "alias": "buyerAccessToken"; "required": false; }; }, { "selectionChange": "selectionChange"; "selectionValidityChange": "selectionValidityChange"; "selectionValid": "selectionValid"; "selectionInvalid": "selectionInvalid"; "selectionLimit": "selectionLimit"; "hold": "hold"; "holdRestored": "holdRestored"; "holdExpired": "holdExpired"; "gaClick": "gaClick"; "errored": "errored"; "deckTap": "deckTap"; "hint": "hint"; "seatHover": "seatHover"; "accessExpired": "accessExpired"; "accessUnavailable": "accessUnavailable"; "selectedObjectUnavailable": "selectedObjectUnavailable"; }, never, never, true, never>;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
export { SeatLayerSeatingChartComponent };
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seatlayer/angular",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Angular
|
|
3
|
+
"version": "0.67.15",
|
|
4
|
+
"description": "SeatLayer's official Angular seating chart and seat map SDK — live availability, seat selection, temporary holds, and a typed TypeScript API for ticketing apps.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "SeatLayer",
|
|
@@ -18,17 +18,26 @@
|
|
|
18
18
|
},
|
|
19
19
|
"sideEffects": false,
|
|
20
20
|
"keywords": [
|
|
21
|
-
"
|
|
21
|
+
"seat map",
|
|
22
|
+
"seating chart",
|
|
22
23
|
"seat-map",
|
|
23
24
|
"seating-chart",
|
|
24
25
|
"seat-picker",
|
|
26
|
+
"seat-selection",
|
|
27
|
+
"seat-reservation",
|
|
28
|
+
"reserved-seating",
|
|
29
|
+
"seat-booking",
|
|
30
|
+
"event-ticketing",
|
|
31
|
+
"ticketing",
|
|
32
|
+
"live-inventory",
|
|
33
|
+
"seating",
|
|
25
34
|
"seatlayer",
|
|
26
35
|
"angular",
|
|
27
|
-
"
|
|
36
|
+
"typescript"
|
|
28
37
|
],
|
|
29
38
|
"dependencies": {
|
|
30
|
-
"@seatlayer/core": "0.
|
|
31
|
-
"@seatlayer/js": "0.
|
|
39
|
+
"@seatlayer/core": "0.67.15",
|
|
40
|
+
"@seatlayer/js": "0.67.15",
|
|
32
41
|
"tslib": "^2.8.1"
|
|
33
42
|
},
|
|
34
43
|
"peerDependencies": {
|
|
@@ -36,13 +45,13 @@
|
|
|
36
45
|
"@angular/core": ">=17.0.0"
|
|
37
46
|
},
|
|
38
47
|
"devDependencies": {
|
|
39
|
-
"@angular/common": "^
|
|
40
|
-
"@angular/compiler": "^
|
|
41
|
-
"@angular/compiler-cli": "^
|
|
42
|
-
"@angular/core": "^
|
|
43
|
-
"ng-packagr": "^
|
|
48
|
+
"@angular/common": "^20.0.0",
|
|
49
|
+
"@angular/compiler": "^20.0.0",
|
|
50
|
+
"@angular/compiler-cli": "^20.0.0",
|
|
51
|
+
"@angular/core": "^20.0.0",
|
|
52
|
+
"ng-packagr": "^20.0.0",
|
|
44
53
|
"rxjs": "^7.8.1",
|
|
45
|
-
"typescript": "
|
|
54
|
+
"typescript": "^5.9.0",
|
|
46
55
|
"zone.js": "^0.15.0"
|
|
47
56
|
},
|
|
48
57
|
"module": "./dist/fesm2022/seatlayer-angular.mjs",
|
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
import { EventEmitter, OnChanges, SimpleChanges } from '@angular/core';
|
|
2
|
-
import { type RendererViewMode, type SeatingChartOptions, type SelectedSeat, type HoldResult, type BestAvailableResult, type GAAreaAvailability, type SeatHoverDetails, type PickerSelectionValidity, type PickerSelectionValidator, type BuyerAccessToken, type BuyerAccessTokenProvider, type BuyerAccessExpiredEvent, type BuyerAccessUnavailableEvent, type SelectedObjectUnavailableEvent } from '@seatlayer/js';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
/**
|
|
5
|
-
* Angular wrapper around the framework-agnostic `@seatlayer/js` SDK.
|
|
6
|
-
*
|
|
7
|
-
* Standalone, so it is imported directly rather than through an NgModule.
|
|
8
|
-
*
|
|
9
|
-
* The canvas is created once and torn down on destroy. Only the inputs that
|
|
10
|
-
* change the chart's identity (`SEATING_CHART_IDENTITY_PROPS`: `event`,
|
|
11
|
-
* `apiBase`, `maxSelection`, `numberOfPlacesToSelect`, `publicKey`, `locale`, `currency`,
|
|
12
|
-
* `colorblindSafe`, `initialView`, `errorDisplay`) trigger a rebuild, so an
|
|
13
|
-
* unrelated change-detection pass never destroys the canvas mid-selection.
|
|
14
|
-
*
|
|
15
|
-
* @example
|
|
16
|
-
* ```html
|
|
17
|
-
* <seatlayer-seating-chart
|
|
18
|
-
* #chart
|
|
19
|
-
* event="summer-gala"
|
|
20
|
-
* (selectionChange)="onSelectionChange($event)"
|
|
21
|
-
* (hold)="onHold($event)"
|
|
22
|
-
* />
|
|
23
|
-
* <button (click)="chart.hold()">Continue</button>
|
|
24
|
-
* ```
|
|
25
|
-
*/
|
|
26
|
-
export declare class SeatLayerSeatingChartComponent implements OnChanges {
|
|
27
|
-
/** Event key to render. Changing it rebuilds the chart. */
|
|
28
|
-
event: string;
|
|
29
|
-
/** API base URL. Defaults to the public API. */
|
|
30
|
-
apiBase?: string;
|
|
31
|
-
/** Cap on how many seats a buyer may select. */
|
|
32
|
-
maxSelection?: number;
|
|
33
|
-
/** Object ids or public labels selected after availability loads. */
|
|
34
|
-
selectedObjects?: string[];
|
|
35
|
-
/** Object ids or public labels the buyer may select. */
|
|
36
|
-
selectableObjects?: string[] | null;
|
|
37
|
-
/** Exact ticket count required for a valid selection. */
|
|
38
|
-
numberOfPlacesToSelect?: number;
|
|
39
|
-
/** Local buyer selection guards. Changing them rebuilds the chart. */
|
|
40
|
-
selectionValidators?: PickerSelectionValidator[];
|
|
41
|
-
/** Publishable key, when your integration uses one. */
|
|
42
|
-
publicKey?: string;
|
|
43
|
-
/** BCP-47 locale for built-in copy. */
|
|
44
|
-
locale?: string;
|
|
45
|
-
/** ISO currency for price formatting. */
|
|
46
|
-
currency?: string;
|
|
47
|
-
/** Render with colorblind-safe seat glyphs. */
|
|
48
|
-
colorblindSafe?: boolean;
|
|
49
|
-
/**
|
|
50
|
-
* Initial canvas projection. Read once when the chart is built, so changing
|
|
51
|
-
* it rebuilds.
|
|
52
|
-
* @deprecated `'isometric'` and `'perspective'` are retired in favour of the
|
|
53
|
-
* real 3D venue view; use `'flat'`.
|
|
54
|
-
*/
|
|
55
|
-
initialView?: RendererViewMode;
|
|
56
|
-
/**
|
|
57
|
-
* What the BUYER sees when the chart cannot load: `'message'` (default) is a
|
|
58
|
-
* styleable notice with a Try again button, `'none'` is silent for hosts that
|
|
59
|
-
* render their own failure UI from `errored`.
|
|
60
|
-
*/
|
|
61
|
-
errorDisplay?: 'message' | 'none';
|
|
62
|
-
/** Show the built-in seat tooltip. Set false to draw your own from `seatHover`. */
|
|
63
|
-
seatTooltip?: boolean;
|
|
64
|
-
/** Copy overrides, read once per rebuild. */
|
|
65
|
-
messages?: SeatingChartOptions['messages'];
|
|
66
|
-
/**
|
|
67
|
-
* Sales Channels: mint a buyer access session on demand. Called with a
|
|
68
|
-
* `reason`; returns `{ token, expiresAt }` from YOUR backend. The token is
|
|
69
|
-
* held in memory only — never storage, never a URL, never a log.
|
|
70
|
-
*/
|
|
71
|
-
buyerAccessTokenProvider?: BuyerAccessTokenProvider;
|
|
72
|
-
/** One-shot session for hosts that own the lifecycle. Cannot be renewed. */
|
|
73
|
-
buyerAccessToken?: string | BuyerAccessToken;
|
|
74
|
-
/** The buyer's selection changed. */
|
|
75
|
-
readonly selectionChange: EventEmitter<SelectedSeat[]>;
|
|
76
|
-
/** Exact-count state changed. */
|
|
77
|
-
readonly selectionValidityChange: EventEmitter<PickerSelectionValidity>;
|
|
78
|
-
/** The exact count was reached. */
|
|
79
|
-
readonly selectionValid: EventEmitter<SelectedSeat[]>;
|
|
80
|
-
/** The selection is not at the exact count. */
|
|
81
|
-
readonly selectionInvalid: EventEmitter<PickerSelectionValidity>;
|
|
82
|
-
/** The active selection cap was reached. */
|
|
83
|
-
readonly selectionLimit: EventEmitter<number>;
|
|
84
|
-
/** A hold succeeded. */
|
|
85
|
-
readonly hold: EventEmitter<HoldResult>;
|
|
86
|
-
/** A previous hold was restored on mount. */
|
|
87
|
-
readonly holdRestored: EventEmitter<HoldResult>;
|
|
88
|
-
/** The active hold lapsed. */
|
|
89
|
-
readonly holdExpired: EventEmitter<void>;
|
|
90
|
-
/** A GA area was clicked. */
|
|
91
|
-
readonly gaClick: EventEmitter<GAAreaAvailability>;
|
|
92
|
-
/** Something failed — a network error, a rejected hold. */
|
|
93
|
-
readonly errored: EventEmitter<unknown>;
|
|
94
|
-
/** A floor deck was tapped in the 3D view. */
|
|
95
|
-
readonly deckTap: EventEmitter<string>;
|
|
96
|
-
/** A transient hint worth showing the buyer, or `null` to clear it. */
|
|
97
|
-
readonly hint: EventEmitter<string | null>;
|
|
98
|
-
/** The pointer moved onto a seat, or off one (`null`). */
|
|
99
|
-
readonly seatHover: EventEmitter<SeatHoverDetails | null>;
|
|
100
|
-
/** The buyer access session lapsed; `refreshed` says whether it recovered. */
|
|
101
|
-
readonly accessExpired: EventEmitter<BuyerAccessExpiredEvent>;
|
|
102
|
-
/** Private inventory is unavailable and refreshing will not fix it. */
|
|
103
|
-
readonly accessUnavailable: EventEmitter<BuyerAccessUnavailableEvent>;
|
|
104
|
-
/** Selected-but-unheld units stopped being selectable. */
|
|
105
|
-
readonly selectedObjectUnavailable: EventEmitter<SelectedObjectUnavailableEvent>;
|
|
106
|
-
private readonly container;
|
|
107
|
-
private readonly zone;
|
|
108
|
-
private chart;
|
|
109
|
-
/**
|
|
110
|
-
* Inputs that require tearing the canvas down and rebuilding it. The shared
|
|
111
|
-
* list from `@seatlayer/js`, not a hand-copied one — this is exactly the place
|
|
112
|
-
* Angular fell two inputs behind React.
|
|
113
|
-
*/
|
|
114
|
-
private static readonly REBUILD_INPUTS;
|
|
115
|
-
/**
|
|
116
|
-
* The canonical forwarding object. Every imperative method below is a
|
|
117
|
-
* one-line delegate to it, so the component cannot forward a method the other
|
|
118
|
-
* wrappers do not, or miss one they do.
|
|
119
|
-
*/
|
|
120
|
-
private readonly handle;
|
|
121
|
-
constructor();
|
|
122
|
-
ngOnChanges(changes: SimpleChanges): void;
|
|
123
|
-
/** Hold the current selection. Resolves the hold, or `null` on a 409 conflict. */
|
|
124
|
-
holdSelection(options?: {
|
|
125
|
-
ttlMs?: number;
|
|
126
|
-
}): Promise<HoldResult | null>;
|
|
127
|
-
/** Restore an active hold by its opaque id. */
|
|
128
|
-
resumeHold(holdId: string): Promise<HoldResult | null>;
|
|
129
|
-
/** Current active hold known to the chart. */
|
|
130
|
-
getCurrentHold(): HoldResult | null;
|
|
131
|
-
/** GA areas with live remaining capacity. */
|
|
132
|
-
getGAAreas(): GAAreaAvailability[];
|
|
133
|
-
/** Atomically hold a quantity from one GA area. */
|
|
134
|
-
holdGA(areaId: string, qty: number, options?: {
|
|
135
|
-
tierId?: string | null;
|
|
136
|
-
ttlMs?: number;
|
|
137
|
-
}): Promise<HoldResult | null>;
|
|
138
|
-
/** Ask the server for the `qty` best free seats and hold them atomically. */
|
|
139
|
-
bestAvailable(qty: number, categoryKey?: string): Promise<BestAvailableResult | null>;
|
|
140
|
-
/** Release the current hold (if any). */
|
|
141
|
-
release(): Promise<void>;
|
|
142
|
-
/** Release some held labels while keeping the remainder active. */
|
|
143
|
-
releaseLabels(labels: string[]): Promise<boolean>;
|
|
144
|
-
/** The current selection, with prices resolved from the chart categories. */
|
|
145
|
-
getSelection(): SelectedSeat[];
|
|
146
|
-
selectObjects(objects: string[]): SelectedSeat[];
|
|
147
|
-
deselectObjects(objects: string[]): void;
|
|
148
|
-
clearSelection(): void;
|
|
149
|
-
selectCategories(categoryKeys: string[]): SelectedSeat[];
|
|
150
|
-
deselectCategories(categoryKeys: string[]): void;
|
|
151
|
-
setSelectableObjects(objects: string[] | null): void;
|
|
152
|
-
setMaxSelection(maxSelection: number): void;
|
|
153
|
-
getSelectionValidity(): PickerSelectionValidity | null;
|
|
154
|
-
/** Choose a ticket tier for a selected seat; `null` reverts to the default. */
|
|
155
|
-
setSeatTier(seatId: string, tierId: string | null): void;
|
|
156
|
-
/** Floors of a multi-floor chart. Empty before the first render. */
|
|
157
|
-
getFloors(): {
|
|
158
|
-
id: string;
|
|
159
|
-
name: string;
|
|
160
|
-
}[];
|
|
161
|
-
/** Switch the shown floor (2D). No-ops on single-floor charts. */
|
|
162
|
-
setFloor(floorId: string): void;
|
|
163
|
-
/** Toggle colorblind-safe rendering at runtime. */
|
|
164
|
-
setColorblindSafe(on: boolean): void;
|
|
165
|
-
/** Zoom in one step (same increment as the wheel/pinch gesture). */
|
|
166
|
-
zoomIn(): void;
|
|
167
|
-
/** Zoom out one step. */
|
|
168
|
-
zoomOut(): void;
|
|
169
|
-
/** Reset the camera so the whole chart fits the container. */
|
|
170
|
-
zoomToFit(): void;
|
|
171
|
-
/**
|
|
172
|
-
* Re-acquire the buyer access session after your app re-authorizes the buyer
|
|
173
|
-
* (Sales Channels). Resolves false when the chart is not access-scoped.
|
|
174
|
-
*/
|
|
175
|
-
refreshAccess(): Promise<boolean>;
|
|
176
|
-
private build;
|
|
177
|
-
private destroy;
|
|
178
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<SeatLayerSeatingChartComponent, never>;
|
|
179
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<SeatLayerSeatingChartComponent, "seatlayer-seating-chart", never, { "event": { "alias": "event"; "required": true; }; "apiBase": { "alias": "apiBase"; "required": false; }; "maxSelection": { "alias": "maxSelection"; "required": false; }; "selectedObjects": { "alias": "selectedObjects"; "required": false; }; "selectableObjects": { "alias": "selectableObjects"; "required": false; }; "numberOfPlacesToSelect": { "alias": "numberOfPlacesToSelect"; "required": false; }; "selectionValidators": { "alias": "selectionValidators"; "required": false; }; "publicKey": { "alias": "publicKey"; "required": false; }; "locale": { "alias": "locale"; "required": false; }; "currency": { "alias": "currency"; "required": false; }; "colorblindSafe": { "alias": "colorblindSafe"; "required": false; }; "initialView": { "alias": "initialView"; "required": false; }; "errorDisplay": { "alias": "errorDisplay"; "required": false; }; "seatTooltip": { "alias": "seatTooltip"; "required": false; }; "messages": { "alias": "messages"; "required": false; }; "buyerAccessTokenProvider": { "alias": "buyerAccessTokenProvider"; "required": false; }; "buyerAccessToken": { "alias": "buyerAccessToken"; "required": false; }; }, { "selectionChange": "selectionChange"; "selectionValidityChange": "selectionValidityChange"; "selectionValid": "selectionValid"; "selectionInvalid": "selectionInvalid"; "selectionLimit": "selectionLimit"; "hold": "hold"; "holdRestored": "holdRestored"; "holdExpired": "holdExpired"; "gaClick": "gaClick"; "errored": "errored"; "deckTap": "deckTap"; "hint": "hint"; "seatHover": "seatHover"; "accessExpired": "accessExpired"; "accessUnavailable": "accessUnavailable"; "selectedObjectUnavailable": "selectedObjectUnavailable"; }, never, never, true, never>;
|
|
180
|
-
}
|