summit-registration-lite 2.0.2 → 2.0.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.
package/.editorconfig ADDED
@@ -0,0 +1,40 @@
1
+ # http://editorConfig.org
2
+
3
+ root = true
4
+
5
+ [*]
6
+ charset = utf-8
7
+ end_of_line = lf
8
+ indent_style = space
9
+ insert_final_newline = true
10
+ tab_width = 4
11
+ trim_trailing_whitespace = true
12
+
13
+ [{*.css,*.scss}]
14
+ indent_size = 2
15
+
16
+ [{*.js,*.jsx,*.tsx,*.ts,*.mjs}]
17
+ indent_size = 4
18
+
19
+ [*.json]
20
+ indent_size = 2
21
+
22
+ [*.md,*.mdx]
23
+ indent_size = 4
24
+ trim_trailing_whitespace = false
25
+
26
+ [*.mdx]
27
+ indent_size = 2
28
+ trim_trailing_whitespace = false
29
+
30
+ [.*rc]
31
+ indent_size = 2
32
+
33
+ [*.{yml,yaml}]
34
+ indent_size = 2
35
+
36
+ [Makefile]
37
+ indent_style = tab
38
+
39
+ [Dockerfile]
40
+ indent_size = 2
package/.nvmrc CHANGED
@@ -1 +1 @@
1
- v14.19.1
1
+ 14.19.1
package/.prettierrc ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "semi": true,
3
+ "tabWidth": 2,
4
+ "singleQuote": true,
5
+ "arrowParens": "avoid"
6
+ }
package/dist/index.css CHANGED
@@ -6,13 +6,13 @@
6
6
 
