|
|
<template> <div class="tw-px-[30px] tw-mb-[60px] md:tw-mb-[100px] xl:tw-px-[60px] xl:tw-max-w-screen-xl xl:tw-mx-auto xl:tw-grid xl:tw-grid-cols-[380px_auto] xl:tw-gap-[30px]"> <section class="xl:tw-col-span-2 tw-mb-5 md:tw-mb-0"> <centerMode :list="adList" v-if="adList.length"></centerMode> </section> <section class="xl:tw-col-span-2 tw-mb-[40px] xl:tw-mb-[10px]"> <Breadcrumbs class="tw-py-[7px] md:tw-py-[10px] xl:tw-py-[13px] tw-mb-4 md:tw-mb-6 xl:tw-mb-0"></Breadcrumbs> <sort :results="result" :sortType="sortType" :sortBy="sortBy" @sort="updateSortBy($event)" @filter="$modal.show(`sidebar-filter-modal`)"></sort> </section> <section class="tw-grid tw-grid-cols-1 tw-gap-[30px] tw-auto-rows-min"> <div class="tw-max-h-min" v-if="$vuetify.breakpoint.xl"> <DateCard @update="updateDateFilter" :modalChecked="selectedDates" /> </div> <div v-if="$vuetify.breakpoint.xl"> <oneLevel :label="'exhibition.Show Status'" :list="statusList" @update="updateStatusFilter"></oneLevel> </div> <div v-if="$vuetify.breakpoint.xl"> <multipleLevel :label="'Categories'" :placeholder="'Find Categories...'" :list="categoryList" :queryItem="categoryQueryFilter" @update="updateCategoryFilter"></multipleLevel> </div> <div v-if="$vuetify.breakpoint.xl"> <multipleLevel :label="'Location'" :placeholder="'Find country/city ...'" :list="locationList" :queryItem="locationQueryFilter" @update="updateLocationFilter"></multipleLevel> </div> <div v-if="$vuetify.breakpoint.xl"> <!-- <rating></rating> --> </div> </section> <section class=""> <ExhibitionListCard v-for="(item, index) in exhibitionList" :key="index" :item="item"></ExhibitionListCard> <div class="tw-mt-[34px] tw-flex tw-justify-end"> <pagination :pageLength="pageLength" @update="updatePage"></pagination> </div> </section> <div v-if="!$vuetify.breakpoint.xl"> <!-- <ShowSidebarFilterModal :statusList="statuses" :locationList="locations" :categoryList="categories" :statusChecked="selectedStatus" :locationChecked="locationChecked" :categoryChecked="categoryChecked" :datesChecked="selectedDates" @updateCategoryFilter="updateCategoryFilter" @updateLocationFilter="updateLocationFilter" @updateStatusFilter="updateStatusFilter" @updateDateFilter="updateDateFilter"> </ShowSidebarFilterModal> --> <ShowSidebarFilterModal :statusList="statusList" :locationList="locationList" :categoryList="categoryList" :statusChecked="selectedStatus" :datesChecked="selectedDates" @updateCategoryFilter="updateCategoryFilter" @updateLocationFilter="updateLocationFilter" @updateStatusFilter="updateStatusFilter" @updateDateFilter="updateDateFilter"> </ShowSidebarFilterModal> </div> <loading :isLoading="isPageLoading"></loading> </div> </template>
<script> import Breadcrumbs from "~/components/Breadcrumbs.vue"; import centerMode from "@/components/swiper/centerMode"; import ExhibitionListCard from "~/components/exhibition/ExhibitionListCard.vue"; import DateCard from "~/components/exhibition/DateCard.vue"; import sort from "@/components/newComponent/sort/sort"; import multipleLevel from "@/components/newComponent/filter/multipleLevel"; import oneLevel from "@/components/newComponent/filter/oneLevel"; import rating from "@/components/newComponent/filter/rating.vue"; import pagination from "@/components/newComponent/pagination/pagination.vue"; import ShowSidebarFilterModal from "@/components/exhibition/ShowSidebarFilterModal.vue"; import { XIcon } from "vue-feather-icons"; import loading from "@/components/newComponent/loading/loading.vue";
export default { name: "ExhibitionView", auth: false, meta: { name: "Exhibition", }, components: { centerMode, Breadcrumbs, DateCard, ExhibitionListCard, XIcon, sort, multipleLevel, oneLevel, rating, pagination, ShowSidebarFilterModal, loading, }, data: () => ({
currentPage: 1, itemsPerPage: 10, total: 0, adList: [], statusList: [], exhibitionList: [], locationList: [],
selectedDates: [], selectedStatus: [],
statusMap: new Map(),
regionMap: new Map(), countryMap: new Map(), cityMap: new Map(),
mainCategoryMap: new Map(), subCategoryMap: new Map(),
selectedMainCategory: [], selectedSubCategory: [],
selectedRegion: [], selectedCountry: [], selectedCity: [],
favoriteSet: new Set(),
categoryList: [], categoryQueryFilter: "", locationQueryFilter: "", width: undefined, sortType: [ { name: "exhibition.Recommended", value: "Recommended" }, { name: "exhibition.ShowDate", value: "ShowDate" }, { name: "exhibition.ExhibitorCount", value: "ExhibitorCount" }, { name: "exhibition.VisitorCount", value: "VisitorCount" },
], sortBy: "ShowDate", query: "" }), async created() {
// console.log("created");
this.isPageLoading = true;
// this.getAdList();
await this.getStatusList(); await this.getLocationList(); await this.getCategoryList(); await this.getFavorite(); await this.getQuery(); if (process.client) { this.width = window.innerWidth; } this.$nextTick(() => { this.isPageLoading = false; }); }, async mounted() {
// console.log("mounted");
this.$nextTick(() => { window.addEventListener("resize", this.onResize); }); }, beforeDestroy() { window.removeEventListener("resize", this.onResize); }, computed: {
result() { return this.total; }, pageLength() { return Math.ceil(this.result / this.itemsPerPage); }, }, watch: {
$route() {
this.getQuery();
}, }, methods: { onResize() { if (process.client) { this.width = window.innerWidth; } }, getAdList() {
this.adList = [ { id: 'banner_1', image: require('/assets/img/banner/banner_1.png'), url: '/service?taiwan=taiwan' }, { id: 'banner_2', image: require('/assets/img/banner/banner_2.png'), url: 'javascript:void(0);' }, { id: 'banner_3', image: require('/assets/img/banner/banner_3.png'), url: 'javascript:void(0);' }, { id: 'banner_4', image: require('/assets/img/banner/banner_4.png'), url: 'javascript:void(0);' }, { id: 'banner_5', image: require('/assets/img/banner/banner_5.png'), url: 'javascript:void(0);' } ]
}, async getStatusList() { await this.$axios .get( `/trending/api/Exhibition/Statuses?Lang=${this.$i18n.localeProperties["langQuery"]}` ) .then((result) => { if(result && result.data && result.data.DATA && result.data.DATA.rel){
this.statusList = result.data.DATA.rel;
this.statusList = this.statusList.map((item => {
this.statusMap.set(item.Key, item.Value);
return { title: item.Value, key: item.Key, };
}));
} }) .catch((err) => { console.log(err); }); }, async getCategoryList() { await this.$axios .get( `/trending/api/Exhibition/Categories?Lang=${this.$i18n.localeProperties["langQuery"]}` ) .then((result) => {
if(result && result.data && result.data.DATA && result.data.DATA.rel){
this.categoryList = result.data.DATA.rel; this.categoryList = this.categoryList.map((item) => {
this.mainCategoryMap.set(item.CategoryID, item);
item.SubCategoryList = item.SubCategoryList.map(
(children) => {
this.subCategoryMap.set(children.CategoryID, children);
return { title: children.CategoryName, key: children.CategoryID, }; } ); return { title: item.CategoryName, key: item.CategoryID, children: item.SubCategoryList, }; });
}
}) .catch((err) => { console.log(err); }); }, async getLocationList() { await this.$axios .get( `/trending/api/Exhibition/Locations?Lang=${this.$i18n.localeProperties["langQuery"]}` ) .then((result) => {
if(result && result.data && result.data.DATA && result.data.DATA.rel){ var vm = this; vm.locationList = result.data.DATA.rel;
vm.locationList = vm.locationList.map((region) => {
this.regionMap.set(region.RegionID, region);
region.CountryList = region.CountryList.map((country) => {
this.countryMap.set(country.CountryID, country);
country.CityList = country.CityList.map((city) => {
this.cityMap.set(city.CityID, city);
return { title: city.CityName, key: city.CityID, }; }); return { title: country.CountryName, key: country.CountryID, children: country.CityList, }; }); return { title: region.RegionName, key: region.RegionID, children: region.CountryList, }; });
return result.data.DATA.rel;
}
}) .catch((err) => { console.log(err); }); }, async getExhibitionCard() {
await this.$axios .get( `/trending/api/Exhibition/Cards?Lang=${this.$i18n.localeProperties["langQuery"]}` + `&PageIndex=${this.currentPage}` + `&PageSize=${this.itemsPerPage}` + `&RegionIDs=${JSON.stringify(this.selectedRegion)}` + `&CountryIDs=${JSON.stringify(this.selectedCountry)}` + `&CityIDs=${JSON.stringify(this.selectedCity)}` + `&MainCategoryIDs=${JSON.stringify(this.selectedMainCategory)}` + `&SubCategoryIDs=${JSON.stringify(this.selectedSubCategory)}` + `&Status=${JSON.stringify(this.selectedStatus)}` + `&Date=${JSON.stringify(this.selectedDates)}` + `&Sort=${this.sortBy}` + `&Query=${this.query}` ) .then((result) => {
if(result && result.data && result.data.DATA && result.data.DATA.rel){ let data = result.data.DATA.rel if(data.DataList.length>0){ this.total = data.Total; this.exhibitionList = data.DataList; this.setFavorite(); } }
}) .catch((err) => { console.log(err); this.exhibitionList = []; }); }, async getFavorite() {
this.favoriteSet.clear();
if (this.$auth.loggedIn) { await this.$axios .get( `/trending/api/Favorite/Favorites?Type=Exhibition` ) .then((result) => {
if(result && result.data && result.data.DATA && result.data.DATA.rel){
let favoriteList = []; favoriteList = result.data.DATA.rel;
favoriteList.forEach(item => {
this.favoriteSet.add(item.ParentID);
}) }
}) .catch((err) => { console.log(err); });
}
}, setFavorite() {
if (this.exhibitionList.length > 0 && this.$auth.loggedIn) {
for (let i = 0; i < this.exhibitionList.length; i++) {
if (this.favoriteSet.has(this.exhibitionList[i].ExhibitionID)) {
this.exhibitionList[i].IsFavorite = "Y";
}
}
}
},
getNewExhibitionCard() {
this.currentPage = 1; this.query = ""; this.getExhibitionCard();
},
updateSortBy(data) {
this.sortBy = data; this.getNewExhibitionCard();
}, updatePage(value) {
this.currentPage = value; window.scrollTo(0,0);
this.getExhibitionCard(); }, updateCategoryFilter(value) {
this.selectedMainCategory = []; this.selectedSubCategory = [];
value.forEach(key => {
if (this.mainCategoryMap.has(key)) { this.selectedMainCategory.push(key); }
if (this.subCategoryMap.has(key)) { this.selectedSubCategory.push(key); }
});
this.getNewExhibitionCard();
},
updateLocationFilter(value) {
this.selectedRegion = []; this.selectedCountry = []; this.selectedCity = [];
value.forEach(key => {
if (this.regionMap.has(key)) { this.selectedRegion.push(key); }
if (this.countryMap.has(key)) { this.selectedCountry.push(key); }
if (this.cityMap.has(key)) { this.selectedCity.push(key); }
});
this.getNewExhibitionCard();
}, updateStatusFilter(value) {
this.selectedStatus = [];
value.forEach(key => {
if (this.statusMap.has(key)) { this.selectedStatus.push(key); }
});
this.getNewExhibitionCard();
}, updateDateFilter(value) {
this.selectedDates = value; this.getNewExhibitionCard(); }, async getQuery() {
let vm = this;
this.selectedMainCategory = []; this.selectedSubCategory = []; this.selectedCountry = []; this.selectedCity = []; this.query = "";
if (this.$route.query.category) { vm.categoryQueryFilter = vm.$route.query.category; this.selectedMainCategory.push(vm.$route.query.category); }
if (this.$route.query.subcategory) { vm.categoryQueryFilter = vm.$route.query.subcategory; this.selectedSubCategory.push(vm.$route.query.subcategory); }
if (this.$route.query.country) { vm.locationQueryFilter = vm.$route.query.country; this.selectedCountry.push(vm.$route.query.country); }
if (this.$route.query.city) { vm.locationQueryFilter = vm.$route.query.city; this.selectedCity.push(vm.$route.query.city); }
if (this.$route.query.q) { this.query = vm.$route.query.q; }
this.getExhibitionCard();
}, }, }; </script>
<style scoped lang="scss"> .sort-by-text { max-width: 142px;
>h3 { border-right: 1px solid #e5e5e5; } }
.sort-by-text-sm { max-width: 112px;
>h3 { border-right: 1px solid #e5e5e5; } } </style>
<style lang="scss"> .filter-zindex { z-index: 499 !important; }
.exhibition-pagination { .v-pagination { justify-content: flex-end; }
.v-pagination__navigation, .v-pagination__item { box-shadow: none; margin: 0; min-width: 28px;
&.v-pagination__item--active { color: $primary-orange !important; } } }
.v-breadcrumbs { padding: 0px; }
.v-application ul { padding-left: 0px; } </style>
|