@openeventkit/event-site 2.1.49 → 2.1.51

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.
Files changed (135) hide show
  1. package/gatsby-node.js +21 -4
  2. package/package.json +3 -3
  3. package/src/actions/user-actions.js +9 -10
  4. package/src/cms/config/collections/configurationsCollection/siteSettings/index.js +21 -0
  5. package/src/cms/config/collections/configurationsCollection/siteSettings/typeDefs.js +5 -0
  6. package/src/cms/config/collections/contentPagesCollection/index.js +11 -1
  7. package/src/cms/config/collections/contentPagesCollection/typeDefs.js +1 -0
  8. package/src/cms/config/collections/defaultPagesCollection/marketingPage/index.js +2 -6
  9. package/src/cms/config/collections/defaultPagesCollection/marketingPage/typeDefs.js +0 -1
  10. package/src/cms/preview-templates/ContentPagePreview.js +12 -1
  11. package/src/components/AuthComponent.js +2 -1
  12. package/src/components/MarketingHero/MainColumn.js +23 -11
  13. package/src/components/RegisterButton.js +59 -0
  14. package/src/components/RegistrationFormShortcode.js +82 -0
  15. package/src/components/RegistrationModalComponent.js +124 -0
  16. package/src/components/VimeoPlayer.js +2 -2
  17. package/src/content/marketing-page/index.json +1 -2
  18. package/src/content/site-settings/index.json +1 -1
  19. package/src/content/sponsors.json +1 -1
  20. package/src/pages/index.js +0 -1
  21. package/src/styles/register-page.module.scss +23 -0
  22. package/src/templates/content-page/shortcodes.js +3 -5
  23. package/src/templates/extra-questions-page.js +1 -1
  24. package/src/templates/full-profile-page.js +2 -3
  25. package/src/templates/register-page.js +96 -0
  26. package/src/utils/alerts.js +34 -27
  27. package/src/utils/customErrorHandler.js +4 -4
  28. package/src/utils/registrationConstants.js +7 -0
  29. package/src/utils/ticketConstants.js +10 -0
  30. package/src/utils/useRegistrationWidgetProps.js +204 -0
  31. package/src/utils/useSiteSettings.js +4 -0
  32. package/.playwright-mcp/console-2026-02-26T16-44-19-373Z.log +0 -4
  33. package/.playwright-mcp/console-2026-02-26T16-47-01-636Z.log +0 -2
  34. package/.playwright-mcp/console-2026-02-26T16-49-02-149Z.log +0 -4
  35. package/.playwright-mcp/console-2026-02-26T16-49-40-507Z.log +0 -2
  36. package/.playwright-mcp/console-2026-02-26T16-50-19-509Z.log +0 -2
  37. package/.playwright-mcp/console-2026-02-26T16-57-54-251Z.log +0 -3
  38. package/.playwright-mcp/console-2026-02-26T19-57-40-442Z.log +0 -1
  39. package/.playwright-mcp/console-2026-02-26T19-57-58-088Z.log +0 -2
  40. package/.playwright-mcp/console-2026-02-26T20-05-42-541Z.log +0 -2
  41. package/.playwright-mcp/console-2026-02-26T20-06-33-506Z.log +0 -9
  42. package/.playwright-mcp/console-2026-02-26T20-42-10-293Z.log +0 -34
  43. package/.playwright-mcp/console-2026-02-26T20-42-57-262Z.log +0 -65
  44. package/.playwright-mcp/console-2026-02-26T21-01-25-696Z.log +0 -33
  45. package/.playwright-mcp/console-2026-02-26T21-03-18-294Z.log +0 -47
  46. package/.playwright-mcp/console-2026-02-27T00-27-06-325Z.log +0 -131
  47. package/.playwright-mcp/console-2026-02-27T00-49-26-441Z.log +0 -104
  48. package/.playwright-mcp/page-2026-02-26T16-51-33-776Z.png +0 -0
  49. package/src/components/RegistrationLiteComponent.js +0 -293
  50. package/src/components/summit-my-orders-tickets/components/ConfirmPopup/ConfirmPopup.js +0 -96
  51. package/src/components/summit-my-orders-tickets/components/ConfirmPopup/confirm-popup.scss +0 -57
  52. package/src/components/summit-my-orders-tickets/components/DelegatePopup/DelegatePopup.js +0 -50
  53. package/src/components/summit-my-orders-tickets/components/DelegatePopup/delegate-popup.scss +0 -57
  54. package/src/components/summit-my-orders-tickets/components/MyOrdersTickets.js +0 -79
  55. package/src/components/summit-my-orders-tickets/components/OrderDetails/OrderDetails.js +0 -112
  56. package/src/components/summit-my-orders-tickets/components/OrderDetails/order-details.scss +0 -128
  57. package/src/components/summit-my-orders-tickets/components/OrderList/OrderList.js +0 -80
  58. package/src/components/summit-my-orders-tickets/components/OrderList/OrderListItem.js +0 -85
  59. package/src/components/summit-my-orders-tickets/components/OrderList/order-list.scss +0 -60
  60. package/src/components/summit-my-orders-tickets/components/OrderOptions/OrderOptions.js +0 -83
  61. package/src/components/summit-my-orders-tickets/components/OrderOptions/order-options.scss +0 -50
  62. package/src/components/summit-my-orders-tickets/components/OrderSummary/OrderSummary.js +0 -64
  63. package/src/components/summit-my-orders-tickets/components/OrderSummary/OrderSummaryTable.js +0 -97
  64. package/src/components/summit-my-orders-tickets/components/OrderSummary/order-summary.scss +0 -178
  65. package/src/components/summit-my-orders-tickets/components/OrderTicketDetails/OrderTicketDetails.js +0 -102
  66. package/src/components/summit-my-orders-tickets/components/OrderTicketDetails/order-ticket-details.scss +0 -129
  67. package/src/components/summit-my-orders-tickets/components/OrderTicketList/OrderTicketList.js +0 -19
  68. package/src/components/summit-my-orders-tickets/components/OrderTicketList/OrderTicketListItem.js +0 -13
  69. package/src/components/summit-my-orders-tickets/components/OrderTicketList/order-ticket-list.scss +0 -21
  70. package/src/components/summit-my-orders-tickets/components/TicketDetails/TicketDetails.js +0 -93
  71. package/src/components/summit-my-orders-tickets/components/TicketDetails/ticket-details.scss +0 -129
  72. package/src/components/summit-my-orders-tickets/components/TicketList/TicketList.js +0 -65
  73. package/src/components/summit-my-orders-tickets/components/TicketList/TicketListItem.js +0 -16
  74. package/src/components/summit-my-orders-tickets/components/TicketList/ticket-list.scss +0 -21
  75. package/src/components/summit-my-orders-tickets/components/TicketPopup/TicketPopup.js +0 -186
  76. package/src/components/summit-my-orders-tickets/components/TicketPopup/TicketPopupAssignForm.js +0 -136
  77. package/src/components/summit-my-orders-tickets/components/TicketPopup/TicketPopupEditDetailsForm/TicketPopupEditDetailsForm.js +0 -468
  78. package/src/components/summit-my-orders-tickets/components/TicketPopup/TicketPopupEditDetailsForm/ticket-popup-edit-details-form.scss +0 -71
  79. package/src/components/summit-my-orders-tickets/components/TicketPopup/TicketPopupNotifyForm.js +0 -64
  80. package/src/components/summit-my-orders-tickets/components/TicketPopup/TicketPopupReassignForm.js +0 -193
  81. package/src/components/summit-my-orders-tickets/components/TicketPopup/TicketPopupRefundForm.js +0 -64
  82. package/src/components/summit-my-orders-tickets/components/TicketPopup/ticket-popup.scss +0 -416
  83. package/src/components/summit-my-orders-tickets/context/TicketAssignedContext.js +0 -24
  84. package/src/components/summit-my-orders-tickets/global/constants.js +0 -10
  85. package/src/components/summit-my-orders-tickets/i18n/index.js +0 -37
  86. package/src/components/summit-my-orders-tickets/i18n/locales/en.json +0 -296
  87. package/src/components/summit-my-orders-tickets/i18n/locales/es.json +0 -296
  88. package/src/components/summit-my-orders-tickets/index.js +0 -1
  89. package/src/components/summit-my-orders-tickets/store/actions/base-actions.js +0 -7
  90. package/src/components/summit-my-orders-tickets/store/actions/order-actions.js +0 -96
  91. package/src/components/summit-my-orders-tickets/store/actions/summit-actions.js +0 -64
  92. package/src/components/summit-my-orders-tickets/store/actions/ticket-actions.js +0 -666
  93. package/src/components/summit-my-orders-tickets/store/actions/timer-actions.js +0 -29
  94. package/src/components/summit-my-orders-tickets/store/actions/user-actions.js +0 -42
  95. package/src/components/summit-my-orders-tickets/store/history.js +0 -16
  96. package/src/components/summit-my-orders-tickets/store/index.js +0 -117
  97. package/src/components/summit-my-orders-tickets/store/reducers/base-reducer.js +0 -67
  98. package/src/components/summit-my-orders-tickets/store/reducers/clock-reducer.js +0 -31
  99. package/src/components/summit-my-orders-tickets/store/reducers/order-reducer.js +0 -95
  100. package/src/components/summit-my-orders-tickets/store/reducers/summit-reducer.js +0 -52
  101. package/src/components/summit-my-orders-tickets/store/reducers/ticket-reducer.js +0 -92
  102. package/src/components/summit-my-orders-tickets/store/reducers/user-reducer.js +0 -35
  103. package/src/components/summit-my-orders-tickets/styles/_variables.scss +0 -17
  104. package/src/components/summit-my-orders-tickets/styles/general.scss +0 -17
  105. package/src/components/summit-my-orders-tickets/summit-my-orders-tickets.js +0 -86
  106. package/src/components/summit-my-orders-tickets/util/helpers/capitalizeFirstLetter.js +0 -1
  107. package/src/components/summit-my-orders-tickets/util/helpers/createReducer.js +0 -11
  108. package/src/components/summit-my-orders-tickets/util/helpers/formatCurrency.js +0 -15
  109. package/src/components/summit-my-orders-tickets/util/helpers/getDayNumberFromDate.js +0 -9
  110. package/src/components/summit-my-orders-tickets/util/helpers/getDaysBetweenDates.js +0 -16
  111. package/src/components/summit-my-orders-tickets/util/helpers/getDocumentOffset.js +0 -8
  112. package/src/components/summit-my-orders-tickets/util/helpers/getFormattedDate.js +0 -7
  113. package/src/components/summit-my-orders-tickets/util/helpers/getFormattedTime.js +0 -9
  114. package/src/components/summit-my-orders-tickets/util/helpers/getWindowScroll.js +0 -6
  115. package/src/components/summit-my-orders-tickets/util/helpers/index.js +0 -22
  116. package/src/components/summit-my-orders-tickets/util/index.js +0 -5
  117. package/src/components/summit-my-orders-tickets/util/order/calculateOrderTotals.js +0 -28
  118. package/src/components/summit-my-orders-tickets/util/order/getOrderStatusData.js +0 -71
  119. package/src/components/summit-my-orders-tickets/util/order/index.js +0 -2
  120. package/src/components/summit-my-orders-tickets/util/summit/checkSummitPast.js +0 -10
  121. package/src/components/summit-my-orders-tickets/util/summit/checkSummitStarted.js +0 -5
  122. package/src/components/summit-my-orders-tickets/util/summit/getSummitFormattedDate.js +0 -29
  123. package/src/components/summit-my-orders-tickets/util/summit/getSummitFormattedReassignDate.js +0 -8
  124. package/src/components/summit-my-orders-tickets/util/summit/getSummitLocation.js +0 -9
  125. package/src/components/summit-my-orders-tickets/util/summit/getSummitReassignDate.js +0 -7
  126. package/src/components/summit-my-orders-tickets/util/summit/index.js +0 -7
  127. package/src/components/summit-my-orders-tickets/util/summit/useSummitDetails.js +0 -36
  128. package/src/components/summit-my-orders-tickets/util/ticket/getTicketRole.js +0 -11
  129. package/src/components/summit-my-orders-tickets/util/ticket/getTicketStatusData.js +0 -48
  130. package/src/components/summit-my-orders-tickets/util/ticket/getTicketType.js +0 -1
  131. package/src/components/summit-my-orders-tickets/util/ticket/index.js +0 -4
  132. package/src/components/summit-my-orders-tickets/util/ticket/useTicketDetails.js +0 -60
  133. package/src/components/summit-my-orders-tickets/util/timer/index.js +0 -1
  134. package/src/components/summit-my-orders-tickets/util/timer/useNow.js +0 -8
  135. package/src/templates/login-page.js +0 -49
