Improve filter query display performance
Signed-off-by: trivernis <trivernis@protonmail.com>pull/3/head
parent
96c44d1fbc
commit
83f820e8ea
@ -0,0 +1,8 @@
|
|||||||
|
import { HasPropertyPipe } from './has-property.pipe';
|
||||||
|
|
||||||
|
describe('HasPropertyPipe', () => {
|
||||||
|
it('create an instance', () => {
|
||||||
|
const pipe = new HasPropertyPipe();
|
||||||
|
expect(pipe).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,11 @@
|
|||||||
|
import {Pipe, PipeTransform} from "@angular/core";
|
||||||
|
|
||||||
|
@Pipe({
|
||||||
|
name: "hasProperty"
|
||||||
|
})
|
||||||
|
export class HasPropertyPipe implements PipeTransform {
|
||||||
|
|
||||||
|
transform(value: any, propertyName: string): unknown {
|
||||||
|
return propertyName in value;
|
||||||
|
}
|
||||||
|
}
|
@ -1,15 +1,15 @@
|
|||||||
<span *ngIf="is('OrExpression')" class="or-expression">
|
<span *ngIf="this.orExpression" class="or-expression">
|
||||||
<ng-container *ngFor="let query of this.orExpression().OrExpression">
|
<ng-container *ngFor="let query of this.orExpression">
|
||||||
<app-property-query-item *ngIf="this.queryIs(query, 'Property')"
|
<app-property-query-item *ngIf="query | hasProperty: 'Property'"
|
||||||
[propertyQuery]="this.propertyQuery(query).Property"></app-property-query-item>
|
[propertyQuery]="query | getPropertyQuery"></app-property-query-item>
|
||||||
<app-tag-query-item *ngIf="this.queryIs(query, 'Tag')"
|
<app-tag-query-item *ngIf="query | hasProperty: 'Tag'"
|
||||||
[tagQuery]="this.tagQuery(query).Tag"></app-tag-query-item>
|
[tagQuery]="query | getTagQuery"></app-tag-query-item>
|
||||||
<span class="or-combinator"> OR </span>
|
<span class="or-combinator"> OR </span>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
</span>
|
</span>
|
||||||
<span *ngIf="is('Query')" class="query">
|
<span *ngIf="this.query" class="query">
|
||||||
<app-property-query-item *ngIf="this.queryIs(this.query().Query, 'Property')"
|
<app-property-query-item *ngIf="this.query | hasProperty: 'Property'"
|
||||||
[propertyQuery]="this.propertyQuery(this.query().Query).Property"></app-property-query-item>
|
[propertyQuery]="this.query | getPropertyQuery"></app-property-query-item>
|
||||||
<app-tag-query-item *ngIf="this.queryIs(this.query().Query, 'Tag')"
|
<app-tag-query-item *ngIf="this.query | hasProperty: 'Tag'"
|
||||||
[tagQuery]="this.tagQuery(this.query().Query).Tag"></app-tag-query-item>
|
[tagQuery]="this.query | getTagQuery"></app-tag-query-item>
|
||||||
</span>
|
</span>
|
||||||
|
@ -1,47 +1,35 @@
|
|||||||
import {Component, Input} from "@angular/core";
|
import {ChangeDetectionStrategy, Component, Input, OnChanges, OnInit, SimpleChanges} from "@angular/core";
|
||||||
import {
|
import {FilterExpression, FilterQuery} from "../../../../../../api/api-types/files";
|
||||||
FilterExpression,
|
|
||||||
FilterExpressionOrExpression,
|
|
||||||
FilterExpressionQuery,
|
|
||||||
FilterQuery,
|
|
||||||
FilterQueryProperty,
|
|
||||||
FilterQueryTag
|
|
||||||
} from "../../../../../../api/api-types/files";
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: "app-filter-expression-item",
|
selector: "app-filter-expression-item",
|
||||||
templateUrl: "./filter-expression-item.component.html",
|
templateUrl: "./filter-expression-item.component.html",
|
||||||
styleUrls: ["./filter-expression-item.component.scss"]
|
styleUrls: ["./filter-expression-item.component.scss"],
|
||||||
|
changeDetection: ChangeDetectionStrategy.OnPush
|
||||||
})
|
})
|
||||||
export class FilterExpressionItemComponent {
|
export class FilterExpressionItemComponent implements OnInit, OnChanges {
|
||||||
|
|
||||||
|
|
||||||
@Input() filter!: FilterExpression;
|
@Input() filter!: FilterExpression;
|
||||||
|
public orExpression?: FilterQuery[];
|
||||||
|
public query?: FilterQuery;
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public is(key: "OrExpression" | "Query"): boolean {
|
public ngOnInit(): void {
|
||||||
return key in this.filter;
|
this.parseQuery();
|
||||||
}
|
|
||||||
|
|
||||||
public orExpression(): FilterExpressionOrExpression {
|
|
||||||
return this.filter as FilterExpressionOrExpression;
|
|
||||||
}
|
|
||||||
|
|
||||||
public query(): FilterExpressionQuery {
|
|
||||||
return this.filter as FilterExpressionQuery;
|
|
||||||
}
|
|
||||||
|
|
||||||
public queryIs(query: FilterQuery, key: "Property" | "Tag"): boolean {
|
|
||||||
return key in query;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public propertyQuery(query: FilterQuery): FilterQueryProperty {
|
public ngOnChanges(changes: SimpleChanges): void {
|
||||||
return query as FilterQueryProperty;
|
if (changes["filter"]) {
|
||||||
|
this.parseQuery();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public tagQuery(query: FilterQuery): FilterQueryTag {
|
private parseQuery() {
|
||||||
return query as FilterQueryTag;
|
if ("Query" in this.filter) {
|
||||||
|
this.query = this.filter.Query;
|
||||||
|
} else {
|
||||||
|
this.orExpression = this.filter.OrExpression;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,8 @@
|
|||||||
|
import { GetPropertyQueryPipe } from './get-property-query.pipe';
|
||||||
|
|
||||||
|
describe('GetPropertyQueryPipe', () => {
|
||||||
|
it('create an instance', () => {
|
||||||
|
const pipe = new GetPropertyQueryPipe();
|
||||||
|
expect(pipe).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,13 @@
|
|||||||
|
import {Pipe, PipeTransform} from "@angular/core";
|
||||||
|
import {FilterQuery, FilterQueryProperty, PropertyQuery} from "../../../../../../api/api-types/files";
|
||||||
|
|
||||||
|
@Pipe({
|
||||||
|
name: "getPropertyQuery"
|
||||||
|
})
|
||||||
|
export class GetPropertyQueryPipe implements PipeTransform {
|
||||||
|
|
||||||
|
transform(value: FilterQuery): PropertyQuery {
|
||||||
|
return (value as FilterQueryProperty).Property;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
import { GetTagQueryPipe } from './get-tag-query.pipe';
|
||||||
|
|
||||||
|
describe('GetTagQueryPipe', () => {
|
||||||
|
it('create an instance', () => {
|
||||||
|
const pipe = new GetTagQueryPipe();
|
||||||
|
expect(pipe).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,12 @@
|
|||||||
|
import {Pipe, PipeTransform} from "@angular/core";
|
||||||
|
import {FilterQuery, FilterQueryTag, TagQuery} from "../../../../../../api/api-types/files";
|
||||||
|
|
||||||
|
@Pipe({
|
||||||
|
name: "getTagQuery"
|
||||||
|
})
|
||||||
|
export class GetTagQueryPipe implements PipeTransform {
|
||||||
|
|
||||||
|
transform(value: FilterQuery): TagQuery {
|
||||||
|
return (value as FilterQueryTag).Tag;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue