]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: Use column filtering feature for inventory-devices 32568/head
authorKiefer Chang <kiefer.chang@suse.com>
Thu, 9 Jan 2020 08:56:32 +0000 (16:56 +0800)
committerKiefer Chang <kiefer.chang@suse.com>
Tue, 14 Jan 2020 07:10:19 +0000 (15:10 +0800)
Signed-off-by: Kiefer Chang <kiefer.chang@suse.com>
15 files changed:
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/inventory/inventory-devices/inventory-device-applied-filters.interface.ts [deleted file]
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/inventory/inventory-devices/inventory-device-filter.interface.ts [deleted file]
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/inventory/inventory-devices/inventory-device-filters-change-event.interface.ts [deleted file]
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/inventory/inventory-devices/inventory-devices.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/inventory/inventory-devices/inventory-devices.component.spec.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/inventory/inventory-devices/inventory-devices.component.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/osd/osd-devices-selection-groups/devices-selection-change-event.interface.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/osd/osd-devices-selection-groups/osd-devices-selection-groups.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/osd/osd-devices-selection-groups/osd-devices-selection-groups.component.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/osd/osd-devices-selection-modal/osd-devices-selection-modal.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/osd/osd-devices-selection-modal/osd-devices-selection-modal.component.spec.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/osd/osd-devices-selection-modal/osd-devices-selection-modal.component.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/osd/osd-form/drive-group.model.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/osd/osd-form/osd-form.component.spec.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/osd/osd-form/osd-form.component.ts

diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/inventory/inventory-devices/inventory-device-applied-filters.interface.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/inventory/inventory-devices/inventory-device-applied-filters.interface.ts
deleted file mode 100644 (file)
index a1dc128..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-export interface InventoryDeviceAppliedFilter {
-  label: string;
-  prop: string;
-  value: string;
-  formatValue: string;
-}
diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/inventory/inventory-devices/inventory-device-filter.interface.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/inventory/inventory-devices/inventory-device-filter.interface.ts
deleted file mode 100644 (file)
index 0f46bff..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-import { PipeTransform } from '@angular/core';
-
-export interface InventoryDeviceFilter {
-  label: string;
-  prop: string;
-  initValue: string;
-  value: string;
-  options: {
-    value: string;
-    formatValue: string;
-  }[];
-  pipe?: PipeTransform;
-}
diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/inventory/inventory-devices/inventory-device-filters-change-event.interface.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/inventory/inventory-devices/inventory-device-filters-change-event.interface.ts
deleted file mode 100644 (file)
index b85f6f0..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-import { InventoryDeviceAppliedFilter } from './inventory-device-applied-filters.interface';
-import { InventoryDevice } from './inventory-device.model';
-
-export interface InventoryDeviceFiltersChangeEvent {
-  filters: InventoryDeviceAppliedFilter[];
-  filterInDevices: InventoryDevice[];
-  filterOutDevices: InventoryDevice[];
-}
index 197f6049a1eb39e8665a0fff05f56ca4ad8b3b8e..244bd8162cf4d597eb99884f2bb9fb56ae07677b 100644 (file)
@@ -1,4 +1,4 @@
-<cd-table [data]="filterInDevices"
+<cd-table [data]="devices"
           [columns]="columns"
           identifier="uid"
           [forceIdentifier]="true"
@@ -6,37 +6,11 @@
           columnMode="flex"
           [autoReload]="false"
           [searchField]="false"
-          (updateSelection)="updateSelection($event)">
+          (updateSelection)="updateSelection($event)"
+          (columnFiltersChanged)="onColumnFiltersChanged($event)">
   <cd-table-actions class="table-actions"
                     [permission]="permission"
                     [selection]="selection"
                     [tableActions]="tableActions">
   </cd-table-actions>
