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