You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
597 lines
15 KiB
597 lines
15 KiB
<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>
|