iticket-seatingplan-dev 1.5.5 → 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
+ }
@@ -5,15 +5,28 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = Map;
7
7
  require("leaflet-gesture-handling/dist/leaflet-gesture-handling.css");
8
+ require("leaflet-draw/dist/leaflet.draw.css");
8
9
  var _react = _interopRequireWildcard(require("react"));
9
10
  var _reactLeaflet = require("react-leaflet");
11
+ var L = _interopRequireWildcard(require("leaflet"));
12
+ var _reactLeafletDraw = require("react-leaflet-draw");
10
13
  var _leafletGestureHandling2 = require("leaflet-gesture-handling");
11
14
  var _reactLeafletCustomControl = _interopRequireDefault(require("react-leaflet-custom-control"));
12
15
  var _encodedSvgs = require("./assets/encodedSvgs");
13
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"));
14
22
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
15
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); }
16
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); }
17
30
  function Map(_ref) {
18
31
  let {
19
32
  seats,
@@ -24,45 +37,162 @@ function Map(_ref) {
24
37
  ticketPopupOpen,
25
38
  setTicketPopupOpen,
26
39
  chosenSeat,
40
+ bookedSeats,
27
41
  addTicketToCart,
42
+ batchRemoveTicketsFromCart,
28
43
  isReloading,
29
44
  initialFetch,
30
45
  isFullScreen,
31
46
  setIsFullScreen,
32
47
  priceSectionIds,
33
48
  areaName,
34
- price
49
+ price,
50
+ canMultiSelect,
51
+ mode,
52
+ setMode,
53
+ pricingPopupOpen,
54
+ setPricingPopupOpen,
55
+ selectedSeats,
56
+ setSelectedSeats
35
57
  } = _ref;
36
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);
37
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
+ });
38
104
  (0, _react.useEffect)(() => {
39
- const closeOnEscape = e => {
105
+ const keyboardHandler = e => {
40
106
  if (e.key === "Escape") {
41
- if (isFullScreen && !ticketPopupOpen) {
42
- setIsFullScreen(false);
43
- } else if (ticketPopupOpen) {
107
+ if (ticketPopupOpen) {
44
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);
45
140
  }
46
141
  }
47
142
  };
48
143
  if (typeof window !== "undefined") {
49
- window.addEventListener("keydown", closeOnEscape);
144
+ window.addEventListener("keydown", keyboardHandler);
50
145
  }
51
146
  return () => {
52
147
  if (typeof window !== "undefined") {
53
- window.removeEventListener("keydown", closeOnEscape);
148
+ window.removeEventListener("keydown", keyboardHandler);
54
149
  }
55
150
  };
56
- }, [isFullScreen, ticketPopupOpen]);
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
+ };
57
179
 
58
180
  // gesture-handling plugin disallows scroll zooming and touch panning,
59
181
  // to allow users to scroll past the map when it's not full screen.
