@icvdeveloper/common-module 2.6.3 → 2.6.5

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/CHANGELOG.md CHANGED
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## Unreleased
9
9
 
10
+ ## 2.6.5 - 2026-02-12
11
+
12
+ ## 2.6.4 - 2026-02-12
13
+
10
14
  ## 2.6.3 - 2025-12-03
11
15
 
12
16
  ## 2.6.2 - 2025-09-12
package/dist/module.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "v3plus-common-module",
3
3
  "configKey": "v3plusCommonModule",
4
- "version": "2.6.3"
4
+ "version": "2.6.5"
5
5
  }
@@ -5,6 +5,7 @@ import { DateTime } from "luxon";
5
5
  import { useAgenda } from "../../composables/useAgenda";
6
6
  import { usePresentation } from "../../composables/usePresentation";
7
7
  import { usePresenters } from "../../composables/usePresenters";
8
+ import { useTemplateConfigsStore } from '../../store'
8
9
  import type { Conference, Day, Presenter, Sponsor as SponsorType } from "../../models/conference";
9
10
 
10
11
  type Props = {
@@ -50,6 +51,8 @@ const { getPresentersLabel, getSortedPresenters } = usePresenters(conference);
50
51
  const presentersContainer = computed(() => {
51
52
  return useAccordion() ? CommonAccordion : "div";
52
53
  });
54
+
55
+ const { pagesConfigValue } = useTemplateConfigsStore()
53
56
  </script>
54
57
 
55
58
  <template>
@@ -257,6 +260,7 @@ const presentersContainer = computed(() => {
257
260
 
258
261
  <!-- ADD TO CALENDAR -->
259
262
  <CommonComponentsCalendar
263
+ v-if="pagesConfigValue('agenda.add_to_google_calendar')"
260
264
  :key="conference.id"
261
265
  class="agenda-add-to-calendar mb-3"
262
266
  :presentation="presentation"
@@ -3,13 +3,14 @@ import { ref, toRefs, computed } from "vue";
3
3
  import type { Presentation } from "../../../models/conference";
4
4
 
5
5
  type Props = {
6
- linkText: string;
7
6
  presentation: Presentation;
7
+ linkText?: string;
8
8
  useIcon?: boolean;
9
9
  newLine?: boolean;
10
10
  };
11
11
 
12
12
  const props = withDefaults(defineProps<Props>(), {
13
+ linkText: "",
13
14
  useIcon: true,
14
15
  newLine: false,
15
16
  });
@@ -95,7 +95,7 @@ const allowFavorites = computed(() => {
95
95
  </CommonZoomModal>
96
96
 
97
97
  <!-- live/archive stream text & icon link -->
98
- <!-- <a
98
+ <a
99
99
  v-else-if="
100
100
  (isAgenda && conferenceIsLiveOrMixed(conference)) ||
101
101
  (conferenceIsArchived(conference) && presentation.type != 'zoom')
@@ -104,14 +104,14 @@ const allowFavorites = computed(() => {
104
104
  :href="getLivePresentationLinkDestination(presentation, track)"
105
105
  :target="getPresentationLinkTarget(presentation)"
106
106
  @click="playPresentation(track, presentation, conference, isActiveAgenda, isVirtual)"
107
- > -->
107
+ >
108
108
  <!-- TODO - ensure this conversion to <button> does not compromise behavior on other templates -->
109
109
  <!-- is not a11y compliant, though. would be better if it was button on tradeshow template only -->
110
- <button
111
- v-else-if="(isAgenda && conferenceIsLiveOrMixed(conference)) ||
112
- (conferenceIsArchived(conference) && presentation.type != 'zoom')"
113
- @click="playPresentation(track, presentation, conference, isActiveAgenda, isVirtual)"
114
- >
110
+ <!-- <a-->
111
+ <!-- v-else-if="(isAgenda && conferenceIsLiveOrMixed(conference)) ||-->
112
+ <!-- (conferenceIsArchived(conference) && presentation.type != 'zoom')"-->
113
+ <!-- @click="playPresentation(track, presentation, conference, isActiveAgenda, isVirtual)"-->
114
+ <!-- >-->
115
115
  {{ presentation.name }}
116
116
  <transition name="fade">
117
117
  <PlayIcon
@@ -122,7 +122,7 @@ const allowFavorites = computed(() => {
122
122
  icon="playarrow"
123
123
  />
124
124
  </transition>
125
- </button>
125
+ </a>
126
126
  <!-- </a> -->
127
127
 
128
128
  <!-- text only catchall -->
@@ -138,9 +138,7 @@ const allowFavorites = computed(() => {
138
138
  <InfoLink
139
139
  v-if="showInfoLink && presentation.description"
140
140
  :presentation="presentation"
141
- :use-icon="useIcon"
142
- :link-text="infoLinkText"
143
- :new-line="isSmallGroupedTrack"
141
+ :new-line="isSmallGroupedTrack(track)"
144
142
  class="ml-2"
145
143
  />
146
144
 
@@ -149,7 +147,6 @@ const allowFavorites = computed(() => {
149
147
  v-if="allowFavorites && isLoggedIn"
150
148
  class="ml-1"
151
149
  :presentation="presentation"
152
- @click="handleFavoriteClick"
153
150
  />
154
151
  </h2>
155
152
  </div>
@@ -10,23 +10,24 @@ interface Props {
10
10
  title?: string | null;
11
11
  message?: string | null;
12
12
  conference?: Conference | null;
13
+ onLoginSuccess?: () => void;
13
14
  }
14
15
 
15
16
  const props = withDefaults(defineProps<Props>(), {
16
17
  title: null,
17
18
  message: null,
18
19
  conference: null,
20
+ onLoginSuccess: undefined
19
21
  });
20
22
 
21
23
  const { title, message, conference } = toRefs<Props>(props);
22
24
 
23
- const { data:portal } = storeToRefs(usePortalStore());
25
+ const { data: portal } = storeToRefs(usePortalStore());
24
26
  const { globalConfigValue } = storeToRefs(useTemplateConfigsStore());
25
27
 
26
28
  // emits
27
29
  const emit = defineEmits<{
28
30
  (event: "showResetRequest"): void;
29
-
30
31
  }>();
31
32
 
32
33
  // Methods
@@ -43,14 +44,16 @@ const showResetRequest = () => {
43
44
  <div class="px-2">
44
45
  <div class="flex flex-1 flex-col text-center pt-8">
45
46
  <h3
46
- v-if="title"
47
- class="py-8"
47
+ v-if="title"
48
+ class="py-8"
48
49
  >
49
50
  {{ title }}
50
51
  </h3>
52
+
51
53
  <h1 class="mb-3 heading-color-3">
52
54
  Log In
53
55
  </h1>
56
+
54
57
  <!-- message -->
55
58
  <CommonMessage
56
59
  v-if="message && !loginError"
@@ -59,6 +62,7 @@ const showResetRequest = () => {
59
62
  >
60
63
  {{ message }}
61
64
  </CommonMessage>
65
+
62
66
  <!-- error messages -->
63
67
  <CommonMessage
64
68
  v-if="loginError"
@@ -89,19 +93,19 @@ const showResetRequest = () => {
89
93
  type="email"
90
94
  placeholder="Email"
91
95
  class="form-input contrast-border mb-2"
92
- @keyup.enter="handleLogin()"
96
+ @keyup.enter="handleLogin(false, onLoginSuccess)"
93
97
  >
94
98
  <input
95
99
  v-model="password"
96
100
  type="password"
97
101
  placeholder="password"
98
102
  class="form-input contrast-border mb-5"
99
- @keyup.enter="handleLogin()"
103
+ @keyup.enter="handleLogin(false, onLoginSuccess)"
100
104
  >
101
105
  <button
102
106
  v-if="!tooManySessions"
103
107
  class="btn"
104
- @click="handleLogin()"
108
+ @click="handleLogin(false, onLoginSuccess)"
105
109
  >
106
110
  Log In
107
111
  </button>
@@ -5,6 +5,7 @@ export * from "./useAuth";
5
5
  export * from "./useConferenceHelpers";
6
6
  export * from "./useLogin";
7
7
  export * from "./usePresentation";
8
+ export * from './usePresentationHelpers';
8
9
  export * from "./usePresenter";
9
10
  export * from "./usePresenters";
10
11
  export * from "./useScripts";
@@ -5,6 +5,7 @@ export * from "./useAuth.mjs";
5
5
  export * from "./useConferenceHelpers.mjs";
6
6
  export * from "./useLogin.mjs";
7
7
  export * from "./usePresentation.mjs";
8
+ export * from "./usePresentationHelpers.mjs";
8
9
  export * from "./usePresenter.mjs";
9
10
  export * from "./usePresenters.mjs";
10
11
  export * from "./useScripts.mjs";
@@ -20,7 +20,7 @@ type UserLogin = {
20
20
  /**
21
21
  * Handle login.
22
22
  */
23
- handleLogin: (revoke?: boolean) => void;
23
+ handleLogin: (revoke?: boolean, onLoginSuccess?: () => void) => void;
24
24
  /**
25
25
  * Reset login
26
26
  */
@@ -41,8 +41,11 @@ export const useLogin = (conference) => {
41
41
  router.push(redirectUrl);
42
42
  }
43
43
  };
44
- const handleLogin = (revoke = false) => {
44
+ const handleLogin = (revoke = false, onLoginSuccess) => {
45
45
  login({ email: email.value, password: password.value, revoke }).then(() => {
46
+ if (onLoginSuccess) {
47
+ onLoginSuccess();
48
+ }
46
49
  handleRedirect();
47
50
  }).catch((error) => {
48
51
  if (error.response.status === 423) {
@@ -0,0 +1,5 @@
1
+ import type { Presentation, Conference } from '../models/conference';
2
+ export declare const usePresentationHelpers: () => {
3
+ getPresentationPlayerType: (_presentation: Presentation) => string;
4
+ findPresentationById: (conference: Conference, id: number) => Presentation | undefined;
5
+ };
@@ -0,0 +1,47 @@
1
+ export const usePresentationHelpers = () => {
2
+ const getPresentationPlayerType = (_presentation) => {
3
+ let playerType = _presentation.video_url || _presentation.type == "embed" ? "archive" : "live";
4
+ if (_presentation.external_type == "iframe") {
5
+ playerType = "iframe";
6
+ }
7
+ return playerType;
8
+ };
9
+ const findPresentationById = (conference, id) => {
10
+ if (!conference || !id) return void 0;
11
+ const findInPresentations = (presentations) => {
12
+ if (!presentations?.length) return void 0;
13
+ return presentations.find((p) => p?.id === id);
14
+ };
15
+ const findInTracks = (tracks) => {
16
+ if (!tracks?.length) return void 0;
17
+ for (const track of tracks) {
18
+ const hit = findInPresentations(track?.presentations);
19
+ if (hit) return hit;
20
+ }
21
+ return void 0;
22
+ };
23
+ const findInTrackGroups = (trackGroups) => {
24
+ if (!trackGroups?.length) return void 0;
25
+ for (const group of trackGroups) {
26
+ const hit = findInTracks(group?.tracks);
27
+ if (hit) return hit;
28
+ }
29
+ return void 0;
30
+ };
31
+ for (const day of conference.days ?? []) {
32
+ const hitInTracks = findInTracks(day?.tracks);
33
+ if (hitInTracks) return hitInTracks;
34
+ const hitInGroups = findInTrackGroups(day?.track_groups);
35
+ if (hitInGroups) return hitInGroups;
36
+ }
37
+ for (const presenter of conference.presenters ?? []) {
38
+ const hit = findInPresentations(presenter?.presentations);
39
+ if (hit) return hit;
40
+ }
41
+ return void 0;
42
+ };
43
+ return {
44
+ getPresentationPlayerType,
45
+ findPresentationById
46
+ };
47
+ };
@@ -60,7 +60,7 @@ export const useAuthStore = defineStore("auth", {
60
60
  this.user = response;
61
61
  const conferencesStore = useConferencesStore();
62
62
  conferencesStore.getConferences().then(() => {
63
- conferencesStore.getCurrentConference(true);
63
+ conferencesStore.getCurrentConference();
64
64
  });
65
65
  loginEventHook.trigger(false);
66
66
  resolve(response);
@@ -1,5 +1,5 @@
1
1
  import type { Ref } from 'vue';
2
- import type { Conference, PlayerPresentation } from '../models/conference';
2
+ import type { Conference, PlayerPresentation, VirtualPresentation } from '../models/conference';
3
3
  type PlayerConfigStore = {
4
4
  isPlayerVisible: Ref<boolean>;
5
5
  playerPresentation: Ref<PlayerPresentation>;
@@ -23,6 +23,7 @@ type PlayerConfigStore = {
23
23
  setSelectedContent: (payload: {}) => void;
24
24
  setChatroomId: (payload: string) => void;
25
25
  updateSelectedPresentationAccess: (payload: boolean) => void;
26
+ updateSelectedPresentation: (presentation: VirtualPresentation) => void;
26
27
  };
27
- export declare const usePlayerConfigStore: import("pinia").StoreDefinition<"playerConfig", import("pinia")._UnwrapAll<Pick<PlayerConfigStore, "selectedContent" | "isPlayerVisible" | "playerPresentation" | "livePresentations" | "playerConference" | "chatroomId" | "getlivePresentations">>, Pick<PlayerConfigStore, never>, Pick<PlayerConfigStore, "emitStreamTest" | "setIsPlayerVisible" | "setSelectedPresentation" | "setLivePresentations" | "setSelectedConference" | "setSelectedConferenceAccess" | "setSelectedContent" | "setChatroomId" | "updateSelectedPresentationAccess">>;
28
+ export declare const usePlayerConfigStore: import("pinia").StoreDefinition<"playerConfig", import("pinia")._UnwrapAll<Pick<PlayerConfigStore, "selectedContent" | "isPlayerVisible" | "playerPresentation" | "livePresentations" | "playerConference" | "chatroomId" | "getlivePresentations">>, Pick<PlayerConfigStore, never>, Pick<PlayerConfigStore, "emitStreamTest" | "setIsPlayerVisible" | "setSelectedPresentation" | "setLivePresentations" | "setSelectedConference" | "setSelectedConferenceAccess" | "setSelectedContent" | "setChatroomId" | "updateSelectedPresentationAccess" | "updateSelectedPresentation">>;
28
29
  export {};
@@ -1,5 +1,6 @@
1
1
  import { ref, computed } from "vue";
2
2
  import { defineStore } from "pinia";
3
+ import { usePresentationHelpers } from "../composables/index.mjs";
3
4
  import {
4
5
  setIsPlayerVisibleEventHook,
5
6
  setPlayerConferenceEventHook,
@@ -62,6 +63,13 @@ export const usePlayerConfigStore = defineStore("playerConfig", () => {
62
63
  const updateSelectedPresentationAccess = (payload) => {
63
64
  playerPresentation.value.data.access = payload;
64
65
  };
66
+ const updateSelectedPresentation = (presentation) => {
67
+ const { getPresentationPlayerType } = usePresentationHelpers();
68
+ playerPresentation.value = {
69
+ player_type: getPresentationPlayerType(presentation),
70
+ data: presentation
71
+ };
72
+ };
65
73
  return {
66
74
  isPlayerVisible,
67
75
  playerPresentation,
@@ -78,6 +86,7 @@ export const usePlayerConfigStore = defineStore("playerConfig", () => {
78
86
  setSelectedConferenceAccess,
79
87
  setSelectedContent,
80
88
  setChatroomId,
81
- updateSelectedPresentationAccess
89
+ updateSelectedPresentationAccess,
90
+ updateSelectedPresentation
82
91
  };
83
92
  });
package/package.json CHANGED
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "name": "@icvdeveloper/common-module",
3
- "version": "2.6.3",
3
+ "version": "2.6.5",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "exports": {
7
7
  ".": {
8
- "types": "./dist/types.d.ts",
8
+ "types": "./dist/module.d.ts",
9
9
  "import": "./dist/module.mjs",
10
10
  "require": "./dist/module.cjs"
11
11
  }
12
12
  },
13
13
  "main": "./dist/module.cjs",
14
- "types": "./dist/types.d.ts",
14
+ "types": "./dist/module.d.ts",
15
15
  "files": [
16
16
  "dist"
17
17
  ],