package/gatsby-node.js CHANGED
@@ -454,6 +454,7 @@ exports.createPages = async ({ actions, graphql }) => {
454
454
  }
455
455
  frontmatter {
456
456
  templateKey
457
+ slug
457
458
  }
458
459
  internal {
459
460
  contentFilePath
@@ -471,17 +472,33 @@ exports.createPages = async ({ actions, graphql }) => {
471
472
  const nodes = result.data.allMdx.nodes;
472
473
 
473
474
  nodes.forEach((node) => {
474
- const { id, fields: { slug }, frontmatter: { templateKey }, internal: { contentFilePath } } = node;
475
+ const { id, fields: { slug }, frontmatter: { templateKey, slug: frontmatterSlug }, internal: { contentFilePath } } = node;
475
476
  const template = require.resolve(`./src/templates/${String(templateKey)}`);
476
- // remove content pages namespace from path
477
- const path = slug.replace(`${CONTENT_PAGES_PATH_NAME}`, "/");
477
+ // use frontmatter slug if set, otherwise derive from filename
478
+ const pagePath = frontmatterSlug
479
+ ? `/${frontmatterSlug.replace(/^\/+/, '')}/`
480
+ : slug.replace(`/${CONTENT_PAGES_PATH_NAME}`, "");
478
481
  const page = {
479
- path: path,
482
+ path: pagePath,
480
483
  component: `${template}?__contentFilePath=${contentFilePath}`,
481
484
  context: { id }
482
485
  };
483
486
  createPage(page);
484
487
  });
488
+
489
+ // Conditionally create /register page based on registrationMode
490
+ if (fs.existsSync(SITE_SETTINGS_FILE_PATH)) {
491
+ const siteSettings = JSON.parse(fs.readFileSync(SITE_SETTINGS_FILE_PATH));
492
+ const { REGISTRATION_MODE } = require('./src/utils/registrationConstants');
493
+ const registrationMode = siteSettings.registration?.registrationMode;
494
+ if (registrationMode === REGISTRATION_MODE.standalone) {
495
+ createPage({
496
+ path: '/register/',
497
+ component: require.resolve('./src/templates/register-page.js'),
498
+ context: {}
499
+ });
500
+ }
501
+ }
485
502
  };
486
503
 
487
504
  exports.onCreatePage = async ({ page, actions }) => {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@openeventkit/event-site",
3
3
  "description": "Event Site",
4
- "version": "2.1.49",
4
+ "version": "2.1.51",
5
5
  "author": "Tipit LLC",
6
6
  "dependencies": {
7
7
  "@emotion/server": "^11.11.0",
@@ -55,7 +55,7 @@
55
55
  "font-awesome": "^4.7.0",
56
56
  "formik": "^2.4.6",
57
57
  "fs-extra": "^11.3.0",
58
- "full-schedule-widget": "3.1.1",
58
+ "full-schedule-widget": "3.1.3",
59
59
  "gatsby": "^5.13.5",
60
60
  "gatsby-alias-imports": "^1.0.6",
61
61
  "gatsby-plugin-decap-cms": "^4.0.4",
@@ -135,7 +135,7 @@
135
135
  "stream-browserify": "^3.0.0",
136
136
  "stream-chat": "^2.7.2",
137
137
  "stream-chat-react": "3.1.7",
138
- "summit-registration-lite": "6.0.8",
138
+ "summit-registration-lite": "7.0.0",
139
139
  "superagent": "8.0.9",
140
140
  "sweetalert2": "^11.11.1",
141
141
  "upcoming-events-widget": "3.0.7",
@@ -18,7 +18,7 @@ import {
18
18
  } from 'openstack-uicore-foundation/lib/security/methods';
19
19
 
20
20
  import QuestionsSet from 'openstack-uicore-foundation/lib/utils/questions-set'
21
- import Swal from 'sweetalert2';
21
+ import { alertSuccess, alertWarning } from '@utils/alerts';
22
22
  import axios from "axios";
23
23
  import {navigate} from 'gatsby';
24
24
  import {customErrorHandler, customBadgeHandler, voidErrorHandler, customRSVPHandler} from '../utils/customErrorHandler';
@@ -65,6 +65,7 @@ export const RECEIVE_RSVP_INVITATION = 'RECEIVE_RSVP_INVITATION';
65
65
  export const RSVP_INVITATION_ERROR = 'RSVP_INVITATION_ERROR';
66
66
  export const RSVP_INVITATION_ACCEPTED = 'RSVP_INVITATION_ACCEPTED';
67
67
  export const RSVP_INVITATION_REJECTED = 'RSVP_INVITATION_REJECTED';
68
+
68
69
  const DISQUS_SSO_EXPIRATION = "DISQUS_SSO_EXPIRATION";
69
70
 
70
71
  // shortName is the unique identifier assigned to a Disqus site.
@@ -128,7 +129,7 @@ export const getUserProfile = () => async (dispatch) => {
128
129
  console.log('ERROR: ', e);
129
130
  dispatch(createAction(STOP_LOADING_PROFILE)());
130
131
  clearAccessToken();
131
- Swal.fire('Error', "There was an error at Login Flow. Please retry.", "warning");
132
+ alertWarning('Error', "There was an error at Login Flow. Please retry.");
132
133
  initLogOut();
133
134
  return (e);
134
135
  });
@@ -205,8 +206,7 @@ export const scanBadge = (sponsorId) => async (dispatch) => {
205
206
  // entity
206
207
  )(params)(dispatch)
207
208
  .then((payload) => {
208
- let msg = 'Thanks for sharing your info!';
209
- Swal.fire("Success", msg, "success");
209
+ alertSuccess("Success", "Thanks for sharing your info!");
210
210
  return (payload)
211
211
  })
212
212
  .catch(e => {
@@ -286,7 +286,7 @@ export const rsvpToEvent = (event) => async (dispatch, getState) => {
286
286
  return rsvp;
287
287
  }).catch(e => {
288
288
  console.log('ERROR: ', e);
289
- Swal.fire('Error', "There was an error at RSVP. Please retry.", "warning");
289
+ alertWarning('Error', "There was an error at RSVP. Please retry.");
290
290
  Sentry.captureException(e)
291
291
  return e;
292
292
  });
@@ -314,7 +314,7 @@ export const cancelRSVP = (event) => async (dispatch, getState) => {
314
314
  return event;
315
315
  }).catch(e => {
316
316
  console.log('ERROR: ', e);
317
- Swal.fire('Error', "There was an error at UnRSVP. Please retry.", "warning");
317
+ alertWarning('Error', "There was an error at UnRSVP. Please retry.");
318
318
  Sentry.captureException(e)
319
319
  return e;
320
320
  });
@@ -492,8 +492,7 @@ export const updatePassword = (password) => async (dispatch) => {
492
492
  )(params)(dispatch)
493
493
  .then(() => {
494
494
  dispatch(createAction(STOP_LOADING_IDP_PROFILE)());
495
- let msg = 'Password Updated';
496
- Swal.fire("Success", msg, "success");
495
+ alertSuccess("Success", "Password Updated");
497
496
  })
498
497
  .catch((e) => {
499
498
  console.log('ERROR: ', e);
@@ -537,12 +536,12 @@ export const saveAttendeeQuestions = (values, ticketId = null) => async (dispatc
537
536
  customErrorHandler
538
537
  )(params)(dispatch).then(() => {
539
538
  dispatch(stopLoading());
540
- Swal.fire('Success', "Thank you, information saved", "success");
539
+ alertSuccess('Success', "Thank you, information saved");
541
540
  dispatch(getUserProfile());
542
541
  navigate('/')
543
542
  }).catch(e => {
544
543
  dispatch(stopLoading());
545
- Swal.fire('Error', "Error saving your Attendee info. Please retry.", "warning");
544
+ alertWarning('Error', "Error saving your Attendee info. Please retry.");
546
545
  clearAccessToken();
547
546
  return e;
548
547
  });
@@ -24,6 +24,7 @@ import {
24
24
  } from "@utils/envVariables";
25
25
 
26
26
  import { mapObjectToSelectOptions } from "../../../utils";
27
+ import { REGISTRATION_MODE } from "@utils/registrationConstants";
27
28
 
28
29
  const FONT_FORMATS = {
29
30
  truetype: "ttf",
@@ -179,6 +180,26 @@ const siteSettings = {
179
180
  })
180
181
  ]
181
182
  }),
183
+ objectField({
184
+ label: "Registration",
185
+ name: "registration",
186
+ fields: [
187
+ selectField({
188
+ label: "Registration Mode",
189
+ name: "registrationMode",
190
+ default: REGISTRATION_MODE.modal,
191
+ required: false,
192
+ options: mapObjectToSelectOptions(REGISTRATION_MODE),
193
+ hint: "MODAL: opens the registration form as a popup overlay. STANDALONE: redirects to a dedicated registration page. LINK: redirects to the URL specified in Registration Link, which can be an internal content page with an embedded registration form or an external URL."
194
+ }),
195
+ stringField({
196
+ label: "Registration Link",
197
+ name: "registrationLink",
198
+ required: false,
199
+ hint: "Only used when Registration Mode is LINK. Use a relative path (e.g. /my-page) for an internal page, or a full URL (e.g. https://example.com) for an external site. To embed the registration form in a content page, add the <RegistrationForm /> shortcode in the page body."
200
+ })
201
+ ]
202
+ }),
182
203
  objectField({
183
204
  label: "IDP Logo",
184
205
  name: "idpLogo",
@@ -43,12 +43,17 @@ module.exports = `
43
43
  providerLogo: File @fileByRelativePath
44
44
  providerLogoSize: Float
45
45
  }
46
+ type Registration {
47
+ registrationMode: String
48
+ registrationLink: String
49
+ }
46
50
  type MaintenanceMode {
47
51
  enabled: Boolean
48
52
  title: String
49
53
  subtitle: String
50
54
  }
51
55
  type SiteSettingsJson implements Node {
56
+ registration: Registration
52
57
  siteMetadata: SiteMetadata
53
58
  favicon: Favicon
54
59
  siteFont: SiteFont
@@ -11,6 +11,9 @@ import { CONTENT_PAGES_DIR_PATH } from "@utils/filePath";
11
11
  import { USER_REQUIREMENTS } from "@utils/pageAccessConstants";
12
12
 
13
13
  import { mapObjectToSelectOptions } from "../../utils";
14
+ import shortcodes from "../../../../templates/content-page/shortcodes";
15
+
16
+ const shortcodesHint = `Available shortcodes: ${Object.keys(shortcodes).map(name => `<${name} />`).join(", ")}`;
14
17
 
15
18
  const contentPagesCollection = {
16
19
  ...collectionDefaults({
@@ -33,6 +36,12 @@ const contentPagesCollection = {
33
36
  label: "Title",
34
37
  name: "title"
35
38
  }),
39
+ stringField({
40
+ label: "Slug",
41
+ name: "slug",
42
+ required: false,
43
+ hint: "URL path for this page (e.g. registration). Leave empty to use the default path based on the title. Changing this will change the page URL."
44
+ }),
36
45
  selectField({
37
46
  label: "User Requirement",
38
47
  name: "userRequirement",
@@ -42,7 +51,8 @@ const contentPagesCollection = {
42
51
  }),
43
52
  markdownField({
44
53
  label: "Body",
45
- name: "body"
54
+ name: "body",
55
+ hint: shortcodesHint
46
56
  })
47
57
  ]
48
58
  };
@@ -6,6 +6,7 @@ module.exports = `
6
6
  type MdxFrontmatter {
7
7
  templateKey: String
8
8
  title: String
9
+ slug: String
9
10
  userRequirement: String
10
11
  }
11
12
  type Mdx {
@@ -78,12 +78,8 @@ const marketingPage = {
78
78
  booleanField({
79
79
  label: "Display",
80
80
  name: "display",
81
- required: false
82
- }),
83
- stringField({
84
- label: "External Registration Link",
85
- name: "externalRegistrationLink",
86
- required: false
81
+ required: false,
82
+ hint: "Show or hide the register button on the hero. To change the register button behavior (open registration popup, navigate to standalone registration page, or redirect to an internal page or external URL), go to Site Settings > Registration."
87
83
  }),
88
84
  ]
89
85
  }),
@@ -45,7 +45,6 @@ module.exports = `
45
45
  type MarketingPageHeroRegistrationButton {
46
46
  text: String
47
47
  display: Boolean
48
- externalRegistrationLink: String
49
48
  }
50
49
  type MarketingPageHeroLoginButton {
51
50
  text: String
@@ -6,6 +6,7 @@ import Mdx from "../../components/Mdx";
6
6
 
7
7
  // function to transform content by replacing relative image URLs with absolute ones
8
8
  const transformContent = (mdx, getAsset) => {
9
+ if (!mdx) return "";
9
10
  // regex to identify Markdown image tags ![alt](url)
10
11
  const imageRegex = /!\[([^\]]*)\]\(([^)]+)\)/g;
11
12
 
@@ -21,9 +22,19 @@ const transformContent = (mdx, getAsset) => {
21
22
  });
22
23
  };
23
24
 
25
+ // Override shortcodes that require Redux/Gatsby context with placeholders for CMS preview
26
+ const previewShortcodes = {
27
+ ...shortcodes,
28
+ RegistrationForm: () => (
29
+ <div style={{ border: '2px dashed #ccc', padding: '2rem', textAlign: 'center', margin: '1rem 0' }}>
30
+ <p style={{ fontSize: '1.2rem', color: '#666' }}>Registration Form Widget (preview not available)</p>
31
+ </div>
32
+ )
33
+ };
34
+
24
35
  // function to render transformed content with Mdx
25
36
  const renderContent = (mdx, getAsset) => (
26
- <Mdx shortcodes={shortcodes} content={transformContent(mdx, getAsset)}/>
37
+ <Mdx shortcodes={previewShortcodes} content={transformContent(mdx, getAsset)}/>
27
38
  );
28
39
 
29
40
  const ContentPagePreview = ({ entry, getAsset }) => {
@@ -12,7 +12,8 @@ import { getThirdPartyProviders } from "../actions/base-actions";
12
12
  // these two libraries are client-side only
13
13
  import LoginComponent from "summit-registration-lite/dist/components/login";
14
14
  import PasswordlessLoginComponent from "summit-registration-lite/dist/components/login-passwordless";
15
- import "summit-registration-lite/dist/index.css";
15
+ import "summit-registration-lite/dist/components/login.css";
16
+ import "summit-registration-lite/dist/components/login-passwordless.css";
16
17
  import IconButton from "./IconButton";
17
18
  import Link from "./Link";
18
19
 
@@ -1,20 +1,32 @@
1
1
  import * as React from "react";
2
2
  import { getSrc } from "gatsby-plugin-image";
3
3
  import AuthComponent from "../AuthComponent";
4
- import RegistrationLiteComponent from "../RegistrationLiteComponent";
4
+ import RegistrationModalComponent from "../RegistrationModalComponent";
5
+ import RegisterButton from "../RegisterButton";
6
+ import { REGISTRATION_MODE } from "@utils/registrationConstants";
7
+ import useSiteSettings from "@utils/useSiteSettings";
5
8
 
6
9
  import styles from "./styles.module.scss";
7
10
 
8
- const ButtonGroup = ({ location, registerButton, loginButton }) => (
9
- <>
10
- {registerButton?.display && (
11
- <span className={styles.link}>
12
- <RegistrationLiteComponent location={location} />
13
- </span>
14
- )}
15
- {loginButton?.display && <AuthComponent location={location} />}
16
- </>
17
- );
11
+ const ButtonGroup = ({ location, registerButton, loginButton }) => {
12
+ const siteSettings = useSiteSettings();
13
+ const mode = siteSettings?.registration?.registrationMode || REGISTRATION_MODE.modal;
14
+ return (
15
+ <>
16
+ {registerButton?.display && (mode === REGISTRATION_MODE.standalone || mode === REGISTRATION_MODE.link) && (
17
+ <span className={styles.link}>
18
+ <RegisterButton />
19
+ </span>
20
+ )}
21
+ {registerButton?.display && mode === REGISTRATION_MODE.modal && (
22
+ <span className={styles.link}>
23
+ <RegistrationModalComponent location={location} />
24
+ </span>
25
+ )}
26
+ {loginButton?.display && <AuthComponent location={location} />}
27
+ </>
28
+ );
29
+ };
18
30
 
19
31
  const MainColumn = ({ location, title, subTitle, date, time, buttons, backgroundSrc, fullWidth }) => {
20
32
  const backgroundImageStyle = backgroundSrc
@@ -0,0 +1,59 @@
1
+ import React from "react";
2
+ import PropTypes from "prop-types";
3
+ import { navigate } from "gatsby";
4
+ import { connect } from "react-redux";
5
+
6
+ import IconButton from "./IconButton";
7
+ import iconButtonStyles from "./IconButton/styles.module.scss";
8
+ import { REGISTRATION_MODE } from "@utils/registrationConstants";
9
+ import useSiteSettings from "@utils/useSiteSettings";
10
+
11
+ const RegisterButton = ({
12
+ marketingPageSettings,
13
+ children,
14
+ }) => {
15
+ const siteSettings = useSiteSettings();
16
+ const registration = siteSettings?.registration;
17
+ const mode = registration?.registrationMode || REGISTRATION_MODE.modal;
18
+
19
+ const handleClick = () => {
20
+ if (mode === REGISTRATION_MODE.link && registration?.registrationLink) {
21
+ const url = registration.registrationLink;
22
+ const isInternal = /^\/(?!\/)/.test(url);
23
+ if (isInternal) {
24
+ navigate(url);
25
+ } else {
26
+ window.location = url;
27
+ }
28
+ return;
29
+ }
30
+ navigate("/register");
31
+ }
32
+
33
+ const { registerButton } = marketingPageSettings.hero.buttons;
34
+
35
+ if (children) {
36
+ return React.cloneElement(children, { onClick: handleClick });
37
+ }
38
+
39
+ if (!registerButton.display) return null;
40
+
41
+ return (
42
+ <IconButton
43
+ className={iconButtonStyles.register}
44
+ iconClass="fa fa-2x fa-edit"
45
+ buttonText={registerButton.text}
46
+ onClick={handleClick}
47
+ />
48
+ );
49
+ };
50
+
51
+ RegisterButton.propTypes = {
52
+ children: PropTypes.node,
53
+ };
54
+
55
+ const mapStateToProps = ({ settingState }) => ({
56
+ marketingPageSettings: settingState.marketingPageSettings
57
+ });
58
+
59
+ export default connect(mapStateToProps)(RegisterButton);
@@ -0,0 +1,82 @@
1
+ import React from "react";
2
+ import { connect } from "react-redux";
3
+ import { navigate } from "gatsby";
4
+ import * as Sentry from "@sentry/react";
5
+ import NoSsr from "@mui/material/NoSsr";
6
+
7
+ import { SentryFallbackFunction } from "./SentryErrorComponent";
8
+ import RegistrationForm from "summit-registration-lite/dist/components/registration-form";
9
+ import "summit-registration-lite/dist/components/registration-form.css";
10
+
11
+ import { setPasswordlessLogin, setUserOrder, checkOrderData, getUserProfile, checkRequireExtraQuestionsByAttendee } from "../actions/user-actions";
12
+ import { getThirdPartyProviders } from "../actions/base-actions";
13
+ import { getExtraQuestions } from "../actions/summit-actions";
14
+
15
+ import useRegistrationWidgetProps from "@utils/useRegistrationWidgetProps";
16
+
17
+ const RegistrationFormShortcode = ({
18
+ summit,
19
+ userProfile,
20
+ idpProfile,
21
+ colorSettings,
22
+ attendee,
23
+ availableThirdPartyProviders,
24
+ allowsNativeAuth,
25
+ allowsOtpAuth,
26
+ loadingProfile,
27
+ loadingIDP,
28
+ setPasswordlessLogin,
29
+ setUserOrder,
30
+ checkOrderData,
31
+ getUserProfile,
32
+ getThirdPartyProviders,
33
+ getExtraQuestions,
34
+ checkRequireExtraQuestionsByAttendee
35
+ }) => {
36
+ const backUrl = typeof window !== 'undefined' ? window.location.pathname : '/';
37
+
38
+ const widgetProps = useRegistrationWidgetProps({
39
+ summit, userProfile, idpProfile, attendee, colorSettings,
40
+ loadingProfile, loadingIDP, availableThirdPartyProviders,
41
+ allowsNativeAuth, allowsOtpAuth,
42
+ setPasswordlessLogin, setUserOrder, checkOrderData,
43
+ getThirdPartyProviders, getExtraQuestions, checkRequireExtraQuestionsByAttendee,
44
+ backUrl,
45
+ closeWidget: () => navigate("/"),
46
+ });
47
+
48
+ if (!summit) return null;
49
+
50
+ return (
51
+ <NoSsr>
52
+ <Sentry.ErrorBoundary fallback={SentryFallbackFunction({componentName: "Registration Form"})}>
53
+ <div className="summit-registration-lite">
54
+ <RegistrationForm {...widgetProps} />
55
+ </div>
56
+ </Sentry.ErrorBoundary>
57
+ </NoSsr>
58
+ );
59
+ };
60
+
61
+ const mapStateToProps = ({ userState, summitState, settingState }) => ({
62
+ loadingProfile: userState.loading,
63
+ loadingIDP: userState.loadingIDP,
64
+ userProfile: userState.userProfile,
65
+ idpProfile: userState.idpProfile,
66
+ attendee: userState.attendee,
67
+ availableThirdPartyProviders: summitState.third_party_providers,
68
+ allowsNativeAuth: summitState.allows_native_auth,
69
+ allowsOtpAuth: summitState.allows_otp_auth,
70
+ summit: summitState.summit,
71
+ colorSettings: settingState.colorSettings,
72
+ });
73
+
74
+ export default connect(mapStateToProps, {
75
+ setPasswordlessLogin,
76
+ setUserOrder,
77
+ checkOrderData,
78
+ getUserProfile,
79
+ getThirdPartyProviders,
80
+ getExtraQuestions,
81
+ checkRequireExtraQuestionsByAttendee
82
+ })(RegistrationFormShortcode);
@@ -0,0 +1,124 @@
1
+ import React, { useEffect, useState } from "react";
2
+ import PropTypes from "prop-types";
3
+ import * as Sentry from "@sentry/react";
4
+ import { connect } from "react-redux";
5
+
6
+ import FragmentParser from "openstack-uicore-foundation/lib/utils/fragment-parser";
7
+
8
+ import { getUserProfile, setPasswordlessLogin, setUserOrder, checkOrderData, checkRequireExtraQuestionsByAttendee } from "../actions/user-actions";
9
+ import { getThirdPartyProviders } from "../actions/base-actions";
10
+ import { getExtraQuestions } from "../actions/summit-actions";
11
+
12
+ import IconButton from "./IconButton";
13
+ import iconButtonStyles from "./IconButton/styles.module.scss";
14
+ import { SentryFallbackFunction } from "./SentryErrorComponent";
15
+
16
+ import RegistrationModal from "summit-registration-lite/dist/components/registration-modal";
17
+ import "summit-registration-lite/dist/components/registration-modal.css";
18
+
19
+ import useRegistrationWidgetProps from "@utils/useRegistrationWidgetProps";
20
+
21
+ const RegistrationModalComponent = ({
22
+ summit,
23
+ userProfile,
24
+ idpProfile,
25
+ colorSettings,
26
+ attendee,
27
+ availableThirdPartyProviders,
28
+ allowsNativeAuth,
29
+ allowsOtpAuth,
30
+ loadingProfile,
31
+ loadingIDP,
32
+ marketingPageSettings,
33
+ setPasswordlessLogin,
34
+ setUserOrder,
35
+ checkOrderData,
36
+ getUserProfile,
37
+ getThirdPartyProviders,
38
+ getExtraQuestions,
39
+ checkRequireExtraQuestionsByAttendee,
40
+ children,
41
+ ignoreAutoOpen
42
+ }) => {
43
+ const [isOpen, setIsOpen] = useState(false);
44
+
45
+ useEffect(() => {
46
+ const fragmentParser = new FragmentParser();
47
+ if (!ignoreAutoOpen && fragmentParser.getParam("registration")) {
48
+ setIsOpen(true);
49
+ }
50
+ }, [ignoreAutoOpen]);
51
+
52
+ const handleOpenPopup = () => {
53
+ setIsOpen(true);
54
+ };
55
+
56
+ const handleClosePopup = () => {
57
+ setIsOpen(false);
58
+ };
59
+
60
+ const widgetProps = useRegistrationWidgetProps({
61
+ summit, userProfile, idpProfile, attendee, colorSettings,
62
+ loadingProfile, loadingIDP, availableThirdPartyProviders,
63
+ allowsNativeAuth, allowsOtpAuth,
64
+ setPasswordlessLogin, setUserOrder, checkOrderData,
65
+ getUserProfile, getThirdPartyProviders, getExtraQuestions,
66
+ checkRequireExtraQuestionsByAttendee,
67
+ backUrl: '/#registration=1',
68
+ closeWidget: handleClosePopup,
69
+ });
70
+
71
+ const { registerButton } = marketingPageSettings.hero.buttons;
72
+
73
+ if (!summit) return null;
74
+
75
+ return (
76
+ <Sentry.ErrorBoundary fallback={SentryFallbackFunction({componentName: "Registration Modal"})}>
77
+ {children ?
78
+ React.cloneElement(children, { onClick: handleOpenPopup })
79
+ :
80
+ registerButton.display &&
81
+ <IconButton
82
+ className={iconButtonStyles.register}
83
+ iconClass="fa fa-2x fa-edit"
84
+ buttonText={registerButton.text}
85
+ onClick={handleOpenPopup}
86
+ disabled={isOpen}
87
+ />
88
+ }
89
+ {isOpen && <RegistrationModal {...widgetProps} />}
90
+ </Sentry.ErrorBoundary>
91
+ );
92
+ };
93
+
94
+ RegistrationModalComponent.defaultProps = {
95
+ ignoreAutoOpen: false,
96
+ };
97
+
98
+ RegistrationModalComponent.propTypes = {
99
+ ignoreAutoOpen: PropTypes.bool,
100
+ };
101
+
102
+ const mapStateToProps = ({ userState, summitState, settingState }) => ({
103
+ loadingProfile: userState.loading,
104
+ loadingIDP: userState.loadingIDP,
105
+ userProfile: userState.userProfile,
106
+ idpProfile: userState.idpProfile,
107
+ attendee: userState.attendee,
108
+ availableThirdPartyProviders: summitState.third_party_providers,
109
+ allowsNativeAuth: summitState.allows_native_auth,
110
+ allowsOtpAuth: summitState.allows_otp_auth,
111
+ summit: summitState.summit,
112
+ colorSettings: settingState.colorSettings,
113
+ marketingPageSettings: settingState.marketingPageSettings
114
+ });
115
+
116
+ export default connect(mapStateToProps, {
117
+ setPasswordlessLogin,
118
+ setUserOrder,
119
+ checkOrderData,
120
+ getUserProfile,
121
+ getThirdPartyProviders,
122
+ getExtraQuestions,
123
+ checkRequireExtraQuestionsByAttendee
124
+ })(RegistrationModalComponent);
@@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
3
3
  import Player from '@vimeo/player';
4
4
  import * as Sentry from "@sentry/react";
5
5
  import eventNames from './VimeoPlayerEventNames';
6
- import Swal from 'sweetalert2';
6
+ import { alertWarning } from '@utils/alerts';
7
7
 
8
8
  class VimeoPlayer extends React.Component {
9
9
 
@@ -386,7 +386,7 @@ VimeoPlayer.defaultProps = {
386
386
  dnt: false,
387
387
  speed: false,
388
388
  onError: (error) => {
389
- Swal.fire('Error', 'This video stream will begin momentarily. Please standby.', "warning");
389
+ alertWarning('Error', 'This video stream will begin momentarily. Please standby.');
390
390
  console.log(error);
391
391
  Sentry.captureException(error)
392
392
  }
@@ -6,8 +6,7 @@
6
6
  "buttons": {
7
7
  "registerButton": {
8
8
  "text": "Register Now",
9
- "display": true,
10
- "externalRegistrationLink": ""
9
+ "display": true
11
10
  },
12
11
  "loginButton": {
13
12
  "text": "Log In",
@@ -1 +1 @@
1
- {"favicon":{"asset":"icon.png"},"widgets":{"chat":{"enabled":true,"showQA":false,"showHelp":false,"defaultScope":"page"},"schedule":{"allowClick":true}},"identityProviderButtons":[{"buttonColor":"#082238","providerLabel":"Continue with FNid","providerLogo":"logo_fn.svg","providerLogoSize":27},{"buttonColor":"#0A66C2","providerLabel":"Sign in with LinkedIn","providerParam":"linkedin","providerLogo":"logo_linkedin.svg","providerLogoSize":18},{"buttonColor":"#000000","providerLabel":"Sign in with Apple","providerParam":"apple","providerLogoSize":17,"providerLogo":"logo_apple.svg"},{"buttonColor":"#1877F2","providerLabel":"Login with Facebook","providerParam":"facebook","providerLogo":"logo_facebook.svg","providerLogoSize":20}],"maintenanceMode":{"enabled":false,"title":"Site under maintenance","subtitle":"Please reload page shortly"},"staticJsonFilesBuildTime":[{"file":"src/data/summit.json","build_time":1772477528142},{"file":"src/data/events.json","build_time":1772477529716},{"file":"src/data/events.idx.json","build_time":1772477529719},{"file":"src/data/speakers.json","build_time":1772477530377},{"file":"src/data/speakers.idx.json","build_time":1772477530377},{"file":"src/content/sponsors.json","build_time":1772477536422},{"file":"src/data/voteable-presentations.json","build_time":1772477536807}],"lastBuild":1772477536807}
1
+ {"favicon":{"asset":"icon.png"},"widgets":{"chat":{"enabled":true,"showQA":false,"showHelp":false,"defaultScope":"page"},"schedule":{"allowClick":true}},"identityProviderButtons":[{"buttonColor":"#082238","providerLabel":"Continue with FNid","providerLogo":"logo_fn.svg","providerLogoSize":27},{"buttonColor":"#0A66C2","providerLabel":"Sign in with LinkedIn","providerParam":"linkedin","providerLogo":"logo_linkedin.svg","providerLogoSize":18},{"buttonColor":"#000000","providerLabel":"Sign in with Apple","providerParam":"apple","providerLogoSize":17,"providerLogo":"logo_apple.svg"},{"buttonColor":"#1877F2","providerLabel":"Login with Facebook","providerParam":"facebook","providerLogo":"logo_facebook.svg","providerLogoSize":20}],"maintenanceMode":{"enabled":false,"title":"Site under maintenance","subtitle":"Please reload page shortly"},"staticJsonFilesBuildTime":[{"file":"src/data/summit.json","build_time":1777290117148},{"file":"src/data/events.json","build_time":1777290119814},{"file":"src/data/events.idx.json","build_time":1777290119815},{"file":"src/data/speakers.json","build_time":1777290120736},{"file":"src/data/speakers.idx.json","build_time":1777290120737},{"file":"src/content/sponsors.json","build_time":1777290130468},{"file":"src/data/voteable-presentations.json","build_time":1777290130851}],"lastBuild":1777290130851,"registration":{"registrationMode":"STANDALONE"}}