Search und Save Function
All checks were successful
Build and Push Docker Images / build-backend (push) Successful in 33s
Build and Push Docker Images / build-frontend (push) Successful in 1m8s

This commit is contained in:
2026-02-18 15:04:16 +01:00
parent 6fded3993a
commit 844af30b18
4 changed files with 228 additions and 27 deletions

View File

@@ -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()
}