@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.
- package/README.md +6 -0
- package/dist/module.cjs +5 -0
- package/dist/module.d.ts +9 -0
- package/dist/module.json +8 -0
- package/dist/module.mjs +102051 -0
- package/dist/runtime/@types/configVariables.d.ts +78 -0
- package/dist/runtime/@types/configVariables.mjs +0 -0
- package/dist/runtime/analytics.d.ts +8 -0
- package/dist/runtime/analytics.mjs +38 -0
- package/dist/runtime/assets/scss/_agenda.scss +47 -0
- package/dist/runtime/assets/scss/_animations.scss +11 -0
- package/dist/runtime/assets/scss/_container_variants.scss +26 -0
- package/dist/runtime/assets/scss/_custom.scss +364 -0
- package/dist/runtime/assets/scss/_footer.scss +20 -0
- package/dist/runtime/assets/scss/_forms.scss +29 -0
- package/dist/runtime/assets/scss/_functions.scss +24 -0
- package/dist/runtime/assets/scss/_header.scss +41 -0
- package/dist/runtime/assets/scss/_index_production.scss +45 -0
- package/dist/runtime/assets/scss/_transitions.scss +24 -0
- package/dist/runtime/assets/scss/_variables.scss +62 -0
- package/dist/runtime/assets/scss/_variables2.scss +0 -0
- package/dist/runtime/assets/scss/_webcast.scss +141 -0
- package/dist/runtime/assets/scss/index.scss +42 -0
- package/dist/runtime/assets/svg/answer.svg +14 -0
- package/dist/runtime/assets/svg/avatar.svg +1 -0
- package/dist/runtime/assets/svg/bell-icon.svg +3 -0
- package/dist/runtime/assets/svg/chat-icon.svg +1 -0
- package/dist/runtime/assets/svg/checkmark-icon.svg +1 -0
- package/dist/runtime/assets/svg/close-icon.svg +1 -0
- package/dist/runtime/assets/svg/icon-avatar.svg +1 -0
- package/dist/runtime/assets/svg/icon-close.svg +1 -0
- package/dist/runtime/assets/svg/icon-down-arrow.svg +1 -0
- package/dist/runtime/assets/svg/icon-facebook.svg +1 -0
- package/dist/runtime/assets/svg/icon-info.svg +3 -0
- package/dist/runtime/assets/svg/icon-linkedin.svg +1 -0
- package/dist/runtime/assets/svg/icon-new-window.svg +11 -0
- package/dist/runtime/assets/svg/icon-offline.svg +3 -0
- package/dist/runtime/assets/svg/icon-online.svg +3 -0
- package/dist/runtime/assets/svg/icon-person.svg +3 -0
- package/dist/runtime/assets/svg/icon-play.svg +3 -0
- package/dist/runtime/assets/svg/icon-star-filled.svg +30 -0
- package/dist/runtime/assets/svg/icon-star.svg +25 -0
- package/dist/runtime/assets/svg/icon-twitter.svg +1 -0
- package/dist/runtime/assets/svg/icon-video-chat.svg +14 -0
- package/dist/runtime/assets/svg/icon-website.svg +3 -0
- package/dist/runtime/assets/svg/icon-youtube.svg +1 -0
- package/dist/runtime/assets/svg/icon-zoom.svg +10 -0
- package/dist/runtime/assets/svg/notification-icon.svg +32 -0
- package/dist/runtime/assets/svg/offline-icon.svg +1 -0
- package/dist/runtime/assets/svg/online-icon.svg +3 -0
- package/dist/runtime/assets/svg/peer2peer.svg +3 -0
- package/dist/runtime/assets/svg/phone.svg +1 -0
- package/dist/runtime/assets/svg/plus-icon.svg +1 -0
- package/dist/runtime/assets/svg/red-icon.svg +3 -0
- package/dist/runtime/assets/svg/reject.svg +14 -0
- package/dist/runtime/assets/svg/search-icon.svg +3 -0
- package/dist/runtime/components/affiliates/AffiliatePage.vue +16 -0
- package/dist/runtime/components/agenda/AgendaTabbed.vue +342 -0
- package/dist/runtime/components/agenda/components/InfoLink.vue +55 -0
- package/dist/runtime/components/agenda/components/PlayIcon.vue +48 -0
- package/dist/runtime/components/agenda/components/PresentationLink.vue +147 -0
- package/dist/runtime/components/agenda/components/Sponsor.vue +108 -0
- package/dist/runtime/components/auth/LoginFullWidth.vue +76 -0
- package/dist/runtime/components/core/CountdownTimer.vue +275 -0
- package/dist/runtime/components/core/DynamicHtml.vue +16 -0
- package/dist/runtime/components/core/DynamicHtml.vue.d.ts +2 -0
- package/dist/runtime/components/core/Modal.vue +84 -0
- package/dist/runtime/components/core/SvgIcon.vue +119 -0
- package/dist/runtime/components/core/ZoomModal.vue +37 -0
- package/dist/runtime/components/events/EventHeader.vue +131 -0
- package/dist/runtime/components/events/PastEvents.vue +150 -0
- package/dist/runtime/components/events/UpcomingEvents.vue +145 -0
- package/dist/runtime/components/forms/ErrorField.vue +19 -0
- package/dist/runtime/components/forms/Message.vue +25 -0
- package/dist/runtime/components/forms/SearchInput.vue +30 -0
- package/dist/runtime/components/forms/SupportForm.vue +109 -0
- package/dist/runtime/components/forms/TextArea.vue +26 -0
- package/dist/runtime/components/forms/TextInput.vue +22 -0
- package/dist/runtime/components/layouts/Accordion.vue +76 -0
- package/dist/runtime/components/presenters/PresenterListing.vue +89 -0
- package/dist/runtime/components/presenters/PresenterModal.vue +83 -0
- package/dist/runtime/composables/useAgenda.d.ts +81 -0
- package/dist/runtime/composables/useAgenda.mjs +178 -0
- package/dist/runtime/composables/useAnalytics.d.ts +7 -0
- package/dist/runtime/composables/useAnalytics.mjs +10 -0
- package/dist/runtime/composables/useApi.d.ts +1 -0
- package/dist/runtime/composables/useApi.mjs +16 -0
- package/dist/runtime/composables/useConferenceHelpers.d.ts +65 -0
- package/dist/runtime/composables/useConferenceHelpers.mjs +270 -0
- package/dist/runtime/composables/useDateFormat.d.ts +12 -0
- package/dist/runtime/composables/useDateFormat.mjs +21 -0
- package/dist/runtime/composables/useLogin.d.ts +30 -0
- package/dist/runtime/composables/useLogin.mjs +58 -0
- package/dist/runtime/composables/usePresentation.d.ts +53 -0
- package/dist/runtime/composables/usePresentation.mjs +98 -0
- package/dist/runtime/composables/usePresenter.d.ts +15 -0
- package/dist/runtime/composables/usePresenter.mjs +67 -0
- package/dist/runtime/composables/usePresenters.d.ts +13 -0
- package/dist/runtime/composables/usePresenters.mjs +21 -0
- package/dist/runtime/composables/useV3plusCommonModule.d.ts +2 -0
- package/dist/runtime/composables/useV3plusCommonModule.mjs +2 -0
- package/dist/runtime/models/affiliate.d.ts +1 -0
- package/dist/runtime/models/affiliate.mjs +0 -0
- package/dist/runtime/models/authUser.d.ts +16 -0
- package/dist/runtime/models/authUser.mjs +0 -0
- package/dist/runtime/models/conference.d.ts +124 -0
- package/dist/runtime/models/conference.mjs +18 -0
- package/dist/runtime/models/globalConfig.d.ts +80 -0
- package/dist/runtime/models/globalConfig.mjs +0 -0
- package/dist/runtime/models/group.d.ts +14 -0
- package/dist/runtime/models/group.mjs +0 -0
- package/dist/runtime/models/icons.d.ts +18 -0
- package/dist/runtime/models/icons.mjs +0 -0
- package/dist/runtime/models/navigationConfig.d.ts +8 -0
- package/dist/runtime/models/navigationConfig.mjs +0 -0
- package/dist/runtime/models/pagesConfig.d.ts +169 -0
- package/dist/runtime/models/pagesConfig.mjs +0 -0
- package/dist/runtime/models/portal.d.ts +8 -0
- package/dist/runtime/models/portal.mjs +0 -0
- package/dist/runtime/models/templateConfig.d.ts +44 -0
- package/dist/runtime/models/templateConfig.mjs +0 -0
- package/dist/runtime/plugin.d.ts +2 -0
- package/dist/runtime/plugin.mjs +55 -0
- package/dist/runtime/store/affiliates.d.ts +12 -0
- package/dist/runtime/store/affiliates.mjs +35 -0
- package/dist/runtime/store/auth.d.ts +14 -0
- package/dist/runtime/store/auth.mjs +32 -0
- package/dist/runtime/store/conferences.d.ts +13 -0
- package/dist/runtime/store/conferences.mjs +86 -0
- package/dist/runtime/store/navigationConfig.d.ts +7 -0
- package/dist/runtime/store/navigationConfig.mjs +14 -0
- package/dist/runtime/store/portal.d.ts +9 -0
- package/dist/runtime/store/portal.mjs +39 -0
- package/dist/runtime/store/support.d.ts +3 -0
- package/dist/runtime/store/support.mjs +20 -0
- package/dist/runtime/store/templateConfigs.d.ts +20 -0
- package/dist/runtime/store/templateConfigs.mjs +84 -0
- package/dist/runtime/v3plusCommonPlugin.d.ts +14 -0
- package/dist/runtime/v3plusCommonPlugin.mjs +8 -0
- package/dist/types.d.ts +10 -0
- 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>
|