{"version":3,"file":"EmissionItem-BV64KpcY.mjs","names":[],"sources":["../src/components/misc/ClassicImageBanner.vue","../src/components/display/emission/EmissionItem.vue","../src/components/display/emission/EmissionItem.vue"],"sourcesContent":["<!-- A simple component to display a blur & a banner on an image -->\n<template>\n    <div class=\"blur-with-banner\">\n        <div class=\"banner\">\n            <slot />\n        </div>\n    </div>\n</template>\n\n<script setup>\n</script>\n\n<style lang=\"scss\" scoped>\n.blur-with-banner {\n  position: absolute;\n  inset: 0;\n  background-color:var(--octopus-background-transparent);\n  // Allow pointer events to go through (allow click on image beneath blur)\n  pointer-events: none;\n\n  .banner {\n    text-align: center;\n    width: 100%;\n    font-size: 0.6rem;\n    padding: 0.2rem 0;\n    color: white;\n    background: black;\n    text-transform: uppercase;\n    position: absolute;\n    top: 0;\n  }\n}\n</style>","<template>\n  <article class=\"classic-element-container\">\n    <router-link\n      :to=\"{\n        name: 'emission',\n        params: { emissionId: emission.emissionId },\n      }\"\n      :title=\"t('Series name page', { name: emission.name })\"\n      class=\"d-flex flex-grow-1 text-dark\"\n    >\n      <img\n        v-lazy=\"useProxyImageUrl(emission.imageUrl, '250')\"\n        width=\"250\"\n        height=\"250\"\n        class=\"img-box\"\n        aria-hidden=\"true\"\n        alt=\"\"\n        :title=\"t('Emission name image', { name: emission.name })\"\n      >\n      <ClassicImageBanner v-if=\"!emissionVisible\">\n        {{ t('Emission - Not available for listeners') }}\n      </ClassicImageBanner>\n\n      <div class=\"classic-element-text\">\n        <div class=\"d-flex align-items-center element-name\">\n          <AlertIcon\n            v-if=\"!activeEmission && !isPodcastmaker && editRight\"\n            :size=\"16\"\n            class=\"text-danger me-1\"\n            :title=\"t('Emission have not podcasts')\"\n          />\n          <RightsIndicator\n            inline\n            :emission=\"emission\"\n            action=\"edit\"\n          />\n          {{ emission.name }}\n        </div>\n        <div\n          ref=\"descriptionEmissionContainer\"\n          class=\"element-description htms-wysiwyg-content\"\n        >\n          <!-- eslint-disable vue/no-v-html -->\n          <div\n            ref=\"descriptionEmission\"\n            v-html=\"description\"\n          />\n          <!-- eslint-enable -->\n        </div>\n        <router-link\n          v-if=\"!isPodcastmaker\"\n          class=\"text-dark mt-auto py-1\"\n          :to=\"{\n            name: 'productor',\n            params: { productorId: emission.orga.id },\n          }\"\n        >\n          © {{ emission.orga.name }}\n        </router-link>\n      </div>\n    </router-link>\n  </article>\n</template>\n\n<script setup lang=\"ts\">\nimport AlertIcon from \"vue-material-design-icons/Alert.vue\";\nimport {useOrgaComputed} from \"../../composable/useOrgaComputed\";\nimport { Emission } from \"@/stores/class/general/emission\";\nimport classicApi from \"../../../api/classicApi\";\nimport {useImageProxy} from \"../../composable/useImageProxy\";\nimport displayHelper from \"../../../helper/displayHelper\";\nimport { computed, onBeforeMount, onMounted, ref, useTemplateRef } from \"vue\";\nimport { Podcast } from \"@/stores/class/general/podcast\";\nimport { ListClassicReturn } from \"@/stores/class/general/listReturn\";\nimport RightsIndicator from \"../RightsIndicator.vue\"; \n\nimport ClassicImageBanner from '../../misc/ClassicImageBanner.vue';\n\nimport { useI18n } from \"vue-i18n\";\nimport { useResizePhone } from \"../../composable/useResizePhone\";\n\n//Props \nconst props = defineProps<{\n  /** The emission to display */\n  emission: Emission;\n}>();\n\n//Data \nconst activeEmission = ref(true);\n\n//Composables\nconst { t } = useI18n();\nconst { useProxyImageUrl } = useImageProxy();\nconst { isPodcastmaker, isEditRights } = useOrgaComputed();\n\n//Computed\nconst editRight = computed(() => isEditRights(props.emission.orga.id));\nconst emissionVisible = computed(() => {\n  return props.emission.visible !== false;\n});\n\nonBeforeMount(()=>{\n  if (!editRight.value) {\n    return;\n  }\n  hasPodcast();\n});\n\nonMounted(()=>{\n  const emissionDesc = useTemplateRef('descriptionEmission')?.value as HTMLElement;\n  const emissionDescContainer = useTemplateRef('descriptionEmissionContainer')?.value as HTMLElement;\n  if (\n    null !== emissionDesc &&\n    null !== emissionDescContainer &&\n    emissionDesc.clientHeight > emissionDescContainer.clientHeight\n  ) {\n    emissionDescContainer.classList.add(\"after-element-description\");\n  }\n})\n\nconst { isPhone } = useResizePhone();\nconst description = computed((): string => {\n  let str = props.emission.description;\n  if (!str) {\n    return '';\n  }\n\n  // Truncate description on phones\n  if (isPhone.value === true) {\n    const pattern = /^(.+?<\\/p>)/;\n    const matches = str.match(pattern);\n    if (matches && matches.length === 2) {\n      str = matches[1];\n    }\n  }\n\n  return urlify(str);\n});\n\n//Methods\nfunction urlify(text:string|undefined){\n  return displayHelper.urlify(text);\n}\nasync function hasPodcast(): Promise<void> {\n  const data = await classicApi.fetchData<ListClassicReturn<Podcast>>({\n    api: 0,\n    path: \"podcast/search\",\n    parameters: {\n      emissionId: props.emission.emissionId,\n      first: 0,\n      size: 0,\n      includeStatus: [\"READY\", \"PROCESSING\"],\n    },\n    specialTreatement: true,\n  });\n  if (0 === data.count) {\n    activeEmission.value = false;\n  }\n}\n</script>\n\n<style scoped lang=\"scss\">\narticle {\n  max-height: 254px;  // Image size + a few pixels for border\n\n  // Adjust display for small screens\n  @media (width <= 960px) {\n    max-height: 500px;\n\n    a {\n      flex-direction: column !important;\n      flex-wrap: nowrap !important;\n    }\n\n    .element-name {\n      font-size: 1rem;\n    }\n\n    .element-description {\n      font-size: 0.7rem;\n    }\n  }\n}\n</style>\n","<template>\n  <article class=\"classic-element-container\">\n    <router-link\n      :to=\"{\n        name: 'emission',\n        params: { emissionId: emission.emissionId },\n      }\"\n      :title=\"t('Series name page', { name: emission.name })\"\n      class=\"d-flex flex-grow-1 text-dark\"\n    >\n      <img\n        v-lazy=\"useProxyImageUrl(emission.imageUrl, '250')\"\n        width=\"250\"\n        height=\"250\"\n        class=\"img-box\"\n        aria-hidden=\"true\"\n        alt=\"\"\n        :title=\"t('Emission name image', { name: emission.name })\"\n      >\n      <ClassicImageBanner v-if=\"!emissionVisible\">\n        {{ t('Emission - Not available for listeners') }}\n      </ClassicImageBanner>\n\n      <div class=\"classic-element-text\">\n        <div class=\"d-flex align-items-center element-name\">\n          <AlertIcon\n            v-if=\"!activeEmission && !isPodcastmaker && editRight\"\n            :size=\"16\"\n            class=\"text-danger me-1\"\n            :title=\"t('Emission have not podcasts')\"\n          />\n          <RightsIndicator\n            inline\n            :emission=\"emission\"\n            action=\"edit\"\n          />\n          {{ emission.name }}\n        </div>\n        <div\n          ref=\"descriptionEmissionContainer\"\n          class=\"element-description htms-wysiwyg-content\"\n        >\n          <!-- eslint-disable vue/no-v-html -->\n          <div\n            ref=\"descriptionEmission\"\n            v-html=\"description\"\n          />\n          <!-- eslint-enable -->\n        </div>\n        <router-link\n          v-if=\"!isPodcastmaker\"\n          class=\"text-dark mt-auto py-1\"\n          :to=\"{\n            name: 'productor',\n            params: { productorId: emission.orga.id },\n          }\"\n        >\n          © {{ emission.orga.name }}\n        </router-link>\n      </div>\n    </router-link>\n  </article>\n</template>\n\n<script setup lang=\"ts\">\nimport AlertIcon from \"vue-material-design-icons/Alert.vue\";\nimport {useOrgaComputed} from \"../../composable/useOrgaComputed\";\nimport { Emission } from \"@/stores/class/general/emission\";\nimport classicApi from \"../../../api/classicApi\";\nimport {useImageProxy} from \"../../composable/useImageProxy\";\nimport displayHelper from \"../../../helper/displayHelper\";\nimport { computed, onBeforeMount, onMounted, ref, useTemplateRef } from \"vue\";\nimport { Podcast } from \"@/stores/class/general/podcast\";\nimport { ListClassicReturn } from \"@/stores/class/general/listReturn\";\nimport RightsIndicator from \"../RightsIndicator.vue\"; \n\nimport ClassicImageBanner from '../../misc/ClassicImageBanner.vue';\n\nimport { useI18n } from \"vue-i18n\";\nimport { useResizePhone } from \"../../composable/useResizePhone\";\n\n//Props \nconst props = defineProps<{\n  /** The emission to display */\n  emission: Emission;\n}>();\n\n//Data \nconst activeEmission = ref(true);\n\n//Composables\nconst { t } = useI18n();\nconst { useProxyImageUrl } = useImageProxy();\nconst { isPodcastmaker, isEditRights } = useOrgaComputed();\n\n//Computed\nconst editRight = computed(() => isEditRights(props.emission.orga.id));\nconst emissionVisible = computed(() => {\n  return props.emission.visible !== false;\n});\n\nonBeforeMount(()=>{\n  if (!editRight.value) {\n    return;\n  }\n  hasPodcast();\n});\n\nonMounted(()=>{\n  const emissionDesc = useTemplateRef('descriptionEmission')?.value as HTMLElement;\n  const emissionDescContainer = useTemplateRef('descriptionEmissionContainer')?.value as HTMLElement;\n  if (\n    null !== emissionDesc &&\n    null !== emissionDescContainer &&\n    emissionDesc.clientHeight > emissionDescContainer.clientHeight\n  ) {\n    emissionDescContainer.classList.add(\"after-element-description\");\n  }\n})\n\nconst { isPhone } = useResizePhone();\nconst description = computed((): string => {\n  let str = props.emission.description;\n  if (!str) {\n    return '';\n  }\n\n  // Truncate description on phones\n  if (isPhone.value === true) {\n    const pattern = /^(.+?<\\/p>)/;\n    const matches = str.match(pattern);\n    if (matches && matches.length === 2) {\n      str = matches[1];\n    }\n  }\n\n  return urlify(str);\n});\n\n//Methods\nfunction urlify(text:string|undefined){\n  return displayHelper.urlify(text);\n}\nasync function hasPodcast(): Promise<void> {\n  const data = await classicApi.fetchData<ListClassicReturn<Podcast>>({\n    api: 0,\n    path: \"podcast/search\",\n    parameters: {\n      emissionId: props.emission.emissionId,\n      first: 0,\n      size: 0,\n      includeStatus: [\"READY\", \"PROCESSING\"],\n    },\n    specialTreatement: true,\n  });\n  if (0 === data.count) {\n    activeEmission.value = false;\n  }\n}\n</script>\n\n<style scoped lang=\"scss\">\narticle {\n  max-height: 254px;  // Image size + a few pixels for border\n\n  // Adjust display for small screens\n  @media (width <= 960px) {\n    max-height: 500px;\n\n    a {\n      flex-direction: column !important;\n      flex-wrap: nowrap !important;\n    }\n\n    .element-name {\n      font-size: 1rem;\n    }\n\n    .element-description {\n      font-size: 0.7rem;\n    }\n  }\n}\n</style>\n"],"mappings":"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"}