60
182
  (0, _react.useEffect)(() => {
61
183
  if (!isFullScreen) {
62
184
  map.addHandler("gestureHandling", _leafletGestureHandling2.GestureHandling);
185
+ // @ts-ignore
63
186
  map.gestureHandling.enable();
64
187
  }
65
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]);
66
196
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_reactLeafletCustomControl.default, {
67
197
  position: "bottomright"
68
198
  }, /*#__PURE__*/_react.default.createElement("div", {
@@ -126,7 +256,7 @@ function Map(_ref) {
126
256
  },
127
257
  className: "leaflet-control-zoom-in reload-seating-plan",
128
258
  style: {
129
- background: isReloading ? "rgb(0, 230, 64)" : "#fff"
259
+ background: isReloading ? "rgb(0, 230, 64)" : undefined
130
260
  }
131
261
  }, /*#__PURE__*/_react.default.createElement("img", {
132
262
  className: isReloading ? "rotate" : "",
@@ -141,7 +271,7 @@ function Map(_ref) {
141
271
  }, /*#__PURE__*/_react.default.createElement("button", {
142
272
  title: isFullScreen ? "Collapse Seating Plan" : "Expand Seating Plan",
143
273
  onClick: () => {
144
- setIsFullScreen(!isFullScreen);
274
+ setIsFullScreen(prev => !prev);
145
275
  },
146
276
  className: "leaflet-control-zoom-in"
147
277
  }, /*#__PURE__*/_react.default.createElement("img", {
@@ -149,7 +279,87 @@ function Map(_ref) {
149
279
  style: {
150
280
  height: "24px"
151
281
  }
152
- })))), /*#__PURE__*/_react.default.createElement(_reactLeafletCustomControl.default, {
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, {
153
363
  position: "topright"
154
364
  }, /*#__PURE__*/_react.default.createElement("button", {
155
365
  title: "Close full screen",
@@ -166,78 +376,61 @@ function Map(_ref) {
166
376
  zIndex: 10
167
377
  }), seats && seats.seats && seats.seats.map((s, i) => {
168
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;
169
383
  return /*#__PURE__*/_react.default.createElement("div", {
170
384
  key: i
171
385
  }, /*#__PURE__*/_react.default.createElement(_reactLeaflet.ImageOverlay, {
172
386
  url: "https://iticketseatingplan.blob.core.windows.net/embed/static/media/rippleload.08e6a08dd832819226ef.gif",
173
- bounds: [[(s.r.includes("NORTH") ? height / 33.33 - height / 33.33 * s.y * 0.0105 + 1.4 : height * 0.05 - s.y / (height > 800 ? height > 999 ? 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)) - 0.11, s.x * 0.3 + 0.15 - 0.11], [(s.r.includes("NORTH") ? height / 33.33 - height / 33.33 * s.y * 0.0105 + 1.4 : height * 0.05 - s.y / (height > 800 ? height > 999 ? 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)) + 0.11, s.x * 0.3 + 0.15 + 0.11]
174
- // [height * 0.0302 - s.y * 0.602 - 0.3, s.x * 0.61 - 0.3],
175
- // [height * 0.0302 - s.y * 0.602 + 0.3, s.x * 0.61 + 0.3],
176
- // [height * 0.0302 - s.y * 0.602 - 0.17, s.x * 0.61 - 0.17],
177
- // [height * 0.0302 - s.y * 0.602 + 0.17, s.x * 0.61 + 0.17],
178
- ],
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]],
179
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,
180
389
  zIndex: 10
181
390
  }), !priceSectionIds || priceSectionIds.includes(s.psId) ? s.s === _utils.statuses.WHEELCHAIR_ACCESS ? /*#__PURE__*/_react.default.createElement(_reactLeaflet.ImageOverlay, {
182
391
  url: _encodedSvgs.wheelchairIcon,
183
- bounds: [
184
- // [
185
- // height * 0.0302 - s.y * 0.602 - 0.17,
186
- // s.x * 0.61 - 0.17,
187
- // ],
188
- // [
189
- // height * 0.0302 - s.y * 0.602 + 0.17,
190
- // s.x * 0.61 + 0.17,
191
- // ],
192
- [height * 0.05 - s.y / (height > 800 ? height > 999 ? 3.5 : 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) - 0.11, s.x * 0.3 + 0.15 - 0.11], [height * 0.05 - s.y / (height > 800 ? height > 999 ? 3.5 : 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) + 0.11, s.x * 0.3 + 0.15 + 0.11]],
392
+ bounds: [[seatCenter.lat - 0.11, seatCenter.lng - 0.11], [seatCenter.lat + 0.11, seatCenter.lng + 0.11]],
193
393
  zIndex: 10
194
394
  }) : s.s === _utils.statuses.USER_PENDING && s.m ? /*#__PURE__*/_react.default.createElement(_reactLeaflet.ImageOverlay, {
195
395
  url: _encodedSvgs.userIcon,
196
- bounds: [
197
- // [
198
- // height * 0.0302 - s.y * 0.602 - 0.17,
199
- // s.x * 0.61 - 0.17,
200
- // ],
201
- // [
202
- // height * 0.0302 - s.y * 0.602 + 0.17,
203
- // s.x * 0.61 + 0.17,
204
- // ],
205
- [height * 0.05 - s.y / (height > 800 ? height > 999 ? 3.5 : 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) - 0.11, s.x * 0.3 + 0.15 - 0.15], [height * 0.05 - s.y / (height > 800 ? height > 999 ? 3.5 : 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) + 0.11, s.x * 0.3 + 0.15 + 0.15]],
396
+ bounds: [[seatCenter.lat - 0.11, seatCenter.lng - 0.15], [seatCenter.lat + 0.11, seatCenter.lng + 0.15]],
206
397
  zIndex: 10
207
398
  }) : /*#__PURE__*/_react.default.createElement(_reactLeaflet.Circle, {
208
- center: [
209
- // height * 0.0305 -
210
- // s.y * 0.57 -
211
- // height * (height > 700 ? 0.0001 : 0.0006),
212
- // s.x * 0.6 + 0.25,
213
- //experimental
214
- // 14.42,
215
- // (height / 33.33 - 0.3 * s.y).toFixed(1)
216
- // height / 33.33 - (height / 33.33) * s.y * 0.01, //29, //3 27, // height / 33.33 - s.y, // s.y * 0.3, //+ (height / 0.503) * 0.01, //11.66, // 5.2,
217
- //working
218
- s.r.includes("NORTH") ? height / 33.33 - height / 33.33 * s.y * 0.0105 + 1.4 : height * 0.05 - s.y / (height > 800 ? height > 999 ? 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),
219
- // s.r.includes('NORTH')
220
- // ? 0
221
- // : 0,
222
- s.x * 0.3 + 0.15
223
-
224
- // height * 0.04 -
225
- // s.y / (height > 800 ? 3.5 : 3.35) -
226
- // (height > 800 ? height * 0.0101 : height * 0.0201),
227
- // s.x * 0.3 + 0.15,
228
-
229
- // -s.y * (height * 0.00037) + 24.2,
230
- // s.x * 0.3 + 0.15,
231
- ],
232
- pathOptions: (0, _utils.getInitialColor)(s, price),
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
+ ),
233
406
  radius: 12000,
234
407
  eventHandlers: {
235
- click: e => handleClickSeat(e, s),
236
- popupopen: () => {
408
+ click: e => {
409
+ if (mode === _utils.modes.SINGLE) {
410
+ handleClickSeat(e, s);
411
+ }
412
+ },
413
+ popupopen: popup => {
237
414
  setTicketPopupOpen(true);
415
+ popupRef.current = popup;
238
416
  },
239
417
  popupclose: () => {
240
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
+ }
241
434
  }
242
435
  }
243
436
  // value={s}
@@ -246,32 +439,71 @@ function Map(_ref) {
246
439
  direction: "top",
247
440
  offset: [0, height * 0.03 + -30]
248
441
  }, s.r + "-" + s.c), s.s === _utils.statuses.UNSOLD && /*#__PURE__*/_react.default.createElement(_reactLeaflet.Popup, {
249
- className: "ticket-popup"
442
+ className: "ticket-popup popup-".concat(s.sId)
443
+ }, isSingleFlexi ? /*#__PURE__*/_react.default.createElement("div", {
444
+ className: "single-flexi"
250
445
  }, /*#__PURE__*/_react.default.createElement("div", {
251
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"
252
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", {
253
478
  className: "seatname"
254
479
  }, "".concat(areaName ? areaName + " | " : "").concat(s.r, "-").concat(s.c)), /*#__PURE__*/_react.default.createElement("button", {
255
480
  className: "close-button",
256
481
  "aria-label": "close popup",
257
482
  onClick: () => map.closePopup()
258
- }, /*#__PURE__*/_react.default.createElement("img", {
259
- src: _encodedSvgs.closeIcon,
260
- alt: "close"
261
- }))), /*#__PURE__*/_react.default.createElement("p", {
483
+ }, /*#__PURE__*/_react.default.createElement(_CloseIcon.default, null))), /*#__PURE__*/_react.default.createElement("div", {
484
+ className: "popup-content"
485
+ }, /*#__PURE__*/_react.default.createElement("p", {
262
486
  className: "heading"
263
- }, "Select option:"), seats.pricing.filter(price => (!priceSectionIds || priceSectionIds.includes(price.psId)) && price.psId === s.psId).map(price => /*#__PURE__*/_react.default.createElement("button", {
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, {
264
490
  key: price.paId,
265
- className: "priceage",
266
- onClick: () => {
267
- s.loading = true;
268
- addTicketToCart(s, price);
269
- },
270
- disabled: price.is_available === false
271
- }, /*#__PURE__*/_react.default.createElement("p", {
272
- className: "price"
273
- }, /*#__PURE__*/_react.default.createElement("span", null, price.paName), /*#__PURE__*/_react.default.createElement("span", null, _utils.NZDollar.format(price.p))), price.is_available === false && /*#__PURE__*/_react.default.createElement("span", {
274
- className: "unavailable"
275
- }, "Allocation exhausted"))))) : /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null));
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));
276
508
  }));
277
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
+ }