|
|
<template> <div class="search tw-w-full"> <div v-click-outside="clickOutSide" @click="open()" :class="['tw-relative tw-flex tw-rounded-[16px] tw-border-solid tw-border tw-transition-all tw-duration-200 tw-delay-75 tw-ease-in-out',bigSearch ? 'tw-border-primary-default tw-w-full tw-px-[16px] tw-py-[11px]' :'tw-border-neutrals-200 tw-w-[320px] tw-px-[16px] tw-py-[11px]']"> <div v-if="bigSearch" 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" :class="tabToggle == 0 ? 'white--text primary' : 'primary--text'" 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 ? 'white--text primary' : 'primary--text'" style="font-size: 14px" text height="40" @click="clickService">{{ $t('Service')}}</v-btn> --> </div> <input v-show="!bigSearch" class="custom-control flex-grow-1 tw-placeholder-text-[14px] md:tw-placeholder-text-[16px]" :placeholder="$t(customPlaceholder)" />
<input v-show="bigSearch" ref="search" class="custom-control flex-grow-1 tw-placeholder-text-[14px] md:tw-placeholder-text-[16px]" v-model="inputs" :placeholder="$t(customPlaceholder)" @input="handleInput" @click="handleClick" @keyup.enter="goToSearch()" />
<svg width="24" height="24" class="tw-my-auto tw-cursor-pointer" 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="(item, idx) in servicesSearchs" :key="idx" :to="localePath(`/exhibition?q=${item}`)"> {{ item }} </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-flex tw-justify-start tw-items-center tw-z-10" @mouseleave="exhibitionActiveIndex=0"> <div class="customDropMenu exhibition tw-w-full tw-overflow-hidden"> <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-block tw-flex tw-items-center tw-break-words tw-pr-[20px]">{{ $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-x-hidden 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="(item, idx) in servicesSearchs" :key="idx" :to="localePath(`/service?q=${item}`)"> {{ item }} </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 --> </div> </div> </template>
<script>
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: () => { } }, }, data() { return { type: 'exhibition', toggle_exclusive: 1, inputs: "", keywords: [], 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, WindowsWidth: undefined, bigSearch: false, customPlaceholder: 'Search exhibitions or services...', }; }, created() { if (process.client) { this.WindowsWidth = window.innerWidth; } }, methods: { onResize() { if (process.client) { this.WindowsWidth = window.innerWidth; } }, open() { let vm = this; vm.bigSearch = true; vm.$nextTick(() => { vm.$refs.search.focus(); setTimeout(function () { vm.handleClick(); }, 300) } ); }, 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); } }, handleInput() { this.keyword = true; this.exhibition = false; // this.service = false;
this.keywords = []; }, clickOutSide() { this.exhibition = false; // this.service = false;
this.bigSearch = false; this.tabs = 'exhibitionsCategories'; this.exhibitionActiveIndex = 0; this.locationActiveIndex = 0; this.cityActiveIndex = 0; this.tabToggle = 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.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.type = 'service'; if (this.WindowWidth >= 1366) { this.customPlaceholder = 'Search exhibitions or services...'; } }, goToSearch() { this.$emit('loaading', true); this.$router.push(this.localePath(`/${this.type}?q=${this.inputs}`)); this.$nextTick(()=>{ this.$emit('loaading', false); }); }, }, computed: { WindowWidth() { if (process.client) { this.WindowsWidth = window.innerWidth; } return this.WindowsWidth; }, }, 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); }, }; </script>
<style lang="scss" scoped> .search-result { position: absolute; left: 0px; top: 70px; width: 100%; z-index: 10; }
.v-tab { margin: 0; }
:deep() { .above { z-index: 99 !important; } }
.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>
|