@@ -3,8 +3,10 @@ import { ref } from 'vue';
3
3
import { useRoute } from 'vue-router' ;
4
4
import { useUserFilter } from '~/composables/useUserFilter' ;
5
5
import { ONLINE_STATUSES , OFFLINE_STATUSES } from '~/constants/probes' ;
6
+ import { useAuth } from '~/store/auth' ;
6
7
7
8
export type StatusCode = 'all' | 'online' | 'ping-test-failed' | 'offline' | 'online-outdated' ;
9
+ export type AdoptionOption = 'all' | 'adopted' | 'non-adopted' ;
8
10
9
11
type StatusOption = {
10
12
name : string ;
@@ -17,9 +19,10 @@ export interface Filter {
17
19
status : StatusCode ;
18
20
by : string ;
19
21
desc : boolean ;
22
+ adoption : AdoptionOption ;
20
23
}
21
24
22
- const DEFAULT_FILTER : Filter = { search : '' , status : 'all' , by : 'name' , desc : false } as const ;
25
+ const DEFAULT_FILTER : Filter = { search : '' , status : 'all' , by : 'name' , desc : false , adoption : 'all' } as const ;
23
26
24
27
export const SORTABLE_FIELDS : string [ ] = [ 'name' , 'location' , 'tags' ] as const ;
25
28
@@ -31,12 +34,15 @@ export const STATUS_MAP: Record<StatusCode, StatusOption> = {
31
34
'offline' : { name : 'Offline' , options : OFFLINE_STATUSES } ,
32
35
} as const ;
33
36
37
+ export const ADOPTION_OPTIONS : string [ ] = [ 'all' , 'adopted' , 'non-adopted' ] as const ;
38
+
34
39
interface ProbeFiltersOptions {
35
40
active ?: MaybeRefOrGetter < boolean > ;
36
41
}
37
42
38
43
export const useProbeFilters = ( { active = ( ) => true } : ProbeFiltersOptions = { } ) => {
39
44
const route = useRoute ( ) ;
45
+ const auth = useAuth ( ) ;
40
46
const { getUserFilter } = useUserFilter ( ) ;
41
47
42
48
const filter = ref < Filter > ( { ...DEFAULT_FILTER } ) ;
@@ -46,8 +52,8 @@ export const useProbeFilters = ({ active = () => true }: ProbeFiltersOptions = {
46
52
const { sortField = '' , sortOrder = 1 } = event ;
47
53
48
54
if ( ! sortOrder || typeof sortField !== 'string' || ! SORTABLE_FIELDS . includes ( sortField ) ) {
49
- filter . value . by = 'name' ;
50
- filter . value . desc = false ;
55
+ filter . value . by = DEFAULT_FILTER . by ;
56
+ filter . value . desc = DEFAULT_FILTER . desc ;
51
57
} else {
52
58
filter . value . by = sortField ;
53
59
filter . value . desc = sortOrder === - 1 ;
@@ -68,9 +74,10 @@ export const useProbeFilters = ({ active = () => true }: ProbeFiltersOptions = {
68
74
69
75
const constructQuery = ( ) => ( {
70
76
...filter . value . search && { filter : filter . value . search } ,
71
- ...filter . value . by !== 'name' && { by : filter . value . by } ,
77
+ ...! isDefault ( 'by' ) && { by : filter . value . by } ,
72
78
...filter . value . desc && { desc : 'true' } ,
73
- ...filter . value . status !== 'all' && { status : filter . value . status } ,
79
+ ...! isDefault ( 'status' ) && { status : filter . value . status } ,
80
+ ...auth . isAdmin && ! isDefault ( 'adoption' ) && { adoption : filter . value . adoption } ,
74
81
} ) ;
75
82
76
83
const onParamChange = ( ) => {
@@ -100,19 +107,33 @@ export const useProbeFilters = ({ active = () => true }: ProbeFiltersOptions = {
100
107
}
101
108
} ;
102
109
103
- const getCurrentFilter = ( includeStatus : boolean = false ) => ( {
104
- ...getUserFilter ( 'userId' ) ,
105
- ...filter . value . search && { searchIndex : { _icontains : filter . value . search } } ,
106
- ...includeStatus && filter . value . status !== 'all' && { status : { _in : STATUS_MAP [ filter . value . status ] . options } } ,
107
- ...includeStatus && filter . value . status === 'online-outdated' && { isOutdated : { _eq : true } } ,
108
- } ) ;
110
+ const getCurrentFilter = ( ignoredFields : Array < keyof Filter > = [ ] ) => getDirectusFilter ( filter , ignoredFields ) ;
111
+
112
+ const getDirectusFilter = ( filter : MaybeRefOrGetter < Filter > , ignoredFields : Array < keyof Filter > = [ ] ) => {
113
+ const filterValue = toValue ( filter ) ;
114
+
115
+ return {
116
+ ...getUserFilter ( 'userId' ) ,
117
+ ...filterValue . search && { searchIndex : { _icontains : filterValue . search } } ,
118
+ ...! ignoredFields . includes ( 'status' ) && ! isDefault ( 'status' , filter ) && { status : { _in : STATUS_MAP [ filterValue . status ] . options } } ,
119
+ ...! ignoredFields . includes ( 'status' ) && filterValue . status === 'online-outdated' && { isOutdated : { _eq : true } } ,
120
+ ...! ignoredFields . includes ( 'adoption' ) && auth . isAdmin && ! isDefault ( 'adoption' , filter ) && {
121
+ userId : filterValue . adoption === 'adopted' ? { _neq : null } : { _eq : null } ,
122
+ } ,
123
+ } ;
124
+ } ;
125
+
126
+ const isDefault = ( field : keyof Filter , filterObj : MaybeRefOrGetter < Filter > = filter ) => {
127
+ return toValue ( filterObj ) [ field ] === DEFAULT_FILTER [ field ] ;
128
+ } ;
109
129
110
130
watch ( [
111
131
( ) => route . query . filter ,
112
132
( ) => route . query . by ,
113
133
( ) => route . query . desc ,
114
134
( ) => route . query . status ,
115
- ] , async ( [ search , by , desc , status ] ) => {
135
+ ( ) => route . query . adoption ,
136
+ ] , async ( [ search , by , desc , status , adoption ] ) => {
116
137
if ( ! toValue ( active ) ) {
117
138
return ;
118
139
}
@@ -140,6 +161,12 @@ export const useProbeFilters = ({ active = () => true }: ProbeFiltersOptions = {
140
161
} else {
141
162
filter . value . status = DEFAULT_FILTER . status ;
142
163
}
164
+
165
+ if ( typeof adoption === 'string' && ADOPTION_OPTIONS . includes ( adoption ) && auth . isAdmin ) {
166
+ filter . value . adoption = adoption as AdoptionOption ;
167
+ } else {
168
+ filter . value . adoption = DEFAULT_FILTER . adoption ;
169
+ }
143
170
} , { immediate : true } ) ;
144
171
145
172
return {
@@ -149,10 +176,13 @@ export const useProbeFilters = ({ active = () => true }: ProbeFiltersOptions = {
149
176
// handlers
150
177
onSortChange,
151
178
onFilterChange,
152
- onStatusChange : ( ) => onParamChange ( ) ,
179
+ onParamChange,
153
180
onBatchChange,
154
181
// builders
155
182
getSortSettings,
156
183
getCurrentFilter,
184
+ getDirectusFilter,
185
+ // helpers
186
+ isDefault,
157
187
} ;
158
188
} ;
0 commit comments