{"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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"}