{"version":3,"file":"projects-overview.707b3f02.js","sources":["../../../src/js/archive/projects-overview.ts"],"sourcesContent":["import Alpine from 'alpinejs'\n\ntype RelatedIndustries = {\n uid: string\n title: string\n}[]\ntype RelatedSolutions = {\n uid: string\n title: string\n}[]\ntype Pagination = {\n previousTarget: number | false\n nextTarget: number | false\n links: Array<\n | {\n type: 'dots'\n targetPage: number\n }\n | {\n type: 'link'\n targetPage: number\n isActive: boolean\n }\n >\n}\n\ntype ProjectFilterValue = {\n uid: string\n label: string\n}\n\ntype ProjectFilter = {\n facet: {\n uid: string\n title: string\n }\n values: ProjectFilterValue[]\n}\n\ntype SelectedFilters = {\n [key: string]: string[]\n}\n\nexport default async function(projectsOverview: HTMLElement) {\n const projectsWrapper =\n projectsOverview.querySelector('.projects-wrapper')\n const caseStudyTag = projectsWrapper?.dataset.caseStudyTag as string\n const applicationTag = projectsWrapper?.dataset.applicationTag as string\n const language = projectsWrapper?.dataset.language as string\n const highlightedProjects = (\n projectsWrapper?.dataset.highlightedProjects as string\n ).split(',')\n\n Alpine.store('projectsOverview', {\n _estimatedNonHighlightedHits: 0,\n _sorting: '&settings[sort][]=postDate_timestamp:desc',\n\n projectsLimit: 12,\n currentPage: 1,\n projects: [],\n\n projectFilters: {},\n selectedCaseStudyType: '',\n selectedIndustry: '',\n selectedSolution: '',\n filterQuery: '',\n\n isPaginating: false,\n projectsLoading: false,\n fetchError: false,\n\n get _estimatedTotalHits(): number {\n if (this._isFiltering) {\n return this._estimatedNonHighlightedHits\n } else {\n return (\n this._estimatedNonHighlightedHits +\n highlightedProjects.length\n )\n }\n },\n get _maxPage(): number {\n if (this._estimatedTotalHits === 0) {\n return 1\n } else {\n return Math.ceil(this._estimatedTotalHits / this.projectsLimit)\n }\n },\n get _pageOffset(): string {\n if (this.currentPage > 1) {\n return `&settings[offset]=${(this.currentPage - 1) * this.projectsLimit\n }`\n } else {\n return '&settings[offset]'\n }\n },\n get _isFiltering(): boolean {\n return this.selectedSolution || this.selectedIndustry || this.selectedCaseStudyType;\n },\n get pagination(): Pagination | false {\n if (this._maxPage === 1 && !this._isFiltering) return false\n if (this.fetchError) return false\n\n const pagination: Pagination = {\n previousTarget:\n this.currentPage === 1 ? false : this.currentPage - 1,\n nextTarget:\n this.currentPage === this._maxPage\n ? false\n : this.currentPage + 1,\n links: [],\n }\n\n for (let pageId = 1; pageId <= this._maxPage; pageId++) {\n if (\n pageId === 1 ||\n pageId === this._maxPage ||\n pageId === this.currentPage ||\n pageId === this.currentPage - 1 ||\n pageId === this.currentPage + 1\n ) {\n pagination.links.push({\n type: 'link',\n targetPage: pageId,\n isActive: pageId === this.currentPage,\n })\n } else if (pageId === 2 || pageId === this._maxPage - 1) {\n pagination.links.push({\n type: 'dots',\n targetPage: pageId,\n })\n }\n }\n\n return pagination\n },\n get filterValues(): string {\n let filter = [];\n if (this.selectedCaseStudyType) {\n const isCaseStudy = this.selectedCaseStudyType == '1' ? '=true' : '=false';\n filter.push(`isCaseStudy${isCaseStudy}`)\n }\n if (this.selectedIndustry) {\n const selectedIndustry = this.selectedIndustry.replace('&', '%26')\n filter.push(`relatedIndustries.title='${selectedIndustry}'`)\n }\n if (this.selectedSolution) {\n const selectedSolution = this.selectedSolution.replace('&', '%26')\n filter.push(`relatedSolutions.title='${selectedSolution}'`)\n }\n\n this.isPaginating = this.filterQuery == filter.join(' AND ')\n this.filterQuery = filter.join(' AND ')\n\n return '&settings[filter]=' + this.filterQuery\n },\n setFilters(response): void {\n this.projectFilters = {\n isCaseStudy: Object.keys(response.results[1] ? response.results[1].facetDistribution.isCaseStudy : response.results[0].facetDistribution.isCaseStudy),\n relatedIndustries: Object.keys(response.results[1] ? response.results[1].facetDistribution['relatedIndustries.title'] : response.results[0].facetDistribution['relatedIndustries.title'] || {}),\n relatedSolutions: Object.keys(response.results[1] ? response.results[1].facetDistribution['relatedSolutions.title'] : response.results[0].facetDistribution['relatedSolutions.title'] || {})\n }\n },\n clearFilters(): void {\n this.selectedFilters = {\n isCaseStudy: '',\n relatedIndustry: '',\n relatedSolution: ''\n }\n this.getProjects()\n },\n projectDetails(\n isCaseStudy: boolean,\n relatedIndustries: RelatedIndustries,\n relatedSolutions: RelatedSolutions\n ): string {\n return `\n ${isCaseStudy ? caseStudyTag : applicationTag}\n ${[\n ...relatedIndustries.map((relation) => relation.title),\n ...relatedSolutions.map((relation) => relation.title),\n ].join(' | ')}\n `\n },\n async getProjects(): Promise {\n this.projectsLoading = true\n this.projects = []\n this.fetchError = false\n\n if (this._isFiltering) {\n const filterValues = this.filterValues\n if (!this.isPaginating) {\n this.currentPage = 1;\n }\n\n const response = await fetchProjectsByParams(\n language == 'en' ? '' : '/' + language,\n 'multi-search/default-results',\n `${filterValues}&ids=&settings[limit]=${this.projectsLimit}${this._pageOffset}${this._sorting}`\n )\n\n if (response.error) {\n this.fetchError = true\n } else {\n this._estimatedNonHighlightedHits =\n response.results[1] ? response.results[1].estimatedTotalHits : response.results[0].estimatedTotalHits\n this.projects = response.hits\n }\n } else {\n const response = await fetchProjectsByParams(\n language == 'en' ? '' : '/' + language,\n 'multi-search/default-results',\n `&ids=${highlightedProjects.join(',')}&settings[limit]=${this.projectsLimit\n }${this._pageOffset}${this._sorting}`\n )\n\n if (response.error) {\n this.fetchError = true\n } else {\n this.projects = response.hits\n this.setFilters(response)\n\n if (this.currentPage === 1) {\n this._estimatedNonHighlightedHits =\n response.results[1].estimatedTotalHits\n }\n }\n }\n\n this.projectsLoading = false\n\n async function fetchProjectsByParams(\n lang: string,\n searchType: 'multi-search/default-results' | 'search/filter',\n urlQueryParams: string\n ): Promise {\n urlQueryParams = urlQueryParams + '&settings[facets][]=relatedIndustries&settings[facets][]=isCaseStudy&settings[facets][]=relatedSolutions';\n return await fetch(\n `${lang}/actions/craft-meilisearch/${searchType}?search=&index=projects${urlQueryParams}`\n )\n .then((response) => response.json())\n .then((data) => {\n return data\n })\n .catch(() => {\n return {\n error: true,\n }\n })\n }\n },\n })\n\n document.addEventListener('alpine:init', () => {\n Alpine.effect(() => {\n if (Alpine.store('projectsOverview').currentPage || Alpine.store('projectsOverview').selectedSolution) {\n Alpine.store('projectsOverview').getProjects()\n }\n })\n })\n\n Alpine.start()\n}\n"],"names":["projectsOverview","projectsWrapper","caseStudyTag","applicationTag","language","highlightedProjects","Alpine","pagination","pageId","filter","isCaseStudy","selectedIndustry","selectedSolution","response","relatedIndustries","relatedSolutions","relation","filterValues","fetchProjectsByParams","lang","searchType","urlQueryParams","data"],"mappings":"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"}