{"version":3,"file":"PodcastList-R7XuGHfp.mjs","names":[],"sources":["../src/components/display/podcasts/PodcastList.vue","../src/components/display/podcasts/PodcastList.vue"],"sourcesContent":["<!--\n  Component displaying a list of podcast\n  DO NOT confuse this with PodcastList from playlist\n-->\n<template>\n  <ListPaginate\n    id=\"podcastListPaginate\"\n    v-model:first=\"dfirst\"\n    v-model:rows-per-page=\"dsize\"\n    v-model:is-mobile=\"isMobile\"\n    :text-count=\"\n      showCount && podcasts.length > 1\n        ? t('Number podcasts', { nb: totalCount }) + sortText\n        : undefined\n    \"\n    :total-count=\"totalCount\"\n    :loading=\"loading\"\n    :loading-text=\"loading ? t('Loading podcasts ...') : undefined\"\n    :error-text=\"\n      !loading && !podcasts.length\n        ? t(`No podcast match your query`)\n        : undefined\n    \"\n    :just-size-chosen=\"justSizeChosen\"\n    :player-responsive=\"true\"\n    :force-update-parameters=\"forceUpdateParameters\"\n  >\n    <template #list>\n      <div class=\"octopus-element-list\">\n        <ClassicLazy\n          v-for=\"p in displayArray\"\n          :key=\"p.podcastId\"\n          :min-height=\"410\"\n        >\n          <PodcastItem\n            v-if=\"0 !== p.podcastId\"\n            :podcast=\"p\"\n          />\n          <template #preview>\n            <router-link\n              :to=\"{\n                name: 'podcast',\n                params: { podcastId: p.podcastId },\n              }\"\n              :title=\"t('Episode name page', { name: p.title })\"\n            >\n              {{ p.title }}\n            </router-link>\n          </template>\n        </ClassicLazy>\n      </div>\n    </template>\n  </ListPaginate>\n</template>\n\n<script setup lang=\"ts\">\nimport ListPaginate from \"../list/ListPaginate.vue\";\nimport {useErrorHandler} from \"../../composable/useErrorHandler\";\nimport PodcastItem from \"./PodcastItem.vue\";\nimport ClassicLazy from \"../../misc/ClassicLazy.vue\";\nimport { useFilterStore } from \"../../../stores/FilterStore\";\nimport { Podcast, PodcastProcessingStatus, emptyPodcastData } from \"../../../stores/class/general/podcast\";\nimport { computed, onBeforeMount, Ref, ref, watch } from \"vue\";\nimport { AxiosError } from \"axios\";\nimport { useI18n } from \"vue-i18n\";\nimport { podcastApi, PodcastMonetisation, PodcastSearchOptions, PodcastSort } from \"../../../api/podcastApi\";\nimport { EmissionGroup } from \"@/api/groupsApi\";\n\n//Props \nconst props = withDefaults(defineProps<{\n  first?: number;\n  size?: number;\n  organisationId?: Array<string>;\n  emissionId?: number;\n  iabId?: number;\n  participantId?: number;\n  query?: string;\n  monetisable?: PodcastMonetisation;\n  popularSort?: boolean;\n  reload?: boolean;\n  before?: string;\n  after?: string;\n  includeHidden?: boolean;\n  /** Enable the display of number of items in ListPaginate */\n  showCount?: boolean;\n  displaySortText?: boolean;\n  /** Criteria to sort on */\n  sortCriteria?: PodcastSort;\n  validity?: 'true'|'false'|''|boolean; // TODO improve this\n  rubriqueId?: Array<number>;\n  rubriquageId?: Array<number>;\n  noRubriquageId?: Array<number>;\n  justSizeChosen?: boolean;\n  withVideo?: boolean;\n  includeTag?: Array<string>;\n  forceUpdateParameters?: boolean;\n  /** The beneficiaries to filter on */\n  beneficiaries?: Array<string>;\n  /** The emission groups to filter on */\n  emissionGroups?: Array<EmissionGroup>;\n  /** The seasons to filter on */\n  seasons?: Array<number>;\n}>(), {\n  first: 0,\n  size: 30,\n  popularSort: false,\n  reload: false,\n  includeHidden: false,\n  showCount: false,\n  displaySortText: true,\n  validity: '',\n  justSizeChosen: false,\n  withVideo: undefined,\n  forceUpdateParameters: false\n});\n\n//Emits\nconst emit = defineEmits([\"fetch\", \"emptyList\"]);\n\n//Data \nconst loading = ref(true);\nconst dfirst = ref(props.first);\nconst dsize = ref(props.size);\nconst totalCount = ref(0);\nconst isMobile = ref(false);\nconst podcasts: Ref<Array<Podcast>> = ref([]);\n\n//Composables\nconst { t } = useI18n();\nconst {handle403} = useErrorHandler();\nconst filterStore = useFilterStore();\n\n//Computed\nconst displayArray = computed(() => {\n  if (isMobile.value || props.justSizeChosen) {\n    return podcasts.value;\n  }\n  return podcasts.value.slice(\n    dfirst.value,\n    Math.min(dfirst.value + dsize.value, totalCount.value),\n  );\n});\nconst changePaginate = computed(() => `${props.first}|${props.size}`);\nconst changed = computed(() => {\n  return `${organisation.value}|${props.emissionId}|${props.sortCriteria}|${sort.value}\n    ${props.iabId}|${props.participantId}|${props.query}|${props.monetisable}|${props.popularSort}|\n    ${props.rubriqueId}|${props.rubriquageId}|${props.before}|${props.after}|${props.includeHidden}|${props.noRubriquageId}|${props.validity}|\n    ${props.withVideo}|${props.includeTag}|${props.beneficiaries}|${props.emissionGroups}`;\n});\nconst organisation = computed(() => {\n  if (props.organisationId) {\n    return props.organisationId;\n  }\n  return filterStore.filterOrgaId ? [filterStore.filterOrgaId] : [];\n});\nconst sort = computed(() => props.popularSort ? PodcastSort.POPULARITY : (props.sortCriteria ?? PodcastSort.DATE));\nconst sortText = computed(() => {\n  if (!props.displaySortText) {\n    return \"\";\n  }\n  switch (props.sortCriteria) {\n    case \"SCORE\":\n      return \" \" + t(\"sort by score\");\n    case \"DATE\":\n      return \" \" + t(\"sort by date\");\n    case \"NAME\":\n      return \" \" + t(\"sort by alphabetical\");\n    default:\n      return \" \" + t(\"sort by date\");\n  }\n});\n\n//Watch\nwatch(changePaginate, () => {\n  dfirst.value = props.first;\n  dsize.value = props.size;\n});\nwatch(changed, () => fetchContent(true));\nwatch(()=>props.reload, () => fetchContent(true));\nwatch(dsize, () => fetchContent(true));\nwatch(dfirst, () => {\n  if (\n    !podcasts.value[dfirst.value] ||\n    0 === podcasts.value[dfirst.value].podcastId\n  ) {\n    fetchContent(false);\n  }\n});\n\nonBeforeMount(()=>fetchContent(false))\n\n//Methods\nasync function fetchContent(reset: boolean): Promise<void> {\n  loading.value = true;\n\n  // Sadly we kinda have no idea what will be passed as 'validity', we need to\n  // handle multiple cases.\n  let validity: undefined|boolean = undefined;\n  if (props.validity !== undefined && props.validity !== '') {\n    validity = props.validity === 'true' || props.validity === true;\n  }\n  \n  const param: PodcastSearchOptions = {\n    first: reset ? 0 : dfirst.value,\n    size: dsize.value,\n    organisationId: organisation.value,\n    emissionId: props.emissionId,\n    groupId: props.emissionGroups?.map(g => g.groupId),\n    iabId: props.iabId,\n    participantId: props.participantId,\n    query: props.query,\n    monetisable: props.monetisable,\n    sort: sort.value,\n    pubDateBefore: props.before,\n    pubDateAfter: props.after,\n    noRubriquageId: props.noRubriquageId?.length\n      ? props.noRubriquageId\n      : undefined,\n    rubriqueId: props.rubriqueId?.length ? props.rubriqueId : undefined,\n    rubriquageId: props.rubriquageId?.length ? props.rubriquageId : undefined,\n    includeHidden: props.includeHidden,\n    validity,\n    /* publisherId:\n      !this.onlyValid && !authStore.isRoleProduction\n        ? authStore.authProfile?.userId\n        : undefined, */\n    processingStatus: [PodcastProcessingStatus.Ready, PodcastProcessingStatus.Processing],\n    withVideo: props.withVideo,\n    tags: props.includeTag?.length ? props.includeTag : undefined,\n    beneficiaries: props.beneficiaries ?? undefined,\n    season: props.seasons\n  };\n\n  try {\n    const data = await podcastApi.searchFull(param, true);\n    afterFetching(reset, data);\n  } catch (error) {\n    if (error instanceof AxiosError) {\n      handle403(error as AxiosError);\n    } else {\n      console.error('error', error);\n    }\n  }\n}\nfunction afterFetching(\n  reset: boolean,\n  data: { count: number; result: Array<Podcast>; sort: string },\n): void {\n  if (reset) {\n    dfirst.value = 0;\n    podcasts.value.length = 0;\n  }\n  if (dfirst.value > podcasts.value.length) {\n    for (\n      let i = podcasts.value.length - 1, len = dfirst.value + dsize.value;\n      i < len;\n      i++\n    ) {\n      podcasts.value.push(emptyPodcastData());\n    }\n  }\n  const responsePodcasts = data.result.filter((p: Podcast | null) => {\n    return null !== p;\n  });\n  podcasts.value = podcasts.value\n    .slice(0, dfirst.value)\n    .concat(responsePodcasts)\n    .concat(\n      podcasts.value.slice(dfirst.value + dsize.value, podcasts.value.length),\n    );\n  emit(\"fetch\", podcasts.value);\n  totalCount.value = props.justSizeChosen ? props.size : data.count;\n  if (0 === podcasts.value.length) {\n    emit(\"emptyList\");\n  }\n  loading.value = false;\n}\n</script>\n","<!--\n  Component displaying a list of podcast\n  DO NOT confuse this with PodcastList from playlist\n-->\n<template>\n  <ListPaginate\n    id=\"podcastListPaginate\"\n    v-model:first=\"dfirst\"\n    v-model:rows-per-page=\"dsize\"\n    v-model:is-mobile=\"isMobile\"\n    :text-count=\"\n      showCount && podcasts.length > 1\n        ? t('Number podcasts', { nb: totalCount }) + sortText\n        : undefined\n    \"\n    :total-count=\"totalCount\"\n    :loading=\"loading\"\n    :loading-text=\"loading ? t('Loading podcasts ...') : undefined\"\n    :error-text=\"\n      !loading && !podcasts.length\n        ? t(`No podcast match your query`)\n        : undefined\n    \"\n    :just-size-chosen=\"justSizeChosen\"\n    :player-responsive=\"true\"\n    :force-update-parameters=\"forceUpdateParameters\"\n  >\n    <template #list>\n      <div class=\"octopus-element-list\">\n        <ClassicLazy\n          v-for=\"p in displayArray\"\n          :key=\"p.podcastId\"\n          :min-height=\"410\"\n        >\n          <PodcastItem\n            v-if=\"0 !== p.podcastId\"\n            :podcast=\"p\"\n          />\n          <template #preview>\n            <router-link\n              :to=\"{\n                name: 'podcast',\n                params: { podcastId: p.podcastId },\n              }\"\n              :title=\"t('Episode name page', { name: p.title })\"\n            >\n              {{ p.title }}\n            </router-link>\n          </template>\n        </ClassicLazy>\n      </div>\n    </template>\n  </ListPaginate>\n</template>\n\n<script setup lang=\"ts\">\nimport ListPaginate from \"../list/ListPaginate.vue\";\nimport {useErrorHandler} from \"../../composable/useErrorHandler\";\nimport PodcastItem from \"./PodcastItem.vue\";\nimport ClassicLazy from \"../../misc/ClassicLazy.vue\";\nimport { useFilterStore } from \"../../../stores/FilterStore\";\nimport { Podcast, PodcastProcessingStatus, emptyPodcastData } from \"../../../stores/class/general/podcast\";\nimport { computed, onBeforeMount, Ref, ref, watch } from \"vue\";\nimport { AxiosError } from \"axios\";\nimport { useI18n } from \"vue-i18n\";\nimport { podcastApi, PodcastMonetisation, PodcastSearchOptions, PodcastSort } from \"../../../api/podcastApi\";\nimport { EmissionGroup } from \"@/api/groupsApi\";\n\n//Props \nconst props = withDefaults(defineProps<{\n  first?: number;\n  size?: number;\n  organisationId?: Array<string>;\n  emissionId?: number;\n  iabId?: number;\n  participantId?: number;\n  query?: string;\n  monetisable?: PodcastMonetisation;\n  popularSort?: boolean;\n  reload?: boolean;\n  before?: string;\n  after?: string;\n  includeHidden?: boolean;\n  /** Enable the display of number of items in ListPaginate */\n  showCount?: boolean;\n  displaySortText?: boolean;\n  /** Criteria to sort on */\n  sortCriteria?: PodcastSort;\n  validity?: 'true'|'false'|''|boolean; // TODO improve this\n  rubriqueId?: Array<number>;\n  rubriquageId?: Array<number>;\n  noRubriquageId?: Array<number>;\n  justSizeChosen?: boolean;\n  withVideo?: boolean;\n  includeTag?: Array<string>;\n  forceUpdateParameters?: boolean;\n  /** The beneficiaries to filter on */\n  beneficiaries?: Array<string>;\n  /** The emission groups to filter on */\n  emissionGroups?: Array<EmissionGroup>;\n  /** The seasons to filter on */\n  seasons?: Array<number>;\n}>(), {\n  first: 0,\n  size: 30,\n  popularSort: false,\n  reload: false,\n  includeHidden: false,\n  showCount: false,\n  displaySortText: true,\n  validity: '',\n  justSizeChosen: false,\n  withVideo: undefined,\n  forceUpdateParameters: false\n});\n\n//Emits\nconst emit = defineEmits([\"fetch\", \"emptyList\"]);\n\n//Data \nconst loading = ref(true);\nconst dfirst = ref(props.first);\nconst dsize = ref(props.size);\nconst totalCount = ref(0);\nconst isMobile = ref(false);\nconst podcasts: Ref<Array<Podcast>> = ref([]);\n\n//Composables\nconst { t } = useI18n();\nconst {handle403} = useErrorHandler();\nconst filterStore = useFilterStore();\n\n//Computed\nconst displayArray = computed(() => {\n  if (isMobile.value || props.justSizeChosen) {\n    return podcasts.value;\n  }\n  return podcasts.value.slice(\n    dfirst.value,\n    Math.min(dfirst.value + dsize.value, totalCount.value),\n  );\n});\nconst changePaginate = computed(() => `${props.first}|${props.size}`);\nconst changed = computed(() => {\n  return `${organisation.value}|${props.emissionId}|${props.sortCriteria}|${sort.value}\n    ${props.iabId}|${props.participantId}|${props.query}|${props.monetisable}|${props.popularSort}|\n    ${props.rubriqueId}|${props.rubriquageId}|${props.before}|${props.after}|${props.includeHidden}|${props.noRubriquageId}|${props.validity}|\n    ${props.withVideo}|${props.includeTag}|${props.beneficiaries}|${props.emissionGroups}`;\n});\nconst organisation = computed(() => {\n  if (props.organisationId) {\n    return props.organisationId;\n  }\n  return filterStore.filterOrgaId ? [filterStore.filterOrgaId] : [];\n});\nconst sort = computed(() => props.popularSort ? PodcastSort.POPULARITY : (props.sortCriteria ?? PodcastSort.DATE));\nconst sortText = computed(() => {\n  if (!props.displaySortText) {\n    return \"\";\n  }\n  switch (props.sortCriteria) {\n    case \"SCORE\":\n      return \" \" + t(\"sort by score\");\n    case \"DATE\":\n      return \" \" + t(\"sort by date\");\n    case \"NAME\":\n      return \" \" + t(\"sort by alphabetical\");\n    default:\n      return \" \" + t(\"sort by date\");\n  }\n});\n\n//Watch\nwatch(changePaginate, () => {\n  dfirst.value = props.first;\n  dsize.value = props.size;\n});\nwatch(changed, () => fetchContent(true));\nwatch(()=>props.reload, () => fetchContent(true));\nwatch(dsize, () => fetchContent(true));\nwatch(dfirst, () => {\n  if (\n    !podcasts.value[dfirst.value] ||\n    0 === podcasts.value[dfirst.value].podcastId\n  ) {\n    fetchContent(false);\n  }\n});\n\nonBeforeMount(()=>fetchContent(false))\n\n//Methods\nasync function fetchContent(reset: boolean): Promise<void> {\n  loading.value = true;\n\n  // Sadly we kinda have no idea what will be passed as 'validity', we need to\n  // handle multiple cases.\n  let validity: undefined|boolean = undefined;\n  if (props.validity !== undefined && props.validity !== '') {\n    validity = props.validity === 'true' || props.validity === true;\n  }\n  \n  const param: PodcastSearchOptions = {\n    first: reset ? 0 : dfirst.value,\n    size: dsize.value,\n    organisationId: organisation.value,\n    emissionId: props.emissionId,\n    groupId: props.emissionGroups?.map(g => g.groupId),\n    iabId: props.iabId,\n    participantId: props.participantId,\n    query: props.query,\n    monetisable: props.monetisable,\n    sort: sort.value,\n    pubDateBefore: props.before,\n    pubDateAfter: props.after,\n    noRubriquageId: props.noRubriquageId?.length\n      ? props.noRubriquageId\n      : undefined,\n    rubriqueId: props.rubriqueId?.length ? props.rubriqueId : undefined,\n    rubriquageId: props.rubriquageId?.length ? props.rubriquageId : undefined,\n    includeHidden: props.includeHidden,\n    validity,\n    /* publisherId:\n      !this.onlyValid && !authStore.isRoleProduction\n        ? authStore.authProfile?.userId\n        : undefined, */\n    processingStatus: [PodcastProcessingStatus.Ready, PodcastProcessingStatus.Processing],\n    withVideo: props.withVideo,\n    tags: props.includeTag?.length ? props.includeTag : undefined,\n    beneficiaries: props.beneficiaries ?? undefined,\n    season: props.seasons\n  };\n\n  try {\n    const data = await podcastApi.searchFull(param, true);\n    afterFetching(reset, data);\n  } catch (error) {\n    if (error instanceof AxiosError) {\n      handle403(error as AxiosError);\n    } else {\n      console.error('error', error);\n    }\n  }\n}\nfunction afterFetching(\n  reset: boolean,\n  data: { count: number; result: Array<Podcast>; sort: string },\n): void {\n  if (reset) {\n    dfirst.value = 0;\n    podcasts.value.length = 0;\n  }\n  if (dfirst.value > podcasts.value.length) {\n    for (\n      let i = podcasts.value.length - 1, len = dfirst.value + dsize.value;\n      i < len;\n      i++\n    ) {\n      podcasts.value.push(emptyPodcastData());\n    }\n  }\n  const responsePodcasts = data.result.filter((p: Podcast | null) => {\n    return null !== p;\n  });\n  podcasts.value = podcasts.value\n    .slice(0, dfirst.value)\n    .concat(responsePodcasts)\n    .concat(\n      podcasts.value.slice(dfirst.value + dsize.value, podcasts.value.length),\n    );\n  emit(\"fetch\", podcasts.value);\n  totalCount.value = props.justSizeChosen ? props.size : data.count;\n  if (0 === podcasts.value.length) {\n    emit(\"emptyList\");\n  }\n  loading.value = false;\n}\n</script>\n"],"mappings":"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"}