iticket-seatingplan-dev 1.7.1 → 1.7.3

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.
@@ -16,9 +16,13 @@ function Flexi(_ref) {
16
16
  buttonText,
17
17
  onConfirm,
18
18
  isOpen,
19
- panMap
19
+ panMap,
20
+ showCheckbox,
21
+ checkboxText,
22
+ initialChecked
20
23
  } = _ref;
21
24
  const [value, setValue] = (0, _react.useState)((_price$p = price.p) !== null && _price$p !== void 0 ? _price$p : price.pMin);
25
+ const [checked, setChecked] = (0, _react.useState)(initialChecked ? true : false);
22
26
  return /*#__PURE__*/_react.default.createElement("div", {
23
27
  className: "flexi-popup-content"
24
28
  }, /*#__PURE__*/_react.default.createElement("div", {
@@ -41,10 +45,19 @@ function Flexi(_ref) {
41
45
  onChange: e => setValue(parseInt(e.target.value))
42
46
  }), /*#__PURE__*/_react.default.createElement("div", {
43
47
  className: "min-max"
44
- }, /*#__PURE__*/_react.default.createElement("p", null, _utils.NZDollar.format(price.pMin)), /*#__PURE__*/_react.default.createElement("p", null, _utils.NZDollar.format(price.pMax)))), /*#__PURE__*/_react.default.createElement("button", {
48
+ }, /*#__PURE__*/_react.default.createElement("p", null, _utils.NZDollar.format(price.pMin)), /*#__PURE__*/_react.default.createElement("p", null, _utils.NZDollar.format(price.pMax)))), showCheckbox && /*#__PURE__*/_react.default.createElement("div", {
49
+ className: "flexi-checkbox"
50
+ }, /*#__PURE__*/_react.default.createElement("input", {
51
+ type: "checkbox",
52
+ id: "checkbox",
53
+ checked: checked,
54
+ onChange: () => setChecked(prev => !prev)
55
+ }), /*#__PURE__*/_react.default.createElement("label", {
56
+ htmlFor: "checkbox"
57
+ }, checkboxText)), /*#__PURE__*/_react.default.createElement("button", {
45
58
  className: "add-cart",
46
59
  onClick: () => {
47
- onConfirm(value);
60
+ onConfirm(value, checked);
48
61
  onClose();
49
62
  }
50
63
  }, buttonText)));
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = HoverPopup;
7
+ var _reactLeaflet = require("react-leaflet");
8
+ var _utils = require("../utils");
9
+ var _react = require("react");
10
+ const offset = 10;
11
+ const numOnlyRgx = /^\d+$/;
12
+ function HoverPopup(_ref) {
13
+ var _highlightedSeats$;
14
+ let {
15
+ hoveredSeat,
16
+ highlightedSeats,
17
+ mousePos,
18
+ show,
19
+ availablePrices,
20
+ prevHovered
21
+ } = _ref;
22
+ const map = (0, _reactLeaflet.useMap)();
23
+ const ref = (0, _react.useRef)(null);
24
+ const tooltipPos = (0, _react.useMemo)(() => {
25
+ var _ref$current, _ref$current2;
26
+ const tooltipWidth = ((_ref$current = ref.current) === null || _ref$current === void 0 ? void 0 : _ref$current.offsetWidth) || 0;
27
+ const tooltipHeight = ((_ref$current2 = ref.current) === null || _ref$current2 === void 0 ? void 0 : _ref$current2.offsetHeight) || 0;
28
+ const bounds = map.getPixelBounds();
29
+ const height = bounds.max.y - bounds.min.y;
30
+ const width = bounds.max.x - bounds.min.x;
31
+ let x = mousePos.x;
32
+ let y = mousePos.y;
33
+ if (y + tooltipHeight + offset * 2 > height) {
34
+ y -= tooltipHeight + offset;
35
+ } else {
36
+ y += offset * 2;
37
+ }
38
+ if (x + tooltipWidth + offset * 2 > width) {
39
+ x -= tooltipWidth + offset;
40
+ } else {
41
+ x += offset * 2;
42
+ }
43
+ return {
44
+ x,
45
+ y
46
+ };
47
+ }, [mousePos]);
48
+ const minPrice = (availablePrices === null || availablePrices === void 0 ? void 0 : availablePrices.length) > 0 ? Math.min(...availablePrices.map(price => price.pMin || price.p)) : 0;
49
+ const maxPrice = (availablePrices === null || availablePrices === void 0 ? void 0 : availablePrices.length) > 0 ? Math.max(...(availablePrices === null || availablePrices === void 0 ? void 0 : availablePrices.map(price => price.pMax || price.p))) : 0;
50
+ const priceText = (availablePrices === null || availablePrices === void 0 ? void 0 : availablePrices.length) > 0 ? availablePrices.length === 1 || maxPrice === minPrice ? _utils.NZDollar.format(availablePrices[0].p) : "".concat(_utils.NZDollar.format(minPrice), " - ").concat(_utils.NZDollar.format(maxPrice)) : "";
51
+ const rowName = (highlightedSeats === null || highlightedSeats === void 0 || (_highlightedSeats$ = highlightedSeats[0]) === null || _highlightedSeats$ === void 0 ? void 0 : _highlightedSeats$.r) || (hoveredSeat === null || hoveredSeat === void 0 ? void 0 : hoveredSeat.r);
52
+ const seatNames = (highlightedSeats === null || highlightedSeats === void 0 ? void 0 : highlightedSeats.map(seat => seat.c)) || [hoveredSeat === null || hoveredSeat === void 0 ? void 0 : hoveredSeat.c];
53
+ if (seatNames.every(s => numOnlyRgx.test(s))) {
54
+ seatNames.sort((a, b) => parseInt(a) - parseInt(b));
55
+ } else {
56
+ seatNames.sort();
57
+ }
58
+ const psName = highlightedSeats ? highlightedSeats === null || highlightedSeats === void 0 ? void 0 : highlightedSeats.reduce((acc, val) => {
59
+ if (!acc.some(s => s.psName === val.psName)) {
60
+ acc.push(val);
61
+ }
62
+ return acc;
63
+ }, []).map(s => s.psName).join(", ") : hoveredSeat === null || hoveredSeat === void 0 ? void 0 : hoveredSeat.psName;
64
+ return /*#__PURE__*/React.createElement("div", {
65
+ ref: ref,
66
+ className: "hover-popup",
67
+ style: {
68
+ top: "".concat(tooltipPos.y, "px"),
69
+ left: "".concat(tooltipPos.x, "px"),
70
+ opacity: show ? 1 : 0,
71
+ transitionDelay: show ? "50ms, 0ms, 0ms" : "250ms, 0ms, 0ms",
72
+ // a way to have smooth animation when hovering over the same row
73
+ transitionDuration: prevHovered !== null && prevHovered !== void 0 && prevHovered.r && prevHovered.r === (hoveredSeat === null || hoveredSeat === void 0 ? void 0 : hoveredSeat.r) ? "100ms, 150ms, 150ms" : "100ms, 50ms, 50ms"
74
+ }
75
+ }, /*#__PURE__*/React.createElement("div", {
76
+ className: "hover-popup-content"
77
+ }, /*#__PURE__*/React.createElement("div", {
78
+ className: "hover-popup-header"
79
+ }, /*#__PURE__*/React.createElement("div", {
80
+ className: "hover-popup-row"
81
+ }, /*#__PURE__*/React.createElement("p", {
82
+ className: "hover-popup-header-title"
83
+ }, "ROW"), /*#__PURE__*/React.createElement("div", {
84
+ className: "row-name"
85
+ }, /*#__PURE__*/React.createElement("p", null, rowName))), /*#__PURE__*/React.createElement("div", {
86
+ className: "hover-popup-column"
87
+ }, /*#__PURE__*/React.createElement("p", {
88
+ className: "hover-popup-header-title"
89
+ }, "SEAT"), /*#__PURE__*/React.createElement("div", {
90
+ className: "hover-popup-seats"
91
+ }, seatNames.map((s, i) => {
92
+ if (seatNames.length > 4) {
93
+ if (i === 3) {
94
+ return /*#__PURE__*/React.createElement("p", {
95
+ key: "".concat(s).concat(i),
96
+ className: "seat-name"
97
+ }, "...");
98
+ }
99
+ if (i < 2 || i === seatNames.length - 1) {
100
+ return /*#__PURE__*/React.createElement("p", {
101
+ key: "".concat(s).concat(i),
102
+ className: "seat-name"
103
+ }, s);
104
+ }
105
+ return null;
106
+ }
107
+ return /*#__PURE__*/React.createElement("p", {
108
+ key: "".concat(s).concat(i),
109
+ className: "seat-name"
110
+ }, s);
111
+ })))), /*#__PURE__*/React.createElement("div", {
112
+ className: "hover-popup-price"
113
+ }, /*#__PURE__*/React.createElement("p", {
114
+ className: "hover-popup-psname"
115
+ }, psName), /*#__PURE__*/React.createElement("div", {
116
+ className: "hover-popup-divider"
117
+ }), /*#__PURE__*/React.createElement("p", {
118
+ className: "hover-popup-pricetext"
119
+ }, priceText))));
120
+ }
@@ -20,6 +20,7 @@ var _CloseIcon = _interopRequireDefault(require("./icons/CloseIcon"));
20
20
  var _TicketIcon = _interopRequireDefault(require("./icons/TicketIcon"));
