@@ -43,7 +43,9 @@ import { ProjectStatus } from '../project/dto';
43
43
import {
44
44
CreateLanguage ,
45
45
EthnologueLanguage ,
46
+ EthnologueLanguageFilters ,
46
47
Language ,
48
+ LanguageFilters ,
47
49
LanguageListInput ,
48
50
UpdateLanguage ,
49
51
} from './dto' ;
@@ -184,7 +186,7 @@ export class LanguageRepository extends DtoRepository<
184
186
node ( 'eth' , 'EthnologueLanguage' ) ,
185
187
] )
186
188
. apply ( matchProps ( { nodeName : 'eth' , outputVar : 'ethProps' } ) )
187
- . apply ( this . isPresetInventory ( ) )
189
+ . apply ( isPresetInventory )
188
190
. optionalMatch ( [
189
191
node ( 'node' ) ,
190
192
relation ( 'in' , '' , 'language' , ACTIVE ) ,
@@ -217,31 +219,7 @@ export class LanguageRepository extends DtoRepository<
217
219
] )
218
220
// match requesting user once (instead of once per row)
219
221
. match ( requestingUser ( session ) )
220
- . apply (
221
- filter . builder ( input . filter ?? { } , {
222
- sensitivity : filter . stringListProp ( ) ,
223
- leastOfThese : filter . propVal ( ) ,
224
- isSignLanguage : filter . propVal ( ) ,
225
- isDialect : filter . propVal ( ) ,
226
- partnerId : filter . pathExists ( ( id ) => [
227
- node ( 'node' ) ,
228
- relation ( 'in' , '' , 'language' , ACTIVE ) ,
229
- node ( '' , 'LanguageEngagement' ) ,
230
- relation ( 'in' , '' , 'engagement' , ACTIVE ) ,
231
- node ( '' , 'Project' ) ,
232
- relation ( 'out' , '' , 'partnership' , ACTIVE ) ,
233
- node ( '' , 'Partnership' ) ,
234
- relation ( 'out' , '' , 'partner' , ACTIVE ) ,
235
- node ( '' , 'Partner' , { id } ) ,
236
- ] ) ,
237
- presetInventory : ( { value, query } ) => {
238
- query . apply ( this . isPresetInventory ( ) ) . with ( '*' ) ;
239
- const condition = equals ( 'true' , true ) ;
240
- return { presetInventory : value ? condition : not ( condition ) } ;
241
- } ,
242
- pinned : filter . isPinned ,
243
- } ) ,
244
- )
222
+ . apply ( languageFilters ( input . filter ) )
245
223
. apply (
246
224
this . privileges . forUser ( session ) . filterToReadable ( {
247
225
wrapContext : oncePerProject ,
@@ -290,41 +268,79 @@ export class LanguageRepository extends DtoRepository<
290
268
. first ( ) ;
291
269
return ! ! res ;
292
270
}
293
-
294
- private isPresetInventory ( ) {
295
- return ( query : Query ) =>
296
- query . subQuery ( 'node' , ( sub ) =>
297
- sub
298
- . optionalMatch ( [
299
- node ( 'node' ) ,
300
- relation ( 'in' , '' , 'language' , ACTIVE ) ,
301
- node ( '' , 'LanguageEngagement' ) ,
302
- relation ( 'in' , '' , 'engagement' , ACTIVE ) ,
303
- node ( 'project' , 'Project' ) ,
304
- relation ( 'out' , '' , 'status' , ACTIVE ) ,
305
- node ( 'status' , 'ProjectStatus' ) ,
306
- ] )
307
- . where ( {
308
- 'status.value' : inArray (
309
- `['${ ProjectStatus . InDevelopment } ', '${ ProjectStatus . Active } ']` ,
310
- true ,
311
- ) ,
312
- } )
313
- . return (
314
- any (
315
- 'project' ,
316
- collect ( 'project' ) ,
317
- exp . path ( [
318
- node ( 'project' ) ,
319
- relation ( 'out' , '' , 'presetInventory' , ACTIVE ) ,
320
- node ( '' , 'Property' , { value : variable ( 'true' ) } ) ,
321
- ] ) ,
322
- ) . as ( 'presetInventory' ) ,
323
- ) ,
324
- ) ;
325
- }
326
271
}
327
272
273
+ export const languageFilters = filter . define ( ( ) => LanguageFilters , {
274
+ sensitivity : filter . stringListProp ( ) ,
275
+ leastOfThese : filter . propVal ( ) ,
276
+ isSignLanguage : filter . propVal ( ) ,
277
+ isDialect : filter . propVal ( ) ,
278
+ registryOfDialectsCode : filter . propPartialVal ( ) ,
279
+ partnerId : filter . pathExists ( ( id ) => [
280
+ node ( 'node' ) ,
281
+ relation ( 'in' , '' , 'language' , ACTIVE ) ,
282
+ node ( '' , 'LanguageEngagement' ) ,
283
+ relation ( 'in' , '' , 'engagement' , ACTIVE ) ,
284
+ node ( '' , 'Project' ) ,
285
+ relation ( 'out' , '' , 'partnership' , ACTIVE ) ,
286
+ node ( '' , 'Partnership' ) ,
287
+ relation ( 'out' , '' , 'partner' , ACTIVE ) ,
288
+ node ( '' , 'Partner' , { id } ) ,
289
+ ] ) ,
290
+ presetInventory : ( { value, query } ) => {
291
+ query . apply ( isPresetInventory ) . with ( '*' ) ;
292
+ const condition = equals ( 'true' , true ) ;
293
+ return { presetInventory : value ? condition : not ( condition ) } ;
294
+ } ,
295
+ pinned : filter . isPinned ,
296
+ ethnologue : filter . sub ( ( ) => ethnologueFilters ) ( ( sub ) =>
297
+ sub
298
+ . with ( 'node as lang' )
299
+ . match ( [
300
+ node ( 'lang' ) ,
301
+ relation ( 'out' , '' , 'ethnologue' ) ,
302
+ node ( 'node' , 'EthnologueLanguage' ) ,
303
+ ] ) ,
304
+ ) ,
305
+ } ) ;
306
+
307
+ const ethnologueFilters = filter . define ( ( ) => EthnologueLanguageFilters , {
308
+ code : filter . propPartialVal ( ) ,
309
+ provisionalCode : filter . propPartialVal ( ) ,
310
+ name : filter . propPartialVal ( ) ,
311
+ } ) ;
312
+
313
+ const isPresetInventory = ( query : Query ) =>
314
+ query . subQuery ( 'node' , ( sub ) =>
315
+ sub
316
+ . optionalMatch ( [
317
+ node ( 'node' ) ,
318
+ relation ( 'in' , '' , 'language' , ACTIVE ) ,
319
+ node ( '' , 'LanguageEngagement' ) ,
320
+ relation ( 'in' , '' , 'engagement' , ACTIVE ) ,
321
+ node ( 'project' , 'Project' ) ,
322
+ relation ( 'out' , '' , 'status' , ACTIVE ) ,
323
+ node ( 'status' , 'ProjectStatus' ) ,
324
+ ] )
325
+ . where ( {
326
+ 'status.value' : inArray (
327
+ `['${ ProjectStatus . InDevelopment } ', '${ ProjectStatus . Active } ']` ,
328
+ true ,
329
+ ) ,
330
+ } )
331
+ . return (
332
+ any (
333
+ 'project' ,
334
+ collect ( 'project' ) ,
335
+ exp . path ( [
336
+ node ( 'project' ) ,
337
+ relation ( 'out' , '' , 'presetInventory' , ACTIVE ) ,
338
+ node ( '' , 'Property' , { value : variable ( 'true' ) } ) ,
339
+ ] ) ,
340
+ ) . as ( 'presetInventory' ) ,
341
+ ) ,
342
+ ) ;
343
+
328
344
export const languageSorters = defineSorters ( Language , {
329
345
// eslint-disable-next-line @typescript-eslint/naming-convention
330
346
'ethnologue.*' : ( query , input ) =>
0 commit comments