-  <div class="table-filters form-inline"
-       *ngIf="filters.length !== 0">
-    <div class="form-group filter tc_filter"
-         *ngFor="let filter of filters">
-      <label class="col-form-label"><span>{{ filter.label }}</span><span>: </span></label>
-      <select class="custom-select"
-              [(ngModel)]="filter.value"
-              [ngModelOptions]="{standalone: true}"
-              (ngModelChange)="onFilterChange()"
-              [disabled]="filter.disabled">
-        <option *ngFor="let opt of filter.options"
-                [value]="opt.value">{{ opt.formatValue }}</option>
-      </select>
-    </div>
-    <div class="widget-toolbar tc_refreshBtn"
-         *ngIf="filters.length !== 0">
-      <button type="button"
-              title="Reset filters"
-              class="btn btn-light"
-              (click)="onFilterReset()">
-        <span [ngClass]="[icons.stack]">
-          <i [ngClass]="[icons.filter, icons.stack2x]"></i>
-          <i [ngClass]="[icons.destroy, icons.stack1x]"></i>
-        </span>
-      </button>
-    </div>
-  </div>
 </cd-table>
index 4a3a2da03d6e47868532ef4955f1d669aadb11ae..af6f807bc28e5fa576378fe10edfe975aa25e146 100644 (file)
@@ -2,93 +2,16 @@ import { HttpClientTestingModule } from '@angular/common/http/testing';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { FormsModule } from '@angular/forms';
 
-import { getterForProp } from '@swimlane/ngx-datatable/release/utils';
 import * as _ from 'lodash';
 import { ToastrModule } from 'ngx-toastr';
 
-import {
-  configureTestBed,
-  FixtureHelper,
-  i18nProviders
-} from '../../../../../testing/unit-test-helper';
+import { configureTestBed, i18nProviders } from '../../../../../testing/unit-test-helper';
 import { SharedModule } from '../../../../shared/shared.module';
