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
@@ -0,0 +1,81 @@
<template>
<div class="min-w-[12rem] py-1 space-y-3">
<button @click.prevent="clearFilter" class="text-gray-500 text-sm flex gap-x-1 items-center hover:text-gray-700">
<BasicIcon class="w-4 h-4" name="delete" />
<span>Очистить</span>
</button>
<div class="divide-y divide-gray-200 dark:divide-gray-700 max-h-[30vh] overflow-y-auto">
<div>
<div class="flex flex-col ml-3">
<div v-for="(form, index) in forms">
<input v-model="formEdu" :value="index" @change="filter"
type="radio" class="shrink-0 mt-0.5 border-gray-200 rounded-full text-blue-600 focus:ring-blue-500 disabled:opacity-50 disabled:pointer-events-none"
:id="'inp-tag' + index">
<label :for="'inp-tag' + index" class="text-sm text-gray-500 ms-3 dark:text-neutral-400">{{ form }}</label>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import {Link} from "@inertiajs/vue3";
import BasicIcon from "@/componentss/ui/icons/BasicIcon.vue";
import {debounce} from "lodash";
export default {
name: "FormEducationalFilter",
components: {
BasicIcon,
Link,
},
data() {
return {
formEdu: this.formEdu_filter.value || [],
}
},
methods: {
filter: debounce(function () {
let url = new URL(window.location.href);
url.searchParams.delete('page');
url.searchParams.delete('form');
let newUrl = url.toString();
this.$inertia.visit(newUrl, {
method: 'get',
preserveState: true,
data: {
form: this.formEdu,
},
});
}, 500),
clearFilter() {
let url = new URL(window.location.href);
url.searchParams.delete('form');
this.formEdu = [];
this.searchTerm = ''; // Сбросить поле поиска
let newUrl = url.toString();
this.$inertia.visit(newUrl, {
method: 'get',
preserveState: true,
});
},
},
computed: {
},
props: {
forms: {
type: Object,
},
formEdu_filter: {
type: Object,
},
},
}
</script>
<style scoped>
</style>
@@ -0,0 +1,56 @@
<template>
<!--Фильтр-->
<button type="button"
aria-haspopup="dialog" aria-expanded="false" aria-controls="hs-offcanvas-example" data-hs-overlay="#hs-offcanvas-example"
class="flex w-full py-2 px-4 items-center gap-x-2 text-xs font-medium rounded-lg border border-gray-200 text-gray-700 hover:bg-gray-100 focus:outline-none focus:bg-primaryBlue focus:text-white disabled:opacity-50 disabled:pointer-events-none">
<BasicIcon class="shrink-0 size-4" name="settings" />
<span>Фильтры</span>
</button>
<!--Конец Фильтра-->
<div id="hs-offcanvas-example" class="hs-overlay hs-overlay-open:translate-x-0 hidden -translate-x-full fixed top-0 start-0 transition-all duration-300 transform h-full max-w-xs w-full z-[80] bg-white border-e overflow-auto" role="dialog" tabindex="-1" aria-labelledby="hs-offcanvas-example-label">
<div class="flex justify-between items-center py-3 px-4 border-b">
<h3 id="hs-offcanvas-example-label" class="font-bold text-gray-800">
Фильтры
</h3>
<button type="button" class="size-8 inline-flex justify-center items-center gap-x-2 rounded-full border border-transparent bg-gray-100 text-gray-800 hover:bg-gray-200 focus:outline-none focus:bg-gray-200 disabled:opacity-50 disabled:pointer-events-none" aria-label="Close" data-hs-overlay="#hs-offcanvas-example">
<span class="sr-only">Close</span>
<svg class="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="M18 6 6 18"></path>
<path d="m6 6 12 12"></path>
</svg>
</button>
</div>
<div class="p-4">
<div class="hs-accordion-group">
<slot />
</div>
</div>
</div>
</template>
<script>
import BasicIcon from "@/componentss/ui/icons/BasicIcon.vue";
export default {
name: "ScheduleListFilter",
components: {BasicIcon},
props: {
faculty_filter: {
type: Object,
},
formEdu_filter: {
type: Object
},
forms_educational: {
type: Object
}
},
}
</script>
<style scoped>
</style>
@@ -0,0 +1,50 @@
<template>
<h1 class="text-2xl sm:text-4xl font-bold text-gray-800 text-center">
{{ header }}
</h1>
<p class="mt-3 text-gray-600 text-center">
{{ bottomText }}
</p>
</template>
<script>
import {Link} from "@inertiajs/vue3";
import slugify from "slugify";
export default {
name: "ScheduleListTitle",
components: {Link},
data() {
return {
}
},
methods: {
textLimit(text, symbols) {
if (text.length > symbols) {
let LimitedText
LimitedText = text.substring(0, symbols)
return LimitedText + "..."
}
return text
},
},
props: {
header: {
type: String,
required: true
},
bottomText: {
type: String,
required: true,
}
},
}
</script>
<style scoped>
</style>