@icvdeveloper/common-module 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/README.md +6 -0
  2. package/dist/module.cjs +5 -0
  3. package/dist/module.d.ts +9 -0
  4. package/dist/module.json +8 -0
  5. package/dist/module.mjs +102051 -0
  6. package/dist/runtime/@types/configVariables.d.ts +78 -0
  7. package/dist/runtime/@types/configVariables.mjs +0 -0
  8. package/dist/runtime/analytics.d.ts +8 -0
  9. package/dist/runtime/analytics.mjs +38 -0
  10. package/dist/runtime/assets/scss/_agenda.scss +47 -0
  11. package/dist/runtime/assets/scss/_animations.scss +11 -0
  12. package/dist/runtime/assets/scss/_container_variants.scss +26 -0
  13. package/dist/runtime/assets/scss/_custom.scss +364 -0
  14. package/dist/runtime/assets/scss/_footer.scss +20 -0
  15. package/dist/runtime/assets/scss/_forms.scss +29 -0
  16. package/dist/runtime/assets/scss/_functions.scss +24 -0
  17. package/dist/runtime/assets/scss/_header.scss +41 -0
  18. package/dist/runtime/assets/scss/_index_production.scss +45 -0
  19. package/dist/runtime/assets/scss/_transitions.scss +24 -0
  20. package/dist/runtime/assets/scss/_variables.scss +62 -0
  21. package/dist/runtime/assets/scss/_variables2.scss +0 -0
  22. package/dist/runtime/assets/scss/_webcast.scss +141 -0
  23. package/dist/runtime/assets/scss/index.scss +42 -0
  24. package/dist/runtime/assets/svg/answer.svg +14 -0
  25. package/dist/runtime/assets/svg/avatar.svg +1 -0
  26. package/dist/runtime/assets/svg/bell-icon.svg +3 -0
  27. package/dist/runtime/assets/svg/chat-icon.svg +1 -0
  28. package/dist/runtime/assets/svg/checkmark-icon.svg +1 -0
  29. package/dist/runtime/assets/svg/close-icon.svg +1 -0
  30. package/dist/runtime/assets/svg/icon-avatar.svg +1 -0
  31. package/dist/runtime/assets/svg/icon-close.svg +1 -0
  32. package/dist/runtime/assets/svg/icon-down-arrow.svg +1 -0
  33. package/dist/runtime/assets/svg/icon-facebook.svg +1 -0
  34. package/dist/runtime/assets/svg/icon-info.svg +3 -0
  35. package/dist/runtime/assets/svg/icon-linkedin.svg +1 -0
  36. package/dist/runtime/assets/svg/icon-new-window.svg +11 -0
  37. package/dist/runtime/assets/svg/icon-offline.svg +3 -0
  38. package/dist/runtime/assets/svg/icon-online.svg +3 -0
  39. package/dist/runtime/assets/svg/icon-person.svg +3 -0
  40. package/dist/runtime/assets/svg/icon-play.svg +3 -0
  41. package/dist/runtime/assets/svg/icon-star-filled.svg +30 -0
  42. package/dist/runtime/assets/svg/icon-star.svg +25 -0
  43. package/dist/runtime/assets/svg/icon-twitter.svg +1 -0
  44. package/dist/runtime/assets/svg/icon-video-chat.svg +14 -0
  45. package/dist/runtime/assets/svg/icon-website.svg +3 -0
  46. package/dist/runtime/assets/svg/icon-youtube.svg +1 -0
  47. package/dist/runtime/assets/svg/icon-zoom.svg +10 -0
  48. package/dist/runtime/assets/svg/notification-icon.svg +32 -0
  49. package/dist/runtime/assets/svg/offline-icon.svg +1 -0
  50. package/dist/runtime/assets/svg/online-icon.svg +3 -0
  51. package/dist/runtime/assets/svg/peer2peer.svg +3 -0
  52. package/dist/runtime/assets/svg/phone.svg +1 -0
  53. package/dist/runtime/assets/svg/plus-icon.svg +1 -0
  54. package/dist/runtime/assets/svg/red-icon.svg +3 -0
  55. package/dist/runtime/assets/svg/reject.svg +14 -0
  56. package/dist/runtime/assets/svg/search-icon.svg +3 -0
  57. package/dist/runtime/components/affiliates/AffiliatePage.vue +16 -0
  58. package/dist/runtime/components/agenda/AgendaTabbed.vue +342 -0
  59. package/dist/runtime/components/agenda/components/InfoLink.vue +55 -0
  60. package/dist/runtime/components/agenda/components/PlayIcon.vue +48 -0
  61. package/dist/runtime/components/agenda/components/PresentationLink.vue +147 -0
  62. package/dist/runtime/components/agenda/components/Sponsor.vue +108 -0
  63. package/dist/runtime/components/auth/LoginFullWidth.vue +76 -0
  64. package/dist/runtime/components/core/CountdownTimer.vue +275 -0
  65. package/dist/runtime/components/core/DynamicHtml.vue +16 -0
  66. package/dist/runtime/components/core/DynamicHtml.vue.d.ts +2 -0
  67. package/dist/runtime/components/core/Modal.vue +84 -0
  68. package/dist/runtime/components/core/SvgIcon.vue +119 -0
  69. package/dist/runtime/components/core/ZoomModal.vue +37 -0
  70. package/dist/runtime/components/events/EventHeader.vue +131 -0
  71. package/dist/runtime/components/events/PastEvents.vue +150 -0
  72. package/dist/runtime/components/events/UpcomingEvents.vue +145 -0
  73. package/dist/runtime/components/forms/ErrorField.vue +19 -0
  74. package/dist/runtime/components/forms/Message.vue +25 -0
  75. package/dist/runtime/components/forms/SearchInput.vue +30 -0
  76. package/dist/runtime/components/forms/SupportForm.vue +109 -0
  77. package/dist/runtime/components/forms/TextArea.vue +26 -0
  78. package/dist/runtime/components/forms/TextInput.vue +22 -0
  79. package/dist/runtime/components/layouts/Accordion.vue +76 -0
  80. package/dist/runtime/components/presenters/PresenterListing.vue +89 -0
  81. package/dist/runtime/components/presenters/PresenterModal.vue +83 -0
  82. package/dist/runtime/composables/useAgenda.d.ts +81 -0
  83. package/dist/runtime/composables/useAgenda.mjs +178 -0
  84. package/dist/runtime/composables/useAnalytics.d.ts +7 -0
  85. package/dist/runtime/composables/useAnalytics.mjs +10 -0
  86. package/dist/runtime/composables/useApi.d.ts +1 -0
  87. package/dist/runtime/composables/useApi.mjs +16 -0
  88. package/dist/runtime/composables/useConferenceHelpers.d.ts +65 -0
  89. package/dist/runtime/composables/useConferenceHelpers.mjs +270 -0
  90. package/dist/runtime/composables/useDateFormat.d.ts +12 -0
  91. package/dist/runtime/composables/useDateFormat.mjs +21 -0
  92. package/dist/runtime/composables/useLogin.d.ts +30 -0
  93. package/dist/runtime/composables/useLogin.mjs +58 -0
  94. package/dist/runtime/composables/usePresentation.d.ts +53 -0
  95. package/dist/runtime/composables/usePresentation.mjs +98 -0
  96. package/dist/runtime/composables/usePresenter.d.ts +15 -0
  97. package/dist/runtime/composables/usePresenter.mjs +67 -0
  98. package/dist/runtime/composables/usePresenters.d.ts +13 -0
  99. package/dist/runtime/composables/usePresenters.mjs +21 -0
  100. package/dist/runtime/composables/useV3plusCommonModule.d.ts +2 -0
  101. package/dist/runtime/composables/useV3plusCommonModule.mjs +2 -0
  102. package/dist/runtime/models/affiliate.d.ts +1 -0
  103. package/dist/runtime/models/affiliate.mjs +0 -0
  104. package/dist/runtime/models/authUser.d.ts +16 -0
  105. package/dist/runtime/models/authUser.mjs +0 -0
  106. package/dist/runtime/models/conference.d.ts +124 -0
  107. package/dist/runtime/models/conference.mjs +18 -0
  108. package/dist/runtime/models/globalConfig.d.ts +80 -0
  109. package/dist/runtime/models/globalConfig.mjs +0 -0
  110. package/dist/runtime/models/group.d.ts +14 -0
  111. package/dist/runtime/models/group.mjs +0 -0
  112. package/dist/runtime/models/icons.d.ts +18 -0
  113. package/dist/runtime/models/icons.mjs +0 -0
  114. package/dist/runtime/models/navigationConfig.d.ts +8 -0
  115. package/dist/runtime/models/navigationConfig.mjs +0 -0
  116. package/dist/runtime/models/pagesConfig.d.ts +169 -0
  117. package/dist/runtime/models/pagesConfig.mjs +0 -0
  118. package/dist/runtime/models/portal.d.ts +8 -0
  119. package/dist/runtime/models/portal.mjs +0 -0
  120. package/dist/runtime/models/templateConfig.d.ts +44 -0
  121. package/dist/runtime/models/templateConfig.mjs +0 -0
  122. package/dist/runtime/plugin.d.ts +2 -0
  123. package/dist/runtime/plugin.mjs +55 -0
  124. package/dist/runtime/store/affiliates.d.ts +12 -0
  125. package/dist/runtime/store/affiliates.mjs +35 -0
  126. package/dist/runtime/store/auth.d.ts +14 -0
  127. package/dist/runtime/store/auth.mjs +32 -0
  128. package/dist/runtime/store/conferences.d.ts +13 -0
  129. package/dist/runtime/store/conferences.mjs +86 -0
  130. package/dist/runtime/store/navigationConfig.d.ts +7 -0
  131. package/dist/runtime/store/navigationConfig.mjs +14 -0
  132. package/dist/runtime/store/portal.d.ts +9 -0
  133. package/dist/runtime/store/portal.mjs +39 -0
  134. package/dist/runtime/store/support.d.ts +3 -0
  135. package/dist/runtime/store/support.mjs +20 -0
  136. package/dist/runtime/store/templateConfigs.d.ts +20 -0
  137. package/dist/runtime/store/templateConfigs.mjs +84 -0
  138. package/dist/runtime/v3plusCommonPlugin.d.ts +14 -0
  139. package/dist/runtime/v3plusCommonPlugin.mjs +8 -0
  140. package/dist/types.d.ts +10 -0
  141. package/package.json +57 -0
