Много всего

This commit is contained in:
brusnitsyn
2025-12-12 17:10:05 +09:00
parent 54f36e91fa
commit 98e9f8b52e
25 changed files with 1118 additions and 145 deletions

View File

@@ -1,27 +1,66 @@
// composables/useMedicalHistoryFilter.js
import { router, usePage } from '@inertiajs/vue3'
import {ref, computed, watch} from 'vue'
import { stringifyQuery } from 'ufo'
import {format, isValid, parse, parseISO} from 'date-fns'
import {useDebounceFn} from "@vueuse/core";
import { ref, computed, watch } from 'vue'
import { usePage, router } from '@inertiajs/vue3'
import { useDebounceFn } from '@vueuse/core'
import { format, parse, isValid, parseISO } from 'date-fns'
export const useMedicalHistoryFilter = (filters) => {
export const useMedicalHistoryFilter = (initialFilters = {}) => {
const page = usePage()
// Реактивные фильтры с начальными значениями из URL
const filtersRef = ref({
search: filters?.search || '',
date_extract_from: filters?.date_extract_from || null,
date_extract_to: filters?.date_extract_to || null,
page: filters?.page || 1,
page_size: filters?.page_size || 15,
sort_by: filters?.sort_by || 'date_extract',
sort_order: filters?.sort_order || 'desc',
view_type: filters?.view_type || 'archive'
search: initialFilters?.search || '',
date_extract_from: initialFilters?.date_extract_from || null,
date_extract_to: initialFilters?.date_extract_to || null,
page: initialFilters?.page || 1,
page_size: initialFilters?.page_size || 50,
sort_by: initialFilters?.sort_by || 'dateextract',
sort_order: initialFilters?.sort_order || 'desc',
view_type: initialFilters?.view_type || 'si',
status: initialFilters?.status || null,
database: initialFilters?.database || 'separate', // НОВЫЙ ПАРАМЕТР: postgresql, mssql, smart, separate
})
// Метаданные для разных типов данных
const meta = computed(() => {
const cards = page.props.cards
// Для раздельного поиска
if (filtersRef.value.database === 'separate') {
return {
si: cards.si.meta || {},
mis: cards.mis.meta || {},
stats: cards.stats || {},
}
} else if (filtersRef.value.database === 'mis') {
return {
mis: cards.mis?.meta
}
} else {
return {
si: cards.si?.meta
}
}
})
const meta = computed(() => page.props.cards?.meta || {})
const isLoading = ref(false)
const databaseStats = computed(() => page.props.databaseStats || {})
// Статистика по базам
const databaseInfo = computed(() => ({
postgresql: {
count: databaseStats.value.postgresql?.total || 0,
label: 'PostgreSQL',
color: 'blue',
description: 'Основной архив'
},
mssql: {
count: databaseStats.value.mssql?.total || 0,
label: 'MSSQL',
color: 'purple',
description: 'Исторический архив'
}
}))
// Форматирование даты для URL
const formatDateForUrl = (date) => {
@@ -32,17 +71,8 @@ export const useMedicalHistoryFilter = (filters) => {
return date
}
// Навигация с фильтрами
const applyFilters = (updates = {}, resetPage = false) => {
// Обновляем фильтры
Object.assign(filtersRef.value, updates)
// Если сбрасываем фильтры, обнуляем страницу
if (resetPage) {
filtersRef.value.page = 1
}
// Подготавливаем параметры для URL
// Подготовка параметров запроса
const prepareParams = () => {
const params = {
search: filtersRef.value.search || null,
date_extract_from: formatDateForUrl(filtersRef.value.date_extract_from),
@@ -52,19 +82,33 @@ export const useMedicalHistoryFilter = (filters) => {
sort_by: filtersRef.value.sort_by,
sort_order: filtersRef.value.sort_order,
view_type: filtersRef.value.view_type,
database: filtersRef.value.database,
status: filtersRef.value.status
}
// Очищаем пустые значения
const cleanParams = Object.fromEntries(
return Object.fromEntries(
Object.entries(params).filter(([_, value]) =>
value !== undefined && value !== null && value !== ''
)
)
}
const query = stringifyQuery(cleanParams)
// Навигация с фильтрами
const applyFilters = (updates = {}, resetPage = true) => {
// Обновляем фильтры
Object.assign(filtersRef.value, updates)
// Если сбрасываем фильтры, обнуляем страницу
if (resetPage) {
filtersRef.value.page = 1
}
const params = prepareParams()
const query = new URLSearchParams(params).toString()
isLoading.value = true
router.visit(`/${query ? `?${query}` : ''}`, {
router.get(`/${query ? `?${query}` : ''}`, params, {
preserveState: true,
preserveScroll: true,
onFinish: () => {
@@ -84,6 +128,10 @@ export const useMedicalHistoryFilter = (filters) => {
debouncedSearch(value)
}
const handleDatabaseChange = (database) => {
applyFilters({ database, page: 1 }, false)
}
// Конвертация строки даты в timestamp для NaiveUI
const convertToTimestamp = (dateString) => {
if (!dateString) return null
@@ -128,12 +176,8 @@ export const useMedicalHistoryFilter = (filters) => {
applyFilters(updates, true)
}
const handleStatusChange = (status) => {
applyFilters({ status }, true)
}
const handlePageChange = (page) => {
applyFilters({ page })
const handlePageChange = (pageNum) => {
applyFilters({ page: pageNum }, false)
}
const handlePageSizeChange = (size) => {
@@ -148,7 +192,14 @@ export const useMedicalHistoryFilter = (filters) => {
applyFilters({
sort_by: sorter.columnKey,
sort_order: sorter.order
})
}, true)
}
const handleStatusChange = (status_id) => {
applyFilters({
status: status_id
}, true)
}
const resetAllFilters = () => {
@@ -158,34 +209,112 @@ export const useMedicalHistoryFilter = (filters) => {
date_extract_to: null,
page: 1,
page_size: 15,
sort_by: 'created_at',
sort_by: 'dateextract',
sort_order: 'desc',
view_type: 'archive',
database: 'postgresql',
}
dateRange.value = [null, null]
applyFilters({}, true)
}
// Быстрый поиск по типу (для тулбара)
const quickSearch = (type, value) => {
const params = {
type,
value,
database: filtersRef.value.database,
}
router.get('/quick-search', params, {
preserveState: true,
preserveScroll: true,
})
}
// Приоритетный поиск
const prioritySearch = (searchTerm) => {
router.get('/priority-search', {
q: searchTerm
}, {
preserveState: true,
preserveScroll: true,
})
}
// Активные фильтры для отображения
const activeFilters = computed(() => {
const active = []
if (filtersRef.value.search) {
active.push({ key: 'search', label: `Поиск: ${filtersRef.value.search}` })
active.push({
key: 'search',
label: `Поиск: ${filtersRef.value.search}`,
icon: 'search'
})
}
if (filtersRef.value.date_extract_from || filtersRef.value.date_extract_to) {
const from = filtersRef.value.date_extract_from ? format(parseISO(filtersRef.value.date_extract_from), 'dd.MM.yyyy') : ''
const to = filtersRef.value.date_extract_to ? format(parseISO(filtersRef.value.date_extract_to), 'dd.MM.yyyy') : ''
active.push({ key: 'date', label: `Дата: ${from} - ${to}` })
const from = filtersRef.value.date_extract_from
? format(parseISO(filtersRef.value.date_extract_from), 'dd.MM.yyyy')
: ''
const to = filtersRef.value.date_extract_to
? format(parseISO(filtersRef.value.date_extract_to), 'dd.MM.yyyy')
: ''
active.push({
key: 'date',
label: `Дата выписки: ${from} ${to ? '- ' + to : ''}`,
icon: 'calendar'
})
}
// Добавьте другие фильтры по необходимости
// Фильтр по базе данных
if (filtersRef.value.database) {
const dbLabel = {
postgresql: 'PostgreSQL',
mssql: 'MSSQL',
smart: 'Умный поиск',
separate: 'Раздельно'
}[filtersRef.value.database] || filtersRef.value.database
active.push({
key: 'database',
label: `База: ${dbLabel}`,
icon: 'database'
})
}
return active
})
// Удаление конкретного фильтра
const removeFilter = (key) => {
const updates = {}
switch (key) {
case 'search':
updates.search = ''
break
case 'date':
updates.date_extract_from = null
updates.date_extract_to = null
dateRange.value = [null, null]
break
case 'database':
updates.database = 'postgresql'
break
}
Object.assign(filtersRef.value, updates)
applyFilters(updates, true)
}
// Следим за изменениями в page.props.filters
watch(
() => page.props.filters,
(newFilters) => {
if (newFilters) {
// Сохраняем все фильтры, включая search!
// Сохраняем все фильтры
filtersRef.value = {
...filtersRef.value,
...newFilters
@@ -209,14 +338,22 @@ export const useMedicalHistoryFilter = (filters) => {
isLoading,
activeFilters,
dateRange,
databaseInfo,
databaseStats,
// Обработчики
handleDatabaseChange,
handleViewTypeChange,
handleSearch,
handleDateRangeChange,
handleStatusChange,
handlePageChange,
handlePageSizeChange,
handleSortChange,
handleStatusChange,
resetAllFilters,
applyFilters
removeFilter,
applyFilters,
quickSearch,
prioritySearch
}
}