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  }