@@ -0,0 +1,37 @@
1
+ <script lang="ts" setup>
2
+ import { ref, toRefs, computed } from "vue";
3
+
4
+ interface Props {
5
+ presentationId: number | string;
6
+ modalSize?: string;
7
+ }
8
+
9
+ const props = withDefaults(defineProps<Props>(), {
10
+ modalSize: "full",
11
+ });
12
+
13
+ const { modalSize, presentationId } = toRefs(props);
14
+
15
+ const showModal = ref<boolean>(false);
16
+
17
+ const zoomUrl = computed(() => {
18
+ return `/zoom/${presentationId.value}/meeting`;
19
+ });
20
+ </script>
21
+
22
+ <template>
23
+ <span>
24
+ <CommonModal
25
+ :visible="showModal"
26
+ :modal-size="modalSize"
27
+ @trigger="showModal = false"
28
+ >
29
+ <template #modal-body>
30
+ <iframe :src="zoomUrl" class="w-full h-full"></iframe>
31
+ </template>
32
+ </CommonModal>
33
+ <a class="no-underline" href="javascript:null" @click="showModal = true">
34
+ <slot name="modal-link"></slot>
35
+ </a>
36
+ </span>
37
+ </template>
@@ -0,0 +1,131 @@
1
+ <script lang="ts" setup>
2
+ import { storeToRefs } from "pinia";
3
+ import { Conference } from "../../models/conference";
4
+ import { useTemplateConfigsStore } from "../../store/templateConfigs";
5
+ import { useConferenceHelpers } from "../../composables/useConferenceHelpers";
6
+
7
+ interface Props {
8
+ conference: Conference;
9
+ useEventText?: boolean;
10
+ }
11
+
12
+ // Component Props
13
+ const props = withDefaults(defineProps<Props>(), {
14
+ useEventText: true,
15
+ });
16
+
17
+ // reactive data
18
+ const { useEventText, conference } = toRefs(props);
19
+
20
+ // helper functions
21
+ const {
22
+ getConferenceDisplayDate,
23
+ showConferenceWebcastButton,
24
+ getConferenceWebcastUrl,
25
+ getConferenceWebcastButtonText,
26
+ showViewArchiveButton,
27
+ getViewArchiveUrl,
28
+ getViewArchiveButtonText,
29
+ showConferenceRegButton,
30
+ getConferenceRegUrl,
31
+ getConferenceRegText,
32
+ } = useConferenceHelpers(conference);
33
+
34
+ // store methods
35
+ const { globalConfigValue, pagesConfigValue } = storeToRefs(
36
+ useTemplateConfigsStore()
37
+ );
38
+
39
+ // computed properties
40
+ const mainStyles = computed(() => {
41
+ if (useEventText.value) {
42
+ return {
43
+ "background-image": `url(${conference.value.photo_large})`,
44
+ "background-repeat": "no-repeat",
45
+ "background-size": "cover",
46
+ "background-position": "center",
47
+ };
48
+ } else {
49
+ return {};
50
+ }
51
+ });
52
+
53
+ const mutedHeaderStyle = computed(() => {
54
+ const muted = globalConfigValue.value("muted_photo_headers");
55
+ if (muted === "lighten") return "background-color: rgb(255, 255, 255, .4)";
56
+ if (muted === "darken") return "background-color: rgb(0, 0, 0, .4)";
57
+ return "";
58
+ });
59
+
60
+ const hasOtherButton = computed(() => {
61
+ return showViewArchiveButton() || showConferenceWebcastButton();
62
+ });
63
+
64
+ const mainBodyImage = computed(() => {
65
+ return conference.value.photo_large;
66
+ });
67
+ </script>
68
+
69
+ <template>
70
+ <div :style="mainStyles" class="flex bg-color-2">
71
+ <div
72
+ v-if="useEventText"
73
+ class="text-center flex flex-1 flex-col items-center justify-center h-auto p-12"
74
+ :style="mutedHeaderStyle"
75
+ >
76
+ <h1
77
+ class="text-shadow font-bold heading-color-1 mt-4 mb-4 text-2xl sm:text-2xl md:text-3xl lg:text-4xl xl:text-5xl"
78
+ >
79
+ {{ conference.name }}
80
+ </h1>
81
+ <h1
82
+ v-if="conference.location"
83
+ class="text-shadow font-light heading-color-2 mb-2 text-2xl sm:text-l md:text-xl lg:text-2xl xl:text-3xl"
84
+ >
85
+ {{ conference.location }}
86
+ </h1>
87
+ <h3
88
+ v-if="pagesConfigValue('main.use_event_text_date')"
89
+ class="text-shadow font-light heading-color-2 mb-2 text-l sm:text-l md:text-xl lg:text-2xl xl:text-3xl"
90
+ >
91
+ {{ getConferenceDisplayDate() }}
92
+ </h3>
93
+
94
+ <div class="flex-row mt-6">
95
+ <!-- view test stream or webcast -->
96
+ <a
97
+ v-if="showConferenceWebcastButton()"
98
+ :href="getConferenceWebcastUrl()"
99
+ :target="/^http/.test(getConferenceWebcastUrl()) ? '_blank' : '_self'"
100
+ >
101
+ <button class="btn">
102
+ {{ getConferenceWebcastButtonText() }}
103
+ </button>
104
+ </a>
105
+
106
+ <!-- view archive -->
107
+ <a
108
+ v-if="showViewArchiveButton()"
109
+ :href="getViewArchiveUrl()"
110
+ :target="/^http/.test(getViewArchiveUrl()) ? '_blank' : '_self'"
111
+ >
112
+ <button class="btn">
113
+ {{ getViewArchiveButtonText() }}
114
+ </button>
115
+ </a>
116
+
117
+ <!-- register -->
118
+ <a
119
+ v-if="showConferenceRegButton()"
120
+ :href="getConferenceRegUrl()"
121
+ :target="/^http/.test(getConferenceRegUrl()) ? '_blank' : '_self'"
122
+ >
123
+ <button class="btn" :class="hasOtherButton ? 'md:ml-4' : ''">
124
+ {{ getConferenceRegText() }}
125
+ </button>
126
+ </a>
127
+ </div>
128
+ </div>
129
+ <img v-else :src="mainBodyImage" class="w-full h-auto" />
130
+ </div>
131
+ </template>
@@ -0,0 +1,150 @@
1
+ <script lang="ts" setup>
2
+ import { storeToRefs } from "pinia";
3
+ import { useConferenceHelpers } from "../../composables/useConferenceHelpers";
4
+ import { useDateFormat } from "../../composables/useDateFormat";
5
+ import { Conference } from "../../models/conference";
6
+
7
+ const router = useRouter();
8
+ const route = useRoute();
9
+
10
+ // data
11
+ const { pastEvents } = storeToRefs(useConferencesStore());
12
+ const { isLoggedIn } = storeToRefs(useAuthStore());
13
+ const loginModalVisible = ref<boolean>(false);
14
+ const conferenceToLoginTo = ref<Conference | null>(null);
15
+
16
+ // methods
17
+ const { formatDate } = useDateFormat();
18
+ const { pagesConfigValue, globalConfigValue } = storeToRefs(
19
+ useTemplateConfigsStore()
20
+ );
21
+ const {
22
+ isSingleDayEvent,
23
+ showViewArchiveButton,
24
+ getViewArchiveUrl,
25
+ getViewArchiveButtonText,
26
+ getConferenceRegUrl,
27
+ getConferenceRegText,
28
+ showConferenceRegButton,
29
+ } = useConferenceHelpers(pastEvents);
30
+
31
+ const goEventPage = (conference: Conference) => {
32
+ router.push(`/upcoming-events/${conference.id}`);
33
+ };
34
+
35
+ const setConferenceToLoginTo = (conference: Conference) => {
36
+ conferenceToLoginTo.value = conference;
37
+ loginModalVisible.value = true;
38
+ };
39
+
40
+ // computed
41
+ const buttonClass = computed(() => {
42
+ return pagesConfigValue.value("main.countdown_timer")
43
+ ? "mb-2 w-5/6 sm:mr-1 sm:w-auto md:mr-0 md:w-full xl:mr-1 xl:w-auto btn btn-secondary"
44
+ : "mb-2 w-5/6 sm:mr-1 sm:w-auto btn btn-secondary";
45
+ });
46
+
47
+ const isHomePage = computed(() => {
48
+ return route.name === "index";
49
+ });
50
+ </script>
51
+
52
+ <template>
53
+ <div class="flex w-full flex-col">
54
+ <div class="container flex-1 mx-auto">
55
+ <div
56
+ v-for="conference in pastEvents"
57
+ :key="conference.id"
58
+ class="flex flex-col items-start md:flex-row py-8"
59
+ >
60
+ <div class="flex w-full md:w-1/3 pb-3 px-3 md:px-6 overflow-hidden">
61
+ <img
62
+ class="flex-1 self-center mx-auto w-full"
63
+ :src="conference.photo"
64
+ />
65
+ </div>
66
+ <div
67
+ class="flex flex-col w-full justify-center items-center self-center text-center pt-3 md:w-2/3 md:px-6 md:text-left md:justify-start md:items-start"
68
+ >
69
+ <div class="w-full border-1 border-b border-color-accent-2">
70
+ <nuxt-link
71
+ :to="`/past-events/${conference.id}`"
72
+ class="no-underline"
73
+ >
74
+ <h2
75
+ class="text-2xl lg:text-3xl font-medium mb-2 conf-name-alignment"
76
+ >
77
+ {{ conference.name }}
78
+ </h2>
79
+ </nuxt-link>
80
+ <p
81
+ class="text-base leading-normal tracking-wide font-light uppercase md:text-md lg:text-lg"
82
+ >
83
+ {{ formatDate(conference.start_date) }}
84
+ <span v-if="!isSingleDayEvent(conference)">
85
+ - {{ formatDate(conference.end_date) }}</span
86
+ >
87
+ </p>
88
+ </div>
89
+ <div class="flex flex-col md:flex-row w-full mt-4">
90
+ <div class="mt-2 mr-0 md:mr-4 flex-col sm:flex-auto sm:flex-row">
91
+ <button :class="buttonClass" @click="goEventPage(conference)">
92
+ View Info
93
+ </button>
94
+ <!-- view or preview archive -->
95
+ <a
96
+ v-if="showViewArchiveButton(conference)"
97
+ :href="getViewArchiveUrl(conference)"
98
+ :target="
99
+ /^http/.test(getViewArchiveUrl(conference))
100
+ ? '_blank'
101
+ : '_self'
102
+ "
103
+ >
104
+ <button :class="buttonClass">
105
+ {{ getViewArchiveButtonText(conference) }}
106
+ </button>
107
+ </a>
108
+
109
+ <!-- login -->
110
+ <button
111
+ v-if="
112
+ isHomePage &&
113
+ !isLoggedIn &&
114
+ !globalConfigValue('townhall_registration_enabled')
115
+ "
116
+ :class="buttonClass"
117
+ @click="setConferenceToLoginTo(conference)"
118
+ >
119
+ Log In
120
+ </button>
121
+
122
+ <!-- register -->
123
+ <a
124
+ v-if="showConferenceRegButton(conference)"
125
+ :href="getConferenceRegUrl(conference)"
126
+ :target="
127
+ /^http/.test(getConferenceRegUrl(conference))
128
+ ? '_blank'
129
+ : '_self'
130
+ "
131
+ >
132
+ <button :class="buttonClass">
133
+ {{ getConferenceRegText(conference) }}
134
+ </button>
135
+ </a>
136
+ </div>
137
+ </div>
138
+ </div>
139
+ </div>
140
+ </div>
141
+ <CommonModal
142
+ :visible="loginModalVisible"
143
+ @trigger="loginModalVisible = false"
144
+ >
145
+ <template #modal-body>
146
+ <CommonLoginFullWidth :conference="conferenceToLoginTo" />
147
+ </template>
148
+ </CommonModal>
149
+ </div>
150
+ </template>
@@ -0,0 +1,145 @@
1
+ <script lang="ts" setup>
2
+ import { storeToRefs } from "pinia";
3
+ import { useDateFormat } from "../../composables/useDateFormat";
4
+ import { useConferenceHelpers } from "../../composables/useConferenceHelpers";
5
+ import { Conference } from "../../models/conference";
6
+
7
+ const router = useRouter();
8
+
9
+ // data
10
+ const { upcomingEvents } = storeToRefs(useConferencesStore());
11
+ const { isLoggedIn } = storeToRefs(useAuthStore());
12
+ const loginModalVisible = ref<boolean>(false);
13
+ const conferenceToLoginTo = ref<Conference | null>(null);
14
+
15
+ // methods
16
+ const { pagesConfigValue, globalConfigValue } = storeToRefs(
17
+ useTemplateConfigsStore()
18
+ );
19
+ const { formatDate } = useDateFormat();
20
+ const {
21
+ isSingleDayEvent,
22
+ showConferenceViewButton,
23
+ getConferenceWebcastUrl,
24
+ getConferenceWebcastButtonText,
25
+ getConferenceRegUrl,
26
+ getConferenceRegText,
27
+ showConferenceRegButton,
28
+ } = useConferenceHelpers(upcomingEvents);
29
+ const goEventPage = (conference: Conference) => {
30
+ router.push(`/upcoming-events/${conference.id}`);
31
+ };
32
+ const setConferenceToLoginTo = (conference: Conference) => {
33
+ conferenceToLoginTo.value = conference;
34
+ loginModalVisible.value = true;
35
+ };
36
+
37
+ // computed
38
+ const buttonClass = computed(() => {
39
+ return pagesConfigValue.value("main.countdown_timer")
40
+ ? "mb-2 w-5/6 sm:mr-1 sm:w-auto md:mr-0 md:w-full xl:mr-1 xl:w-auto btn btn-secondary"
41
+ : "mb-2 w-5/6 sm:mr-1 sm:w-auto btn btn-secondary";
42
+ });
43
+ </script>
44
+
45
+ <template>
46
+ <div class="flex w-full flex-col">
47
+ <div class="container flex-1 mx-auto">
48
+ <div
49
+ v-for="conference in upcomingEvents"
50
+ :key="conference.id"
51
+ class="flex flex-col items-start md:flex-row py-8"
52
+ >
53
+ <div class="flex w-full md:w-1/3 pb-3 px-3 md:px-6 overflow-hidden">
54
+ <img
55
+ class="flex-1 self-center mx-auto w-full"
56
+ :src="conference.photo"
57
+ />
58
+ </div>
59
+
60
+ <div
61
+ class="flex flex-col w-full justify-center items-center self-center text-center pt-3 md:w-2/3 md:px-6 md:text-left md:justify-start md:items-start"
62
+ >
63
+ <div class="w-full border-1 border-b border-color-accent-2">
64
+ <nuxt-link
65
+ :to="`/upcoming-events/${conference.id}`"
66
+ class="no-underline"
67
+ >
68
+ <h2
69
+ class="text-2xl lg:text-3xl font-medium mb-2 conf-name-alignment"
70
+ >
71
+ {{ conference.name }}
72
+ </h2>
73
+ </nuxt-link>
74
+ <p
75
+ class="text-base leading-normal tracking-wide font-light uppercase md:text-md lg:text-lg"
76
+ >
77
+ {{ formatDate(conference.start_date) }}
78
+ <span v-if="!isSingleDayEvent(conference)">
79
+ - {{ formatDate(conference.end_date) }}</span
80
+ >
81
+ </p>
82
+ </div>
83
+ <div class="flex flex-col md:flex-row w-full mt-4">
84
+ <div class="mt-2 mr-0 md:mr-4 flex-col xl:flex-auto xl:flex-row">
85
+ <button :class="buttonClass" @click="goEventPage(conference)">
86
+ View Info
87
+ </button>
88
+ <a
89
+ v-if="showConferenceViewButton(conference)"
90
+ :href="getConferenceWebcastUrl(conference)"
91
+ >
92
+ <button :class="buttonClass">
93
+ {{ getConferenceWebcastButtonText(conference) }}
94
+ </button>
95
+ </a>
96
+ <button
97
+ v-if="
98
+ !isLoggedIn &&
99
+ !globalConfigValue('townhall_registration_enabled')
100
+ "
101
+ :class="buttonClass"
102
+ @click="setConferenceToLoginTo(conference)"
103
+ >
104
+ Log In
105
+ </button>
106
+ <a
107
+ :href="getConferenceRegUrl(conference)"
108
+ :target="
109
+ /^http/.test(getConferenceRegUrl(conference))
110
+ ? '_blank'
111
+ : '_self'
112
+ "
113
+ >
114
+ <button
115
+ v-if="showConferenceRegButton(conference)"
116
+ :class="buttonClass"
117
+ >
118
+ {{ getConferenceRegText(conference) }}
119
+ </button>
120
+ </a>
121
+ </div>
122
+ <div
123
+ v-if="pagesConfigValue('main.countdown_timer')"
124
+ class="text-right mt-3 md:mt-2"
125
+ >
126
+ <CommonCountdownTimer
127
+ :date="conference.start_date"
128
+ :is-compact="true"
129
+ ></CommonCountdownTimer>
130
+ </div>
131
+ </div>
132
+ </div>
133
+ </div>
134
+ </div>
135
+
136
+ <CommonModal
137
+ :visible="loginModalVisible"
138
+ @trigger="loginModalVisible = false"
139
+ >
140
+ <template #modal-body>
141
+ <CommonLoginFullWidth :conference="conferenceToLoginTo" />
142
+ </template>
143
+ </CommonModal>
144
+ </div>
145
+ </template>
@@ -0,0 +1,19 @@
1
+ <script lang="ts" setup>
2
+ import { PropType } from "vue";
3
+
4
+ type Props = {
5
+ errors: Array<string>;
6
+ };
7
+
8
+ const props = defineProps<Props>();
9
+
10
+ const { errors } = toRefs(props);
11
+ </script>
12
+
13
+ <template>
14
+ <div>
15
+ <div v-if="errors" class="my-1 text-red-dark">
16
+ <div v-for="error in errors">{{ error }}</div>
17
+ </div>
18
+ </div>
19
+ </template>
@@ -0,0 +1,25 @@
1
+ <script setup lang="ts">
2
+ interface Props {
3
+ success?: boolean;
4
+ }
5
+
6
+ const props = withDefaults(defineProps<Props>(), {
7
+ success: true,
8
+ });
9
+
10
+ const { success } = toRefs(props);
11
+
12
+ const errorClass = computed(() => {
13
+ return "bg-red-100 border border-red-400 text-red-600 font-bold px-4 py-3 mb-4 rounded relative";
14
+ });
15
+
16
+ const successClass = computed(() => {
17
+ return "bg-green-100 border border-green-400 text-green-600 font-bold px-4 py-3 mb-4 rounded relative";
18
+ });
19
+ </script>
20
+
21
+ <template>
22
+ <div :class="success ? successClass : errorClass">
23
+ <slot class="pb-0" />
24
+ </div>
25
+ </template>
@@ -0,0 +1,30 @@
1
+ <script lang="ts" setup>
2
+ import CloseIcon from "../../assets/svg/close-icon.svg";
3
+
4
+ const value = ref<string>("");
5
+
6
+ const emit = defineEmits<{
7
+ (e: "onChange", value: string): void;
8
+ (e: "clear"): void;
9
+ }>();
10
+
11
+ const clear = () => {
12
+ value.value = "";
13
+ emit("clear");
14
+ };
15
+ </script>
16
+
17
+ <template>
18
+ <div class="relative">
19
+ <input
20
+ v-model="value"
21
+ type="text"
22
+ class="w-full pl-2 pr-5 py-3"
23
+ placeholder="Search..."
24
+ @input="emit('onChange', value)"
25
+ />
26
+ <span class="pin-r absolute mt-3 mr-5 cursor-pointer" @click="clear">
27
+ <close-icon class="fill-current text-black" />
28
+ </span>
29
+ </div>
30
+ </template>
@@ -0,0 +1,109 @@
1
+ <script lang="ts" setup>
2
+ import { get } from "lodash";
3
+
4
+ const form = ref({
5
+ name: "",
6
+ email: "",
7
+ phone: "",
8
+ message: "",
9
+ });
10
+ const submitted = ref<boolean>(false);
11
+ const errors = ref<[]>([]);
12
+
13
+ const supportStore = useSupportStore();
14
+
15
+ const handleForm = () => {
16
+ errors.value = [];
17
+ supportStore
18
+ .submit(form.value)
19
+ .then(() => {
20
+ submitted.value = true;
21
+ })
22
+ .catch((error) => {
23
+ errors.value = get(error.response.data, "errors", {});
24
+ errors.value.response = [
25
+ "Error: " + get(error.response.data, "message", ""),
26
+ ];
27
+ });
28
+ };
29
+
30
+ const acceptNumber = () => {
31
+ const x = form.value.phone
32
+ .replace(/\D/g, "")
33
+ .match(/(\d{0,3})(\d{0,3})(\d{0,4})/);
34
+ form.value.phone = !x[2]
35
+ ? x[1]
36
+ : "(" + x[1] + ") " + x[2] + (x[3] ? "-" + x[3] : "");
37
+ };
38
+ </script>
39
+
40
+ <template>
41
+ <section>
42
+ <form v-if="!submitted" @submit.prevent="handleForm">
43
+ <div class="font-bold mb-4">
44
+ To contact support, please fill out the form below.
45
+ </div>
46
+
47
+ <div class="mb-3">
48
+ <label class="block font-semibold text-grey-darkest mb-1">Name</label>
49
+
50
+ <CommonTextInput
51
+ v-model="form.name"
52
+ placeholder="Name"
53
+ :required="true"
54
+ type="text"
55
+ />
56
+
57
+ <CommonErrorField :errors="errors['name']" />
58
+ </div>
59
+
60
+ <div class="mb-3">
61
+ <label class="block font-semibold text-grey-darkest mb-1">Email</label>
62
+
63
+ <CommonTextInput
64
+ v-model="form.email"
65
+ placeholder="you@company.com"
66
+ :required="true"
67
+ type="email"
68
+ />
69
+
70
+ <CommonErrorField :errors="errors['email']" />
71
+ </div>
72
+
73
+ <div class="mb-3">
74
+ <label class="block font-semibold text-grey-darkest mb-1">Phone</label>
75
+
76
+ <CommonTextInput
77
+ v-model="form.phone"
78
+ placeholder="Phone"
79
+ :required="false"
80
+ type="text"
81
+ @input="acceptNumber"
82
+ />
83
+ </div>
84
+
85
+ <div class="mb-3">
86
+ <label class="block font-semibold text-grey-darkest mb-1"
87
+ >Message</label
88
+ >
89
+
90
+ <CommonTextArea v-model="form.message" />
91
+
92
+ <CopmmonErrorField :errors="errors['message']" />
93
+ </div>
94
+
95
+ <div class="mb-3">
96
+ <CommonErrorField :errors="errors['response']" />
97
+ </div>
98
+ <button class="btn btn-secondary" type="submit">Submit</button>
99
+ </form>
100
+
101
+ <!-- Submitted Message -->
102
+ <div v-if="submitted" class="text-center my-12">
103
+ <div class="text-2xl font-bold text-grey-darkest mb-2">Thank you.</div>
104
+ <div class="text-lg font-semibold text-grey-darker">
105
+ Your message has been received.
106
+ </div>
107
+ </div>
108
+ </section>
109
+ </template>
@@ -0,0 +1,26 @@
1
+ <script lang="ts" setup>
2
+ type Props = {
3
+ modelValue: string;
4
+ };
5
+
6
+ const emit = defineEmits<{
7
+ (event: "update:modelValue", value: string): void;
8
+ }>();
9
+
10
+ const props = defineProps<Props>();
11
+
12
+ const onInput = (e) => {
13
+ emit("update:modelValue", e.target.value);
14
+ };
15
+ </script>
16
+
17
+ <template>
18
+ <span>
19
+ <textarea
20
+ :value="props.modelValue"
21
+ class="form-input"
22
+ rows="4"
23
+ @change="onInput"
24
+ ></textarea>
25
+ </span>
26
+ </template>