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.
497 lines
17 KiB
497 lines
17 KiB
<template>
|
|
<div
|
|
class="tw-px-[30px] tw-mt-[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-[36px] md:tw-mb-[24px] lg:tw-mb-[34px]">
|
|
<Breadcrumbs></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 v-if="$vuetify.breakpoint.xl">
|
|
<multipleLevel :label="'Categories'" :placeholder="$t('Find category/subcategory ...')" :list="categoryList" :queryItem="categoryQueryFilter"
|
|
@update="updateCategoryFilter"></multipleLevel>
|
|
</div>
|
|
<div v-if="$vuetify.breakpoint.xl">
|
|
<multipleLevel :label="'Location'" :placeholder="$t('Find country/city ...')" :list="locationList"
|
|
:queryItem="locationQueryFilter" @update="updateLocationFilter"></multipleLevel>
|
|
</div>
|
|
<!-- <div v-if="$vuetify.breakpoint.xl">
|
|
<price :max="maxPrice" :currentValue="priceRangeFilter" @update="updatePriceRange"></price>
|
|
</div> -->
|
|
<!-- <div v-if="$vuetify.breakpoint.xl">
|
|
<rating @update="updateRatingRange"></rating>
|
|
</div> -->
|
|
</section>
|
|
<section class="">
|
|
<ServiceListCard class="tw-mb-[30px]" v-for="(item, index) in serviceList" :key="index" :service="item">
|
|
</ServiceListCard>
|
|
<div class="tw-mt-[34px] tw-flex tw-justify-end">
|
|
<pagination :pageLength="pageLength" @update="updateCurrentPage"></pagination>
|
|
</div>
|
|
</section>
|
|
<div v-if="!$vuetify.breakpoint.xl">
|
|
<sidebarFilterModal :max="maxPrice" :locationList="locationList"
|
|
:locationChecked="locationNameFilter" :categoryChecked="categoryFilter" :priceChecked="priceRangeFilter"
|
|
@updatePriceRange="updatePriceRange" @updateCategoryFilter="updateCategoryFilter"
|
|
@updateLocationFilter="updateLocationFilter"></sidebarFilterModal>
|
|
</div>
|
|
<loading :isLoading="isPageLoading"></loading>
|
|
</div>
|
|
</template>
|
|
<script>
|
|
import Breadcrumbs from "@/components/Breadcrumbs";
|
|
import sort from "@/components/newComponent/sort/sort";
|
|
import oneLevel from "@/components/newComponent/filter/oneLevel";
|
|
import multipleLevel from "@/components/newComponent/filter/multipleLevel";
|
|
import price from "@/components/newComponent/filter/price";
|
|
import rating from "@/components/newComponent/filter/rating.vue";
|
|
import pagination from "@/components/newComponent/pagination/pagination.vue";
|
|
import sidebarFilterModal from "@/components/newComponent/modal/sidebarFilterModal.vue";
|
|
import ServiceListCard from "@/components/service/ServiceListCard";
|
|
import loading from "@/components/newComponent/loading/loading.vue";
|
|
|
|
export default {
|
|
name: "ServiceList",
|
|
auth: false,
|
|
components: {
|
|
Breadcrumbs,
|
|
sort,
|
|
oneLevel,
|
|
multipleLevel,
|
|
price,
|
|
rating,
|
|
sidebarFilterModal,
|
|
ServiceListCard,
|
|
pagination,
|
|
loading,
|
|
},
|
|
meta: {
|
|
pageName: "Service List",
|
|
},
|
|
data() {
|
|
return {
|
|
renderList: [],
|
|
serviceList: [],
|
|
sortType: [
|
|
// { name: "Ratings", value: "Ratings" },
|
|
// { name: "ShowEasy Recommended", value: "ShowEasy Recommended" },
|
|
{ name: "Popularity", value: "CreateDate" },
|
|
{ name: "Price (Low to High)", value: "MinPrice" },
|
|
{ name: "Recently Added", value: "LaunchDateS" },
|
|
],
|
|
locationList: [],
|
|
categoryList: [],
|
|
// regionNameList: ['123'],
|
|
countryNameList: ['Asia','Asia1'],
|
|
cityNameList: ['Taiwan','Taiwan1'],
|
|
categoryNameList: ['Rental cars','Rental cars1'],
|
|
subcategoryNameList: ['子類1'],
|
|
sortBy: "CreateDate",
|
|
maxPrice: 100,
|
|
priceRangeFilter: [0,100],
|
|
ratingRangeFilter: [0, 5],
|
|
locationNameFilter: ['Asia','Taiwan'],
|
|
categoryFilter: ['Rental cars','Rental cars1'],
|
|
perPageItems: 10,
|
|
currentPage: 1,
|
|
total: 0,
|
|
locationQueryFilter: "",
|
|
categoryQueryFilter: "",
|
|
isPageLoading: false,
|
|
mainCategoryMap: new Map(),
|
|
subCategoryMap: new Map(),
|
|
mainLocationMap: new Map(),
|
|
subLocationMap: new Map(),
|
|
subLocationMap2: new Map(),
|
|
mainCategoryQuery: '',
|
|
subCategoryQuery: '',
|
|
};
|
|
},
|
|
async created() {
|
|
this.isPageLoading = true;
|
|
await this.getQuery();
|
|
await this.getServiceList();
|
|
await this.getCategoryList();
|
|
await this.getLocationList();
|
|
// await this.getPriceRange();
|
|
// this.renderList = this.sliceRenderList(this.serviceFilter);
|
|
this.isPageLoading = false;
|
|
},
|
|
mounted() { },
|
|
computed: {
|
|
// serviceFilter() {
|
|
// var vm = this;
|
|
// if (Array.isArray(vm.serviceList)) {
|
|
// let priceList = vm.filterByPrice(
|
|
// vm.serviceList,
|
|
// vm.priceRangeFilter[0],
|
|
// vm.priceRangeFilter[1]
|
|
// );
|
|
// priceList = priceList == undefined ? [] : priceList;
|
|
// let locationList = vm.filterByLocation(
|
|
// priceList,
|
|
// vm.locationNameFilter
|
|
// );
|
|
// locationList = locationList == undefined ? [] : locationList;
|
|
// let categoryList = vm.filterByCategory(
|
|
// locationList,
|
|
// vm.categoryFilter
|
|
// );
|
|
// categoryList = categoryList == undefined ? [] : categoryList;
|
|
// if(categoryList.length<1){
|
|
// return [];
|
|
// }
|
|
// let sortedList = vm.sortServiceList(categoryList);
|
|
// return sortedList;
|
|
// } else {
|
|
// return [];
|
|
// }
|
|
// },
|
|
result() {
|
|
return this.total;
|
|
},
|
|
pageLength() {
|
|
return Math.ceil(this.result / this.perPageItems);
|
|
},
|
|
// renderList() {
|
|
// let arr = this.sliceRenderList(this.serviceFilter);
|
|
// return arr;
|
|
// },
|
|
currency() {
|
|
return this.$store.getters.getCurrency;
|
|
},
|
|
},
|
|
watch: {
|
|
currency: {
|
|
handler: async function (newVal, oldVal) {
|
|
let vm = this;
|
|
if (newVal !== oldVal) {
|
|
vm.isPageLoading = true;
|
|
await vm.getServiceList();
|
|
// let data =await vm.mapServiceLocationName(
|
|
// vm.serviceList,
|
|
// vm.countryNameList,
|
|
// vm.cityNameList
|
|
// );
|
|
// vm.serviceList = data == undefined ? [] : data;
|
|
// vm.serviceList =await vm.mapServiceCategoryName(
|
|
// vm.serviceList,
|
|
// vm.categoryNameList
|
|
// );
|
|
// vm.serviceList = data == undefined ? [] : data;
|
|
// vm.renderList =await vm.serviceList;
|
|
// await vm.getPriceRange();
|
|
vm.isPageLoading = false;
|
|
}
|
|
},
|
|
},
|
|
$route: {
|
|
handler: function () {
|
|
this.getQuery();
|
|
},
|
|
},
|
|
},
|
|
methods: {
|
|
async getServiceList() {
|
|
let vm = this;
|
|
let keyword = "";
|
|
let subcatg = "";
|
|
let sortField = "CreateDate";
|
|
if(vm.sortBy){
|
|
sortField = vm.sortBy;
|
|
}
|
|
let location = "";
|
|
// let category = "";
|
|
let currency = this.$store.getters.getCurrency;
|
|
if (vm.$route.query.q) {
|
|
keyword = vm.$route.query.q;
|
|
}
|
|
// if (vm.$route.query.category) {
|
|
// category = "&category=" + vm.$route.query.category;
|
|
// }
|
|
// if (vm.categoryQueryFilter) {
|
|
// subcatg = vm.categoryQueryFilter;
|
|
// }else if(vm.$route.query.subcatg){
|
|
// subcatg = vm.$route.query.subcatg;
|
|
// }
|
|
// if(vm.locationQueryFilter){
|
|
// location = vm.locationQueryFilter;
|
|
// }
|
|
await vm.$axios.get(`/trending/api/Onsite/ServiceLists?Lang=${vm.$i18n.localeProperties["langQuery"]}&PageIndex=${vm.currentPage}
|
|
&PageSize=${vm.perPageItems}&SortField=${sortField}&sortOrder=desc&KeyWord=${keyword}&Categories=${subcatg}&Locations=${location}
|
|
&Currency=${currency}&MinPrice=0&MaxPrice=0`).then((response) => {
|
|
if(response && response.data && response.data.DATA && response.data.DATA.rel){
|
|
let data = response.data.DATA.rel
|
|
if(data.DataList.length>0){
|
|
vm.total = data.Total;
|
|
vm.serviceList = data.DataList;
|
|
}
|
|
}
|
|
})
|
|
.catch((err) => {
|
|
console.log(err);
|
|
});
|
|
},
|
|
async getCategoryList() {
|
|
await this.$axios
|
|
.get(`/trending/api/Onsite/Categories?Lang=${this.$i18n.localeProperties["langQuery"]}`)
|
|
.then((response) => {
|
|
if(response && response.data && response.data.DATA && response.data.DATA.rel){
|
|
let data = response.data.DATA.rel
|
|
if(data.length>0){
|
|
this.categoryList = data.map((item) => {
|
|
this.mainCategoryMap.set(item.CategoryID, item);
|
|
if(item.SubCategoryList && item.SubCategoryList.length>0){
|
|
item.SubCategoryList = item.SubCategoryList.map(
|
|
(children) => {
|
|
this.subCategoryMap.set(children.CategoryID, children);
|
|
return {
|
|
title: children.CategoryName,
|
|
key: children.CategoryID,
|
|
};
|
|
}
|
|
);
|
|
}else{
|
|
item.SubCategoryList = [];
|
|
}
|
|
return {
|
|
title: item.CategoryName,
|
|
key: item.CategoryID,
|
|
children: item.SubCategoryList,
|
|
};
|
|
});
|
|
}
|
|
}
|
|
})
|
|
.catch((error) =>
|
|
console.log(error)
|
|
);
|
|
},
|
|
async getLocationList() {
|
|
await this.$axios
|
|
.get(`/trending/api/Onsite/Locations?Lang=${this.$i18n.localeProperties["langQuery"]}`)
|
|
.then((response) => {
|
|
if(response && response.data && response.data.DATA && response.data.DATA.rel){
|
|
let data = response.data.DATA.rel
|
|
if(data.length>0){
|
|
// this.locationList = data;
|
|
this.locationList = data.map((item) => {
|
|
this.mainLocationMap.set(item.RegionID, item);
|
|
if(item.CountryList && item.CountryList.length>0){
|
|
item.CountryList = item.CountryList.map(
|
|
(children) => {
|
|
this.subLocationMap.set(children.CountryID, children);
|
|
if(children.CityList && children.CityList.length>0){
|
|
children.CityList = children.CityList.map(
|
|
(children2) => {
|
|
this.subLocationMap2.set(children2.CityID, children2);
|
|
return {
|
|
title: children2.CityName,
|
|
key: children2.CityID,
|
|
};
|
|
}
|
|
);
|
|
}else{
|
|
children.CityList = [];
|
|
}
|
|
return {
|
|
title: children.CountryName,
|
|
key: children.CountryID,
|
|
children: children.CityList,
|
|
};
|
|
}
|
|
);
|
|
}else{
|
|
item.CountryList = [];
|
|
}
|
|
return {
|
|
title: item.RegionName,
|
|
key: item.RegionID,
|
|
children: item.CountryList,
|
|
};
|
|
});
|
|
}
|
|
}
|
|
})
|
|
.catch((error) =>
|
|
console.log(error)
|
|
);
|
|
},
|
|
updateSortBy(data) {
|
|
this.sortBy = data;
|
|
// console.log("排序:"+this.sortBy);
|
|
this.getServiceList();
|
|
},
|
|
// sortServiceList(data) {
|
|
// switch (this.sortBy) {
|
|
// // case "Ratings":
|
|
// // function Ratings(a, b) {
|
|
// // if (Number(a.rating) < Number(b.rating)) return 1;
|
|
// // if (Number(a.rating) > Number(b.rating)) return -1;
|
|
// // return 0;
|
|
// // }
|
|
// // return data.sort(Ratings);
|
|
// // case "ShowEasy Recommended":
|
|
// // return data;
|
|
// case "Popularity":
|
|
// function Views(a, b) {
|
|
// if (Number(a.view_counts) < Number(b.view_counts)) return 1;
|
|
// if (Number(a.view_counts) > Number(b.view_counts)) return -1;
|
|
// return 0;
|
|
// }
|
|
// return data.sort(Views);
|
|
// case "Price":
|
|
// function Price(a, b) {
|
|
// if (Number(a.price) < Number(b.price)) return -1;
|
|
// if (Number(a.price) > Number(b.price)) return 1;
|
|
// return 0;
|
|
// }
|
|
// return data.sort(Price);
|
|
// case "Recently Added":
|
|
// function Date(a, b) {
|
|
// if (
|
|
// a.launch_dates[0].replace(/-/g, "") <
|
|
// b.launch_dates[0].replace(/-/g, "")
|
|
// )
|
|
// return 1;
|
|
// if (
|
|
// a.launch_dates[0].replace(/-/g, "") >
|
|
// b.launch_dates[0].replace(/-/g, "")
|
|
// )
|
|
// return -1;
|
|
// return 0;
|
|
// }
|
|
// return data.sort(Date);
|
|
// default:
|
|
// return data;
|
|
// }
|
|
// },
|
|
mapSavedService(data, savedList) {
|
|
return data.map((item) => {
|
|
item.liked = false;
|
|
if (savedList.includes(item.id)) {
|
|
item.liked = true;
|
|
}
|
|
return item;
|
|
});
|
|
},
|
|
mapServiceLocationName(data, countryList, cityList) {
|
|
data = data.map((item) => {
|
|
Number(item.country) > 0
|
|
? (item.countryName = countryList[item.country])
|
|
: (item.countryName = "");
|
|
return item;
|
|
});
|
|
data = data.map((item) => {
|
|
Number(item.city) > 0
|
|
? (item.cityName = cityList[item.city])
|
|
: (item.cityName = "");
|
|
return item;
|
|
});
|
|
return data;
|
|
},
|
|
mapServiceCategoryName(data, categoryList) {
|
|
data = data.map((item) => {
|
|
Number(item.category) > 0
|
|
? (item.categoryName = categoryList[item.category])
|
|
: (item.categoryName = "");
|
|
return item;
|
|
});
|
|
return data;
|
|
},
|
|
async getPriceRange() {
|
|
let max = 0;
|
|
let vm = this;
|
|
if(vm.serviceList){
|
|
vm.serviceList.forEach((element) => {
|
|
if (element.price > max) {
|
|
max = element.price;
|
|
}
|
|
});
|
|
}
|
|
vm.maxPrice = max;
|
|
vm.priceRangeFilter = [0, max];
|
|
},
|
|
filterByPrice(data, min, max) {
|
|
let item = data.filter((item) => item.price >= min && item.price <= max);
|
|
return item;
|
|
},
|
|
updatePriceRange(value) {
|
|
this.priceRangeFilter = [...value];
|
|
},
|
|
filterByRating(data, min, max) {
|
|
return data.filter((item) => item.price >= min && item.price <= max);
|
|
},
|
|
updateRatingRange(value) {
|
|
// console.log(value);
|
|
},
|
|
filterByLocation(data, locations) {
|
|
let list = data.filter(
|
|
(item) =>
|
|
locations.includes(item.cityName) ||
|
|
locations.includes(item.countryName)
|
|
);
|
|
return list;
|
|
},
|
|
updateLocationFilter(value) {
|
|
// console.log("位置勾選");
|
|
this.locationQueryFilter = "";
|
|
// this.getServiceList();
|
|
},
|
|
filterByCategory(data, categories) {
|
|
return data.filter((item) => categories.includes(item.categoryName));
|
|
},
|
|
updateCategoryFilter(value) {
|
|
// console.log("類型勾選:" + value);
|
|
this.categoryQueryFilter = "";
|
|
// this.getServiceList();
|
|
},
|
|
updateCurrentPage(value) {
|
|
// console.log("分頁變化");
|
|
this.currentPage = value;
|
|
this.getServiceList();
|
|
},
|
|
sliceRenderList(data) {
|
|
return data.slice(
|
|
(this.currentPage - 1) * this.perPageItems,
|
|
this.currentPage * this.perPageItems
|
|
);
|
|
},
|
|
async getQuery() {
|
|
|
|
let vm = this;
|
|
// this.locationQueryFilter = "";
|
|
this.categoryQueryFilter = "";
|
|
// if (this.$route.query.hasOwnProperty("country") && this.countryNameList.length>0) {
|
|
// this.locationQueryFilter =
|
|
// this.countryNameList[Number(this.$route.query.country)];
|
|
// }
|
|
// if (this.$route.query.hasOwnProperty("city") && this.cityNameList.length>0) {
|
|
// this.locationQueryFilter =
|
|
// this.cityNameList[Number(this.$route.query.city)];
|
|
// }
|
|
// if (this.$route.query.hasOwnProperty("region")) {
|
|
// this.locationQueryFilter =
|
|
// this.regionNameList[Number(this.$route.query.region)];
|
|
// }
|
|
// if (this.$route.query.hasOwnProperty("category") && this.categoryNameList.length>0) {
|
|
// this.categoryQueryFilter =
|
|
// this.categoryNameList[Number(this.$route.query.category)];
|
|
// }
|
|
// if (this.$route.query.hasOwnProperty("subcategory")) {
|
|
// this.categoryQueryFilter =
|
|
// this.unsortSubcategoryList[Number(this.$route.query.subcategory)];
|
|
// }
|
|
|
|
if(vm.$route.query.hasOwnProperty("category")){
|
|
// vm.categoryQueryFilter = vm.$route.query.category;
|
|
}else if(vm.$route.query.hasOwnProperty("subcatg")){
|
|
vm.categoryQueryFilter = vm.$route.query.subcatg;
|
|
}
|
|
},
|
|
},
|
|
};
|
|
</script>
|
|
<style lang="scss" scoped>
|
|
|
|
</style>
|