Много всего
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user