21
21
  var _FlexiIcon = _interopRequireDefault(require("./icons/FlexiIcon"));
22
22
  var _EditIcon = _interopRequireDefault(require("./icons/EditIcon"));
23
+ var _HoverPopup = _interopRequireDefault(require("./HoverPopup"));
23
24
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
24
25
  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); }
25
26
  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; }
@@ -29,6 +30,7 @@ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object
29
30
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
30
31
  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); }
31
32
  function SeatMap(_ref) {
33
+ var _seats$pricing2, _seats$seats2;
32
34
  let {
33
35
  seats,
34
36
  height,
@@ -55,7 +57,6 @@ function SeatMap(_ref) {
55
57
  setPricingPopupOpen,
56
58
  selectedSeats,
57
59
  setSelectedSeats,
58
- selectQuantityPopupOpen,
59
60
  setSelectQuantityPopupOpen,
60
61
  desiredSeatQuantity,
61
62
  setSeatsToRemove,
@@ -67,9 +68,19 @@ function SeatMap(_ref) {
67
68
  const [highlightedSeats, setHighlightedSeats] = (0, _react.useState)([]);
68
69
  const [greyedOutSeats, setGreyedOutSeats] = (0, _react.useState)([]);
69
70
  const [clickedSeat, setClickedSeat] = (0, _react.useState)(null);
71
+ const [mousePos, setMousePos] = (0, _react.useState)({
72
+ x: 0,
73
+ y: 0
74
+ });
75
+ const [isHoveringOnSeat, setIsHoveringOnSeat] = (0, _react.useState)(false);
76
+ const [hoveredSeat, setHoveredSeat] = (0, _react.useState)(null);
70
77
  const drawLayersRef = (0, _react.useRef)(null);
71
78
  const drawRef = (0, _react.useRef)(null);
72
79
  const popupRef = (0, _react.useRef)(null);
80
+ const prevHovered = (0, _react.useRef)(null);
81
+ (0, _react.useEffect)(() => {
82
+ prevHovered.current = hoveredSeat;
83
+ }, [hoveredSeat]);
73
84
  const map = (0, _reactLeaflet.useMap)();
74
85
 
75
86
  // L.drawLocal.draw.toolbar.buttons.rectangle = "Box select";
@@ -206,7 +217,17 @@ function SeatMap(_ref) {
206
217
  }
207
218
  }, [mode, map]);
208
219
  const seatsMap = (0, _react.useMemo)(() => new Map(seats.seats.map(s => [s.sId, s])), [seats.seats]);
209
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, seats.preventOrphanedSeats && /*#__PURE__*/_react.default.createElement(_reactLeafletCustomControl.default, {
220
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_HoverPopup.default, {
221
+ hoveredSeat: hoveredSeat,
222
+ highlightedSeats: highlightedSeats && highlightedSeats.length > 0 ? highlightedSeats : null,
223
+ mousePos: mousePos,
224
+ show: (hoveredSeat || (highlightedSeats === null || highlightedSeats === void 0 ? void 0 : highlightedSeats.length) > 0) && !ticketPopupOpen && !pricingPopupOpen && !isDragging && isHoveringOnSeat,
225
+ availablePrices: highlightedSeats && highlightedSeats.length > 0 ? highlightedSeats.flatMap(s => {
226
+ var _seats$pricing;
227
+ return ((_seats$pricing = seats.pricing) === null || _seats$pricing === void 0 ? void 0 : _seats$pricing.filter(p => p.psId === s.psId && (!priceSectionIds || priceSectionIds.includes(p.psId)) && (p.q === null || p.q > 0))) || [];
228
+ }) : hoveredSeat ? ((_seats$pricing2 = seats.pricing) === null || _seats$pricing2 === void 0 ? void 0 : _seats$pricing2.filter(p => p.psId === hoveredSeat.psId && (!priceSectionIds || priceSectionIds.includes(p.psId)) && (p.q === null || p.q > 0))) || [] : undefined,
229
+ prevHovered: prevHovered.current
230
+ }), seats.preventOrphanedSeats && /*#__PURE__*/_react.default.createElement(_reactLeafletCustomControl.default, {
210
231
  position: "topright"
211
232
  }, /*#__PURE__*/_react.default.createElement("div", {
212
233
  className: "extra-controls seat-quantity-control"
@@ -255,7 +276,7 @@ function SeatMap(_ref) {
255
276
  src: _encodedSvgs.wheelchairIcon,
256
277
  width: 15,
257
278
  height: 15
258
- }), /*#__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", {
279
+ }), /*#__PURE__*/_react.default.createElement("p", null, "wheelchair"))), ((_seats$seats2 = seats.seats) === null || _seats$seats2 === void 0 ? void 0 : _seats$seats2.filter(seat => seat.m).length) > 0 ? /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("div", {
259
280
  className: "legend-item"
260
281
  }, /*#__PURE__*/_react.default.createElement("img", {
261
282
  src: _encodedSvgs.userIcon,
@@ -402,10 +423,10 @@ function SeatMap(_ref) {
402
423
  bounds: [[0, 0], [height * 0.03, width * 0.03]],
403
424
  zIndex: 10
404
425
  }), seats && seats.seats && seats.seats.map((s, i) => {
405
- var _chosenSeat$seat, _chosenSeat$seat2;
426
+ var _seats$pricing3, _chosenSeat$seat, _chosenSeat$seat2, _chosenSeat$seat3;
406
427
  const isIcon = (!priceSectionIds || priceSectionIds.includes(s.psId)) && (s.s === _utils.statuses.WHEELCHAIR_ACCESS || s.s === _utils.statuses.USER_PENDING && s.m);
407
428
  const seatCenter = getSeatCenterLatLng(s, isIcon);
408
- const seatPrices = seats.pricing.filter(price => (!priceSectionIds || priceSectionIds.includes(price.psId)) && price.psId === s.psId);
429
+ const seatPrices = ((_seats$pricing3 = seats.pricing) === null || _seats$pricing3 === void 0 ? void 0 : _seats$pricing3.filter(price => (!priceSectionIds || priceSectionIds.includes(price.psId)) && price.psId === s.psId)) || [];
409
430
  const hasSeatPrices = (seatPrices === null || seatPrices === void 0 ? void 0 : seatPrices.length) > 0;
410
431
  const isSingleFlexi = seatPrices.length === 1 && !!seatPrices[0].pMax && !!seatPrices[0].pMin && seatPrices[0].pMax > seatPrices[0].pMin;
411
432
  return /*#__PURE__*/_react.default.createElement("div", {
@@ -425,11 +446,13 @@ function SeatMap(_ref) {
425
446
  zIndex: 10
426
447
  }) : /*#__PURE__*/_react.default.createElement(_reactLeaflet.Circle, {
427
448
  center: [s.r.includes("NORTH") ? getNorthSeatLat(s) : seatCenter.lat, seatCenter.lng],
428
- pathOptions: (0, _utils.getInitialColor)(s, price, !hasSeatPrices, selectedSeats.some(selectedSeat => selectedSeat.ssId === s.ssId) || highlightedSeats.some(hs => hs.ssId === s.ssId), greyedOutSeats.some(gs => gs.ssId === s.ssId)),
449
+ pathOptions: (0, _utils.getInitialColor)(s, price, s.loading || ticketPopupOpen && (chosenSeat === null || chosenSeat === void 0 || (_chosenSeat$seat3 = chosenSeat.seat) === null || _chosenSeat$seat3 === void 0 ? void 0 : _chosenSeat$seat3.ssId) === s.ssId, !hasSeatPrices, selectedSeats.some(selectedSeat => selectedSeat.ssId === s.ssId) || highlightedSeats.some(hs => hs.ssId === s.ssId), greyedOutSeats.some(gs => gs.ssId === s.ssId)),
429
450
  radius: 12000,
430
451
  eventHandlers: {
431
452
  click: e => {
432
- if (seats.preventOrphanedSeats && desiredSeatQuantity > 0) {
453
+ if (mode === _utils.modes.DRAG || mode === _utils.modes.REMOVE || mode === _utils.modes.DRAW || selectedSeats.length > 0) {
454
+ map.closePopup();
455
+ } else if (seats.preventOrphanedSeats && desiredSeatQuantity > 0) {
433
456
  map.closePopup();
434
457
  if (s.s === _utils.statuses.USER_PENDING) {
435
458
  const newSeatsToRemove = (0, _utils.getAdjacentBookedSeats)(s, seatsMap);
@@ -474,6 +497,8 @@ function SeatMap(_ref) {
474
497
  setSelectedSeats(prev => [...prev, s]);
475
498
  }
476
499
  } else {
500
+ setIsHoveringOnSeat(true);
501
+ setHoveredSeat(s);
477
502
  if (seats.preventOrphanedSeats && desiredSeatQuantity > 0 && s.s === _utils.statuses.UNSOLD) {
478
503
  const seatsToBook = (0, _utils.getValidSeats)(s, seatsMap, desiredSeatQuantity);
479
504
  if (seatsToBook.valid) {
@@ -485,23 +510,38 @@ function SeatMap(_ref) {
485
510
  }
486
511
  },
487
512
  mouseout: () => {
488
- if (highlightedSeats.length > 0) {
489
- setHighlightedSeats([]);
490
- }
491
513
  if (greyedOutSeats.length > 0) {
492
514
  setGreyedOutSeats([]);
493
515
  }
494
516
  if (clickedSeat) {
495
517
  setClickedSeat(null);
496
518
  }
519
+ if (hoveredSeat || highlightedSeats) {
520
+ setTimeout(() => {
521
+ if (hoveredSeat) {
522
+ setHoveredSeat(prev => prev && prev === hoveredSeat ? null : prev);
523
+ }
524
+ if (highlightedSeats) {
525
+ setHighlightedSeats(prev => prev && prev === highlightedSeats ? [] : prev);
526
+ }
527
+ }, 400);
528
+ }
529
+ if (isHoveringOnSeat) {
530
+ setIsHoveringOnSeat(false);
531
+ }
532
+ },
533
+ mousemove: e => {
534
+ setMousePos({
535
+ x: e.containerPoint.x,
536
+ y: e.containerPoint.y
537
+ });
497
538
  }
498
539
  }
499
- // value={s}
500
- }, /*#__PURE__*/_react.default.createElement(_reactLeaflet.Tooltip, {
501
- className: "seatname-tooltip",
540
+ }, (0, _utils.isTouchScreen)() && /*#__PURE__*/_react.default.createElement(_reactLeaflet.Tooltip, {
541
+ className: "mobile-tooltip",
502
542
  direction: "top",
503
- offset: [0, height * 0.03 + -30]
504
- }, s.r + "-" + s.c), s.s === _utils.statuses.UNSOLD && hasSeatPrices ? /*#__PURE__*/_react.default.createElement(_reactLeaflet.Popup, {
543
+ offset: [0, height * 0.03 + -60]
544
+ }, "Tap again to select these seats"), s.s === _utils.statuses.UNSOLD && hasSeatPrices ? /*#__PURE__*/_react.default.createElement(_reactLeaflet.Popup, {
505
545
  className: "ticket-popup popup-".concat(s.sId)
506
546
  }, isSingleFlexi ? /*#__PURE__*/_react.default.createElement("div", {
507
547
  className: "single-flexi"
@@ -19,6 +19,7 @@ function PriceButton(_ref) {
19
19
  const [flexiOpen, setFlexiOpen] = (0, _react.useState)(false);
20
20
  const flexiRef = (0, _react.useRef)(null);
21
21
  const focusRef = (0, _react.useRef)(null);
22
+ const isAvailable = price.q === null || price.q > 0;
22
23
  const isFlexi = !!price.pMax && !!price.pMin && price.pMax > price.pMin;
23
24
  (0, _react.useEffect)(() => {
24
25
  if (flexiOpen) {
@@ -38,7 +39,7 @@ function PriceButton(_ref) {
38
39
  addToCart(price.p);
39
40
  }
40
41
  },
41
- disabled: price.is_available === false
42
+ disabled: !isAvailable
42
43
  }, /*#__PURE__*/_react.default.createElement("span", {
43
44
  className: "price"
44
45
  }, /*#__PURE__*/_react.default.createElement("span", {
@@ -47,7 +48,7 @@ function PriceButton(_ref) {
47
48
  className: "flexi-badge"
48
49
  }, "FLEXi")), /*#__PURE__*/_react.default.createElement("span", {
49
50
  className: "amount"
50
- }, isFlexi ? "".concat(_utils.NZDollar.format(price.pMin), " - ").concat(_utils.NZDollar.format(price.pMax)) : _utils.NZDollar.format(price.p))), price.is_available === false && /*#__PURE__*/_react.default.createElement("span", {
51
+ }, isFlexi ? "".concat(_utils.NZDollar.format(price.pMin), " - ").concat(_utils.NZDollar.format(price.pMax)) : _utils.NZDollar.format(price.p))), !isAvailable && /*#__PURE__*/_react.default.createElement("span", {
51
52
  className: "unavailable"
52
53
  }, "Allocation exhausted")), isFlexi && /*#__PURE__*/_react.default.createElement(_Flexi.default, {
53
54
  price: price,