{"version":3,"file":"News.vue.bundle.js","sources":["../../../Frontend/vue/repositories/NewsRepository.ts","../../../Frontend/vue/services/NewsService.ts","../../../Frontend/vue/view-models/PaginationModel.ts","../../../Frontend/vue/components/pagination.vue","../../../Frontend/vue/components/News/newsThemeFilters.vue","../../../Frontend/vue/components/News/newsItem.vue","../../../Frontend/vue/views/News/News.vue","../../../Frontend/vue/views/News/index.ts"],"sourcesContent":["import axios from 'axios'\r\n\r\nconst newsInstance = axios.create({\r\n    baseURL: '/umbraco/api/news/get',\r\n});\r\n\r\nexport interface INewsParams {\r\n    skip: number;\r\n    take: number;\r\n    selectedFilter: string;\r\n}\r\n\r\n\r\nexport class NewsRepository {\r\n    GetNews(params: INewsParams){\r\n        return newsInstance.get('', {\r\n            params\r\n        })\r\n    }\r\n}\r\n\r\nexport default new NewsRepository();","import NewsRepository, { INewsParams } from \"@/repositories/NewsRepository\";\r\nimport { IResponseImage, IResponseLink } from \"@/view-models/IResponseModels\";\r\nimport { AxiosResponse } from \"axios\";\r\nimport {IFilter, IFilterItem} from \"@/view-models/IFilter\";\r\n\r\ninterface INewsResponse {\r\n    items: INewsItem[];\r\n    filterItems: IFilterItem[];\r\n    total: number;\r\n}\r\n\r\nexport interface INewsItem {\r\n    id: number;\r\n    title: string;\r\n    subTitle: string;\r\n    description: string;\r\n    contentType: string;\r\n    link: IResponseLink;\r\n    tagLink: IResponseLink;\r\n    image: IResponseImage;\r\n    imageMobile: IResponseImage;\r\n    publishDate: string;\r\n    formattedDate: string;\r\n}\r\n\r\nexport class NewsService {\r\n    getNews(params: INewsParams): Promise<AxiosResponse<INewsResponse>> {\r\n        return NewsRepository.GetNews(params)\r\n    }\r\n}\r\n\r\nexport default new NewsService();","export class PaginationModel {\r\n    \r\n    private _minDistanceBetweenCurrentAndNeighbourPages: number = 1;\r\n    private _maxPaginationItems: number = 5;\r\n\r\n    currentPage: number;\r\n    itemsPerPage: number;\r\n    numberOfAllItems: number;\r\n    startingPaginationNumber: number;\r\n    endingPaginationNumber: number;\r\n    numberOfPages: number;\r\n\r\n    constructor(currentPage: number, itemsPerPage: number, numberOfAllItems: number) {\r\n        this.currentPage = currentPage;\r\n        this.itemsPerPage = itemsPerPage;\r\n        this.numberOfAllItems = numberOfAllItems;\r\n        this.numberOfPages = this.getNumberOfPages();\r\n        this.startingPaginationNumber = this.getStartingPaginationNumber();\r\n        this.endingPaginationNumber = this.getEndingPaginationNumber();\r\n    }\r\n\r\n    private getNumberOfPages(): number {\r\n        return Math.ceil(this.numberOfAllItems / this.itemsPerPage);\r\n    }\r\n\r\n    private getStartingPaginationNumber(): number {\r\n        var startingPaginationNumber = 1;\r\n        var numberOfPages = this.numberOfPages;\r\n\r\n        // Ignore first 3 pagination items\r\n        if (this.currentPage > 3)\r\n        {\r\n            var currentPlusNeighbourPages = this.currentPage + this._minDistanceBetweenCurrentAndNeighbourPages;\r\n            var currentMinusNeighbourPages = this.currentPage - this._minDistanceBetweenCurrentAndNeighbourPages;\r\n            var extraPages = currentPlusNeighbourPages - numberOfPages;\r\n\r\n            if (extraPages > 0)\r\n            {\r\n                startingPaginationNumber = currentMinusNeighbourPages - extraPages;\r\n            }\r\n            else\r\n            {\r\n                startingPaginationNumber = currentMinusNeighbourPages;\r\n            }\r\n        }\r\n\r\n        return startingPaginationNumber > 0 ? startingPaginationNumber : 1;\r\n    }\r\n\r\n    private getEndingPaginationNumber(): number {\r\n        var numberOfPages = this.numberOfPages;\r\n        var endingPaginationNumber = this._maxPaginationItems < numberOfPages ? this._maxPaginationItems : numberOfPages;\r\n\r\n        // Ignore first 3 pagination items\r\n        if (this.currentPage > 3)\r\n        {\r\n            var currentPlusNeighbourPages = this.currentPage + this._minDistanceBetweenCurrentAndNeighbourPages;\r\n\r\n            if (currentPlusNeighbourPages >= numberOfPages)\r\n            {\r\n                endingPaginationNumber = numberOfPages;\r\n            }\r\n            else\r\n            {\r\n                endingPaginationNumber = currentPlusNeighbourPages;\r\n            }\r\n        }\r\n\r\n        return endingPaginationNumber;\r\n    }\r\n}","<script setup lang=\"ts\">\r\nimport { PaginationModel } from \"@/view-models/PaginationModel\";\r\nimport { computed, ref } from \"vue\";\r\n\r\ninterface IPaginationItem {\r\n\tindex: number;\r\n}\r\n\r\n// Props\r\nconst props = defineProps<{\r\n\titemsPerPage: number;\r\n\tcurrentPage: number;\r\n\tnumberOfAllItems: number;\r\n}>();\r\n\r\n// Variables\r\nconst paginationModel = ref(new PaginationModel(props.currentPage, props.itemsPerPage, props.numberOfAllItems));\r\n\r\n// Emits\r\nconst emit = defineEmits<{\r\n\t(e: \"firstPage\"): void;\r\n\t(e: \"lastPage\"): void;\r\n\t(e: \"prevPage\"): void;\r\n\t(e: \"nextPage\"): void;\r\n\t(e: \"goToPage\", value: number): void;\r\n}>();\r\n\r\nconst prevPage = () => {\r\n\temit(\"prevPage\");\r\n};\r\n\r\nfunction nextPage() {\r\n\temit(\"nextPage\");\r\n}\r\n\r\nconst goToPage = (value: number) => {\r\n\temit(\"goToPage\", value);\r\n};\r\n\r\n// Functions\r\nconst paginationItems = computed(() => {\r\n\tconst items: IPaginationItem[] = [];\r\n\r\n\tpaginationModel.value = new PaginationModel(props.currentPage, props.itemsPerPage, props.numberOfAllItems);\r\n\r\n\tfor (let index = paginationModel.value.startingPaginationNumber; index <= paginationModel.value.endingPaginationNumber; index++) {\r\n\t\titems.push({\r\n\t\t\tindex: index,\r\n\t\t});\r\n\t}\r\n\r\n\treturn items;\r\n});\r\n\r\n</script>\r\n\r\n<template>\r\n  <nav class=\"pagination\">\r\n    <ul>\r\n      <li class=\"page-item\">\r\n        <a @click=\"prevPage\" :class=\"{ disabled: currentPage === 1 }\">\r\n          <svg class=\"icon icon-ArrowLeft\">\r\n            <use xlink:href=\"#icon-ArrowLeft\"></use>\r\n          </svg>\r\n        </a>\r\n      </li>\r\n      \r\n      <li class=\"page-item\" v-if=\"paginationModel.startingPaginationNumber !== 1\">\r\n        <a @click=\"goToPage(1)\">1</a>\r\n      </li>\r\n      \r\n      <li class=\"page-item\" v-if=\"paginationModel.startingPaginationNumber !== 1\">\r\n        <a> ... </a>\r\n      </li>\r\n      \r\n      <li class=\"page-item\" v-for=\"(item, index) in paginationItems\" :key=\"index\">\r\n        <a @click=\"goToPage(item.index)\" :class=\"{ active: item.index === currentPage }\">\r\n          {{ item.index }}\r\n        </a>\r\n      </li>\r\n\r\n      <li class=\"page-item\" v-if=\"paginationModel.endingPaginationNumber + 1 < paginationModel.numberOfPages\">\r\n        <a> ... </a>\r\n      </li>\r\n\r\n      <li class=\"page-item\" v-if=\"paginationModel.endingPaginationNumber !== paginationModel.numberOfPages\">\r\n        <a @click=\"goToPage(paginationModel.numberOfPages)\">\r\n          {{ paginationModel.numberOfPages }}\r\n        </a>\r\n      </li>\r\n\r\n      <li class=\"page-item\">\r\n        <a @click=\"nextPage\" :class=\"{ disabled: currentPage === paginationModel.numberOfPages }\">\r\n          <svg class=\"icon icon-ArrowLeft\">\r\n            <use xlink:href=\"#icon-ArrowRight\"></use>\r\n          </svg>\r\n        </a>\r\n      </li>\r\n    </ul>\r\n  </nav>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport CmsDataProvider, {NewsCmsData} from '@/providers/CmsDataProvider';\r\nimport {computed} from 'vue';\r\nimport {StringHelper} from \"@/helpers/stringhelper\";\r\nimport {IFilter, IFilterItem} from \"@/view-models/IFilter\";\r\n\r\nconst cmsData = CmsDataProvider.get<NewsCmsData>(\"NewsCmsData\");\r\n\r\nconst props = defineProps<{\r\n  items: IFilterItem[];\r\n  showMoreThemes: boolean;\r\n  showMoreThemesText: string;\r\n  showLessThemesText: string;\r\n  selectedFilterValue: string;\r\n}>();\r\n\r\n// Emits\r\nconst emit = defineEmits<{\r\n  (e: \"on-filter-select\", filter: IFilterItem): void;\r\n  (e: \"on-show-more-themes-select\", shouldShow: boolean): void;\r\n}>();\r\n\r\nconst onFilterSelect = (filter: IFilterItem) => {\r\n  emit(\"on-filter-select\", filter);\r\n};\r\n\r\nconst showMoreThemesSelect = (shouldShow: boolean) => {\r\n  emit(\"on-show-more-themes-select\", shouldShow);\r\n};\r\n\r\n// Functions\r\nconst showMoreText = computed(() => {\r\n  return props.showMoreThemes ? props.showLessThemesText : props.showMoreThemesText;\r\n});\r\n\r\nconst filterItems = computed(() => {\r\n  return props.showMoreThemes ? props.items : props.items.slice(0, 4);\r\n})\r\n\r\n</script>\r\n\r\n<template>\r\n  <div class=\"row\">\r\n    <h3 v-html=\"StringHelper.HtmlDecode(cmsData.popularThemes)\"></h3>\r\n  </div>\r\n  <div class=\"row\">\r\n    <div class=\"col-md-18 theme-items-wrapper\">\r\n      <a class=\"btn btn-secondary m-1\" :class=\"{ active: props.selectedFilterValue === item.value }\"\r\n         v-for=\"(item, index) in filterItems\" :key=\"index\" @click=\"onFilterSelect(item)\">\r\n        {{ item.label }}\r\n      </a>\r\n    </div>\r\n    <div class=\"col-md-6 filter-toggle\">\r\n      <a @click=\"showMoreThemesSelect(!showMoreThemes)\">\r\n        <svg class=\"icon icon-Close\" v-if=\"showMoreThemes\">\r\n          <use xlink:href=\"#icon-Close\"></use>\r\n        </svg>\r\n\r\n        <svg class=\"icon icon-Plus\" v-if=\"!showMoreThemes\">\r\n          <use xlink:href=\"#icon-Plus\"></use>\r\n        </svg>\r\n        \r\n        {{ showMoreText }}\r\n      </a>\r\n    </div>\r\n  </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport CmsDataProvider, {NewsCmsData} from \"@/providers/CmsDataProvider\";\r\nimport {INewsItem} from \"@/services/NewsService\";\r\n\r\nconst cmsData = CmsDataProvider.get<NewsCmsData>(\"NewsCmsData\");\r\n\r\ndefineProps<{\r\n  item: INewsItem;\r\n}>();\r\n\r\nconst truncate = (input: string, maxLength: number = 160, useWordBoundary: boolean = true) => {\r\n  if (input.length <= maxLength) {\r\n    return input;\r\n  }\r\n  const subString = input.slice(0, maxLength - 1);\r\n  const truncated = useWordBoundary\r\n    ? subString.slice(0, subString.lastIndexOf(\" \", maxLength - 3))\r\n    : subString;\r\n  return truncated + \"...\";\r\n}\r\n\r\n</script>\r\n\r\n<template>\r\n  <div class=\"col-xs-24 col-md-12 col-lg-8\">\r\n    <article class=\"news-item position-relative\">\r\n        <div class=\"news-image\">\r\n          <figure class=\"ratio ratio-16x9\">\r\n            <img v-if=\"item.image.url\" class=\"img-fluid object-fit-cover\" :src=\"item.image.url\" :alt=\"item.title\">\r\n            <img v-else class=\"img-fluid object-fit-cover\" src=\"https://via.placeholder.com/600x400/FFFFFF?text=Geen afbeelding gevonden\"\r\n                 :alt=\"item.title\">\r\n          </figure>\r\n        </div>\r\n        <div class=\"news-content\">\r\n          <h4 class=\"title link\">{{ item.title }}</h4>\r\n          <a class=\"z-index-link\" v-if=\"item.tagLink\" :href=\"item.tagLink.url\" :target=\"item.tagLink.target\">\r\n            <p class=\"small\">{{ item.tagLink.name }}</p>\r\n          </a>\r\n          <span class=\"news-description\">{{ truncate(item.description) }}</span>\r\n          <div class=\"news-link\">\r\n            <a :href=\"item.link.url\" :target=\"item.link.target\" class=\"btn btn-link stretched-link\">\r\n              {{ cmsData.readMore }}\r\n              <svg class=\"icon icon-ArrowRight\">\r\n                <use xlink:href=\"#icon-ArrowRight\"></use>\r\n              </svg>\r\n            </a>\r\n          </div>\r\n        </div>\r\n    </article>\r\n  </div>\r\n</template>","<script setup lang=\"ts\">\r\nimport NewsService, {INewsItem} from \"@/services/NewsService\";\r\nimport {ref, onMounted, watch, onBeforeUnmount} from \"vue\";\r\nimport CmsDataProvider, {NewsCmsData} from \"@/providers/CmsDataProvider\";\r\nimport Pagination from \"@/components/pagination.vue\";\r\nimport NewsThemeFilters from \"@/components/News/newsThemeFilters.vue\";\r\nimport NewsItem from \"@/components/News/newsItem.vue\";\r\nimport Loader from \"@/components/loader.vue\";\r\nimport {IFilterItem} from \"@/view-models/IFilter\";\r\n\r\n// Variables\r\nconst cmsData = CmsDataProvider.get<NewsCmsData>(\"NewsCmsData\");\r\nconst newsResults = ref([] as INewsItem[]);\r\nconst filterItems = ref([] as IFilterItem[]);\r\nconst currentPage = ref(1);\r\nconst numberOfAllItems = ref(0);\r\nconst isLoading = ref(false);\r\nconst isShowingMoreThemes = ref(false);\r\nconst selectedFilterValue = ref(\"\");\r\nconst itemsPerPage = 6;\r\nconst filterKey = \"filter\";\r\nconst pageKey = \"page\";\r\n\r\nlet isInitializing = true;\r\nlet isPoppingState = false;\r\n\r\nconst init = async () => {\r\n\r\n  setUrlParameters();\r\n  await getNews();\r\n\r\n  isInitializing = false;\r\n};\r\n\r\n// Functions\r\nconst getNews = async () => {\r\n  isLoading.value = true;\r\n\r\n  if (!isPoppingState)\r\n    generateUrl();\r\n\r\n  await NewsService.getNews({\r\n    skip: itemsPerPage * (currentPage.value - 1),\r\n    take: itemsPerPage,\r\n    selectedFilter: selectedFilterValue.value,\r\n  }).then((data) => {\r\n    newsResults.value = data.data.items;\r\n    numberOfAllItems.value = data.data.total;\r\n    filterItems.value = data.data.filterItems;\r\n  }).finally(() => {\r\n    isLoading.value = false;\r\n  });\r\n};\r\n\r\nconst generateUrl = () => {\r\n  const url = new URL(window.location.href);\r\n  url.searchParams.set(pageKey, String(currentPage.value));\r\n\r\n  if (selectedFilterValue.value !== \"\")\r\n    url.searchParams.set(filterKey, selectedFilterValue.value);\r\n\r\n  history.pushState({}, \"\", url);\r\n};\r\n\r\nconst nextPage = () => currentPage.value++;\r\n\r\nconst prevPage = () => currentPage.value--;\r\n\r\nconst goToPage = (page: number) => (currentPage.value = page);\r\n\r\nconst lastPage = () =>\r\n    (currentPage.value = Math.ceil(numberOfAllItems.value / itemsPerPage));\r\n\r\nconst firstPage = () => (currentPage.value = 1);\r\n\r\nconst filterSelected = (filterItem: IFilterItem) => {\r\n  // deselect if the user clicks on the selected value\r\n  selectedFilterValue.value = selectedFilterValue.value === filterItem.value ? \"\" : filterItem.value;\r\n}\r\n\r\nconst showMoreThemesSelected = (toggle: boolean) => isShowingMoreThemes.value = toggle;\r\n\r\nconst popState = async () => {\r\n  isPoppingState = true;\r\n\r\n  setUrlParameters();\r\n  await getNews();\r\n\r\n  isPoppingState = false;\r\n}\r\n\r\nconst setUrlParameters = () => {\r\n\r\n  const url = new URL(window.location.href);\r\n\r\n  currentPage.value = url.searchParams.get(pageKey)\r\n      ? Number(url.searchParams.get(pageKey))\r\n      : 1;\r\n\r\n  selectedFilterValue.value = url.searchParams.get(filterKey)\r\n      ? String(url.searchParams.get(filterKey))\r\n      : \"\";\r\n}\r\n\r\n// Watchers\r\nwatch([currentPage, selectedFilterValue], () => {\r\n\r\n  if (isInitializing)\r\n    return;\r\n\r\n  getNews();\r\n});\r\n\r\n// Mounted\r\nonMounted(() => {\r\n  window.addEventListener(\"popstate\", popState);\r\n\r\n  init();\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n  window.removeEventListener(\"popstate\", popState);\r\n});\r\n</script>\r\n\r\n<template>\r\n  <loader v-if=\"isLoading\"></loader>\r\n  <news-theme-filters\r\n      @on-filter-select=\"filterSelected\"\r\n      @on-show-more-themes-select=\"showMoreThemesSelected\"\r\n      :show-more-themes=\"isShowingMoreThemes\"\r\n      :show-more-themes-text=\"cmsData.showMoreFilters\"\r\n      :show-less-themes-text=\"cmsData.showLessFilters\"\r\n      :selected-filter-value=\"selectedFilterValue\"\r\n      :items=\"filterItems\"></news-theme-filters>\r\n  <div class=\"row news-items-wrapper\">\r\n    <news-item v-for=\"item in newsResults\" :key=\"item.id\" :item=\"item\"></news-item>\r\n  </div>\r\n  <div class=\"row\">\r\n    <pagination\r\n        v-if=\"numberOfAllItems > itemsPerPage\"\r\n        @nextPage=\"nextPage\"\r\n        @prevPage=\"prevPage\"\r\n        @goToPage=\"goToPage\"\r\n        @firstPage=\"firstPage\"\r\n        @lastPage=\"lastPage\"\r\n        :items-per-page=\"itemsPerPage\"\r\n        :current-page=\"currentPage\"\r\n        :number-of-all-items=\"numberOfAllItems\"></pagination>\r\n  </div>\r\n</template>\r\n","import { createApp } from 'vue';\r\nimport News from './News.vue';\r\nconst app = createApp(News)\r\napp.mount('#news')\r\n"],"names":["NewsRepository","itemsPerPage","NewsService","News"],"mappings":"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"}