7
7
  .title___LksVm{font-weight:bold;cursor:pointer}.form___v5GIx{display:flex;flex-wrap:wrap;justify-content:space-between;margin:10px 0}.form___v5GIx div.fieldWrapper___Eoe61{width:48%;border-radius:5px;background-color:#e6f3ff;border:1px solid #3fa2f7;height:36px;padding:5px;display:flex;justify-content:space-between;align-items:center;margin-bottom:5px}.form___v5GIx div.fieldWrapper___Eoe61:first-of-type{width:100%}.form___v5GIx div.fieldWrapper___Eoe61 input{width:100%;background-color:transparent;border:none}.form___v5GIx div.fieldWrapper___Eoe61 input:focus-visible{outline:none}.form___v5GIx div.fieldWrapper___Eoe61 i{position:relative;padding-right:5px}.form___v5GIx div.fieldWrapper___Eoe61>div{width:100%;padding-left:5px}.form___v5GIx div.fieldWrapper___Eoe61>div:first-of-type{width:95%}.form___v5GIx input{width:48%;border-radius:5px;border:1px solid #3fa2f7;color:#3486cd;font-size:16px;background-color:#e6f3ff;height:36px;padding:5px;display:flex;justify-content:space-between;align-items:center;margin-bottom:5px;font-weight:bold}.form___v5GIx input::placeholder{color:#3486cd}
8
8
 
9
- .form___DoT3x{display:flex;flex-wrap:wrap;justify-content:space-between;margin:10px 0}.form___DoT3x div.fieldWrapper___wa1Ks{display:flex;width:48%;border-radius:5px;border:1px solid var(--color_primary);height:36px;padding:5px;display:flex;justify-content:space-between;align-items:center;margin-bottom:5px}.form___DoT3x div.fieldWrapper___wa1Ks:first-of-type{width:100%}.form___DoT3x div.fieldWrapper___wa1Ks:last-of-type{flex-direction:column}.form___DoT3x div.fieldWrapper___wa1Ks input{width:100%;background-color:transparent;border:none}.form___DoT3x div.fieldWrapper___wa1Ks input:focus-visible{outline:none}.form___DoT3x div.fieldWrapper___wa1Ks i{position:relative;padding-right:5px}.form___DoT3x div.fieldWrapper___wa1Ks>div{width:100%;padding-left:5px}.form___DoT3x div.fieldWrapper___wa1Ks>div:first-of-type{width:95%}.form___DoT3x div.fieldWrapper___wa1Ks span{display:inline-block;color:#e5424d;font-size:14px;align-self:flex-start}.form___DoT3x input{width:48%;border-radius:5px;color:#3486cd;font-size:16px;height:36px;padding:5px;display:flex;justify-content:space-between;align-items:center;margin-bottom:5px}.form___DoT3x input::placeholder{color:var(--color_text_input_hints);font-size:16px}
9
+ .form___DoT3x{display:flex;flex-wrap:wrap;justify-content:space-between;margin:10px 0}.form___DoT3x div.fieldWrapper___wa1Ks{display:flex;width:48%;border-radius:5px;border:1px solid var(--color_primary);height:36px;padding:5px;display:flex;justify-content:space-between;align-items:center;margin-bottom:5px}.form___DoT3x div.fieldWrapper___wa1Ks:first-of-type{width:100%}.form___DoT3x div.fieldWrapper___wa1Ks:last-of-type{flex-direction:column}.form___DoT3x div.fieldWrapper___wa1Ks input{width:100%;background-color:transparent;border:none;padding:0}.form___DoT3x div.fieldWrapper___wa1Ks input:focus-visible{outline:none}.form___DoT3x div.fieldWrapper___wa1Ks i{position:relative;padding-right:5px}.form___DoT3x div.fieldWrapper___wa1Ks>div{width:100%;padding-left:5px}.form___DoT3x div.fieldWrapper___wa1Ks>div:first-of-type{width:95%}.form___DoT3x div.fieldWrapper___wa1Ks span{display:inline-block;color:#e5424d;font-size:14px;align-self:flex-start}.form___DoT3x input{width:48%;border-radius:5px;color:#3486cd;font-size:16px;height:36px;padding:5px;display:flex;justify-content:space-between;align-items:center;margin-bottom:5px}.form___DoT3x input::placeholder{color:var(--color_text_input_hints);font-size:16px}
10
10
 
11
- .title___ECoNz{font-weight:bold;cursor:pointer;display:flex;justify-content:space-between}.title___ECoNz div{font-weight:normal}.form___lDFka{display:flex;flex-wrap:wrap;justify-content:space-between;margin:10px 0}.form___lDFka>div{width:48%}.form___lDFka>div input{width:100%;border-radius:5px;border:1px solid var(--color_primary);height:36px;padding:5px;display:flex;justify-content:space-between;align-items:center;font-size:15px}.form___lDFka>div input::placeholder{color:var(--color_text_input_hints)}.form___lDFka>div .readOnly___WRazF{opacity:0.6;cursor:default}.form___lDFka>div span{display:inline-block;color:#e5424d}.form___lDFka>div>:last-child{margin-bottom:5px}.form___lDFka .companies___kmGFB{width:48%}.form___lDFka .companies___kmGFB>div{position:relative;width:100%;border-radius:5px;display:flex;justify-content:space-between;align-items:center;font-size:15px}.form___lDFka .companies___kmGFB>div::placeholder{color:var(--color_text_input_hints)}.form___lDFka .companies___kmGFB>div>div{height:100%;width:100%}.form___lDFka .companies___kmGFB>div>div>div{height:36px;padding:0px;border:1px solid var(--color_primary)}.form___lDFka .companies___kmGFB>div>div>div>div{height:36px}.form___lDFka .companies___kmGFB>div input{padding:5px;border:1px solid var(--color_primary);padding-right:0px !important;background-color:transparent}.form___lDFka .companies___kmGFB>div i{right:10px !important}
11
+ .title___ECoNz{font-weight:bold;cursor:pointer;display:flex;justify-content:space-between}.title___ECoNz div{font-weight:normal}.form___lDFka{display:flex;flex-wrap:wrap;justify-content:space-between;margin:10px 0 0}.form___lDFka>div{width:48%}.form___lDFka>div input{width:100%;border-radius:5px;border:1px solid var(--color_primary);height:36px;padding:5px;display:flex;justify-content:space-between;align-items:center;font-size:15px}.form___lDFka>div input::placeholder{color:var(--color_text_input_hints)}.form___lDFka>div .readOnly___WRazF{opacity:0.6;cursor:default}.form___lDFka>div span{display:inline-block;color:#e5424d}.form___lDFka>div>:last-child{margin-bottom:5px}.form___lDFka .companies___kmGFB{width:48%}.form___lDFka .companies___kmGFB>div{position:relative;width:100%;border-radius:5px;display:flex;justify-content:space-between;align-items:center;font-size:15px}.form___lDFka .companies___kmGFB>div::placeholder{color:var(--color_text_input_hints)}.form___lDFka .companies___kmGFB>div>div{height:100%;width:100%}.form___lDFka .companies___kmGFB>div>div>div{height:36px;padding:0px;border:1px solid var(--color_primary)}.form___lDFka .companies___kmGFB>div>div>div>div{height:36px}.form___lDFka .companies___kmGFB>div input{padding:5px;border:1px solid var(--color_primary);padding-right:0px !important;background-color:transparent}.form___lDFka .companies___kmGFB>div i{right:10px !important}.moreInfo___cQYdZ{display:inline-block;margin-top:10px}.moreInfoTooltip___lslgT{max-width:280px}.formErrors___dQQMe{margin-top:10px}.formErrors___dQQMe div+div{margin-top:10px}
12
12
 
13
- .title___DNZyl{font-weight:bold;cursor:pointer;display:flex;justify-content:space-between}.summary___quWdZ{text-align:right}.crossOut___QZ7dy{text-decoration:line-through}.discount___sEK_Q{color:green}.promo___F8lPO{font-weight:bold;display:flex;justify-content:flex-end}.dropdown____HWg0{margin-top:5px}.inPersonDisclaimer___PXGTz{margin-top:15px}
13
+ .title___DNZyl{font-weight:bold;cursor:pointer;display:flex;justify-content:space-between}.summary___quWdZ{text-align:right}.crossOut___QZ7dy{text-decoration:line-through}.discount___sEK_Q{color:green}.promo___F8lPO{font-weight:bold;display:flex;justify-content:flex-end}.form___aoo7w{display:flex;gap:10px;margin-top:10px}.dropdown____HWg0{flex:1 1 auto}.quantity___SIEQZ{flex-shrink:0}.quantity___SIEQZ input,.quantity___SIEQZ button{height:36px;text-align:center;border:1px solid var(--color_primary)}.quantity___SIEQZ input{padding:0 8px;width:48px !important}.quantity___SIEQZ input,.quantity___SIEQZ input:read-only{color:inherit;background-color:#fff;border:1px solid var(--color_primary)}.quantity___SIEQZ button{display:flex;align-items:center}.quantity___SIEQZ button:disabled,.quantity___SIEQZ button:disabled:hover{opacity:0.65;background:#dedede;border-color:#bebebe}.soldOut___Hatfr{height:36px;padding:0 16px;line-height:34px;font-weight:700px;background:#dedede;border:solid 1px #bebebe;border-radius:5px;opacity:0.65;font-weight:700;flex-shrink:0}.moreInfo___LmwOe{display:inline-block;margin-top:10px}.moreInfoTooltip___nOBf1{max-width:280px}.inPersonDisclaimer___PXGTz{margin-top:15px}
14
14
 
15
- .placeholder___pcdCn{border-radius:5px;width:100%;border:1px solid var(--color_primary);background-color:var(--color_primary50);padding:5px;cursor:pointer;display:flex;justify-content:space-between;align-items:center;margin:10px 0}.placeholder___pcdCn i{padding:2px 5px;border-left:1px solid var(--color_primary)}.inPersonDisclaimer___z_DzO{padding:4px}.dropdown___mfbPG{margin-top:10px;border-radius:5px;width:100%;border:1px solid var(--color_primary);cursor:pointer}.dropdown___mfbPG div{padding:5px}.dropdown___mfbPG div:hover{background-color:var(--color_primary);color:#fff}
15
+ .placeholder___pcdCn{border-radius:5px;width:100%;border:1px solid var(--color_primary);background-color:var(--color_primary50);padding:5px;cursor:pointer;display:flex;justify-content:space-between;align-items:center;height:36px}.placeholder___pcdCn i{padding:2px 5px;border-left:1px solid var(--color_primary)}.inPersonDisclaimer___z_DzO{padding:4px}.dropdown___mfbPG{margin-top:10px;border-radius:5px;width:100%;border:1px solid var(--color_primary);cursor:pointer}.dropdown___mfbPG div{padding:5px}.dropdown___mfbPG div:hover{background-color:var(--color_primary);color:#fff}.soldOut___rBLC0,.soldOut___rBLC0:hover,.soldOut___rBLC0:focus{color:inherit !important;background-color:#dedede !important;opacity:0.65;cursor:not-allowed}
16
16
 
17
17
  .button___MZBIY{background-color:var(--color_secondary_contrast) !important;color:#fff !important;border:none !important;font-weight:bold !important;font-size:1em !important;cursor:pointer !important}.button___MZBIY[disabled]{background-color:var(--color_secondary_contrast) !important}.button___MZBIY:hover{color:#fff !important}.button___MZBIY:active,.button___MZBIY:focus{color:#fff !important}.outerWrapper___XRnaq{padding:10px 0px 10px 10px;margin:10px}.outerWrapper___XRnaq .innerWrapper___LFsOH{display:flex;justify-content:space-between;align-items:center}.outerWrapper___XRnaq .innerWrapper___LFsOH span{font-size:14px}.outerWrapper___XRnaq .innerWrapper___LFsOH .registration___jdf6T{cursor:pointer;color:var(--color_primary);text-decoration:underline}.outerWrapper___XRnaq .innerWrapper___LFsOH .actions___Gsf0y{display:flex}.outerWrapper___XRnaq .innerWrapper___LFsOH .actions___Gsf0y button{margin-left:10px}
18
18
 
@@ -20,5 +20,5 @@
20
20
 
21
21
  .passwordlessWrapper___BRQ_s{height:400px;display:flex;justify-content:center;align-items:center;flex-direction:column}.passwordlessWrapper___BRQ_s .innerWrapper___nRLDi{text-align:center;font-weight:bold;height:100%;width:300px;display:flex;flex-direction:column;justify-content:center}.passwordlessWrapper___BRQ_s .innerWrapper___nRLDi .digits___Vu5iy{margin-top:15px;display:inline-block}.passwordlessWrapper___BRQ_s .innerWrapper___nRLDi .codeInput___LnTZe{margin-top:20px;display:flex;justify-content:center}.passwordlessWrapper___BRQ_s .innerWrapper___nRLDi .codeInput___LnTZe input{height:56px;width:56px;font-size:42px;background-color:var(--color_primary50);border:1px solid var(--color_primary);border-radius:5px;padding:5px;display:inline-flex;text-transform:uppercase;text-align:center;margin:0 5px}.passwordlessWrapper___BRQ_s .innerWrapper___nRLDi .error___wZflZ{margin-top:10px;color:#e5424d;font-size:14px}.passwordlessWrapper___BRQ_s .innerWrapper___nRLDi .verify___IBgMl{margin-top:20px}.passwordlessWrapper___BRQ_s .innerWrapper___nRLDi .verify___IBgMl .button___nBhtQ{padding:10px 30px;font-weight:normal;justify-content:center;margin:5px 0;border-radius:5px;cursor:pointer;background-color:var(--color_secondary_contrast);color:#FFFFFF;width:100%;font-size:1em}.passwordlessWrapper___BRQ_s .innerWrapper___nRLDi .verify___IBgMl .link___f6fDT{color:var(--color_primary);text-decoration:underline;cursor:pointer}.passwordlessWrapper___BRQ_s .resend___Nma1U{margin:auto 0 0 0;font-weight:normal;font-size:14px}.passwordlessWrapper___BRQ_s .resend___Nma1U span{color:var(--color_primary);text-decoration:underline;cursor:pointer}
22
22
 
23
- .wrapper___wkhQp{height:250px;display:flex;flex-direction:column;align-items:center;justify-content:center;margin:15px 0;padding:15px 0;border-radius:5px;border:1px solid lightgray;text-align:center}.wrapper___wkhQp .circle___EPP1b{margin-bottom:30px;background-color:var(--color_primary50);border-radius:50px;border:1px solid var(--color_primary);padding:10px}.wrapper___wkhQp .circle___EPP1b i{font-size:36px;color:var(--color_primary)}.wrapper___wkhQp .complete___m8wZz{font-weight:bold;font-size:20px}.wrapper___wkhQp a{color:var(--color_primary);text-decoration:underline}
23
+ .ticketOwnedWrapper___nhkDY{margin:10px}.alert___c49oP{margin:0 !important}
24
24
 
package/dist/index.js CHANGED
@@ -81,8 +81,6 @@ const storage_namespaceObject = require("redux-persist/es/storage");
81
81
  var storage_default = /*#__PURE__*/__webpack_require__.n(storage_namespaceObject);
82
82
  ;// CONCATENATED MODULE: external "openstack-uicore-foundation/lib/utils/actions"
83
83
  const actions_namespaceObject = require("openstack-uicore-foundation/lib/utils/actions");
84
- ;// CONCATENATED MODULE: external "openstack-uicore-foundation/lib/utils/methods"
85
- const methods_namespaceObject = require("openstack-uicore-foundation/lib/utils/methods");
86
84
  ;// CONCATENATED MODULE: external "sweetalert2"
87
85
  const external_sweetalert2_namespaceObject = require("sweetalert2");
88
86
  var external_sweetalert2_default = /*#__PURE__*/__webpack_require__.n(external_sweetalert2_namespaceObject);
@@ -136,8 +134,8 @@ const loadSession = settings => dispatch => {
136
134
  /* TICKETS */
137
135
 
138
136
  /*********************************************************************************/
139
- // api/v1/summits/{id}/ticket-types
140
- // api/v1/summits/{id}/tax-types
137
+ // api/v1/summits/{id}/ticket-types
138
+ // api/v1/summits/{id}/tax-types
141
139
 
142
140
  const getTicketTypes = summitId => async (dispatch, getState, {
143
141
  apiBaseUrl,
@@ -150,7 +148,7 @@ const getTicketTypes = summitId => async (dispatch, getState, {
150
148
  access_token: accessToken
151
149
  };
152
150
  dispatch(startWidgetLoading());
153
- return (0,actions_namespaceObject.getRequest)(null, (0,actions_namespaceObject.createAction)(GET_TICKET_TYPES), `${apiBaseUrl}/api/v1/summits/${summitId}/ticket-types`, methods_namespaceObject.authErrorHandler)(params)(dispatch).then(() => {
151
+ return (0,actions_namespaceObject.getRequest)(null, (0,actions_namespaceObject.createAction)(GET_TICKET_TYPES), `${apiBaseUrl}/api/v1/summits/${summitId}/ticket-types`, actions_namespaceObject.authErrorHandler)(params)(dispatch).then(() => {
154
152
  dispatch(stopWidgetLoading());
155
153
  });
156
154
  } catch (e) {
@@ -167,14 +165,20 @@ const getTaxesTypes = summitId => async (dispatch, getState, {
167
165
  access_token: accessToken
168
166
  };
169
167
  dispatch(startWidgetLoading());
170
- return (0,actions_namespaceObject.getRequest)(null, (0,actions_namespaceObject.createAction)(GET_TAX_TYPES), `${apiBaseUrl}/api/v1/summits/${summitId}/tax-types`, methods_namespaceObject.authErrorHandler)(params)(dispatch).then(() => {
168
+ return (0,actions_namespaceObject.getRequest)(null, (0,actions_namespaceObject.createAction)(GET_TAX_TYPES), `${apiBaseUrl}/api/v1/summits/${summitId}/tax-types`, actions_namespaceObject.authErrorHandler)(params)(dispatch).then(() => {
171
169
  dispatch(stopWidgetLoading());
172
170
  });
173
171
  } catch (e) {
174
172
  return Promise.reject();
175
173
  }
176
174
  };
177
- const reserveTicket = (personalInformation, ticket) => async (dispatch, getState, {
175
+ const reserveTicket = ({
176
+ personalInformation,
177
+ ticket,
178
+ ticketQuantity
179
+ }, {
180
+ onError
181
+ }) => async (dispatch, getState, {
178
182
  apiBaseUrl,
179
183
  getAccessToken
180
184
  }) => {
@@ -194,24 +198,31 @@ const reserveTicket = (personalInformation, ticket) => async (dispatch, getState
194
198
  } = personalInformation;
195
199
  dispatch(startWidgetLoading());
196
200
  const access_token = await getAccessToken();
201
+ const tickets = [...Array(ticketQuantity)].map(() => ({
202
+ type_id: ticket.id,
203
+ promo_code: promoCode || null,
204
+ attendee_first_name: firstName,
205
+ attendee_last_name: lastName,
206
+ attendee_email: email
207
+ }));
197
208
  let params = {
198
209
  access_token,
199
210
  expand: 'tickets,tickets.owner,tickets.ticket_type,tickets.ticket_type.taxes'
200
211
  };
201
- let normalizedEntity = normalizeReservation({
212
+ const normalizedEntity = normalizeReservation({
202
213
  owner_email: email,
203
214
  owner_first_name: firstName,
204
215
  owner_last_name: lastName,
205
216
  owner_company: company,
206
- tickets: [{
207
- type_id: ticket.id,
208
- promo_code: promoCode || null,
209
- attendee_first_name: firstName,
210
- attendee_last_name: lastName,
211
- attendee_email: email
212
- }]
217
+ tickets
213
218
  });
214
- return (0,actions_namespaceObject.postRequest)((0,actions_namespaceObject.createAction)(CREATE_RESERVATION), (0,actions_namespaceObject.createAction)(CREATE_RESERVATION_SUCCESS), `${apiBaseUrl}/api/v1/summits/${summitId}/orders/reserve`, normalizedEntity, methods_namespaceObject.authErrorHandler // entity
219
+
220
+ const errorHandler = (err, res) => (dispatch, state) => {
221
+ if (res && res.statusCode === 412 && onError) return onError(err, res);
222
+ return (0,actions_namespaceObject.authErrorHandler)(err, res);
223
+ };
224
+
225
+ return (0,actions_namespaceObject.postRequest)((0,actions_namespaceObject.createAction)(CREATE_RESERVATION), (0,actions_namespaceObject.createAction)(CREATE_RESERVATION_SUCCESS), `${apiBaseUrl}/api/v1/summits/${summitId}/orders/reserve`, normalizedEntity, errorHandler // entity
215
226
  )(params)(dispatch).then(payload => {
216
227
  dispatch(stopWidgetLoading());
217
228
  payload.response.promo_code = promoCode || null;
@@ -249,7 +260,7 @@ const removeReservedTicket = () => async (dispatch, getState, {
249
260
  expand: 'tickets,tickets.owner'
250
261
  };
251
262
  dispatch(startWidgetLoading());
252
- return (0,actions_namespaceObject.deleteRequest)((0,actions_namespaceObject.createAction)(DELETE_RESERVATION), (0,actions_namespaceObject.createAction)(DELETE_RESERVATION_SUCCESS), `${apiBaseUrl}/api/v1/summits/${summitId}/orders/${hash}`, {}, methods_namespaceObject.authErrorHandler // entity
263
+ return (0,actions_namespaceObject.deleteRequest)((0,actions_namespaceObject.createAction)(DELETE_RESERVATION), (0,actions_namespaceObject.createAction)(DELETE_RESERVATION_SUCCESS), `${apiBaseUrl}/api/v1/summits/${summitId}/orders/${hash}`, {}, actions_namespaceObject.authErrorHandler // entity
253
264
  )(params)(dispatch).then(payload => {
254
265
  dispatch(stopWidgetLoading());
255
266
  dispatch(changeStep(1));
@@ -301,13 +312,13 @@ const payTicket = (token = null, stripe = null, zipCode = null) => async (dispat
301
312
  }
302
313
  }).then(result => {
303
314
  if (result.error) {
304
- // Reserve error.message in your UI.
315
+ // Reserve error.message in your UI.
305
316
  external_sweetalert2_default().fire(result.error.message, "Please retry purchase.", "warning");
306
317
  dispatch(changeStep(1));
307
318
  dispatch(removeReservedTicket());
308
319
  dispatch(stopWidgetLoading());
309
320
  } else {
310
- return (0,actions_namespaceObject.putRequest)(null, (0,actions_namespaceObject.createAction)(PAY_RESERVATION), `${apiBaseUrl}/api/v1/summits/${summitId}/orders/${reservation.hash}/checkout`, normalizedEntity, methods_namespaceObject.authErrorHandler // entity
321
+ return (0,actions_namespaceObject.putRequest)(null, (0,actions_namespaceObject.createAction)(PAY_RESERVATION), `${apiBaseUrl}/api/v1/summits/${summitId}/orders/${reservation.hash}/checkout`, normalizedEntity, actions_namespaceObject.authErrorHandler // entity
311
322
  )(params)(dispatch).then(payload => {
312
323
  dispatch(stopWidgetLoading());
313
324
  dispatch((0,actions_namespaceObject.createAction)(CLEAR_RESERVATION)({}));
@@ -326,7 +337,7 @@ const payTicket = (token = null, stripe = null, zipCode = null) => async (dispat
326
337
  });
327
338
  } else {
328
339
  // FREE TICKET
329
- return (0,actions_namespaceObject.putRequest)(null, (0,actions_namespaceObject.createAction)(PAY_RESERVATION), `${apiBaseUrl}/api/v1/summits/${summitId}/orders/${reservation.hash}/checkout`, normalizedEntity, methods_namespaceObject.authErrorHandler // entity
340
+ return (0,actions_namespaceObject.putRequest)(null, (0,actions_namespaceObject.createAction)(PAY_RESERVATION), `${apiBaseUrl}/api/v1/summits/${summitId}/orders/${reservation.hash}/checkout`, normalizedEntity, actions_namespaceObject.authErrorHandler // entity
330
341
  )(params)(dispatch).then(payload => {
331
342
  dispatch(stopWidgetLoading());
332
343
  dispatch((0,actions_namespaceObject.createAction)(CLEAR_RESERVATION)({}));
@@ -973,14 +984,24 @@ const PaymentComponent = ({
973
984
  };
974
985
 
975
986
  /* harmony default export */ const payment = (PaymentComponent);
976
- ;// CONCATENATED MODULE: external "openstack-uicore-foundation/lib/components/inputs/registration-company-input"
977
- const registration_company_input_namespaceObject = require("openstack-uicore-foundation/lib/components/inputs/registration-company-input");
978
- var registration_company_input_default = /*#__PURE__*/__webpack_require__.n(registration_company_input_namespaceObject);
987
+ ;// CONCATENATED MODULE: external "openstack-uicore-foundation/lib/components"
988
+ const components_namespaceObject = require("openstack-uicore-foundation/lib/components");
979
989
  ;// CONCATENATED MODULE: external "react-hook-form"
980
990
  const external_react_hook_form_namespaceObject = require("react-hook-form");
991
+ ;// CONCATENATED MODULE: external "react-tooltip"
992
+ const external_react_tooltip_namespaceObject = require("react-tooltip");
993
+ var external_react_tooltip_default = /*#__PURE__*/__webpack_require__.n(external_react_tooltip_namespaceObject);
994
+ ;// CONCATENATED MODULE: ./src/helpers/capitalizeFirstLetter.js
995
+ const capitalizeFirstLetter = string => string.charAt(0).toUpperCase() + string.slice(1);
996
+ ;// CONCATENATED MODULE: ./src/helpers/formatErrorMessage.js
997
+
998
+ const formatErrorMessage = string => {
999
+ const errorMessage = capitalizeFirstLetter(string);
1000
+ return `${errorMessage}${errorMessage.endsWith('.') ? '' : '.'}`;
1001
+ };
981
1002
  ;// CONCATENATED MODULE: ./src/components/personal-information/index.module.scss
982
1003
  // extracted by mini-css-extract-plugin
983
- /* harmony default export */ const personal_information_index_module = ({"title":"title___ECoNz","form":"form___lDFka","readOnly":"readOnly___WRazF","companies":"companies___kmGFB"});
1004
+ /* harmony default export */ const personal_information_index_module = ({"title":"title___ECoNz","form":"form___lDFka","readOnly":"readOnly___WRazF","companies":"companies___kmGFB","moreInfo":"moreInfo___cQYdZ","moreInfoTooltip":"moreInfoTooltip___lslgT","formErrors":"formErrors___dQQMe"});
984
1005
  ;// CONCATENATED MODULE: ./src/components/personal-information/index.js
985
1006
  function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
986
1007
 
@@ -1009,13 +1030,17 @@ function personal_information_defineProperty(obj, key, value) { if (key in obj)
1009
1030
 
1010
1031
 
1011
1032
 
1033
+
1034
+
1035
+
1012
1036
  const PersonalInfoComponent = ({
1013
1037
  isActive,
1014
1038
  changeForm,
1015
1039
  reservation,
1016
1040
  userProfile,
1017
1041
  summitId,
1018
- handleCompanyError
1042
+ handleCompanyError,
1043
+ formErrors
1019
1044
  }) => {
1020
1045
  var _errors$email, _errors$email2;
1021
1046
 
@@ -1082,8 +1107,7 @@ const PersonalInfoComponent = ({
1082
1107
  },
1083
1108
  to: {
1084
1109
  opacity: 1,
1085
- height: isActive ? height + 10 : 0,
1086
- marginBottom: isActive ? 5 : 0
1110
+ height: isActive ? height + 10 : 0
1087
1111
  }
1088
1112
  });
1089
1113
  return /*#__PURE__*/external_react_default().createElement("div", {
@@ -1144,7 +1168,7 @@ const PersonalInfoComponent = ({
1144
1168
  "data-testid": "email-error-invalid"
1145
1169
  }, "The email is invalid")), /*#__PURE__*/external_react_default().createElement("div", {
1146
1170
  className: personal_information_index_module.companies
1147
- }, /*#__PURE__*/external_react_default().createElement((registration_company_input_default()), {
1171
+ }, /*#__PURE__*/external_react_default().createElement(components_namespaceObject.RegistrationCompanyInput, {
1148
1172
  id: "company",
1149
1173
  summitId: summitId,
1150
1174
  onChange: onCompanyChange,
@@ -1155,7 +1179,22 @@ const PersonalInfoComponent = ({
1155
1179
  }, "This field is required")), /*#__PURE__*/external_react_default().createElement("div", null, /*#__PURE__*/external_react_default().createElement("input", _extends({
1156
1180
  type: "text",
1157
1181
  placeholder: "Promo Code"
1158
- }, register("promoCode"))))))))));
1182
+ }, register("promoCode"))))), /*#__PURE__*/external_react_default().createElement("a", {
1183
+ className: personal_information_index_module.moreInfo,
1184
+ "data-tip": true,
1185
+ "data-for": "promo-code-info"
1186
+ }, /*#__PURE__*/external_react_default().createElement("i", {
1187
+ className: "glyphicon glyphicon-info-sign",
1188
+ "aria-hidden": "true"
1189
+ }), ` `, "Have multiple promo codes?"), /*#__PURE__*/external_react_default().createElement((external_react_tooltip_default()), {
1190
+ id: "promo-code-info"
1191
+ }, /*#__PURE__*/external_react_default().createElement("div", {
1192
+ className: personal_information_index_module.moreInfoTooltip
1193
+ }, "In order to use multiple promo codes, you may place a new registration order with the new promo code after you complete this order. This promo code will be applied to all tickets in this order.")), formErrors.length > 0 && /*#__PURE__*/external_react_default().createElement("div", {
1194
+ className: `${personal_information_index_module.formErrors} alert alert-danger`
1195
+ }, formErrors.map((error, index) => /*#__PURE__*/external_react_default().createElement("div", {
1196
+ key: index
1197
+ }, formatErrorMessage(error)))))))));
1159
1198
  };
1160
1199
 
1161
1200
  /* harmony default export */ const personal_information = (PersonalInfoComponent);
@@ -1164,10 +1203,12 @@ const raw_html_namespaceObject = require("openstack-uicore-foundation/lib/compon
1164
1203
  var raw_html_default = /*#__PURE__*/__webpack_require__.n(raw_html_namespaceObject);
1165
1204
  ;// CONCATENATED MODULE: ./src/components/ticket-type/index.module.scss
1166
1205
  // extracted by mini-css-extract-plugin
1167
- /* harmony default export */ const ticket_type_index_module = ({"title":"title___DNZyl","summary":"summary___quWdZ","crossOut":"crossOut___QZ7dy","discount":"discount___sEK_Q","promo":"promo___F8lPO","dropdown":"dropdown____HWg0","inPersonDisclaimer":"inPersonDisclaimer___PXGTz"});
1206
+ /* harmony default export */ const ticket_type_index_module = ({"title":"title___DNZyl","summary":"summary___quWdZ","crossOut":"crossOut___QZ7dy","discount":"discount___sEK_Q","promo":"promo___F8lPO","form":"form___aoo7w","dropdown":"dropdown____HWg0","quantity":"quantity___SIEQZ","soldOut":"soldOut___Hatfr","moreInfo":"moreInfo___LmwOe","moreInfoTooltip":"moreInfoTooltip___nOBf1","inPersonDisclaimer":"inPersonDisclaimer___PXGTz"});
1207
+ ;// CONCATENATED MODULE: ./src/helpers/getTicketMaxQuantity.js
1208
+ const getTicketMaxQuantity = ticket => ticket ? Math.min((ticket.quantity_2_sell || Number.MAX_SAFE_INTEGER) - ticket.quantity_sold, ticket.max_quantity_per_order || Number.MAX_SAFE_INTEGER) : 0;
1168
1209
  ;// CONCATENATED MODULE: ./src/components/ticket-dropdown/index.module.scss
1169
1210
  // extracted by mini-css-extract-plugin
1170
- /* harmony default export */ const ticket_dropdown_index_module = ({"placeholder":"placeholder___pcdCn","inPersonDisclaimer":"inPersonDisclaimer___z_DzO","dropdown":"dropdown___mfbPG"});
1211
+ /* harmony default export */ const ticket_dropdown_index_module = ({"placeholder":"placeholder___pcdCn","inPersonDisclaimer":"inPersonDisclaimer___z_DzO","dropdown":"dropdown___mfbPG","soldOut":"soldOut___rBLC0"});
1171
1212
  ;// CONCATENATED MODULE: ./src/components/ticket-dropdown/index.js
1172
1213
  /**
1173
1214
  * Copyright 2020 OpenStack Foundation
@@ -1185,6 +1226,7 @@ var raw_html_default = /*#__PURE__*/__webpack_require__.n(raw_html_namespaceObje
1185
1226
 
1186
1227
 
1187
1228
 
1229
+
1188
1230
  const TicketDropdownComponent = ({
1189
1231
  selectedTicket,
1190
1232
  ticketTypes,
@@ -1217,16 +1259,52 @@ const TicketDropdownComponent = ({
1217
1259
  className: ticket_dropdown_index_module.dropdown,
1218
1260
  "data-testid": "ticket-list"
1219
1261
  }, ticketTypes.map(t => {
1220
- if (t.quantity_2_sell - t.quantity_sold > 0 && (t.sales_start_date === null && t.sales_end_date === null || now_utc >= t.sales_start_date && now_utc <= t.sales_end_date)) {
1262
+ const maxQuantity = getTicketMaxQuantity(t);
1263
+ const isTicketSoldOut = maxQuantity < 1;
1264
+
1265
+ if (t.sales_start_date === null && t.sales_end_date === null || now_utc >= t.sales_start_date && now_utc <= t.sales_end_date) {
1221
1266
  return /*#__PURE__*/external_react_default().createElement("div", {
1222
1267
  key: t.id,
1223
- onClick: () => ticketSelect(t)
1224
- }, `${t.name} - $${t.cost} ${t.currency}`);
1268
+ className: isTicketSoldOut ? ticket_dropdown_index_module.soldOut : '',
1269
+ onClick: () => {
1270
+ if (isTicketSoldOut) return;
1271
+ ticketSelect(t);
1272
+ }
1273
+ }, t.name, " -", ` `, !isTicketSoldOut && /*#__PURE__*/external_react_default().createElement((external_react_default()).Fragment, null, "$", t.cost, " ", t.currency), isTicketSoldOut && /*#__PURE__*/external_react_default().createElement((external_react_default()).Fragment, null, "Sold Out"));
1225
1274
  }
1226
1275
  })));
1227
1276
  };
1228
1277
 
1229
1278
  /* harmony default export */ const ticket_dropdown = (TicketDropdownComponent);
1279
+ ;// CONCATENATED MODULE: ./src/helpers/formatCurrency.js
1280
+ const _excluded = ["locale"];
1281
+
1282
+ function formatCurrency_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
1283
+
1284
+ function formatCurrency_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? formatCurrency_ownKeys(Object(source), !0).forEach(function (key) { formatCurrency_defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : formatCurrency_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
1285
+
1286
+ function formatCurrency_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
1287
+
1288
+ function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
1289
+
1290
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
1291
+
1292
+ const formatCurrency = (value, _ref) => {
1293
+ let {
1294
+ locale = 'en-US'
1295
+ } = _ref,
1296
+ options = _objectWithoutProperties(_ref, _excluded);
1297
+
1298
+ const defaultOptions = {
1299
+ currency: 'USD',
1300
+ minimumFractionDigits: 0,
1301
+ maximumFractionDigits: 0
1302
+ };
1303
+ const formatter = new Intl.NumberFormat(locale, formatCurrency_objectSpread(formatCurrency_objectSpread({
1304
+ style: 'currency'
1305
+ }, defaultOptions), options));
1306
+ return formatter.format(value);
1307
+ };
1230
1308
  ;// CONCATENATED MODULE: ./src/components/ticket-type/index.js
1231
1309
  function ticket_type_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
1232
1310
 
@@ -1254,15 +1332,20 @@ function ticket_type_defineProperty(obj, key, value) { if (key in obj) { Object.
1254
1332
 
1255
1333
 
1256
1334
 
1335
+
1336
+
1337
+
1257
1338
  const TicketTypeComponent = ({
1258
1339
  ticketTypes,
1259
- taxTypes,
1260
1340
  isActive,
1261
1341
  changeForm,
1262
1342
  reservation,
1263
1343
  inPersonDisclaimer
1264
1344
  }) => {
1265
1345
  const [ticket, setTicket] = (0,external_react_namespaceObject.useState)(null);
1346
+ const [quantity, setQuantity] = (0,external_react_namespaceObject.useState)(1);
1347
+ const minQuantity = 1;
1348
+ const maxQuantity = getTicketMaxQuantity(ticket);
1266
1349
  const [ref, {
1267
1350
  height
1268
1351
  }] = (0,external_react_use_namespaceObject.useMeasure)();
@@ -1276,8 +1359,7 @@ const TicketTypeComponent = ({
1276
1359
  },
1277
1360
  to: {
1278
1361
  opacity: 1,
1279
- height: isActive ? height + 10 : 0,
1280
- marginBottom: isActive ? 5 : 0
1362
+ height: isActive ? height + 10 : 0
1281
1363
  }
1282
1364
  });
1283
1365
  (0,external_react_namespaceObject.useEffect)(() => {
@@ -1288,39 +1370,97 @@ const TicketTypeComponent = ({
1288
1370
  }
1289
1371
  }, []);
1290
1372
  (0,external_react_namespaceObject.useEffect)(() => {
1291
- changeForm(ticket);
1292
- }, [ticket]);
1373
+ changeForm({
1374
+ ticketType: ticket,
1375
+ ticketQuantity: quantity
1376
+ });
1377
+ }, [ticket, quantity]);
1293
1378
 
1294
- const ticketSelect = t => {
1379
+ const handleTicketChange = t => {
1295
1380
  setTicket(t);
1381
+ setQuantity(minQuantity);
1296
1382
  };
1297
1383
 
1384
+ const incrementQuantity = () => setQuantity(quantity + 1);
1385
+
1386
+ const decrementQuantity = () => setQuantity(quantity - 1);
1387
+
1298
1388
  return /*#__PURE__*/external_react_default().createElement("div", {
1299
1389
  className: `${ticket_type_index_module.outerWrapper} step-wrapper`
1300
1390
  }, /*#__PURE__*/external_react_default().createElement((external_react_default()).Fragment, null, /*#__PURE__*/external_react_default().createElement("div", {
1301
- className: `${ticket_type_index_module.innerWrapper}`
1391
+ className: ticket_type_index_module.innerWrapper
1302
1392
  }, /*#__PURE__*/external_react_default().createElement("div", {
1303
1393
  className: ticket_type_index_module.title
1304
- }, /*#__PURE__*/external_react_default().createElement("span", null, "Ticket "), /*#__PURE__*/external_react_default().createElement("div", {
1394
+ }, /*#__PURE__*/external_react_default().createElement("span", null, "Ticket"), /*#__PURE__*/external_react_default().createElement("div", {
1305
1395
  className: ticket_type_index_module.summary
1306
- }, !isActive && (reservation === null || reservation === void 0 ? void 0 : reservation.discount_amount) > 0 ? /*#__PURE__*/external_react_default().createElement("span", null, ticket && /*#__PURE__*/external_react_default().createElement((external_react_default()).Fragment, null, ticket.name, " \xA0", /*#__PURE__*/external_react_default().createElement("span", {
1396
+ }, /*#__PURE__*/external_react_default().createElement("span", null, ticket && /*#__PURE__*/external_react_default().createElement((external_react_default()).Fragment, null, ticket.name, ` `, "(", quantity, "):", ` `, !isActive && (reservation === null || reservation === void 0 ? void 0 : reservation.discount_amount) > 0 && /*#__PURE__*/external_react_default().createElement((external_react_default()).Fragment, null, /*#__PURE__*/external_react_default().createElement("span", {
1307
1397
  className: ticket_type_index_module.crossOut
1308
- }, "$", ticket.cost, " \xA0"), /*#__PURE__*/external_react_default().createElement("span", {
1398
+ }, formatCurrency(ticket.cost * quantity, {
1399
+ currency: ticket.currency
1400
+ })), ` `, /*#__PURE__*/external_react_default().createElement("span", {
1309
1401
  className: ticket_type_index_module.discount
1310
- }, "$", reservation.raw_amount - reservation.discount_amount), ticket.currency), /*#__PURE__*/external_react_default().createElement("span", {
1402
+ }, formatCurrency(reservation.raw_amount - reservation.discount_amount, {
1403
+ currency: ticket.currency
1404
+ })), ` `), !(reservation !== null && reservation !== void 0 && reservation.discount_amount) && /*#__PURE__*/external_react_default().createElement((external_react_default()).Fragment, null, formatCurrency(ticket.cost * quantity, {
1405
+ currency: ticket.currency
1406
+ }), ` `), ticket.currency, !isActive && (reservation === null || reservation === void 0 ? void 0 : reservation.discount_amount) > 0 && /*#__PURE__*/external_react_default().createElement("span", {
1311
1407
  className: ticket_type_index_module.promo
1312
- }, "Promo code applied")) : /*#__PURE__*/external_react_default().createElement("span", null, ticket ? `${ticket.name}: $${ticket.cost} ${ticket.currency}` : 'No ticket selected'), !isActive && (reservation === null || reservation === void 0 ? void 0 : reservation.taxes_amount) > 0 && /*#__PURE__*/external_react_default().createElement((external_react_default()).Fragment, null, /*#__PURE__*/external_react_default().createElement("br", null), /*#__PURE__*/external_react_default().createElement("span", null, "Taxes: $", reservation === null || reservation === void 0 ? void 0 : reservation.taxes_amount, " ", ticket === null || ticket === void 0 ? void 0 : ticket.currency)))), /*#__PURE__*/external_react_default().createElement(external_react_spring_namespaceObject.animated.div, {
1408
+ }, "Promo code applied"), !isActive && (reservation === null || reservation === void 0 ? void 0 : reservation.taxes_amount) > 0 && /*#__PURE__*/external_react_default().createElement((external_react_default()).Fragment, null, /*#__PURE__*/external_react_default().createElement("br", null), "Taxes: $", reservation === null || reservation === void 0 ? void 0 : reservation.taxes_amount, " ", ticket === null || ticket === void 0 ? void 0 : ticket.currency)), !ticket && /*#__PURE__*/external_react_default().createElement((external_react_default()).Fragment, null, "No ticket selected")))), /*#__PURE__*/external_react_default().createElement(external_react_spring_namespaceObject.animated.div, {
1313
1409
  style: ticket_type_objectSpread({
1314
1410
  overflow: 'hidden'
1315
1411
  }, toggleAnimation)
1316
1412
  }, /*#__PURE__*/external_react_default().createElement("div", {
1317
- ref: ref,
1413
+ ref: ref
1414
+ }, /*#__PURE__*/external_react_default().createElement("div", {
1415
+ className: ticket_type_index_module.form
1416
+ }, /*#__PURE__*/external_react_default().createElement("div", {
1318
1417
  className: ticket_type_index_module.dropdown
1319
1418
  }, /*#__PURE__*/external_react_default().createElement(ticket_dropdown, {
1320
1419
  selectedTicket: ticket,
1321
1420
  ticketTypes: ticketTypes,
1322
- onTicketSelect: t => ticketSelect(t)
1323
- }))), inPersonDisclaimer && ticket && isInPersonTicketType(ticket) && /*#__PURE__*/external_react_default().createElement("div", {
1421
+ onTicketSelect: handleTicketChange
1422
+ })), ticket && /*#__PURE__*/external_react_default().createElement("div", {
1423
+ className: ticket_type_index_module.quantity
1424
+ }, /*#__PURE__*/external_react_default().createElement("div", {
1425
+ className: "input-group"
1426
+ }, /*#__PURE__*/external_react_default().createElement("span", {
1427
+ className: "input-group-btn"
1428
+ }, /*#__PURE__*/external_react_default().createElement("button", {
1429
+ "aria-label": "remove a ticket",
1430
+ className: "btn btn-default",
1431
+ onClick: decrementQuantity,
1432
+ disabled: maxQuantity === 0 || quantity === minQuantity
1433
+ }, /*#__PURE__*/external_react_default().createElement("i", {
1434
+ className: "fa fa-minus"
1435
+ }))), /*#__PURE__*/external_react_default().createElement("input", {
1436
+ className: "form-control",
1437
+ "aria-label": "ticket quanity",
1438
+ name: "ticket_quantity",
1439
+ type: "text",
1440
+ value: quantity,
1441
+ readOnly: true,
1442
+ disabled: maxQuantity === 0
1443
+ }), /*#__PURE__*/external_react_default().createElement("span", {
1444
+ className: "input-group-btn"
1445
+ }, /*#__PURE__*/external_react_default().createElement("button", {
1446
+ "aria-label": "add a ticket",
1447
+ className: "btn btn-default",
1448
+ onClick: incrementQuantity,
1449
+ disabled: maxQuantity === 0 || quantity >= maxQuantity
1450
+ }, /*#__PURE__*/external_react_default().createElement("i", {
1451
+ className: "glyphicon glyphicon-plus"
1452
+ })))))), /*#__PURE__*/external_react_default().createElement("a", {
1453
+ className: ticket_type_index_module.moreInfo,
1454
+ "data-tip": true,
1455
+ "data-for": "ticket-quantity-info"
1456
+ }, /*#__PURE__*/external_react_default().createElement("i", {
1457
+ className: "glyphicon glyphicon-info-sign",
1458
+ "aria-hidden": "true"
1459
+ }), ` `, "Need multiple ticket types?"), /*#__PURE__*/external_react_default().createElement((external_react_tooltip_default()), {
1460
+ id: "ticket-quantity-info"
1461
+ }, /*#__PURE__*/external_react_default().createElement("div", {
1462
+ className: ticket_type_index_module.moreInfoTooltip
1463
+ }, "In order to select multiple tickets of a different type, you may place a new registration order after you complete this order.")))), inPersonDisclaimer && ticket && isInPersonTicketType(ticket) && /*#__PURE__*/external_react_default().createElement("div", {
1324
1464
  className: ticket_type_index_module.inPersonDisclaimer
1325
1465
  }, /*#__PURE__*/external_react_default().createElement((raw_html_default()), null, inPersonDisclaimer)))));
1326
1466
  };
@@ -1349,24 +1489,21 @@ const TicketTypeComponent = ({
1349
1489
  const ButtonBarComponent = ({
1350
1490
  step,
1351
1491
  changeStep,
1352
- registrationForm,
1492
+ formValues,
1353
1493
  removeReservedTicket,
1354
- inPersonDisclaimer,
1355
- goToRegistration
1494
+ inPersonDisclaimer
1356
1495
  }) => {
1357
- var _registrationForm$tic, _registrationForm$tic2;
1358
-
1359
- const nextButtonText = inPersonDisclaimer && registrationForm !== null && registrationForm !== void 0 && registrationForm.ticketType && isInPersonTicketType(registrationForm.ticketType) ? 'Accept' : 'Next';
1496
+ const {
1497
+ ticketType
1498
+ } = formValues || {};
1499
+ const nextButtonText = inPersonDisclaimer && ticketType && isInPersonTicketType(ticketType) ? 'Accept' : 'Next';
1360
1500
  return /*#__PURE__*/external_react_default().createElement("div", {
1361
1501
  className: `${button_bar_index_module.outerWrapper}`
1362
1502
  }, step !== 3 && /*#__PURE__*/external_react_default().createElement((external_react_default()).Fragment, null, /*#__PURE__*/external_react_default().createElement("div", {
1363
1503
  className: `${button_bar_index_module.innerWrapper}`
1364
1504
  }, /*#__PURE__*/external_react_default().createElement("div", {
1365
1505
  className: button_bar_index_module.required
1366
- }, step !== 0 && /*#__PURE__*/external_react_default().createElement("span", null, "* Required fields ", /*#__PURE__*/external_react_default().createElement("br", null), " "), /*#__PURE__*/external_react_default().createElement("span", {
1367
- className: button_bar_index_module.registration,
1368
- onClick: () => goToRegistration()
1369
- }, "Need multiple tickets?")), /*#__PURE__*/external_react_default().createElement("div", {
1506
+ }, step !== 0 && /*#__PURE__*/external_react_default().createElement("span", null, "* Required fields ", /*#__PURE__*/external_react_default().createElement("br", null), " ")), /*#__PURE__*/external_react_default().createElement("div", {
1370
1507
  className: button_bar_index_module.actions
1371
1508
  }, step !== 0 && step !== 2 && /*#__PURE__*/external_react_default().createElement("button", {
1372
1509
  className: `${button_bar_index_module.button} button`,
@@ -1375,14 +1512,14 @@ const ButtonBarComponent = ({
1375
1512
  className: `${button_bar_index_module.button} button`,
1376
1513
  onClick: () => removeReservedTicket()
1377
1514
  }, "< Back"), step === 0 && /*#__PURE__*/external_react_default().createElement("button", {
1378
- disabled: !registrationForm.ticketType,
1515
+ disabled: !ticketType,
1379
1516
  className: `${button_bar_index_module.button} button`,
1380
1517
  onClick: () => changeStep(step + 1)
1381
- }, nextButtonText), step === 1 && ((_registrationForm$tic = registrationForm.ticketType) === null || _registrationForm$tic === void 0 ? void 0 : _registrationForm$tic.cost) === 0 && /*#__PURE__*/external_react_default().createElement("button", {
1518
+ }, nextButtonText), step === 1 && (ticketType === null || ticketType === void 0 ? void 0 : ticketType.cost) === 0 && /*#__PURE__*/external_react_default().createElement("button", {
1382
1519
  className: `${button_bar_index_module.button} button`,
1383
1520
  type: "submit",
1384
1521
  form: "personal-info-form"
1385
- }, "Get Ticket"), step === 1 && ((_registrationForm$tic2 = registrationForm.ticketType) === null || _registrationForm$tic2 === void 0 ? void 0 : _registrationForm$tic2.cost) > 0 && /*#__PURE__*/external_react_default().createElement("button", {
1522
+ }, "Get Ticket"), step === 1 && (ticketType === null || ticketType === void 0 ? void 0 : ticketType.cost) > 0 && /*#__PURE__*/external_react_default().createElement("button", {
1386
1523
  className: `${button_bar_index_module.button} button`,
1387
1524
  type: "submit",
1388
1525
  form: "personal-info-form"
@@ -1397,6 +1534,8 @@ const ButtonBarComponent = ({
1397
1534
  ;// CONCATENATED MODULE: ./src/components/purchase-complete/index.module.scss
1398
1535
  // extracted by mini-css-extract-plugin
1399
1536
  /* harmony default export */ const purchase_complete_index_module = ({"button":"button___XMN8a","wrapper":"wrapper___Jd5Xg","circle":"circle___lcN86","complete":"complete___HAHzl","actions":"actions___jJdPX","footer":"footer___FL9TW"});
1537
+ ;// CONCATENATED MODULE: external "openstack-uicore-foundation/lib/utils/methods"
1538
+ const methods_namespaceObject = require("openstack-uicore-foundation/lib/utils/methods");
1400
1539
  ;// CONCATENATED MODULE: ./src/components/purchase-complete/index.js
1401
1540
  /**
1402
1541
  * Copyright 2020 OpenStack Foundation
@@ -1563,7 +1702,7 @@ const PasswordlessLoginComponent = ({
1563
1702
  /* harmony default export */ const login_passwordless = (PasswordlessLoginComponent);
1564
1703
  ;// CONCATENATED MODULE: ./src/components/ticket-owned/index.module.scss
1565
1704
  // extracted by mini-css-extract-plugin
1566
- /* harmony default export */ const ticket_owned_index_module = ({"wrapper":"wrapper___wkhQp","circle":"circle___EPP1b","complete":"complete___m8wZz"});
1705
+ /* harmony default export */ const ticket_owned_index_module = ({"ticketOwnedWrapper":"ticketOwnedWrapper___nhkDY","alert":"alert___c49oP"});
1567
1706
  ;// CONCATENATED MODULE: ./src/components/ticket-owned/index.js
1568
1707
  /**
1569
1708
  * Copyright 2020 OpenStack Foundation
@@ -1581,26 +1720,25 @@ const PasswordlessLoginComponent = ({
1581
1720
 
1582
1721
 
1583
1722
  const TicketOwnedComponent = ({
1584
- goToRegistration
1723
+ ownedTickets,
1724
+ ticketTypes
1585
1725
  }) => {
1726
+ const ownedTicketsString = (0,external_react_namespaceObject.useMemo)(() => ownedTickets.reduce((acc, ownedTicket) => {
1727
+ const ticketType = ticketTypes.find(type => type.id === ownedTicket.type_id);
1728
+ if (!ticketType) return acc;
1729
+ return `${acc}${acc ? ', ' : ''}${ownedTicket.qty} ${ticketType.name}${!ticketType.name.toLowerCase().endsWith('ticket') ? ' ticket' : ''}${ownedTicket.qty > 1 ? 's' : ''}`;
1730
+ }, ''), [ownedTickets, ticketTypes]);
1586
1731
  return /*#__PURE__*/external_react_default().createElement("div", {
1587
- className: `${ticket_owned_index_module.wrapper}`
1588
- }, /*#__PURE__*/external_react_default().createElement((external_react_default()).Fragment, null, /*#__PURE__*/external_react_default().createElement("div", {
1589
- className: ticket_owned_index_module.circle
1590
- }, /*#__PURE__*/external_react_default().createElement("i", {
1591
- className: "fa fa-ticket"
1592
- })), /*#__PURE__*/external_react_default().createElement("span", {
1593
- className: ticket_owned_index_module.complete
1594
- }, "Our records show you have a ticket(s) to this event."), /*#__PURE__*/external_react_default().createElement("span", {
1595
- className: ticket_owned_index_module.complete
1596
- }, "If you would like to purchase more, ", /*#__PURE__*/external_react_default().createElement("a", {
1597
- onClick: () => goToRegistration()
1598
- }, "click here"), ".")));
1732
+ className: ticket_owned_index_module.ticketOwnedWrapper
1733
+ }, /*#__PURE__*/external_react_default().createElement("div", {
1734
+ className: `${ticket_owned_index_module.alert} alert alert-warning`,
1735
+ role: "alert"
1736
+ }, "You have already ordered ", ownedTicketsString, ". If you would like to order more tickets, please do so below."));
1599
1737
  };
1600
1738
 
1601
1739
  /* harmony default export */ const ticket_owned = (TicketOwnedComponent);
1602
1740
  ;// CONCATENATED MODULE: ./src/components/registration-lite.js
1603
- const _excluded = ["loadSession", "setMarketingSettings", "changeStep", "removeReservedTicket", "reserveTicket", "payTicket", "onPurchaseComplete", "getTicketTypes", "getTaxesTypes", "getLoginCode", "passwordlessLogin", "goToLogin", "loginOptions", "allowsNativeAuth", "allowsOtpAuth", "reservation", "checkout", "ticketTypes", "taxTypes", "step", "passwordlessCodeSent", "passwordlessEmail", "passwordlessCode", "getPasswordlessCode", "passwordlessCodeError", "loginWithCode", "goToExtraQuestions", "goToEvent", "goToRegistration", "profileData", "summitData", "supportEmail", "ticketOwned", "widgetLoading", "loading", "inPersonDisclaimer", "userProfile", "handleCompanyError"];
1741
+ const registration_lite_excluded = ["loadSession", "setMarketingSettings", "changeStep", "removeReservedTicket", "reserveTicket", "payTicket", "onPurchaseComplete", "getTicketTypes", "getTaxesTypes", "getLoginCode", "passwordlessLogin", "goToLogin", "loginOptions", "allowsNativeAuth", "allowsOtpAuth", "reservation", "checkout", "ticketTypes", "taxTypes", "step", "passwordlessCodeSent", "passwordlessEmail", "passwordlessCode", "getPasswordlessCode", "passwordlessCodeError", "loginWithCode", "goToExtraQuestions", "goToEvent", "goToRegistration", "profileData", "summitData", "supportEmail", "ticketOwned", "ownedTickets", "widgetLoading", "loading", "inPersonDisclaimer", "userProfile", "handleCompanyError"];
1604
1742
 
1605
1743
  function registration_lite_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
1606
1744
 
@@ -1608,9 +1746,9 @@ function registration_lite_objectSpread(target) { for (var i = 1; i < arguments.
1608
1746
 
1609
1747
  function registration_lite_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
1610
1748
 
1611
- function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
1749
+ function registration_lite_objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = registration_lite_objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
1612
1750
 
1613
- function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
1751
+ function registration_lite_objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
1614
1752
 
1615
1753
  /**
1616
1754
  * Copyright 2020 OpenStack Foundation
@@ -1643,7 +1781,7 @@ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) r
1643
1781
 
1644
1782
 
1645
1783
  const RegistrationLite = _ref => {
1646
- var _registrationForm$tic, _registrationForm$tic2;
1784
+ var _formValues$ticketTyp, _formValues$ticketTyp2;
1647
1785
 
1648
1786
  let {
1649
1787
  loadSession,
@@ -1679,19 +1817,37 @@ const RegistrationLite = _ref => {
1679
1817
  summitData,
1680
1818
  supportEmail,
1681
1819
  ticketOwned,
1820
+ ownedTickets,
1682
1821
  widgetLoading,
1683
1822
  loading,
1684
1823
  inPersonDisclaimer,
1685
1824
  userProfile,
1686
1825
  handleCompanyError
1687
1826
  } = _ref,
1688
- rest = _objectWithoutProperties(_ref, _excluded);
1827
+ rest = registration_lite_objectWithoutProperties(_ref, registration_lite_excluded);
1689
1828
 
1690
1829
  const [registrationForm, setRegistrationForm] = (0,external_react_namespaceObject.useState)({
1691
- ticketType: null,
1692
- personalInformation: null,
1693
- paymentInformation: null
1830
+ values: {
1831
+ ticketType: null,
1832
+ ticketQuantity: 1,
1833
+ personalInformation: null,
1834
+ paymentInformation: null
1835
+ },
1836
+ errors: []
1694
1837
  });
1838
+ const {
1839
+ values: formValues,
1840
+ errors: formErrors
1841
+ } = registrationForm;
1842
+
1843
+ const setFormValues = values => setRegistrationForm(registration_lite_objectSpread(registration_lite_objectSpread({}, registrationForm), {}, {
1844
+ values
1845
+ }));
1846
+
1847
+ const setFormErrors = errors => setRegistrationForm(registration_lite_objectSpread(registration_lite_objectSpread({}, registrationForm), {}, {
1848
+ errors
1849
+ }));
1850
+
1695
1851
  let publicKey = null;
1696
1852
 
1697
1853
  for (let profile of summitData.payment_profiles) {
@@ -1702,11 +1858,6 @@ const RegistrationLite = _ref => {
1702
1858
  }
1703
1859
 
1704
1860
  const stripePromise = (0,external_react_namespaceObject.useMemo)(() => (0,stripe_js_namespaceObject.loadStripe)(publicKey), [publicKey]);
1705
-
1706
- const ticketReservation = () => {
1707
- reserveTicket(registrationForm.personalInformation, registrationForm.ticketType);
1708
- };
1709
-
1710
1861
  (0,external_react_namespaceObject.useEffect)(() => {
1711
1862
  loadSession(registration_lite_objectSpread(registration_lite_objectSpread({}, rest), {}, {
1712
1863
  summitData,
@@ -1723,14 +1874,23 @@ const RegistrationLite = _ref => {
1723
1874
  }
1724
1875
  }, [summitData, profileData]);
1725
1876
  (0,external_react_namespaceObject.useEffect)(() => {
1726
- if (step === 1 && registrationForm.ticketType && registrationForm.personalInformation) {
1727
- ticketReservation();
1877
+ if (step === 1 && formValues !== null && formValues !== void 0 && formValues.ticketType && formValues !== null && formValues !== void 0 && formValues.personalInformation) {
1878
+ reserveTicket({
1879
+ personalInformation: formValues === null || formValues === void 0 ? void 0 : formValues.personalInformation,
1880
+ ticket: formValues === null || formValues === void 0 ? void 0 : formValues.ticketType,
1881
+ ticketQuantity: formValues === null || formValues === void 0 ? void 0 : formValues.ticketQuantity
1882
+ }, {
1883
+ onError: (err, res) => setFormErrors(res.body.errors)
1884
+ });
1728
1885
  }
1729
1886
 
1730
- if (step > 0 && !registrationForm.ticketType) {
1887
+ if (step > 0 && !(formValues !== null && formValues !== void 0 && formValues.ticketType)) {
1731
1888
  changeStep(0);
1732
1889
  }
1733
- }, [registrationForm]);
1890
+ }, [formValues]);
1891
+ (0,external_react_namespaceObject.useEffect)(() => {
1892
+ setFormErrors([]);
1893
+ }, [step]);
1734
1894
  const [ref, {
1735
1895
  height
1736
1896
  }] = (0,external_react_use_namespaceObject.useMeasure)();
@@ -1739,10 +1899,18 @@ const RegistrationLite = _ref => {
1739
1899
  bounce: 0
1740
1900
  }, external_react_spring_namespaceObject.config.stiff),
1741
1901
  to: {
1742
- opacity: ((_registrationForm$tic = registrationForm.ticketType) === null || _registrationForm$tic === void 0 ? void 0 : _registrationForm$tic.cost) === 0 ? 0 : 1,
1743
- height: ((_registrationForm$tic2 = registrationForm.ticketType) === null || _registrationForm$tic2 === void 0 ? void 0 : _registrationForm$tic2.cost) === 0 ? 0 : height
1902
+ opacity: (formValues === null || formValues === void 0 ? void 0 : (_formValues$ticketTyp = formValues.ticketType) === null || _formValues$ticketTyp === void 0 ? void 0 : _formValues$ticketTyp.cost) === 0 ? 0 : 1,
1903
+ height: (formValues === null || formValues === void 0 ? void 0 : (_formValues$ticketTyp2 = formValues.ticketType) === null || _formValues$ticketTyp2 === void 0 ? void 0 : _formValues$ticketTyp2.cost) === 0 ? 0 : height
1744
1904
  }
1745
1905
  });
1906
+
1907
+ const handleCloseClick = () => {
1908
+ // Reset the step when closed to avoid unexpected behavior from `useEffect`s w/in other steps.
1909
+ // (i.e., recalling `onPurchaseComplete` after a user completes one order, closes the window, and then reopens the registration widget)
1910
+ changeStep(0);
1911
+ rest.closeWidget();
1912
+ };
1913
+
1746
1914
  return /*#__PURE__*/external_react_default().createElement("div", {
1747
1915
  id: "modal",
1748
1916
  className: "modal is-active"
@@ -1757,19 +1925,15 @@ const RegistrationLite = _ref => {
1757
1925
  size: 80
1758
1926
  }), /*#__PURE__*/external_react_default().createElement("div", {
1759
1927
  className: `${general_module.outerWrapper} summit-registration-lite`
1760
- }, /*#__PURE__*/external_react_default().createElement((external_react_default()).Fragment, null, /*#__PURE__*/external_react_default().createElement("div", {
1761
- className: `${general_module.innerWrapper}`
1928
+ }, /*#__PURE__*/external_react_default().createElement("div", {
1929
+ className: general_module.innerWrapper
1762
1930
  }, /*#__PURE__*/external_react_default().createElement("div", {
1763
1931
  className: general_module.title
1764
1932
  }, /*#__PURE__*/external_react_default().createElement("span", null, summitData.name), /*#__PURE__*/external_react_default().createElement("i", {
1765
1933
  className: "fa fa-close",
1766
1934
  "aria-label": "close",
1767
- onClick: () => rest.closeWidget()
1768
- })), ticketOwned && /*#__PURE__*/external_react_default().createElement("div", {
1769
- className: general_module.stepsWrapper
1770
- }, /*#__PURE__*/external_react_default().createElement(ticket_owned, {
1771
- goToRegistration: goToRegistration
1772
- })), !ticketOwned && /*#__PURE__*/external_react_default().createElement("div", {
1935
+ onClick: handleCloseClick
1936
+ })), /*#__PURE__*/external_react_default().createElement("div", {
1773
1937
  className: general_module.stepsWrapper
1774
1938
  }, !profileData && !passwordlessCodeSent && /*#__PURE__*/external_react_default().createElement(components_login, {
1775
1939
  options: loginOptions,
@@ -1787,24 +1951,26 @@ const RegistrationLite = _ref => {
1787
1951
  goToLogin: goToLogin,
1788
1952
  getLoginCode: getLoginCode,
1789
1953
  getPasswordlessCode: getPasswordlessCode
1790
- }), profileData && step !== 3 && ticketTypes.length > 0 && /*#__PURE__*/external_react_default().createElement((external_react_default()).Fragment, null, /*#__PURE__*/external_react_default().createElement(ticket_type, {
1954
+ }), profileData && step !== 3 && ticketTypes.length > 0 && /*#__PURE__*/external_react_default().createElement((external_react_default()).Fragment, null, ticketOwned && /*#__PURE__*/external_react_default().createElement(ticket_owned, {
1955
+ ownedTickets: ownedTickets,
1956
+ ticketTypes: ticketTypes
1957
+ }), /*#__PURE__*/external_react_default().createElement(ticket_type, {
1791
1958
  ticketTypes: ticketTypes,
1792
1959
  inPersonDisclaimer: inPersonDisclaimer,
1793
1960
  taxTypes: taxTypes,
1794
1961
  reservation: reservation,
1795
1962
  isActive: step === 0,
1796
- changeForm: t => setRegistrationForm(registration_lite_objectSpread(registration_lite_objectSpread({}, registrationForm), {}, {
1797
- ticketType: t
1798
- }))
1963
+ changeForm: ticketForm => setFormValues(registration_lite_objectSpread(registration_lite_objectSpread({}, formValues), ticketForm))
1799
1964
  }), /*#__PURE__*/external_react_default().createElement(personal_information, {
1800
1965
  isActive: step === 1,
1801
1966
  reservation: reservation,
1802
1967
  userProfile: profileData,
1803
1968
  summitId: summitData.id,
1804
- changeForm: personalForm => setRegistrationForm(registration_lite_objectSpread(registration_lite_objectSpread({}, registrationForm), {}, {
1805
- personalInformation: personalForm
1969
+ changeForm: personalInformation => setFormValues(registration_lite_objectSpread(registration_lite_objectSpread({}, formValues), {}, {
1970
+ personalInformation
1806
1971
  })),
1807
- handleCompanyError: handleCompanyError
1972
+ handleCompanyError: handleCompanyError,
1973
+ formErrors: formErrors
1808
1974
  }), /*#__PURE__*/external_react_default().createElement(external_react_spring_namespaceObject.animated.div, {
1809
1975
  style: registration_lite_objectSpread({}, toggleAnimation)
1810
1976
  }, /*#__PURE__*/external_react_default().createElement("div", {
@@ -1822,14 +1988,13 @@ const RegistrationLite = _ref => {
1822
1988
  supportEmail: supportEmail,
1823
1989
  goToEvent: goToEvent,
1824
1990
  goToExtraQuestions: goToExtraQuestions
1825
- })), profileData && !ticketOwned && step !== 3 && /*#__PURE__*/external_react_default().createElement(button_bar, {
1991
+ })), profileData && step !== 3 && /*#__PURE__*/external_react_default().createElement(button_bar, {
1826
1992
  step: step,
1827
1993
  inPersonDisclaimer: inPersonDisclaimer,
1828
- registrationForm: registrationForm,
1829
- goToRegistration: goToRegistration,
1994
+ formValues: formValues,
1830
1995
  removeReservedTicket: removeReservedTicket,
1831
1996
  changeStep: changeStep
1832
- }))))));
1997
+ })))));
1833
1998
  };
1834
1999
 
1835
2000
  const registration_lite_mapStateToProps = ({
package/package.json CHANGED
@@ -1,9 +1,10 @@
1
1
  {
2
2
  "name": "summit-registration-lite",
3
- "version": "2.0.2",
3
+ "version": "2.0.3",
4
4
  "description": "Summit Registration Lite",
5
5
  "main": "index.js",
6
6
  "scripts": {
7
+ "clean": "find . -name \"node_modules\" -type d -prune -exec rm -rf '{}' + && yarn install",
7
8
  "build-dev": "./node_modules/.bin/webpack --config webpack.dev.js",
8
9
  "build": "./node_modules/.bin/webpack --config webpack.prod.js",
9
10
  "serve": "webpack-dev-server --open --port=8888 --https --config webpack.dev.js",
@@ -58,7 +59,7 @@
58
59
  "moment": "^2.22.2",
59
60
  "moment-timezone": "^0.5.21",
60
61
  "node-sass": "^7.0.1",
61
- "openstack-uicore-foundation": "^4.0.14",
62
+ "openstack-uicore-foundation": "^4.0.18",
62
63
  "optimize-css-assets-webpack-plugin": "^6.0.1",
63
64
  "path": "^0.12.7",
64
65
  "react": "^16.8.4",
@@ -102,7 +103,7 @@
102
103
  "lodash": "^4.17.14",
103
104
  "moment": "^2.22.2",
104
105
  "moment-timezone": "^0.5.21",
105
- "openstack-uicore-foundation": "^4.0.14",
106
+ "openstack-uicore-foundation": "^4.0.18",
106
107
  "react": "^16.8.4",
107
108
  "react-bootstrap": "^0.31.5",
108
109
  "react-datetime": "^2.16.2",