@saooti/octopus-sdk 41.0.14-SNAPSHOT → 41.0.15

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 (70) hide show
  1. package/eslint.config.mjs +5 -3
  2. package/index.ts +8 -1
  3. package/package.json +4 -2
  4. package/plateform.conf +1 -1
  5. package/src/App.vue +3 -7
  6. package/src/api/classicApi.ts +1 -1
  7. package/src/components/composable/player/usePlayerLive.ts +2 -2
  8. package/src/components/composable/player/usePlayerLogic.ts +2 -1
  9. package/src/components/composable/radio/usefetchRadioData.ts +29 -12
  10. package/src/components/composable/route/useSimplePageParam.ts +6 -1
  11. package/src/components/display/categories/CategoryChooser.vue +4 -0
  12. package/src/components/display/comments/CommentList.vue +1 -1
  13. package/src/components/display/emission/EmissionList.vue +2 -1
  14. package/src/components/display/emission/EmissionPresentationItem.vue +14 -6
  15. package/src/components/display/filter/AdvancedSearch.vue +2 -2
  16. package/src/components/display/filter/DateFilter.vue +15 -2
  17. package/src/components/display/live/RadioCurrently.vue +2 -5
  18. package/src/components/display/organisation/OrganisationChooserLight.vue +34 -36
  19. package/src/components/display/podcasts/PodcastPlayButton.vue +6 -1
  20. package/src/components/display/rubriques/RubriqueChooser.vue +24 -2
  21. package/src/components/display/rubriques/RubriqueList.vue +18 -0
  22. package/src/components/display/sharing/PlayerParameters.vue +0 -8
  23. package/src/components/display/sharing/SharePlayer.vue +0 -5
  24. package/src/components/display/sharing/SubscribeButtons.vue +4 -2
  25. package/src/components/form/ClassicCheckbox.vue +30 -5
  26. package/src/components/form/ClassicInputText.vue +32 -12
  27. package/src/components/form/ClassicMultiselect.vue +35 -7
  28. package/src/components/misc/ClassicAccordion.vue +4 -4
  29. package/src/components/misc/ClassicHelpButton.vue +44 -0
  30. package/src/components/misc/ClassicLazy.vue +25 -14
  31. package/src/components/misc/ClassicNav.vue +3 -0
  32. package/src/components/misc/ClassicSpinner.vue +1 -1
  33. package/src/components/misc/FooterSection.vue +17 -20
  34. package/src/components/misc/HomeDropdown.vue +3 -110
  35. package/src/components/misc/MobileMenu.vue +59 -64
  36. package/src/components/misc/TopBar.vue +2 -10
  37. package/src/components/misc/TopBarMainContent.vue +8 -12
  38. package/src/components/misc/UserButtonContent.vue +159 -0
  39. package/src/components/misc/modal/ClassicModal.vue +4 -0
  40. package/src/components/misc/player/PlayerCompact.vue +1 -0
  41. package/src/components/misc/player/PlayerComponent.vue +1 -0
  42. package/src/components/misc/player/elements/PlayerImage.vue +0 -1
  43. package/src/components/misc/player/elements/PlayerTitle.vue +3 -3
  44. package/src/components/misc/player/radio/RadioHistory.vue +3 -2
  45. package/src/components/misc/player/video/PlayerVideo.vue +2 -2
  46. package/src/components/pages/HomePage.vue +5 -4
  47. package/src/components/pages/PageLogout.vue +1 -6
  48. package/src/components/pages/PodcastPage.vue +0 -1
  49. package/src/components/pages/PodcastsPage.vue +1 -1
  50. package/src/components/pages/VideoPage.vue +5 -2
  51. package/src/helper/equals.ts +26 -0
  52. package/src/locale/de.ts +6 -5
  53. package/src/locale/en.ts +6 -5
  54. package/src/locale/es.ts +6 -5
  55. package/src/locale/fr.ts +6 -5
  56. package/src/locale/it.ts +6 -5
  57. package/src/locale/sl.ts +6 -5
  58. package/src/router/router.ts +10 -74
  59. package/src/router/utils.ts +112 -0
  60. package/src/stores/AuthStore.ts +7 -2
  61. package/src/stores/FilterStore.ts +126 -71
  62. package/src/stores/PlayerStore.ts +11 -1
  63. package/src/stores/class/conference/conference.ts +2 -0
  64. package/src/stores/class/general/organisation.ts +2 -2
  65. package/src/stores/class/general/player.ts +2 -2
  66. package/src/style/_variables.scss +6 -0
  67. package/src/style/general.scss +18 -1
  68. package/tsconfig.json +6 -2
  69. package/typings/index.d.ts +1 -0
  70. package/src/helper/radio/radioHelper.ts +0 -15
