Files
ostandari/components/SiteHeader.vue
T
2024-11-19 17:03:46 +03:30

412 lines
15 KiB
Vue

<template>
<div class="site--header">
<div class="col-12">
<!------------------------ countDown modal ------------------------>
<el-dialog
v-if="counterDown"
append-to-body
:visible.sync="showAlert"
:show-close="false"
:title="'مانده تا' + ' ' + counterDown.title"
>
<div>
<flip-countdown :deadline="counterDown1[0]"></flip-countdown>
</div>
<div slot="footer" class="dialog-footer">
<el-button class="btn bigBtn btn-primary" @click="showAlert = false"
>بستن</el-button
>
</div>
</el-dialog>
<!------------------------ countDown modal ------------------------>
<div class="site-top">
<div class="container">
<div class="row">
<div class="col-12 col-md-6 site-top-right">
<span>
<i class="far fa-calendar-alt"></i>
<span class="time-date">{{ jDate }}</span>
</span>
</div>
<div class="col-12 col-md-6 site-top-left">
<el-button
type="text"
@click="showAlert = true"
v-if="counterDown"
>
<span class="timer">{{
jDate2(counterDown.expireDate) +
" مانده تا " +
counterDown.title
}}</span>
</el-button>
<div class="email-top" v-else>
<a
class="email-text"
:href="`mailto: ${yearBanner.email}`"
target="_blank"
>{{ yearBanner.email }}</a
>
<i class="far fa-envelope"></i>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="view-banner">
<img
v-if="yearBanner.iranFlag"
class="iran-flag"
src="~/assets/img/iran.png"
alt=""
/>
<div class="banner">
<img :src="yearBanner.mainCover" alt="" />
</div>
<div class="relativePos">
<div class="container navigations">
<div class="row">
<div class="col-12 col-lg-10 menu-desk">
<nav>
<ul>
<nuxt-link
:to="{ name: 'portal', params: { portal: currentPortal } }"
v-slot="{ navigate, href, isActive }"
custom
exact
>
<li @click="navigate" :class="isActive ? 'active' : null">
<a :href="href">صفحه اصلی</a>
</li>
</nuxt-link>
<!-- ***************** dynamic routes ***************** -->
<nuxt-link
v-for="item in header.categories"
:key="item._id"
:to="{
name: 'portal-category-details',
params: { portal: currentPortal, details: item.title },
query: categoryURLQuery(item),
}"
v-slot="{ navigate, href, isActive }"
custom
>
<li :class="isActive ? 'active' : null">
<a v-if="item.title !== 'شفافیت'" class="pointer">{{ item.title }}</a>
<div class="mega-menu">
<!-- item route -->
<!-- <ul class="tree">-->
<!-- <li class="treeItem">-->
<!-- <a @click="navigate" :href="href">-->
<!-- صفحه-->
<!-- {{ item.title }}-->
<!-- </a>-->
<!-- </li>-->
<!-- </ul>-->
<!-- recursive tree -->
<TreeItem :array="item.childs" />
</div>
</li>
</nuxt-link>
<nuxt-link
to="/ostandari/shafaf"
v-slot="{ navigate, href, isActive }"
custom
>
<li @click="navigate" :class="isActive ? 'active' : null">
<a :href="href">شفافیت</a>
</li>
</nuxt-link>
<!-- ***************** dynamic routes ***************** -->
<nuxt-link
:to="{
name: 'portal-services',
params: { portal: currentPortal },
}"
v-slot="{ navigate, href, isActive }"
custom
>
<li @click="navigate" :class="isActive ? 'active' : null">
<a :href="href">میز خدمت</a>
</li>
</nuxt-link>
<li class="pointer">
<a>چند رسانه ای</a>
<div class="mega-menu">
<ul class="tree">
<li class="treeItem">
<nuxt-link
:to="{
name: 'portal-gallery',
params: { portal: currentPortal },
query: { type: 'image', page: 1 },
}"
>
عکس
</nuxt-link>
</li>
<li class="treeItem">
<nuxt-link
:to="{
name: 'portal-videos',
params: { portal: currentPortal },
query: { type: 'video', page: 1 },
}"
>
فیلم
</nuxt-link>
<!-- <nuxt-link-->
<!-- :to="{-->
<!-- name: 'portal-category-details',-->
<!-- params: {portal: currentPortal,details: homePageData.s3Side[0].catId.title},-->
<!-- query: {id: homePageData.s3Side[0].catId._id,type: 'gallery',galleryType: 'video',page: 1}-->
<!-- }">-->
<!-- فیلم-->
<!-- </nuxt-link>-->
</li>
<li class="treeItem">
<nuxt-link
:to="{
name: 'portal-graphics',
params: { portal: currentPortal },
query: { type: 'graphic', page: 1 },
}"
>
گرافیک
</nuxt-link>
</li>
<li class="treeItem">
<nuxt-link to="/ostandari/digital-books">
کتابخانه دیجیتال
</nuxt-link>
</li>
</ul>
</div>
</li>
<nuxt-link
v-if="yearBanner.electionBtn"
:to="{
name: 'portal',
params: {
portal:
currentPortal === 'ostandari'
? 'election'
: 'ostandari',
},
}"
v-slot="{ navigate, href }"
custom
>
<li @click="navigate">
<a :href="href">{{
currentPortal === "ostandari"
? "ستاد انتخابات"
: "استانداری"
}}</a>
</li>
</nuxt-link>
<nuxt-link
:to="{
name: 'portal-info-page',
params: { portal: currentPortal, page: 'aboutState' },
}"
v-slot="{ navigate, href, isActive }"
custom
v-if="header.staticContents"
>
<li :class="isActive ? 'active' : null">
<a class="pointer">درباره استان</a>
<div class="mega-menu">
<!-- item route -->
<ul class="tree">
<nuxt-link
:to="{
name: 'portal-info-page',
params: { portal: currentPortal, page: 'sima' },
}"
v-slot="{ navigate, href, isActive }"
custom
>
<li
@click="navigate"
:class="isActive ? 'active' : null"
class="treeItem"
>
<a :href="href"> سیمای استان </a>
</li>
</nuxt-link>
</ul>
</div>
</li>
</nuxt-link>
<nuxt-link
:to="{
name: 'portal-contact',
params: { portal: currentPortal },
}"
v-slot="{ navigate, href, isActive }"
custom
>
<li @click="navigate" :class="isActive ? 'active' : null">
<a :href="href">تماس با ما</a>
</li>
</nuxt-link>
</ul>
</nav>
</div>
<div class="col-12 col-lg-2 left">
<ul>
<li class="searchBtns">
<i
class="fal fa-search"
v-if="!searching"
@click="search(true)"
></i>
<i class="fal fa-times" v-else @click="search(false)"></i>
</li>
<li class="menu" @click="showOffCanvas">
<i class="fas fa-bars hamburger-btn"></i>
</li>
</ul>
</div>
</div>
</div>
<div class="searchBox" :class="searching ? 'active-search' : null">
<div class="container">
<div class="row">
<div class="col-12">
<form @submit.prevent="doSearch" class="searchInput">
<input
type="text"
name="search"
id="searchInput"
placeholder="عبارت مدنظر خود را جستجو کنید"
v-model="searchableText"
/>
<button type="submit">
<i class="fas fa-arrow-circle-left"></i>
</button>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import moment from "moment-jalaali";
import FlipCountdown from "~/components/vue2-flip-countdown.js";
export default {
name: "SiteHeader",
data() {
return {
searching: false,
searchableText: "",
date: Date.now(),
dialogTimeVisible: false,
showAlert: false,
};
},
mounted() {
setInterval(() => (this.date = Date.now()), 1000);
$(window).scroll(() => {
if ($(window).scrollTop() > 300) $(".app-front").addClass("miniHeader");
if ($(window).scrollTop() < 290)
$(".app-front").removeClass("miniHeader");
});
if (this.$route.name !== "portal") {
(async () => {
try {
const homeData = await this.$axios.get(
`/api/public/home?portal=${this.$route.params.portal}`,
{ progress: false }
);
this.$store.commit("front/setHomePageData", homeData.data);
} catch (e) {
console.log(e);
}
})();
}
},
components: { FlipCountdown },
computed: {
yearBanner() {
return this.$store.state.front.yearBanner;
},
currentPortal() {
return this.$route.params.portal;
},
header() {
return this.$store.state.front.headerData;
},
jDate() {
return moment(this.date).locale("fa").format("dddd - LL - h:mm:ss ");
},
counterDown() {
return this.$store.state.front.counterDown;
},
counterDown1() {
return this.$store.state.front.counterDown.expireDate.split("T");
},
homePageData() {
return this.$store.state.front.homePageData;
},
},
methods: {
categoryURLQuery(item) {
const query = { type: item.defaultPageType, id: item._id };
if (item.defaultPageType === "news") return { ...query, page: 1 };
if (item.defaultPageType === "gallery-image")
return { ...query, page: 1, type: "gallery", galleryType: "image" };
if (item.defaultPageType === "gallery-video")
return { ...query, page: 1, type: "gallery", galleryType: "video" };
if (item.defaultPageType === "gallery-graphic")
return { ...query, page: 1, type: "gallery", galleryType: "graphic" };
else return query;
},
showOffCanvas() {
this.$store.commit("front/setOffCanvas", true);
},
search(status) {
this.searching = status;
if (status) setTimeout(() => $("#searchInput").focus(), 100);
else this.searchableText = "";
},
doSearch() {
if (this.searchableText.length) {
this.$router.push({
name: "portal-search",
params: { portal: this.currentPortal },
query: { sq: this.searchableText },
});
setTimeout(() => this.search(false), 100);
} else {
this.$message({
type: "warning",
message: "ابتدا عبارت مورد نظر را بنویسید",
});
}
},
jDate2(e) {
return moment(e).locale("fa").fromNow(true);
},
},
};
</script>
<style scoped>
/* li:nth-child(6) {
display: none !important;
} */
</style>