@icvdeveloper/common-module 0.0.75 → 0.0.78
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/dist/module.json +1 -1
- package/dist/module.mjs +5 -0
- package/dist/runtime/@types/components.d.ts +89 -1
- package/dist/runtime/components/agenda/AgendaList.vue +149 -19
- package/dist/runtime/components/agenda/AgendaTabbed.vue +9 -0
- package/dist/runtime/components/agenda/components/AgendaListAccordion.vue +31 -4
- package/dist/runtime/components/agenda/components/Calendar.vue +89 -0
- package/dist/runtime/components/media/PlayerAndContentContainer.vue +170 -0
- package/dist/runtime/components/media/WebcastVideoPlayer.vue +167 -0
- package/dist/runtime/components/media/components/AgendaPanel.vue +53 -0
- package/dist/runtime/components/media/components/CeCreditNotification.vue +99 -0
- package/dist/runtime/components/media/components/CeCreditNotification.vue.d.ts +28 -0
- package/dist/runtime/components/media/components/ContentAccordion.vue +65 -0
- package/dist/runtime/components/media/components/ContentAccordion.vue.d.ts +29 -0
- package/dist/runtime/components/media/components/ContentArea.vue +175 -0
- package/dist/runtime/components/media/components/ContentTabs.vue +263 -0
- package/dist/runtime/components/media/components/DocumentsPanel.vue +52 -0
- package/dist/runtime/components/media/components/DocumentsPanel.vue.d.ts +7 -0
- package/dist/runtime/components/media/components/JsonApi.vue +33 -0
- package/dist/runtime/components/media/components/JsonApi.vue.d.ts +16 -0
- package/dist/runtime/components/media/components/MediaContainer.vue +104 -0
- package/dist/runtime/components/media/components/OverviewPanel.vue +51 -0
- package/dist/runtime/components/media/components/PresentersPanel.vue +65 -0
- package/dist/runtime/components/media/components/PresentersPanel.vue.d.ts +32 -0
- package/dist/runtime/components/media/components/SessionReporting.vue +96 -0
- package/dist/runtime/components/media/components/SessionReporting.vue.d.ts +35 -0
- package/dist/runtime/components/media/components/SponsorsPanel.vue +85 -0
- package/dist/runtime/components/media/components/SponsorsPanel.vue.d.ts +27 -0
- package/dist/runtime/components/media/components/WindowContent.vue +118 -0
- package/dist/runtime/components/media/components/WindowContent.vue.d.ts +50 -0
- package/dist/runtime/components/media/components/WindowSlide.vue +92 -0
- package/dist/runtime/components/media/components/WindowSlide.vue.d.ts +36 -0
- package/dist/runtime/composables/useStream.d.ts +15 -0
- package/dist/runtime/composables/useStream.mjs +89 -0
- package/dist/runtime/enums/general.d.ts +7 -0
- package/dist/runtime/enums/general.mjs +8 -0
- package/dist/runtime/models/conference.d.ts +17 -0
- package/dist/runtime/models/pagesConfig.d.ts +2 -0
- package/dist/runtime/store/presentations.d.ts +11 -0
- package/dist/runtime/store/presentations.mjs +10 -0
- package/package.json +3 -1
package/dist/module.json
CHANGED
package/dist/module.mjs
CHANGED
|
@@ -155,6 +155,11 @@ const module = defineNuxtModule({
|
|
|
155
155
|
extensions: ["vue"],
|
|
156
156
|
prefix: "Common"
|
|
157
157
|
});
|
|
158
|
+
addComponentsDir({
|
|
159
|
+
path: join(runtimeDir, "components/media"),
|
|
160
|
+
extensions: ["vue"],
|
|
161
|
+
prefix: "Common"
|
|
162
|
+
});
|
|
158
163
|
nuxt.hook("app:resolve", async (nuxt2) => {
|
|
159
164
|
let index = 0;
|
|
160
165
|
const piniaRuntime = nuxt2.plugins.find((object, i) => {
|
|
@@ -102,7 +102,7 @@ export type presenterModalClassObj = {
|
|
|
102
102
|
export type uccClassObj = {
|
|
103
103
|
container?: string | null;
|
|
104
104
|
};
|
|
105
|
-
export type accordionCompObj
|
|
105
|
+
export type accordionCompObj = {
|
|
106
106
|
svgIcon?: svgIconClassObj;
|
|
107
107
|
};
|
|
108
108
|
export type accordionClassObj = {
|
|
@@ -121,3 +121,91 @@ export type faqAccordionClassObj = {
|
|
|
121
121
|
container?: string | null;
|
|
122
122
|
components?: faqAccordionCompObj;
|
|
123
123
|
};
|
|
124
|
+
export type AgendaListAccordionClassObj = {
|
|
125
|
+
container?: string | null;
|
|
126
|
+
headerContainer?: string | null;
|
|
127
|
+
headerButton?: string | null;
|
|
128
|
+
dropdownContainer?: string | null;
|
|
129
|
+
};
|
|
130
|
+
export type AgendaListCompObj = {
|
|
131
|
+
agendaListAccordion?: AgendaListAccordionClassObj;
|
|
132
|
+
};
|
|
133
|
+
export type AgendaListClassObj = {
|
|
134
|
+
container?: string | null;
|
|
135
|
+
accordionContainer?: string | null;
|
|
136
|
+
titleContainer?: string | null;
|
|
137
|
+
timeElement?: string | null;
|
|
138
|
+
iconContainer?: string | null;
|
|
139
|
+
dropdownContainer?: string | null;
|
|
140
|
+
marginElement?: string | null;
|
|
141
|
+
presentersContainer?: string | null;
|
|
142
|
+
presentersHeader?: string | null;
|
|
143
|
+
presenterListContainer?: string | null;
|
|
144
|
+
presenterElement: string | null;
|
|
145
|
+
presenterName?: string | null;
|
|
146
|
+
components?: AgendaListCompObj;
|
|
147
|
+
};
|
|
148
|
+
export type AgendaPanelCompObj = {
|
|
149
|
+
agendaList?: AgendaListClassObj;
|
|
150
|
+
};
|
|
151
|
+
export type AgendaPanelClassObj = {
|
|
152
|
+
container?: string | null;
|
|
153
|
+
components?: AgendaPanelCompObj;
|
|
154
|
+
};
|
|
155
|
+
export type OverviewPanelClassObj = {
|
|
156
|
+
container?: string | null;
|
|
157
|
+
htmlElement?: string | null;
|
|
158
|
+
noOverviewElement?: string | null;
|
|
159
|
+
};
|
|
160
|
+
export type ContentTabsClassObj = {
|
|
161
|
+
container?: string | null;
|
|
162
|
+
fullContainer?: string | null;
|
|
163
|
+
mobileContainer?: string | null;
|
|
164
|
+
mobileButtonContainer?: string | null;
|
|
165
|
+
dropdownContainer?: string | null;
|
|
166
|
+
tabList?: string | null;
|
|
167
|
+
tabItem?: string | null;
|
|
168
|
+
tabLink?: string | null;
|
|
169
|
+
selectedTab?: string | null;
|
|
170
|
+
mobileTabList?: string | null;
|
|
171
|
+
mobileTabItem?: string | null;
|
|
172
|
+
mobileTabLink?: string | null;
|
|
173
|
+
};
|
|
174
|
+
export type WebcastPlayerClassObj = {
|
|
175
|
+
container?: string | null;
|
|
176
|
+
playerElement?: string | null;
|
|
177
|
+
embedElement?: string | null;
|
|
178
|
+
};
|
|
179
|
+
export type MediaContainerCompObj = {
|
|
180
|
+
webcastPlayer?: WebcastPlayerClassObj;
|
|
181
|
+
};
|
|
182
|
+
export type MediaContainerClassObj = {
|
|
183
|
+
container?: string | null;
|
|
184
|
+
components?: MediaContainerCompObj;
|
|
185
|
+
};
|
|
186
|
+
export type ContentAreaCompObj = {
|
|
187
|
+
overviewPanel?: OverviewPanelClassObj;
|
|
188
|
+
agendaPanel?: AgendaPanelClassObj;
|
|
189
|
+
};
|
|
190
|
+
export type ContentAreaClassObj = {
|
|
191
|
+
container?: string | null;
|
|
192
|
+
htmlElement?: string | null;
|
|
193
|
+
trackHtmlElement?: string | null;
|
|
194
|
+
noTrackHtmlElement?: string | null;
|
|
195
|
+
noTrackHtmlText?: string | null;
|
|
196
|
+
components?: ContentAreaCompObj;
|
|
197
|
+
};
|
|
198
|
+
export type PlayerAndContentCompObj = {
|
|
199
|
+
contentTabs?: ContentTabsClassObj;
|
|
200
|
+
contentArea?: ContentAreaClassObj;
|
|
201
|
+
mediaContainer?: MediaContainerClassObj;
|
|
202
|
+
};
|
|
203
|
+
export type PlayerAndContentClassObj = {
|
|
204
|
+
container?: string | null;
|
|
205
|
+
noTabsContainer?: string | null;
|
|
206
|
+
noTabsChild?: string | null;
|
|
207
|
+
withTabsContainer?: string | null;
|
|
208
|
+
withTabsChild?: string | null;
|
|
209
|
+
mediaTabsContainer?: string | null;
|
|
210
|
+
components?: PlayerAndContentCompObj;
|
|
211
|
+
};
|
|
@@ -1,24 +1,52 @@
|
|
|
1
1
|
<script lang="ts" setup>
|
|
2
|
-
import { toRefs
|
|
2
|
+
import { toRefs } from "vue";
|
|
3
3
|
import { add } from "date-fns";
|
|
4
|
-
import { e } from "ofetch/dist/error-8a55452d";
|
|
5
4
|
import type { Conference } from "../../models/conference";
|
|
6
5
|
import { useAgenda } from "../../composables/useAgenda";
|
|
7
6
|
import { useDateFormat } from "../../composables/useDateFormat";
|
|
8
7
|
import { usePresenter } from "../../composables/usePresenter";
|
|
8
|
+
import { useClassBinding } from "../../composables/useClassBinding";
|
|
9
9
|
import { Presenter } from "../../models/conference";
|
|
10
|
+
import {
|
|
11
|
+
AgendaListClassObj,
|
|
12
|
+
AgendaListCompObj,
|
|
13
|
+
AgendaListAccordionClassObj,
|
|
14
|
+
} from "../../@types/components";
|
|
10
15
|
import AgendaAccordion from "./components/AgendaListAccordion.vue";
|
|
16
|
+
import Calendar from "./components/Calendar.vue";
|
|
11
17
|
|
|
12
18
|
type Props = {
|
|
13
19
|
conference: Conference;
|
|
20
|
+
classObject?: AgendaListClassObj;
|
|
14
21
|
};
|
|
15
22
|
|
|
16
|
-
const props = defineProps<Props>()
|
|
23
|
+
const props = withDefaults(defineProps<Props>(), {
|
|
24
|
+
classObject: () => {
|
|
25
|
+
return {
|
|
26
|
+
container: "",
|
|
27
|
+
accordionContainer: "",
|
|
28
|
+
titleContainer: "",
|
|
29
|
+
timeElement: "",
|
|
30
|
+
iconContainer: "",
|
|
31
|
+
dropdownContainer: "",
|
|
32
|
+
marginElement: "",
|
|
33
|
+
presentersContainer: "",
|
|
34
|
+
presentersHeader: "",
|
|
35
|
+
presenterListContainer: "",
|
|
36
|
+
presenterElement: "",
|
|
37
|
+
presenterName: "",
|
|
38
|
+
components: ref<AgendaListCompObj>({
|
|
39
|
+
agendaListAccordion: ref<AgendaListAccordionClassObj>({}),
|
|
40
|
+
}),
|
|
41
|
+
};
|
|
42
|
+
},
|
|
43
|
+
});
|
|
17
44
|
|
|
18
45
|
const { conference } = toRefs(props);
|
|
19
46
|
|
|
20
47
|
const { days, getCombinedTrackList } = useAgenda(conference);
|
|
21
48
|
const { formatTimezoneToLocal } = useDateFormat();
|
|
49
|
+
const { classBinding } = useClassBinding();
|
|
22
50
|
|
|
23
51
|
const presentersToComposables = (presenters: Presenter[]) => {
|
|
24
52
|
const data = [];
|
|
@@ -35,14 +63,40 @@ const presentersToComposables = (presenters: Presenter[]) => {
|
|
|
35
63
|
</script>
|
|
36
64
|
|
|
37
65
|
<template>
|
|
38
|
-
<div
|
|
66
|
+
<div
|
|
67
|
+
:class="
|
|
68
|
+
classBinding(
|
|
69
|
+
classObject,
|
|
70
|
+
'container',
|
|
71
|
+
'flex flex-col space-y-5 text-neutral-700'
|
|
72
|
+
)
|
|
73
|
+
"
|
|
74
|
+
>
|
|
39
75
|
<template v-for="day in days">
|
|
40
76
|
<template v-for="track in getCombinedTrackList(day)">
|
|
41
|
-
<div
|
|
42
|
-
|
|
77
|
+
<div
|
|
78
|
+
v-for="presentation in track.presentations"
|
|
79
|
+
:key="presentation.id"
|
|
80
|
+
:class="classBinding(classObject, 'accordionContainer', '')"
|
|
81
|
+
>
|
|
82
|
+
<AgendaAccordion
|
|
83
|
+
:class-object="classObject.components.agendaListAccordion"
|
|
84
|
+
>
|
|
43
85
|
<template #header="isExpanded">
|
|
44
|
-
<div
|
|
45
|
-
|
|
86
|
+
<div
|
|
87
|
+
:class="
|
|
88
|
+
classBinding(
|
|
89
|
+
classObject,
|
|
90
|
+
'titleContainer',
|
|
91
|
+
'text-left text-xl flex-col md:flex-row flex'
|
|
92
|
+
)
|
|
93
|
+
"
|
|
94
|
+
>
|
|
95
|
+
<span
|
|
96
|
+
:class="
|
|
97
|
+
classBinding(classObject, 'timeElement', 'time-width')
|
|
98
|
+
"
|
|
99
|
+
>
|
|
46
100
|
{{
|
|
47
101
|
formatTimezoneToLocal(
|
|
48
102
|
presentation.date,
|
|
@@ -61,7 +115,15 @@ const presentersToComposables = (presenters: Presenter[]) => {
|
|
|
61
115
|
)
|
|
62
116
|
}}
|
|
63
117
|
</span>
|
|
64
|
-
<span
|
|
118
|
+
<span
|
|
119
|
+
:class="
|
|
120
|
+
classBinding(
|
|
121
|
+
classObject,
|
|
122
|
+
'iconContainer',
|
|
123
|
+
'flex flex-row md:ml-5'
|
|
124
|
+
)
|
|
125
|
+
"
|
|
126
|
+
>
|
|
65
127
|
<CommonSvgIcon
|
|
66
128
|
:class-object="{ svgElement: 'fill-neutral-700' }"
|
|
67
129
|
class="mr-1 pt-1"
|
|
@@ -72,23 +134,91 @@ const presentersToComposables = (presenters: Presenter[]) => {
|
|
|
72
134
|
</div>
|
|
73
135
|
</template>
|
|
74
136
|
<template #body>
|
|
75
|
-
<div
|
|
137
|
+
<div
|
|
138
|
+
:class="
|
|
139
|
+
classBinding(
|
|
140
|
+
classObject,
|
|
141
|
+
'dropdownContainer',
|
|
142
|
+
'flex flex-row'
|
|
143
|
+
)
|
|
144
|
+
"
|
|
145
|
+
>
|
|
76
146
|
<!-- left margin element -->
|
|
77
|
-
<span
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
147
|
+
<span
|
|
148
|
+
:class="
|
|
149
|
+
classBinding(
|
|
150
|
+
classObject,
|
|
151
|
+
'marginElement',
|
|
152
|
+
'text-lg hidden md:block md:flex-initial time-width md:mr-8'
|
|
153
|
+
)
|
|
154
|
+
"
|
|
155
|
+
/>
|
|
156
|
+
<div
|
|
157
|
+
:class="
|
|
158
|
+
classBinding(
|
|
159
|
+
classObject,
|
|
160
|
+
'presentersContainer',
|
|
161
|
+
'flex-1 my-3'
|
|
162
|
+
)
|
|
163
|
+
"
|
|
164
|
+
>
|
|
165
|
+
<!-- ADD TO CALENDAR -->
|
|
166
|
+
<calendar
|
|
167
|
+
:key="conference.id"
|
|
168
|
+
class="mb-3"
|
|
169
|
+
:presentation="presentation"
|
|
170
|
+
:conference="conference"
|
|
171
|
+
/>
|
|
172
|
+
<h3
|
|
173
|
+
:class="
|
|
174
|
+
classBinding(
|
|
175
|
+
classObject,
|
|
176
|
+
'presentersHeader',
|
|
177
|
+
'font-bold text-lg'
|
|
178
|
+
)
|
|
179
|
+
"
|
|
180
|
+
>
|
|
181
|
+
Presenters
|
|
182
|
+
</h3>
|
|
183
|
+
<div
|
|
184
|
+
:class="
|
|
185
|
+
classBinding(
|
|
186
|
+
classObject,
|
|
187
|
+
'presenterListContainer',
|
|
188
|
+
'flex flex-col space-y-3'
|
|
189
|
+
)
|
|
190
|
+
"
|
|
191
|
+
>
|
|
82
192
|
<div
|
|
83
193
|
v-for="presenter in presentersToComposables(
|
|
84
194
|
presentation.presenters
|
|
85
195
|
)"
|
|
86
196
|
:key="presenter.presenter.id"
|
|
197
|
+
:class="classBinding(classObject, 'presenterElement', '')"
|
|
87
198
|
>
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
199
|
+
<p
|
|
200
|
+
:class="
|
|
201
|
+
classBinding(
|
|
202
|
+
classObject,
|
|
203
|
+
'presenterName',
|
|
204
|
+
'text-lg pb-0 mb-0'
|
|
205
|
+
)
|
|
206
|
+
"
|
|
207
|
+
>
|
|
208
|
+
{{ presenter.fullName.value }}
|
|
209
|
+
</p>
|
|
210
|
+
<p
|
|
211
|
+
v-if="presenter.titleCompany.value"
|
|
212
|
+
:class="
|
|
213
|
+
classBinding(
|
|
214
|
+
classObject,
|
|
215
|
+
'presenterName',
|
|
216
|
+
'text-sm pt-0 mb-1'
|
|
217
|
+
)
|
|
218
|
+
"
|
|
219
|
+
>
|
|
220
|
+
{{ presenter.titleCompany.value }}
|
|
221
|
+
</p>
|
|
92
222
|
</div>
|
|
93
223
|
</div>
|
|
94
224
|
</div>
|
|
@@ -9,6 +9,7 @@ import { usePresenters } from "../../composables/usePresenters";
|
|
|
9
9
|
import CommonAccordion from "../layouts/Accordion.vue";
|
|
10
10
|
import Sponsor from "./components/Sponsor.vue";
|
|
11
11
|
import PresentationLink from "./components/PresentationLink.vue";
|
|
12
|
+
import Calendar from "./components/Calendar.vue";
|
|
12
13
|
|
|
13
14
|
type Props = {
|
|
14
15
|
conference: Conference;
|
|
@@ -246,6 +247,14 @@ const presentersContainer = computed(() => {
|
|
|
246
247
|
></presentation-link>
|
|
247
248
|
</div>
|
|
248
249
|
|
|
250
|
+
<!-- ADD TO CALENDAR -->
|
|
251
|
+
<calendar
|
|
252
|
+
:key="conference.id"
|
|
253
|
+
class="mb-3"
|
|
254
|
+
:presentation="presentation"
|
|
255
|
+
:conference="conference"
|
|
256
|
+
/>
|
|
257
|
+
|
|
249
258
|
<!-- PRESENTERS LIST (ACCORDION OR STANDARD/DIV) -->
|
|
250
259
|
<component
|
|
251
260
|
:is="presentersContainer"
|
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
<script lang="ts" setup>
|
|
2
2
|
import { ref } from "vue";
|
|
3
|
+
import { useClassBinding } from "../../../composables/useClassBinding";
|
|
4
|
+
import { AgendaListAccordionClassObj } from "../../../@types/components";
|
|
5
|
+
|
|
6
|
+
type Props = {
|
|
7
|
+
classObject?: AgendaListAccordionClassObj;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
const props = withDefaults(defineProps<Props>(), {
|
|
11
|
+
classObject: () => {
|
|
12
|
+
return {
|
|
13
|
+
container: "",
|
|
14
|
+
headerContainer: "",
|
|
15
|
+
headerButton: "",
|
|
16
|
+
dropdownContainer: "",
|
|
17
|
+
};
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
const { classBinding } = useClassBinding();
|
|
3
22
|
|
|
4
23
|
const expanded = ref<boolean>(false);
|
|
5
24
|
|
|
@@ -10,15 +29,23 @@ const toggle = () => {
|
|
|
10
29
|
</script>
|
|
11
30
|
|
|
12
31
|
<template>
|
|
13
|
-
<div>
|
|
14
|
-
<div
|
|
15
|
-
|
|
32
|
+
<div :class="classBinding(classObject, 'container', '')">
|
|
33
|
+
<div
|
|
34
|
+
:class="classBinding(classObject, 'headerContainer', 'font-bold mt-2')"
|
|
35
|
+
>
|
|
36
|
+
<button
|
|
37
|
+
:class="classBinding(classObject, 'headerButton', 'outline-none')"
|
|
38
|
+
@click="toggle"
|
|
39
|
+
>
|
|
16
40
|
<slot name="header"></slot>
|
|
17
41
|
</button>
|
|
18
42
|
</div>
|
|
19
43
|
|
|
20
44
|
<transition name="slide" mode="out-in">
|
|
21
|
-
<div
|
|
45
|
+
<div
|
|
46
|
+
v-show="expanded"
|
|
47
|
+
:class="classBinding(classObject, 'dropdownContainer', '')"
|
|
48
|
+
>
|
|
22
49
|
<slot name="body" />
|
|
23
50
|
</div>
|
|
24
51
|
</transition>
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
<script lang="ts" setup>
|
|
2
|
+
import { ref, toRefs, computed } from "vue";
|
|
3
|
+
import { storeToRefs } from "pinia";
|
|
4
|
+
import { get } from "lodash-es";
|
|
5
|
+
import { DateTime } from 'luxon';
|
|
6
|
+
import { useTemplateConfigsStore } from "../../../store";
|
|
7
|
+
import 'add-to-calendar-button';
|
|
8
|
+
import { Conference } from "../../../models/conference";
|
|
9
|
+
import { Presentation } from "../../../models/conference";
|
|
10
|
+
|
|
11
|
+
type Props = {
|
|
12
|
+
conference: Conference;
|
|
13
|
+
presentation: Presentation;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const props = defineProps<Props>();
|
|
17
|
+
|
|
18
|
+
const { conference, presentation } = toRefs(props);
|
|
19
|
+
|
|
20
|
+
const { pagesConfigValue } = storeToRefs(useTemplateConfigsStore());
|
|
21
|
+
|
|
22
|
+
// Computed
|
|
23
|
+
const showAddToGoogleCalendar = computed((): boolean => {
|
|
24
|
+
return pagesConfigValue.value("agenda.add_to_google_calendar", false);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
const showAddToMicrosoftCalendar = computed((): boolean => {
|
|
28
|
+
return pagesConfigValue.value("agenda.add_to_microsoft_calendar", false);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
const presStartDate = computed((): string => {
|
|
32
|
+
return DateTime.fromSQL(
|
|
33
|
+
presentation.value.date,
|
|
34
|
+
{ zone: conference.timezone }
|
|
35
|
+
).toFormat("yyyy-MM-dd");
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
const presStartTime = computed((): string => {
|
|
39
|
+
return DateTime.fromSQL(
|
|
40
|
+
presentation.value.date,
|
|
41
|
+
{ zone: conference.timezone }
|
|
42
|
+
).toFormat("HH:mm");
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
const presEndTime = computed((): string => {
|
|
46
|
+
let duration: number = get(presentation.value, "duration", 3600) // default to 60 min
|
|
47
|
+
return DateTime.fromSQL(
|
|
48
|
+
presentation.value.date,
|
|
49
|
+
{ zone: conference.timezone }
|
|
50
|
+
).plus(duration * 1000).toFormat("HH:mm");
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
const calendarOptions = computed((): string => {
|
|
54
|
+
let opts = [];
|
|
55
|
+
if (showAddToGoogleCalendar) { opts.push('Google'); }
|
|
56
|
+
if (showAddToMicrosoftCalendar) { opts.push('iCal'); }
|
|
57
|
+
let optsQuoted = opts.map(opt => `'${opt}'`);
|
|
58
|
+
return optsQuoted.join(',');
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
const cssPath = computed((): string => {
|
|
62
|
+
// atcb.css required in template/playground public folder
|
|
63
|
+
return window.location.origin + "/atcb.css";
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
</script>
|
|
67
|
+
|
|
68
|
+
<template>
|
|
69
|
+
<div>
|
|
70
|
+
<add-to-calendar-button
|
|
71
|
+
:name="presentation.name"
|
|
72
|
+
:description="presentation.description"
|
|
73
|
+
:startDate="presStartDate"
|
|
74
|
+
:startTime="presStartTime"
|
|
75
|
+
:endTime="presEndTime"
|
|
76
|
+
:timeZone="conference.timezone"
|
|
77
|
+
:location="conference.location"
|
|
78
|
+
listStyle="dropdown"
|
|
79
|
+
trigger="click"
|
|
80
|
+
lightMode="bodyScheme"
|
|
81
|
+
buttonStyle="custom"
|
|
82
|
+
:customCss="cssPath"
|
|
83
|
+
hideIconButton
|
|
84
|
+
hideBackground
|
|
85
|
+
hideCheckmark
|
|
86
|
+
:options="calendarOptions"
|
|
87
|
+
></add-to-calendar-button>
|
|
88
|
+
</div>
|
|
89
|
+
</template>
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
<script lang="ts" setup>
|
|
2
|
+
import { toRefs } from "vue";
|
|
3
|
+
import { storeToRefs } from "pinia";
|
|
4
|
+
import { useRoute } from "vue-router";
|
|
5
|
+
import { useClassBinding } from "../../composables/useClassBinding";
|
|
6
|
+
import { Conference, Presentation } from "../../models/conference";
|
|
7
|
+
import { SelectedContent } from "../../enums/general";
|
|
8
|
+
import {
|
|
9
|
+
PlayerAndContentClassObj,
|
|
10
|
+
PlayerAndContentCompObj,
|
|
11
|
+
ContentTabsClassObj,
|
|
12
|
+
ContentAreaClassObj,
|
|
13
|
+
MediaContainerClassObj,
|
|
14
|
+
} from "../../@types/components";
|
|
15
|
+
|
|
16
|
+
type Props = {
|
|
17
|
+
conference: Conference;
|
|
18
|
+
presentation: Presentation;
|
|
19
|
+
tabs?: Array<{ label: string; type: SelectedContent; content: string }>;
|
|
20
|
+
classObject?: PlayerAndContentClassObj;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const props = withDefaults(defineProps<Props>(), {
|
|
24
|
+
tabs: () => {
|
|
25
|
+
return [
|
|
26
|
+
{ label: "Overview", type: SelectedContent.OVERVIEW, content: "string" },
|
|
27
|
+
];
|
|
28
|
+
},
|
|
29
|
+
classObject: () => {
|
|
30
|
+
return {
|
|
31
|
+
container: "",
|
|
32
|
+
noTabsContainer: "",
|
|
33
|
+
noTabsChild: "",
|
|
34
|
+
withTabsContainer: "",
|
|
35
|
+
withTabsChild: "",
|
|
36
|
+
mediaTabsContainer: "",
|
|
37
|
+
components: ref<PlayerAndContentCompObj>({
|
|
38
|
+
contentTabs: ref<ContentTabsClassObj>({}),
|
|
39
|
+
contentArea: ref<ContentAreaClassObj>({}),
|
|
40
|
+
mediaContainer: ref<MediaContainerClassObj>({}),
|
|
41
|
+
}),
|
|
42
|
+
};
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
const { conference, presentation } = toRefs(props);
|
|
47
|
+
|
|
48
|
+
const route = ref(useRoute());
|
|
49
|
+
|
|
50
|
+
const { classBinding } = useClassBinding();
|
|
51
|
+
|
|
52
|
+
const { selectedContent } = storeToRefs(usePresentationsStore());
|
|
53
|
+
const { isLoggedIn } = storeToRefs(useAuthStore());
|
|
54
|
+
|
|
55
|
+
// computed
|
|
56
|
+
|
|
57
|
+
const isStreamTest = computed((): boolean => {
|
|
58
|
+
return String(route.value.name).includes("stream-test");
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
const hasAccess = computed((): boolean => {
|
|
62
|
+
return isLoggedIn.value && conference.value.access;
|
|
63
|
+
});
|
|
64
|
+
</script>
|
|
65
|
+
|
|
66
|
+
<template>
|
|
67
|
+
<div :class="classBinding(classObject, 'container', 'flex flex-col w-full')">
|
|
68
|
+
<!-- NO TABS -->
|
|
69
|
+
<div
|
|
70
|
+
v-if="isStreamTest || (hasAccess && !tabs.length)"
|
|
71
|
+
:class="
|
|
72
|
+
classBinding(
|
|
73
|
+
classObject,
|
|
74
|
+
'noTabsContainer',
|
|
75
|
+
'container mx-auto flex flex-col text-center pt-6'
|
|
76
|
+
)
|
|
77
|
+
"
|
|
78
|
+
>
|
|
79
|
+
<div :class="classBinding(classObject, 'noTabsChild', 'flex-1')">
|
|
80
|
+
<CommonComponentsMediaContainer
|
|
81
|
+
:class="
|
|
82
|
+
classBinding(
|
|
83
|
+
classObject,
|
|
84
|
+
'classObject.components.mediaContainer.container',
|
|
85
|
+
'flex-1 aspect-video'
|
|
86
|
+
)
|
|
87
|
+
"
|
|
88
|
+
:webcast-conference="conference"
|
|
89
|
+
:class-object="classObject.components.mediaContainer"
|
|
90
|
+
/>
|
|
91
|
+
</div>
|
|
92
|
+
</div>
|
|
93
|
+
|
|
94
|
+
<!-- TABS -->
|
|
95
|
+
<div v-else :class="classBinding(classObject, 'withTabsContainer', '')">
|
|
96
|
+
<CommonComponentsContentTabs
|
|
97
|
+
:class="
|
|
98
|
+
classBinding(
|
|
99
|
+
classObject,
|
|
100
|
+
'classObject.components.contentTabs.container',
|
|
101
|
+
'hidden md:block'
|
|
102
|
+
)
|
|
103
|
+
"
|
|
104
|
+
:webcast-conference="conference"
|
|
105
|
+
:items="tabs"
|
|
106
|
+
:class-object="classObject.components.contentTabs"
|
|
107
|
+
/>
|
|
108
|
+
<div
|
|
109
|
+
:class="
|
|
110
|
+
classBinding(
|
|
111
|
+
classObject,
|
|
112
|
+
'withTabsChild',
|
|
113
|
+
'flex-1 grid grid-cols-7 grid-rows-2 gap-y-4'
|
|
114
|
+
)
|
|
115
|
+
"
|
|
116
|
+
>
|
|
117
|
+
<div
|
|
118
|
+
:class="
|
|
119
|
+
classBinding(
|
|
120
|
+
classObject,
|
|
121
|
+
'MediaTabsContainer',
|
|
122
|
+
'col-span-7 row-span-1 md:col-span-4 lg:col-span-5 aspect-video'
|
|
123
|
+
)
|
|
124
|
+
"
|
|
125
|
+
>
|
|
126
|
+
<CommonComponentsMediaContainer
|
|
127
|
+
class="w-full"
|
|
128
|
+
:webcast-conference="conference"
|
|
129
|
+
:class-object="classObject.components.mediaContainer"
|
|
130
|
+
/>
|
|
131
|
+
<CommonComponentsContentTabs
|
|
132
|
+
class="block md:hidden"
|
|
133
|
+
:webcast-conference="conference"
|
|
134
|
+
:items="tabs"
|
|
135
|
+
:class-object="classObject.components.contentTabs"
|
|
136
|
+
/>
|
|
137
|
+
</div>
|
|
138
|
+
<CommonComponentsContentArea
|
|
139
|
+
class="col-span-7 row-span-1 md:col-span-3 lg:col-span-2 border ml-0 md:ml-6"
|
|
140
|
+
:selected-content="selectedContent"
|
|
141
|
+
:webcast-conference="conference"
|
|
142
|
+
:presentation="presentation"
|
|
143
|
+
:class-object="classObject.components.contentArea"
|
|
144
|
+
/>
|
|
145
|
+
<!-- sponsor -->
|
|
146
|
+
<figure
|
|
147
|
+
class="col-span-7 md:col-start-5 md:col-span-3 lg:col-start-6 lg:col-span-6 row-span-1 flex flex-col p-6 text-center"
|
|
148
|
+
>
|
|
149
|
+
<h3
|
|
150
|
+
v-if="conference.affiliates.length > 0"
|
|
151
|
+
class="allsmallcaps text-sm pb-4 text-neutral-400 scala"
|
|
152
|
+
>
|
|
153
|
+
Sponsored by:
|
|
154
|
+
</h3>
|
|
155
|
+
<template v-for="affiliate in conference.affiliates">
|
|
156
|
+
<CommonComponentsSponsor
|
|
157
|
+
v-if="affiliate.role == 'sponsor'"
|
|
158
|
+
:key="affiliate.id"
|
|
159
|
+
:sponsor="affiliate"
|
|
160
|
+
:class-object="{
|
|
161
|
+
labelImageContainer: 'block',
|
|
162
|
+
sponsorContainer: 'img-mx-auto',
|
|
163
|
+
}"
|
|
164
|
+
/>
|
|
165
|
+
</template>
|
|
166
|
+
</figure>
|
|
167
|
+
</div>
|
|
168
|
+
</div>
|
|
169
|
+
</div>
|
|
170
|
+
</template>
|