From 791ec699c10df5828ff9b6bf84f0379042ba105d Mon Sep 17 00:00:00 2001 From: Xiao Gui <xgui3783@gmail.com> Date: Thu, 23 Jun 2022 15:17:38 +0200 Subject: [PATCH] ui: improved feature list filtering/order --- .../region/rich/region.rich.template.html | 2 +- .../entryListItem/entryListItem.component.ts | 5 ++- .../sapiViews/features/module.ts | 3 ++ .../features/orderFilterFeatureList.pipe.ts | 37 +++++++++++++++++++ 4 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 src/atlasComponents/sapiViews/features/orderFilterFeatureList.pipe.ts diff --git a/src/atlasComponents/sapiViews/core/region/region/rich/region.rich.template.html b/src/atlasComponents/sapiViews/core/region/region/rich/region.rich.template.html index 675927dfc..d4a9a79d1 100644 --- a/src/atlasComponents/sapiViews/core/region/region/rich/region.rich.template.html +++ b/src/atlasComponents/sapiViews/core/region/region/rich/region.rich.template.html @@ -68,7 +68,7 @@ <spinner-cmp *ngIf="rfDir.busy$ | async"></spinner-cmp> <sxplr-sapiviews-features-entry-list-item - *ngFor="let feat of rfDir.listOfFeatures$ | async" + *ngFor="let feat of rfDir.listOfFeatures$ | async | orderFilterFeatures" [sxplr-sapiviews-features-entry-list-item-feature]="feat" (click)="handleRegionalFeatureClicked(feat)"> </sxplr-sapiviews-features-entry-list-item> diff --git a/src/atlasComponents/sapiViews/features/entryListItem/entryListItem.component.ts b/src/atlasComponents/sapiViews/features/entryListItem/entryListItem.component.ts index 3b915ff24..8008affe3 100644 --- a/src/atlasComponents/sapiViews/features/entryListItem/entryListItem.component.ts +++ b/src/atlasComponents/sapiViews/features/entryListItem/entryListItem.component.ts @@ -1,4 +1,4 @@ -import { Component, Input } from "@angular/core"; +import { ChangeDetectionStrategy, Component, Input } from "@angular/core"; import { SapiFeatureModel } from "src/atlasComponents/sapi"; import { CleanedIeegDataset, CLEANED_IEEG_DATASET_TYPE, SapiDatasetModel, SapiParcellationFeatureMatrixModel, SapiRegionalFeatureReceptorModel, SapiSerializationErrorModel, SapiVOIDataResponse, SxplrCleanedFeatureModel } from "src/atlasComponents/sapi/type"; @@ -7,7 +7,8 @@ import { CleanedIeegDataset, CLEANED_IEEG_DATASET_TYPE, SapiDatasetModel, SapiPa templateUrl: `./entryListItem.template.html`, styleUrls: [ `./entryListItem.style.css` - ] + ], + changeDetection: ChangeDetectionStrategy.OnPush, }) export class SapiViewsFeaturesEntryListItem{ diff --git a/src/atlasComponents/sapiViews/features/module.ts b/src/atlasComponents/sapiViews/features/module.ts index cbf7aeaca..3df348c72 100644 --- a/src/atlasComponents/sapiViews/features/module.ts +++ b/src/atlasComponents/sapiViews/features/module.ts @@ -11,6 +11,7 @@ import * as ieeg from "./ieeg" import * as receptor from "./receptors" import {SapiViewsFeatureConnectivityModule} from "src/atlasComponents/sapiViews/features/connectivity"; import * as voi from "./voi" +import { OrderFilterFeaturesPipe } from "./orderFilterFeatureList.pipe" const { SxplrSapiViewsFeaturesIeegModule @@ -35,6 +36,7 @@ const { SapiViewsFeaturesVoiModule } = voi FeatureBadgeColourPipe, FeatureBadgeFlagPipe, SapiViewsFeaturesEntryListItem, + OrderFilterFeaturesPipe, ], providers: [ { @@ -48,6 +50,7 @@ const { SapiViewsFeaturesVoiModule } = voi SapiViewsFeaturesEntryListItem, SapiViewsFeaturesVoiModule, SapiViewsFeatureConnectivityModule, + OrderFilterFeaturesPipe, ] }) export class SapiViewsFeaturesModule{} diff --git a/src/atlasComponents/sapiViews/features/orderFilterFeatureList.pipe.ts b/src/atlasComponents/sapiViews/features/orderFilterFeatureList.pipe.ts new file mode 100644 index 000000000..382862b03 --- /dev/null +++ b/src/atlasComponents/sapiViews/features/orderFilterFeatureList.pipe.ts @@ -0,0 +1,37 @@ +import { Pipe, PipeTransform } from "@angular/core"; +import { CLEANED_IEEG_DATASET_TYPE, SapiFeatureModel, SxplrCleanedFeatureModel } from "src/atlasComponents/sapi/type"; +import { environment } from "src/environments/environment" + +type PipableFeatureType = SapiFeatureModel | SxplrCleanedFeatureModel + +type ArrayOperation<T extends boolean | number> = (input: PipableFeatureType) => T + +const FILTER_FN: ArrayOperation<boolean> = feature => { + return feature["@type"] !== "siibra/features/cells" +} + +const ORDER_LIST: ArrayOperation<number> = feature => { + if (feature["@type"] === "siibra/features/receptor") return -4 + if (feature["@type"] === CLEANED_IEEG_DATASET_TYPE) return -3 + if (feature['@type'] === "https://openminds.ebrains.eu/core/DatasetVersion") return 2 + return 0 +} + +@Pipe({ + name: 'orderFilterFeatures', + pure: true +}) + +export class OrderFilterFeaturesPipe implements PipeTransform{ + public transform(inputFeatures: PipableFeatureType[]): PipableFeatureType[] { + return inputFeatures + .filter(f => { + /** + * if experimental flag is set, do not filter out anything + */ + if (environment.EXPERIMENTAL_FEATURE_FLAG) return true + return FILTER_FN(f) + }) + .sort((a, b) => ORDER_LIST(a) - ORDER_LIST(b)) + } +} -- GitLab