|
|
<template> <div class="search"> <v-card v-click-outside="clickOutSide" class="tw-flex tw-px-[16px] tw-py-[11px] tw-rounded-[16px] tw-w-[345px] md:tw-w-[382px] xl:tw-w-[760px]"> <div class="btn-group tw-flex tw-rounded-none xl:tw-pr-[16px] xl:tw-mr-[16px]"> <v-btn class="border-radius-14 remove-upper mx-0 tw-hidden xl:tw-block tw-text-white tw-bg-primary-default" style="font-size: 14px" height="40" text @click="clickExhibition">{{ $t('Exhibition')}}</v-btn> <!-- <v-btn class="border-radius-14 remove-upper mx-0 tw-hidden xl:tw-block" :class="tabToggle == 1 ? 'tw-text-white tw-bg-primary-default' : 'tw-text-primary-default'" style="font-size: 14px" text height="40" @click="clickService">{{ $t('Service')}}</v-btn> --> </div> <div class="custom-control flex-grow-1 tw-text-[16px] tw-text-base-tertiary xl:tw-hidden" @click="handleClick"> {{ $t(customPlaceholder) }} </div> <input class="custom-control flex-grow-1 tw-text-[16px] tw-placeholder-text-[16px] tw-hidden xl:tw-block" v-model="inputs" :placeholder="$t(customPlaceholder)" @input="handleInput" @click="handleClick" v-on:keyup.enter="goToSearch()" /> <svg width="24" height="24" class="tw-my-auto tw-cursor-pointer tw-pointer-events-none xl:tw-pointer-events-auto" shape-rendering="geometricPrecision" @click="goToSearch()"> <image xlink:href="@/assets/svg/icon-search-small.svg" src="@/assets/svg/icon-search-small.svg" width="24" height="24" /> </svg> <v-card class="search-result white rounded-lg above" v-if="keywords.length != 0 && keyword" style="z-index: 999 !important" :max-width="width"> <template v-for="(keyword, idx) in populars.search"> <v-row v-if="type=='exhibition'" :key="idx" class="mx-2 my-2 grey--text text--lighten-1"> <nuxt-link :to="localePath(`/${type}?q=${keyword}`)" class="remove-underline" style="width: 100%; height: 100%"> <v-card flat color="transparent" width="100%" height="40" style="padding: 0px 12px" class="d-flex align-center"> {{ keyword }} </v-card> </nuxt-link> </v-row> </template> <!-- <template v-for="(keyword, idx) in popular.service"> <v-row v-if="type=='service'" :key="idx" class="mx-2 my-2 grey--text text--lighten-1"> <nuxt-link :to="localePath(`/${type}?q=${keyword}`)" class="remove-underline" style="width: 100%; height: 100%"> <v-card flat color="transparent" width="100%" height="40" style="padding: 0px 12px" class="d-flex align-center"> {{ keyword }} </v-card> </nuxt-link> </v-row> </template> --> </v-card>
<!-- exhibition --> <v-container class="search-result white border-radius-16 hidden-sm-and-down xl:tw-px-[20px] xl:tw-py-[20px] tw-shadow-[0_1px_6px_0_rgba(0,0,0,0.4)]" v-if="exhibition"> <!-- <div class="tw-mb-[20px]"> <div class="tw-mb-[20px]"> <div class="tw-body-3 tw-font-bold tw-text-black tw-mb-[20px]">{{ $t('History') }} </div> <div class="tw-flex tw-flex-wrap"> <nuxt-link class="tw-mr-[16px] tw-mb-[10px] tw-px-[16px] tw-py-[7px] tw-border-solid tw-border-[1px] tw-rounded-[12px] tw-transition-all tw-duration-300 tw-ease-in-out tw-border-x-secondary-default tw-text-secondary-default hover:tw-border-transparent hover:tw-bg-secondary-default hover:tw-text-white" v-for="(servicesSearch, idx) in servicesSearchs" :key="idx" :to="localePath(`/exhibition?q=${servicesSearch}`)"> {{ servicesSearch }} </nuxt-link> </div> </div> </div> --> <div class="tabs tw-flex tw-mb-[16px] md:tw-mb-[20px]"> <button :class="['tw-mr-[30px] tw-body-3 tw-transition-all tw-duration-300 tw-ease-in-out tab',tabs == 'exhibitionsCategories' ? 'active tw-text-black tw-font-bold':'tw-text-neutrals-500']" @click="tabs = 'exhibitionsCategories'">{{ $t('Exhibition Categories') }}</button> <button :class="['tw-body-3 tw-transition-all tw-duration-300 tw-ease-in-out tab',tabs == 'location' ? 'active tw-text-black tw-font-bold':'tw-text-neutrals-500']" @click="tabs = 'location'">{{ $t('Location') }}</button> </div>
<div v-if="tabs=='exhibitionsCategories'"> <div class="customMenuLink tw-relative tw-z-10" @mouseleave="exhibitionActiveIndex=0"> <div class="customDropMenu exhibition tw-w-full"> <div class="tw-relative tw-grid tw-grid-cols-2 tw-min-h-[110px]" v-if="exhibitionsCategories && exhibitionsCategories.length>0"> <div class="tw-list-none tw-overflow-x-hidden tw-overflow-y-auto tw-h-auto tw-break-inside-avoid tw-grid tw-grid-cols-1 tw-gap-[20px]"> <div class="tw-list-none tw-pr-[20px]" v-for="(item,index) in exhibitionsCategories" :key="index" @mouseover="exhibitionActiveIndex=index"> <div :class="['exhibitionDropdownLink tw-w-full tw-body-4 tw-font-normal hover:tw-text-primary-default',exhibitionActiveIndex == index ? 'tw-text-primary-default active':'tw-text-neutrals-900']"> <span class="tw-flex tw-items-center tw-min-w-[322px]">{{ $t(item.CategoryName) }}</span> </div> </div> </div> <div class="tw-overflow-x-hidden tw-overflow-y-auto"> <ul class="tw-list-none tw-grid tw-grid-cols-1 tw-gap-[20px] tw-px-[20px] " v-if="exhibitionsCategories[exhibitionActiveIndex].SubCategoryList && exhibitionsCategories[exhibitionActiveIndex].SubCategoryList.length>0"> <li class="tw-list-none"><a :href="localePath(`/exhibition?category=${exhibitionsCategories[exhibitionActiveIndex].CategoryID}`)" class="tw-block tw-body-4 tw-font-normal tw-text-neutral-800 hover:tw-text-primary-default">{{ $t('All')}}</a> </li> <li v-for="(sub,index) in exhibitionsCategories[exhibitionActiveIndex].SubCategoryList" :key="index" class="tw-list-none"><a :href="localePath(`/exhibition?subcategory=${sub.CategoryID}`)" class="tw-block tw-min-h-[30px] tw-body-4 tw-font-normal tw-min-w-[230px] tw-text-neutral-800 hover:tw-text-primary-default">{{ sub.CategoryName }}</a> </li> </ul> </div> </div> </div> </div> </div> <div v-if="tabs=='location'"> <div class="customMenuLink tw-relative tw-flex tw-justify-start tw-items-center tw-z-10"> <div class="customDropMenu exhibition tw-w-full tw-overflow-hidden"> <div class="tw-relative tw-grid tw-grid-cols-[1fr_1fr_1fr] tw-min-h-[110px]"> <div class="tw-list-none tw-overflow-y-auto tw-h-auto tw-break-inside-avoid tw-flex tw-flex-col tw-pr-[20px]"> <template v-if="exhibitionsLocations && exhibitionsLocations.length>0"> <div v-for="(item,index) in exhibitionsLocations" :key="index" @mouseover="locationActiveIndex=index;cityActiveIndex=0" :class="['exhibitionDropdownLink tw-block tw-w-full tw-body-4 tw-font-normal tw-mb-[20px] tw-pr-[20px] hover:tw-text-primary-default',locationActiveIndex == index ? 'tw-text-primary-default active':'tw-text-neutrals-900']"> {{ $t(item.RegionName) }}</div></template> </div> <div class="tw-overflow-x-hidden tw-overflow-y-auto" v-if="exhibitionsLocations && exhibitionsLocations.length>0"> <ul class="tw-px-[20px] tw-list-none tw-flex tw-flex-col tw-flex-wrap" v-if="exhibitionsLocations[locationActiveIndex].CountryList && exhibitionsLocations[locationActiveIndex].CountryList.length>0"> <li class="tw-list-none tw-mb-[20px]"><a :href="localePath(`/exhibition?region=${exhibitionsLocations[locationActiveIndex].RegionID}`)" class="tw-block tw-body-4 tw-font-normal tw-text-neutral-800 hover:tw-text-primary-default">{{ $t('All')}}</a> </li> <li v-for="(countries,index) in exhibitionsLocations[locationActiveIndex].CountryList" :key="index" @mouseover="cityActiveIndex=index" :class="['exhibitionDropdownLink tw-block tw-w-full tw-body-4 tw-font-normal tw-mb-[20px] tw-pr-[20px] hover:tw-text-primary-default',cityActiveIndex == index ? 'tw-text-primary-default active':'tw-text-neutrals-900']"> {{ countries.CountryName }} </li> </ul> </div> <div class="tw-overflow-x-hidden tw-overflow-y-auto" v-if="exhibitionsLocations && exhibitionsLocations.length>0"> <ul class="tw-px-[20px] tw-list-none tw-flex tw-flex-col tw-flex-wrap" v-if="exhibitionsLocations[locationActiveIndex].CountryList && exhibitionsLocations[locationActiveIndex].CountryList.length>0"> <li class="tw-list-none tw-mb-[20px]"><a :href="localePath(`/exhibition?region=${exhibitionsLocations[locationActiveIndex].CountryList[cityActiveIndex].CountryID}`)" class="tw-block tw-body-4 tw-font-normal tw-text-neutral-800 hover:tw-text-primary-default">{{ $t('All')}}</a> </li> <template v-if="exhibitionsLocations[locationActiveIndex].CountryList[cityActiveIndex].CityList && exhibitionsLocations[locationActiveIndex].CountryList[cityActiveIndex].CityList.length>0"> <li v-for="(cities,index) in exhibitionsLocations[locationActiveIndex].CountryList[cityActiveIndex].CityList" :key="index" class="tw-list-none tw-mb-[20px]"><a :href="localePath(`/exhibition?city=${cities.CityID}`)" class="tw-block tw-body-4 tw-font-normal tw-text-neutral-800 hover:tw-text-primary-default">{{ cities.CityName }}</a> </li></template> </ul> </div> </div> </div> </div> </div> </v-container> <!-- exhibition -->
<!-- service --> <!-- <v-container class="search-result tw-px-[30px] tw-py-[20px] tw-bg-white tw-rounded-[16px] tw-hidden xl:tw-px-[20px] xl:tw-py-[20px] tw-shadow-[0_1px_6px_0_rgba(0,0,0,0.4)] xl:tw-block" v-if="service" v-click-outside=""> <div class=""> <div class="tw-mb-[20px]"> <div class="tw-body-3 tw-font-bold tw-text-black tw-mb-[20px]">{{ $t('History') }} </div> <div class="tw-flex tw-flex-wrap"> <nuxt-link class="tw-mr-[16px] tw-mb-[10px] tw-px-[16px] tw-py-[7px] tw-border-solid tw-border-[1px] tw-rounded-[12px] tw-transition-all tw-duration-300 tw-ease-in-out tw-border-x-secondary-default tw-text-secondary-default hover:tw-border-transparent hover:tw-bg-secondary-default hover:tw-text-white" v-for="(servicesSearch, idx) in servicesSearchs" :key="idx" :to="localePath(`/service?q=${servicesSearch}`)"> {{ servicesSearch }} </nuxt-link> </div> </div> <div> <div class="tw-body-3 tw-font-bold tw-text-black tw-mb-[20px]">{{ $t('Location') }} </div> <div class="tw-flex tw-flex-wrap"> <nuxt-link class="tw-mr-[16px] tw-mb-[10px] tw-px-[16px] tw-py-[7px] tw-border-solid tw-border-[1px] tw-rounded-[12px] tw-transition-all tw-duration-300 tw-ease-in-out tw-border-x-secondary-default tw-text-secondary-default hover:tw-border-transparent hover:tw-bg-secondary-default hover:tw-text-white" v-for="(servicesLocation, idx) in servicesLocations" :key="idx" :to="localePath(`/service?q=${servicesLocation}`)"> {{ servicesLocation }} </nuxt-link> </div> </div> </div> </v-container> --> <!-- service --> </v-card> <loading :isLoading="isPageLoading"></loading> </div> </template>
<script> import loading from "@/components/newComponent/loading/loading.vue"; export default { props: { servicesSearchs: { type: Array, default: () => [] }, servicesLocations: { type: Array, default: () => [] }, exhibitionsSearchs: { type: Array, default: () => [] }, exhibitionsLocations: { type: Array, default: () => [] }, exhibitionsCategories: { type: Array, default: () => [] }, serviceKeywords: { type: Array, default: () => [] }, exhibitionsKeywords: { type: Array, default: () => [] }, populars: { type: Object, default: () => { } }, type: { type: String, default:() => "exhibition" }, }, components: { loading }, data() { return { toggle_exclusive: 1, inputs: "", keywords: [], exhibitionTabTitles: ["Location", "Exhibition Categories"], tabToggle: 0, tab: null, tab2: null, tabs: 'exhibitionsCategories', exhibition: false, service: false, keyword: false, locationsIdx: 0, countriesIdx: 0, categoriesIdx: 0, exhibitionActiveIndex: 0, locationActiveIndex: 0, cityActiveIndex: 0, isPageLoading: false, WindowsWidth: undefined, customPlaceholder: 'Search exhibitions or services...', }; }, created() { if (process.client) { this.WindowsWidth = window.innerWidth; } }, mounted() { this.$nextTick(() => { window.addEventListener("resize", this.onResize); if (this.WindowWidth >= 1366) { this.customPlaceholder = 'Explore global exhibitions'; } else { this.customPlaceholder = 'Search exhibitions or services...'; } }); }, beforeDestroy() { window.removeEventListener("resize", this.onResize); }, computed: { WindowWidth() { if (process.client) { this.WindowsWidth = window.innerWidth; } return this.WindowsWidth; }, }, watch: { WindowsWidth: { handler: function () { if (this.WindowWidth >= 1366) { this.customPlaceholder = 'Explore global exhibitions'; } else { this.customPlaceholder = 'Search exhibitions or services...'; } } } }, methods: { onResize() { if (process.client) { this.WindowsWidth = window.innerWidth; } }, handleClick() { if (this.tabToggle == 0) { this.exhibition = true; // this.service = false;
} // else {
// this.exhibition = false;
// this.service = true;
// }
if (this.inputs.length > 0) { this.keyword = true; this.exhibition = false; // this.service = false;
} if (this.WindowsWidth < 1366) { this.$store.dispatch('toggleSearchDialog', true); } }, async handleInput() { this.keyword = true; this.exhibition = false; this.service = false; this.keywords = [] }, clickOutSide() { this.exhibition = false; this.service = false; this.tabs = 'exhibitionsCategories'; this.exhibitionActiveIndex = 0; this.locationActiveIndex = 0; this.cityActiveIndex = 0;
}, clickExhibition() { let oringalToggle = this.tabToggle; if (this.tabToggle != 0) { this.tabToggle = 0; } // if (this.service == true) {
// this.service = false;
// this.exhibition = true;
// }
if (this.keyword == true) { this.keyword = false; } if (this.inputs.length > 0) { this.exhibition = false; this.service = false; this.keyword = true; } else { if (oringalToggle == 0) { this.exhibition = false; } } this.keywords = this.exhibitionsKeywords; this.$emit('type', 'exhibition'); if (this.WindowWidth >= 1366) { this.customPlaceholder = 'Explore global exhibitions'; } }, clickService() { let oringalToggle = this.tabToggle; if (this.tabToggle != 1) { this.tabToggle = 1; } if (this.exhibition == true) { this.service = true; this.exhibition = false; } if (this.keyword == true) { this.keyword = false; } if (this.inputs.length > 0) { this.exhibition = false; this.service = false; this.keyword = true; } else { if (oringalToggle == 1) { this.service = false; } } this.keywords = this.serviceKeywords; this.$emit('type', 'service'); if (this.WindowWidth >= 1366) { this.customPlaceholder = 'Search exhibition services'; } }, goToSearch() { this.isPageLoading = true; if (this.WindowsWidth >= 1366) { this.$router.push(this.localePath(`/${this.type}?q=${this.inputs}`)); } this.$nextTick(()=>{ this.isPageLoading = false; }); } }, }; </script>
<style lang="scss" scoped> .search-result { position: absolute; left: 0px; top: 70px; width: 100%; z-index: 5; }
.v-tab { margin: 0; }
:deep() { .above { z-index: 99 !important; } }
input[type="search"] { background-image: url('~/assets/svg/icon-search-small.svg'); background-position: right 20px center; background-size: 24px; background-repeat: no-repeat; }
.custom-control:focus { outline: none !important; }
.nuxt-link-active { color: #232323; text-decoration: none; }
.nuxt-link-active:hover { color: primary; text-decoration: underline; text-decoration-style: dashed; }
.nuxt-link-exact-active { color: #232323; text-decoration: none; }
.tabs { .tab { position: relative; padding-bottom: 15px;
&.active { &::after { position: absolute; bottom: 0; left: 0; content: ''; display: block; width: 100%; height: 3px; background-color: #f48800; } } } }
.exhibitionDropdownLink { &.active { background-image: url('@/assets/svg/icon-arrow.svg'); background-position: right center; background-size: 16px; background-repeat: no-repeat; } }
@media screen and (min-width:1366px) { .btn-group { position: relative;
&::before { content: ''; display: inline-block; position: absolute; right: 0; top: 0; bottom: 0; width: 1px; height: 16px; background-color: #f5cda8; margin: auto; } } } </style>
|