Rework frontend

This commit is contained in:
F4ilji
2025-03-23 00:38:16 +05:00
parent 17518ceed2
commit 49072e50c7
438 changed files with 14375 additions and 20015 deletions
@@ -1,33 +1,19 @@
<script>
import {Head, Link} from "@inertiajs/vue3";
import FsLightbox from "fslightbox-vue/v3";
import ClientScrollTimeline from "@/Components/ClientScrollTimeline.vue";
import ClientFooterDown from "@/Components/ClientFooterDown.vue";
import AdminIndexSearch from "@/Components/AdminIndexSearch.vue";
import AdminIndexFilter from "@/Components/AdminIndexFilter.vue";
import AdminIndexHeader from "@/Components/AdminIndexHeader.vue";
import AdminIndexHeaderTitle from "@/Components/AdminIndexHeaderTitle.vue";
import ClientPostFilter from '@/Components/ClientPostFilter.vue';
import ClientPost from '@/Components/ClientPost.vue';
import ClientPostSearch from '@/Components/ClientPostSearch.vue';
import MainPageNavBar from "@/Navbars/MainPageNavbar.vue";
import AppHead from "@/Components/AppHead.vue";
import MetaTags from "@/componentss/shared/SEO/MetaTags.vue";
import BasicFooter from "@/footers/BasicFooter.vue";
export default {
name: "Index",
components: {
AppHead,
BasicFooter,
MetaTags,
MainPageNavBar,
AdminIndexHeaderTitle, AdminIndexHeader,
AdminIndexFilter, AdminIndexSearch,
ClientFooterDown,
ClientScrollTimeline,
ClientPostFilter,
Link,
FsLightbox,
Head,
ClientPost,
ClientPostSearch
},
data() {
return {
@@ -52,10 +38,10 @@ export default {
</script>
<template>
<AppHead :seo="seo" />
<MetaTags :seo="seo" />
<MainPageNavBar class="border-b" :sections="$page.props.navigation"></MainPageNavBar>
<MainPageNavBar class="border-b" :sections="$page.props.navigation" />
<div class="flex flex-col h-screen">
<main class="flex-grow">
<div class="relative mb-auto mx-auto mt-[67px] max-w-screen-xl px-4 py-10 md:flex md:flex-row md:py-10">
@@ -102,7 +88,8 @@ export default {
</div>
</div>
</main>
<ClientFooterDown/>
<BasicFooter/>
</div>
</template>
@@ -1,39 +1,21 @@
<script>
import {Head, Link} from "@inertiajs/vue3";
import FsLightbox from "fslightbox-vue/v3";
import ClientScrollTimeline from "@/Components/ClientScrollTimeline.vue";
import ClientFooterDown from "@/Components/ClientFooterDown.vue";
import AdminIndexSearch from "@/Components/AdminIndexSearch.vue";
import AdminIndexFilter from "@/Components/AdminIndexFilter.vue";
import AdminIndexHeader from "@/Components/AdminIndexHeader.vue";
import AdminIndexHeaderTitle from "@/Components/AdminIndexHeaderTitle.vue";
import ClientPostFilter from '@/Components/ClientPostFilter.vue';
import ClientPost from '@/Components/ClientPost.vue';
import ClientPostSearch from '@/Components/ClientPostSearch.vue';
import ClientImageSlider from "@/Components/ClientImageSlider.vue";
import MainPageNavBar from "@/Navbars/MainPageNavbar.vue";
import AcademicJournalsBuilder from "@/Components/BuilderUi/AcademicJournals/AcademicJournalsBuilder.vue";
import AcademicJournalsTitle from "@/Components/BuilderUi/AcademicJournals/AcademicJournalsTitle.vue";
import AppHead from "@/Components/AppHead.vue";
import Builder from "@/componentss/shared/builder/pageBuilder/Builder.vue";
import BasicFooter from "@/footers/BasicFooter.vue";
import MetaTags from "@/componentss/shared/SEO/MetaTags.vue";
import AcademicJournalsTitle from "@/componentss/features/academicJournals/components/AcademicJournalsTitle.vue";
export default {
name: "Show",
components: {
AppHead,
MetaTags,
BasicFooter,
Builder,
AcademicJournalsTitle,
AcademicJournalsBuilder,
MainPageNavBar,
ClientImageSlider,
AdminIndexHeaderTitle, AdminIndexHeader,
AdminIndexFilter, AdminIndexSearch,
ClientFooterDown,
ClientScrollTimeline,
ClientPostFilter,
Link,
FsLightbox,
Head,
ClientPost,
ClientPostSearch
},
data() {
return {
@@ -71,9 +53,9 @@ export default {
</script>
<template>
<AppHead :seo="seo" />
<MetaTags :seo="seo" />
<MainPageNavBar class="border-b" :sections="$page.props.navigation"></MainPageNavBar>
<MainPageNavBar class="border-b" :sections="$page.props.navigation" />
<div class="flex flex-col h-screen">
<main class="flex-grow">
@@ -108,7 +90,7 @@ export default {
</div>
<div class="container max-w-4xl px-2 xl:px-5 lg:py-4 md:w-4/5 mx-auto">
<div id="horizontal-alignment-1" role="tabpanel" aria-labelledby="horizontal-alignment-item-1">
<AcademicJournalsBuilder :blocks="journal.data.main_info" />
<Builder :blocks="journal.data.main_info" />
</div>
<div id="horizontal-alignment-2" class="hidden w-full" role="tabpanel" aria-labelledby="horizontal-alignment-item-2">
<template v-for="block in journal.data.chief_editor" :key="block.id">
@@ -162,7 +144,7 @@ export default {
</template>
</div>
<div id="horizontal-alignment-3" class="hidden" role="tabpanel" aria-labelledby="horizontal-alignment-item-3">
<AcademicJournalsBuilder :blocks="journal.data.for_authors" />
<Builder :blocks="journal.data.for_authors" />
</div>
<div id="horizontal-alignment-4" class="hidden" role="tabpanel" aria-labelledby="horizontal-alignment-item-4">
<!-- List -->
@@ -212,7 +194,8 @@ export default {
</div>
</div>
</main>
<ClientFooterDown/>
<BasicFooter />
</div>
</template>
@@ -1,47 +1,34 @@
<script>
import {Head, Link} from "@inertiajs/vue3";
import FsLightbox from "fslightbox-vue/v3";
import ClientScrollTimeline from "@/Components/ClientScrollTimeline.vue";
import ClientFooterDown from "@/Components/ClientFooterDown.vue";
import AdminIndexSearch from "@/Components/AdminIndexSearch.vue";
import AdminIndexFilter from "@/Components/AdminIndexFilter.vue";
import AdminIndexHeader from "@/Components/AdminIndexHeader.vue";
import AdminIndexHeaderTitle from "@/Components/AdminIndexHeaderTitle.vue";
import ClientPostFilter from '@/Components/ClientPostFilter.vue';
import ClientPost from '@/Components/ClientPost.vue';
import ClientPostSearch from '@/Components/ClientPostSearch.vue';
import ClientImageSlider from "@/Components/ClientImageSlider.vue";
import {Link} from "@inertiajs/vue3";
import MainPageNavBar from "@/Navbars/MainPageNavbar.vue";
import LevelEduFilter from "@/Components/BuilderUi/AdditionalEducationPrograms/Filters/LevelEduFilter.vue";
import ClientAdditionalProgramFilter
from "@/Components/BuilderUi/AdditionalEducationPrograms/ClientAdditionalProgramFilter.vue";
import PostBadge from "@/Components/BuilderUi/Events/EventBadgeBuilder.vue";
import ProgramBadge from "@/Components/BuilderUi/AdditionalEducationPrograms/ProgramBadge.vue";
import AdditionalEducationProgramListBreadcrumbs
from "@/Components/BuilderUi/AdditionalEducationPrograms/AdditionalEducationProgramListBreadcrumbs.vue";
import AppHead from "@/Components/AppHead.vue";
import MetaTags from "@/componentss/shared/SEO/MetaTags.vue";
import AdditionalProgramTitle
from "@/componentss/features/additionalEducationPrograms/components/AdditionalProgramTitle.vue";
import AdditionalProgramListBreadcrumbs
from "@/componentss/features/additionalEducationPrograms/components/AdditionalProgramListBreadcrumbs.vue";
import BasicFooter from "@/footers/BasicFooter.vue";
import BasicListFilter from "@/componentss/shared/filter/BasicListFilter.vue";
import AdditionalProgramBadge
from "@/componentss/features/additionalEducationPrograms/components/AdditionalProgramBadge.vue";
import LevelEduFilter from "@/componentss/features/additionalEducationPrograms/components/LevelEduFilter.vue";
import CategoryFilter from "@/componentss/shared/filter/filters/CategoryFilter.vue";
import BasicListBadge from "@/componentss/shared/badge/BasicListBadge.vue";
import FormEducationalFilter from "@/componentss/shared/filter/filters/FormEducationalFilter.vue";
export default {
name: "Index",
components: {
AppHead,
AdditionalEducationProgramListBreadcrumbs,
ProgramBadge,
PostBadge,
ClientAdditionalProgramFilter,
BasicListBadge,
AdditionalProgramBadge,
FormEducationalFilter, CategoryFilter,
BasicListFilter,
BasicFooter,
AdditionalProgramListBreadcrumbs,
AdditionalProgramTitle,
MetaTags,
LevelEduFilter,
MainPageNavBar,
ClientImageSlider,
AdminIndexHeaderTitle, AdminIndexHeader,
AdminIndexFilter, AdminIndexSearch,
ClientFooterDown,
ClientScrollTimeline,
ClientPostFilter,
Link,
FsLightbox,
Head,
ClientPost,
ClientPostSearch
},
data() {
return {
@@ -91,17 +78,22 @@ export default {
},
},
computed: {
hasActiveFilters() {
return this.filters.category_filter.value || this.filters.form_education_filter.value
}
},
mounted() {
}
};
</script>
<template>
<AppHead :seo="seo" />
<MetaTags :seo="seo" />
<MainPageNavBar class="border-b" :sections="$page.props.navigation"></MainPageNavBar>
<MainPageNavBar class="border-b" :sections="$page.props.navigation" />
<div class="flex flex-col h-screen">
@@ -110,37 +102,32 @@ export default {
<div class="">
<div class="">
<div class="space-y-5 md:space-y-4">
<h1 class="text-brand-primary text-center mb-3 mt-2 text-3xl font-semibold tracking-tight dark:text-white lg:text-[40px] lg:leading-tight">
Дополнительное образование
</h1>
<div class="space-y-5 md:space-y-4 mx-auto max-w-3xl">
<AdditionalProgramTitle class="text-center" header="Дополнительное образование" />
<div class="space-y-5 md:space-y-4 mx-auto max-w-3xl w-full">
<div>
<div class="">
<div class="my-10 w-full">
<AdditionalEducationProgramListBreadcrumbs :breadcrumbs="breadcrumbs" />
<AdditionalProgramListBreadcrumbs :breadcrumbs="breadcrumbs" />
<div class="flex items-center gap-x-2">
<LevelEduFilter :directions="directionAdditionalEducations" :direction_filter="filters.direction_filter" />
<ClientAdditionalProgramFilter
:forms_educational="forms_education"
:form_education_filter="filters.form_education_filter"
:category_filter="filters.category_filter"
:categories="categories"
/>
<BasicListFilter>
<FormEducationalFilter :forms="forms_education" :formEdu_filter="filters.form_education_filter" />
<CategoryFilter :categories="categories" :category_filter="filters.category_filter" />
</BasicListFilter>
</div>
</div>
<div class="px-2 mx-auto">
<div class="flex-wrap flex gap-3 md:items-center">
<ProgramBadge :filters="filters" />
</div>
</div>
</div>
<div v-if="hasActiveFilters" class="px-1">
<h3 class="text-sm text-gray-500 mb-4">Найдено программ: {{ additionalEducations.data.length }}</h3>
<div class="flex-wrap flex gap-3 md:items-center">
<BasicListBadge :filters="filters" />
</div>
</div> </div>
<div class="container py-5 lg:py-4">
<div class="w-full mx-auto flex flex-wrap lg:justify-between">
<template v-for="educations in transformToColumns(additionalEducations.data)">
<div class="flex flex-col">
<template v-for="education in educations">
<div style="height: max-content" class="px-2">
<div style="height: max-content" class="px-1">
<h1 class="text-brand-primary mb-2 mt-2 text-lg font-semibold upper tracking-tight dark:text-white lg:text-md lg:leading-tight">
{{ education.title }}
</h1>
@@ -160,7 +147,8 @@ export default {
</div>
</div>
</main>
<ClientFooterDown/>
<BasicFooter />
</div>
</template>
@@ -1,42 +1,29 @@
<script>
import {Head, Link} from "@inertiajs/vue3";
import FsLightbox from "fslightbox-vue/v3";
import ClientScrollTimeline from "@/Components/ClientScrollTimeline.vue";
import ClientFooterDown from "@/Components/ClientFooterDown.vue";
import ClientPostFilter from "@/Components/ClientPostFilter.vue";
import ClientPost from "@/Components/ClientPost.vue";
import AdminIndexHeader from "@/Components/AdminIndexHeader.vue";
import ClientPostSearch from "@/Components/ClientPostSearch.vue";
import MainPageNavBar from "@/Navbars/MainPageNavbar.vue";
import FormBuilder from "@/Components/BuilderUi/Pages/FormBuilder.vue";
import FormBlock from "@/Components/BuilderUi/Pages/Blocks/FormBlock.vue";
import ProgramBackButton from "@/Components/BuilderUi/Programs/ProgramBackButton.vue";
import PostTitle from "@/Components/BuilderUi/Posts/PostTitle.vue";
import PostBackButton from "@/Components/BuilderUi/Posts/PostBackButton.vue";
import ProgramTitle from "@/Components/BuilderUi/AdditionalEducationPrograms/ProgramTitle.vue";
import ProgramBuilder from "@/Components/BuilderUi/AdditionalEducationPrograms/ProgramBuilder.vue";
import AdditionalEducationProgramItemBreadcrumbs
from "@/Components/BuilderUi/AdditionalEducationPrograms/AdditionalEducationProgramItemBreadcrumbs.vue";
import AppHead from "@/Components/AppHead.vue";
import MetaTags from "@/componentss/shared/SEO/MetaTags.vue";
import BackButton from "@/componentss/ui/buttons/BackButton.vue";
import Builder from "@/componentss/shared/builder/pageBuilder/Builder.vue";
import BasicFooter from "@/footers/BasicFooter.vue";
import ProgramTitle from "@/componentss/features/educationalPrograms/components/ProgramTitle.vue";
import AdditionalProgramItemBreadcrumbs
from "@/componentss/features/additionalEducationPrograms/components/AdditionalProgramItemBreadcrumbs.vue";
export default {
name: "Show",
components: {
AppHead,
AdditionalEducationProgramItemBreadcrumbs,
ProgramBuilder,
AdditionalProgramItemBreadcrumbs,
BasicFooter,
Builder,
BackButton,
MetaTags,
ProgramTitle,
PostBackButton, PostTitle,
ProgramBackButton,
FormBlock,
FormBuilder,
MainPageNavBar,
ClientPostSearch,
AdminIndexHeader,
ClientPost,
ClientPostFilter,
ClientFooterDown, ClientScrollTimeline, Link, Head},
Link, Head
},
data() {
return {
@@ -70,14 +57,14 @@ export default {
</script>
<template>
<AppHead :seo="seo" />
<MetaTags :seo="seo" />
<MainPageNavBar class="border-b" :sections="$page.props.navigation"></MainPageNavBar>
<div class="flex flex-col h-screen">
<main class="flex-grow">
<div class="relative mb-auto mx-auto mt-[67px] max-w-screen-xl px-4 py-10 md:flex md:flex-row md:py-10">
<div class="px-0 pt-6 lg:pt-10 pb-12 sm:px-6 lg:px-8 mx-auto">
<div class="px-0 pt-6 lg:pt-10 pb-12 sm:px-6 lg:px-8 mx-auto w-full max-w-screen-md">
<div>
<div class="space-y-5 md:space-y-4">
@@ -87,8 +74,8 @@ export default {
<div class="container mx-auto xl:px-5 max-w-screen-lg py-5 lg:py-8">
<div class="space-y-10">
<div class="space-y-3">
<PostBackButton link="client.additionalEducation.index" title="Все программы"/>
<AdditionalEducationProgramItemBreadcrumbs :breadcrumbs="breadcrumbs" :additional-education-title="additionalEducation.data.title" />
<BackButton link="client.additionalEducation.index" title="Все программы"/>
<AdditionalProgramItemBreadcrumbs :breadcrumbs="breadcrumbs" :additional-education-title="additionalEducation.data.title" />
</div>
<ProgramTitle :header="additionalEducation.data.title" class="text-center" />
</div>
@@ -187,7 +174,7 @@ export default {
<div v-if="additionalEducation.data.content.length > 0">
<h2 class="text-xl font-bold md:text-2xl">О программе</h2>
<div class="py-4 px-5">
<ProgramBuilder :blocks="additionalEducation.data.content" />
<Builder :blocks="additionalEducation.data.content" />
</div>
</div>
<!-- End Icon Blocks -->
@@ -201,21 +188,14 @@ export default {
</div>
</div>
</main>
<ClientFooterDown/>
<BasicFooter />
</div>
</template>
<style>
.paragraph-container a {
@apply text-[#1E57A3];
@apply underline;
}
.paragraph-container p {
@apply mb-6
}
</style>
@@ -1,154 +0,0 @@
<template>
<AppHead :seo="seo" />
<div class="flex flex-col h-screen justify-between">
<MainPageNavBar class="border-b" :sections="$page.props.navigation"></MainPageNavBar>
<div class="relative mx-auto mb-auto mt-[67px] max-w-screen-xl w-full px-4 py-10 md:flex md:flex-row md:py-10">
<PageSubSectionLinks :sub-section-pages="subSectionPages" :current-section="page.data.section"/>
<PageNavigateLinks :header-navs="headerNavs"/>
<div class="w-full min-w-0 mt-1 max-w-6xl px-1 md:px-6" style="">
<div class="space-y-5 md:space-y-5">
<PageBreadcrumbs :breadcrumbs="breadcrumbs" :page-title="page.data.title"/>
<PageTitle :header="page.data.title"/>
<div id="page-area">
<PageBuilder :blocks="page.data.content"/>
</div>
</div>
</div>
</div>
<ClientFooterDown/>
</div>
</template>
<script>
import {Link} from "@inertiajs/vue3";
import FsLightbox from "fslightbox-vue/v3";
import ClientFooterDown from "@/Components/ClientFooterDown.vue";
import {Head} from '@inertiajs/vue3'
import PageBuilder from "@/Components/BuilderUi/Pages/PageBuilder.vue";
import PageBreadcrumbs from "@/Components/BuilderUi/Pages/PageBreadcrumbs.vue";
import PageTitle from "@/Components/BuilderUi/Pages/PageTitle.vue";
import PageNavigateLinks from "@/Components/BuilderUi/Pages/PageNavigateLinks.vue";
import PageSubSectionLinks from "@/Components/BuilderUi/Pages/PageSubSectionLinks.vue";
import MainPageNavBar from "@/Navbars/MainPageNavbar.vue";
import AppHead from "@/Components/AppHead.vue";
export default {
name: "Page",
data() {
return {
headerNavs: this.page.data.content.filter(block => block.type === 'heading').map(block => ({
id: block.data.id,
text: block.data.content
}))
}
},
props: {
navigation: {
type: Object,
},
page: {
type: Object,
},
subSectionPages: {
type: Object,
},
breadcrumbs: {
type: Object,
},
seo: {
type: Object,
}
},
components: {
AppHead,
MainPageNavBar,
PageSubSectionLinks,
PageNavigateLinks,
PageTitle,
PageBreadcrumbs,
PageBuilder,
ClientFooterDown,
Link,
FsLightbox,
Head
},
methods: {},
computed: {}
}
</script>
<style>
@keyframes fade {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
.fade-enter-active,
.fade-leave-active {
transition: all 0.3s ease;
}
.fade-enter-from,
.fade-leave-to {
opacity: 0;
}
@keyframes grow-progress {
from {
transform: scaleX(0);
}
to {
transform: scaleX(1);
}
}
#progress {
height: 2px;
background: #26ACB8;
z-index: 10000;
transform-origin: 0 50%;
animation: grow-progress auto linear;
animation-timeline: scroll();
}
.example-initial-animation {
animation: initial-animation 2s ease;
}
@keyframes initial-animation {
0% {
transform: rotate(0deg);
}
50% {
transform: rotate(360deg);
}
100% {
transform: rotate(0deg);
}
}
</style>
@@ -1,155 +0,0 @@
<template>
<Head>
<title>{{ page.data.title }}</title>
<meta name="description" content="Your page description">
</Head>
<div class="flex flex-col h-screen">
<MainPageNavBar class="border-b" :sections="$page.props.navigation"></MainPageNavBar>
<main class="flex-grow">
<div class="relative mb-auto mx-auto mt-[67px] max-w-screen-xl px-4 py-10 md:flex md:flex-row md:py-10">
<PageNavigateLinks :header-navs="this.headerNavs"/>
<article class="w-full min-w-0 mt-1 max-w-6xl px-1 md:px-6" style="">
<div class="space-y-5 md:space-y-5">
<PageBreadcrumbs :breadcrumbs="breadcrumbs" :page-title="page.data.title"/>
<PageTitle :header="page.data.title"/>
<div id="page-area" class="space-y-4">
<PageBuilder :blocks="this.page.data.content"/>
</div>
</div>
</article>
</div>
</main>
<ClientFooterDown/>
</div>
</template>
<script>
import {Link} from "@inertiajs/vue3";
import FsLightbox from "fslightbox-vue/v3";
import ClientFooterDown from "@/Components/ClientFooterDown.vue";
import {Head} from '@inertiajs/vue3'
import PageBuilder from "@/Components/BuilderUi/Pages/PageBuilder.vue";
import PageBreadcrumbs from "@/Components/BuilderUi/Pages/PageBreadcrumbs.vue";
import PageTitle from "@/Components/BuilderUi/Pages/PageTitle.vue";
import PageNavigateLinks from "@/Components/BuilderUi/Pages/PageNavigateLinks.vue";
import PageSubSectionLinks from "@/Components/BuilderUi/Pages/PageSubSectionLinks.vue";
import MainPageNavBar from "@/Navbars/MainPageNavbar.vue";
export default {
name: "Page",
data() {
return {
headerNavs: this.page.data.content.filter(block => block.type === 'heading').map(block => ({
id: block.data.id,
text: block.data.content
}))
}
},
props: {
navigation: {
type: Object,
},
page: {
type: Object,
},
subSectionPages: {
type: Object,
},
breadcrumbs: {
type: Object,
},
},
components: {
MainPageNavBar,
PageSubSectionLinks,
PageNavigateLinks,
PageTitle,
PageBreadcrumbs,
PageBuilder,
ClientFooterDown,
Link,
FsLightbox,
Head
},
methods: {},
computed: {}
}
</script>
<style>
@keyframes fade {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
.fade-enter-active,
.fade-leave-active {
transition: all 0.3s ease;
}
.fade-enter-from,
.fade-leave-to {
opacity: 0;
}
@keyframes grow-progress {
from {
transform: scaleX(0);
}
to {
transform: scaleX(1);
}
}
#progress {
height: 2px;
background: #26ACB8;
z-index: 10000;
transform-origin: 0 50%;
animation: grow-progress auto linear;
animation-timeline: scroll();
}
.example-initial-animation {
animation: initial-animation 2s ease;
}
@keyframes initial-animation {
0% {
transform: rotate(0deg);
}
50% {
transform: rotate(360deg);
}
100% {
transform: rotate(0deg);
}
}
</style>
+23 -44
View File
@@ -1,11 +1,9 @@
<template>
<AppHead :seo="seo" />
<MetaTags :seo="seo" />
<MainPageNavBar class="border-b" :sections="$page.props.navigation" />
<div class="flex flex-col h-screen justify-between">
<div class="relative mb-auto mx-auto mt-[67px] max-w-screen-xl px-4 py-10 md:flex md:flex-row md:py-10">
@@ -18,7 +16,7 @@
<div class="flex gap-x-1">
<ul class="px-0.5 last-of-type:mb-0 mb-8">
<li v-for="depart in departments.data" :key="department.id" class="my-1.5 flex">
<a :class="{'text-white hover:text-gray-200 font-semibold bg-[#135aae]': isSameRoute(route('client.department.show', { facultySlug: department.data.faculty.slug, departmentSlug: depart.slug })), 'text-gray-600 hover:text-[#2C6288]': !isSameRoute(route('client.department.show', { facultySlug: department.data.faculty.slug, departmentSlug: depart.slug })) }"
<a :class="{'text-white hover:text-gray-200 font-semibold bg-[#135aae]': this.IS_SAME_ROUTE(route('client.department.show', { facultySlug: department.data.faculty.slug, departmentSlug: depart.slug })), 'text-gray-600 hover:text-[#2C6288]': !this.IS_SAME_ROUTE(route('client.department.show', { facultySlug: department.data.faculty.slug, departmentSlug: depart.slug })) }"
:href="route('client.department.show', { facultySlug: department.data.faculty.slug, departmentSlug: depart.slug }) + '/'"
class="relative duration-300 flex w-full rounded-md cursor-pointer items-center px-2 py-1 text-left text-sm">{{
depart.title
@@ -84,19 +82,17 @@
</div>
</div>
<div class="space-y-3">
<h1 class="text-2xl mb-10 font-bold md:text-3xl">{{ department.data.title }}</h1>
</div>
<BasicTitle :header="department.data.title" />
<div id="page-area" class="space-y-5 md:space-y-5">
<h2 id="workers" class="font-bold text-xl">Сотрудники кафедры</h2>
<template v-for="worker in department.data.workers">
<ClientDepartmentWorkerCard :worker="worker" />
<DepartmentWorkerCard :worker="worker" />
</template>
<h2 id="teachers" class="font-bold text-xl">Преподаватели кафедры</h2>
<template v-for="teacher in department.data.teachers">
<ClientDepartmentTeacherCard :teacher="teacher" />
<DepartmentTeacherCard :teacher="teacher" />
</template>
<h2 id="external-teachers" class="font-bold text-xl">Внешние совместители</h2>
@@ -127,51 +123,42 @@
<div class="space-y-3 md:space-y-4">
<DepartmentBuilder :blocks="department.data.content "/>
<Builder :blocks="department.data.content "/>
</div>
</div>
</div>
</article>
</div>
<ClientFooterDown/>
<BasicFooter />
</div>
</template>
<script>
import {Link} from "@inertiajs/vue3";
import FsLightbox from "fslightbox-vue/v3";
import ClientFooterDown from "@/Components/ClientFooterDown.vue";
import { Head } from '@inertiajs/vue3'
import slugify from "slugify";
import PageNavigateLinks from "@/Components/BuilderUi/Pages/PageNavigateLinks.vue";
import PageBreadcrumbs from "@/Components/BuilderUi/Pages/PageBreadcrumbs.vue";
import PageBuilder from "@/Components/BuilderUi/Pages/PageBuilder.vue";
import PageTitle from "@/Components/BuilderUi/Pages/PageTitle.vue";
import ClientDepartmentWorkerCard from "@/Components/PersonCards/ClientDepartmentWorkerCard.vue";
import ClientDepartmentTeacherCard from "@/Components/PersonCards/ClientDepartmentTeacherCard.vue";
import FacultyBuilder from "@/Components/BuilderUi/Faculties/FacultyBuilder.vue";
import DepartmentBuilder from "@/Components/BuilderUi/Departments/DepartmentBuilder.vue";
import DepartmentBackButton from "@/Components/BuilderUi/Departments/DepartmentBackButton.vue";
import MainPageNavBar from "@/Navbars/MainPageNavbar.vue";
import DepartmentItemBreadcrumbs from "@/Components/BuilderUi/Departments/DepartmentItemBreadcrumbs.vue";
import AppHead from "@/Components/AppHead.vue";
import MetaTags from "@/componentss/shared/SEO/MetaTags.vue";
import DepartmentItemBreadcrumbs from "@/componentss/features/departments/components/DepartmentItemBreadcrumbs.vue";
import BasicTitle from "@/componentss/ui/titles/BasicTitle.vue";
import Builder from "@/componentss/shared/builder/pageBuilder/Builder.vue";
import DepartmentWorkerCard from "@/componentss/features/departments/components/DepartmentWorkerCard.vue";
import DepartmentTeacherCard from "@/componentss/features/departments/components/DepartmentTeacherCard.vue";
import BasicFooter from "@/footers/BasicFooter.vue";
import {helpers} from "@/mixins/Helpers.js";
export default {
name: "Page",
mixins: [helpers],
name: "Page",
data() {
return {
scrollTop: false,
@@ -195,19 +182,15 @@ export default {
},
components: {
AppHead,
BasicFooter,
DepartmentTeacherCard,
DepartmentWorkerCard,
Builder,
BasicTitle,
MetaTags,
DepartmentItemBreadcrumbs,
MainPageNavBar,
DepartmentBackButton,
DepartmentBuilder,
FacultyBuilder,
ClientDepartmentTeacherCard,
ClientDepartmentWorkerCard,
PageTitle, PageBuilder, PageBreadcrumbs, PageNavigateLinks,
ClientFooterDown,
Link,
FsLightbox,
Head
},
methods: {
textLimit(text, symbols) {
@@ -218,10 +201,6 @@ export default {
}
return text
},
openEditorImagesOnSlide: function (number) {
this.slide = number;
this.toggler = !this.toggler;
},
isSameRoute(route) {
if (this.$page.props.ziggy.location === route) {
return true
+13 -28
View File
@@ -1,36 +1,21 @@
<script>
import MainNavbar from "@/Navbars/MainNavbar.vue";
import {Head, Link} from "@inertiajs/vue3";
import FsLightbox from "fslightbox-vue/v3";
import ClientScrollTimeline from "@/Components/ClientScrollTimeline.vue";
import ClientFooterDown from "@/Components/ClientFooterDown.vue";
import AdminIndexSearch from "@/Components/AdminIndexSearch.vue";
import AdminIndexFilter from "@/Components/AdminIndexFilter.vue";
import AdminIndexHeader from "@/Components/AdminIndexHeader.vue";
import AdminIndexHeaderTitle from "@/Components/AdminIndexHeaderTitle.vue";
import ClientPostFilter from '@/Components/ClientPostFilter.vue';
import ClientPost from '@/Components/ClientPost.vue';
import ClientPostSearch from '@/Components/ClientPostSearch.vue';
import MainPageNavBar from "@/Navbars/MainPageNavbar.vue";
import DivisionListBreadcrumbs from "@/Components/BuilderUi/Divisions/DivisionListBreadcrumbs.vue";
import AppHead from "@/Components/AppHead.vue";
import MetaTags from "@/componentss/shared/SEO/MetaTags.vue";
import DivisionListTitle from "@/componentss/features/divisions/components/DivisionListTitle.vue";
import DivisionListBreadcrumbs from "@/componentss/features/divisions/components/DivisionListBreadcrumbs.vue";
import BasicFooter from "@/footers/BasicFooter.vue";
export default {
name: "Index",
components: {
AppHead,
BasicFooter,
DivisionListTitle,
MetaTags,
DivisionListBreadcrumbs,
MainPageNavBar,
AdminIndexHeaderTitle, AdminIndexHeader,
AdminIndexFilter, AdminIndexSearch,
ClientFooterDown,
ClientScrollTimeline,
ClientPostFilter,
Link,
FsLightbox,
Head,
ClientPost,
ClientPostSearch
},
data() {
return {
@@ -55,7 +40,7 @@ export default {
</script>
<template>
<AppHead :seo="seo" />
<MetaTags :seo="seo" />
<MainPageNavBar class="border-b" :sections="$page.props.navigation"></MainPageNavBar>
@@ -72,11 +57,10 @@ export default {
<!-- Card Section -->
<div class="max-w-[85rem] px-4 py-10 sm:px-6 lg:px-8 lg:py-14 mx-auto">
<div class="max-w-2xl text-center mx-auto mb-10 lg:mb-14">
<DivisionListTitle
bottom-text="Список структурных и административных отделов НТГСПИ"
header="Подразделения института" />
<h2 class="text-2xl font-bold md:text-4xl md:leading-tight dark:text-white">Подразделения института</h2>
<p class="mt-1 text-gray-600 dark:text-neutral-400">Список структурных и административных отделов НТГСПИ</p>
</div>
<DivisionListBreadcrumbs />
<!-- Grid -->
@@ -109,7 +93,8 @@ export default {
</div>
</div>
</main>
<ClientFooterDown/>
<BasicFooter/>
</div>
</template>
+46 -56
View File
@@ -1,5 +1,5 @@
<template>
<AppHead :seo="seo" />
<MetaTags :seo="seo" />
<div class="flex flex-col h-screen">
<MainPageNavBar class="border-b" :sections="$page.props.navigation"></MainPageNavBar>
@@ -74,17 +74,14 @@
<h2 v-if="division.data.workers.length > 0" id="persons" class="font-bold text-xl">Состав</h2>
<template v-for="worker in division.data.workers">
<ClientDivisionWorkerCard :worker="worker" />
<DivisionWorkerCard :worker="worker" />
</template>
<h2 v-if="division.data.description.length > 0" id="description" class="font-bold text-xl">Описание</h2>
<DivisionBuilder :blocks="division.data.description" />
<Builder :blocks="division.data.description" />
</div>
@@ -93,7 +90,8 @@
</main>
</div>
</main>
<ClientFooterDown/>
<BasicFooter/>
</div>
@@ -104,17 +102,14 @@
import {Link} from "@inertiajs/vue3";
import FsLightbox from "fslightbox-vue/v3";
import MainNavbar from "@/Navbars/MainNavbar.vue";
import ClientFooterDown from "@/Components/ClientFooterDown.vue";
import { Head } from '@inertiajs/vue3'
import slugify from "slugify";
import axios from "axios";
import MainPageNavBar from "@/Navbars/MainPageNavbar.vue";
import DivisionBuilder from "@/Components/BuilderUi/Divisions/DivisionBuilder.vue";
import DivisionItemBreadcrumbs from "@/Components/BuilderUi/Divisions/DivisionItemBreadcrumbs.vue";
import AppHead from "@/Components/AppHead.vue";
import ClientDivisionWorkerCard from "@/Components/PersonCards/ClientDivisionWorkerCard.vue";
import MetaTags from "@/componentss/shared/SEO/MetaTags.vue";
import Builder from "@/componentss/shared/builder/pageBuilder/Builder.vue";
import DivisionWorkerCard from "@/componentss/features/divisions/components/DivisionWorkerCard.vue";
import BasicFooter from "@/footers/BasicFooter.vue";
import DivisionItemBreadcrumbs from "@/componentss/features/divisions/components/DivisionItemBreadcrumbs.vue";
export default {
@@ -139,14 +134,13 @@ export default {
},
components: {
ClientDivisionWorkerCard,
AppHead,
BasicFooter,
DivisionWorkerCard,
Builder,
MetaTags,
DivisionItemBreadcrumbs,
DivisionBuilder,
MainPageNavBar,
ClientFooterDown,
Link,
FsLightbox,
Head
},
methods: {
@@ -158,10 +152,6 @@ export default {
}
return text
},
openEditorImagesOnSlide: function (number) {
this.slide = number;
this.toggler = !this.toggler;
},
isSameRoute(route) {
if (this.$page.props.ziggy.location === route) {
return true
@@ -185,46 +175,46 @@ export default {
scrollToTop() {
window.scrollTo(0, 0)
},
handleScroll() {
const headings = document.querySelectorAll('h2');
const visor = document.querySelector('#visor');
let lastVisibleHeading = null;
const visorRect = visor.getBoundingClientRect();
// Проверяем, находится ли визор в пределах видимости
if (visorRect.top > window.scrollY) {
this.currentNavSection = null;
lastVisibleHeading = null; // Сбрасываем заголовок, если визор не виден
return; // Выходим из функции, если визор не виден
}
for (let i = 0; i < headings.length; i++) {
const heading = headings[i];
const rect = heading.getBoundingClientRect();
// Проверяем, находится ли заголовок в видимой области и касается ли он элемента visor
if (rect.top >= 0 && rect.bottom <= window.innerHeight && rect.bottom >= visorRect.top && rect.top <= visorRect.bottom) {
// Проверяем, изменился ли заголовок
if (heading !== lastVisibleHeading) {
this.currentNavSection = heading.id;
lastVisibleHeading = heading;
}
break; // Выходим из цикла, если нашли видимый заголовок
}
}
}
},
mounted() {
window.addEventListener("scroll", this.onScroll)
window.addEventListener("scroll", () => {
const headings = document.querySelectorAll('h2');
const visor = document.querySelector('#visor');
let lastVisibleHeading = null;
const visorRect = visor.getBoundingClientRect();
// Проверяем, находится ли визор в пределах видимости
if (visorRect.top > window.scrollY) {
this.currentNavSection = null;
lastVisibleHeading = null; // Сбрасываем заголовок, если визор не виден
return; // Выходим из функции, если визор не виден
}
for (let i = 0; i < headings.length; i++) {
const heading = headings[i];
const rect = heading.getBoundingClientRect();
// Проверяем, находится ли заголовок в видимой области и касается ли он элемента visor
if (rect.top >= 0 && rect.bottom <= window.innerHeight && rect.bottom >= visorRect.top && rect.top <= visorRect.bottom) {
// Проверяем, изменился ли заголовок
if (heading !== lastVisibleHeading) {
this.currentNavSection = heading.id;
lastVisibleHeading = heading;
}
break; // Выходим из цикла, если нашли видимый заголовок
}
}
});
window.addEventListener("scroll", this.handleScroll);
window.addEventListener("scroll", this.onScroll)
},
beforeDestroy() {
window.removeEventListener('scroll', this.handleScroll);
window.removeEventListener("scroll", this.handleScroll);
window.removeEventListener("scroll", this.onScroll)
},
@@ -0,0 +1,141 @@
<script>
import {Head, Link} from "@inertiajs/vue3";
import MainPageNavBar from "@/Navbars/MainPageNavbar.vue";
import MetaTags from "@/componentss/shared/SEO/MetaTags.vue";
import BasicFooter from "@/footers/BasicFooter.vue";
import EventListSelectDate from "@/componentss/features/events/components/EventListSelectDate.vue";
import EventListFilter from "@/componentss/features/events/components/EventListFilter.vue";
import EventListBreadcrumbs from "@/componentss/features/events/components/EventListBreadcrumbs.vue";
import BasicListFilter from "@/componentss/shared/filter/BasicListFilter.vue";
import CategoryFilter from "@/componentss/shared/filter/filters/CategoryFilter.vue";
import IsOnlineFilter from "@/componentss/shared/filter/filters/IsOnlineFilter.vue";
import BasicListBadge from "@/componentss/shared/badge/BasicListBadge.vue";
import EventArchiveListBreadcrumbs from "@/componentss/features/events/components/EventArchiveListBreadcrumbs.vue";
import EventListSearch from "@/componentss/features/events/components/EventListSearch.vue";
import SortingByFilter from "@/componentss/shared/filter/filters/SortingByFilter.vue";
import BasicPagination from "@/componentss/shared/paginate/BasicPagination.vue";
export default {
name: "Archive",
components: {
BasicPagination,
SortingByFilter,
EventListSearch,
EventArchiveListBreadcrumbs,
BasicListBadge,
CategoryFilter,
IsOnlineFilter,
BasicListFilter,
BasicFooter,
EventListSelectDate,
EventListFilter,
EventListBreadcrumbs,
MetaTags,
MainPageNavBar,
Link,
Head,
},
props: {
events: {
type: Object,
},
currentDate: {
type: String,
},
eventDates: {
type: Array,
},
navigation: {
type: Object,
},
filters: {
type: Array,
},
categories: {
type: Array,
},
breadcrumbs: {
type: Object
},
seo: {
type: Object,
}
},
computed: {
hasActiveFilters() {
const filters = Object.values(this.filters);
return filters.some(filter => filter.value !== null && filter.value !== '');
}
},
};
</script>
<template>
<MetaTags :seo="seo" />
<MainPageNavBar class="border-b" :sections="$page.props.navigation"></MainPageNavBar>
<div class="flex flex-col h-screen">
<main class="flex-grow">
<div class="relative mx-auto mt-[67px] max-w-screen-xl px-4 py-10 md:flex md:flex-row md:py-10">
<div class="pt-6 lg:pt-10 pb-12 sm:px-6 lg:px-8 mx-auto w-full max-w-screen-md"> <!-- Добавлен w-full -->
<div>
<EventArchiveListBreadcrumbs :breadcrumbs="breadcrumbs" />
<div class="space-y-5 md:space-y-4">
<div class="flex items-center w-full justify-center">
<h1 class="block text-brand-primary text-center mb-3 mt-2 mr-4 text-3xl font-semibold tracking-tight lg:text-[35px] lg:leading-tight">
Архив мероприятий НТГСПИ
</h1>
<BasicListFilter>
<SortingByFilter :sortingBy_filter="filters.sortingBy_filter" />
<IsOnlineFilter :is_online_filter="filters.is_online_filter" />
<CategoryFilter :categories="categories" :category_filter="filters.category_filter" />
</BasicListFilter>
</div>
<div class="space-y-5 md:space-y-4">
<EventListSearch :search_filter="filters.search_filter" />
</div>
<div>
<h3 class="text-sm text-gray-500 mb-4">Найдено мероприятий: {{ events.meta.total }}</h3>
<div v-if="hasActiveFilters" class="flex-wrap flex gap-3 md:items-center">
<BasicListBadge :filters="filters" />
</div>
</div>
</div>
<div class="grid gap-y-10 mt-5 w-full"> <!-- Добавлен w-full -->
<template v-for="event in events.data">
<Link class="group sm:flex rounded-xl w-full" :href="route('client.event.show', event.slug)"> <!-- Добавлен w-full -->
<div class="grow">
<div class="flex flex-col h-full">
<div class="mb-3">
<p class="inline-flex mr-2 items-center gap-1.5 py-1.5 rounded-md text-[12px] text-gray-600">
{{ event.event_date_start }}
</p>
<p v-if="event.category" class="inline-flex items-center gap-1.5 py-1.5 px-3 rounded-md text-xs font-medium bg-[#E9F2FE] text-blue-600">
{{ event.category }}
</p>
</div>
<h3 class="text-lg sm:text-2xl font-semibold text-gray-800 group-hover:text-blue-600">
{{ event.title }}
</h3>
<p class="mt-2 text-gray-600">
Great news we're eager to share.
</p>
</div>
</div>
</Link>
</template>
</div>
<BasicPagination :links="events.links" />
</div>
</div>
</div>
</main>
<BasicFooter />
</div>
</template>
<style scoped>
</style>
+39 -35
View File
@@ -1,41 +1,32 @@
<script>
import MainNavbar from "@/Navbars/MainNavbar.vue";
import {Head, Link} from "@inertiajs/vue3";
import FsLightbox from "fslightbox-vue/v3";
import ClientScrollTimeline from "@/Components/ClientScrollTimeline.vue";
import ClientFooterDown from "@/Components/ClientFooterDown.vue";
import AdminIndexSearch from "@/Components/AdminIndexSearch.vue";
import AdminIndexFilter from "@/Components/AdminIndexFilter.vue";
import AdminIndexHeader from "@/Components/AdminIndexHeader.vue";
import AdminIndexHeaderTitle from "@/Components/AdminIndexHeaderTitle.vue";
import ClientPostFilter from '@/Components/ClientPostFilter.vue';
import ClientPost from '@/Components/ClientPost.vue';
import ClientPostSearch from '@/Components/ClientPostSearch.vue';
import ClientEventSelectDate from "@/Components/ClientEventSelectDate.vue";
import ClientEventFilter from "@/Components/ClientEventFilter.vue";
import MainPageNavBar from "@/Navbars/MainPageNavbar.vue";
import EventListBreadcrumbs from "@/Components/BuilderUi/Events/EventListBreadcrumbs.vue";
import AppHead from "@/Components/AppHead.vue";
import MetaTags from "@/componentss/shared/SEO/MetaTags.vue";
import BasicFooter from "@/footers/BasicFooter.vue";
import EventListSelectDate from "@/componentss/features/events/components/EventListSelectDate.vue";
import EventListFilter from "@/componentss/features/events/components/EventListFilter.vue";
import EventListBreadcrumbs from "@/componentss/features/events/components/EventListBreadcrumbs.vue";
import BasicListFilter from "@/componentss/shared/filter/BasicListFilter.vue";
import CategoryFilter from "@/componentss/shared/filter/filters/CategoryFilter.vue";
import IsOnlineFilter from "@/componentss/shared/filter/filters/IsOnlineFilter.vue";
import BasicListBadge from "@/componentss/shared/badge/BasicListBadge.vue";
export default {
name: "Index",
components: {
AppHead,
EventListBreadcrumbs,
BasicListBadge,
CategoryFilter,
IsOnlineFilter,
BasicListFilter,
BasicFooter,
EventListSelectDate,
EventListFilter,
EventListBreadcrumbs,
MetaTags,
MainPageNavBar,
ClientEventFilter,
ClientEventSelectDate,
AdminIndexHeaderTitle, AdminIndexHeader,
AdminIndexFilter, AdminIndexSearch,
ClientFooterDown,
ClientScrollTimeline,
ClientPostFilter,
Link,
MainNavbar,
FsLightbox,
Head,
ClientPost,
ClientPostSearch
},
props: {
events: {
@@ -63,18 +54,22 @@ export default {
type: Object,
}
},
methods: {},
computed: {
hasActiveFilters() {
return this.filters.category_filter.value || this.filters.is_online_filter.value
}
},
};
</script>
<template>
<AppHead :seo="seo" />
<MetaTags :seo="seo" />
<MainPageNavBar class="border-b" :sections="$page.props.navigation"></MainPageNavBar>
<div class="flex flex-col h-screen">
<main class="flex-grow">
<div class="relative mx-auto mt-[67px] max-w-screen-xl px-4 py-10 md:flex md:flex-row md:py-10">
<div class="pt-6 lg:pt-10 pb-12 sm:px-6 lg:px-8 mx-auto">
<div class="pt-6 lg:pt-10 pb-12 sm:px-6 lg:px-8 mx-auto w-full max-w-screen-md">
<div>
<EventListBreadcrumbs :breadcrumbs="breadcrumbs" />
<div class="space-y-5 md:space-y-4">
@@ -82,7 +77,10 @@ export default {
<h1 class="block text-brand-primary text-center mb-3 mt-2 mr-4 text-3xl font-semibold tracking-tight dark:text-white lg:text-[40px] lg:leading-tight">
Мероприятия НТГСПИ
</h1>
<ClientEventFilter :is_online_filter="filters.is_online_filter" :categories="categories" :category_filter="filters.category_filter" :sorting-by_filter="filters.sortingBy_filter" />
<BasicListFilter>
<IsOnlineFilter :is_online_filter="filters.is_online_filter" />
<CategoryFilter :categories="categories" :category_filter="filters.category_filter" />
</BasicListFilter>
</div>
@@ -96,10 +94,16 @@ export default {
</div>
<div class="space-y-5 md:space-y-4">
<div>
<ClientEventSelectDate :current-date="currentDate.fullDate" :dates="eventDates"/>
<EventListSelectDate :current-date="currentDate.fullDate" :dates="eventDates"/>
</div>
</div>
<div v-if="hasActiveFilters" class="px-6">
<h3 class="text-sm text-gray-500 mb-4">Найдено мероприятий: {{ events.data.length }}</h3>
<div class="flex-wrap flex gap-3 md:items-center">
<BasicListBadge :filters="filters" />
</div>
</div>
</div>
<div class="grid gap-y-10 mt-10">
<template v-for="event in events.data">
@@ -107,7 +111,7 @@ export default {
<div class="grow">
<div class="flex flex-col h-full">
<div class="mb-3">
<p class="inline-flex items-center gap-1.5 py-1.5 rounded-md text-[12px] text-gray-600">
<p class="inline-flex mr-2 items-center gap-1.5 py-1.5 rounded-md text-[12px] text-gray-600">
{{ event.event_time_start }}
</p>
<p v-if="event.category" class="inline-flex items-center gap-1.5 py-1.5 px-3 rounded-md text-xs font-medium bg-[#E9F2FE] text-blue-600">
@@ -129,7 +133,7 @@ export default {
</div>
</div>
</main>
<ClientFooterDown/>
<BasicFooter />
</div>
</template>
+19 -30
View File
@@ -1,32 +1,25 @@
<script>
import MainNavbar from "@/Navbars/MainNavbar.vue";
import {Head, Link} from "@inertiajs/vue3";
import ClientScrollTimeline from "@/Components/ClientScrollTimeline.vue";
import ClientFooterDown from "@/Components/ClientFooterDown.vue";
import ClientImageSlider from "@/Components/ClientImageSlider.vue";
import EventBackButton from "@/Components/BuilderUi/Events/EventBackButton.vue";
import TitleEvent from "@/Components/BuilderUi/Events/TitleEvent.vue";
import PostBuilder from "@/Components/BuilderUi/Posts/PostBuilder.vue";
import EventBuilder from "@/Components/BuilderUi/Events/EventBuilder.vue";
import ClientEventSelectDate from "@/Components/ClientEventSelectDate.vue";
import ClientEventFilter from "@/Components/ClientEventFilter.vue";
import MainPageNavBar from "@/Navbars/MainPageNavbar.vue";
import EventItemBreadcrumbs from "@/Components/BuilderUi/Events/EventItemBreadcrumbs.vue";
import AppHead from "@/Components/AppHead.vue";
import BackButton from "@/componentss/ui/buttons/BackButton.vue";
import BasicTitle from "@/componentss/ui/titles/BasicTitle.vue";
import Builder from "@/componentss/shared/builder/pageBuilder/Builder.vue";
import BasicFooter from "@/footers/BasicFooter.vue";
import MetaTags from "@/componentss/shared/SEO/MetaTags.vue";
import EventItemBreadcrumbs from "@/componentss/features/events/components/EventItemBreadcrumbs.vue";
export default {
name: "Show",
components: {
AppHead,
MetaTags,
BasicFooter,
Builder,
BasicTitle,
BackButton,
EventItemBreadcrumbs,
MainPageNavBar,
ClientEventFilter, ClientEventSelectDate,
EventBuilder,
PostBuilder,
TitleEvent,
EventBackButton,
ClientImageSlider, ClientFooterDown, ClientScrollTimeline, Link, MainNavbar, Head},
Link
},
data() {
return {
}
@@ -62,23 +55,21 @@ export default {
</script>
<template>
<AppHead :seo="seo" />
<MetaTags :seo="seo" />
<MainPageNavBar class="border-b" :sections="$page.props.navigation"></MainPageNavBar>
<div class="flex flex-col h-screen">
<main class="flex-grow">
<div class="relative mx-auto mt-[67px] max-w-screen-xl py-10 md:flex md:flex-row md:py-10">
<div class="max-w-4xl px-4 pt-6 lg:pt-10 pb-12 sm:px-6 lg:px-8 mx-auto">
<div class="max-w-4xl px-4 pt-6 lg:pt-10 pb-12 sm:px-6 lg:px-8 mx-auto w-full">
<div>
<div class="space-y-5 md:space-y-10">
<div class="space-y-3">
<EventItemBreadcrumbs :breadcrumbs="breadcrumbs" :event-title="event.data.title" />
<EventBackButton link="client.event.index" title="Все мероприятия" />
<TitleEvent :header="event.data.title" />
<BackButton link="client.event.index" title="Все мероприятия" />
<BasicTitle :header="event.data.title" />
</div>
<div class="flex space-x-3 text-gray-500 ">
<div class="flex items-center gap-3">
<div>
@@ -101,10 +92,8 @@ export default {
</div>
<div class="space-y-3 md:space-y-4">
<EventBuilder :blocks="event.data.content"/>
<Builder :blocks="event.data.content"/>
</div>
</div>
<!-- End Content -->
</div>
@@ -112,7 +101,7 @@ export default {
</div>
</main>
<ClientFooterDown/>
<BasicFooter />
</div>
</template>
@@ -1,123 +0,0 @@
<script>
import MainNavbar from "@/Navbars/MainNavbar.vue";
import {Head, Link} from "@inertiajs/vue3";
import FsLightbox from "fslightbox-vue/v3";
import ClientScrollTimeline from "@/Components/ClientScrollTimeline.vue";
import ClientFooterDown from "@/Components/ClientFooterDown.vue";
import AdminIndexSearch from "@/Components/AdminIndexSearch.vue";
import AdminIndexFilter from "@/Components/AdminIndexFilter.vue";
import AdminIndexHeader from "@/Components/AdminIndexHeader.vue";
import AdminIndexHeaderTitle from "@/Components/AdminIndexHeaderTitle.vue";
import ClientPostFilter from '@/Components/ClientPostFilter.vue';
import ClientPost from '@/Components/ClientPost.vue';
import ClientPostSearch from '@/Components/ClientPostSearch.vue';
import TitleEvent from "@/Components/BuilderUi/Events/TitleEvent.vue";
import EventBackButton from "@/Components/BuilderUi/Events/EventBackButton.vue";
import EventBuilder from "@/Components/BuilderUi/Events/EventBuilder.vue";
import MainPageNavBar from "@/Navbars/MainPageNavbar.vue";
export default {
name: "Index",
components: {
MainPageNavBar,
EventBuilder, EventBackButton, TitleEvent,
AdminIndexHeaderTitle, AdminIndexHeader,
AdminIndexFilter, AdminIndexSearch,
ClientFooterDown,
ClientScrollTimeline,
ClientPostFilter,
Link,
MainNavbar,
FsLightbox,
Head,
ClientPost,
ClientPostSearch
},
data() {
return {
};
},
props: {
posts: {
type: Array,
},
filters: {
type: Array,
},
categories: {
type: Array,
},
navigation: {
type: Array,
},
},
methods: {
},
mounted() {
}
};
</script>
<template>
<Head>
<title>Новости</title>
<meta name="description" content="Your page description"/>
</Head>
<MainPageNavBar class="border-b" :sections="$page.props.navigation"></MainPageNavBar>
<div class="flex flex-col h-screen">
<main class="flex-grow">
<div class="relative mx-auto mt-[67px] max-w-screen-xl px-4 py-10 md:flex md:flex-row md:py-10">
<div class="px-4 pt-6 lg:pt-10 pb-12 sm:px-6 lg:px-8 mx-auto">
<div>
<AdminIndexHeader>
<ClientPostSearch />
<ClientPostFilter :items="categories"/>
</AdminIndexHeader>
<!-- Avatar Media -->
<!-- End Avatar Media -->
<!-- Content -->
<div class="space-y-5 md:space-y-4">
<div class="space-y-5 md:space-y-4">
<div>
<div class="container px-8 mx-auto xl:px-5 max-w-screen-lg py-5 lg:py-8">
<div class="mt-10 grid gap-10 md:grid-cols-2 lg:gap-10 xl:grid-cols-3">
<template v-for="post in posts.data" :key="post.id">
<ClientPost :post="post" />
</template>
</div>
<div class="mt-10 flex items-center justify-center">
<nav class="isolate inline-flex -space-x-px rounded-md shadow-sm" aria-label="Pagination">
<Link as="button" :href="$props.posts.links.prev" :disabled="$props.posts.links.prev === null"
class="relative inline-flex items-center gap-1 rounded-l-md border border-gray-300 bg-white px-3 py-2 pr-4 text-sm font-medium text-gray-500 hover:bg-gray-50 focus:z-20 disabled:pointer-events-none disabled:opacity-40 dark:border-gray-500 dark:bg-gray-800 dark:text-gray-300">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5"
stroke="currentColor" aria-hidden="true" data-slot="icon" class="h-3 w-3">
<path stroke-linecap="round" stroke-linejoin="round" d="M15.75 19.5 8.25 12l7.5-7.5"></path>
</svg>
<span>Предыдущая</span></Link>
<Link as="button" :href="$props.posts.links.next" :disabled="$props.posts.links.next === null"
class="relative inline-flex items-center gap-1 rounded-r-md border border-gray-300 bg-white px-3 py-2 pl-4 text-sm font-medium text-gray-500 hover:bg-gray-50 focus:z-20 disabled:pointer-events-none disabled:opacity-40 dark:border-gray-500 dark:bg-gray-800 dark:text-gray-300">
<span>Следующая</span>
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5"
stroke="currentColor" aria-hidden="true" data-slot="icon" class="h-3 w-3">
<path stroke-linecap="round" stroke-linejoin="round" d="m8.25 4.5 7.5 7.5-7.5 7.5"></path>
</svg>
</Link>
</nav>
</div>
</div>
</div>
</div>
</div>
<!-- End Content -->
</div>
</div>
</div>
</main>
<ClientFooterDown/>
</div>
</template>
<style scoped></style>
@@ -1,209 +0,0 @@
<script>
import MainNavbar from "@/Navbars/MainNavbar.vue";
import {Head, Link} from "@inertiajs/vue3";
import FsLightbox from "fslightbox-vue/v3";
import ClientScrollTimeline from "@/Components/ClientScrollTimeline.vue";
import ClientFooterDown from "@/Components/ClientFooterDown.vue";
import ClientImageSlider from "@/Components/ClientImageSlider.vue";
import ClientPostFilter from "@/Components/ClientPostFilter.vue";
import ClientPostSearch from "@/Components/ClientPostSearch.vue";
import ClientPost from "@/Components/ClientPost.vue";
import AdminIndexHeader from "@/Components/AdminIndexHeader.vue";
import MainPageNavBar from "@/Navbars/MainPageNavbar.vue";
export default {
name: "Show",
components: {
MainPageNavBar,
AdminIndexHeader,
ClientPost,
ClientPostSearch,
ClientPostFilter,
ClientImageSlider, ClientFooterDown, ClientScrollTimeline, Link, MainNavbar, FsLightbox, Head},
data() {
return {
blocks: this.post.data.content,
toggler: false,
togglerGallery: false,
editorImages: [],
galleryImages: [],
slide: 1,
gallerySlide: 1,
}
},
props: {
post: {
type: Array,
},
navigation: {
type: Array,
},
},
methods: {
textLimit(text, symbols) {
if (text.length > symbols) {
let LimitedText
LimitedText = text.substring(0, symbols)
return LimitedText + "..."
}
return text
},
},
}
</script>
<template>
<Head>
<title>{{ post.data.title }}</title>
<meta name="description" content="Your page description">
</Head>
<MainPageNavBar class="border-b" :sections="$page.props.navigation"></MainPageNavBar>
<div class="flex flex-col h-screen">
<main class="flex-grow">
<div class="relative mx-auto mt-[67px] max-w-screen-xl px-4 py-10 md:flex md:flex-row md:py-10">
<div class="max-w-3xl px-4 pt-6 lg:pt-10 pb-12 sm:px-6 lg:px-8 mx-auto">
<div>
<!-- Avatar Media -->
<!-- End Avatar Media -->
<!-- Content -->
<div class="space-y-5 md:space-y-10">
<div class="space-y-3">
<a onclick="history.back()" class="inline-flex items-center gap-x-1.5 text-sm text-gray-600 decoration-2 hover:underline dark:text-blue-500" href="#">
<svg class="flex-shrink-0 size-4" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m15 18-6-6 6-6"/></svg>
Назад
</a>
<h1 class="text-brand-primary mb-3 mt-2 text-3xl font-semibold tracking-tight dark:text-white lg:text-[40px] lg:leading-tight">
{{ post.data.title }}
</h1>
</div>
<div class="flex space-x-3 text-gray-500 ">
<div class="flex items-center gap-3">
<div>
<div class="flex items-center space-x-2 text-sm">
<div class="col-start-2 text-center">
<div class="hs-tooltip inline-block">
<button type="button" class="hs-tooltip-toggle underline hover:text-blue-400 duration-300">
Над статьей работали
<span class="hs-tooltip-content hs-tooltip-shown:opacity-100 hs-tooltip-shown:visible opacity-0 transition-opacity inline-block absolute duration-300 invisible z-10 py-1 px-2 bg-gray-900 text-xs font-medium text-white rounded shadow-sm dark:bg-neutral-700" role="tooltip">
<template v-for="author in post.data.authors">
{{ author }} <br>
</template>
</span>
</button>
</div>
</div>
<time class="text-gray-500 dark:text-gray-400">&bull; {{ post.data.created_post }} &bull;
</time>
<span>Чтение займет {{ post.data.reading_time }}<!-- --> Минуты</span></div>
</div>
</div>
</div>
<template v-for="block in this.blocks" :key="block.id">
<div v-if="block.type === 'heading'">
<h2 class="font-bold text-xl">{{ block.data.content }}</h2>
</div>
<div class="text-[16px] text-[#374151] dark:text-gray-200 leading-8 font-light" v-html="block.data.content" v-if="block.type === 'paragraph'"></div>
<div v-if="block.type === 'image'">
<ClientImageSlider :images="block.data.url" />
</div>
<div v-if="block.type === 'files'">
<div class="flex border rounded-lg px-4 py-2 items-center justify-between">
<div class="flex items-center">
<div class="w-[35px] h-[35px] bg-black flex justify-center items-center rounded-xl mr-2">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5"
stroke="currentColor" class="w-6 h-6">
<path stroke-linecap="round" stroke-linejoin="round"
d="M18.375 12.739l-7.693 7.693a4.5 4.5 0 01-6.364-6.364l10.94-10.94A3 3 0 1119.5 7.372L8.552 18.32m.009-.01l-.01.01m5.699-9.941l-7.81 7.81a1.5 1.5 0 002.112 2.13"
stroke="white"/>
</svg>
</div>
<div>{{ block.data.title }}</div>
</div>
<a :href="'/storage/'+ block.data.path" download type="button"
class="w-[35px] h-[35px] flex bg-gray-100 rounded-lg justify-center items-center hover:bg-gray-200 duration-200">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5"
stroke="currentColor" class="w-6 h-6">
<path stroke-linecap="round" stroke-linejoin="round"
d="M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3"/>
</svg>
</a>
</div>
</div>
</template>
<div v-if="galleryImages.length" class="grid gap-4 border-t border-gray-300 py-4">
<div class="relative">
<img
class="filter brightness-[0.7] w-full max-h-[500px] object-cover rounded-lg hover:opacity-95 hover:duration-200 transition"
:src="galleryImages[0]" data-hs-overlay="#hs-large-modal" alt="">
<div class="absolute inset-x-0 bottom-5 flex flex-col justify-center items-center">
<p class="text-white text-sm lg:text-xl text-center">{{ post.data.title }}</p>
<span class="text-gray-400 text-sm">{{ galleryImages.length }} фотографий</span>
</div>
</div>
</div>
</div>
<!-- End Content -->
</div>
</div>
<div style="z-index: 100" id="hs-large-modal"
class="hs-overlay hidden w-full h-full fixed top-0 left-0 z-[60] overflow-x-hidden overflow-y-auto">
<div
class="hs-overlay-open:mt-7 hs-overlay-open:opacity-100 hs-overlay-open:duration-500 mt-0 opacity-0 ease-out transition-all lg:max-w-4xl lg:w-full m-3 lg:mx-auto">
<div
class="flex flex-col bg-white border shadow-sm rounded-xl dark:bg-gray-800 dark:border-gray-700 dark:shadow-slate-700/[.7]">
<div class="flex justify-between items-center py-3 px-4 border-b dark:border-gray-700">
<h3 class="font-bold text-gray-800 dark:text-white">
Галлерея: {{ post.data.title }}
</h3>
<button type="button"
class="hs-dropdown-toggle inline-flex flex-shrink-0 justify-center items-center h-8 w-8 rounded-md text-gray-500 hover:text-gray-400 focus:outline-none focus:ring-2 focus:ring-gray-400 focus:ring-offset-2 focus:ring-offset-white transition-all text-sm dark:focus:ring-gray-700 dark:focus:ring-offset-gray-800"
data-hs-overlay="#hs-large-modal">
<span class="sr-only">Close</span>
<svg class="w-3.5 h-3.5" width="8" height="8" viewBox="0 0 8 8" fill="none"
xmlns="http://www.w3.org/2000/svg">
<path
d="M0.258206 1.00652C0.351976 0.912791 0.479126 0.860131 0.611706 0.860131C0.744296 0.860131 0.871447 0.912791 0.965207 1.00652L3.61171 3.65302L6.25822 1.00652C6.30432 0.958771 6.35952 0.920671 6.42052 0.894471C6.48152 0.868271 6.54712 0.854471 6.61352 0.853901C6.67992 0.853321 6.74572 0.865971 6.80722 0.891111C6.86862 0.916251 6.92442 0.953381 6.97142 1.00032C7.01832 1.04727 7.05552 1.1031 7.08062 1.16454C7.10572 1.22599 7.11842 1.29183 7.11782 1.35822C7.11722 1.42461 7.10342 1.49022 7.07722 1.55122C7.05102 1.61222 7.01292 1.6674 6.96522 1.71352L4.31871 4.36002L6.96522 7.00648C7.05632 7.10078 7.10672 7.22708 7.10552 7.35818C7.10442 7.48928 7.05182 7.61468 6.95912 7.70738C6.86642 7.80018 6.74102 7.85268 6.60992 7.85388C6.47882 7.85498 6.35252 7.80458 6.25822 7.71348L3.61171 5.06702L0.965207 7.71348C0.870907 7.80458 0.744606 7.85498 0.613506 7.85388C0.482406 7.85268 0.357007 7.80018 0.264297 7.70738C0.171597 7.61468 0.119017 7.48928 0.117877 7.35818C0.116737 7.22708 0.167126 7.10078 0.258206 7.00648L2.90471 4.36002L0.258206 1.71352C0.164476 1.61976 0.111816 1.4926 0.111816 1.36002C0.111816 1.22744 0.164476 1.10028 0.258206 1.00652Z"
fill="currentColor"/>
</svg>
</button>
</div>
<div class="p-4 overflow-y-auto">
<div class="grid grid-cols-2 md:grid-cols-3 gap-4">
</div>
</div>
</div>
</div>
</div>
</div>
</main>
<ClientFooterDown/>
</div>
</template>
<style>
</style>
+18 -34
View File
@@ -1,37 +1,22 @@
<script>
import MainNavbar from "@/Navbars/MainNavbar.vue";
import {Head, Link} from "@inertiajs/vue3";
import FsLightbox from "fslightbox-vue/v3";
import ClientScrollTimeline from "@/Components/ClientScrollTimeline.vue";
import ClientFooterDown from "@/Components/ClientFooterDown.vue";
import AdminIndexSearch from "@/Components/AdminIndexSearch.vue";
import AdminIndexFilter from "@/Components/AdminIndexFilter.vue";
import AdminIndexHeader from "@/Components/AdminIndexHeader.vue";
import AdminIndexHeaderTitle from "@/Components/AdminIndexHeaderTitle.vue";
import ClientPostFilter from '@/Components/ClientPostFilter.vue';
import ClientPost from '@/Components/ClientPost.vue';
import ClientPostSearch from '@/Components/ClientPostSearch.vue';
import MetaTags from "@/componentss/shared/SEO/MetaTags.vue";
import MainPageNavBar from "@/Navbars/MainPageNavbar.vue";
import FacultyListBreadcrumbs from "@/Components/BuilderUi/Faculties/FacultyListBreadcrumbs.vue";
import AppHead from "@/Components/AppHead.vue";
import FacultyListBreadcrumbs from "@/componentss/features/faculties/components/FacultyListBreadcrumbs.vue";
import BasicFooter from "@/footers/BasicFooter.vue";
import BasicTitle from "@/componentss/ui/titles/BasicTitle.vue";
import FacultyListTitle from "@/componentss/features/faculties/components/FacultyListTitle.vue";
export default {
name: "Index",
components: {
AppHead,
FacultyListBreadcrumbs,
MainPageNavBar,
AdminIndexHeaderTitle, AdminIndexHeader,
AdminIndexFilter, AdminIndexSearch,
ClientFooterDown,
ClientScrollTimeline,
ClientPostFilter,
Link,
MainNavbar,
FsLightbox,
Head,
ClientPost,
ClientPostSearch
FacultyListTitle,
BasicTitle,
BasicFooter,
FacultyListBreadcrumbs,
MainPageNavBar,
MetaTags,
Link
},
data() {
return {
@@ -56,14 +41,14 @@ export default {
</script>
<template>
<AppHead :seo="seo" />
<MetaTags :seo="seo" />
<MainPageNavBar class="border-b" :sections="$page.props.navigation"></MainPageNavBar>
<div class="flex flex-col h-screen">
<main class="flex-grow">
<div class="relative mx-auto mt-[67px] max-w-screen-xl py-10 md:flex md:flex-row md:py-10">
<div class="px-4 pt-6 lg:pt-10 pb-12 sm:px-6 lg:px-8 mx-auto">
<div class="px-4 pt-6 lg:pt-10 pb-12 sm:px-6 lg:px-8 mx-auto w-full max-w-screen-xl">
<div>
<!-- Avatar Media -->
<!-- End Avatar Media -->
@@ -72,10 +57,9 @@ export default {
<div class="space-y-5 md:space-y-4">
<!-- Card Section -->
<div class="max-w-[85rem] px-0 py-10 sm:px-6 lg:px-8 lg:py-14 mx-auto">
<div class="max-w-2xl text-center mx-auto mb-10 lg:mb-14">
<h2 class="text-2xl font-bold md:text-4xl md:leading-tight dark:text-white">Факультеты и кафедры</h2>
<p class="mt-1 text-gray-600 dark:text-neutral-400">Информация о наших факультетах и кафедрах</p>
</div>
<FacultyListTitle
bottom-text="Информация о наших факультетах и кафедрах"
header="Факультеты и кафедры" />
<FacultyListBreadcrumbs />
<!-- Grid -->
@@ -111,7 +95,7 @@ export default {
</div>
</div>
</main>
<ClientFooterDown/>
<BasicFooter />
</div>
</template>
+15 -46
View File
@@ -1,9 +1,9 @@
<template>
<AppHead :seo="seo" />
<MetaTags :seo="seo" />
<div class="flex flex-col h-screen justify-between">
<MainPageNavBar class="border-b" :sections="$page.props.navigation"></MainPageNavBar>
<MainPageNavBar class="border-b" :sections="$page.props.navigation" />
<div class="relative mx-auto mb-auto mt-[67px] max-w-screen-xl px-4 py-10 md:flex md:flex-row md:py-10">
@@ -83,7 +83,7 @@
<template v-for="worker in faculty.data.workers">
<ClientFacultyWorkerCard :worker="worker" />
<FacultyWorkerCard :worker="worker" />
</template>
@@ -120,7 +120,7 @@
<div class="space-y-3 md:space-y-4">
<FacultyBuilder :blocks="faculty.data.content "/>
<Builder :blocks="faculty.data.content "/>
</div>
</div>
@@ -130,7 +130,7 @@
</article>
</div>
<ClientFooterDown/>
<BasicFooter />
</div>
@@ -141,23 +141,15 @@
import {Link} from "@inertiajs/vue3";
import FsLightbox from "fslightbox-vue/v3";
import MainNavbar from "@/Navbars/MainNavbar.vue";
import ClientFooterDown from "@/Components/ClientFooterDown.vue";
import { Head } from '@inertiajs/vue3'
import slugify from "slugify";
import axios from "axios";
import PageNavigateLinks from "@/Components/BuilderUi/Pages/PageNavigateLinks.vue";
import PageBreadcrumbs from "@/Components/BuilderUi/Pages/PageBreadcrumbs.vue";
import PageBuilder from "@/Components/BuilderUi/Pages/PageBuilder.vue";
import PageSubSectionLinks from "@/Components/BuilderUi/Pages/PageSubSectionLinks.vue";
import PageTitle from "@/Components/BuilderUi/Pages/PageTitle.vue";
import ClientFacultyWorkerCard from "@/Components/PersonCards/ClientFacultyWorkerCard.vue";
import PostBuilder from "@/Components/BuilderUi/Posts/PostBuilder.vue";
import FacultyBuilder from "@/Components/BuilderUi/Faculties/FacultyBuilder.vue";
import MainPageNavBar from "@/Navbars/MainPageNavbar.vue";
import FacultyItemBreadcrumbs from "@/Components/BuilderUi/Faculties/FacultyItemBreadcrumbs.vue";
import AppHead from "@/Components/AppHead.vue";
import FacultyWorkerCard from "@/componentss/features/faculties/components/FacultyWorkerCard.vue";
import BasicFooter from "@/footers/BasicFooter.vue";
import Builder from "@/componentss/shared/builder/pageBuilder/Builder.vue";
import MetaTags from "@/componentss/shared/SEO/MetaTags.vue";
import FacultyItemBreadcrumbs from "@/componentss/features/faculties/components/FacultyItemBreadcrumbs.vue";
export default {
@@ -182,17 +174,14 @@ export default {
},
components: {
AppHead,
MetaTags,
Builder,
BasicFooter,
FacultyWorkerCard,
FacultyItemBreadcrumbs,
MainPageNavBar,
FacultyBuilder,
PostBuilder,
ClientFacultyWorkerCard,
PageTitle, PageSubSectionLinks, PageBuilder, PageBreadcrumbs, PageNavigateLinks,
ClientFooterDown,
MainNavbar,
Link,
FsLightbox,
Head
},
methods: {
@@ -204,10 +193,6 @@ export default {
}
return text
},
openEditorImagesOnSlide: function (number) {
this.slide = number;
this.toggler = !this.toggler;
},
isSameRoute(route) {
if (this.$page.props.ziggy.location === route) {
return true
@@ -222,11 +207,7 @@ export default {
},
onScroll(e) {
const windowTop = window.top.scrollY
if (windowTop > 100) {
this.scrollTop = true
} else {
this.scrollTop = false
}
this.scrollTop = windowTop > 100;
},
scrollToTop() {
window.scrollTo(0, 0)
@@ -237,8 +218,6 @@ export default {
mounted() {
window.addEventListener("scroll", this.onScroll)
// this.editorImages = this.blocksWithSlideNumber.filter(block => block.type === 'image').map(block => block.data.file.url);
window.addEventListener("scroll", () => {
const headings = document.querySelectorAll('h2');
const visor = document.querySelector('#visor');
@@ -285,16 +264,6 @@ export default {
.paragraph-container a {
@apply text-[#1E57A3];
@apply underline;
}
.paragraph-container p {
@apply mb-2
}
@keyframes fade {
from {
@@ -1,122 +0,0 @@
<script>
import MainNavbar from "@/Navbars/MainNavbar.vue";
import {Head, Link} from "@inertiajs/vue3";
import FsLightbox from "fslightbox-vue/v3";
import ClientScrollTimeline from "@/Components/ClientScrollTimeline.vue";
import ClientFooterDown from "@/Components/ClientFooterDown.vue";
import AdminIndexSearch from "@/Components/AdminIndexSearch.vue";
import AdminIndexFilter from "@/Components/AdminIndexFilter.vue";
import AdminIndexHeader from "@/Components/AdminIndexHeader.vue";
import AdminIndexHeaderTitle from "@/Components/AdminIndexHeaderTitle.vue";
import ClientEventSelectDate from "@/Components/ClientEventSelectDate.vue";
import MainPageNavBar from "@/Navbars/MainPageNavbar.vue";
import AppHead from "@/Components/AppHead.vue";
export default {
name: "Index",
components: {
AppHead,
MainPageNavBar,
ClientEventSelectDate,
AdminIndexHeaderTitle, AdminIndexHeader,
AdminIndexFilter, AdminIndexSearch,
ClientFooterDown,
ClientScrollTimeline,
Link,
MainNavbar,
FsLightbox,
Head,
},
props: {
exhibitions: {
type: Array,
},
seo: {
type: Object,
}
},
methods: {},
mounted() {
}
};
</script>
<template>
<AppHead :seo="seo" />
<MainPageNavBar class="border-b" :sections="$page.props.navigation"></MainPageNavBar>
<div class="flex flex-col h-screen">
<main class="flex-grow">
<div class="relative mx-auto mt-[67px] max-w-screen-xl px-4 py-10 md:flex md:flex-row md:py-10">
<div class="px-4 pt-6 lg:pt-10 pb-12 sm:px-6 lg:px-8 mx-auto">
<div>
<div class="space-y-5 md:space-y-4">
<div class="max-w-2xl text-center mx-auto mb-10 lg:mb-14">
<h2 class="text-2xl font-bold md:text-4xl md:leading-tight dark:text-white">Виртуальные выставки</h2>
<p class="mt-1 text-gray-600 dark:text-neutral-400">We've helped some great companies brand, design and get to market.</p>
</div>
</div>
<div class="container px-8 mx-auto xl:px-5 max-w-screen-md">
<div class="my-10 sm:my-14">
<template v-for="exhibition in exhibitions.data">
<Link :href="route('client.library.exhibition.show', exhibition.id)" class="group sm:flex rounded-xl mb-4">
<div class="grow">
<div class="flex flex-col h-full">
<div class="mb-3">
<p class="inline-flex items-center gap-1.5 py-1.5 px-3 rounded-md text-[12px] text-gray-600">
{{ exhibition.created_at }}
</p>
<p class="inline-flex items-center gap-1.5 py-1.5 px-3 rounded-md text-xs font-medium bg-[#E9F2FE] text-blue-600">
{{ exhibition.category }}
</p>
</div>
<h3 class="text-lg sm:text-2xl font-semibold text-gray-800 group-hover:text-blue-600">
{{ exhibition.title }}
</h3>
<p class="mt-2 text-gray-600">
{{ exhibition.preview_text }}
</p>
</div>
</div>
</Link>
</template>
<div class="mt-10 flex items-center justify-center">
<nav class="isolate inline-flex -space-x-px rounded-md shadow-sm" aria-label="Pagination">
<Link as="button" :href="exhibitions.links.prev" :disabled="exhibitions.links.prev === null"
class="relative inline-flex items-center gap-1 rounded-l-md border border-gray-300 bg-white px-3 py-2 pr-4 text-sm font-medium text-gray-500 hover:bg-gray-50 focus:z-20 disabled:pointer-events-none disabled:opacity-40 dark:border-gray-500 dark:bg-gray-800 dark:text-gray-300">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5"
stroke="currentColor" aria-hidden="true" data-slot="icon" class="h-3 w-3">
<path stroke-linecap="round" stroke-linejoin="round" d="M15.75 19.5 8.25 12l7.5-7.5"></path>
</svg>
<span>Предыдущая</span></Link>
<Link as="button" :href="exhibitions.links.next" :disabled="exhibitions.links.next === null"
class="relative inline-flex items-center gap-1 rounded-r-md border border-gray-300 bg-white px-3 py-2 pl-4 text-sm font-medium text-gray-500 hover:bg-gray-50 focus:z-20 disabled:pointer-events-none disabled:opacity-40 dark:border-gray-500 dark:bg-gray-800 dark:text-gray-300">
<span>Следующая</span>
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5"
stroke="currentColor" aria-hidden="true" data-slot="icon" class="h-3 w-3">
<path stroke-linecap="round" stroke-linejoin="round" d="m8.25 4.5 7.5 7.5-7.5 7.5"></path>
</svg>
</Link>
</nav>
</div>
</div>
</div>
</div>
</div>
</div>
</main>
<ClientFooterDown/>
</div>
</template>
<style scoped>
</style>
@@ -1,172 +0,0 @@
<script>
import MainNavbar from "@/Navbars/MainNavbar.vue";
import {Head, Link} from "@inertiajs/vue3";
import FsLightbox from "fslightbox-vue/v3";
import ClientScrollTimeline from "@/Components/ClientScrollTimeline.vue";
import ClientFooterDown from "@/Components/ClientFooterDown.vue";
import ClientImageSlider from "@/Components/ClientImageSlider.vue";
import MainPageNavBar from "@/Navbars/MainPageNavbar.vue";
import BaseTitle from "@/Components/BaseComponents/BaseBuilderUi/BaseTitle.vue";
import BaseBuilder from "@/Components/BaseComponents/BaseBuilderUi/BaseBuilder.vue";
import BaseBackButton from "@/Components/BaseComponents/BaseBuilderUi/BaseBackButton.vue";
import AppHead from "@/Components/AppHead.vue";
export default {
name: "Show",
components: {
AppHead,
BaseBackButton,
BaseBuilder,
BaseTitle,
MainPageNavBar,
ClientImageSlider, ClientFooterDown, ClientScrollTimeline, Link, MainNavbar, FsLightbox, Head},
data() {
return {
blocks: this.exhibition.data.content,
}
},
props: {
exhibition: {
type: Array,
},
seo: {
type: Object,
}
},
methods: {
textLimit(text, symbols) {
if (text.length > symbols) {
let LimitedText
LimitedText = text.substring(0, symbols)
return LimitedText + "..."
}
return text
},
},
}
</script>
<template>
<AppHead :seo="seo" />
<MainPageNavBar class="border-b" :sections="$page.props.navigation"></MainPageNavBar>
<div class="relative mx-auto mt-[67px] max-w-screen-xl px-4 py-10 md:flex md:flex-row md:py-10">
<div class="max-w-4xl px-4 pt-6 lg:pt-10 pb-12 sm:px-6 lg:px-8 mx-auto">
<div>
<div class="space-y-5 md:space-y-10">
<div class="space-y-3">
<a onclick="history.back()"
class="inline-flex items-center gap-x-1.5 text-sm text-gray-600 decoration-2 hover:underline dark:text-blue-500"
href="#">
<svg class="flex-shrink-0 size-4" xmlns="http://www.w3.org/2000/svg" width="24" height="24"
viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
stroke-linejoin="round">
<path d="m15 18-6-6 6-6"/>
</svg>
Назад
</a>
<h1 class="text-brand-primary mb-3 mt-2 text-3xl font-semibold tracking-tight dark:text-white lg:text-[40px] lg:leading-tight">
{{ exhibition.data.title }}
</h1>
</div>
<div class="flex space-x-3 text-gray-500 ">
<div class="flex items-center gap-3">
<div>
<div class="flex items-center space-x-2 text-sm">
<p class="inline-flex items-center gap-1.5 py-1.5 px-3 rounded-md text-xs font-medium bg-[#E9F2FE] text-blue-600">
{{ exhibition.data.category }}
</p>
</div>
</div>
</div>
</div>
<template v-for="block in blocks" :key="block.id">
<div v-if="block.type === 'heading'">
<h2 class="font-bold text-xl">{{ block.data.content }}</h2>
</div>
<div class="text-[16px] text-[#374151] dark:text-gray-200 leading-8 font-light" v-html="block.data.content"
v-if="block.type === 'paragraph'"></div>
<div v-if="block.type === 'image'">
<ClientImageSlider :images="block.data.url"/>
</div>
<div v-if="block.type === 'files'">
<div class="flex border rounded-lg px-4 py-2 items-center justify-between">
<div class="flex items-center">
<div class="w-[35px] h-[35px] bg-black flex justify-center items-center rounded-xl mr-2">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5"
stroke="currentColor" class="w-6 h-6">
<path stroke-linecap="round" stroke-linejoin="round"
d="M18.375 12.739l-7.693 7.693a4.5 4.5 0 01-6.364-6.364l10.94-10.94A3 3 0 1119.5 7.372L8.552 18.32m.009-.01l-.01.01m5.699-9.941l-7.81 7.81a1.5 1.5 0 002.112 2.13"
stroke="white"/>
</svg>
</div>
<div>{{ block.data.title }}</div>
</div>
<a :href="'/storage/'+ block.data.path" download type="button"
class="w-[35px] h-[35px] flex bg-gray-100 rounded-lg justify-center items-center hover:bg-gray-200 duration-200">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5"
stroke="currentColor" class="w-6 h-6">
<path stroke-linecap="round" stroke-linejoin="round"
d="M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3"/>
</svg>
</a>
</div>
</div>
</template>
</div>
<!-- End Content -->
</div>
</div>
</div>
<div class="flex flex-col h-screen">
<main class="flex-grow">
<div class="relative mx-auto mt-[67px] max-w-screen-xl px-4 py-10 md:flex md:flex-row md:py-10">
<div class="max-w-4xl px-4 pt-6 lg:pt-10 pb-12 sm:px-6 lg:px-8 mx-auto">
<div>
<div class="space-y-5 md:space-y-10">
<div class="space-y-3">
<BaseBackButton title="Назад" link="client.library.exhibition.index" />
<BaseTitle :header="exhibition.data.title" />
</div>
<div class="flex space-x-3 text-gray-500 ">
<div class="flex items-center gap-3">
<div>
<div class="flex items-center space-x-2 text-sm">
<p class="inline-flex items-center gap-1.5 py-1.5 px-3 rounded-md text-xs font-medium bg-[#E9F2FE] text-blue-600">
{{ exhibition.data.category }}
</p>
</div>
</div>
</div>
</div>
<BaseBuilder :blocks="blocks" />
</div>
<!-- End Content -->
</div>
</div>
</div>
</main>
<ClientFooterDown/>
</div>
</template>
<style>
</style>
@@ -1,133 +0,0 @@
<script>
import MainNavbar from "@/Navbars/MainNavbar.vue";
import {Head, Link} from "@inertiajs/vue3";
import FsLightbox from "fslightbox-vue/v3";
import ClientScrollTimeline from "@/Components/ClientScrollTimeline.vue";
import ClientFooterDown from "@/Components/ClientFooterDown.vue";
import AdminIndexSearch from "@/Components/AdminIndexSearch.vue";
import AdminIndexFilter from "@/Components/AdminIndexFilter.vue";
import AdminIndexHeader from "@/Components/AdminIndexHeader.vue";
import AdminIndexHeaderTitle from "@/Components/AdminIndexHeaderTitle.vue";
import ClientPostFilter from '@/Components/ClientPostFilter.vue';
import ClientPost from '@/Components/ClientPost.vue';
import ClientPostSearch from '@/Components/ClientPostSearch.vue';
import ClientEventSelectDate from "@/Components/ClientEventSelectDate.vue";
import MainPageNavBar from "@/Navbars/MainPageNavbar.vue";
import AppHead from "@/Components/AppHead.vue";
export default {
name: "Index",
components: {
AppHead,
MainPageNavBar,
ClientEventSelectDate,
AdminIndexHeaderTitle, AdminIndexHeader,
AdminIndexFilter, AdminIndexSearch,
ClientFooterDown,
ClientScrollTimeline,
ClientPostFilter,
Link,
MainNavbar,
FsLightbox,
Head,
ClientPost,
ClientPostSearch
},
props: {
posts: {
type: Array,
},
seo: {
type: Object,
}
},
methods: {},
mounted() {
}
};
</script>
<template>
<AppHead :seo="seo" />
<MainPageNavBar class="border-b" :sections="$page.props.navigation"></MainPageNavBar>
<div class="flex flex-col h-screen">
<main class="flex-grow">
<div class="relative mx-auto mt-[67px] max-w-screen-xl px-4 py-10 md:flex md:flex-row md:py-10">
<div class="px-4 pt-6 lg:pt-10 pb-12 sm:px-6 lg:px-8 mx-auto">
<div>
<!-- <AdminIndexHeader>-->
<!-- <ClientPostSearch />-->
<!-- <ClientPostFilter :items="categories"/>-->
<!-- </AdminIndexHeader>-->
<!-- Avatar Media -->
<!-- End Avatar Media -->
<!-- Content -->
<div class="space-y-5 md:space-y-4">
<div class="max-w-2xl text-center mx-auto mb-10 lg:mb-14">
<h2 class="text-2xl font-bold md:text-4xl md:leading-tight dark:text-white">Заметки библиотеки</h2>
<p class="mt-1 text-gray-600 dark:text-neutral-400">We've helped some great companies brand, design and get to market.</p>
</div>
</div>
<div class="container px-8 mx-auto xl:px-5 max-w-screen-md">
<div class="my-10 sm:my-14">
<template v-for="post in posts.data">
<Link :href="route('client.library.news.show', post.id)" class="group sm:flex rounded-xl mb-4">
<div class="grow">
<div class="flex flex-col h-full">
<div class="mb-3">
<p class="inline-flex items-center gap-1.5 py-1.5 px-3 rounded-md text-[12px] text-gray-600">
{{ post.created_at }}
</p>
<p class="inline-flex items-center gap-1.5 py-1.5 px-3 rounded-md text-xs font-medium bg-[#E9F2FE] text-blue-600">
{{ post.category }}
</p>
</div>
<h3 class="text-lg sm:text-2xl font-semibold text-gray-800 group-hover:text-blue-600">
{{ post.title }}
</h3>
<p class="mt-2 text-gray-600">
{{ post.preview_text }}
</p>
</div>
</div>
</Link>
</template>
<div class="mt-10 flex items-center justify-center">
<nav class="isolate inline-flex -space-x-px rounded-md shadow-sm" aria-label="Pagination">
<Link as="button" :href="posts.links.prev" :disabled="posts.links.prev === null"
class="relative inline-flex items-center gap-1 rounded-l-md border border-gray-300 bg-white px-3 py-2 pr-4 text-sm font-medium text-gray-500 hover:bg-gray-50 focus:z-20 disabled:pointer-events-none disabled:opacity-40 dark:border-gray-500 dark:bg-gray-800 dark:text-gray-300">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5"
stroke="currentColor" aria-hidden="true" data-slot="icon" class="h-3 w-3">
<path stroke-linecap="round" stroke-linejoin="round" d="M15.75 19.5 8.25 12l7.5-7.5"></path>
</svg>
<span>Предыдущая</span></Link>
<Link as="button" :href="posts.links.next" :disabled="posts.links.next === null"
class="relative inline-flex items-center gap-1 rounded-r-md border border-gray-300 bg-white px-3 py-2 pl-4 text-sm font-medium text-gray-500 hover:bg-gray-50 focus:z-20 disabled:pointer-events-none disabled:opacity-40 dark:border-gray-500 dark:bg-gray-800 dark:text-gray-300">
<span>Следующая</span>
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5"
stroke="currentColor" aria-hidden="true" data-slot="icon" class="h-3 w-3">
<path stroke-linecap="round" stroke-linejoin="round" d="m8.25 4.5 7.5 7.5-7.5 7.5"></path>
</svg>
</Link>
</nav>
</div>
</div>
</div>
</div>
</div>
</div>
</main>
<ClientFooterDown/>
</div>
</template>
<style scoped>
</style>
@@ -1,98 +0,0 @@
<script>
import MainNavbar from "@/Navbars/MainNavbar.vue";
import {Head, Link} from "@inertiajs/vue3";
import FsLightbox from "fslightbox-vue/v3";
import ClientScrollTimeline from "@/Components/ClientScrollTimeline.vue";
import ClientFooterDown from "@/Components/ClientFooterDown.vue";
import ClientImageSlider from "@/Components/ClientImageSlider.vue";
import MainPageNavBar from "@/Navbars/MainPageNavbar.vue";
import BaseBackButton from "@/Components/BaseComponents/BaseBuilderUi/BaseBackButton.vue";
import BaseTitle from "@/Components/BaseComponents/BaseBuilderUi/BaseTitle.vue";
import BaseBuilder from "@/Components/BaseComponents/BaseBuilderUi/BaseBuilder.vue";
import AppHead from "@/Components/AppHead.vue";
export default {
name: "Show",
components: {
AppHead,
BaseBuilder,
BaseTitle, BaseBackButton,
MainPageNavBar,
ClientImageSlider, ClientFooterDown, ClientScrollTimeline, Link, MainNavbar, FsLightbox, Head},
data() {
return {
blocks: this.post.data.content,
}
},
props: {
post: {
type: Array,
},
seo: {
type: Object,
}
},
methods: {
textLimit(text, symbols) {
if (text.length > symbols) {
let LimitedText
LimitedText = text.substring(0, symbols)
return LimitedText + "..."
}
return text
},
},
}
</script>
<template>
<AppHead :seo="seo" />
<ClientScrollTimeline/>
<MainPageNavBar class="border-b" :sections="$page.props.navigation"></MainPageNavBar>
<div class="flex flex-col h-screen">
<main class="flex-grow">
<div class="relative mx-auto mt-[67px] max-w-screen-xl px-4 py-10 md:flex md:flex-row md:py-10">
<div class="max-w-4xl px-4 pt-6 lg:pt-10 pb-12 sm:px-6 lg:px-8 mx-auto">
<div>
<div class="space-y-5 md:space-y-10">
<div class="space-y-3">
<BaseBackButton title="Назад" link="client.library.exhibition.index" />
<BaseTitle :header="post.data.title" />
</div>
<div class="flex space-x-3 text-gray-500 ">
<div class="flex items-center gap-3">
<div>
<div class="flex items-center space-x-2 text-sm">
<p class="inline-flex items-center gap-1.5 py-1.5 px-3 rounded-md text-xs font-medium bg-[#E9F2FE] text-blue-600">
{{ post.data.category }}
</p>
</div>
</div>
</div>
</div>
<BaseBuilder :blocks="blocks" />
</div>
<!-- End Content -->
</div>
</div>
</div>
</main>
<ClientFooterDown/>
</div>
</template>
<style>
</style>
+14 -126
View File
@@ -1,5 +1,5 @@
<template>
<AppHead :seo="seo" />
<MetaTags :seo="seo" />
<div class="flex flex-col h-screen">
@@ -8,7 +8,7 @@
<main class="flex-grow">
<div class="relative mb-auto mx-auto mt-[67px] max-w-screen-xl px-4 py-10 md:flex md:flex-row md:py-10">
<PageNavigateLinks :header-navs="headerNavs" />
<NavigateLinks :header-navs="headerNavs" />
<section class="w-full min-w-0 mt-1 max-w-6xl px-1 md:px-6" style="">
@@ -16,104 +16,14 @@
<PersonBreadcrumbs class="mb-4" :person-name="person.data.name" />
<div class="flex items-center gap-x-10 gap-y-4 flex-wrap">
<PersonAvatarBlock v-if="person.data.details.photo" :photo="person.data.details.photo" />
<div class="grow">
<h1 class="text-2xl font-medium text-gray-800 dark:text-neutral-200">
{{ person.data.name }}
</h1>
<div class="">
<template v-for="division_work in person.data.divisions_works">
<Link :href="route('client.division.show', division_work.slug)" class="text-sm text-blue-500 dark:text-neutral-400 mr-2">
{{ division_work.position }}
</Link>
</template>
<template v-for="faculty_work in person.data.faculties_works">
<Link :href="route('client.faculty.show', faculty_work.slug)" class="text-sm text-blue-500 dark:text-neutral-400 mr-2">
{{ faculty_work.position }}
</Link>
</template>
<template v-for="division_work in person.data.departments_work">
<Link :href="route('client.department.show', { facultySlug: division_work.faculty_slug, departmentSlug: division_work.slug })" class="text-sm text-blue-500 dark:text-neutral-400 mr-2">
{{ division_work.position }}
</Link>
</template>
<template v-for="division_tech in person.data.departments_teach">
<Link :href="route('client.department.show', { facultySlug: division_tech.faculty_slug, departmentSlug: division_tech.slug })" class="text-sm text-blue-500 dark:text-neutral-400 mr-2">
{{ division_tech.position }}
</Link>
</template>
</div>
<InfoSection :person="person" />
<ul class="mt-5 flex flex-col gap-y-3">
<li v-if="person.data.details.contactPhone" class="flex items-center gap-x-2.5">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="shrink-0 size-3.5">
<path stroke-linecap="round" stroke-linejoin="round" d="M2.25 6.75c0 8.284 6.716 15 15 15h2.25a2.25 2.25 0 0 0 2.25-2.25v-1.372c0-.516-.351-.966-.852-1.091l-4.423-1.106c-.44-.11-.902.055-1.173.417l-.97 1.293c-.282.376-.769.542-1.21.38a12.035 12.035 0 0 1-7.143-7.143c-.162-.441.004-.928.38-1.21l1.293-.97c.363-.271.527-.734.417-1.173L6.963 3.102a1.125 1.125 0 0 0-1.091-.852H4.5A2.25 2.25 0 0 0 2.25 4.5v2.25Z" />
</svg>
<a class="text-[13px] text-gray-500 underline hover:text-gray-800 hover:decoration-2 focus:outline-none focus:decoration-2 dark:text-neutral-500 dark:hover:text-neutral-400" href="#">
{{ person.data.details.contactPhone }}
</a>
</li>
<li v-if="person.data.details.contactEmail" class="flex items-center gap-x-2.5">
<svg class="shrink-0 size-3.5" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<rect width="20" height="16" x="2" y="4" rx="2"></rect>
<path d="m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7"></path>
</svg>
<a class="text-[13px] text-gray-500 underline hover:text-gray-800 hover:decoration-2 focus:outline-none focus:decoration-2 dark:text-neutral-500 dark:hover:text-neutral-400" href="#">
{{ person.data.details.contactEmail }}
</a>
</li>
</ul>
</div>
</div>
<div class="mt-5 sm:mt-7">
<EducationBlock v-if="person.data.details.education.length > 0" title="Направление подготовки" :educations="person.data.details.education" />
</div>
<div class="mt-8">
<ListBlock v-if="person.data.details.awards.length > 0" name-list="Награды" :list="person.data.details.awards" />
</div>
<div class="mt-8">
<ListBlock v-if="person.data.details.professionalRetraining.length > 0" name-list="Профессиональная переподготовка" :list="person.data.details.professionalRetraining" />
</div>
<div class="mt-8">
<ListBlock v-if="person.data.details.professionalDevelopment.length > 0" name-list="Повышение квалификации" :list="person.data.details.professionalDevelopment" />
</div>
<div class="mt-8">
<ListBlock v-if="person.data.details.professDisciplines.length > 0" name-list="Преподаваемые дисциплины" :list="person.data.details.professDisciplines" />
</div>
<div class="mt-8">
<WorkExperienceBlock v-if="person.data.details.workExperience.total" title="Стаж" :work-exp-by-prof="person.data.details.workExperience.byProf" :work-exp-total="person.data.details.workExperience.total" />
</div>
<div class="mt-8">
<ListBlock v-if="person.data.details.attendedConferences.length > 0" name-list="Участие в конференциях" :list="person.data.details.attendedConferences" />
</div>
<div class="mt-8">
<ListBlock v-if="person.data.details.participationScienceProjects.length > 0" name-list="Участие в научных проектах" :list="person.data.details.participationScienceProjects" />
</div>
<div class="mt-8">
<PublicationBlock v-if="person.data.details.publications.length > 0" name-list="Публикации" :list="person.data.details.publications" />
</div>
<div class="mt-8">
<OtherBlock v-if="person.data.details.other.length > 0" name-list="Другое" :blocks="person.data.details.other" />
</div>
</div>
</section>
</div>
</main>
<ClientFooterDown/>
<BasicFooter />
</div>
@@ -124,23 +34,13 @@
import {Link} from "@inertiajs/vue3";
import FsLightbox from "fslightbox-vue/v3";
import MainNavbar from "@/Navbars/MainNavbar.vue";
import ClientFooterDown from "@/Components/ClientFooterDown.vue";
import { Head } from '@inertiajs/vue3'
import slugify from "slugify";
import axios from "axios";
import MainPageNavBar from "@/Navbars/MainPageNavbar.vue";
import AppHead from "@/Components/AppHead.vue";
import PersonBreadcrumbs from "@/Components/BuilderUi/Persons/PersonBreadcrumbs.vue";
import PersonAvatarBlock from "@/Components/BuilderUi/Persons/PersonAvatarBlock.vue";
import PersonNavLink from "@/Components/BuilderUi/Persons/PersonNavLink.vue";
import PageNavigateLinks from "@/Components/BuilderUi/Pages/PageNavigateLinks.vue";
import EducationBlock from "@/Components/BuilderUi/Persons/Blocks/EducationBlock.vue";
import ListBlock from "@/Components/BuilderUi/Persons/Blocks/ListBlock.vue";
import WorkExperienceBlock from "@/Components/BuilderUi/Persons/Blocks/WorkExperienceBlock.vue";
import OtherBlock from "@/Components/BuilderUi/Persons/Blocks/OtherBlock.vue";
import PublicationBlock from "@/Components/BuilderUi/Persons/Blocks/PublicationBlock.vue";
import MetaTags from "@/componentss/shared/SEO/MetaTags.vue";
import NavigateLinks from "@/componentss/shared/navigate/NavigateLinks.vue";
import PersonBreadcrumbs from "@/componentss/features/persons/components/PersonBreadcrumbs.vue";
import BasicFooter from "@/footers/BasicFooter.vue";
import InfoSection from "@/componentss/features/persons/components/sections/InfoSection.vue";
export default {
@@ -163,21 +63,13 @@ export default {
},
components: {
PublicationBlock,
OtherBlock,
WorkExperienceBlock,
ListBlock,
EducationBlock,
PageNavigateLinks,
PersonNavLink,
PersonAvatarBlock,
InfoSection,
BasicFooter,
NavigateLinks,
MetaTags,
PersonBreadcrumbs,
AppHead,
MainPageNavBar,
ClientFooterDown,
MainNavbar,
Link,
Head
},
methods: {
textLimit(text, symbols) {
@@ -188,10 +80,6 @@ export default {
}
return text
},
openEditorImagesOnSlide: function (number) {
this.slide = number;
this.toggler = !this.toggler;
},
isSameRoute(route) {
if (this.$page.props.ziggy.location === route) {
return true
+43 -50
View File
@@ -1,39 +1,36 @@
<script>
import MainNavbar from "@/Navbars/MainNavbar.vue";
import {Head, Link} from "@inertiajs/vue3";
import FsLightbox from "fslightbox-vue/v3";
import ClientScrollTimeline from "@/Components/ClientScrollTimeline.vue";
import ClientFooterDown from "@/Components/ClientFooterDown.vue";
import AdminIndexSearch from "@/Components/AdminIndexSearch.vue";
import AdminIndexFilter from "@/Components/AdminIndexFilter.vue";
import AdminIndexHeader from "@/Components/AdminIndexHeader.vue";
import AdminIndexHeaderTitle from "@/Components/AdminIndexHeaderTitle.vue";
import ClientPostFilter from '@/Components/ClientPostFilter.vue';
import ClientPost from '@/Components/ClientPost.vue';
import ClientPostSearch from '@/Components/ClientPostSearch.vue';
import MainPageNavBar from "@/Navbars/MainPageNavbar.vue";
import NewsBreadcrumbs from "@/Components/BuilderUi/Posts/NewsBreadcrumbs.vue";
import AppHead from "@/Components/AppHead.vue";
import PostBadge from "@/Components/BuilderUi/Posts/PostBadge.vue";
import PostListBreadcrumbs from "@/componentss/features/posts/components/PostListBreadcrumbs.vue.vue";
import HeadItemsWrapper from "@/componentss/ui/wrappers/HeadItemsWrapper.vue";
import PostListSearch from "@/componentss/features/posts/components/PostListSearch.vue";
import PostListItem from "@/componentss/features/posts/components/PostListItem.vue";
import BasicFooter from "@/footers/BasicFooter.vue";
import PostListBadge from "@/componentss/features/posts/components/PostListBadge.vue";
import MetaTags from "@/componentss/shared/SEO/MetaTags.vue";
import BasicListFilter from "@/componentss/shared/filter/BasicListFilter.vue";
import SortingByFilter from "@/componentss/shared/filter/filters/SortingByFilter.vue";
import CategoryFilter from "@/componentss/shared/filter/filters/CategoryFilter.vue";
import TagFilter from "@/componentss/shared/filter/filters/TagFilter.vue";
import BasicListBadge from "@/componentss/shared/badge/BasicListBadge.vue";
export default {
name: "Index",
components: {
AppHead,
NewsBreadcrumbs,
BasicListBadge,
TagFilter,
CategoryFilter,
SortingByFilter,
BasicListFilter,
MetaTags,
PostListBadge,
BasicFooter,
PostListItem,
PostListSearch,
HeadItemsWrapper,
PostListBreadcrumbs,
MainPageNavBar,
PostBadge,
AdminIndexHeaderTitle, AdminIndexHeader,
AdminIndexFilter, AdminIndexSearch,
ClientFooterDown,
ClientScrollTimeline,
ClientPostFilter,
Link,
MainNavbar,
FsLightbox,
Head,
ClientPost,
ClientPostSearch
},
data() {
return {
@@ -63,57 +60,53 @@ export default {
type: Object,
}
},
methods: {
computed: {
hasActiveFilters() {
return this.filters.category_filter.value || this.filters.tag_filter.value || this.filters.search_filter.value;
}
},
mounted() {
}
};
</script>
<template>
<AppHead :seo="seo" />
<MetaTags :seo="seo" />
<MainPageNavBar class="border-b" :sections="$page.props.navigation"></MainPageNavBar>
<div class="flex flex-col h-screen">
<main class="flex-grow">
<div class="relative mx-auto mt-[67px] max-w-screen-xl py-10 md:flex md:flex-row md:py-10">
<div class="pt-6 lg:pt-10 pb-12 sm:px-6 lg:px-8 mx-auto">
<div class="pt-6 lg:pt-10 pb-12 sm:px-6 lg:px-8 mx-auto w-full max-w-screen-lg">
<div class="max-w-2xl text-center mx-auto mb-10 lg:mb-14">
<h2 class="text-2xl font-bold md:text-4xl md:leading-tight dark:text-white">Новости НТГСПИ</h2>
<p class="mt-1 text-gray-600 dark:text-neutral-400">Узнайте последние новости любимого вуза</p>
</div>
<NewsBreadcrumbs :breadcrumbs="breadcrumbs" class="px-5" />
<PostListBreadcrumbs :breadcrumbs="breadcrumbs" class="px-5" />
<div>
<AdminIndexHeader>
<ClientPostSearch :search_filter="filters.search_filter" />
<ClientPostFilter :sorting-by_filter="filters.sortingBy_filter" :category_filter="filters.category_filter" :tag_filter="filters.tag_filter" :tags="tags" :items="categories"/>
</AdminIndexHeader>
<HeadItemsWrapper>
<PostListSearch :search_filter="filters.search_filter" />
<BasicListFilter>
<SortingByFilter :sortingBy_filter="filters.sortingBy_filter" />
<CategoryFilter :categories="categories" :category_filter="filters.category_filter" />
<TagFilter :tags="tags" :tag_filter="filters.tag_filter" />
</BasicListFilter>
</HeadItemsWrapper>
<div v-if="filters.category_filter.value || filters.tag_filter.value || filters.search_filter.value" class="px-6">
<div v-if="hasActiveFilters" class="px-6">
<h3 class="text-sm text-gray-500 mb-4">Найдено новостей: {{ posts.meta.total }}</h3>
<div class="flex-wrap flex gap-3 md:items-center">
<PostBadge :filters="filters" />
<BasicListBadge :filters="filters" />
</div>
</div>
<!-- Avatar Media -->
<!-- End Avatar Media -->
<!-- Content -->
<div class="space-y-5 md:space-y-4">
<div class="space-y-5 md:space-y-4">
<div>
<div class="container px-4 mx-auto xl:px-5 max-w-screen-lg py-5 lg:py-8">
<div class="mt-10 grid gap-10 md:grid-cols-2 lg:gap-10 xl:grid-cols-3">
<template v-for="post in posts.data" :key="post.id">
<ClientPost :post="post" />
<PostListItem :post="post" />
</template>
</div>
<div class="mt-10 flex items-center justify-center">
@@ -144,7 +137,7 @@ export default {
</div>
</div>
</main>
<ClientFooterDown/>
<BasicFooter />
</div>
</template>
+27 -38
View File
@@ -1,44 +1,33 @@
<script>
import MainNavbar from "@/Navbars/MainNavbar.vue";
import {Head, Link} from "@inertiajs/vue3";
import FsLightbox from "fslightbox-vue/v3";
import ClientScrollTimeline from "@/Components/ClientScrollTimeline.vue";
import ClientFooterDown from "@/Components/ClientFooterDown.vue";
import ClientImageSlider from "@/Components/ClientImageSlider.vue";
import PostTitle from "@/Components/BuilderUi/Posts/PostTitle.vue";
import PostBackButton from "@/Components/BuilderUi/Posts/PostBackButton.vue";
import PostAuthorsList from "@/Components/BuilderUi/Posts/PostAuthorsList.vue";
import PostTimeRead from "@/Components/BuilderUi/Posts/PostTimeRead.vue";
import PostBuilder from "@/Components/BuilderUi/Posts/PostBuilder.vue";
import PostGallery from "@/Components/BuilderUi/Posts/PostGallery.vue";
import PostBadge from "@/Components/BuilderUi/Events/EventBadgeBuilder.vue";
import ClientPostFilter from "@/Components/ClientPostFilter.vue";
import ClientPostSearch from "@/Components/ClientPostSearch.vue";
import ClientPost from "@/Components/ClientPost.vue";
import AdminIndexHeader from "@/Components/AdminIndexHeader.vue";
import BasicTitle from "@/componentss/ui/titles/BasicTitle.vue";
import BackButton from "@/componentss/ui/buttons/BackButton.vue";
import PostItemBreadcrumbs from "@/componentss/features/posts/components/PostItemBreadcrumbs.vue";
import PostGallery from "@/componentss/features/posts/components/PostGallery.vue";
import PostTimeRead from "@/componentss/features/posts/components/PostTimeRead.vue";
import PostAuthorsList from "@/componentss/features/posts/components/PostAuthorsList.vue";
import ScrollTimeline from "@/componentss/shared/timeline/ScrollTimeline.vue";
import Builder from "@/componentss/shared/builder/pageBuilder/Builder.vue";
import BasicFooter from "@/footers/BasicFooter.vue";
import MainPageNavBar from "@/Navbars/MainPageNavbar.vue";
import PostBreadcrumbs from "@/Components/BuilderUi/Posts/PostBreadcrumbs.vue";
import AppHead from "@/Components/AppHead.vue";
import MetaTags from "@/componentss/shared/SEO/MetaTags.vue";
export default {
name: "Show",
components: {
AppHead,
PostBreadcrumbs,
MainPageNavBar,
AdminIndexHeader, ClientPost, ClientPostSearch, ClientPostFilter, PostBadge,
MetaTags,
MainPageNavBar,
BasicFooter,
Builder,
ScrollTimeline,
BasicTitle,
BackButton,
PostItemBreadcrumbs,
PostGallery,
PostBuilder,
PostTimeRead,
PostAuthorsList,
PostBackButton,
PostTitle,
ClientImageSlider,
ClientFooterDown,
ClientScrollTimeline,
Link,
MainNavbar,
FsLightbox,
Head
},
data() {
@@ -71,21 +60,21 @@ export default {
</script>
<template>
<AppHead :seo="seo" />
<MetaTags :seo="seo" />
<ClientScrollTimeline/>
<ScrollTimeline />
<MainPageNavBar class="border-b" :sections="$page.props.navigation"></MainPageNavBar>
<div class="flex flex-col h-screen">
<main class="flex-grow">
<div class="relative mx-auto mt-[67px] max-w-screen-xl px-4 py-10 md:flex md:flex-row md:py-10">
<div class="max-w-3xl lg:pt-10 pb-12 sm:px-6 lg:px-8 mx-auto">
<div class="max-w-3xl lg:pt-10 pb-12 sm:px-6 lg:px-8 mx-auto w-full">
<div>
<div class="space-y-5 md:space-y-10">
<div class="space-y-3">
<PostBreadcrumbs :breadcrumbs="breadcrumbs" :post-title="post.data.title" />
<PostBackButton link="client.post.index" title="Все новости"/>
<PostTitle :header="post.data.title"/>
<PostItemBreadcrumbs :breadcrumbs="breadcrumbs" :post-title="post.data.title" />
<BackButton link="client.post.index" title="Все новости"/>
<BasicTitle :header="post.data.title"/>
</div>
<div class="flex space-x-3 text-gray-500 ">
@@ -98,7 +87,7 @@ export default {
</div>
</div>
</div>
<PostBuilder :blocks="blocks"/>
<Builder :blocks="blocks"/>
<div>
@@ -117,7 +106,7 @@ export default {
</div>
</main>
<ClientFooterDown/>
<BasicFooter />
</div>
</template>
+30 -61
View File
@@ -1,54 +1,31 @@
<script>
import MainNavbar from "@/Navbars/MainNavbar.vue";
import {Head, Link} from "@inertiajs/vue3";
import FsLightbox from "fslightbox-vue/v3";
import ClientScrollTimeline from "@/Components/ClientScrollTimeline.vue";
import ClientFooterDown from "@/Components/ClientFooterDown.vue";
import AdminIndexSearch from "@/Components/AdminIndexSearch.vue";
import AdminIndexFilter from "@/Components/AdminIndexFilter.vue";
import AdminIndexHeader from "@/Components/AdminIndexHeader.vue";
import AdminIndexHeaderTitle from "@/Components/AdminIndexHeaderTitle.vue";
import ClientPostFilter from '@/Components/ClientPostFilter.vue';
import ClientPost from '@/Components/ClientPost.vue';
import ClientPostSearch from '@/Components/ClientPostSearch.vue';
import LevelEduFilter from "@/Components/BuilderUi/Programs/Filters/LevelEduFilter.vue";
import ClientProgramFilter from "@/Components/ClientProgramFilter.vue";
import PostAuthorsList from "@/Components/BuilderUi/Posts/PostAuthorsList.vue";
import PostTimeRead from "@/Components/BuilderUi/Posts/PostTimeRead.vue";
import PostBackButton from "@/Components/BuilderUi/Posts/PostBackButton.vue";
import PostTitle from "@/Components/BuilderUi/Posts/PostTitle.vue";
import PostBuilder from "@/Components/BuilderUi/Posts/PostBuilder.vue";
import PostGallery from "@/Components/BuilderUi/Posts/PostGallery.vue";
import MainPageNavBar from "@/Navbars/MainPageNavbar.vue";
import ProgramListBreadcrumbs from "@/Components/BuilderUi/Programs/ProgramListBreadcrumbs.vue";
import ClientAdditionalProgramFilter
from "@/Components/BuilderUi/AdditionalEducationPrograms/ClientAdditionalProgramFilter.vue";
import ProgramBadge from "@/Components/BuilderUi/AdditionalEducationPrograms/ProgramBadge.vue";
import AdditionalEducationProgramListBreadcrumbs
from "@/Components/BuilderUi/AdditionalEducationPrograms/AdditionalEducationProgramListBreadcrumbs.vue";
import AppHead from "@/Components/AppHead.vue";
import FormEducationalFilter from "@/componentss/shared/filter/filters/FormEducationalFilter.vue";
import DirectionFilter from "@/componentss/shared/filter/filters/DirectionFilter.vue";
import BudgetFilter from "@/componentss/shared/filter/filters/BudgetFilter.vue";
import BasicListFilter from "@/componentss/shared/filter/BasicListFilter.vue";
import ProgramTitle from "@/componentss/features/educationalPrograms/components/ProgramTitle.vue";
import MetaTags from "@/componentss/shared/SEO/MetaTags.vue";
import ProgramListBreadcrumbs from "@/componentss/features/educationalPrograms/components/ProgramListBreadcrumbs.vue";
import BasicFooter from "@/footers/BasicFooter.vue";
import ProgramLevelEduFilter from "@/componentss/features/educationalPrograms/components/ProgramLevelEduFilter.vue";
export default {
name: "Index",
components: {
AppHead,
AdditionalEducationProgramListBreadcrumbs, ProgramBadge, ClientAdditionalProgramFilter,
ProgramLevelEduFilter,
FormEducationalFilter,
DirectionFilter,
BudgetFilter,
BasicListFilter,
ProgramTitle,
MetaTags,
BasicFooter,
ProgramListBreadcrumbs,
MainPageNavBar,
PostGallery, PostBuilder, PostTitle, PostBackButton, PostTimeRead, PostAuthorsList,
ClientProgramFilter,
LevelEduFilter,
AdminIndexHeaderTitle, AdminIndexHeader,
AdminIndexFilter, AdminIndexSearch,
ClientFooterDown,
ClientScrollTimeline,
ClientPostFilter,
Link,
MainNavbar,
FsLightbox,
Head,
ClientPost,
ClientPostSearch
},
data() {
return {
@@ -101,15 +78,13 @@ export default {
},
},
mounted() {
}
};
</script>
<template>
<AppHead :seo="seo" />
<MetaTags :seo="seo" />
<MainPageNavBar class="border-b" :sections="$page.props.navigation"></MainPageNavBar>
<MainPageNavBar class="border-b" :sections="$page.props.navigation" />
<div class="flex flex-col h-screen">
@@ -118,23 +93,19 @@ export default {
<div class="">
<div class="">
<div class="space-y-5 md:space-y-4">
<h1 class="text-brand-primary text-center mb-3 mt-2 text-3xl font-semibold tracking-tight dark:text-white lg:text-[40px] lg:leading-tight">
{{ this.campaignName }}
</h1>
<div class="space-y-5 md:space-y-4 mx-auto max-w-3xl">
<ProgramTitle class="text-center" :header="this.campaignName" />
<div class="space-y-5 md:space-y-4 mx-auto max-w-3xl w-full">
<div>
<div class="">
<div class="my-10 w-full">
<ProgramListBreadcrumbs :breadcrumbs="breadcrumbs" />
<ProgramListBreadcrumbs />
<div class="flex items-center gap-x-2">
<LevelEduFilter :levels="levelsEducational" :level_filter="filters.level_filter" />
<ClientProgramFilter
:budget_filter="filters.budget_filter"
:direction_filter="filters.direction_filter"
:formEdu_filter="filters.formEdu_filter"
:types_budget="budgetEdu"
:direction_studies="direction_studies"
:forms_educational="formsEdu" />
<ProgramLevelEduFilter :levels="levelsEducational" :level_filter="filters.level_filter" />
<BasicListFilter>
<BudgetFilter :budget_filter="filters.budget_filter" :types_budget="budgetEdu" />
<DirectionFilter :direction_studies="direction_studies" :direction_filter="filters.direction_filter" />
<FormEducationalFilter :formEdu_filter="filters.formEdu_filter" :forms_educational="formsEdu" />
</BasicListFilter>
</div>
</div>
</div>
@@ -166,12 +137,10 @@ export default {
</div>
</div>
</main>
<ClientFooterDown/>
<BasicFooter />
</div>
</template>
<style scoped></style>
+33 -92
View File
@@ -1,54 +1,34 @@
<script>
import MainNavbar from "@/Navbars/MainNavbar.vue";
import {Head, Link} from "@inertiajs/vue3";
import FsLightbox from "fslightbox-vue/v3";
import ClientScrollTimeline from "@/Components/ClientScrollTimeline.vue";
import ClientFooterDown from "@/Components/ClientFooterDown.vue";
import ClientPostFilter from "@/Components/ClientPostFilter.vue";
import ClientPost from "@/Components/ClientPost.vue";
import AdminIndexHeader from "@/Components/AdminIndexHeader.vue";
import ClientPostSearch from "@/Components/ClientPostSearch.vue";
import ClientProgramFilter from "@/Components/ClientProgramFilter.vue";
import LevelEduFilter from "@/Components/BuilderUi/Programs/Filters/LevelEduFilter.vue";
import {Link} from "@inertiajs/vue3";
import MainPageNavBar from "@/Navbars/MainPageNavbar.vue";
import FormBlock from "@/Components/BuilderUi/Pages/Blocks/FormBlock.vue";
import ProgramItemBreadcrumbs from "@/Components/BuilderUi/Programs/ProgramItemBreadcrumbs.vue";
import AdditionalEducationProgramItemBreadcrumbs
from "@/Components/BuilderUi/AdditionalEducationPrograms/AdditionalEducationProgramItemBreadcrumbs.vue";
import ProgramTitle from "@/Components/BuilderUi/AdditionalEducationPrograms/ProgramTitle.vue";
import ProgramBuilder from "@/Components/BuilderUi/AdditionalEducationPrograms/ProgramBuilder.vue";
import ProgramBackButton from "@/Components/BuilderUi/Programs/ProgramBackButton.vue";
import BaseBuilder from "@/Components/BaseComponents/BaseBuilderUi/BaseBuilder.vue";
import AppHead from "@/Components/AppHead.vue";
import EducationForm from "../../../Enum/EducationForm.js";
import Builder from "@/componentss/shared/builder/pageBuilder/Builder.vue";
import BasicFooter from "@/footers/BasicFooter.vue";
import BackButton from "@/componentss/ui/buttons/BackButton.vue";
import MetaTags from "@/componentss/shared/SEO/MetaTags.vue";
import BasicTitle from "@/componentss/ui/titles/BasicTitle.vue";
import ProgramItemBreadcrumbs from "@/componentss/features/educationalPrograms/components/ProgramItemBreadcrumbs.vue";
import ProgramTitle from "@/componentss/features/educationalPrograms/components/ProgramTitle.vue";
export default {
name: "Show",
components: {
AppHead,
BaseBuilder,
ProgramBackButton, ProgramBuilder, ProgramTitle, AdditionalEducationProgramItemBreadcrumbs,
ProgramItemBreadcrumbs,
FormBlock,
MainPageNavBar,
LevelEduFilter, ClientProgramFilter,
ClientPostSearch,
AdminIndexHeader,
ClientPost,
ClientPostFilter,
ClientFooterDown, ClientScrollTimeline, Link, MainNavbar, FsLightbox, Head},
data() {
return {
blocks: this.blocksWithSlideNumber,
userData: this.$page.props.auth.user,
toggler: false,
togglerGallery: false,
editorImages: [],
galleryImages: [],
slide: 1,
gallerySlide: 1,
computed: {
EducationForm() {
return EducationForm
}
},
components: {
ProgramTitle,
BasicTitle,
MetaTags,
BackButton,
BasicFooter,
Builder,
ProgramItemBreadcrumbs,
MainPageNavBar,
Link
},
props: {
program: {
type: Array,
@@ -59,33 +39,19 @@ export default {
seo: {
type: Object,
}
},
methods: {
getFormOfStudy(contests) {
const formOfStudyArray = Array.from(new Set(contests.map(item => item.form_edu)));
return formOfStudyArray;
},
getYearOfStudy(contests) {
const YearOfStudyArray = Array.from(new Set(contests.map(item => item.period_data)));
return YearOfStudyArray;
}
},
}
</script>
<template>
<AppHead :seo="seo" />
<MetaTags :seo="seo" />
<MainPageNavBar class="border-b" :sections="$page.props.navigation"></MainPageNavBar>
<MainPageNavBar class="border-b" :sections="$page.props.navigation" />
<div class="flex flex-col h-screen">
<main class="flex-grow">
<div class="relative mb-auto mx-auto mt-[67px] max-w-screen-xl px-4 py-10 md:flex md:flex-row md:py-10">
<div class="px-0 pt-6 lg:pt-10 pb-12 sm:px-6 lg:px-8 mx-auto">
<div class="px-0 pt-6 lg:pt-10 pb-12 sm:px-6 lg:px-8 mx-auto w-full max-w-screen-md">
<div>
<div class="space-y-5 md:space-y-4">
@@ -94,7 +60,7 @@ export default {
<div>
<div class="container mx-auto xl:px-5 max-w-screen-lg py-5 lg:py-8">
<div class="space-y-3">
<ProgramBackButton link="client.program.index" title="Все программы" />
<BackButton link="client.program.index" title="Все программы" />
<ProgramItemBreadcrumbs :program-title="program.data.name" />
<ProgramTitle :header="program.data.name" />
@@ -134,22 +100,6 @@ export default {
</div>
<!-- End Icon Block -->
<!-- Icon Block -->
<!-- <div class="text-center">-->
<!-- <div class="flex justify-center items-center size-12 bg-gray-50 border border-gray-200 rounded-full mx-auto">-->
<!-- <svg class="flex-shrink-0 size-5 text-gray-600" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z"/><path d="M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z"/></svg>-->
<!-- </div>-->
<!-- <div class="mt-3">-->
<!-- <h3 class="text-lg font-semibold text-gray-800">Форма обучения</h3>-->
<!-- <template v-for="form in getFormOfStudy(program.data.learning_forms)">-->
<!-- <p class="mt-1 text-gray-600">{{ form }}</p>-->
<!-- </template>-->
<!-- </div>-->
<!-- </div>-->
<!-- End Icon Block -->
<!-- Icon Block -->
<div class="text-center">
<div class="flex justify-center items-center size-12 bg-gray-50 border border-gray-200 rounded-full mx-auto">
@@ -162,8 +112,8 @@ export default {
<template v-for="admissionPlan in program.data.admissionPlans">
<template v-for="contest in admissionPlan.contests">
<div class="border rounded my-2 py-1">
<span class="text-gray-500 text-[14px]">{{ (contest.form_education === '1') ? 'Очная форма обучения' : 'Заочная форма обучения' }}</span>
<p v-for="place in contest.places" class="mt-1 text-gray-600">{{ place.count }} мест <span class="text-gray-400 text-[12px]">{{ formsEdu[place.form_budget] }}</span></p>
<span class="text-gray-500 text-[14px]">{{ EducationForm.fromValue(parseInt(contest.form_education)).label }}</span>
<p class="mt-1 text-gray-600">{{ contest.position_count }} мест <span class="text-gray-400 text-[12px]">{{ formsEdu[contest.financing_source] }}</span></p>
</div>
</template>
</template>
@@ -212,7 +162,7 @@ export default {
</button>
<div id="hs-basic-bordered-collapse-two" class="hs-accordion-content hidden w-full overflow-hidden transition-[height] duration-300" aria-labelledby="hs-bordered-heading-two">
<div class="pb-4 px-5">
<BaseBuilder :blocks="program.data.about_program" />
<Builder :blocks="program.data.about_program" />
</div>
</div>
</div>
@@ -230,7 +180,7 @@ export default {
</button>
<div id="hs-basic-bordered-collapse-three" class="hs-accordion-content hidden w-full overflow-hidden transition-[height] duration-300" aria-labelledby="hs-bordered-heading-three">
<div class="pb-4 px-5">
<BaseBuilder :blocks="program.data.program_features" />
<Builder :blocks="program.data.program_features" />
</div>
</div>
</div>
@@ -247,21 +197,12 @@ export default {
</div>
</div>
</main>
<ClientFooterDown/>
<BasicFooter />
</div>
</template>
<style>
.paragraph-container a {
@apply text-[#1E57A3];
@apply underline;
}
.paragraph-container p {
@apply mb-2
}
</style>
+26 -21
View File
@@ -1,11 +1,15 @@
<script>
import MainNavbar from "@/Navbars/MainNavbar.vue";
import ClientFooterDown from "@/Components/ClientFooterDown.vue";
import { debounce } from "lodash";
import { Link } from "@inertiajs/vue3";
import MainPageNavBar from "@/Navbars/MainPageNavbar.vue";
import BaseIcon from "@/Components/BaseComponents/BaseIcon.vue";
import ClientScheduleFilter from "@/Components/BuilderUi/Schedules/ClientScheduleFilter.vue";
import ScheduleListTitle from "@/componentss/features/schedules/components/ScheduleListTitle.vue";
import ScheduleListFilter from "@/componentss/features/schedules/components/ScheduleListFilter.vue";
import BasicIcon from "@/componentss/ui/icons/BasicIcon.vue";
import BasicFooter from "@/footers/BasicFooter.vue";
import BasicListFilter from "@/componentss/shared/filter/BasicListFilter.vue";
import FormEducationalFilter from "@/componentss/shared/filter/filters/FormEducationalFilter.vue";
export default {
name: "Index",
@@ -17,7 +21,12 @@ export default {
loading: false,
};
},
components: {ClientScheduleFilter, BaseIcon, MainPageNavBar, ClientFooterDown, MainNavbar, Link},
components: {
FormEducationalFilter,
BasicListFilter,
BasicFooter,
ScheduleListFilter,
ScheduleListTitle, BasicIcon, MainPageNavBar, MainNavbar, Link},
props: {
navigation: {
@@ -127,17 +136,10 @@ export default {
<article class="w-full min-w-0 mt-4 px-1 md:px-6">
<div class="relative overflow-hidden">
<div class="max-w-[85rem] mx-auto sm:px-6 lg:px-8 py-10 sm:pb-12 sm:py-5">
<div class="">
<h1 class="text-2xl sm:text-4xl font-bold text-gray-800 text-center">
Расписание занятий
</h1>
<div class="">
<p class="mt-3 text-gray-600 text-center">
Просто введите название группы
</p>
</div>
<div>
<ScheduleListTitle
bottom-text="Просто введите название группы"
header="Расписание занятий" />
<div class="mt-7 sm:mt-12 mx-auto max-w-xl relative space-y-4">
<!-- Form -->
<form>
@@ -168,17 +170,19 @@ export default {
<button
@click="toggleShowFavorites"
type="button"
:disabled="favoriteGroups.length === 0 || loading"
:disabled="favoriteGroups?.length === 0 || loading"
:class="
filters.favorite_filter.value !== null ? 'bg-primaryBlue text-white hover:bg-secondDarkBlue': 'text-gray-700 hover:bg-gray-100',
loading ? 'animate-pulse' : ''
"
class="flex w-full py-2 px-4 items-center gap-x-2 text-xs font-medium rounded-lg border border-gray-200 focus:outline-none disabled:opacity-50 disabled:pointer-events-none"
>
<BaseIcon name="heart" class="shrink-0 size-4"/>
<BasicIcon name="heart" class="shrink-0 size-4"/>
<span>Избранное</span>
</button>
<ClientScheduleFilter :forms_educational="this.forms_education" :form-edu_filter="this.filters.form_education_filter" />
<ScheduleListFilter>
<FormEducationalFilter :forms="this.forms_education" :form-edu_filter="this.filters.form_education_filter" />
</ScheduleListFilter>
</div>
</div>
</div>
@@ -198,13 +202,13 @@ export default {
<div class="flex py-4 px-5 gap-x-3">
<button @click="toggleFavorite(educationalGroup.data.id)">
<transition name="heart" mode="out-in">
<BaseIcon
<BasicIcon
v-if="isFavorite(educationalGroup.data.id)"
name="heart_filled"
class="shrink-0 size-4 text-red-500"
key="filled"
/>
<BaseIcon
<BasicIcon
v-else
name="heart"
class="shrink-0 size-4"
@@ -247,7 +251,8 @@ export default {
</article>
</div>
</main>
<ClientFooterDown/>
<BasicFooter />
</div>
</template>
+1 -2
View File
@@ -1,6 +1,5 @@
<script>
import MainNavbar from "@/Navbars/MainNavbar.vue";
import ClientFooterDown from "@/Components/ClientFooterDown.vue";
import {debounce} from "lodash";
import {Link} from "@inertiajs/vue3";
import MainPageNavBar from "@/Navbars/MainPageNavbar.vue";
@@ -15,7 +14,7 @@ export default {
timeSchedules: ['09:00 - 10:35', '10:55 - 12:30', '13:00 - 14:35', '14:45 - 16:20', '16:30 - 18:00']
}
},
components: {MainPageNavBar, ClientFooterDown, MainNavbar, Link},
components: {MainPageNavBar, MainNavbar, Link},
props: [
'schedule',
'searchRequest',
-243
View File
@@ -1,243 +0,0 @@
<script>
import MainNavbar from "@/Navbars/MainNavbar.vue";
import {Head, Link} from "@inertiajs/vue3";
import FsLightbox from "fslightbox-vue/v3";
import ClientScrollTimeline from "@/Components/ClientScrollTimeline.vue";
import ClientFooterDown from "@/Components/ClientFooterDown.vue";
export default {
name: "Show",
components: {ClientFooterDown, ClientScrollTimeline, Link, MainNavbar, FsLightbox, Head},
data() {
return {
blocks: this.blocksWithSlideNumber,
userData: this.$page.props.auth.user,
toggler: false,
togglerGallery: false,
editorImages: [],
galleryImages: [],
slide: 1,
gallerySlide: 1,
}
},
props: {
post: {
type: Array,
},
mainSections: {
type: Array
}
},
methods: {
textLimit(text, symbols) {
if (text.length > symbols) {
let LimitedText
LimitedText = text.substring(0, symbols)
return LimitedText + "..."
}
return text
},
openEditorImagesOnSlide: function(number) {
this.slide = number;
this.toggler = !this.toggler;
},
openGalleryImagesOnSlide: function(number) {
this.gallerySlide = number;
this.togglerGallery = !this.togglerGallery;
},
},
mounted() {
this.editorImages = this.blocksWithSlideNumber
.filter(block => block.type === 'image')
.map(block => block.data.file.url);
this.galleryImages = this.post.data.gallery.images
.map(image => image.path)
},
computed: {
blocksWithSlideNumber() {
let slideNumber = 1;
return this.post.data.content.blocks.map((block) => {
if (block.type === "image") {
block.slideNumber = slideNumber;
slideNumber++;
}
return block;
});
},
}
}
</script>
<template>
<Head>
<title>{{ post.data.title }}</title>
<meta name="description" content="Your page description">
</Head>
<MainNavbar class="border-b" :sections="this.mainSections"></MainNavbar>
<div class="relative mx-auto mt-[67px] max-w-screen-xl px-4 py-10 md:flex md:flex-row md:py-10">
<div class="max-w-3xl px-4 pt-6 lg:pt-10 pb-12 sm:px-6 lg:px-8 mx-auto">
<div>
<!-- Avatar Media -->
<!-- End Avatar Media -->
<!-- Content -->
<div class="space-y-5 md:space-y-4">
<div class="space-y-3">
<h2 class="text-2xl font-bold md:text-3xl dark:text-white">{{ post.data.title }}</h2>
</div>
<div class="flex justify-between border-t border-b border-gray-300 py-4 items-center mb-6">
<div class="flex w-full sm:items-center gap-x-5 sm:gap-x-3">
<div class="grow">
<div class="grid sm:flex sm:justify-between sm:items-center gap-2">
<ol class="flex items-center whitespace-nowrap min-w-0" aria-label="Breadcrumb">
<li class="text-sm">
<a class="flex items-center text-gray-500 hover:text-blue-600" href="#">
Главная
<svg class="flex-shrink-0 mx-3 overflow-visible h-2.5 w-2.5 text-gray-400 dark:text-gray-600" width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M5 1L10.6869 7.16086C10.8637 7.35239 10.8637 7.64761 10.6869 7.83914L5 14" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
</svg>
</a>
</li>
<li class="text-sm">
<a class="flex items-center text-gray-500 hover:text-blue-600" href="#">
Новости
<svg class="flex-shrink-0 mx-3 overflow-visible h-2.5 w-2.5 text-gray-400 dark:text-gray-600" width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M5 1L10.6869 7.16086C10.8637 7.35239 10.8637 7.64761 10.6869 7.83914L5 14" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
</svg>
</a>
</li>
<li class="text-sm font-semibold text-gray-800 truncate dark:text-gray-200" aria-current="page">
{{ textLimit(post.data.title, 15) }}
</li>
</ol>
<div class="flex items-center">
<ul class="block text-xs text-gray-500 mr-3">
<li class="inline-block relative pr-6 last:pr-0 last-of-type:before:hidden before:absolute before:top-1/2 before:right-2 before:-translate-y-1/2 before:w-1 before:h-1 before:bg-gray-300 before:rounded-full dark:text-gray-400 dark:before:bg-gray-600">
Опубликовано: {{ post.data.created_post }}
</li>
</ul>
<div class="hs-tooltip [--trigger:hover] [--placement:bottom]">
<div class="hs-tooltip-toggle sm:mb-1 block text-left cursor-pointer">
<span class="font-normal text-sm text-gray-800 dark:text-gray-200 underline hover:text-gray-500">
{{ post.data.authors.length === 0 ? '' : textLimit(post.data.authors[0].name, 10) }}
</span>
<!-- Dropdown Card -->
<div class="hs-tooltip-content hs-tooltip-shown:opacity-100 hs-tooltip-shown:visible opacity-0 transition-opacity inline-block absolute invisible z-10 max-w-xs cursor-default bg-gray-900 divide-y divide-gray-700 shadow-lg rounded-xl dark:bg-black" role="tooltip">
<!-- Body -->
<div class="p-4 sm:p-5">
<div class="mb-2 flex w-full sm:items-center gap-x-5 sm:gap-x-3">
<div class="grow">
<p class="text-lg font-semibold text-gray-200">
{{ post.data.authors.length === 0 ? '' : post.data.authors[0].name }}
</p>
</div>
</div>
<p class="text-sm text-gray-400">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</p>
</div>
<!-- End Body -->
<!-- Footer -->
<!-- End Footer -->
</div>
<!-- End Dropdown Card -->
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<template v-for="block in blocksWithSlideNumber">
<div v-if="block.type === 'image'">
<figure>
<img loading="lazy" @click="openEditorImagesOnSlide(block.slideNumber)" :src="block.data.file.url" class="w-full max-h-[500px] object-cover rounded-lg hover:opacity-95 hover:duration-200 transition" :alt="block.data.caption">
<figcaption class="mt-3 text-sm text-center text-gray-500">
{{ block.data.caption }}
</figcaption>
</figure>
</div>
<div v-if="block.type === 'paragraph'">
<p class="text-[16px] text-gray-800 dark:text-gray-200 text-justify leading-7">{{ block.data.text }}</p>
</div>
<div class="" v-if="block.type === 'list'">
<ul class="list-inside" :class="{ 'list-disc': block.data.style === 'unordered' }">
<li class="text-[16px] text-gray-800 dark:text-gray-200 text-justify leading-7" v-for="item in block.data.items" v-html="item"></li>
</ul>
</div>
<div v-if="block.type === 'attaches'">
<div class="flex border rounded-lg px-4 py-2 items-center justify-between">
<div class="flex items-center">
<div class="w-[35px] h-[35px] bg-black flex justify-center items-center rounded-xl mr-2">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6"> <path stroke-linecap="round" stroke-linejoin="round" d="M18.375 12.739l-7.693 7.693a4.5 4.5 0 01-6.364-6.364l10.94-10.94A3 3 0 1119.5 7.372L8.552 18.32m.009-.01l-.01.01m5.699-9.941l-7.81 7.81a1.5 1.5 0 002.112 2.13" stroke="white" /> </svg>
</div>
<div>{{ block.data.title }}</div>
</div>
<a :href="block.data.file.url" download type="button" class="w-[35px] h-[35px] flex bg-gray-100 rounded-lg justify-center items-center hover:bg-gray-200 duration-200">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6">
<path stroke-linecap="round" stroke-linejoin="round" d="M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3" />
</svg>
</a>
</div>
</div>
</template>
<div v-if="galleryImages.length" class="grid gap-4 border-t border-gray-300 py-4">
<div class="relative">
<img class="filter brightness-[0.7] w-full max-h-[500px] object-cover rounded-lg hover:opacity-95 hover:duration-200 transition" :src="galleryImages[0]" data-hs-overlay="#hs-large-modal" alt="">
<div class="absolute inset-x-0 bottom-5 flex flex-col justify-center items-center">
<p class="text-white text-sm lg:text-xl text-center">{{ post.data.title }}</p>
<span class="text-gray-400 text-sm">{{ galleryImages.length }} фотографий</span>
</div>
</div>
</div>
</div>
<!-- End Content -->
</div>
</div>
<div style="z-index: 1000" id="hs-large-modal" class="hs-overlay hidden w-full h-full fixed top-0 left-0 z-[60] overflow-x-hidden overflow-y-auto">
<div class="hs-overlay-open:mt-7 hs-overlay-open:opacity-100 hs-overlay-open:duration-500 mt-0 opacity-0 ease-out transition-all lg:max-w-4xl lg:w-full m-3 lg:mx-auto">
<div class="flex flex-col bg-white border shadow-sm rounded-xl dark:bg-gray-800 dark:border-gray-700 dark:shadow-slate-700/[.7]">
<div class="flex justify-between items-center py-3 px-4 border-b dark:border-gray-700">
<h3 class="font-bold text-gray-800 dark:text-white">
Галлерея: {{ post.data.title }}
</h3>
<button type="button" class="hs-dropdown-toggle inline-flex flex-shrink-0 justify-center items-center h-8 w-8 rounded-md text-gray-500 hover:text-gray-400 focus:outline-none focus:ring-2 focus:ring-gray-400 focus:ring-offset-2 focus:ring-offset-white transition-all text-sm dark:focus:ring-gray-700 dark:focus:ring-offset-gray-800" data-hs-overlay="#hs-large-modal">
<span class="sr-only">Close</span>
<svg class="w-3.5 h-3.5" width="8" height="8" viewBox="0 0 8 8" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0.258206 1.00652C0.351976 0.912791 0.479126 0.860131 0.611706 0.860131C0.744296 0.860131 0.871447 0.912791 0.965207 1.00652L3.61171 3.65302L6.25822 1.00652C6.30432 0.958771 6.35952 0.920671 6.42052 0.894471C6.48152 0.868271 6.54712 0.854471 6.61352 0.853901C6.67992 0.853321 6.74572 0.865971 6.80722 0.891111C6.86862 0.916251 6.92442 0.953381 6.97142 1.00032C7.01832 1.04727 7.05552 1.1031 7.08062 1.16454C7.10572 1.22599 7.11842 1.29183 7.11782 1.35822C7.11722 1.42461 7.10342 1.49022 7.07722 1.55122C7.05102 1.61222 7.01292 1.6674 6.96522 1.71352L4.31871 4.36002L6.96522 7.00648C7.05632 7.10078 7.10672 7.22708 7.10552 7.35818C7.10442 7.48928 7.05182 7.61468 6.95912 7.70738C6.86642 7.80018 6.74102 7.85268 6.60992 7.85388C6.47882 7.85498 6.35252 7.80458 6.25822 7.71348L3.61171 5.06702L0.965207 7.71348C0.870907 7.80458 0.744606 7.85498 0.613506 7.85388C0.482406 7.85268 0.357007 7.80018 0.264297 7.70738C0.171597 7.61468 0.119017 7.48928 0.117877 7.35818C0.116737 7.22708 0.167126 7.10078 0.258206 7.00648L2.90471 4.36002L0.258206 1.71352C0.164476 1.61976 0.111816 1.4926 0.111816 1.36002C0.111816 1.22744 0.164476 1.10028 0.258206 1.00652Z" fill="currentColor"/>
</svg>
</button>
</div>
<div class="p-4 overflow-y-auto">
<div class="grid grid-cols-2 md:grid-cols-3 gap-4">
<template v-for="(image, key) in galleryImages.slice()">
<div>
<img loading="lazy" @click="openGalleryImagesOnSlide(key + 1)" class="h-[200px] w-full object-cover rounded-lg hover:scale-[1.05] hover:opacity-95 hover:duration-200 transition" :src="image" alt="">
</div>
</template>
</div>
</div>
</div>
</div>
</div>
<FsLightbox class="z-1100" :slide="gallerySlide" :toggler="togglerGallery" :sources="galleryImages" />
<FsLightbox class="z-1000" :slide="slide" :toggler="toggler" :sources="editorImages" />
</div>
<ClientFooterDown />
</template>
<style scoped>
</style>