import { computed, observer } from '@ember/object'; import { alias } from '@ember/object/computed'; import Component from '@ember/component'; import pagedArray from 'ember-cli-pagination/computed/paged-array'; import { matches } from 'shared/components/sortable-table/component'; import layout from './template'; export const searchFields = ['displayName','id:prefix','displayState','image','displayIp:ip']; export default Component.extend({ layout, pods: null, searchText: null, groupByPod: false, paging: true, sort: ['sortStr'], searchFields: searchFields, tagName: '', page: 1, perPage: 120, // Ignore the setting because these are tiny dots. filtered: computed('pods.[]','searchText', function() { let out = this.get('pods').slice(); let searchFields = this.get('searchFields'); let searchText = (this.get('searchText')||'').trim().toLowerCase(); if ( searchText.length ) { let searchTokens = searchText.split(/\s*[, ]\s*/); for ( let i = out.length-1 ; i >= 0 ; i-- ) { let row = out[i].containers[0]; for ( let j = 0 ; j < searchTokens.length ; j++ ) { let expect = true; let token = searchTokens[j]; if ( token.substr(0,1) === '!' ) { expect = false; token = token.substr(1); } if ( token && matches(searchFields, token, row) !== expect ) { out.removeAt(i); break; } } } } return out; }), pagedContent: pagedArray('filtered', { page: alias("parent.page"), perPage: alias("parent.perPage") }), indexFrom: computed('page','perPage', function() { var current = this.get('page'); var perPage = this.get('perPage'); return Math.max(0, 1 + perPage*(current-1)); }), indexTo: computed('indexFrom','perPage','filtered.length', function() { return Math.min(this.get('filtered.length'), this.get('indexFrom') + this.get('perPage') - 1); }), pageCountChanged: observer('indexFrom', 'filtered.length', function() { // Go to the last page if we end up past the last page let from = this.get('indexFrom'); let last = this.get('filtered.length'); var perPage = this.get('perPage'); if ( this.get('page') > 1 && from > last) { let page = Math.ceil(last/perPage); this.set('page', page); } }), });