@icvdeveloper/common-module 0.0.53 → 0.0.54

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 (68) hide show
  1. package/README.md +6 -6
  2. package/dist/module.json +1 -1
  3. package/dist/runtime/assets/svg/answer.svg +14 -14
  4. package/dist/runtime/assets/svg/avatar.svg +1 -1
  5. package/dist/runtime/assets/svg/bell-icon.svg +3 -3
  6. package/dist/runtime/assets/svg/checkmark-icon.svg +1 -1
  7. package/dist/runtime/assets/svg/close-icon.svg +1 -1
  8. package/dist/runtime/assets/svg/icon-avatar.svg +1 -1
  9. package/dist/runtime/assets/svg/icon-chevron.svg +4 -4
  10. package/dist/runtime/assets/svg/icon-close.svg +1 -1
  11. package/dist/runtime/assets/svg/icon-info.svg +2 -2
  12. package/dist/runtime/assets/svg/icon-new-window.svg +11 -11
  13. package/dist/runtime/assets/svg/icon-offline.svg +3 -3
  14. package/dist/runtime/assets/svg/icon-online.svg +3 -3
  15. package/dist/runtime/assets/svg/icon-person.svg +2 -2
  16. package/dist/runtime/assets/svg/icon-play.svg +2 -2
  17. package/dist/runtime/assets/svg/icon-star-filled.svg +29 -29
  18. package/dist/runtime/assets/svg/icon-star.svg +24 -24
  19. package/dist/runtime/assets/svg/icon-video-chat.svg +14 -14
  20. package/dist/runtime/assets/svg/icon-website.svg +2 -2
  21. package/dist/runtime/assets/svg/icon-zoom.svg +10 -10
  22. package/dist/runtime/assets/svg/notification-icon.svg +32 -32
  23. package/dist/runtime/assets/svg/offline-icon.svg +1 -1
  24. package/dist/runtime/assets/svg/online-icon.svg +3 -3
  25. package/dist/runtime/assets/svg/peer2peer.svg +3 -3
  26. package/dist/runtime/assets/svg/phone.svg +1 -1
  27. package/dist/runtime/assets/svg/plus-icon.svg +1 -1
  28. package/dist/runtime/assets/svg/red-icon.svg +3 -3
  29. package/dist/runtime/assets/svg/reject.svg +14 -14
  30. package/dist/runtime/assets/svg/search-icon.svg +3 -3
  31. package/dist/runtime/components/affiliates/AffiliatePage.vue +17 -17
  32. package/dist/runtime/components/agenda/AgendaTabbed.vue +300 -300
  33. package/dist/runtime/components/agenda/components/InfoLink.vue +56 -56
  34. package/dist/runtime/components/agenda/components/PlayIcon.vue +49 -49
  35. package/dist/runtime/components/agenda/components/PresentationLink.vue +137 -137
  36. package/dist/runtime/components/agenda/components/Sponsor.vue +132 -132
  37. package/dist/runtime/components/auth/LoginFullWidth.vue +78 -78
  38. package/dist/runtime/components/auth/PasswordReset.vue +60 -60
  39. package/dist/runtime/components/auth/Registration.vue +27 -27
  40. package/dist/runtime/components/auth/Ucc.vue +52 -52
  41. package/dist/runtime/components/core/Accordion.vue +97 -97
  42. package/dist/runtime/components/core/CountdownTimer.vue +308 -308
  43. package/dist/runtime/components/core/DynamicHtml.vue +1 -1
  44. package/dist/runtime/components/core/Modal.vue +111 -111
  45. package/dist/runtime/components/core/Navbar.vue +154 -154
  46. package/dist/runtime/components/core/SvgIcon.vue +145 -145
  47. package/dist/runtime/components/core/ZoomModal.vue +37 -37
  48. package/dist/runtime/components/events/EventHeader.vue +133 -133
  49. package/dist/runtime/components/events/ListEvents.vue +477 -477
  50. package/dist/runtime/components/forms/AlertBox.vue +21 -21
  51. package/dist/runtime/components/forms/ErrorField.vue +17 -17
  52. package/dist/runtime/components/forms/Message.vue +27 -27
  53. package/dist/runtime/components/forms/SearchInput.vue +38 -38
  54. package/dist/runtime/components/forms/SupportForm.vue +112 -112
  55. package/dist/runtime/components/forms/SwitchInput.vue +42 -42
  56. package/dist/runtime/components/forms/TextArea.vue +26 -26
  57. package/dist/runtime/components/forms/TextInput.vue +28 -28
  58. package/dist/runtime/components/layouts/Accordion.vue +78 -78
  59. package/dist/runtime/components/presenters/PresenterListing.vue +164 -164
  60. package/dist/runtime/components/presenters/PresenterModal.vue +225 -225
  61. package/dist/runtime/components/profile/Profile.vue +149 -149
  62. package/dist/runtime/components/profile/components/Sidebar.vue +27 -27
  63. package/dist/runtime/components/profile/components/SidebarNavItem.vue +39 -39
  64. package/dist/runtime/components/profile/tabs/Favorites.vue +21 -21
  65. package/dist/runtime/components/profile/tabs/GeneralInformation.vue +122 -122
  66. package/dist/runtime/components/profile/tabs/ProfileImage.vue +75 -75
  67. package/dist/runtime/components/support/FAQAccordion.vue +137 -137
  68. package/package.json +1 -1
