Skip to content

Commit eb5493a

Browse files
authored
Merge pull request #359 from devforth/feature/filters-visability-handling
fix: update filter logic to use appliedFiltersCount and enhance visib…
2 parents 391ea42 + bed9d37 commit eb5493a

File tree

5 files changed

+55
-15
lines changed

5 files changed

+55
-15
lines changed

adminforth/spa/src/adminforth.ts

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -120,23 +120,27 @@ class FrontendAPI implements FrontendAPIInterface {
120120
listFilterValidation(filter: FilterParams): boolean {
121121
if(router.currentRoute.value.meta.type !== 'list'){
122122
throw new Error(`Cannot use ${this.setListFilter.name} filter on a list page`)
123-
} else {
124-
console.log(this.coreStore.resourceColumnsWithFilters,'core store')
125-
const filterField = this.coreStore.resourceColumnsWithFilters.find((col: AdminForthResourceColumnCommon) => col.name === filter.field)
126-
if(!filterField){
127-
throw new Error(`Field ${filter.field} is not available for filtering`)
128-
}
129-
130123
}
131124
return true
132125
}
133126

134127
setListFilter(filter: FilterParams): void {
135128
if(this.listFilterValidation(filter)){
136-
if(this.filtersStore.filters.some((f: any) => {return f.field === filter.field && f.operator === filter.operator})){
137-
throw new Error(`Filter ${filter.field} with operator ${filter.operator} already exists`)
129+
const existingFilterIndex = this.filtersStore.filters.findIndex((f: any) => {
130+
return f.field === filter.field && f.operator === filter.operator
131+
});
132+
133+
if(existingFilterIndex !== -1){
134+
// Update existing filter instead of throwing error
135+
const filters = [...this.filtersStore.filters];
136+
if (filter.value === undefined) {
137+
filters.splice(existingFilterIndex, 1);
138+
} else {
139+
filters[existingFilterIndex] = filter;
140+
}
141+
this.filtersStore.setFilters(filters);
138142
} else {
139-
this.filtersStore.setFilter(filter)
143+
this.filtersStore.setFilter(filter);
140144
}
141145
}
142146
}

adminforth/spa/src/components/Filters.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@
136136

137137
<div class="flex justify-end gap-2">
138138
<button
139-
:disabled="!filtersStore.filters.length"
139+
:disabled="!filtersStore.visibleFiltersCount"
140140
type="button"
141141
class="flex items-center py-1 px-3 text-sm font-medium text-lightFiltersClearAllButtonText focus:outline-none bg-lightFiltersClearAllButtonBackground rounded border border-lightFiltersClearAllButtonBorder hover:bg-lightFiltersClearAllButtonBackgroundHover hover:text-lightFiltersClearAllButtonTextHover focus:z-10 focus:ring-4 focus:ring-lightFiltersClearAllButtonFocus dark:focus:ring-darkFiltersClearAllButtonFocus dark:bg-darkFiltersClearAllButtonBackground dark:text-darkFiltersClearAllButtonText dark:border-darkFiltersClearAllButtonBorder dark:hover:text-darkFiltersClearAllButtonTextHover dark:hover:bg-darkFiltersClearAllButtonBackgroundHover disabled:opacity-50 disabled:cursor-not-allowed"
142142
@click="clear">{{ $t('Clear all') }}</button>

adminforth/spa/src/stores/filters.ts

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
import { ref, type Ref } from 'vue';
1+
import { ref, computed, type Ref } from 'vue';
22
import { defineStore } from 'pinia';
3+
import { useCoreStore } from './core';
34

45
export const useFiltersStore = defineStore('filters', () => {
56
const filters: Ref<any[]> = ref([]);
67
const sort: Ref<any> = ref({});
8+
const coreStore = useCoreStore();
79

810
const setSort = (s: any) => {
911
sort.value = s;
@@ -23,5 +25,29 @@ export const useFiltersStore = defineStore('filters', () => {
2325
const clearFilters = () => {
2426
filters.value = [];
2527
}
26-
return {setFilter, getFilters, clearFilters, filters, setFilters, setSort, getSort}
28+
29+
const shouldFilterBeHidden = (fieldName: string) => {
30+
if (coreStore.resource?.columns) {
31+
const column = coreStore.resource.columns.find((col: any) => col.name === fieldName);
32+
if (column?.showIn?.filter !== true) {
33+
return true;
34+
}
35+
}
36+
return false;
37+
}
38+
39+
const visibleFiltersCount = computed(() => {
40+
return filters.value.filter(f => !shouldFilterBeHidden(f.field)).length;
41+
});
42+
43+
return {
44+
setFilter,
45+
getFilters,
46+
clearFilters,
47+
filters,
48+
setFilters,
49+
setSort,
50+
getSort,
51+
visibleFiltersCount
52+
}
2753
})

adminforth/spa/src/views/ListView.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,8 @@
9292
{{ $t('Filter') }}
9393
<span
9494
class="bg-red-100 text-red-800 text-xs font-medium me-2 px-2.5 py-0.5 rounded dark:bg-gray-700 dark:text-red-400 border border-red-400"
95-
v-if="filtersStore.filters.length">
96-
{{ filtersStore.filters.length }}
95+
v-if="filtersStore.visibleFiltersCount">
96+
{{ filtersStore.visibleFiltersCount }}
9797
</span>
9898
</button>
9999

adminforth/types/FrontendAPI.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,12 +87,19 @@ export interface FrontendAPIInterface {
8787
* Works only when user located on the list page. If filter already exists, it will be replaced with the new one.
8888
* Can be used to set filter from charts or other components in pageInjections.
8989
*
90+
* Filters are automatically marked as hidden (won't count in badge) if:
91+
* - Column has showIn.filter: false
92+
*
9093
* Example:
9194
*
9295
* ```ts
9396
* import adminforth from '@/adminforth'
9497
*
98+
* // Regular filter (will show in badge if column.showIn.filter !== false)
9599
* adminforth.list.setFilter({field: 'name', operator: 'ilike', value: 'john'})
100+
*
101+
* // Hidden filter (won't show in badge if column.showIn.filter === false)
102+
* adminforth.list.setFilter({field: 'internal_status', operator: 'eq', value: 'active'})
96103
* ```
97104
*
98105
* Please note that you can set/update filter even for fields which have showIn.filter=false in resource configuration.
@@ -106,6 +113,9 @@ export interface FrontendAPIInterface {
106113
* DEPRECATED: does the same as setFilter, kept for backward compatibility
107114
* Update a filter in the list
108115
*
116+
* Filters visibility in badge is automatically determined by column configuration:
117+
* - Hidden if column has showIn.filter: false
118+
*
109119
* Example:
110120
*
111121
* ```ts

0 commit comments

Comments
 (0)