iticket-seatingplan-dev 1.5.6 → 1.5.7

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.
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = Flexi;
7
+ var _react = require("react");
8
+ var _utils = require("../utils");
9
+ function Flexi(_ref) {
10
+ var _price$p;
11
+ let {
12
+ price,
13
+ onClose,
14
+ buttonText,
15
+ onConfirm,
16
+ isOpen,
17
+ panMap
18
+ } = _ref;
19
+ const [value, setValue] = (0, _react.useState)((_price$p = price.p) !== null && _price$p !== void 0 ? _price$p : price.pMin);
20
+ return /*#__PURE__*/React.createElement("div", {
21
+ className: "flexi-popup-content"
22
+ }, /*#__PURE__*/React.createElement("div", {
23
+ className: isOpen ? "flexi-content open" : "flexi-content",
24
+ onTransitionEnd: () => {
25
+ if (isOpen && panMap) {
26
+ panMap();
27
+ }
28
+ }
29
+ }, /*#__PURE__*/React.createElement("div", {
30
+ className: "slider-container"
31
+ }, /*#__PURE__*/React.createElement("p", {
32
+ className: "value"
33
+ }, _utils.NZDollar.format(value)), /*#__PURE__*/React.createElement("input", {
34
+ type: "range",
35
+ className: "slider",
36
+ min: price.pMin,
37
+ max: price.pMax,
38
+ value: value.toString(),
39
+ onChange: e => setValue(parseInt(e.target.value))
40
+ }), /*#__PURE__*/React.createElement("div", {
41
+ className: "min-max"
42
+ }, /*#__PURE__*/React.createElement("p", null, _utils.NZDollar.format(price.pMin)), /*#__PURE__*/React.createElement("p", null, _utils.NZDollar.format(price.pMax)))), /*#__PURE__*/React.createElement("button", {
43
+ className: "add-cart",
44
+ onClick: () => {
45
+ onConfirm(value);
46
+ onClose();
47
+ }
48
+ }, buttonText)));
49
+ }
@@ -0,0 +1,509 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = Map;
7
+ require("leaflet-gesture-handling/dist/leaflet-gesture-handling.css");
8
+ require("leaflet-draw/dist/leaflet.draw.css");
9
+ var _react = _interopRequireWildcard(require("react"));
10
+ var _reactLeaflet = require("react-leaflet");
11
+ var L = _interopRequireWildcard(require("leaflet"));
12
+ var _reactLeafletDraw = require("react-leaflet-draw");
13
+ var _leafletGestureHandling2 = require("leaflet-gesture-handling");
14
+ var _reactLeafletCustomControl = _interopRequireDefault(require("react-leaflet-custom-control"));
15
+ var _encodedSvgs = require("./assets/encodedSvgs");
16
+ var _utils = require("../utils");
17
+ var _PriceButton = _interopRequireDefault(require("./PriceButton"));
18
+ var _Flexi = _interopRequireDefault(require("./Flexi"));
19
+ var _CloseIcon = _interopRequireDefault(require("./icons/CloseIcon"));
20
+ var _TicketIcon = _interopRequireDefault(require("./icons/TicketIcon"));
21
+ var _FlexiIcon = _interopRequireDefault(require("./icons/FlexiIcon"));
22
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
23
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
24
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
25
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
26
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
27
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
28
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
29
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
30
+ function Map(_ref) {
31
+ let {
32
+ seats,
33
+ height,
34
+ width,
35
+ bounds,
36
+ handleClickSeat,
37
+ ticketPopupOpen,
38
+ setTicketPopupOpen,
39
+ chosenSeat,
40
+ bookedSeats,
41
+ addTicketToCart,
42
+ batchRemoveTicketsFromCart,
43
+ isReloading,
44
+ initialFetch,
45
+ isFullScreen,
46
+ setIsFullScreen,
47
+ priceSectionIds,
48
+ areaName,
49
+ price,
50
+ canMultiSelect,
51
+ mode,
52
+ setMode,
53
+ pricingPopupOpen,
54
+ setPricingPopupOpen,
55
+ selectedSeats,
56
+ setSelectedSeats
57
+ } = _ref;
58
+ const [isLegendOpen, setIsLegendOpen] = (0, _react.useState)(false);
59
+ const [isDragging, setIsDragging] = (0, _react.useState)(false);
60
+ const drawLayersRef = (0, _react.useRef)(null);
61
+ const drawRef = (0, _react.useRef)(null);
62
+ const popupRef = (0, _react.useRef)(null);
63
+ const map = (0, _reactLeaflet.useMap)();
64
+ L.drawLocal.draw.toolbar.buttons.rectangle = "Box select";
65
+ (0, _reactLeaflet.useMapEvents)({
66
+ mouseover: () => {
67
+ if (mode === _utils.modes.DRAG || mode === _utils.modes.DRAW || mode === _utils.modes.REMOVE) {
68
+ map.dragging.disable();
69
+ }
70
+ },
71
+ mousedown: e => {
72
+ if (!canMultiSelect) return;
73
+ const parent = document.querySelector(".leaflet-pane.leaflet-map-pane");
74
+ if (e.target !== parent && !parent.contains(e.originalEvent.target)) {
75
+ return;
76
+ }
77
+ if (mode === _utils.modes.DRAG || mode === _utils.modes.REMOVE) {
78
+ setIsDragging(true);
79
+ }
80
+ },
81
+ mouseup: () => {
82
+ if (!canMultiSelect) return;
83
+ if ((mode === _utils.modes.DRAG || mode === _utils.modes.REMOVE) && isDragging) {
84
+ setIsDragging(false);
85
+ if (mode === _utils.modes.DRAG) {
86
+ if (selectedSeats.length > 0) {
87
+ setPricingPopupOpen(true);
88
+ }
89
+ } else if (mode === _utils.modes.REMOVE) {
90
+ const seatsToRemove = [];
91
+ selectedSeats.forEach(seat => {
92
+ if (!seatsToRemove.find(s => s.ssId === seat.ssId) && seat.s === _utils.statuses.USER_PENDING) {
93
+ seatsToRemove.push(seat);
94
+ }
95
+ });
96
+ if (seatsToRemove.length > 0) {
97
+ batchRemoveTicketsFromCart(seatsToRemove);
98
+ }
99
+ setSelectedSeats([]);
100
+ }
101
+ }
102
+ }
103
+ });
104
+ (0, _react.useEffect)(() => {
105
+ const keyboardHandler = e => {
106
+ if (e.key === "Escape") {
107
+ if (ticketPopupOpen) {
108
+ map.closePopup();
109
+ } else if (pricingPopupOpen) {
110
+ setPricingPopupOpen(false);
111
+ setSelectedSeats([]);
112
+ } else if (mode !== _utils.modes.SINGLE) {
113
+ if (mode === _utils.modes.DRAW) {
114
+ var _drawRef$current;
115
+ (_drawRef$current = drawRef.current) === null || _drawRef$current === void 0 || _drawRef$current._toolbars.draw.disable();
116
+ }
117
+ setMode(_utils.modes.SINGLE);
118
+ } else if (isFullScreen) {
119
+ setIsFullScreen(false);
120
+ }
121
+ } else if (e.key === "Control" && canMultiSelect) {
122
+ if (mode !== _utils.modes.DRAG) {
123
+ if (mode === _utils.modes.DRAW) {
124
+ var _drawRef$current2;
125
+ (_drawRef$current2 = drawRef.current) === null || _drawRef$current2 === void 0 || _drawRef$current2._toolbars.draw.disable();
126
+ }
127
+ setMode(_utils.modes.DRAG);
128
+ } else {
129
+ setMode(_utils.modes.SINGLE);
130
+ }
131
+ } else if (e.key === "Alt" && canMultiSelect) {
132
+ if (mode !== _utils.modes.DRAW) {
133
+ var _drawRef$current3;
134
+ (_drawRef$current3 = drawRef.current) === null || _drawRef$current3 === void 0 || _drawRef$current3._toolbars.draw._modes.rectangle.handler.enable();
135
+ setMode(_utils.modes.DRAW);
136
+ } else {
137
+ var _drawRef$current4;
138
+ (_drawRef$current4 = drawRef.current) === null || _drawRef$current4 === void 0 || _drawRef$current4._toolbars.draw.disable();
139
+ setMode(_utils.modes.SINGLE);
140
+ }
141
+ }
142
+ };
143
+ if (typeof window !== "undefined") {
144
+ window.addEventListener("keydown", keyboardHandler);
145
+ }
146
+ return () => {
147
+ if (typeof window !== "undefined") {
148
+ window.removeEventListener("keydown", keyboardHandler);
149
+ }
150
+ };
151
+ }, [isFullScreen, ticketPopupOpen, mode]);
152
+ const getNorthSeatLat = seat => {
153
+ return height / 33.33 - height / 33.33 * seat.y * 0.0105 + 1.4;
154
+ };
155
+ const getSeatCenterLatLng = (seat, isIcon) => {
156
+ return {
157
+ lat: height * 0.05 - seat.y / (height > 800 ? height > 999 ? isIcon ? 3.5 : 3.45 : 3.3 : 3.35) - (height > 800 ? height > 999 ? height * 0.0201 : height * 0.0198 : height > 587 ? height * 0.0201 : height > 399 ? height * 0.02035 : height * 0.0207),
158
+ lng: seat.x * 0.3 + 0.15
159
+ };
160
+ };
161
+ const handleDrawBox = v => {
162
+ var _seats$seats, _drawLayersRef$curren;
163
+ if (!canMultiSelect || !(v.layer instanceof L.Rectangle)) return;
164
+ const seatsToBook = [];
165
+ const boxBounds = v.layer.getBounds();
166
+ seats === null || seats === void 0 || (_seats$seats = seats.seats) === null || _seats$seats === void 0 || _seats$seats.forEach(seat => {
167
+ const seatCenter = getSeatCenterLatLng(seat, false);
168
+ const latlng = [seat.r.includes("NORTH") ? getNorthSeatLat(seat) : seatCenter.lat, seatCenter.lng];
169
+ if (boxBounds.contains(latlng) && !seatsToBook.find(s => s.ssId === seat.ssId) && seat.s === _utils.statuses.UNSOLD) {
170
+ seatsToBook.push(seat);
171
+ }
172
+ });
173
+ setSelectedSeats(seatsToBook);
174
+ if (seatsToBook.length > 0) {
175
+ setPricingPopupOpen(true);
176
+ }
177
+ (_drawLayersRef$curren = drawLayersRef.current) === null || _drawLayersRef$curren === void 0 || _drawLayersRef$curren.clearLayers();
178
+ };
179
+
180
+ // gesture-handling plugin disallows scroll zooming and touch panning,
181
+ // to allow users to scroll past the map when it's not full screen.
182
+ (0, _react.useEffect)(() => {
183
+ if (!isFullScreen) {
184
+ map.addHandler("gestureHandling", _leafletGestureHandling2.GestureHandling);
185
+ // @ts-ignore
186
+ map.gestureHandling.enable();
187
+ }
188
+ }, [map, isFullScreen]);
189
+ (0, _react.useEffect)(() => {
190
+ if (mode === _utils.modes.SINGLE) {
191
+ map.dragging.enable();
192
+ } else {
193
+ map.dragging.disable();
194
+ }
195
+ }, [mode, map]);
196
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_reactLeafletCustomControl.default, {
197
+ position: "bottomright"
198
+ }, /*#__PURE__*/_react.default.createElement("div", {
199
+ className: "legendBox"
200
+ }, /*#__PURE__*/_react.default.createElement("div", {
201
+ className: "legend-header"
202
+ }, /*#__PURE__*/_react.default.createElement("button", {
203
+ className: "legend-button ".concat(isLegendOpen ? "expanded" : ""),
204
+ onClick: () => setIsLegendOpen(!isLegendOpen)
205
+ }, /*#__PURE__*/_react.default.createElement("p", null, isLegendOpen ? "LEGEND:" : "VIEW LEGEND")), isLegendOpen && /*#__PURE__*/_react.default.createElement("button", {
206
+ className: "close-button",
207
+ onClick: () => setIsLegendOpen(false)
208
+ }, /*#__PURE__*/_react.default.createElement("img", {
209
+ src: _encodedSvgs.closeIcon,
210
+ alt: "close"
211
+ }))), /*#__PURE__*/_react.default.createElement("div", {
212
+ className: "legend-contents ".concat(isLegendOpen ? "expanded" : "")
213
+ }, /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("div", {
214
+ className: "legend-item"
215
+ }, /*#__PURE__*/_react.default.createElement("div", {
216
+ className: "legend-symbol legend-available"
217
+ }), /*#__PURE__*/_react.default.createElement("p", null, "available"))), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("div", {
218
+ className: "legend-item"
219
+ }, /*#__PURE__*/_react.default.createElement("div", {
220
+ className: "legend-symbol legend-sold"
221
+ }), /*#__PURE__*/_react.default.createElement("p", null, "sold"))), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("div", {
222
+ className: "legend-item"
223
+ }, /*#__PURE__*/_react.default.createElement("div", {
224
+ className: "legend-symbol legend-in-cart"
225
+ }), /*#__PURE__*/_react.default.createElement("p", null, "in cart"))), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("div", {
226
+ className: "legend-item"
227
+ }, /*#__PURE__*/_react.default.createElement("img", {
228
+ src: _encodedSvgs.wheelchairIcon,
229
+ width: 15,
230
+ height: 15
231
+ }), /*#__PURE__*/_react.default.createElement("p", null, "wheelchair"))), seats.seats.filter(seat => seat.m).length > 0 ? /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("div", {
232
+ className: "legend-item"
233
+ }, /*#__PURE__*/_react.default.createElement("img", {
234
+ src: _encodedSvgs.userIcon,
235
+ width: 15,
236
+ height: 15
237
+ }), /*#__PURE__*/_react.default.createElement("p", null, "membership seats"))) : /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null)))), /*#__PURE__*/_react.default.createElement(_reactLeafletCustomControl.default, {
238
+ position: "topleft"
239
+ }, /*#__PURE__*/_react.default.createElement("div", {
240
+ className: "extra-controls"
241
+ }, /*#__PURE__*/_react.default.createElement("button", {
242
+ title: "Re-centre Seating Plan",
243
+ onClick: () => map.fitBounds(bounds),
244
+ className: "leaflet-control-zoom-in"
245
+ }, /*#__PURE__*/_react.default.createElement("img", {
246
+ src: "https://au-iticket-shop-legacy.azurewebsites.net/assets/images/fit-icon.jpg",
247
+ style: {
248
+ height: "17px"
249
+ }
250
+ })), /*#__PURE__*/_react.default.createElement("button", {
251
+ title: "Reload Seating Plan",
252
+ disabled: isReloading,
253
+ onClick: () => {
254
+ initialFetch(true);
255
+ map.fitBounds(bounds);
256
+ },
257
+ className: "leaflet-control-zoom-in reload-seating-plan",
258
+ style: {
259
+ background: isReloading ? "rgb(0, 230, 64)" : undefined
260
+ }
261
+ }, /*#__PURE__*/_react.default.createElement("img", {
262
+ className: isReloading ? "rotate" : "",
263
+ src: "https://au-iticket-shop-legacy.azurewebsites.net/assets/images/refresh.png",
264
+ style: {
265
+ height: "17px"
266
+ }
267
+ })))), /*#__PURE__*/_react.default.createElement(_reactLeafletCustomControl.default, {
268
+ position: "topleft"
269
+ }, /*#__PURE__*/_react.default.createElement("div", {
270
+ className: "extra-controls full-screen-control"
271
+ }, /*#__PURE__*/_react.default.createElement("button", {
272
+ title: isFullScreen ? "Collapse Seating Plan" : "Expand Seating Plan",
273
+ onClick: () => {
274
+ setIsFullScreen(prev => !prev);
275
+ },
276
+ className: "leaflet-control-zoom-in"
277
+ }, /*#__PURE__*/_react.default.createElement("img", {
278
+ src: isFullScreen ? _encodedSvgs.collapseIcon : _encodedSvgs.expandIcon,
279
+ style: {
280
+ height: "24px"
281
+ }
282
+ })))), canMultiSelect && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_reactLeafletCustomControl.default, {
283
+ position: "bottomleft"
284
+ }, /*#__PURE__*/_react.default.createElement("div", {
285
+ className: "extra-controls multi-select-control"
286
+ }, /*#__PURE__*/_react.default.createElement("div", {
287
+ className: "drag-select"
288
+ }, /*#__PURE__*/_react.default.createElement("button", {
289
+ title: "Drag select",
290
+ onClick: () => {
291
+ var _drawRef$current5;
292
+ (_drawRef$current5 = drawRef.current) === null || _drawRef$current5 === void 0 || _drawRef$current5._toolbars.draw.disable();
293
+ setMode(prev => prev === _utils.modes.DRAG ? _utils.modes.SINGLE : _utils.modes.DRAG);
294
+ },
295
+ className: "leaflet-control-zoom-in drag-button"
296
+ }, /*#__PURE__*/_react.default.createElement("span", null)), /*#__PURE__*/_react.default.createElement("ul", {
297
+ className: "leaflet-draw-actions leaflet-draw-actions-top leaflet-draw-actions-bottom cancel-button",
298
+ style: {
299
+ display: mode === _utils.modes.DRAG ? "block" : "none"
300
+ }
301
+ }, /*#__PURE__*/_react.default.createElement("li", null, /*#__PURE__*/_react.default.createElement("a", {
302
+ href: "#",
303
+ onClick: e => {
304
+ e.preventDefault();
305
+ setMode(_utils.modes.SINGLE);
306
+ }
307
+ }, "Cancel")))), (bookedSeats.length > 0 || mode === _utils.modes.REMOVE) && /*#__PURE__*/_react.default.createElement("div", {
308
+ className: "remove-seats"
309
+ }, /*#__PURE__*/_react.default.createElement("button", {
310
+ title: "Remove seats",
311
+ onClick: () => {
312
+ var _drawRef$current6;
313
+ (_drawRef$current6 = drawRef.current) === null || _drawRef$current6 === void 0 || _drawRef$current6._toolbars.draw.disable();
314
+ setMode(_utils.modes.REMOVE);
315
+ },
316
+ className: "leaflet-control-zoom-in remove-button"
317
+ }, /*#__PURE__*/_react.default.createElement("span", null)), /*#__PURE__*/_react.default.createElement("ul", {
318
+ className: "leaflet-draw-actions leaflet-draw-actions-top leaflet-draw-actions-bottom cancel-button",
319
+ style: {
320
+ display: mode === _utils.modes.REMOVE ? "block" : "none"
321
+ }
322
+ }, /*#__PURE__*/_react.default.createElement("li", null, /*#__PURE__*/_react.default.createElement("a", {
323
+ href: "#",
324
+ onClick: e => {
325
+ e.preventDefault();
326
+ setMode(_utils.modes.SINGLE);
327
+ }
328
+ }, "Cancel")))), /*#__PURE__*/_react.default.createElement("button", {
329
+ title: "Single select",
330
+ onClick: () => {
331
+ var _drawRef$current7;
332
+ (_drawRef$current7 = drawRef.current) === null || _drawRef$current7 === void 0 || _drawRef$current7._toolbars.draw.disable();
333
+ setMode(_utils.modes.SINGLE);
334
+ },
335
+ className: "leaflet-control-zoom-in single-button"
336
+ }, /*#__PURE__*/_react.default.createElement("span", null)))), /*#__PURE__*/_react.default.createElement(_reactLeaflet.FeatureGroup, {
337
+ ref: drawLayersRef
338
+ }, /*#__PURE__*/_react.default.createElement(_reactLeafletDraw.EditControl, {
339
+ position: "bottomleft",
340
+ onCreated: handleDrawBox,
341
+ onDrawStart: () => {
342
+ setMode(_utils.modes.DRAW);
343
+ },
344
+ onDrawStop: () => {
345
+ setMode(prev => prev === _utils.modes.DRAW ? _utils.modes.SINGLE : prev);
346
+ },
347
+ draw: {
348
+ rectangle: true,
349
+ circle: false,
350
+ polyline: false,
351
+ polygon: false,
352
+ marker: false,
353
+ circlemarker: false
354
+ },
355
+ edit: {
356
+ edit: false,
357
+ remove: false
358
+ },
359
+ onMounted: drawInstance => {
360
+ drawRef.current = drawInstance;
361
+ }
362
+ }))), /*#__PURE__*/_react.default.createElement(_reactLeafletCustomControl.default, {
363
+ position: "topright"
364
+ }, /*#__PURE__*/_react.default.createElement("button", {
365
+ title: "Close full screen",
366
+ onClick: () => setIsFullScreen(false),
367
+ className: "full-screen-close-button ".concat(isFullScreen ? "show" : "")
368
+ }, /*#__PURE__*/_react.default.createElement("img", {
369
+ src: _encodedSvgs.closeIcon,
370
+ style: {
371
+ height: "24px"
372
+ }
373
+ }))), /*#__PURE__*/_react.default.createElement(_reactLeaflet.ImageOverlay, {
374
+ url: seats.background,
375
+ bounds: [[0, 0], [height * 0.03, width * 0.03]],
376
+ zIndex: 10
377
+ }), seats && seats.seats && seats.seats.map((s, i) => {
378
+ var _chosenSeat$seat;
379
+ const isIcon = (!priceSectionIds || priceSectionIds.includes(s.psId)) && (s.s === _utils.statuses.WHEELCHAIR_ACCESS || s.s === _utils.statuses.USER_PENDING && s.m);
380
+ const seatCenter = getSeatCenterLatLng(s, isIcon);
381
+ const seatPrices = seats.pricing.filter(price => (!priceSectionIds || priceSectionIds.includes(price.psId)) && price.psId === s.psId);
382
+ const isSingleFlexi = seatPrices.length === 1 && !!seatPrices[0].pMax && !!seatPrices[0].pMin && seatPrices[0].pMax > seatPrices[0].pMin;
383
+ return /*#__PURE__*/_react.default.createElement("div", {
384
+ key: i
385
+ }, /*#__PURE__*/_react.default.createElement(_reactLeaflet.ImageOverlay, {
386
+ url: "https://iticketseatingplan.blob.core.windows.net/embed/static/media/rippleload.08e6a08dd832819226ef.gif",
387
+ bounds: [[(s.r.includes("NORTH") ? getNorthSeatLat(s) : seatCenter.lat) - 0.11, seatCenter.lng - 0.11], [(s.r.includes("NORTH") ? getNorthSeatLat(s) : seatCenter.lat) + 0.11, seatCenter.lng + 0.11]],
388
+ opacity: s.loading || ticketPopupOpen && (chosenSeat === null || chosenSeat === void 0 || (_chosenSeat$seat = chosenSeat.seat) === null || _chosenSeat$seat === void 0 ? void 0 : _chosenSeat$seat.ssId) === s.ssId ? 100 : 0,
389
+ zIndex: 10
390
+ }), !priceSectionIds || priceSectionIds.includes(s.psId) ? s.s === _utils.statuses.WHEELCHAIR_ACCESS ? /*#__PURE__*/_react.default.createElement(_reactLeaflet.ImageOverlay, {
391
+ url: _encodedSvgs.wheelchairIcon,
392
+ bounds: [[seatCenter.lat - 0.11, seatCenter.lng - 0.11], [seatCenter.lat + 0.11, seatCenter.lng + 0.11]],
393
+ zIndex: 10
394
+ }) : s.s === _utils.statuses.USER_PENDING && s.m ? /*#__PURE__*/_react.default.createElement(_reactLeaflet.ImageOverlay, {
395
+ url: _encodedSvgs.userIcon,
396
+ bounds: [[seatCenter.lat - 0.11, seatCenter.lng - 0.15], [seatCenter.lat + 0.11, seatCenter.lng + 0.15]],
397
+ zIndex: 10
398
+ }) : /*#__PURE__*/_react.default.createElement(_reactLeaflet.Circle, {
399
+ center: [s.r.includes("NORTH") ? getNorthSeatLat(s) : seatCenter.lat, seatCenter.lng],
400
+ pathOptions: (0, _utils.getInitialColor)(s, price
401
+ // TEST selected state for multiselect
402
+ // !!selectedSeats.find(
403
+ // (selectedSeat) => selectedSeat.ssId === s.ssId
404
+ // )
405
+ ),
406
+ radius: 12000,
407
+ eventHandlers: {
408
+ click: e => {
409
+ if (mode === _utils.modes.SINGLE) {
410
+ handleClickSeat(e, s);
411
+ }
412
+ },
413
+ popupopen: popup => {
414
+ setTicketPopupOpen(true);
415
+ popupRef.current = popup;
416
+ },
417
+ popupclose: () => {
418
+ setTicketPopupOpen(false);
419
+ popupRef.current = null;
420
+ },
421
+ mousedown: () => {
422
+ if ((mode === _utils.modes.DRAG || mode === _utils.modes.REMOVE) && canMultiSelect) {
423
+ if (!selectedSeats.find(seat => seat.ssId === s.ssId) && s.s === (mode === _utils.modes.DRAG ? _utils.statuses.UNSOLD : _utils.statuses.USER_PENDING)) {
424
+ setSelectedSeats(prev => [...prev, s]);
425
+ }
426
+ }
427
+ },
428
+ mouseover: () => {
429
+ if ((mode === _utils.modes.DRAG || mode === _utils.modes.REMOVE) && isDragging && canMultiSelect) {
430
+ if (!selectedSeats.find(seat => seat.ssId === s.ssId) && s.s === (mode === _utils.modes.DRAG ? _utils.statuses.UNSOLD : _utils.statuses.USER_PENDING)) {
431
+ setSelectedSeats(prev => [...prev, s]);
432
+ }
433
+ }
434
+ }
435
+ }
436
+ // value={s}
437
+ }, /*#__PURE__*/_react.default.createElement(_reactLeaflet.Tooltip, {
438
+ className: "seatname-tooltip",
439
+ direction: "top",
440
+ offset: [0, height * 0.03 + -30]
441
+ }, s.r + "-" + s.c), s.s === _utils.statuses.UNSOLD && /*#__PURE__*/_react.default.createElement(_reactLeaflet.Popup, {
442
+ className: "ticket-popup popup-".concat(s.sId)
443
+ }, isSingleFlexi ? /*#__PURE__*/_react.default.createElement("div", {
444
+ className: "single-flexi"
445
+ }, /*#__PURE__*/_react.default.createElement("div", {
446
+ className: "popup-header"
447
+ }, /*#__PURE__*/_react.default.createElement("div", {
448
+ className: "flexi-title"
449
+ }, /*#__PURE__*/_react.default.createElement(_FlexiIcon.default, {
450
+ className: "ticket-icon",
451
+ height: "56px",
452
+ width: "56px"
453
+ }), /*#__PURE__*/_react.default.createElement("p", {
454
+ className: "seatname"
455
+ }, "".concat(areaName ? areaName + " | " : "").concat(s.r, "-").concat(s.c))), /*#__PURE__*/_react.default.createElement("button", {
456
+ className: "close-button",
457
+ "aria-label": "close flexi popup",
458
+ onClick: () => map.closePopup()
459
+ }, /*#__PURE__*/_react.default.createElement(_CloseIcon.default, null))), /*#__PURE__*/_react.default.createElement("div", {
460
+ className: "popup-content"
461
+ }, /*#__PURE__*/_react.default.createElement("p", {
462
+ className: "heading"
463
+ }, "FLEXi Price"), /*#__PURE__*/_react.default.createElement(_Flexi.default, {
464
+ price: seatPrices[0],
465
+ onClose: () => map.closePopup(),
466
+ onConfirm: amount => addTicketToCart(s, _objectSpread(_objectSpread({}, seatPrices[0]), {}, {
467
+ p: amount
468
+ })),
469
+ buttonText: "Add to cart",
470
+ isOpen: true
471
+ }))) : /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
472
+ className: "popup-header"
473
+ }, /*#__PURE__*/_react.default.createElement(_TicketIcon.default, {
474
+ className: "ticket-icon",
475
+ height: "56px",
476
+ width: "56px"
477
+ }), /*#__PURE__*/_react.default.createElement("p", {
478
+ className: "seatname"
479
+ }, "".concat(areaName ? areaName + " | " : "").concat(s.r, "-").concat(s.c)), /*#__PURE__*/_react.default.createElement("button", {
480
+ className: "close-button",
481
+ "aria-label": "close popup",
482
+ onClick: () => map.closePopup()
483
+ }, /*#__PURE__*/_react.default.createElement(_CloseIcon.default, null))), /*#__PURE__*/_react.default.createElement("div", {
484
+ className: "popup-content"
485
+ }, /*#__PURE__*/_react.default.createElement("p", {
486
+ className: "heading"
487
+ }, "Select option:"), /*#__PURE__*/_react.default.createElement("div", {
488
+ className: "priceages"
489
+ }, seats.pricing.filter(price => (!priceSectionIds || priceSectionIds.includes(price.psId)) && price.psId === s.psId).map(price => /*#__PURE__*/_react.default.createElement(_PriceButton.default, {
490
+ key: price.paId,
491
+ price: price,
492
+ addToCart: amount => addTicketToCart(s, _objectSpread(_objectSpread({}, price), {}, {
493
+ p: amount
494
+ }))
495
+ // When the flexi dropdown opens, pan map to re-fit popup
496
+ ,
497
+ panMap: () => {
498
+ const p = document.querySelector(".popup-".concat(s.sId));
499
+ const h = p === null || p === void 0 ? void 0 : p.clientHeight;
500
+ if (h) {
501
+ const offsetTop = map.latLngToContainerPoint(popupRef.current.popup.getLatLng()).y - h;
502
+ if (offsetTop < 0) {
503
+ map.panBy([0, offsetTop - 20]);
504
+ }
505
+ }
506
+ }
507
+ }))))))) : /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null));
508
+ }));
509
+ }
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = PriceButton;
7
+ var _react = require("react");
8
+ var _utils = require("../utils");
9
+ var _Flexi = _interopRequireDefault(require("./Flexi"));
10
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
+ function PriceButton(_ref) {
12
+ let {
13
+ price,
14
+ addToCart,
15
+ panMap
16
+ } = _ref;
17
+ const [flexiOpen, setFlexiOpen] = (0, _react.useState)(false);
18
+ const flexiRef = (0, _react.useRef)(null);
19
+ const focusRef = (0, _react.useRef)(null);
20
+ const isFlexi = !!price.pMax && !!price.pMin && price.pMax > price.pMin;
21
+ (0, _react.useEffect)(() => {
22
+ if (flexiOpen) {
23
+ var _flexiRef$current, _focusRef$current;
24
+ focusRef.current = (_flexiRef$current = flexiRef.current) === null || _flexiRef$current === void 0 ? void 0 : _flexiRef$current.querySelectorAll("button, [href], input, select, textarea, \n [tabindex]:not([tabindex=\"-1\"]),video")[0];
25
+ (_focusRef$current = focusRef.current) === null || _focusRef$current === void 0 || _focusRef$current.focus();
26
+ }
27
+ }, [flexiOpen]);
28
+ return /*#__PURE__*/React.createElement("div", {
29
+ className: "priceage-container"
30
+ }, /*#__PURE__*/React.createElement("button", {
31
+ className: isFlexi ? "priceage flexi" : "priceage",
32
+ onClick: () => {
33
+ if (isFlexi) {
34
+ setFlexiOpen(prev => !prev);
35
+ } else {
36
+ addToCart(price.p);
37
+ }
38
+ },
39
+ disabled: price.is_available === false
40
+ }, /*#__PURE__*/React.createElement("span", {
41
+ className: "price"
42
+ }, /*#__PURE__*/React.createElement("span", {
43
+ className: "price-name"
44
+ }, /*#__PURE__*/React.createElement("span", null, price.paName), isFlexi && /*#__PURE__*/React.createElement("span", {
45
+ className: "flexi-badge"
46
+ }, "FLEXi")), /*#__PURE__*/React.createElement("span", {
47
+ className: "amount"
48
+ }, isFlexi ? "".concat(_utils.NZDollar.format(price.pMin), " - ").concat(_utils.NZDollar.format(price.pMax)) : _utils.NZDollar.format(price.p))), price.is_available === false && /*#__PURE__*/React.createElement("span", {
49
+ className: "unavailable"
50
+ }, "Allocation exhausted")), isFlexi && /*#__PURE__*/React.createElement(_Flexi.default, {
51
+ price: price,
52
+ onClose: () => setFlexiOpen(false),
53
+ onConfirm: addToCart,
54
+ buttonText: "Add to cart",
55
+ isOpen: flexiOpen,
56
+ panMap: panMap
57
+ }));
58
+ }