Search und Save Function
This commit is contained in:
@@ -77,6 +77,7 @@ const sort = ref({
|
||||
const columnsToFilter = ref({})
|
||||
|
||||
const showMobileFilter = ref(false)
|
||||
let lastSearchRequestId = 0
|
||||
|
||||
|
||||
//Functions
|
||||
@@ -86,6 +87,7 @@ function resetMobileFilters() {
|
||||
|
||||
Object.keys(itemsMeta.value.distinctValues).forEach(key => {
|
||||
columnsToFilter.value[key] = [...itemsMeta.value.distinctValues[key]]
|
||||
tempStore.clearFilter(type, key)
|
||||
})
|
||||
|
||||
showMobileFilter.value = false
|
||||
@@ -94,7 +96,16 @@ function resetMobileFilters() {
|
||||
|
||||
function applyMobileFilters() {
|
||||
Object.keys(columnsToFilter.value).forEach(key => {
|
||||
tempStore.modifyFilter(type, key, columnsToFilter.value[key])
|
||||
const selected = columnsToFilter.value[key]
|
||||
const available = itemsMeta.value?.distinctValues?.[key] || []
|
||||
|
||||
if (!Array.isArray(selected) || selected.length === 0 || selected.length === available.length) {
|
||||
tempStore.clearFilter(type, key)
|
||||
columnsToFilter.value[key] = [...available]
|
||||
return
|
||||
}
|
||||
|
||||
tempStore.modifyFilter(type, key, selected)
|
||||
})
|
||||
|
||||
showMobileFilter.value = false
|
||||
@@ -108,7 +119,7 @@ const clearSearchString = () => {
|
||||
}
|
||||
|
||||
const performSearch = async () => {
|
||||
tempStore.modifySearchString(type,searchString)
|
||||
tempStore.modifySearchString(type, searchString.value)
|
||||
changePage(1,true)
|
||||
setupPage()
|
||||
}
|
||||
@@ -143,9 +154,65 @@ const isFiltered = computed(() => {
|
||||
})
|
||||
})
|
||||
|
||||
const initializeDistinctFilters = () => {
|
||||
const distinctValues = itemsMeta.value?.distinctValues || {}
|
||||
const storedDomainFilters = tempStore.filters[type] || {}
|
||||
const normalizedStoredFilters = {}
|
||||
|
||||
// Nur gültige, noch vorhandene Filterwerte aus dem TempStore übernehmen.
|
||||
Object.entries(distinctValues).forEach(([column, availableValues]) => {
|
||||
const available = Array.isArray(availableValues) ? availableValues : []
|
||||
const storedSelected = storedDomainFilters[column]
|
||||
|
||||
if (!Array.isArray(storedSelected)) {
|
||||
columnsToFilter.value[column] = [...available]
|
||||
return
|
||||
}
|
||||
|
||||
const selected = storedSelected.filter((value) => available.includes(value))
|
||||
const isFullSelection = selected.length === 0 || selected.length === available.length
|
||||
|
||||
if (isFullSelection) {
|
||||
columnsToFilter.value[column] = [...available]
|
||||
return
|
||||
}
|
||||
|
||||
columnsToFilter.value[column] = selected
|
||||
normalizedStoredFilters[column] = selected
|
||||
})
|
||||
|
||||
// Persistiert bereinigte Filter nur einmalig bei der Initialisierung.
|
||||
tempStore.setFilters(type, normalizedStoredFilters)
|
||||
}
|
||||
|
||||
const syncDistinctFiltersFromStore = () => {
|
||||
const distinctValues = itemsMeta.value?.distinctValues || {}
|
||||
const storedDomainFilters = tempStore.filters[type] || {}
|
||||
|
||||
Object.entries(distinctValues).forEach(([column, availableValues]) => {
|
||||
const available = Array.isArray(availableValues) ? availableValues : []
|
||||
const storedSelected = storedDomainFilters[column]
|
||||
|
||||
if (!Array.isArray(storedSelected) || storedSelected.length === 0) {
|
||||
columnsToFilter.value[column] = [...available]
|
||||
return
|
||||
}
|
||||
|
||||
const selected = storedSelected.filter((value) => available.includes(value))
|
||||
if (selected.length === 0 || selected.length === available.length) {
|
||||
columnsToFilter.value[column] = [...available]
|
||||
tempStore.clearFilter(type, column)
|
||||
return
|
||||
}
|
||||
|
||||
columnsToFilter.value[column] = selected
|
||||
})
|
||||
}
|
||||
|
||||
//SETUP
|
||||
|
||||
const setupPage = async () => {
|
||||
const currentRequestId = ++lastSearchRequestId
|
||||
loading.value = true
|
||||
setPageLayout(platformIsNative ? "mobile" : "default")
|
||||
|
||||
@@ -159,9 +226,9 @@ const setupPage = async () => {
|
||||
archived:false
|
||||
}
|
||||
|
||||
Object.keys(columnsToFilter.value).forEach((column) => {
|
||||
if(columnsToFilter.value[column].length !== itemsMeta.value.distinctValues[column].length) {
|
||||
filters[column] = columnsToFilter.value[column]
|
||||
Object.entries(tempStore.filters[type] || {}).forEach(([column, selected]) => {
|
||||
if (Array.isArray(selected) && selected.length > 0) {
|
||||
filters[column] = selected
|
||||
}
|
||||
})
|
||||
|
||||
@@ -177,16 +244,16 @@ const setupPage = async () => {
|
||||
distinctColumns: dataType.templateColumns.filter(i => i.distinct).map(i => i.key),
|
||||
})
|
||||
|
||||
// Verhindert Race Conditions beim schnellen Tippen:
|
||||
// Nur das Ergebnis des letzten Requests darf den State setzen.
|
||||
if (currentRequestId !== lastSearchRequestId) return
|
||||
|
||||
items.value = data
|
||||
itemsMeta.value = meta
|
||||
if(!initialSetupDone.value){
|
||||
Object.keys(tempStore.filters[type] || {}).forEach((column) => {
|
||||
columnsToFilter.value[column] = tempStore.filters[type][column]
|
||||
})
|
||||
|
||||
Object.keys(itemsMeta.value.distinctValues).filter(i => !Object.keys(tempStore.filters[type] || {}).includes(i)).forEach(distinctValue => {
|
||||
columnsToFilter.value[distinctValue] = itemsMeta.value.distinctValues[distinctValue]
|
||||
})
|
||||
initializeDistinctFilters()
|
||||
} else {
|
||||
syncDistinctFiltersFromStore()
|
||||
}
|
||||
|
||||
|
||||
@@ -199,9 +266,18 @@ setupPage()
|
||||
|
||||
const handleFilterChange = async (action,column) => {
|
||||
if(action === 'reset') {
|
||||
columnsToFilter.value[column] = itemsMeta.value.distinctValues[column]
|
||||
columnsToFilter.value[column] = [...(itemsMeta.value.distinctValues?.[column] || [])]
|
||||
tempStore.clearFilter(type, column)
|
||||
} else if(action === 'change') {
|
||||
tempStore.modifyFilter(type,column,columnsToFilter.value[column])
|
||||
const selected = columnsToFilter.value[column]
|
||||
const available = itemsMeta.value.distinctValues?.[column] || []
|
||||
|
||||
if (!Array.isArray(selected) || selected.length === 0 || selected.length === available.length) {
|
||||
tempStore.clearFilter(type, column)
|
||||
columnsToFilter.value[column] = [...available]
|
||||
} else {
|
||||
tempStore.modifyFilter(type,column,selected)
|
||||
}
|
||||
}
|
||||
setupPage()
|
||||
}
|
||||
|
||||
@@ -49,6 +49,23 @@ export const useTempStore = defineStore('temp', () => {
|
||||
storeTempConfig()
|
||||
}
|
||||
|
||||
function setFilters(domain, nextFilters) {
|
||||
filters.value[domain] = nextFilters
|
||||
if (!filters.value[domain] || Object.keys(filters.value[domain]).length === 0) {
|
||||
delete filters.value[domain]
|
||||
}
|
||||
storeTempConfig()
|
||||
}
|
||||
|
||||
function clearFilter(domain, type) {
|
||||
if (!filters.value[domain]) return
|
||||
delete filters.value[domain][type]
|
||||
if (Object.keys(filters.value[domain]).length === 0) {
|
||||
delete filters.value[domain]
|
||||
}
|
||||
storeTempConfig()
|
||||
}
|
||||
|
||||
function modifyColumns(type, input) {
|
||||
columns.value[type] = input
|
||||
storeTempConfig()
|
||||
@@ -81,6 +98,8 @@ export const useTempStore = defineStore('temp', () => {
|
||||
clearSearchString,
|
||||
filters,
|
||||
modifyFilter,
|
||||
setFilters,
|
||||
clearFilter,
|
||||
columns,
|
||||
modifyColumns,
|
||||
modifyPages,
|
||||
@@ -89,4 +108,4 @@ export const useTempStore = defineStore('temp', () => {
|
||||
modifyBankingPeriod, // Neue Funktion exportiert
|
||||
settings
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user