github.com/anth0d/nomad@v0.0.0-20221214183521-ae3a0a2cad06/ui/app/routes/evaluations/index.js (about) 1 import { inject as service } from '@ember/service'; 2 import Route from '@ember/routing/route'; 3 4 export default class EvaluationsIndexRoute extends Route { 5 @service store; 6 7 queryParams = { 8 pageSize: { 9 refreshModel: true, 10 }, 11 nextToken: { 12 refreshModel: true, 13 }, 14 status: { 15 refreshModel: true, 16 }, 17 triggeredBy: { 18 refreshModel: true, 19 }, 20 qpNamespace: { 21 refreshModel: true, 22 }, 23 searchTerm: { 24 refreshModel: true, 25 }, 26 type: { 27 refreshModel: true, 28 }, 29 }; 30 31 model({ 32 nextToken, 33 pageSize, 34 searchTerm, 35 status, 36 triggeredBy, 37 type, 38 qpNamespace: namespace, 39 }) { 40 /* 41 We use our own DSL for filter expressions. This function takes our query parameters and builds a query that matches our DSL. 42 Documentation can be found here: https://www.nomadproject.io/api-docs#filtering 43 */ 44 const generateFilterExpression = () => { 45 const searchFilter = searchTerm 46 ? `ID contains "${searchTerm}" or JobID contains "${searchTerm}" or NodeID contains "${searchTerm}" or TriggeredBy contains "${searchTerm}"` 47 : null; 48 const typeFilter = 49 type === 'client' ? `NodeID is not empty` : `NodeID is empty`; 50 const triggeredByFilter = `TriggeredBy contains "${triggeredBy}"`; 51 const statusFilter = `Status contains "${status}"`; 52 53 let filterExp; 54 if (searchTerm) { 55 if (!type && !status && !triggeredBy) { 56 return searchFilter; 57 } 58 filterExp = `(${searchFilter})`; 59 if (type) { 60 filterExp = `${filterExp} and ${typeFilter}`; 61 } 62 if (triggeredBy) { 63 filterExp = `${filterExp} and ${triggeredByFilter}`; 64 } 65 if (status) { 66 filterExp = `${filterExp} and ${statusFilter}`; 67 } 68 return filterExp; 69 } 70 71 if (type || status || triggeredBy) { 72 const lookup = { 73 [type]: typeFilter, 74 [status]: statusFilter, 75 [triggeredBy]: triggeredByFilter, 76 }; 77 78 filterExp = [type, status, triggeredBy].reduce((result, filter) => { 79 const expression = lookup[filter]; 80 if (!!filter && result !== '') { 81 result = result.concat(` and ${expression}`); 82 } else if (filter) { 83 result = expression; 84 } 85 return result; 86 }, ''); 87 return filterExp; 88 } 89 90 return null; 91 }; 92 93 this.store.findAll('namespace'); 94 95 return this.store.query('evaluation', { 96 namespace, 97 reverse: true, 98 per_page: pageSize, 99 next_token: nextToken, 100 filter: generateFilterExpression(), 101 }); 102 } 103 }