iticket-seatingplan-dev 1.7.0 → 1.7.1

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.
@@ -13,10 +13,10 @@ function InvalidSeatsPopup(_ref) {
13
13
  onClose
14
14
  } = _ref;
15
15
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
16
- className: "pricing-popup-backdrop",
16
+ className: "seatingplan-dialog-backdrop",
17
17
  onClick: onClose
18
18
  }), /*#__PURE__*/_react.default.createElement("div", {
19
- className: "pricing-popup remove-multiple-seats-popup",
19
+ className: "seatingplan-dialog remove-multiple-seats-popup",
20
20
  role: "dialog",
21
21
  "aria-modal": "true"
22
22
  }, /*#__PURE__*/_react.default.createElement("div", {
@@ -35,7 +35,7 @@ function InvalidSeatsPopup(_ref) {
35
35
  height: "20px",
36
36
  width: "20px"
37
37
  })), /*#__PURE__*/_react.default.createElement("h3", null, "Seat selection")), /*#__PURE__*/_react.default.createElement("div", {
38
- className: "pricing-popup-content"
38
+ className: "seatingplan-dialog-content"
39
39
  }, /*#__PURE__*/_react.default.createElement("h4", {
40
40
  className: "quantity-heading"
41
41
  }, "The seats you've chosen aren't available. They may leave a single seat on its own, or there may not be enough seats in the row for your selection. Please select different seats to continue."), /*#__PURE__*/_react.default.createElement("div", {
@@ -66,6 +66,7 @@ function SeatMap(_ref) {
66
66
  const [isDragging, setIsDragging] = (0, _react.useState)(false);
67
67
  const [highlightedSeats, setHighlightedSeats] = (0, _react.useState)([]);
68
68
  const [greyedOutSeats, setGreyedOutSeats] = (0, _react.useState)([]);
69
+ const [clickedSeat, setClickedSeat] = (0, _react.useState)(null);
69
70
  const drawLayersRef = (0, _react.useRef)(null);
70
71
  const drawRef = (0, _react.useRef)(null);
71
72
  const popupRef = (0, _react.useRef)(null);
@@ -439,8 +440,12 @@ function SeatMap(_ref) {
439
440
  setRemoveMultipleSeatsPopupOpen(true);
440
441
  }
441
442
  } else if (highlightedSeats.length > 0 && highlightedSeats.length === desiredSeatQuantity) {
442
- setSelectedSeats([...highlightedSeats]);
443
- setPricingPopupOpen(true);
443
+ if ((0, _utils.isTouchScreen)() && clickedSeat !== s.ssId) {
444
+ setClickedSeat(s.ssId);
445
+ } else {
446
+ setSelectedSeats([...highlightedSeats]);
447
+ setPricingPopupOpen(true);
448
+ }
444
449
  } else if (greyedOutSeats.some(gs => gs.ssId === s.ssId)) {
445
450
  setInvalidSeatsPopupOpen(true);
446
451
  }
@@ -486,6 +491,9 @@ function SeatMap(_ref) {
486
491
  if (greyedOutSeats.length > 0) {
487
492
  setGreyedOutSeats([]);
488
493
  }
494
+ if (clickedSeat) {
495
+ setClickedSeat(null);
496
+ }
489
497
  }
490
498
  }
491
499
  // value={s}
@@ -73,10 +73,10 @@ function PricingPopup(_ref2) {
73
73
  const [seatGroupsToBook, setSeatGroupsToBook] = (0, _react.useState)(groupedSelectedSeats);
74
74
  const [singleSeatsToBook, setSingleSeatsToBook] = (0, _react.useState)(selectedSeatsWithPricing);
75
75
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
76
- className: "pricing-popup-backdrop",
76
+ className: "seatingplan-dialog-backdrop",
77
77
  onClick: onClose
78
78
  }), /*#__PURE__*/_react.default.createElement("div", {
79
- className: "pricing-popup",
79
+ className: "seatingplan-dialog",
80
80
  role: "dialog",
81
81
  "aria-modal": "true"
82
82
  }, /*#__PURE__*/_react.default.createElement("div", {
@@ -95,7 +95,7 @@ function PricingPopup(_ref2) {
95
95
  height: "20px",
96
96
  width: "20px"
97
97
  })), /*#__PURE__*/_react.default.createElement("h3", null, "Choose prices")), /*#__PURE__*/_react.default.createElement("div", {
98
- className: "pricing-popup-content"
98
+ className: "seatingplan-dialog-content"
99
99
  }, /*#__PURE__*/_react.default.createElement("div", {
100
100
  className: "seat-list"
101
101
  }, !isSingleSeats && groupedSelectedSeats ? Object.entries(seatGroupsToBook).map(_ref3 => {
@@ -14,10 +14,10 @@ function RemoveMultipleSeatsPopup(_ref) {
14
14
  onClose
15
15
  } = _ref;
16
16
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
17
- className: "pricing-popup-backdrop",
17
+ className: "seatingplan-dialog-backdrop",
18
18
  onClick: onClose
19
19
  }), /*#__PURE__*/_react.default.createElement("div", {
20
- className: "pricing-popup remove-multiple-seats-popup",
20
+ className: "seatingplan-dialog remove-multiple-seats-popup",
21
21
  role: "dialog",
22
22
  "aria-modal": "true"
23
23
  }, /*#__PURE__*/_react.default.createElement("div", {
@@ -36,7 +36,7 @@ function RemoveMultipleSeatsPopup(_ref) {
36
36
  height: "20px",
37
37
  width: "20px"
38
38
  })), /*#__PURE__*/_react.default.createElement("h3", null, "Remove from cart")), /*#__PURE__*/_react.default.createElement("div", {
39
- className: "pricing-popup-content"
39
+ className: "seatingplan-dialog-content"
40
40
  }, /*#__PURE__*/_react.default.createElement("h4", {
41
41
  className: "quantity-heading"
42
42
  }, "This will remove all adjacent seats from your cart. Are you sure you want to proceed?"), /*#__PURE__*/_react.default.createElement("div", {
@@ -37,10 +37,10 @@ function SelectQuantityPopup(_ref2) {
37
37
  } = _ref2;
38
38
  const [newQuantity, setNewQuantity] = (0, _react.useState)(quantity);
39
39
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
40
- className: "pricing-popup-backdrop",
40
+ className: "seatingplan-dialog-backdrop",
41
41
  onClick: onClose
42
42
  }), /*#__PURE__*/_react.default.createElement("div", {
43
- className: "pricing-popup",
43
+ className: "seatingplan-dialog",
44
44
  role: "dialog",
45
45
  "aria-modal": "true"
46
46
  }, /*#__PURE__*/_react.default.createElement("div", {
@@ -59,7 +59,7 @@ function SelectQuantityPopup(_ref2) {
59
59
  height: "20px",
60
60
  width: "20px"
61
61
  })), /*#__PURE__*/_react.default.createElement("h3", null, "Choose seats")), /*#__PURE__*/_react.default.createElement("div", {
62
- className: "pricing-popup-content"
62
+ className: "seatingplan-dialog-content"
63
63
  }, /*#__PURE__*/_react.default.createElement("h4", {
64
64
  className: "quantity-heading"
65
65
  }, "How many seats would you like to book?"), /*#__PURE__*/_react.default.createElement("div", {
@@ -1098,6 +1098,210 @@ svg.leaflet-image-layer.leaflet-interactive path {
1098
1098
  }
1099
1099
  }
1100
1100
 
1101
+ .seatingplan-dialog-backdrop {
1102
+ position: absolute;
1103
+ width: 100%;
1104
+ height: 100%;
1105
+ top: 0;
1106
+ left: 0;
1107
+ background-color: rgba(0, 0, 0, 0.4);
1108
+ z-index: 1001;
1109
+ animation: fade-in 400ms;
1110
+ }
1111
+
1112
+ .seatingplan-dialog-content {
1113
+ padding: 1rem;
1114
+ flex: 1;
1115
+ overflow-y: auto;
1116
+ }
1117
+
1118
+ .seatingplan-dialog {
1119
+ position: absolute;
1120
+ z-index: 1002;
1121
+ top: 50%;
1122
+ left: 50%;
1123
+ transform: translate(-50%, -50%);
1124
+ animation: fade-in 400ms;
1125
+ background-color: #fff;
1126
+ /* font-family: "Helvetica Neue", Arial, Helvetica, sans-serif; */
1127
+ font-family: inherit;
1128
+ color: #333;
1129
+ box-shadow: 0 3px 14px rgba(0, 0, 0, 0.4);
1130
+ border-radius: 12px;
1131
+ min-width: 20rem;
1132
+ max-height: 95%;
1133
+ display: flex;
1134
+ flex-direction: column;
1135
+ }
1136
+
1137
+ @media screen and (max-width: 600px) {
1138
+ .seatingplan-dialog {
1139
+ width: 100%;
1140
+ min-width: unset;
1141
+ }
1142
+ }
1143
+
1144
+ .seatingplan-dialog.remove-multiple-seats-popup {
1145
+ min-width: unset;
1146
+ max-width: 28rem;
1147
+ }
1148
+
1149
+ .seatingplan-dialog .popup-header {
1150
+ margin-top: 0;
1151
+ padding: 1rem;
1152
+ border-radius: 12px 12px 0px 0px;
1153
+ flex-direction: column;
1154
+ text-align: left;
1155
+ gap: 0.5rem;
1156
+ }
1157
+
1158
+ .seatingplan-dialog .popup-header .close-button {
1159
+ margin: -2px -2px 0px 0px;
1160
+ align-self: flex-end;
1161
+ }
1162
+
1163
+ .seatingplan-dialog h3,
1164
+ .seatingplan-dialog h4 {
1165
+ font-weight: bold;
1166
+ margin: 0;
1167
+ }
1168
+
1169
+ .seatingplan-dialog .quantity-heading {
1170
+ font-weight: normal;
1171
+ text-align: left;
1172
+ font-size: 0.875rem;
1173
+ margin-bottom: 8px;
1174
+ }
1175
+
1176
+ .seatingplan-dialog p {
1177
+ margin: 0;
1178
+ max-width: 30rem;
1179
+ }
1180
+
1181
+ .seatingplan-dialog .seat-names {
1182
+ font-size: 0.9rem;
1183
+ }
1184
+
1185
+ .seatingplan-dialog .seat-list {
1186
+ text-align: left;
1187
+ display: flex;
1188
+ flex-direction: column;
1189
+ gap: 1rem;
1190
+ }
1191
+
1192
+ .seatingplan-dialog .seat-group {
1193
+ display: flex;
1194
+ flex-direction: column;
1195
+ gap: 0.5rem;
1196
+ }
1197
+
1198
+ .seatingplan-dialog .seat-group-header {
1199
+ display: flex;
1200
+ justify-content: space-between;
1201
+ align-items: flex-end;
1202
+ gap: 1rem;
1203
+ font-size: 0.9rem;
1204
+ }
1205
+
1206
+ .seatingplan-dialog select {
1207
+ flex: 1;
1208
+ padding: 0.3rem 0.2rem;
1209
+ border: 1px solid #ccc;
1210
+ border-radius: 0.25rem;
1211
+ }
1212
+
1213
+ .seatingplan-dialog .buttons {
1214
+ display: flex;
1215
+ width: 100%;
1216
+ justify-content: space-between;
1217
+ gap: 1rem;
1218
+ margin-top: 1.2rem;
1219
+ }
1220
+
1221
+ .seatingplan-dialog .buttons.buttons-single {
1222
+ justify-content: center;
1223
+ }
1224
+
1225
+ .seatingplan-dialog .buttons button {
1226
+ display: block;
1227
+ background: transparent;
1228
+ min-width: 12rem;
1229
+ border-radius: 0.25rem;
1230
+ padding: 0.5rem;
1231
+ border: 1px solid #333;
1232
+ margin-bottom: 0.2rem;
1233
+ cursor: pointer;
1234
+ margin-bottom: 0;
1235
+ }
1236
+
1237
+ .seatingplan-dialog .buttons.buttons-single button {
1238
+ width: 100%;
1239
+ }
1240
+
1241
+ .seatingplan-dialog .buttons button.add-cart {
1242
+ background: var(--accent);
1243
+ color: white;
1244
+ font-weight: bold;
1245
+ border: none;
1246
+ }
1247
+
1248
+ .seatingplan-dialog .buttons button.add-cart:hover:not(:disabled) {
1249
+ background: var(--accent-light);
1250
+ color: var(--accent-dark);
1251
+ }
1252
+
1253
+ @media screen and (max-width: 600px) {
1254
+ .seatingplan-dialog .buttons button {
1255
+ min-width: 8rem;
1256
+ }
1257
+ }
1258
+
1259
+ .seatingplan-dialog .buttons button:disabled {
1260
+ cursor: default;
1261
+ color: #bdc3c7;
1262
+ border-color: #bdc3c7;
1263
+ }
1264
+
1265
+ .seatingplan-dialog .buttons button:hover:not(:disabled) {
1266
+ background: #ecf0f1;
1267
+ transition: 0.2s;
1268
+ }
1269
+
1270
+ .seatingplan-dialog .no-prices-available {
1271
+ font-size: 0.8rem;
1272
+ color: red;
1273
+ }
1274
+
1275
+ .seatingplan-dialog button.cancel {
1276
+ background: #dcdcdc;
1277
+ border: none;
1278
+ }
1279
+
1280
+ .seatingplan-dialog .price-select {
1281
+ display: flex;
1282
+ gap: 8px;
1283
+ }
1284
+
1285
+ .seatingplan-dialog .flexi-button {
1286
+ width: max-content;
1287
+ display: flex;
1288
+ align-items: center;
1289
+ gap: 4px;
1290
+ border-radius: 0.25rem;
1291
+ padding: 0.5rem;
1292
+ border: none;
1293
+ text-decoration: underline;
1294
+ background: transparent;
1295
+ cursor: pointer;
1296
+ animation: fade-in 200ms;
1297
+ font-weight: 600;
1298
+ transition: 0.2s;
1299
+ }
1300
+
1301
+ .flexi-button:hover {
1302
+ background: #ecf0f1;
1303
+ }
1304
+
1101
1305
  /* Printing */
1102
1306
 
1103
1307
  @media print {
@@ -1,209 +1,3 @@
1
- /* Popup to select prices */
2
-
3
- .pricing-popup-backdrop {
4
- position: absolute;
5
- width: 100%;
6
- height: 100%;
7
- top: 0;
8
- left: 0;
9
- background-color: rgba(0, 0, 0, 0.4);
10
- z-index: 1001;
11
- animation: fade-in 400ms;
12
- }
13
-
14
- .pricing-popup-content {
15
- padding: 1rem;
16
- flex: 1;
17
- overflow-y: auto;
18
- }
19
-
20
- .pricing-popup {
21
- position: absolute;
22
- z-index: 1002;
23
- top: 50%;
24
- left: 50%;
25
- transform: translate(-50%, -50%);
26
- animation: fade-in 400ms;
27
- background-color: #fff;
28
- /* font-family: "Helvetica Neue", Arial, Helvetica, sans-serif; */
29
- font-family: inherit;
30
- color: #333;
31
- box-shadow: 0 3px 14px rgba(0, 0, 0, 0.4);
32
- border-radius: 12px;
33
- min-width: 20rem;
34
- max-height: 95%;
35
- display: flex;
36
- flex-direction: column;
37
- }
38
-
39
- @media screen and (max-width: 600px) {
40
- .pricing-popup {
41
- width: 100%;
42
- min-width: unset;
43
- }
44
- }
45
-
46
- .pricing-popup.remove-multiple-seats-popup {
47
- min-width: unset;
48
- max-width: 28rem;
49
- }
50
-
51
- .pricing-popup .popup-header {
52
- margin-top: 0;
53
- padding: 1rem;
54
- border-radius: 12px 12px 0px 0px;
55
- flex-direction: column;
56
- text-align: left;
57
- gap: 0.5rem;
58
- }
59
-
60
- .pricing-popup .popup-header .close-button {
61
- margin: -2px -2px 0px 0px;
62
- align-self: flex-end;
63
- }
64
-
65
- .pricing-popup h3,
66
- .pricing-popup h4 {
67
- font-weight: bold;
68
- margin: 0;
69
- }
70
-
71
- .pricing-popup .quantity-heading {
72
- font-weight: normal;
73
- text-align: left;
74
- font-size: 0.875rem;
75
- margin-bottom: 8px;
76
- }
77
-
78
- .pricing-popup p {
79
- margin: 0;
80
- max-width: 30rem;
81
- }
82
-
83
- .pricing-popup .seat-names {
84
- font-size: 0.9rem;
85
- }
86
-
87
- .pricing-popup .seat-list {
88
- text-align: left;
89
- display: flex;
90
- flex-direction: column;
91
- gap: 1rem;
92
- }
93
-
94
- .pricing-popup .seat-group {
95
- display: flex;
96
- flex-direction: column;
97
- gap: 0.5rem;
98
- }
99
-
100
- .pricing-popup .seat-group-header {
101
- display: flex;
102
- justify-content: space-between;
103
- align-items: flex-end;
104
- gap: 1rem;
105
- font-size: 0.9rem;
106
- }
107
-
108
- .pricing-popup select {
109
- flex: 1;
110
- padding: 0.3rem 0.2rem;
111
- border: 1px solid #ccc;
112
- border-radius: 0.25rem;
113
- }
114
-
115
- .pricing-popup .buttons {
116
- display: flex;
117
- width: 100%;
118
- justify-content: space-between;
119
- gap: 1rem;
120
- margin-top: 1.2rem;
121
- }
122
-
123
- .pricing-popup .buttons.buttons-single {
124
- justify-content: center;
125
- }
126
-
127
- .pricing-popup .buttons button {
128
- display: block;
129
- background: transparent;
130
- min-width: 12rem;
131
- border-radius: 0.25rem;
132
- padding: 0.5rem;
133
- border: 1px solid #333;
134
- margin-bottom: 0.2rem;
135
- cursor: pointer;
136
- margin-bottom: 0;
137
- }
138
-
139
- .pricing-popup .buttons.buttons-single button {
140
- width: 100%;
141
- }
142
-
143
- .pricing-popup .buttons button.add-cart {
144
- background: var(--accent);
145
- color: white;
146
- font-weight: bold;
147
- border: none;
148
- }
149
-
150
- .pricing-popup .buttons button.add-cart:hover:not(:disabled) {
151
- background: var(--accent-light);
152
- color: var(--accent-dark);
153
- }
154
-
155
- @media screen and (max-width: 600px) {
156
- .pricing-popup .buttons button {
157
- min-width: 8rem;
158
- }
159
- }
160
-
161
- .pricing-popup .buttons button:disabled {
162
- cursor: default;
163
- color: #bdc3c7;
164
- border-color: #bdc3c7;
165
- }
166
-
167
- .pricing-popup .buttons button:hover:not(:disabled) {
168
- background: #ecf0f1;
169
- transition: 0.2s;
170
- }
171
-
172
- .pricing-popup .no-prices-available {
173
- font-size: 0.8rem;
174
- color: red;
175
- }
176
-
177
- .pricing-popup button.cancel {
178
- background: #dcdcdc;
179
- border: none;
180
- }
181
-
182
- .pricing-popup .price-select {
183
- display: flex;
184
- gap: 8px;
185
- }
186
-
187
- .pricing-popup .flexi-button {
188
- width: max-content;
189
- display: flex;
190
- align-items: center;
191
- gap: 4px;
192
- border-radius: 0.25rem;
193
- padding: 0.5rem;
194
- border: none;
195
- text-decoration: underline;
196
- background: transparent;
197
- cursor: pointer;
198
- animation: fade-in 200ms;
199
- font-weight: 600;
200
- transition: 0.2s;
201
- }
202
-
203
- .flexi-button:hover {
204
- background: #ecf0f1;
205
- }
206
-
207
1
  /* Button controls */
208
2
 
209
3
  .leaflet-draw.leaflet-control {
@@ -3,8 +3,24 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.getValidSeats = exports.getRowSection = exports.getInitialColor = exports.getAdjacentBookedSeats = exports.createsOrphan = exports.canSelectSingleSeatGivenOrphanRules = exports.calculateCenterOfMap = exports.NZDollar = void 0;
6
+ exports.isTouchScreen = exports.getValidSeats = exports.getRowSection = exports.getInitialColor = exports.getAdjacentBookedSeats = exports.createsOrphan = exports.canSelectSingleSeatGivenOrphanRules = exports.calculateCenterOfMap = exports.NZDollar = void 0;
7
7
  var _enums = require("./enums");
8
+ const isTouchScreen = () => {
9
+ let hasTouchScreen = false;
10
+ if (typeof window !== "undefined") {
11
+ if ("maxTouchPoints" in window.navigator) {
12
+ hasTouchScreen = window.navigator.maxTouchPoints > 0;
13
+ } else {
14
+ var _matchMedia;
15
+ const mQ = (_matchMedia = matchMedia) === null || _matchMedia === void 0 ? void 0 : _matchMedia("(pointer:coarse)");
16
+ if ((mQ === null || mQ === void 0 ? void 0 : mQ.media) === "(pointer:coarse)") {
17
+ hasTouchScreen = !!mQ.matches;
18
+ }
19
+ }
20
+ }
21
+ return hasTouchScreen;
22
+ };
23
+ exports.isTouchScreen = isTouchScreen;
8
24
  const getInitialColor = (s, price, disabled, selected, greyedOut) => {
9
25
  // selected state for multiselect
10
26
  if (selected) {
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "iticket-seatingplan-dev",
3
3
  "description": "Seating plan with FLEXi pricing",
4
4
  "author": "gedwyne",
5
- "version": "1.7.0",
5
+ "version": "1.7.1",
6
6
  "private": false,
7
7
  "keywords": [
8
8
  "iticket",