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.
500 lines
18 KiB
500 lines
18 KiB
<template>
|
|
<div class="search">
|
|
<v-card v-click-outside="clickOutSide"
|
|
class="tw-flex tw-px-[16px] tw-py-[11px] tw-rounded-[16px] tw-w-[300px] md:tw-w-[374px] 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"
|
|
:class="tabToggle == 0 ? 'tw-text-white tw-bg-primary-default' : 'tw-text-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="$router.push(localePath(`/${type}?q=${inputs}`));isPageLoading = true" />
|
|
<svg width="24" height="24" class="tw-my-auto 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-h-[270px]">
|
|
<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.title)
|
|
}}</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] ">
|
|
<li class="tw-list-none"><a
|
|
:href="localePath(`/exhibition?category=${exhibitionsCategories[exhibitionActiveIndex].id}`)"
|
|
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].subcategory" :key="index"
|
|
class="tw-list-none"><a :href="localePath(`/exhibition?subcategory=${sub.id}`)"
|
|
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.title }}</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-h-[270px]">
|
|
<div
|
|
class="tw-list-none tw-overflow-y-auto tw-h-auto tw-break-inside-avoid tw-flex tw-flex-col tw-pr-[20px]">
|
|
<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.region)
|
|
}}</div>
|
|
</div>
|
|
<div class="tw-overflow-x-hidden tw-overflow-y-auto">
|
|
<ul class="tw-px-[20px] tw-list-none tw-flex tw-flex-col tw-flex-wrap">
|
|
<li class="tw-list-none tw-mb-[20px]"><a
|
|
:href="localePath(`/exhibition?region=${exhibitionsLocations[locationActiveIndex].id}`)"
|
|
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].countries" :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.country }}
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
<div class="tw-overflow-x-hidden tw-overflow-y-auto">
|
|
<ul class="tw-px-[20px] tw-list-none tw-flex tw-flex-col tw-flex-wrap">
|
|
<li class="tw-list-none tw-mb-[20px]"><a
|
|
:href="localePath(`/exhibition?region=${exhibitionsLocations[locationActiveIndex].countries[cityActiveIndex].id}`)"
|
|
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="(cities,index) in exhibitionsLocations[locationActiveIndex].countries[cityActiveIndex].cities"
|
|
:key="index" class="tw-list-none tw-mb-[20px]"><a
|
|
:href="localePath(`/exhibition?city=${cities.id}`)"
|
|
class="tw-block tw-body-4 tw-font-normal tw-text-neutral-800 hover:tw-text-primary-default">{{
|
|
cities.city }}</a>
|
|
</li>
|
|
</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
|
|
},
|
|
},
|
|
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() {
|
|
if (this.WindowsWidth >= 1366) {
|
|
this.$router.push(this.localePath(`/${this.type}?q=${this.inputs}`));
|
|
this.isPageLoading = true;
|
|
}
|
|
}
|
|
},
|
|
};
|
|
</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>
|