package/eslint.config.mjs CHANGED
@@ -1,5 +1,4 @@
1
1
  import eslint from '@eslint/js';
2
- import eslintConfigPrettier from 'eslint-config-prettier';
3
2
  import eslintPluginVue from 'eslint-plugin-vue';
4
3
  import globals from 'globals';
5
4
  import typescriptEslint from 'typescript-eslint';
@@ -23,7 +22,10 @@ export default typescriptEslint.config(
23
22
  },
24
23
  rules: {
25
24
  // your rules
25
+ "curly": ['error'],
26
+ "no-console": ['warn', { allow: ['warn', 'error'] }],
27
+ "no-warning-comments": ['warn'],
28
+ "no-duplicate-imports": ['warn']
26
29
  },
27
- },
28
- eslintConfigPrettier
30
+ }
29
31
  );
package/index.ts CHANGED
@@ -38,6 +38,7 @@ export const getClassicModal = () => import("./src/components/misc/modal/Classic
38
38
  export const getClassicLazy = () => import("./src/components/misc/ClassicLazy.vue");
39
39
  export const getContractPreviewModal = () => import("./src/components/misc/modal/ContractPreviewModal.vue");
40
40
  export const getClassicModalInBody = () => import("./src/components/misc/modal/ClassicModalInBody.vue");
41
+ export const getClassicHelpButton = () => import("./src/components/misc/ClassicHelpButton.vue");
41
42
 
42
43
 
43
44
  //Display
@@ -120,6 +121,7 @@ import cookiesHelper from "./src/helper/cookiesHelper.ts";
120
121
  import downloadHelper from "./src/helper/downloadHelper.ts";
121
122
  import displayHelper from "./src/helper/displayHelper.ts";
122
123
  import debounce from "./src/helper/debounceHelper.ts";
124
+ import { deepEqual } from "./src/helper/equals.ts";
123
125
 
124
126
  //stores
125
127
  import {useVastStore} from "./src/stores/VastStore.ts";
@@ -147,6 +149,9 @@ export const getRadiolineIcon = () => import("./src/components/icons/RadiolineIc
147
149
  export const getTuninIcon = () => import("./src/components/icons/TuninIcon.vue");
148
150
  export const getXIcon = () => import("./src/components/icons/XIcon.vue");
149
151
 
152
+ // Routing
153
+ import { setupRouter } from './src/router/utils';
154
+
150
155
  export {
151
156
  useResizePhone,
152
157
  useTagOf,
@@ -175,6 +180,8 @@ export {
175
180
  ModuleApi,
176
181
  classicApi,
177
182
  cookiesHelper,
183
+ deepEqual,
178
184
  downloadHelper,
179
- displayHelper
185
+ displayHelper,
186
+ setupRouter
180
187
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@saooti/octopus-sdk",
3
- "version": "41.0.14-SNAPSHOT",
3
+ "version": "41.0.15",
4
4
  "private": false,
5
5
  "description": "Javascript SDK for using octopus",
6
6
  "author": "Saooti",
@@ -8,6 +8,7 @@
8
8
  "serve": "vite preview",
9
9
  "build": "vite build",
10
10
  "dev": "vite",
11
+ "bundle": "vite-bundle-visualizer",
11
12
  "proxy_authentifié": "node proxy.ts",
12
13
  "proxy_non_authentifié": "node proxy.ts false",
13
14
  "lint": "eslint --fix src",
@@ -31,7 +32,6 @@
31
32
  "axios": "^1.9.0",
32
33
  "dayjs": "^1.11.13",
33
34
  "emoji-mart-vue-fast": "^15.0.4",
34
- "eslint-config-prettier": "^10.1.5",
35
35
  "express": "^5.1.0",
36
36
  "globals": "^16.2.0",
37
37
  "hls.js": "^1.6.5",
@@ -53,6 +53,7 @@
53
53
  "video.js": "^8.23.3",
54
54
  "videojs-quality-selector-hls": "^1.1.1",
55
55
  "vite": "^6.3.5",
56
+ "vite-bundle-visualizer": "^1.2.1",
56
57
  "vue": "^3.5.16",
57
58
  "vue-i18n": "^11.1.5",
58
59
  "vue-material-design-icons": "^5.3.1",
@@ -64,6 +65,7 @@
64
65
  },
65
66
  "devDependencies": {
66
67
  "@types/sockjs-client": "^1.5.4",
68
+ "@types/webpack-env": "^1.18.8",
67
69
  "@vitejs/plugin-vue": "^5.2.4",
68
70
  "eslint": "^9.28.0",
69
71
  "eslint-plugin-vue": "^9.33.0",
package/plateform.conf CHANGED
@@ -1 +1 @@
1
- dev2.saooti.org
1
+ preprod.saooti.org
package/src/App.vue CHANGED
@@ -8,16 +8,14 @@
8
8
  <router-view />
9
9
  <PlayerComponent />
10
10
  </main>
11
- <ClassicLazy :min-height="123">
12
- <FooterOctopus />
13
- </ClassicLazy>
11
+ <FooterOctopus />
14
12
  </template>
15
13
  </div>
16
14
  </template>
17
15
  <script setup lang="ts">
18
16
  import TopBar from "@/components/misc/TopBar.vue";
17
+ import FooterOctopus from "@/components/misc/FooterSection.vue";
19
18
  import PlayerComponent from "@/components/misc/player/PlayerComponent.vue";
20
- import ClassicLazy from "@/components/misc/ClassicLazy.vue";
21
19
  import {useInit} from "./components/composable/useInit";
22
20
  import {useMetaTitle} from "./components/composable/useMetaTitle";
23
21
  import {useOrganisationFilter} from "./components/composable/useOrganisationFilter";
@@ -25,9 +23,7 @@ import { useAuthStore } from "./stores/AuthStore";
25
23
  import { defineAsyncComponent, getCurrentInstance, onBeforeMount, ref, watch } from "vue";
26
24
  import { useRoute } from "vue-router";
27
25
  import { useI18n } from "vue-i18n";
28
- const FooterOctopus = defineAsyncComponent(
29
- () => import("@/components/misc/FooterSection.vue"),
30
- );
26
+
31
27
  const CategoryFilter = defineAsyncComponent(
32
28
  () => import("@/components/display/categories/CategoryFilter.vue"),
33
29
  );
@@ -78,7 +78,7 @@ export default {
78
78
  params.catchFunction();
79
79
  }else{
80
80
  const axiosError= error as AxiosError;
81
- return Promise.reject(new Error(axiosError.message));
81
+ return Promise.reject(axiosError);
82
82
  }
83
83
  });
84
84
  return response?.data;
@@ -51,8 +51,8 @@ export const usePlayerLive = (hlsReady: Ref<boolean>)=>{
51
51
  }
52
52
 
53
53
  function playLive() {
54
- if (!playerStore.playerLive) return;
55
- playerStore.playerUpdatePlayerHlsUrl(`${apiStore.hlsUrl}live/dev.${playerStore.playerLive.conferenceId}/index.m3u8`);
54
+ if (!playerStore.playerHlsIdentifier) return;
55
+ playerStore.playerUpdatePlayerHlsUrl(`${apiStore.hlsUrl}live/${playerStore.playerHlsIdentifier}/index.m3u8`);
56
56
  playHls();
57
57
  }
58
58
 
@@ -11,7 +11,8 @@ import fetchHelper from "../../../helper/fetchHelper";
11
11
  import classicApi from "../../../api/classicApi";
12
12
  import dayjs from "dayjs";
13
13
  import { FetchParam } from "@/stores/class/general/fetchParam";
14
- export const usePlayerLogic = (forceHide: Ref<boolean, boolean>)=>{
14
+
15
+ export const usePlayerLogic = (forceHide: Ref<boolean, boolean>) => {
15
16
  const hlsReady= ref(false);
16
17
 
17
18
  const { listenTime, onPlay, setDownloadId, onTimeUpdateProgress, playLive, endingLive, playRadio} = usePlayerLive(hlsReady);
@@ -2,17 +2,19 @@ import classicApi from "../../../api/classicApi";
2
2
  import { MediaRadio, MetadataRadio, NextAdvertising } from '@/stores/class/general/player';
3
3
  import { Podcast } from '@/stores/class/general/podcast';
4
4
  import dayjs from 'dayjs';
5
- import radioHelper from "../../../helper/radio/radioHelper";
6
5
  import {onBeforeUnmount, Ref, ref} from 'vue';
6
+ import { useI18n } from "vue-i18n";
7
7
  export const useFetchRadio = ()=>{
8
8
 
9
9
  const radioInterval : Ref<ReturnType<typeof setTimeout> | undefined> = ref(undefined);
10
+
11
+ const {t} = useI18n();
10
12
 
11
13
  async function fetchRadioMetadata(
12
14
  canalId: number,
13
15
  previousTitle: string,
14
16
  callbackMetadata: (
15
- metadata: MediaRadio,
17
+ metadata: MediaRadio|undefined,
16
18
  podcast: Podcast | undefined,
17
19
  history: Array<MediaRadio>
18
20
  ) => void,
@@ -33,15 +35,19 @@ export const useFetchRadio = ()=>{
33
35
  callbackAdvertising(metadata.nextAdvertising);
34
36
  }
35
37
  const arrayMetadata = metadata.previously;
36
- arrayMetadata.unshift(metadata.currently);
37
- for (let index = 0, len = arrayMetadata.length; index < len; index++) {
38
- if (
39
- dayjs().valueOf() - 18000 >
40
- dayjs(arrayMetadata[index].startDate).valueOf()
41
- ) {
42
- await useCallbackIfNewMetadata(previousTitle, arrayMetadata, index, len,callbackMetadata);
43
- return;
38
+ if(null!==metadata.currently){
39
+ arrayMetadata.unshift(metadata.currently);
40
+ for (let index = 0, len = arrayMetadata.length; index < len; index++) {
41
+ if (
42
+ dayjs().valueOf() - 18000 >
43
+ dayjs(arrayMetadata[index].startDate).valueOf()
44
+ ) {
45
+ await useCallbackIfNewMetadata(previousTitle, arrayMetadata, index, len,callbackMetadata);
46
+ return;
47
+ }
44
48
  }
49
+ }else{
50
+ callbackMetadata(undefined, undefined, arrayMetadata);
45
51
  }
46
52
  }
47
53
  async function useCallbackIfNewMetadata(previousTitle: string, arrayMetadata: Array<MediaRadio>, index:number, len: number, callbackMetadata: (
@@ -63,11 +69,22 @@ export const useFetchRadio = ()=>{
63
69
  }
64
70
  }
65
71
  }
66
- function displayTitle(metadata: MediaRadio): string {
67
- return radioHelper.displayTitle(metadata);
72
+ function displayTitle(metadata: MediaRadio|undefined): string {
73
+ if(!metadata){
74
+ return t("Silent stream");
75
+ }
76
+ let title = "";
77
+ if (metadata?.title) {
78
+ title += metadata.title;
79
+ }
80
+ if (metadata?.artist) {
81
+ title += " - " + metadata.artist;
82
+ }
83
+ return title;
68
84
  }
69
85
 
70
86
 
87
+
71
88
  onBeforeUnmount(() => {
72
89
  clearInterval(radioInterval.value as unknown as number);
73
90
  })
@@ -29,11 +29,16 @@ export const useSimplePageParam = (props: {readonly [key:string]: string|number}
29
29
  }
30
30
  });
31
31
 
32
+ // When changing global organisation, update organisation here
33
+ watch(() => filterStore.filterOrgaId, () => {
34
+ organisationId.value = filterStore.filterOrgaId;
35
+ });
36
+
32
37
  onMounted(() => {
33
38
  initOrga();
34
39
  initSearchPattern();
35
40
  isInit.value = true;
36
- })
41
+ });
37
42
 
38
43
  function getMinSize(param:string){
39
44
  return param.length>3 ?param : ""
@@ -17,6 +17,8 @@
17
17
  :is-disabled="isDisabled"
18
18
  :no-deselect="noDeselect"
19
19
  :display-required="displayRequired"
20
+ :popover="popover"
21
+ :popover-relative-class="popoverRelativeClass"
20
22
  @on-search="onSearchCategory"
21
23
  @selected="onCategorySelected"
22
24
  />
@@ -52,6 +54,8 @@ const props = defineProps({
52
54
  displayLabel: { default: false, type: Boolean },
53
55
  textDanger :{ default: undefined, type: String },
54
56
  displayRequired: { default: false, type: Boolean },
57
+ popover: { default: undefined, type: String },
58
+ popoverRelativeClass: { default: undefined, type: String },
55
59
  })
56
60
 
57
61
  //Emits
@@ -116,8 +116,8 @@ const { t } = useI18n();
116
116
  const {handle403} = useErrorHandler();
117
117
 
118
118
  //Computed
119
- const changed = computed(() => `${props.size}|${props.reload}|${dsize.value}|${props.stateFilter}|${props.podcast?.podcastId}|${props.organisationId}`);
120
119
  const isNotAnAnswerList = computed(() => undefined === props.answerToComment);
120
+ const changed = computed(() => `${props.size}|${props.reload}|${dsize.value}|${props.stateFilter}|${props.podcast?.podcastId}|${props.organisationId}`);
121
121
  const sortChoice = computed(() =>{
122
122
  return [
123
123
  { title: t("The most recent"), value: "DATE_DESC" },
@@ -122,8 +122,9 @@ const displayArray = computed(() => {
122
122
  });
123
123
  const displayRubriquage = computed(() => state.emissionsPage.rubriquage);
124
124
  const changePaginate = computed(() => `${props.first}|${props.size}`);
125
+ /** Computed property to track for configuration changes */
125
126
  const changed = computed(() => {
126
- return `${props.organisationId}|${props.query}|${props.monetisable}|${props.includeHidden}
127
+ return `${props.organisationId}|${props.query}|${props.monetisable}|${props.includeHidden}|\
127
128
  ${props.iabId}|${props.rubriqueId}|${props.rubriquageId}|${props.before}|${props.after}|${props.sort}|${props.noRubriquageId}`;
128
129
  });
129
130
  const sortText = computed(() => {
@@ -13,9 +13,9 @@
13
13
  :class="isVertical ? 'flex-column' : ''"
14
14
  >
15
15
  <img
16
- v-lazy="useProxyImageUrl(emission.imageUrl, isVertical ? '400' : '250')"
17
- :width="isVertical ? '400' : '250'"
18
- :height="isVertical ? '400' : '250'"
16
+ v-lazy="useProxyImageUrl(emission.imageUrl, tailleImage)"
17
+ :width="tailleImage"
18
+ :height="tailleImage"
19
19
  :class="isVertical ? 'img-box-bigger' : ''"
20
20
  class="img-box"
21
21
  aria-hidden="true"
@@ -49,7 +49,7 @@ import {useResizePhone} from "../../composable/useResizePhone";
49
49
  import { Emission } from "@/stores/class/general/emission";
50
50
  import {useImageProxy} from "../../composable/useImageProxy";
51
51
  import displayHelper from "../../../helper/displayHelper";
52
- import { nextTick, useTemplateRef, watch } from "vue";
52
+ import { nextTick, useTemplateRef, watch, computed } from "vue";
53
53
  import { useI18n } from "vue-i18n";
54
54
 
55
55
  //Props
@@ -69,6 +69,13 @@ const { t } = useI18n();
69
69
  const { isPhone } = useResizePhone();
70
70
  const { useProxyImageUrl } = useImageProxy();
71
71
 
72
+ // Computed
73
+ // Calcul de la taille de l'image
74
+ const tailleImage = computed(() => {
75
+ // L'élément fait 400 de large à la verticale, mais on prend en compte les bordures
76
+ return props.isVertical ? '396' : '250';
77
+ });
78
+
72
79
  //Watch
73
80
  watch(isPhone, async () => {
74
81
  nextTick(() => {
@@ -114,8 +121,9 @@ function urlify(text:string|undefined){
114
121
  }
115
122
 
116
123
  .img-box-bigger {
117
- width: 400px;
118
- height: 400px;
124
+ // L'élément fait 400 de large à la verticale, mais on prend en compte les bordures
125
+ width: 396px;
126
+ height: 396px;
119
127
  }
120
128
  }
121
129
  </style>
@@ -173,7 +173,7 @@ const isSelectValidity = computed(() => {
173
173
 
174
174
  //Watch
175
175
  watch(organisation, async () => {
176
- const hidden =undefined !== organisation.value && organisationRight.value &&!props.isEmission;
176
+ const hidden = undefined !== organisation.value && organisationRight.value && !props.isEmission;
177
177
  if (hidden !== props.includeHidden) {
178
178
  updateIncludeHidden(hidden);
179
179
  }
@@ -190,7 +190,6 @@ watch(()=>props.searchPattern, (value: string) => {
190
190
  });
191
191
  });
192
192
 
193
-
194
193
  //Methods
195
194
  function updateMonetisable(value: string): void {
196
195
  emit("update:monetisable", value);
@@ -253,6 +252,7 @@ function clickShowFilters(): void {
253
252
  showFilters.value = !showFilters.value;
254
253
  }
255
254
  </script>
255
+
256
256
  <style lang="scss">
257
257
  .octopus-app {
258
258
  .advanced-search-container {
@@ -28,7 +28,7 @@ import ClassicDatePicker from "../../form/ClassicDatePicker.vue";
28
28
  import { ref, watch } from "vue";
29
29
  import { useI18n } from "vue-i18n";
30
30
 
31
- //Props
31
+ //Props
32
32
  const props = defineProps({
33
33
  isEmission: { default: false, type: Boolean },
34
34
  fromDate: { default: undefined, type: String },
@@ -38,7 +38,7 @@ const props = defineProps({
38
38
  //Emits
39
39
  const emit = defineEmits(["updateDates"]);
40
40
 
41
- //Data
41
+ //Data
42
42
  const isActive = ref([false, false]);
43
43
  const internDates = ref([
44
44
  dayjs().subtract(10, "days").startOf("day").toDate(),
@@ -50,6 +50,17 @@ const { t } = useI18n();
50
50
 
51
51
 
52
52
  //Watch
53
+ watch(isActive, () => {
54
+ emit("updateDates", {
55
+ from: isActive.value[0]
56
+ ? dayjs(internDates.value[0]).toISOString()
57
+ : undefined,
58
+ to: isActive.value[1]
59
+ ? dayjs(internDates.value[1]).toISOString()
60
+ : undefined,
61
+ });
62
+ }, { deep: true });
63
+
53
64
  watch(()=>props.toDate, () => {
54
65
  isActive.value[1] = undefined !== props.toDate;
55
66
  if (props.toDate && props.toDate !== internDates.value[1].toISOString()) {
@@ -75,6 +86,8 @@ watch(()=>props.fromDate, () => {
75
86
 
76
87
 
77
88
  //Methods
89
+
90
+
78
91
  function updateDate(index: number, value: Date): void {
79
92
  internDates.value[index] = value;
80
93
  if (
@@ -72,10 +72,7 @@ const currentlyPlayingString = computed(() => {
72
72
  if (playingRadio.value && playerStore.playerRadio) {
73
73
  return displayTitle(playerStore.playerRadio.metadata);
74
74
  }
75
- if (currentMetadata.value) {
76
- return displayTitle(currentMetadata.value);
77
- }
78
- return "";
75
+ return displayTitle(currentMetadata.value);
79
76
  });
80
77
 
81
78
  onMounted(()=>{
@@ -102,7 +99,7 @@ async function fetchCurrentlyPlaying(): Promise<void> {
102
99
  updateMetadata,
103
100
  );
104
101
  }
105
- function updateMetadata(metadata: MediaRadio, podcast?: Podcast): void {
102
+ function updateMetadata(metadata: MediaRadio|undefined, podcast?: Podcast): void {
106
103
  currentMetadata.value = metadata;
107
104
  currentPodcast.value = podcast;
108
105
  }
@@ -1,66 +1,64 @@
1
1
  <template>
2
- <ClassicSelect
3
- v-if="(!value || init) && organisation"
4
- v-model:text-init="actual"
5
- :display-label="false"
6
- id-select="organisation-chooser-footer"
7
- :label="t('select productor')"
8
- :transparent="true"
9
- :options="[
10
- { title: organisation.name, value: organisation.id },
11
- { title: t('No organisation filter'), value: 'NONE' },
12
- ]"
13
- class="my-1"
14
- />
2
+ <ClassicSelect
3
+ v-if="init && organisation"
4
+ :text-init="actual"
5
+ :display-label="false"
6
+ id-select="organisation-chooser-footer"
7
+ :label="t('select productor')"
8
+ :transparent="true"
9
+ :options="[
10
+ { title: organisation.name, value: organisation.id },
11
+ { title: t('No organisation filter'), value: 'NONE' },
12
+ ]"
13
+ class="my-1"
14
+ @update:text-init="updateOrganisation"
15
+ />
15
16
  </template>
16
17
 
17
18
  <script setup lang="ts">
18
19
  import ClassicSelect from "../../form/ClassicSelect.vue";
19
20
  import { Organisation } from "@/stores/class/general/organisation";
20
21
  import { useSaveFetchStore } from "../../../stores/SaveFetchStore";
21
- import { Ref, ref, watch } from "vue";
22
+ import { computed, ref, watch } from "vue";
22
23
  import { useI18n } from "vue-i18n";
23
-
24
-
25
- //Props
26
- const props = defineProps({
27
- value: { default: undefined, type: String },
28
- reset: { default: false, type: Boolean },
29
- })
24
+ import { useFilterStore } from "../../../stores/FilterStore";
30
25
 
31
26
  //Emits
32
27
  const emit = defineEmits(["selected"]);
33
28
 
34
29
  //Data
35
- const actual = ref("NONE");
36
- const organisation: Ref<Organisation | undefined> = ref(undefined);
30
+ const organisation = ref<Organisation|undefined>(undefined);
37
31
  const init = ref(false);
38
32
 
39
33
  //Composables
40
34
  const { t } = useI18n();
41
35
  const SaveFetchStore = useSaveFetchStore();
36
+ const filterStore = useFilterStore();
42
37
 
38
+ // Computed
39
+ const actual = computed(() => {
40
+ if (filterStore.filterOrgaId) {
41
+ return filterStore.filterOrgaId;
42
+ } else {
43
+ return 'NONE';
44
+ }
45
+ });
43
46
 
44
47
  //Watch
45
- watch(()=>props.value, async () => {
46
- if (!init.value || props.value) {
47
- fetchOrganisation();
48
- }
48
+ watch(()=>filterStore.realOrgaId, async () => {
49
+ fetchOrganisation();
49
50
  }, {deep: true, immediate: true});
50
- watch(()=>props.reset, async () => {
51
- actual.value = "NONE";
52
- });
53
- watch(actual, async () => {
54
- emit("selected","NONE" === actual.value ? undefined : organisation.value);
55
- });
56
51
 
57
52
  //Methods
58
53
  async function fetchOrganisation(): Promise<void> {
59
- if (!props.value) {
54
+ if (!filterStore.realOrgaId) {
60
55
  return;
61
56
  }
62
- organisation.value = await SaveFetchStore.getOrgaData(props.value);
63
- actual.value = organisation.value.id;
57
+ organisation.value = await SaveFetchStore.getOrgaData(filterStore.realOrgaId);
64
58
  init.value = true;
65
59
  }
60
+
61
+ function updateOrganisation(value: string): void {
62
+ emit("selected", "NONE" === value ? undefined : organisation.value);
63
+ }
66
64
  </script>
@@ -211,7 +211,10 @@ function play(isVideo: boolean): void {
211
211
  playerStore.playerPlay(
212
212
  {
213
213
  ...props.podcast,
214
- ...{ conferenceId: props.fetchConference?.conferenceId },
214
+ ...{
215
+ conferenceId: props.fetchConference?.conferenceId,
216
+ hlsIdentifier: props.fetchConference?.hlsIdentifier,
217
+ },
215
218
  },
216
219
  isVideo,
217
220
  );
@@ -225,6 +228,8 @@ function play(isVideo: boolean): void {
225
228
  position: absolute;
226
229
  inset: 0;
227
230
  background-color:var(--octopus-background-transparent);
231
+ // Allow pointer events to go through (allow click on image beneath blur)
232
+ pointer-events: none;
228
233
  }
229
234
 
230
235
  .live-image-status {
@@ -7,7 +7,7 @@
7
7
  :display-label="displayLabel"
8
8
  :label="label ?? t('By rubric')"
9
9
  :text-danger="textDanger"
10
- :placeholder="t('Type string to filter by categories')"
10
+ :placeholder="placeholderText"
11
11
  :max-element="maxElement"
12
12
  :multiple="multiple"
13
13
  :min-search-length="1"
@@ -30,8 +30,14 @@ import { useI18n } from "vue-i18n";
30
30
  const props = defineProps({
31
31
  defaultanswer: { default: "", type: String },
32
32
  width: { default: "100%", type: String },
33
+ /**
34
+ * Active la sélection multiple
35
+ */
33
36
  multiple: { default: false, type: Boolean },
34
37
  reset: { default: false, type: Boolean },
38
+ /**
39
+ * Les rubriques à afficher
40
+ */
35
41
  allRubriques: { default: () => [], type: Array as () => Array<Rubrique> },
36
42
  rubriqueSelected: { default: undefined, type: Number },
37
43
  rubriqueSelectedArray: {
@@ -46,6 +52,10 @@ const props = defineProps({
46
52
  label:{default: undefined, type: String },
47
53
  displayLabel: { default: false, type: Boolean },
48
54
  textDanger :{ default: undefined, type: String },
55
+ /**
56
+ * Le texte affiché là où l'utilisateur doit effectuer sa saisie
57
+ */
58
+ placeholder: { type: String, required: false, default: undefined }
49
59
  })
50
60
 
51
61
 
@@ -55,7 +65,9 @@ const emit = defineEmits([
55
65
  "update:rubriqueSelectedArray",
56
66
  "selected"
57
67
  ]);
58
- //COmposables
68
+
69
+
70
+ //Composables
59
71
  const { t } = useI18n();
60
72
 
61
73
 
@@ -102,6 +114,16 @@ const model = computed({
102
114
  },
103
115
  })
104
116
 
117
+ /**
118
+ * Le texte à afficher dans la saisie de l'utilisateur
119
+ */
120
+ const placeholderText = computed(() => {
121
+ if (props.placeholder) {
122
+ return props.placeholder;
123
+ } else {
124
+ return t('Type string to filter by categories');
125
+ }
126
+ });
105
127
 
106
128
  //Watch
107
129
  watch(()=>props.rubriqueSelected, () => {