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.
 
 

875 lines
24 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="ads" v-if="ads.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="statuses" @update="updateStatusFilter"></oneLevel>
</div>
<div v-if="$vuetify.breakpoint.xl">
<multipleLevel :label="'Categories'" :placeholder="'Find Categories...'" :list="categories"
:queryItem="categoryQueryFilter" @update="updateCategoryFilter"></multipleLevel>
</div>
<div v-if="$vuetify.breakpoint.xl">
<multipleLevel :label="'Location'" :placeholder="'Find country/city ...'" :list="locations"
:queryItem="locationQueryFilter" @update="updateLocationFilter"></multipleLevel>
</div>
<div v-if="$vuetify.breakpoint.xl">
<!-- <rating></rating> -->
</div>
</section>
<!-- <section class="">
<ExhibitionListCard v-for="(item, index) in renderList" :key="index" :item="item"
@toggle-favorite="onToggleFavorite"></ExhibitionListCard>
<div class="tw-mt-[34px] tw-flex tw-justify-end">
<pagination :pageLength="pageLength" @update="updatePage"></pagination>
</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>
</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,
},
async asyncData({ route, $auth, $axios, i18n }) {
// get URL link prarm
// created
let isPageLoading = true;
let langQuery = "?lang=" + i18n.localeProperties["langQuery"];
let keyword = route.query.q;
let data;
// ({ data } = await $axios.get("/exhibitions/filters" + langQuery));
let statuses;
if (data) {
statuses = data.filters.statuses.map((item) => {
return {
key: item.Key,
title: item.Value,
};
});
}
// ({ data } = await $axios.get(
// `/t/exhibitions/locations${langQuery}&sort=true`
// ));
let locations;
if (data) {
locations = data.sort_results.map((item) => {
item.country_list = item.country_list.map((country) => {
country.city_list = country.city_list.map((city) => {
return {
title: city.city_name,
key: city.city_name,
};
});
return {
title: country.country_name,
key: country.country_name,
children: country.city_list,
};
});
return {
title: item.region_name,
key: item.region_name,
children: item.country_list,
};
});
}
// ({ data } = await $axios.get(
// `/t/exhibitions/categories${langQuery}&sort=true`
// ));
let categories;
if (data) {
categories = data.sort_results.map((item) => {
item.subcategories_list = item.subcategories_list.map((children) => {
return {
title: children.subcategory_name,
key: children.subcategory_name,
};
});
return {
title: item.category_name,
key: item.category_name,
children: item.subcategories_list,
};
});
}
if (keyword) {
langQuery = langQuery + "&q=" + keyword;
}
try {
data = {
exhibitions: [],
ads: [],
};
// ({ data } = await $axios
// .get("/exhibitions" + langQuery)
// .then()
// .catch((err) => {
// console.log(err);
// }));
} catch (e) {
data = {
exhibitions: [],
ads: [],
};
console.log(e);
}
// console.log(data.exhibitions);
// let exhibitionList = data.exhibitions; // exhibitionApi2CardType();
let userSavedList = [];
if ($auth.loggedIn) {
// await $axios
// .get(
// `/member/users/${$auth.$storage.getUniversal("jwt").user_id}?jwt=${
// $auth.$storage.getUniversal("jwt").token
// }`
// )
// .then((res) => {
// userSavedList = res.data.UserExhibition; //.map(item=>item.exhibition_id)
// })
// .catch((err) => {
// console.log(err);
// });
}
// userSavedList = userSavedList.map((item) => item.exhibition_id);
// for (let i = 0; i < exhibitionList.length; i++) {
// if (userSavedList.includes(exhibitionList[i].id)) {
// exhibitionList[i].saved = true;
// } else {
// exhibitionList[i].saved = false;
// }
// }
let ads = data.ads;
return {
statuses: statuses,
// categories: categories,
// locations: locations,
// rating: rating,
isPageLoading: isPageLoading,
// exhibitionList: exhibitionList,
ads: ads,
langQuery: langQuery,
};
},
data: () => ({
page: 1,
perPageItems: 10,
currentPage: 1,
total: 0,
adList: [],
exhibitionList: [],
categoryChecked: [],
locationChecked: [],
ratingChecked: [],
locations: [],
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(),
categories: [],
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");
// to Fred
// addjust async/sync orders
this.isPageLoading = true;
// this.getAdList();
await this.getStatusList();
await this.getLocationList();
await this.getCategoryList();
await this.getFavorite();
await this.getQuery();
// await this.getExhibitionCard();
// this.getQuery();
// await this.getUnsortLocationList();
// await this.getUnsortCategoryList();
// await this.getQuery();
// if (this.$route.query.hasOwnProperty("q")) {
// this.sortType.splice(0, 0, {
// name: "ShowEasy Recommended",
// value: "ShowEasy Recommended",
// });
// this.sortBy = "ShowEasy Recommended";
// }
// let userSavedList = [];
// if (this.$auth.loggedIn) {
// // await this.$axios
// // .get(
// // `/member/users/${this.$auth.$storage.getUniversal("jwt").user_id
// // }?jwt=${this.$auth.$storage.getUniversal("jwt").token}`
// // )
// // .then((res) => {
// // userSavedList = res.data.UserExhibition;
// // })
// // .catch((err) => {
// // console.log(err);
// // });
// // this.$store.dispatch("updatePicture");
// // this.$nextTick(() => {
// // this.$forceUpdate();
// // });
// }
// userSavedList = userSavedList.map((item) => item.exhibition_id);
// for (let i = 0; i < this.exhibitionList.length; i++) {
// if (userSavedList.includes(this.exhibitionList[i].id)) {
// this.exhibitionList[i].saved = true;
// } else {
// this.exhibitionList[i].saved = false;
// }
// }
if (process.client) {
this.width = window.innerWidth;
}
this.$nextTick(() => {
this.isPageLoading = false;
});
},
async mounted() {
console.log("mounted");
// let userSavedList = [];
// if (this.$auth.loggedIn) {
// // await this.$axios
// // .get(
// // `/member/users/${this.$auth.$storage.getUniversal("jwt").user_id
// // }?jwt=${this.$auth.$storage.getUniversal("jwt").token}`
// // )
// // .then((res) => {
// // userSavedList = res.data.UserExhibition;
// // })
// // .catch((err) => {
// // console.log(err);
// // });
// // this.$store.dispatch("updatePicture");
// // this.$nextTick(() => {
// // this.$forceUpdate();
// // });
// }
// userSavedList = userSavedList.map((item) => item.exhibition_id);
// for (let i = 0; i < this.exhibitionList.length; i++) {
// if (userSavedList.includes(this.exhibitionList[i].id)) {
// this.exhibitionList[i].saved = true;
// } else {
// this.exhibitionList[i].saved = false;
// }
// }
this.$nextTick(() => {
window.addEventListener("resize", this.onResize);
});
},
beforeDestroy() {
window.removeEventListener("resize", this.onResize);
this.fetchUser();
},
computed: {
// result() {
// // return this.exhibitionsFilter.length;
// return this.exhibitionList.length;
// },
// pageLength() {
// return Math.ceil(this.totalPages / this.perPage);
// },
// renderList() {
// return this.sliceRenderList(this.exhibitionsFilter);
// },
result() {
return this.total;
},
pageLength() {
return Math.ceil(this.result / this.perPageItems);
},
},
watch: {
page() {
// window.scrollTo(0, 0);
},
$route() {
// console.log("route");
this.getQuery();
},
},
methods: {
onResize() {
if (process.client) {
this.width = window.innerWidth;
}
},
async fetchUser() {
let userSavedList = [];
if (this.$auth.loggedIn) {
// await this.$axios
// .get(
// `/member/users/${this.$auth.$storage.getUniversal("jwt").user_id
// }?jwt=${this.$auth.$storage.getUniversal("jwt").token}`
// )
// .then((res) => {
// userSavedList = res.data.UserExhibition;
// })
// .catch((err) => {
// console.log(err);
// });
}
userSavedList = userSavedList.map((item) => item.exhibition_id);
for (let i = 0; i < this.exhibitionList.length; i++) {
if (userSavedList.includes(this.exhibitionList[i].id)) {
this.exhibitionList[i].saved = true;
} else {
this.exhibitionList[i].saved = false;
}
}
},
getAdList() {
this.ads = [
{
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.data.DATA.rel) {
this.statuses = result.data.DATA.rel;
this.statuses = this.statuses.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.data.DATA.rel) {
this.categories = result.data.DATA.rel;
this.categories = this.categories.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.data.DATA.rel) {
var vm = this;
vm.locations = result.data.DATA.rel;
vm.locations = vm.locations.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() {
// this.query = this.query + "工具機";
// console.log("getExhibitionCard"+": "+this.query)
await this.$axios
.get(
`/trending/api/Exhibition/Cards?Lang=${this.$i18n.localeProperties["langQuery"]}` +
`&PageIndex=${this.currentPage}` +
`&PageSize=${this.perPageItems}` +
`&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) => {
console.table(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.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";
}
}
}
},
updateSortBy(data) {
this.query = "";
this.sortBy = data;
this.getExhibitionCard();
},
updatePage(value) {
this.currentPage = value;
this.getExhibitionCard();
},
updateCategoryFilter(value) {
this.query = "";
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.getExhibitionCard();
},
updateLocationFilter(value) {
this.query = "";
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.getExhibitionCard();
},
updateStatusFilter(value) {
this.query = "";
this.selectedStatus = [];
value.forEach(key => {
if (this.statusMap.has(key)) {
this.selectedStatus.push(key);
}
});
this.getExhibitionCard();
},
updateDateFilter(value) {
this.query = "";
this.selectedDates = value;
this.getExhibitionCard();
},
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();
},
sortServiceList(data) {
switch (this.sortBy) {
case "ShowEasy Recommended":
return data;
case "Exhibitor Numbers":
function Exhibitors(a, b) {
if (
Number(a.exhibitors ? a.exhibitors.replace(/[^0-9]/gi, "") : "") <
Number(b.exhibitors ? b.exhibitors.replace(/[^0-9]/gi, "") : "")
)
return 1;
if (
Number(a.exhibitors ? a.exhibitors.replace(/[^0-9]/gi, "") : "") >
Number(b.exhibitors ? b.exhibitors.replace(/[^0-9]/gi, "") : "")
)
return -1;
return 0;
}
return data.sort(Exhibitors);
case "Visitor Numbers":
function Visitor(a, b) {
if (
Number(a.visitors ? a.visitors.replace(/[^0-9]/gi, "") : "") <
Number(b.visitors ? b.visitors.replace(/[^0-9]/gi, "") : "")
)
return 1;
if (
Number(a.visitors ? a.visitors.replace(/[^0-9]/gi, "") : "") >
Number(b.visitors ? b.visitors.replace(/[^0-9]/gi, "") : "")
)
return -1;
return 0;
}
return data.sort(Visitor);
case "Show Dates":
function Date(a, b) {
if (a.startdate.replace(/-/g, "") < b.startdate.replace(/-/g, ""))
return 1;
if (a.startdate.replace(/-/g, "") > b.startdate.replace(/-/g, ""))
return -1;
return 0;
}
return data.sort(Date);
default:
return data;
}
},
sliceRenderList(data) {
return data.slice(
(this.page - 1) * this.perPage,
this.page * this.perPage
);
},
},
};
</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>