@@ -1,479 +1,479 @@
1
- <script lang="ts" setup>
2
- import { ref, toRefs, computed } from "vue";
3
- import { storeToRefs } from "pinia";
4
- import { useConferencesStore } from "../../store/conferences";
5
- import { useTemplateConfigsStore } from "../../store/templateConfigs";
6
- import { useDateFormat } from "../../composables/useDateFormat";
7
- import { useConferenceHelpers } from "../../composables/useConferenceHelpers";
8
- import { useEvents } from "../../composables/useEvents";
9
- import { useClassBinding } from "../../composables/useClassBinding";
10
- import CommonSponsor from "../agenda/components/Sponsor.vue";
11
- import { Conference } from "../../models/conference";
12
- import { Position } from "../../enums/general";
13
- import {
14
- listEventsClassObj,
15
- listEventsCompObj,
16
- countdownTimerClassObj,
17
- sponsorClassObj,
18
- } from "../../@types/components";
19
-
20
- interface Props {
21
- showSponsors?: boolean;
22
- showBrand?: boolean;
23
- showCountdown?: boolean;
24
- mediaButton?: boolean;
25
- registerButton?: boolean;
26
- loginButton?: boolean;
27
- viewInfoButton?: boolean;
28
- isUpcoming?: boolean;
29
- showEventImage?: boolean;
30
- sponsorPosition?: Position;
31
- borderPosition?: Position;
32
- countdownPosition?: Position;
33
- classObject?: listEventsClassObj;
34
- }
35
-
36
- const props = withDefaults(defineProps<Props>(), {
37
- showSponsors: true,
38
- showBrand: true,
39
- showCountdown: true,
40
- mediaButton: true,
41
- registerButton: true,
42
- loginButton: true,
43
- viewInfoButton: true,
44
- isUpcoming: true,
45
- showEventImage: true,
46
- sponsorPosition: Position.RIGHT,
47
- borderPosition: Position.MIDDLE,
48
- countdownPosition: Position.BOTTOM,
49
- classObject: () => {
50
- return {
51
- components: ref<listEventsCompObj>({
52
- countdownTimer: ref<countdownTimerClassObj>({}),
53
- sponsor: ref<sponsorClassObj>({}),
54
- }),
55
- };
56
- },
57
- });
58
-
59
- const {
60
- showSponsors,
61
- showBrand,
62
- showCountdown,
63
- mediaButton,
64
- registerButton,
65
- loginButton,
66
- viewInfoButton,
67
- isUpcoming,
68
- showEventImage,
69
- sponsorPosition,
70
- borderPosition,
71
- countdownPosition,
72
- classObject,
73
- } = toRefs(props);
74
-
75
- // data
76
- const { pastEvents, upcomingEvents } = storeToRefs(useConferencesStore());
77
-
78
- // methods
79
- const { globalConfigValue, pagesConfigValue } = storeToRefs(
80
- useTemplateConfigsStore()
81
- );
82
- const { formatDate } = useDateFormat();
83
- const {
84
- isSingleDayEvent,
85
- showConferenceViewButton,
86
- getConferenceWebcastUrl,
87
- getConferenceWebcastButtonText,
88
- showViewArchiveButton,
89
- getViewArchiveUrl,
90
- getViewArchiveButtonText,
91
- getConferenceRegUrl,
92
- getConferenceRegText,
93
- showConferenceRegButton,
94
- } = useConferenceHelpers();
95
-
96
- const {
97
- isLoggedIn,
98
- loginModalVisible,
99
- conferenceToLoginTo,
100
- goEventPage,
101
- setConferenceToLoginTo,
102
- buttonClass,
103
- orderAffiliates,
104
- getBrand,
105
- isHomePage,
106
- } = useEvents();
107
-
108
- const { classBinding } = useClassBinding();
109
-
110
- const showViewButton = (_conference: Conference): boolean => {
111
- return isUpcoming.value
112
- ? showConferenceViewButton(_conference)
113
- : showViewArchiveButton(_conference);
114
- };
115
-
116
- const getVideoUrl = (_conference: Conference): string => {
117
- return isUpcoming.value
118
- ? getConferenceWebcastUrl(_conference)
119
- : getViewArchiveUrl(_conference);
120
- };
121
-
122
- const getVideoButtonText = (_conference: Conference): string => {
123
- return isUpcoming.value
124
- ? getConferenceWebcastButtonText(_conference)
125
- : getViewArchiveButtonText(_conference);
126
- };
127
-
128
- // computed
129
- const eventType = computed((): Conference[] => {
130
- return isUpcoming.value ? upcomingEvents.value : pastEvents.value;
131
- });
132
-
133
- const showLoginButton = computed((): boolean => {
134
- const archivedHomepage: boolean =
135
- isUpcoming.value || (!isUpcoming.value && isHomePage.value);
136
- return (
137
- archivedHomepage &&
138
- loginButton.value &&
139
- !isLoggedIn.value &&
140
- !globalConfigValue.value("townhall_registration_enabled")
141
- );
142
- });
143
- </script>
144
-
145
- <template>
146
- <!-- list container -->
147
- <div class="flex w-full flex-col">
148
- <!-- list container -->
149
- <div
150
- :class="
151
- classBinding(classObject, 'listContainer', 'container flex-1 mx-auto')
152
- "
153
- >
154
- <!-- individual event container -->
155
- <div
156
- v-for="conference in eventType"
157
- :key="conference.id"
158
- :class="[
159
- {
160
- 'border-1 border-t border-color-accent-2':
161
- borderPosition === Position.TOP,
162
- },
163
- classBinding(
164
- classObject,
165
- 'eventContainer',
166
- 'flex flex-col items-center md:flex-row py-4'
167
- ),
168
- ]"
169
- >
170
- <!-- event image -->
171
- <div
172
- v-if="showEventImage"
173
- :class="
174
- classBinding(
175
- classObject,
176
- 'eventImageContainer',
177
- 'flex w-full md:w-1/3 pb-3 px-3 md:px-6 overflow-hidden'
178
- )
179
- "
180
- >
181
- <img
182
- :class="
183
- classBinding(
184
- classObject,
185
- 'eventImage',
186
- 'flex-1 self-center mx-auto w-full'
187
- )
188
- "
189
- :src="conference.photo"
190
- />
191
- </div>
192
- <!-- event details container -->
193
- <div
194
- :class="[
195
- { 'md:w-2/3': showEventImage },
196
- classBinding(
197
- classObject,
198
- 'eventContentContainer',
199
- 'flex flex-col justify-center text-center w-full md:pr-6 md:text-left md:justify-start md:items-start'
200
- ),
201
- ]"
202
- >
203
- <!-- event brand, name, date and countdown container -->
204
- <div
205
- :class="[
206
- {
207
- 'border-1 border-b border-color-accent-2 mb-6':
208
- borderPosition === Position.MIDDLE,
209
- },
210
- classBinding(
211
- classObject,
212
- 'eventDetailsContainer',
213
- 'w-full flex flex-col lg:flex-row'
214
- ),
215
- ]"
216
- >
217
- <!-- event details -->
218
- <div
219
- :class="classBinding(classObject, 'eventDetails', 'flex-grow')"
220
- >
221
- <h3
222
- v-if="showBrand && getBrand(conference.affiliates).length"
223
- :class="
224
- classBinding(
225
- classObject,
226
- 'eventBrand',
227
- 'text-base font-bold leading-tight tracking-wide mb-3'
228
- )
229
- "
230
- >
231
- {{ getBrand(conference.affiliates) }}
232
- </h3>
233
- <nuxt-link
234
- :to="`/${isUpcoming ? 'upcoming-events' : 'past-events'}/${
235
- conference.id
236
- }`"
237
- class="no-underline"
238
- >
239
- <h2
240
- :class="
241
- classBinding(
242
- classObject,
243
- 'eventName',
244
- 'text-2xl lg:text-3xl font-medium mb-2 conf-name-alignment'
245
- )
246
- "
247
- >
248
- {{ conference.name }}
249
- </h2>
250
- </nuxt-link>
251
- <p
252
- :class="
253
- classBinding(
254
- classObject,
255
- 'eventDate',
256
- 'text-base leading-normal tracking-wide font-light uppercase md:text-md lg:text-lg'
257
- )
258
- "
259
- >
260
- {{ formatDate(conference.start_date) }}
261
- <span v-if="!isSingleDayEvent(conference)">
262
- - {{ formatDate(conference.end_date) }}</span
263
- >
264
- </p>
265
- </div>
266
- <!-- countdown timer - top-aligned -->
267
- <div
268
- v-if="
269
- isUpcoming &&
270
- showCountdown &&
271
- countdownPosition === Position.TOP &&
272
- pagesConfigValue('main.countdown_timer')
273
- "
274
- :class="
275
- classBinding(
276
- classObject,
277
- 'countdownContainerTop',
278
- 'flex-auto flex items-center self-center mb-4 lg:mb-0'
279
- )
280
- "
281
- >
282
- <CommonCountdownTimer
283
- :date="conference.start_date"
284
- :is-compact="true"
285
- :class-object="classObject.components.countdownTimer"
286
- ></CommonCountdownTimer>
287
- </div>
288
- </div>
289
- <!-- event button, countdown timer, and sponsors container -->
290
- <div
291
- :class="
292
- classBinding(
293
- classObject,
294
- 'buttonCountdownSponsorsContainer',
295
- 'flex flex-col w-full'
296
- )
297
- "
298
- >
299
- <div
300
- :class="
301
- classBinding(
302
- classObject,
303
- 'buttonCountdownContainer',
304
- 'flex-1 flex flex-col justify-between xl:flex-row w-full'
305
- )
306
- "
307
- >
308
- <div
309
- :class="
310
- classBinding(
311
- classObject,
312
- 'buttonContainer',
313
- 'flex-auto mr-0 xl:mr-4'
314
- )
315
- "
316
- >
317
- <!-- view info button -->
318
- <button
319
- v-if="viewInfoButton"
320
- :class="classBinding(classObject, 'buttonItem', buttonClass)"
321
- @click="goEventPage(conference)"
322
- >
323
- View Info
324
- </button>
325
- <!-- view live/preview archive button -->
326
- <a
327
- v-if="mediaButton && showViewButton(conference)"
328
- :href="getVideoUrl(conference)"
329
- :target="
330
- /^http/.test(!isUpcoming && getVideoUrl(conference))
331
- ? '_blank'
332
- : '_self'
333
- "
334
- >
335
- <button
336
- :class="
337
- classBinding(classObject, 'buttonItem', buttonClass)
338
- "
339
- >
340
- {{ getVideoButtonText(conference) }}
341
- </button>
342
- </a>
343
-
344
- <!-- login button -->
345
- <button
346
- v-if="showLoginButton"
347
- :class="classBinding(classObject, 'buttonItem', buttonClass)"
348
- @click="setConferenceToLoginTo(conference)"
349
- >
350
- Log In
351
- </button>
352
-
353
- <!-- register button -->
354
- <a
355
- v-if="registerButton && showConferenceRegButton(conference)"
356
- :href="getConferenceRegUrl(conference)"
357
- :target="
358
- /^http/.test(getConferenceRegUrl(conference))
359
- ? '_blank'
360
- : '_self'
361
- "
362
- >
363
- <button
364
- :class="
365
- classBinding(classObject, 'buttonItem', buttonClass)
366
- "
367
- >
368
- {{ getConferenceRegText(conference) }}
369
- </button>
370
- </a>
371
- </div>
372
- <!-- countdown timer - right-aligned -->
373
- <div
374
- v-if="
375
- isUpcoming &&
376
- showCountdown &&
377
- countdownPosition === Position.RIGHT &&
378
- pagesConfigValue('main.countdown_timer')
379
- "
380
- class="flex-auto md:flex mt-3 md:mt-2"
381
- :class="
382
- classBinding(
383
- classObject,
384
- 'countdownContainerRight',
385
- 'flex-auto flex items-center self-center mb-4 lg:mb-0'
386
- )
387
- "
388
- >
389
- <CommonCountdownTimer
390
- :date="conference.start_date"
391
- :is-compact="true"
392
- :class-object="classObject.components.countdownTimer"
393
- ></CommonCountdownTimer>
394
- </div>
395
- </div>
396
- <!-- countdown timer - bottom-aligned -->
397
- <div
398
- v-if="
399
- isUpcoming &&
400
- showCountdown &&
401
- countdownPosition === Position.BOTTOM &&
402
- pagesConfigValue('main.countdown_timer')
403
- "
404
- :class="
405
- classBinding(
406
- classObject,
407
- 'countdownContainerBottom',
408
- 'flex-auto md:flex my-3 md:my-2'
409
- )
410
- "
411
- >
412
- <CommonCountdownTimer
413
- :date="conference.start_date"
414
- :is-compact="true"
415
- :class-object="classObject.components.countdownTimer"
416
- ></CommonCountdownTimer>
417
- </div>
418
- <!-- sponsors container - bottom-aligned -->
419
- <div
420
- v-if="showSponsors && sponsorPosition === Position.BOTTOM"
421
- class=""
422
- :class="
423
- classBinding(
424
- classObject,
425
- 'sponsorsContainer',
426
- 'grid grid-cols-1 md:grid-cols-3 lg:grid-cols-5 gap-y-1.5 gap-x-3'
427
- )
428
- "
429
- >
430
- <!-- individual sponsor -->
431
- <template
432
- v-for="affiliate in orderAffiliates(conference.affiliates)"
433
- >
434
- <CommonSponsor
435
- v-if="affiliate.role == 'sponsor'"
436
- :key="affiliate.id"
437
- :sponsor="affiliate"
438
- :class-object="classObject.components.sponsor"
439
- ></CommonSponsor>
440
- </template>
441
- </div>
442
- </div>
443
- </div>
444
- <!-- sponsors container - right-aligned -->
445
- <div
446
- v-if="showSponsors && sponsorPosition === Position.RIGHT"
447
- class="flex flex-col"
448
- >
449
- <!-- individual sponsor -->
450
- <template v-for="affiliate in orderAffiliates(conference.affiliates)">
451
- <CommonSponsor
452
- v-if="affiliate.role == 'sponsor'"
453
- :key="affiliate.id"
454
- :sponsor="affiliate"
455
- :class-object="classObject.components.sponsor"
456
- ></CommonSponsor>
457
- </template>
458
- </div>
459
- </div>
460
- </div>
461
- <!-- login modal -->
462
- <CommonModal
463
- :visible="loginModalVisible"
464
- :class="classObject.components.modal"
465
- @trigger="loginModalVisible = false"
466
- >
467
- <template #modal-body>
468
- <CommonLoginFullWidth
469
- :conference="conferenceToLoginTo"
470
- :class="classObject.components.login"
471
- />
472
- </template>
473
- </CommonModal>
474
- </div>
475
- </template>
476
-
1
+ <script lang="ts" setup>
2
+ import { ref, toRefs, computed } from "vue";
3
+ import { storeToRefs } from "pinia";
4
+ import { useConferencesStore } from "../../store/conferences";
5
+ import { useTemplateConfigsStore } from "../../store/templateConfigs";
6
+ import { useDateFormat } from "../../composables/useDateFormat";
7
+ import { useConferenceHelpers } from "../../composables/useConferenceHelpers";
8
+ import { useEvents } from "../../composables/useEvents";
9
+ import { useClassBinding } from "../../composables/useClassBinding";
10
+ import CommonSponsor from "../agenda/components/Sponsor.vue";
11
+ import { Conference } from "../../models/conference";
12
+ import { Position } from "../../enums/general";
13
+ import {
14
+ listEventsClassObj,
15
+ listEventsCompObj,
16
+ countdownTimerClassObj,
17
+ sponsorClassObj,
18
+ } from "../../@types/components";
19
+
20
+ interface Props {
21
+ showSponsors?: boolean;
22
+ showBrand?: boolean;
23
+ showCountdown?: boolean;
24
+ mediaButton?: boolean;
25
+ registerButton?: boolean;
26
+ loginButton?: boolean;
27
+ viewInfoButton?: boolean;
28
+ isUpcoming?: boolean;
29
+ showEventImage?: boolean;
30
+ sponsorPosition?: Position;
31
+ borderPosition?: Position;
32
+ countdownPosition?: Position;
33
+ classObject?: listEventsClassObj;
34
+ }
35
+
36
+ const props = withDefaults(defineProps<Props>(), {
37
+ showSponsors: true,
38
+ showBrand: true,
39
+ showCountdown: true,
40
+ mediaButton: true,
41
+ registerButton: true,
42
+ loginButton: true,
43
+ viewInfoButton: true,
44
+ isUpcoming: true,
45
+ showEventImage: true,
46
+ sponsorPosition: Position.RIGHT,
47
+ borderPosition: Position.MIDDLE,
48
+ countdownPosition: Position.BOTTOM,
49
+ classObject: () => {
50
+ return {
51
+ components: ref<listEventsCompObj>({
52
+ countdownTimer: ref<countdownTimerClassObj>({}),
53
+ sponsor: ref<sponsorClassObj>({}),
54
+ }),
55
+ };
56
+ },
57
+ });
58
+
59
+ const {
60
+ showSponsors,
61
+ showBrand,
62
+ showCountdown,
63
+ mediaButton,
64
+ registerButton,
65
+ loginButton,
66
+ viewInfoButton,
67
+ isUpcoming,
68
+ showEventImage,
69
+ sponsorPosition,
70
+ borderPosition,
71
+ countdownPosition,
72
+ classObject,
73
+ } = toRefs(props);
74
+
75
+ // data
76
+ const { pastEvents, upcomingEvents } = storeToRefs(useConferencesStore());
77
+
78
+ // methods
79
+ const { globalConfigValue, pagesConfigValue } = storeToRefs(
80
+ useTemplateConfigsStore()
81
+ );
82
+ const { formatDate } = useDateFormat();
83
+ const {
84
+ isSingleDayEvent,
85
+ showConferenceViewButton,
86
+ getConferenceWebcastUrl,
87
+ getConferenceWebcastButtonText,
88
+ showViewArchiveButton,
89
+ getViewArchiveUrl,
90
+ getViewArchiveButtonText,
91
+ getConferenceRegUrl,
92
+ getConferenceRegText,
93
+ showConferenceRegButton,
94
+ } = useConferenceHelpers();
95
+
96
+ const {
97
+ isLoggedIn,
98
+ loginModalVisible,
99
+ conferenceToLoginTo,
100
+ goEventPage,
101
+ setConferenceToLoginTo,
102
+ buttonClass,
103
+ orderAffiliates,
104
+ getBrand,
105
+ isHomePage,
106
+ } = useEvents();
107
+
108
+ const { classBinding } = useClassBinding();
109
+
110
+ const showViewButton = (_conference: Conference): boolean => {
111
+ return isUpcoming.value
112
+ ? showConferenceViewButton(_conference)
113
+ : showViewArchiveButton(_conference);
114
+ };
115
+
116
+ const getVideoUrl = (_conference: Conference): string => {
117
+ return isUpcoming.value
118
+ ? getConferenceWebcastUrl(_conference)
119
+ : getViewArchiveUrl(_conference);
120
+ };
121
+
122
+ const getVideoButtonText = (_conference: Conference): string => {
123
+ return isUpcoming.value
124
+ ? getConferenceWebcastButtonText(_conference)
125
+ : getViewArchiveButtonText(_conference);
126
+ };
127
+
128
+ // computed
129
+ const eventType = computed((): Conference[] => {
130
+ return isUpcoming.value ? upcomingEvents.value : pastEvents.value;
131
+ });
132
+
133
+ const showLoginButton = computed((): boolean => {
134
+ const archivedHomepage: boolean =
135
+ isUpcoming.value || (!isUpcoming.value && isHomePage.value);
136
+ return (
137
+ archivedHomepage &&
138
+ loginButton.value &&
139
+ !isLoggedIn.value &&
140
+ !globalConfigValue.value("townhall_registration_enabled")
141
+ );
142
+ });
143
+ </script>
144
+
145
+ <template>
146
+ <!-- list container -->
147
+ <div class="flex w-full flex-col">
148
+ <!-- list container -->
149
+ <div
150
+ :class="
151
+ classBinding(classObject, 'listContainer', 'container flex-1 mx-auto')
152
+ "
153
+ >
154
+ <!-- individual event container -->
155
+ <div
156
+ v-for="conference in eventType"
157
+ :key="conference.id"
158
+ :class="[
159
+ {
160
+ 'border-1 border-t border-color-accent-2':
161
+ borderPosition === Position.TOP,
162
+ },
163
+ classBinding(
164
+ classObject,
165
+ 'eventContainer',
166
+ 'flex flex-col items-center md:flex-row py-4'
167
+ ),
168
+ ]"
169
+ >
170
+ <!-- event image -->
171
+ <div
172
+ v-if="showEventImage"
173
+ :class="
174
+ classBinding(
175
+ classObject,
176
+ 'eventImageContainer',
177
+ 'flex w-full md:w-1/3 pb-3 px-3 md:px-6 overflow-hidden'
178
+ )
179
+ "
180
+ >
181
+ <img
182
+ :class="
183
+ classBinding(
184
+ classObject,
185
+ 'eventImage',
186
+ 'flex-1 self-center mx-auto w-full'
187
+ )
188
+ "
189
+ :src="conference.photo"
190
+ />
191
+ </div>
192
+ <!-- event details container -->
193
+ <div
194
+ :class="[
195
+ { 'md:w-2/3': showEventImage },
196
+ classBinding(
197
+ classObject,
198
+ 'eventContentContainer',
199
+ 'flex flex-col justify-center text-center w-full md:pr-6 md:text-left md:justify-start md:items-start'
200
+ ),
201
+ ]"
202
+ >
203
+ <!-- event brand, name, date and countdown container -->
204
+ <div
205
+ :class="[
206
+ {
207
+ 'border-1 border-b border-color-accent-2 mb-6':
208
+ borderPosition === Position.MIDDLE,
209
+ },
210
+ classBinding(
211
+ classObject,
212
+ 'eventDetailsContainer',
213
+ 'w-full flex flex-col lg:flex-row'
214
+ ),
215
+ ]"
216
+ >
217
+ <!-- event details -->
218
+ <div
219
+ :class="classBinding(classObject, 'eventDetails', 'flex-grow')"
220
+ >
221
+ <h3
222
+ v-if="showBrand && getBrand(conference.affiliates).length"
223
+ :class="
224
+ classBinding(
225
+ classObject,
226
+ 'eventBrand',
227
+ 'text-base font-bold leading-tight tracking-wide mb-3'
228
+ )
229
+ "
230
+ >
231
+ {{ getBrand(conference.affiliates) }}
232
+ </h3>
233
+ <nuxt-link
234
+ :to="`/${isUpcoming ? 'upcoming-events' : 'past-events'}/${
235
+ conference.id
236
+ }`"
237
+ class="no-underline"
238
+ >
239
+ <h2
240
+ :class="
241
+ classBinding(
242
+ classObject,
243
+ 'eventName',
244
+ 'text-2xl lg:text-3xl font-medium mb-2 conf-name-alignment'
245
+ )
246
+ "
247
+ >
248
+ {{ conference.name }}
249
+ </h2>
250
+ </nuxt-link>
251
+ <p
252
+ :class="
253
+ classBinding(
254
+ classObject,
255
+ 'eventDate',
256
+ 'text-base leading-normal tracking-wide font-light uppercase md:text-md lg:text-lg'
257
+ )
258
+ "
259
+ >
260
+ {{ formatDate(conference.start_date) }}
261
+ <span v-if="!isSingleDayEvent(conference)">
262
+ - {{ formatDate(conference.end_date) }}</span
263
+ >
264
+ </p>
265
+ </div>
266
+ <!-- countdown timer - top-aligned -->
267
+ <div
268
+ v-if="
269
+ isUpcoming &&
270
+ showCountdown &&
271
+ countdownPosition === Position.TOP &&
272
+ pagesConfigValue('main.countdown_timer')
273
+ "
274
+ :class="
275
+ classBinding(
276
+ classObject,
277
+ 'countdownContainerTop',
278
+ 'flex-auto flex items-center self-center mb-4 lg:mb-0'
279
+ )
280
+ "
281
+ >
282
+ <CommonCountdownTimer
283
+ :date="conference.start_date"
284
+ :is-compact="true"
285
+ :class-object="classObject.components.countdownTimer"
286
+ ></CommonCountdownTimer>
287
+ </div>
288
+ </div>
289
+ <!-- event button, countdown timer, and sponsors container -->
290
+ <div
291
+ :class="
292
+ classBinding(
293
+ classObject,
294
+ 'buttonCountdownSponsorsContainer',
295
+ 'flex flex-col w-full'
296
+ )
297
+ "
298
+ >
299
+ <div
300
+ :class="
301
+ classBinding(
302
+ classObject,
303
+ 'buttonCountdownContainer',
304
+ 'flex-1 flex flex-col justify-between xl:flex-row w-full'
305
+ )
306
+ "
307
+ >
308
+ <div
309
+ :class="
310
+ classBinding(
311
+ classObject,
312
+ 'buttonContainer',
313
+ 'flex-auto mr-0 xl:mr-4'
314
+ )
315
+ "
316
+ >
317
+ <!-- view info button -->
318
+ <button
319
+ v-if="viewInfoButton"
320
+ :class="classBinding(classObject, 'buttonItem', buttonClass)"
321
+ @click="goEventPage(conference)"
322
+ >
323
+ View Info
324
+ </button>
325
+ <!-- view live/preview archive button -->
326
+ <a
327
+ v-if="mediaButton && showViewButton(conference)"
328
+ :href="getVideoUrl(conference)"
329
+ :target="
330
+ /^http/.test(!isUpcoming && getVideoUrl(conference))
331
+ ? '_blank'
332
+ : '_self'
333
+ "
334
+ >
335
+ <button
336
+ :class="
337
+ classBinding(classObject, 'buttonItem', buttonClass)
338
+ "
339
+ >
340
+ {{ getVideoButtonText(conference) }}
341
+ </button>
342
+ </a>
343
+
344
+ <!-- login button -->
345
+ <button
346
+ v-if="showLoginButton"
347
+ :class="classBinding(classObject, 'buttonItem', buttonClass)"
348
+ @click="setConferenceToLoginTo(conference)"
349
+ >
350
+ Log In
351
+ </button>
352
+
353
+ <!-- register button -->
354
+ <a
355
+ v-if="registerButton && showConferenceRegButton(conference)"
356
+ :href="getConferenceRegUrl(conference)"
357
+ :target="
358
+ /^http/.test(getConferenceRegUrl(conference))
359
+ ? '_blank'
360
+ : '_self'
361
+ "
362
+ >
363
+ <button
364
+ :class="
365
+ classBinding(classObject, 'buttonItem', buttonClass)
366
+ "
367
+ >
368
+ {{ getConferenceRegText(conference) }}
369
+ </button>
370
+ </a>
371
+ </div>
372
+ <!-- countdown timer - right-aligned -->
373
+ <div
374
+ v-if="
375
+ isUpcoming &&
376
+ showCountdown &&
377
+ countdownPosition === Position.RIGHT &&
378
+ pagesConfigValue('main.countdown_timer')
379
+ "
380
+ class="flex-auto md:flex mt-3 md:mt-2"
381
+ :class="
382
+ classBinding(
383
+ classObject,
384
+ 'countdownContainerRight',
385
+ 'flex-auto flex items-center self-center mb-4 lg:mb-0'
386
+ )
387
+ "
388
+ >
389
+ <CommonCountdownTimer
390
+ :date="conference.start_date"
391
+ :is-compact="true"
392
+ :class-object="classObject.components.countdownTimer"
393
+ ></CommonCountdownTimer>
394
+ </div>
395
+ </div>
396
+ <!-- countdown timer - bottom-aligned -->
397
+ <div
398
+ v-if="
399
+ isUpcoming &&
400
+ showCountdown &&
401
+ countdownPosition === Position.BOTTOM &&
402
+ pagesConfigValue('main.countdown_timer')
403
+ "
404
+ :class="
405
+ classBinding(
406
+ classObject,
407
+ 'countdownContainerBottom',
408
+ 'flex-auto md:flex my-3 md:my-2'
409
+ )
410
+ "
411
+ >
412
+ <CommonCountdownTimer
413
+ :date="conference.start_date"
414
+ :is-compact="true"
415
+ :class-object="classObject.components.countdownTimer"
416
+ ></CommonCountdownTimer>
417
+ </div>
418
+ <!-- sponsors container - bottom-aligned -->
419
+ <div
420
+ v-if="showSponsors && sponsorPosition === Position.BOTTOM"
421
+ class=""
422
+ :class="
423
+ classBinding(
424
+ classObject,
425
+ 'sponsorsContainer',
426
+ 'grid grid-cols-1 md:grid-cols-3 lg:grid-cols-5 gap-y-1.5 gap-x-3'
427
+ )
428
+ "
429
+ >
430
+ <!-- individual sponsor -->
431
+ <template
432
+ v-for="affiliate in orderAffiliates(conference.affiliates)"
433
+ >
434
+ <CommonSponsor
435
+ v-if="affiliate.role == 'sponsor'"
436
+ :key="affiliate.id"
437
+ :sponsor="affiliate"
438
+ :class-object="classObject.components.sponsor"
439
+ ></CommonSponsor>
440
+ </template>
441
+ </div>
442
+ </div>
443
+ </div>
444
+ <!-- sponsors container - right-aligned -->
445
+ <div
446
+ v-if="showSponsors && sponsorPosition === Position.RIGHT"
447
+ class="flex flex-col"
448
+ >
449
+ <!-- individual sponsor -->
450
+ <template v-for="affiliate in orderAffiliates(conference.affiliates)">
451
+ <CommonSponsor
452
+ v-if="affiliate.role == 'sponsor'"
453
+ :key="affiliate.id"
454
+ :sponsor="affiliate"
455
+ :class-object="classObject.components.sponsor"
456
+ ></CommonSponsor>
457
+ </template>
458
+ </div>
459
+ </div>
460
+ </div>
461
+ <!-- login modal -->
462
+ <CommonModal
463
+ :visible="loginModalVisible"
464
+ :class="classObject.components.modal"
465
+ @trigger="loginModalVisible = false"
466
+ >
467
+ <template #modal-body>
468
+ <CommonLoginFullWidth
469
+ :conference="conferenceToLoginTo"
470
+ :class="classObject.components.login"
471
+ />
472
+ </template>
473
+ </CommonModal>
474
+ </div>
475
+ </template>
476
+
477
477
  <style scoped>
478
478
  .leading-tight {
479
479
  line-height: 1.25rem;
@@ -482,4 +482,4 @@ const showLoginButton = computed((): boolean => {
482
482
  .mr-4 {
483
483
  margin-right: 1rem;
484
484
  }
485
- </style>
485
+ </style>