Compare commits
2 Commits
bc2c62f6b3
...
e401a878ba
| Author | SHA1 | Date | |
|---|---|---|---|
| e401a878ba | |||
| 5f2e41acbc |
4079
package-lock.json
generated
4079
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1 @@
|
|||||||
|
<p>filter-config works!</p>
|
||||||
23
src/components/filter-config/filter-config.component.spec.ts
Normal file
23
src/components/filter-config/filter-config.component.spec.ts
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
|
||||||
|
import { FilterConfigComponent } from './filter-config.component';
|
||||||
|
|
||||||
|
describe('FilterConfigComponent', () => {
|
||||||
|
let component: FilterConfigComponent;
|
||||||
|
let fixture: ComponentFixture<FilterConfigComponent>;
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
await TestBed.configureTestingModule({
|
||||||
|
imports: [FilterConfigComponent]
|
||||||
|
})
|
||||||
|
.compileComponents();
|
||||||
|
|
||||||
|
fixture = TestBed.createComponent(FilterConfigComponent);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
fixture.detectChanges();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create', () => {
|
||||||
|
expect(component).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
||||||
15
src/components/filter-config/filter-config.component.ts
Normal file
15
src/components/filter-config/filter-config.component.ts
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
import { Component, inject, Input } from '@angular/core';
|
||||||
|
import { Filter } from '../../models/filter';
|
||||||
|
import { QueryService } from '../../services/query.service';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'fbi-filter-config',
|
||||||
|
standalone: true,
|
||||||
|
imports: [],
|
||||||
|
templateUrl: './filter-config.component.html',
|
||||||
|
styleUrl: './filter-config.component.scss',
|
||||||
|
})
|
||||||
|
export class FilterConfigComponent {
|
||||||
|
@Input() node!: Filter;
|
||||||
|
private queryService = inject(QueryService);
|
||||||
|
}
|
||||||
@@ -5,7 +5,6 @@
|
|||||||
(actionClick)="onActionClick($event)"
|
(actionClick)="onActionClick($event)"
|
||||||
></fbi-tree>
|
></fbi-tree>
|
||||||
|
|
||||||
<fbi-window #filter [config]="windowConfig"
|
<fbi-window #filter [config]="windowConfig">
|
||||||
>content content content content content content content content content
|
<fbi-filter-config></fbi-filter-config>
|
||||||
content content content content content content content content content
|
|
||||||
</fbi-window>
|
</fbi-window>
|
||||||
|
|||||||
@@ -1,18 +1,20 @@
|
|||||||
import { Component, ViewChild } from '@angular/core';
|
import { Component, ViewChild } from '@angular/core';
|
||||||
import { TreeComponent } from '../tree/tree.component';
|
import { faAdd, faFilter } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
import { combineLatest } from 'rxjs';
|
||||||
|
import { Action } from '../../models/action';
|
||||||
|
import { Filter } from '../../models/filter';
|
||||||
|
import { Query } from '../../models/query';
|
||||||
import { TreeNode } from '../../models/tree-node';
|
import { TreeNode } from '../../models/tree-node';
|
||||||
import { MetaService } from '../../services/meta.service';
|
import { MetaService } from '../../services/meta.service';
|
||||||
import { Action } from '../../models/action';
|
|
||||||
import { faAdd, faFilter } from '@fortawesome/free-solid-svg-icons';
|
|
||||||
import { QueryService } from '../../services/query.service';
|
import { QueryService } from '../../services/query.service';
|
||||||
import { combineLatest } from 'rxjs';
|
import { FilterConfigComponent } from '../filter-config/filter-config.component';
|
||||||
import { Query } from '../../models/query';
|
import { TreeComponent } from '../tree/tree.component';
|
||||||
import { WindowComponent } from '../window/window.component';
|
import { WindowComponent } from '../window/window.component';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'fbi-metadata',
|
selector: 'fbi-metadata',
|
||||||
standalone: true,
|
standalone: true,
|
||||||
imports: [TreeComponent, WindowComponent],
|
imports: [FilterConfigComponent, TreeComponent, WindowComponent],
|
||||||
templateUrl: './metadata.component.html',
|
templateUrl: './metadata.component.html',
|
||||||
styleUrl: './metadata.component.scss',
|
styleUrl: './metadata.component.scss',
|
||||||
})
|
})
|
||||||
@@ -21,10 +23,10 @@ export class MetadataComponent {
|
|||||||
@ViewChild(WindowComponent) window!: WindowComponent;
|
@ViewChild(WindowComponent) window!: WindowComponent;
|
||||||
|
|
||||||
windowComponent = WindowComponent;
|
windowComponent = WindowComponent;
|
||||||
|
|
||||||
windowConfig = {
|
windowConfig = {
|
||||||
title: 'test',
|
title: 'test',
|
||||||
};
|
};
|
||||||
|
filter: Filter = new Filter({});
|
||||||
|
|
||||||
constructor(metaService: MetaService, private queryService: QueryService) {
|
constructor(metaService: MetaService, private queryService: QueryService) {
|
||||||
combineLatest({
|
combineLatest({
|
||||||
@@ -65,6 +67,7 @@ export class MetadataComponent {
|
|||||||
this.queryService.add(event.node.data);
|
this.queryService.add(event.node.data);
|
||||||
break;
|
break;
|
||||||
case ACTIONS.FILTER:
|
case ACTIONS.FILTER:
|
||||||
|
this.filter = new Filter({ field: event.node.data });
|
||||||
this.window.show();
|
this.window.show();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,4 @@
|
|||||||
import { Component } from '@angular/core';
|
import { Component } from '@angular/core';
|
||||||
import { TreeComponent } from '../tree/tree.component';
|
|
||||||
import { TreeNode } from '../../models/tree-node';
|
|
||||||
import { QueryService } from '../../services/query.service';
|
|
||||||
import { Query } from '../../models/query';
|
|
||||||
import { Action } from '../../models/action';
|
|
||||||
import {
|
import {
|
||||||
faArrowDown,
|
faArrowDown,
|
||||||
faArrowUp,
|
faArrowUp,
|
||||||
@@ -13,9 +8,14 @@ import {
|
|||||||
faSortDesc,
|
faSortDesc,
|
||||||
faSortDown,
|
faSortDown,
|
||||||
} from '@fortawesome/free-solid-svg-icons';
|
} from '@fortawesome/free-solid-svg-icons';
|
||||||
import { ExecuteService } from '../../services/execute.service';
|
|
||||||
import { Header } from '../../models/header';
|
|
||||||
import { SORT } from '../../enums/sort';
|
import { SORT } from '../../enums/sort';
|
||||||
|
import { Action } from '../../models/action';
|
||||||
|
import { Header } from '../../models/header';
|
||||||
|
import { Query } from '../../models/query';
|
||||||
|
import { TreeNode } from '../../models/tree-node';
|
||||||
|
import { ExecuteService } from '../../services/execute.service';
|
||||||
|
import { QueryService } from '../../services/query.service';
|
||||||
|
import { TreeComponent } from '../tree/tree.component';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'fbi-query',
|
selector: 'fbi-query',
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
import { CommonModule } from '@angular/common';
|
import { CommonModule } from '@angular/common';
|
||||||
import { Component } from '@angular/core';
|
import { Component } from '@angular/core';
|
||||||
import { TreeComponent } from '../tree/tree.component';
|
|
||||||
import { QueryService } from '../../services/query.service';
|
|
||||||
import { Query } from '../../models/query';
|
|
||||||
import { ExecuteService } from '../../services/execute.service';
|
|
||||||
import { TableComponent } from '../table/table.component';
|
|
||||||
import { Result } from '../../models/result';
|
|
||||||
import { Header } from '../../models/header';
|
import { Header } from '../../models/header';
|
||||||
import { Page } from '../../models/page';
|
import { Page } from '../../models/page';
|
||||||
|
import { Query } from '../../models/query';
|
||||||
|
import { Result } from '../../models/result';
|
||||||
|
import { ExecuteService } from '../../services/execute.service';
|
||||||
|
import { QueryService } from '../../services/query.service';
|
||||||
|
import { TableComponent } from '../table/table.component';
|
||||||
|
import { TreeComponent } from '../tree/tree.component';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'fbi-result',
|
selector: 'fbi-result',
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { Component, Input, OnInit, inject } from '@angular/core';
|
|
||||||
import { CommonModule } from '@angular/common';
|
import { CommonModule } from '@angular/common';
|
||||||
|
import { Component, Input, OnInit, inject } from '@angular/core';
|
||||||
|
import { FormsModule } from '@angular/forms';
|
||||||
import { Observable } from 'rxjs';
|
import { Observable } from 'rxjs';
|
||||||
import { KeyValue } from '../../models/key-value';
|
import { KeyValue } from '../../models/key-value';
|
||||||
import { FilterService } from '../../services/filters.service';
|
import { FilterService } from '../../services/filters.service';
|
||||||
import { FormsModule } from '@angular/forms';
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'fbi-select',
|
selector: 'fbi-select',
|
||||||
|
|||||||
@@ -7,16 +7,16 @@ import {
|
|||||||
Output,
|
Output,
|
||||||
SimpleChanges,
|
SimpleChanges,
|
||||||
} from '@angular/core';
|
} from '@angular/core';
|
||||||
import { Header } from '../../models/header';
|
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
|
||||||
import {
|
import {
|
||||||
faSort,
|
faSort,
|
||||||
faSortDown,
|
faSortDown,
|
||||||
faSortUp,
|
faSortUp,
|
||||||
} from '@fortawesome/free-solid-svg-icons';
|
} from '@fortawesome/free-solid-svg-icons';
|
||||||
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
|
|
||||||
import { SORT } from '../../enums/sort';
|
import { SORT } from '../../enums/sort';
|
||||||
import { Result } from '../../models/result';
|
import { Header } from '../../models/header';
|
||||||
import { Page } from '../../models/page';
|
import { Page } from '../../models/page';
|
||||||
|
import { Result } from '../../models/result';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'fbi-table',
|
selector: 'fbi-table',
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
||||||
import { CommonModule } from '@angular/common';
|
import { CommonModule } from '@angular/common';
|
||||||
import { TreeNode } from '../../models/tree-node';
|
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
||||||
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
|
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
|
||||||
import { faCaretDown, faCaretRight } from '@fortawesome/free-solid-svg-icons';
|
import { faCaretDown, faCaretRight } from '@fortawesome/free-solid-svg-icons';
|
||||||
import { Action } from '../../models/action';
|
import { Action } from '../../models/action';
|
||||||
|
import { TreeNode } from '../../models/tree-node';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'fbi-tree',
|
selector: 'fbi-tree',
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import { CommonModule, DOCUMENT } from '@angular/common';
|
||||||
import {
|
import {
|
||||||
Component,
|
Component,
|
||||||
EventEmitter,
|
EventEmitter,
|
||||||
@@ -6,7 +7,6 @@ import {
|
|||||||
Input,
|
Input,
|
||||||
Output,
|
Output,
|
||||||
} from '@angular/core';
|
} from '@angular/core';
|
||||||
import { CommonModule, DOCUMENT } from '@angular/common';
|
|
||||||
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
|
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
|
||||||
import { faRectangleXmark } from '@fortawesome/free-regular-svg-icons';
|
import { faRectangleXmark } from '@fortawesome/free-regular-svg-icons';
|
||||||
import { WindowConfig } from './window-config';
|
import { WindowConfig } from './window-config';
|
||||||
|
|||||||
4
src/enums/filter-op.ts
Normal file
4
src/enums/filter-op.ts
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
export enum FilterOp {
|
||||||
|
Includes = 'in',
|
||||||
|
Excludes = 'ex',
|
||||||
|
}
|
||||||
17
src/models/filter.ts
Normal file
17
src/models/filter.ts
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
import { FilterOp } from '../enums/filter-op';
|
||||||
|
|
||||||
|
export class Filter {
|
||||||
|
field: string;
|
||||||
|
op: FilterOp;
|
||||||
|
values: string[];
|
||||||
|
|
||||||
|
constructor(data: Partial<Filter>) {
|
||||||
|
this.field = data?.field ?? '';
|
||||||
|
this.op = data?.op ?? FilterOp.Includes;
|
||||||
|
this.values = data?.values ?? [];
|
||||||
|
}
|
||||||
|
|
||||||
|
toString(): string {
|
||||||
|
return `(${this.field}:${this.op}[${this.values.join(',')}])`;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,15 +1,18 @@
|
|||||||
|
import { Filter } from './filter';
|
||||||
import { Page } from './page';
|
import { Page } from './page';
|
||||||
import { Sort } from './sort';
|
import { Sort } from './sort';
|
||||||
|
|
||||||
export class Query {
|
export class Query {
|
||||||
fields: string[];
|
fields: string[];
|
||||||
filter: string[];
|
filter: Filter[];
|
||||||
sort: Sort;
|
sort: Sort;
|
||||||
page?: Page;
|
page?: Page;
|
||||||
|
|
||||||
constructor(data: Partial<Query>) {
|
constructor(data: Partial<Query>) {
|
||||||
this.fields = data?.fields ?? [];
|
this.fields = data?.fields ?? [];
|
||||||
this.filter = data?.filter ?? [];
|
this.filter = (data?.filter ?? []).map(
|
||||||
|
(f: Partial<Filter>) => new Filter(f)
|
||||||
|
);
|
||||||
this.sort = new Sort(data?.sort ?? {});
|
this.sort = new Sort(data?.sort ?? {});
|
||||||
if (data?.page) this.page = new Page(data?.page);
|
if (data?.page) this.page = new Page(data?.page);
|
||||||
}
|
}
|
||||||
@@ -21,7 +24,7 @@ export class Query {
|
|||||||
toString(): string {
|
toString(): string {
|
||||||
return [
|
return [
|
||||||
this.fields.join(','),
|
this.fields.join(','),
|
||||||
'',
|
this.filter.map((f: Filter) => f.toString()).join(','),
|
||||||
this.page?.toString(),
|
this.page?.toString(),
|
||||||
this.sort.toString(),
|
this.sort.toString(),
|
||||||
].join(';');
|
].join(';');
|
||||||
|
|||||||
Reference in New Issue
Block a user