-import { InventoryDevice } from './inventory-device.model';
 import { InventoryDevicesComponent } from './inventory-devices.component';
 
 describe('InventoryDevicesComponent', () => {
   let component: InventoryDevicesComponent;
   let fixture: ComponentFixture<InventoryDevicesComponent>;
-  let fixtureHelper: FixtureHelper;
-  const devices: InventoryDevice[] = [
-    {
-      hostname: 'node0',
-      uid: '1',
-      path: 'sda',
-      sys_api: {
-        vendor: 'AAA',
-        model: 'aaa',
-        size: 1024,
-        rotational: 'false',
-        human_readable_size: '1 KB'
-      },
-      available: false,
-      rejected_reasons: [''],
-      device_id: 'AAA-aaa-id0',
-      human_readable_type: 'nvme/ssd',
-      osd_ids: []
-    },
-    {
-      hostname: 'node0',
-      uid: '2',
-      path: 'sdb',
-      sys_api: {
-        vendor: 'AAA',
-        model: 'aaa',
-        size: 1024,
-        rotational: 'false',
-        human_readable_size: '1 KB'
-      },
-      available: true,
-      rejected_reasons: [''],
-      device_id: 'AAA-aaa-id1',
-      human_readable_type: 'nvme/ssd',
-      osd_ids: []
-    },
-    {
-      hostname: 'node0',
-      uid: '3',
-      path: 'sdc',
-      sys_api: {
-        vendor: 'BBB',
-        model: 'bbb',
-        size: 2048,
-        rotational: 'true',
-        human_readable_size: '2 KB'
-      },
-      available: true,
-      rejected_reasons: [''],
-      device_id: 'BBB-bbbb-id0',
-      human_readable_type: 'hdd',
-      osd_ids: []
-    },
-    {
-      hostname: 'node1',
-      uid: '4',
-      path: 'sda',
-      sys_api: {
-        vendor: 'CCC',
-        model: 'ccc',
-        size: 1024,
-        rotational: 'true',
-        human_readable_size: '1 KB'
-      },
-      available: false,
-      rejected_reasons: [''],
-      device_id: 'CCC-cccc-id0',
-      human_readable_type: 'hdd',
-      osd_ids: []
-    }
-  ];
 
   configureTestBed({
     imports: [FormsModule, HttpClientTestingModule, SharedModule, ToastrModule.forRoot()],
@@ -98,71 +21,15 @@ describe('InventoryDevicesComponent', () => {
 
   beforeEach(() => {
     fixture = TestBed.createComponent(InventoryDevicesComponent);
-    fixtureHelper = new FixtureHelper(fixture);
     component = fixture.componentInstance;
+    fixture.detectChanges();
   });
 
   it('should create', () => {
     expect(component).toBeTruthy();
   });
 
-  describe('without device data', () => {
-    beforeEach(() => {
-      fixture.detectChanges();
-    });
-
-    it('should have columns that are sortable', () => {
-      expect(component.columns.every((column) => Boolean(column.prop))).toBeTruthy();
-    });
-
-    it('should have filters', () => {
-      const labelTexts = fixtureHelper.getTextAll('.tc_filter span:first-child');
-      const filterLabels = _.map(component.filters, 'label');
-      expect(labelTexts).toEqual(filterLabels);
-
-      const optionTexts = fixtureHelper.getTextAll('.tc_filter option');
-      expect(optionTexts).toEqual(_.map(component.filters, 'initValue'));
-    });
-  });
-
-  describe('with device data', () => {
-    beforeEach(() => {
-      component.devices = devices;
-      fixture.detectChanges();
-    });
-
-    it('should have filters', () => {
-      for (let i = 0; i < component.filters.length; i++) {
-        const optionTexts = fixtureHelper.getTextAll(`.tc_filter:nth-child(${i + 1}) option`);
-        const optionTextsSet = new Set(optionTexts);
-
-        const filter = component.filters[i];
-        const columnValues = devices.map((device: InventoryDevice) => {
-          const valueGetter = getterForProp(filter.prop);
-          const value = valueGetter(device, filter.prop);
-          const formatValue = filter.pipe ? filter.pipe.transform(value) : value;
-          return `${formatValue}`;
-        });
-        const expectedOptionsSet = new Set(['*', ...columnValues]);
-        expect(optionTextsSet).toEqual(expectedOptionsSet);
-      }
-    });
-
-    it('should filter a single column', () => {
-      spyOn(component.filterChange, 'emit');
-      fixtureHelper.selectElement('.tc_filter:nth-child(1) select', 'node1');
-      expect(component.filterInDevices.length).toBe(1);
-      expect(component.filterInDevices[0]).toEqual(devices[3]);
-      expect(component.filterChange.emit).toHaveBeenCalled();
-    });
-
-    it('should filter multiple columns', () => {
-      spyOn(component.filterChange, 'emit');
-      fixtureHelper.selectElement('.tc_filter:nth-child(2) select', 'hdd');
-      fixtureHelper.selectElement('.tc_filter:nth-child(1) select', 'node0');
-      expect(component.filterInDevices.length).toBe(1);
-      expect(component.filterInDevices[0].uid).toBe('3');
-      expect(component.filterChange.emit).toHaveBeenCalledTimes(2);
-    });
+  it('should have columns that are sortable', () => {
+    expect(component.columns.every((column) => Boolean(column.prop))).toBeTruthy();
   });
 });
index ab198492373f097c8be010d556db16d6e7763aad..5eb13482ead6fd62f055eb8d270898c0121271f4 100644 (file)
@@ -1,7 +1,6 @@
 import { Component, EventEmitter, Input, OnChanges, OnInit, Output } from '@angular/core';
 import { I18n } from '@ngx-translate/i18n-polyfill';
 
-import { getterForProp } from '@swimlane/ngx-datatable/release/utils';
 import * as _ from 'lodash';
 import { BsModalService } from 'ngx-bootstrap/modal';
 
@@ -12,13 +11,12 @@ import { Icons } from '../../../../shared/enum/icons.enum';
 import { NotificationType } from '../../../../shared/enum/notification-type.enum';
 import { CdTableAction } from '../../../../shared/models/cd-table-action';
 import { CdTableColumn } from '../../../../shared/models/cd-table-column';
+import { CdTableColumnFiltersChange } from '../../../../shared/models/cd-table-column-filters-change';
 import { CdTableSelection } from '../../../../shared/models/cd-table-selection';
 import { Permission } from '../../../../shared/models/permissions';
 import { DimlessBinaryPipe } from '../../../../shared/pipes/dimless-binary.pipe';
 import { AuthStorageService } from '../../../../shared/services/auth-storage.service';
 import { NotificationService } from '../../../../shared/services/notification.service';
-import { InventoryDeviceFilter } from './inventory-device-filter.interface';
-import { InventoryDeviceFiltersChangeEvent } from './inventory-device-filters-change-event.interface';
 import { InventoryDevice } from './inventory-device.model';
 
 @Component({
@@ -46,14 +44,10 @@ export class InventoryDevicesComponent implements OnInit, OnChanges {
   // Device table row selection type
   @Input() selectionType: string = undefined;
 
-  @Output() filterChange = new EventEmitter<InventoryDeviceFiltersChangeEvent>();
-
-  filterInDevices: InventoryDevice[] = [];
-  filterOutDevices: InventoryDevice[] = [];
+  @Output() filterChange = new EventEmitter<CdTableColumnFiltersChange>();
 
   icons = Icons;
   columns: Array<CdTableColumn> = [];
-  filters: InventoryDeviceFilter[] = [];
   selection: CdTableSelection = new CdTableSelection();
   permission: Permission;
   tableActions: CdTableAction[];
@@ -140,93 +134,21 @@ export class InventoryDevicesComponent implements OnInit, OnChanges {
       return !this.hiddenColumns.includes(col.prop);
     });
 
-    // init filters
-    this.filters = this.columns
-      .filter((col: any) => {
-        return this.filterColumns.includes(col.prop);
-      })
-      .map((col: any) => {
-        return {
-          label: col.name,
-          prop: col.prop,
-          initValue: '*',
-          value: '*',
-          options: [{ value: '*', formatValue: '*' }],
-          pipe: col.pipe
-        };
-      });
-
-    this.filterInDevices = [...this.devices];
-    this.updateFilterOptions(this.devices);
-  }
-
-  ngOnChanges() {
-    this.updateFilterOptions(this.devices);
-    this.filterInDevices = [...this.devices];
-    // TODO: apply filter, columns changes, filter changes
-  }
-
-  updateFilterOptions(devices: InventoryDevice[]) {
-    // update filter options to all possible values in a column, might be time-consuming
-    this.filters.forEach((filter) => {
-      const values = _.sortedUniq(_.map(devices, filter.prop).sort());
-      const options = values.map((v: string) => {
-        return {
-          value: v,
-          formatValue: filter.pipe ? filter.pipe.transform(v) : v
-        };
-      });
-      filter.options = [{ value: '*', formatValue: '*' }, ...options];
-    });
-  }
-
-  doFilter() {
-    this.filterOutDevices = [];
-    const appliedFilters = [];
-    let devices: any = [...this.devices];
-    this.filters.forEach((filter) => {
-      if (filter.value === filter.initValue) {
-        return;
+    // init column filters
+    _.forEach(this.filterColumns, (prop) => {
+      const col = _.find(this.columns, { prop: prop });
+      if (col) {
+        col.filterable = true;
       }
-      appliedFilters.push({
-        label: filter.label,
-        prop: filter.prop,
-        value: filter.value,
-        formatValue: filter.pipe ? filter.pipe.transform(filter.value) : filter.value
-      });
-      // Separate devices to filter-in and filter-out parts.
-      // Cast column value to string type because options are always string.
-      const parts = _.partition(devices, (row) => {
-        // use getter from ngx-datatable for props like 'sys_api.size'
-        const valueGetter = getterForProp(filter.prop);
-        return `${valueGetter(row, filter.prop)}` === filter.value;
-      });
-      devices = parts[0];
-      this.filterOutDevices = [...this.filterOutDevices, ...parts[1]];
-    });
-    this.filterInDevices = devices;
-    this.filterChange.emit({
-      filters: appliedFilters,
-      filterInDevices: this.filterInDevices,
-      filterOutDevices: this.filterOutDevices
     });
   }
 
-  onFilterChange() {
-    this.doFilter();
+  ngOnChanges() {
+    this.devices = [...this.devices];
   }
 
-  onFilterReset() {
-    this.filters.forEach((item) => {
-      item.value = item.initValue;
-    });
-    this.filterInDevices = [...this.devices];
-    this.filterOutDevices = [];
-    this.filterChange.emit({
-      filters: [],
-      filterInDevices: this.filterInDevices,
-      filterOutDevices: this.filterOutDevices
-    });
+  onColumnFiltersChanged(event: CdTableColumnFiltersChange) {
+    this.filterChange.emit(event);
   }
 
   updateSelection(selection: CdTableSelection) {
index 0bac44ec2f455d04b1539e89a202a73c191bfcf3..7e9f8551a8a37b137a7da00d6e00633f4e1c8613 100644 (file)
@@ -1,5 +1,5 @@
-import { InventoryDeviceFiltersChangeEvent } from '../../inventory/inventory-devices/inventory-device-filters-change-event.interface';
+import { CdTableColumnFiltersChange } from '../../../../shared/models/cd-table-column-filters-change';
 
-export interface DevicesSelectionChangeEvent extends InventoryDeviceFiltersChangeEvent {
+export interface DevicesSelectionChangeEvent extends CdTableColumnFiltersChange {
   type: string;
 }
index fc1df4ef84955f56e24c3f9e28b2dee6eea82fdc..151966c5b6327a6db1bd40322c7a6bfd392d0766 100644 (file)
@@ -25,7 +25,7 @@
     <ng-template #blockClearDevices>
       <div class="pb-2 my-2 border-bottom">
         <span *ngFor="let filter of appliedFilters">
-          <span class="badge badge-dark mr-2">{{ filter.label }}: {{ filter.formatValue }}</span>
+          <span class="badge badge-dark mr-2">{{ filter.name }}: {{ filter.value.formatted }}</span>
         </span>
         <a class="tc_clearSelections"
            href=""
index 0fa59d27db8aab9b715f871eee6355ff052280e8..fffd7db565989bb8e6ce91f10efe148630cea3bd 100644 (file)
@@ -4,7 +4,7 @@ import * as _ from 'lodash';
 
 import { BsModalService, ModalOptions } from 'ngx-bootstrap/modal';
 import { Icons } from '../../../../shared/enum/icons.enum';
-import { InventoryDeviceFiltersChangeEvent } from '../../inventory/inventory-devices/inventory-device-filters-change-event.interface';
+import { CdTableColumnFiltersChange } from '../../../../shared/models/cd-table-column-filters-change';
 import { InventoryDevice } from '../../inventory/inventory-devices/inventory-device.model';
 import { OsdDevicesSelectionModalComponent } from '../osd-devices-selection-modal/osd-devices-selection-modal.component';
 import { DevicesSelectionChangeEvent } from './devices-selection-change-event.interface';
@@ -55,8 +55,8 @@ export class OsdDevicesSelectionGroupsComponent {
       }
     };
     const modalRef = this.bsModalService.show(OsdDevicesSelectionModalComponent, options);
-    modalRef.content.submitAction.subscribe((result: InventoryDeviceFiltersChangeEvent) => {
-      this.devices = result.filterInDevices;
+    modalRef.content.submitAction.subscribe((result: CdTableColumnFiltersChange) => {
+      this.devices = result.data;
       this.appliedFilters = result.filters;
       const event = _.assign({ type: this.type }, result);
       this.selected.emit(event);
index a543a959257e493792a1ad502c73e1e414b1cd00..1c51e174c9afbe14c37953d6df9e9994911abdb1 100644 (file)
@@ -18,7 +18,7 @@
       <div class="modal-footer">
         <cd-submit-button (submitAction)="onSubmit()"
                           [form]="formGroup"
-                          [disabled]="!canSubmit || filterInDevices.length === 0">{{ action | titlecase }}</cd-submit-button>
+                          [disabled]="!canSubmit || filteredDevices.length === 0">{{ action | titlecase }}</cd-submit-button>
         <cd-back-button [back]="bsModalRef.hide"></cd-back-button>
       </div>
     </form>
index 0e08b85c5c87f11282636eb72441881868a37f5d..e15c636cd349fcc5a7def7409fe0e1a49b3d09ba 100644 (file)
@@ -7,8 +7,8 @@ import { BsModalRef } from 'ngx-bootstrap/modal';
 import { ToastrModule } from 'ngx-toastr';
 
 import { configureTestBed, i18nProviders } from '../../../../../testing/unit-test-helper';
+import { CdTableColumnFiltersChange } from '../../../../shared/models/cd-table-column-filters-change';
 import { SharedModule } from '../../../../shared/shared.module';
-import { InventoryDeviceFiltersChangeEvent } from '../../inventory/inventory-devices/inventory-device-filters-change-event.interface';
 import { InventoryDevice } from '../../inventory/inventory-devices/inventory-device.model';
 import { InventoryDevicesComponent } from '../../inventory/inventory-devices/inventory-devices.component';
 import { OsdDevicesSelectionModalComponent } from './osd-devices-selection-modal.component';
@@ -71,23 +71,21 @@ describe('OsdDevicesSelectionModalComponent', () => {
   });
 
   it('should enable submit button after filtering some devices', () => {
-    const event: InventoryDeviceFiltersChangeEvent = {
+    const event: CdTableColumnFiltersChange = {
       filters: [
         {
-          label: 'hostname',
+          name: 'hostname',
           prop: 'hostname',
-          value: 'node0',
-          formatValue: 'node0'
+          value: { raw: 'node0', formatted: 'node0' }
         },
         {
-          label: 'size',
+          name: 'size',
           prop: 'size',
-          value: '1024',
-          formatValue: '1KiB'
+          value: { raw: '1024', formatted: '1KiB' }
         }
       ],
-      filterInDevices: devices,
-      filterOutDevices: []
+      data: devices,
+      dataOut: []
     };
     component.onFilterChange(event);
     fixture.detectChanges();
index 080cdec353ed5d1b4565b5966730e6c58dd66bac..4094617aba98f5bb95e15e8b118d66cd2c6a8c07 100644 (file)
@@ -7,7 +7,7 @@ import { ActionLabelsI18n } from '../../../../shared/constants/app.constants';
 import { Icons } from '../../../../shared/enum/icons.enum';
 import { CdFormBuilder } from '../../../../shared/forms/cd-form-builder';
 import { CdFormGroup } from '../../../../shared/forms/cd-form-group';
-import { InventoryDeviceFiltersChangeEvent } from '../../inventory/inventory-devices/inventory-device-filters-change-event.interface';
+import { CdTableColumnFiltersChange } from '../../../../shared/models/cd-table-column-filters-change';
 import { InventoryDevice } from '../../inventory/inventory-devices/inventory-device.model';
 
 @Component({
@@ -17,7 +17,7 @@ import { InventoryDevice } from '../../inventory/inventory-devices/inventory-dev
 })
 export class OsdDevicesSelectionModalComponent {
   @Output()
-  submitAction = new EventEmitter<InventoryDeviceFiltersChangeEvent>();
+  submitAction = new EventEmitter<CdTableColumnFiltersChange>();
 
   icons = Icons;
   filterColumns: string[] = [];
@@ -28,12 +28,9 @@ export class OsdDevicesSelectionModalComponent {
   action: string;
 
   devices: InventoryDevice[] = [];
+  filteredDevices: InventoryDevice[] = [];
+  event: CdTableColumnFiltersChange;
   canSubmit = false;
-  filters = [];
-  filterInDevices: InventoryDevice[] = [];
-  filterOutDevices: InventoryDevice[] = [];
-
-  isFiltered = false;
 
   constructor(
     private formBuilder: CdFormBuilder,
@@ -48,30 +45,25 @@ export class OsdDevicesSelectionModalComponent {
     this.formGroup = this.formBuilder.group({});
   }
 
-  onFilterChange(event: InventoryDeviceFiltersChangeEvent) {
+  onFilterChange(event: CdTableColumnFiltersChange) {
     this.canSubmit = false;
-    this.filters = event.filters;
     if (_.isEmpty(event.filters)) {
       // filters are cleared
-      this.filterInDevices = [];
-      this.filterOutDevices = [];
+      this.filteredDevices = [];
+      this.event = undefined;
     } else {
       // at least one filter is required (except hostname)
-      const filters = this.filters.filter((filter) => {
+      const filters = event.filters.filter((filter) => {
         return filter.prop !== 'hostname';
       });
       this.canSubmit = !_.isEmpty(filters);
-      this.filterInDevices = event.filterInDevices;
-      this.filterOutDevices = event.filterOutDevices;
+      this.filteredDevices = event.data;
+      this.event = event;
     }
   }
 
   onSubmit() {
-    this.submitAction.emit({
-      filters: this.filters,
-      filterInDevices: this.filterInDevices,
-      filterOutDevices: this.filterOutDevices
-    });
+    this.submitAction.emit(this.event);
     this.bsModalRef.hide();
   }
 }
index 8201eed4c3a0dfc5ddbb1c52489899c6b92237fb..976a2a59c7fac3e255212c7d6610051ab8fc92d9 100644 (file)
@@ -1,5 +1,5 @@
+import { CdTableColumnFiltersChange } from '../../../../shared/models/cd-table-column-filters-change';
 import { FormatterService } from '../../../../shared/services/formatter.service';
-import { InventoryDeviceAppliedFilter } from '../../inventory/inventory-devices/inventory-device-applied-filters.interface';
 
 export class DriveGroup {
   // DriveGroupSpec object.
@@ -52,14 +52,14 @@ export class DriveGroup {
     this.spec['host_pattern'] = pattern;
   }
 
-  setDeviceSelection(type: string, appliedFilters: InventoryDeviceAppliedFilter[]) {
+  setDeviceSelection(type: string, appliedFilters: CdTableColumnFiltersChange['filters']) {
     const key = `${type}_devices`;
     this.spec[key] = {};
     appliedFilters.forEach((filter) => {
       const attr = this.deviceSelectionAttrs[filter.prop];
       if (attr) {
         const name = attr.name;
-        this.spec[key][name] = attr.formatter ? attr.formatter(filter.value) : filter.value;
+        this.spec[key][name] = attr.formatter ? attr.formatter(filter.value.raw) : filter.value.raw;
       }
     });
   }
index c882534520c6adc59b72e42bdc232ac6eaefa2ac..5b05ea3e62fbd0e0112ae7cde2b8b1bdafbac680 100644 (file)
@@ -61,8 +61,8 @@ describe('OsdFormComponent', () => {
     const event: DevicesSelectionChangeEvent = {
       type: type,
       filters: [],
-      filterInDevices: devices,
-      filterOutDevices: []
+      data: devices,
+      dataOut: []
     };
     component.onDevicesSelected(event);
     if (type === 'data') {
index 006e2f2ae75bfa86449b6c2ba212b28152fcc917..24049bd8c9d35f0e1ad766b6574189d2929864eb 100644 (file)
@@ -185,15 +185,15 @@ export class OsdFormComponent implements OnInit {
   }
 
   onDevicesSelected(event: DevicesSelectionChangeEvent) {
-    this.availDevices = event.filterOutDevices;
+    this.availDevices = event.dataOut;
 
     if (event.type === 'data') {
       // If user selects data devices for a single host, make only remaining devices on
       // that host as available.
       const hostnameFilter = _.find(event.filters, { prop: 'hostname' });
       if (hostnameFilter) {
-        this.hostname = hostnameFilter.value;
-        this.availDevices = event.filterOutDevices.filter((device: InventoryDevice) => {
+        this.hostname = hostnameFilter.value.raw;
+        this.availDevices = event.dataOut.filter((device: InventoryDevice) => {
           return device.hostname === this.hostname;
         });
         this.driveGroup.setHostPattern(this.hostname);