iticket-seatingplan-dev 1.5.6 → 1.5.8

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