{"version":3,"file":"RadioPlanning-MiAA82P8.mjs","names":[],"sources":["../src/components/display/live/RadioPlanning.vue","../src/components/display/live/RadioPlanning.vue"],"sourcesContent":["<template>\n  <section class=\"module-box\">\n    <h2 class=\"mb-3\">\n      {{ t(\"Program\") }}\n    </h2>\n    <div class=\"py-3\">\n      <div class=\"d-flex align-items-center w-100 mb-3\">\n        <button\n          v-for=\"day in displayArrayDays\"\n          :key=\"day.date\"\n          class=\"button-date border\"\n          :class=\"day.date == daySelected ? 'bg-primary' : ''\"\n          @click=\"changeDate(day.date)\"\n        >\n          <span class=\"text-capitalize\" >{{ day.dayOfWeek }}</span>\n          <time :datetime=\"day.iso\">{{ day.title }}</time>\n        </button>\n      </div>\n      <button v-if=\"isPhone\" class=\"btn btn-primary mb-3 mx-0\" @click=\"showAllDays = !showAllDays\">\n        <template v-if=\"!showAllDays\">{{ t('Show more days') }}</template>\n        <template v-else>{{ t('Show fewer days') }}</template>\n      </button>\n      <div\n        class=\"d-flex align-items-center justify-content-center border-bottom\"\n      >\n        <button\n          v-for=\"period in periodOfDay\"\n          :key=\"period.id\"\n          class=\"btn btn-underline mb-2\"\n          @click=\"scrollToElement('planning-period-' + period.id)\"\n        >\n          {{ period.title }}\n        </button>\n        <button class=\"btn btn-underline mb-2\" @click=\"changePeriodNow\">\n          {{ t(\"Now\") }}\n        </button>\n      </div>\n\n      <div class=\"d-flex flex-column p-3\">\n        <ClassicLoading\n          :loading-text=\"loading ? t('Loading content ...') : undefined\"\n          :error-text=\"error ? t(`Error`) : undefined\"\n        />\n        <template v-if=\"!loading && !error\">\n          <div v-if=\"!planningLength[daySelected]\" class=\"text-center\">\n            {{ t(\"No programming\") }}\n          </div>\n          <div v-for=\"period in periodOfDay\" v-else :key=\"period.id\">\n            <template v-if=\"planning[daySelected][period.id].length\">\n              <div\n                :id=\"'planning-period-' + period.id\"\n                class=\"fw-bold my-3 pb-2 border-bottom border-primary text-primary\"\n              >\n                {{ period.title }}\n              </div>\n              <div\n                v-for=\"planningItem in planning[daySelected][period.id]\"\n                :id=\"\n                  'planning-occurrence-' +\n                  planningItem.occurrenceId +\n                  '' +\n                  planningItem.liveId\n                \"\n                :key=\"planningItem.occurrenceId + '' + planningItem.liveId\"\n                class=\"d-flex align-items-center mb-3\"\n              >\n                <time :datetime=\"planningItem.startDate\" class=\"program-item-date fw-bold flex-shrink-0\">\n                  {{ dateDisplay(planningItem.startDate) }}\n                </time>\n                <router-link\n                  class=\"d-flex align-items-center flex-nowrap text-dark\"\n                  :to=\"{\n                    name: 'podcast',\n                    params: { podcastId: planningItem.podcastId },\n                  }\"\n                  :title=\"t('Episode name page', { name: planningItem.title })\"\n                >\n                  <img\n                    v-lazy=\"\n                      useProxyImageUrl(planningItem.podcastData.imageUrl, '150')\n                    \"\n                    width=\"150\"\n                    height=\"150\"\n                    class=\"m-2 program-item-img\"\n                    aria-hidden=\"true\"\n        alt=\"\"\n                    \n                    :title=\"\n                      t('Episode name image', {\n                        name: planningItem.podcastData.title,\n                      })\n                    \"\n                  />\n                  <div class=\"d-flex flex-column\">\n                    <div class=\"d-flex align-items-center mb-2\">\n                      <div\n                        v-if=\"planningItem.liveId\"\n                        class=\"bg-complementary text-white p-1 me-1\"\n                      >\n                        {{ t(\"Live\") }}\n                      </div>\n                      <div class=\"flex-grow-1 fw-bold\">\n                        {{ planningItem.podcastData.title }}\n                      </div>\n                    </div>\n                  </div>\n                </router-link>\n              </div>\n            </template>\n          </div>\n        </template>\n      </div>\n    </div>\n  </section>\n</template>\n\n<script setup lang=\"ts\">\nimport dayjs from \"dayjs\";\nimport utc from \"dayjs/plugin/utc\";\ndayjs.extend(utc);\nimport classicApi from \"../../../api/classicApi\";\nimport {useImageProxy} from \"../../composable/useImageProxy\";\nimport {useResizePhone} from \"../../composable/useResizePhone\";\nimport ClassicLoading from \"../../form/ClassicLoading.vue\";\nimport { computed, nextTick, onMounted, ref, Ref } from \"vue\";\nimport { Canal } from \"@/stores/class/radio/canal\";\nimport { PlanningOccurrence } from \"@/stores/class/radio/recurrence\";\nimport { PlanningLive } from \"@/stores/class/radio/live\";\nimport { useI18n } from \"vue-i18n\";\n\n//Props \nconst props = defineProps({\n  radio: { default: undefined, type: Object as () => Canal },\n})\n\n//Data \nconst planning: Ref<{\n  [key: number]: {\n    morning: Array<PlanningOccurrence | PlanningLive>;\n    afternoon: Array<PlanningOccurrence | PlanningLive>;\n    evening: Array<PlanningOccurrence | PlanningLive>;\n  };\n}> = ref({});\nconst planningLength: Ref<{ [key: number]: number }> = ref({});\nconst daySelected = ref(dayjs().valueOf());\nconst arrayDays: Ref<Array<{\n  title: string;\n  date: number;\n  dayOfWeek: string;\n  iso: string;\n}>> = ref([]);\nconst loading = ref(true);\nconst error = ref(false);\nconst showAllDays = ref(false);\n\n\n//Composables\nconst { t } = useI18n();\nconst { isPhone } = useResizePhone();\nconst { useProxyImageUrl } = useImageProxy();\n\n//Computed\nconst startOfDay = computed(() => dayjs(daySelected.value).startOf(\"date\").toISOString());\nconst endOfDay = computed(() => dayjs(daySelected.value).endOf(\"date\").toISOString());\nconst periodOfDay = computed(() => {\n  return [\n    {\n      id: \"morning\",\n      title: t(\"Morning\"),\n      end: dayjs(daySelected.value)\n        .hour(14)\n        .minute(0)\n        .second(0)\n        .millisecond(0),\n    },\n    {\n      id: \"afternoon\",\n      title: t(\"Afternoon\"),\n      end: dayjs(daySelected.value)\n        .hour(19)\n        .minute(0)\n        .second(0)\n        .millisecond(0),\n    },\n    {\n      id: \"evening\",\n      title: t(\"Evening\"),\n      end: dayjs(daySelected.value).endOf(\"date\"),\n    },\n  ];\n});\nconst displayArrayDays = computed(() => {\n  if(isPhone && !showAllDays.value){\n    return arrayDays.value.slice(6, 9);\n  }\n  return arrayDays.value;\n});\n\n\nonMounted(()=>{\n  createArrayDays();\n  fetchOccurrences();\n})\n\n\n//Mounted\nfunction scrollToElement(id: string) {\n  const element = document.getElementById(id);\n  if (element) {\n    const yOffset = -110;\n    const y =\n      element.getBoundingClientRect().top + window.scrollY + yOffset;\n    window.scrollTo({ top: y, behavior: \"smooth\" });\n  }\n}\nfunction changePeriodNow() {\n  const now = dayjs();\n  if (!dayjs(daySelected.value).isSame(now, \"day\")) {\n    changeDate(arrayDays.value[7].date);\n  }\n  nextTick(() => {\n    if (!planningLength.value[daySelected.value]) {\n      return;\n    }\n    const arrayOccurrences = Object.values(\n      planning.value[daySelected.value],\n    ).reduce((r, c) => r.concat(c), []);\n    let selectedOccurrence = arrayOccurrences[0];\n    for (const occ of arrayOccurrences) {\n      selectedOccurrence = occ;\n      if (dayjs(occ.endDate).isAfter(now)) {\n        break;\n      }\n    }\n    scrollToElement(\n      \"planning-occurrence-\" +\n        selectedOccurrence.occurrenceId +\n        \"\" +\n        selectedOccurrence.liveId,\n    );\n  });\n}\nfunction createArrayDays() {\n  for (let index = -7; index < 3; index++) {\n    const dayToAdd = dayjs().add(index, \"day\");\n    if (0 === index) {\n      daySelected.value = dayToAdd.valueOf();\n    }\n    arrayDays.value.push({\n      title: dayToAdd.format(\"D/MM\"),\n      dayOfWeek: dayToAdd.format(\"dddd\"),\n      date: dayToAdd.valueOf(),\n      iso: dayToAdd.format(\"MM-DD\"),\n    });\n  }\n}\nasync function fetchOccurrencesAndLives(): Promise<Array<PlanningOccurrence|PlanningLive>> {\n  const params = {\n    canalId: props.radio?.id,\n    from:startOfDay.value,\n    to:endOfDay.value,\n  };\n  let occurrences: Array<PlanningOccurrence | PlanningLive> =\n    await classicApi.fetchData<Array<PlanningOccurrence>>({\n      api: 14,\n      path: \"planning/occurrence/list\",\n      parameters: params,\n    });\n  const lives: Array<PlanningOccurrence> = await classicApi.fetchData<\n    Array<PlanningOccurrence>\n  >({\n    api: 14,\n    path: \"live/list\",\n    parameters: params,\n  });\n\n  if (lives.length) {\n    occurrences = occurrences.concat(lives);\n    occurrences.sort((a, b) => {\n      if (a.startDate > b.startDate) {\n        return 1;\n      }\n      return b.startDate > a.startDate ? -1 : 0;\n    });\n  }\n  return occurrences;\n}\n\nasync function fetchOccurrences(): Promise<void> {\n  if (planning.value[daySelected.value]) {\n    return;\n  }\n  planning.value[daySelected.value] = {\n    morning: [],\n    afternoon: [],\n    evening: [],\n  };\n  planningLength.value[daySelected.value] = 0;\n  loading.value = true;\n  error.value = false;\n  try {\n    const occurrences = await fetchOccurrencesAndLives();\n    let periodDayIndex = 0;\n    for (const occ of occurrences) {\n      if (!occ.podcastId) {\n        continue;\n      }\n      if (\n        !dayjs(occ.startDate).isBefore(periodOfDay.value[periodDayIndex].end)\n      ) {\n        periodDayIndex += 1;\n      }\n\n      switch (periodOfDay.value[periodDayIndex].id) {\n        case \"morning\":\n          planning.value[daySelected.value].morning.push(occ);\n          break;\n        case \"afternoon\":\n          planning.value[daySelected.value].afternoon.push(occ);\n          break;\n        case \"evening\":\n          planning.value[daySelected.value].evening.push(occ);\n          break;\n        default:\n          break;\n      }\n      planningLength.value[daySelected.value] += 1;\n    }\n  } catch(e) {\n    error.value = true;\n    console.error(e);\n  }\n  loading.value = false;\n}\nfunction changeDate(date: number) {\n  daySelected.value = date;\n  fetchOccurrences();\n}\nfunction dateDisplay(date: Date): string {\n  return dayjs(date).format(\"HH:mm\");\n}\n</script>\n<style lang=\"scss\">\n.octopus-app {\n  .program-item-date {\n    width: 100px;\n    font-size: 1.1rem;\n\n    @media (width <= 960px) {\n\t\t\tfont-size: 0.8rem;\n\t\t}\n  }\n\n  .program-item-img{\n    @media (width <= 960px) {\n\t\t\twidth: 80px;\n      height: 80px;\n      margin: 0.5rem 0.5rem 0 0 !important;\n\t\t}\n  }\n\n  .button-date {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    flex-grow: 1;\n    padding: 0.5rem;\n\n    &.bg-primary{\n      color: var(--octopus-color-on-primary) !important;\n    }\n\n    &:hover {\n      background: var(--octopus-secondary);\n    }\n\n    @media (width <= 960px) {\n\t\t\twidth: 80px;\n\t\t}\n  }\n}\n</style>\n","<template>\n  <section class=\"module-box\">\n    <h2 class=\"mb-3\">\n      {{ t(\"Program\") }}\n    </h2>\n    <div class=\"py-3\">\n      <div class=\"d-flex align-items-center w-100 mb-3\">\n        <button\n          v-for=\"day in displayArrayDays\"\n          :key=\"day.date\"\n          class=\"button-date border\"\n          :class=\"day.date == daySelected ? 'bg-primary' : ''\"\n          @click=\"changeDate(day.date)\"\n        >\n          <span class=\"text-capitalize\" >{{ day.dayOfWeek }}</span>\n          <time :datetime=\"day.iso\">{{ day.title }}</time>\n        </button>\n      </div>\n      <button v-if=\"isPhone\" class=\"btn btn-primary mb-3 mx-0\" @click=\"showAllDays = !showAllDays\">\n        <template v-if=\"!showAllDays\">{{ t('Show more days') }}</template>\n        <template v-else>{{ t('Show fewer days') }}</template>\n      </button>\n      <div\n        class=\"d-flex align-items-center justify-content-center border-bottom\"\n      >\n        <button\n          v-for=\"period in periodOfDay\"\n          :key=\"period.id\"\n          class=\"btn btn-underline mb-2\"\n          @click=\"scrollToElement('planning-period-' + period.id)\"\n        >\n          {{ period.title }}\n        </button>\n        <button class=\"btn btn-underline mb-2\" @click=\"changePeriodNow\">\n          {{ t(\"Now\") }}\n        </button>\n      </div>\n\n      <div class=\"d-flex flex-column p-3\">\n        <ClassicLoading\n          :loading-text=\"loading ? t('Loading content ...') : undefined\"\n          :error-text=\"error ? t(`Error`) : undefined\"\n        />\n        <template v-if=\"!loading && !error\">\n          <div v-if=\"!planningLength[daySelected]\" class=\"text-center\">\n            {{ t(\"No programming\") }}\n          </div>\n          <div v-for=\"period in periodOfDay\" v-else :key=\"period.id\">\n            <template v-if=\"planning[daySelected][period.id].length\">\n              <div\n                :id=\"'planning-period-' + period.id\"\n                class=\"fw-bold my-3 pb-2 border-bottom border-primary text-primary\"\n              >\n                {{ period.title }}\n              </div>\n              <div\n                v-for=\"planningItem in planning[daySelected][period.id]\"\n                :id=\"\n                  'planning-occurrence-' +\n                  planningItem.occurrenceId +\n                  '' +\n                  planningItem.liveId\n                \"\n                :key=\"planningItem.occurrenceId + '' + planningItem.liveId\"\n                class=\"d-flex align-items-center mb-3\"\n              >\n                <time :datetime=\"planningItem.startDate\" class=\"program-item-date fw-bold flex-shrink-0\">\n                  {{ dateDisplay(planningItem.startDate) }}\n                </time>\n                <router-link\n                  class=\"d-flex align-items-center flex-nowrap text-dark\"\n                  :to=\"{\n                    name: 'podcast',\n                    params: { podcastId: planningItem.podcastId },\n                  }\"\n                  :title=\"t('Episode name page', { name: planningItem.title })\"\n                >\n                  <img\n                    v-lazy=\"\n                      useProxyImageUrl(planningItem.podcastData.imageUrl, '150')\n                    \"\n                    width=\"150\"\n                    height=\"150\"\n                    class=\"m-2 program-item-img\"\n                    aria-hidden=\"true\"\n        alt=\"\"\n                    \n                    :title=\"\n                      t('Episode name image', {\n                        name: planningItem.podcastData.title,\n                      })\n                    \"\n                  />\n                  <div class=\"d-flex flex-column\">\n                    <div class=\"d-flex align-items-center mb-2\">\n                      <div\n                        v-if=\"planningItem.liveId\"\n                        class=\"bg-complementary text-white p-1 me-1\"\n                      >\n                        {{ t(\"Live\") }}\n                      </div>\n                      <div class=\"flex-grow-1 fw-bold\">\n                        {{ planningItem.podcastData.title }}\n                      </div>\n                    </div>\n                  </div>\n                </router-link>\n              </div>\n            </template>\n          </div>\n        </template>\n      </div>\n    </div>\n  </section>\n</template>\n\n<script setup lang=\"ts\">\nimport dayjs from \"dayjs\";\nimport utc from \"dayjs/plugin/utc\";\ndayjs.extend(utc);\nimport classicApi from \"../../../api/classicApi\";\nimport {useImageProxy} from \"../../composable/useImageProxy\";\nimport {useResizePhone} from \"../../composable/useResizePhone\";\nimport ClassicLoading from \"../../form/ClassicLoading.vue\";\nimport { computed, nextTick, onMounted, ref, Ref } from \"vue\";\nimport { Canal } from \"@/stores/class/radio/canal\";\nimport { PlanningOccurrence } from \"@/stores/class/radio/recurrence\";\nimport { PlanningLive } from \"@/stores/class/radio/live\";\nimport { useI18n } from \"vue-i18n\";\n\n//Props \nconst props = defineProps({\n  radio: { default: undefined, type: Object as () => Canal },\n})\n\n//Data \nconst planning: Ref<{\n  [key: number]: {\n    morning: Array<PlanningOccurrence | PlanningLive>;\n    afternoon: Array<PlanningOccurrence | PlanningLive>;\n    evening: Array<PlanningOccurrence | PlanningLive>;\n  };\n}> = ref({});\nconst planningLength: Ref<{ [key: number]: number }> = ref({});\nconst daySelected = ref(dayjs().valueOf());\nconst arrayDays: Ref<Array<{\n  title: string;\n  date: number;\n  dayOfWeek: string;\n  iso: string;\n}>> = ref([]);\nconst loading = ref(true);\nconst error = ref(false);\nconst showAllDays = ref(false);\n\n\n//Composables\nconst { t } = useI18n();\nconst { isPhone } = useResizePhone();\nconst { useProxyImageUrl } = useImageProxy();\n\n//Computed\nconst startOfDay = computed(() => dayjs(daySelected.value).startOf(\"date\").toISOString());\nconst endOfDay = computed(() => dayjs(daySelected.value).endOf(\"date\").toISOString());\nconst periodOfDay = computed(() => {\n  return [\n    {\n      id: \"morning\",\n      title: t(\"Morning\"),\n      end: dayjs(daySelected.value)\n        .hour(14)\n        .minute(0)\n        .second(0)\n        .millisecond(0),\n    },\n    {\n      id: \"afternoon\",\n      title: t(\"Afternoon\"),\n      end: dayjs(daySelected.value)\n        .hour(19)\n        .minute(0)\n        .second(0)\n        .millisecond(0),\n    },\n    {\n      id: \"evening\",\n      title: t(\"Evening\"),\n      end: dayjs(daySelected.value).endOf(\"date\"),\n    },\n  ];\n});\nconst displayArrayDays = computed(() => {\n  if(isPhone && !showAllDays.value){\n    return arrayDays.value.slice(6, 9);\n  }\n  return arrayDays.value;\n});\n\n\nonMounted(()=>{\n  createArrayDays();\n  fetchOccurrences();\n})\n\n\n//Mounted\nfunction scrollToElement(id: string) {\n  const element = document.getElementById(id);\n  if (element) {\n    const yOffset = -110;\n    const y =\n      element.getBoundingClientRect().top + window.scrollY + yOffset;\n    window.scrollTo({ top: y, behavior: \"smooth\" });\n  }\n}\nfunction changePeriodNow() {\n  const now = dayjs();\n  if (!dayjs(daySelected.value).isSame(now, \"day\")) {\n    changeDate(arrayDays.value[7].date);\n  }\n  nextTick(() => {\n    if (!planningLength.value[daySelected.value]) {\n      return;\n    }\n    const arrayOccurrences = Object.values(\n      planning.value[daySelected.value],\n    ).reduce((r, c) => r.concat(c), []);\n    let selectedOccurrence = arrayOccurrences[0];\n    for (const occ of arrayOccurrences) {\n      selectedOccurrence = occ;\n      if (dayjs(occ.endDate).isAfter(now)) {\n        break;\n      }\n    }\n    scrollToElement(\n      \"planning-occurrence-\" +\n        selectedOccurrence.occurrenceId +\n        \"\" +\n        selectedOccurrence.liveId,\n    );\n  });\n}\nfunction createArrayDays() {\n  for (let index = -7; index < 3; index++) {\n    const dayToAdd = dayjs().add(index, \"day\");\n    if (0 === index) {\n      daySelected.value = dayToAdd.valueOf();\n    }\n    arrayDays.value.push({\n      title: dayToAdd.format(\"D/MM\"),\n      dayOfWeek: dayToAdd.format(\"dddd\"),\n      date: dayToAdd.valueOf(),\n      iso: dayToAdd.format(\"MM-DD\"),\n    });\n  }\n}\nasync function fetchOccurrencesAndLives(): Promise<Array<PlanningOccurrence|PlanningLive>> {\n  const params = {\n    canalId: props.radio?.id,\n    from:startOfDay.value,\n    to:endOfDay.value,\n  };\n  let occurrences: Array<PlanningOccurrence | PlanningLive> =\n    await classicApi.fetchData<Array<PlanningOccurrence>>({\n      api: 14,\n      path: \"planning/occurrence/list\",\n      parameters: params,\n    });\n  const lives: Array<PlanningOccurrence> = await classicApi.fetchData<\n    Array<PlanningOccurrence>\n  >({\n    api: 14,\n    path: \"live/list\",\n    parameters: params,\n  });\n\n  if (lives.length) {\n    occurrences = occurrences.concat(lives);\n    occurrences.sort((a, b) => {\n      if (a.startDate > b.startDate) {\n        return 1;\n      }\n      return b.startDate > a.startDate ? -1 : 0;\n    });\n  }\n  return occurrences;\n}\n\nasync function fetchOccurrences(): Promise<void> {\n  if (planning.value[daySelected.value]) {\n    return;\n  }\n  planning.value[daySelected.value] = {\n    morning: [],\n    afternoon: [],\n    evening: [],\n  };\n  planningLength.value[daySelected.value] = 0;\n  loading.value = true;\n  error.value = false;\n  try {\n    const occurrences = await fetchOccurrencesAndLives();\n    let periodDayIndex = 0;\n    for (const occ of occurrences) {\n      if (!occ.podcastId) {\n        continue;\n      }\n      if (\n        !dayjs(occ.startDate).isBefore(periodOfDay.value[periodDayIndex].end)\n      ) {\n        periodDayIndex += 1;\n      }\n\n      switch (periodOfDay.value[periodDayIndex].id) {\n        case \"morning\":\n          planning.value[daySelected.value].morning.push(occ);\n          break;\n        case \"afternoon\":\n          planning.value[daySelected.value].afternoon.push(occ);\n          break;\n        case \"evening\":\n          planning.value[daySelected.value].evening.push(occ);\n          break;\n        default:\n          break;\n      }\n      planningLength.value[daySelected.value] += 1;\n    }\n  } catch(e) {\n    error.value = true;\n    console.error(e);\n  }\n  loading.value = false;\n}\nfunction changeDate(date: number) {\n  daySelected.value = date;\n  fetchOccurrences();\n}\nfunction dateDisplay(date: Date): string {\n  return dayjs(date).format(\"HH:mm\");\n}\n</script>\n<style lang=\"scss\">\n.octopus-app {\n  .program-item-date {\n    width: 100px;\n    font-size: 1.1rem;\n\n    @media (width <= 960px) {\n\t\t\tfont-size: 0.8rem;\n\t\t}\n  }\n\n  .program-item-img{\n    @media (width <= 960px) {\n\t\t\twidth: 80px;\n      height: 80px;\n      margin: 0.5rem 0.5rem 0 0 !important;\n\t\t}\n  }\n\n  .button-date {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    flex-grow: 1;\n    padding: 0.5rem;\n\n    &.bg-primary{\n      color: var(--octopus-color-on-primary) !important;\n    }\n\n    &:hover {\n      background: var(--octopus-secondary);\n    }\n\n    @media (width <= 960px) {\n\t\t\twidth: 80px;\n\t\t}\n  }\n}\n</style>\n"],"mappings":"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"}