Skip to content

Commit f2d1fe8

Browse files
committed
Merge branch 'develop'
2 parents 8306439 + 90b8b24 commit f2d1fe8

File tree

5 files changed

+88
-23
lines changed

5 files changed

+88
-23
lines changed

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "inesdata-connector-interface",
3-
"version": "0.10.0",
3+
"version": "0.11.0",
44
"project": "com.gmv.inesdata",
55
"scripts": {
66
"ng": "ng",

src/app/pages/contract-definitions/contract-definition-new/contract-definition-new.component.html

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,27 @@
2727
</mat-select>
2828
</mat-form-field>
2929

30-
<mat-form-field class="form-field form-field-assets" id="form-field-contract-assets">
30+
<mat-form-field class="form-field form-field-assets" id="form-field-contract-assets" floatLabel="always">
31+
3132
<mat-label>Assets</mat-label>
32-
<mat-select [(ngModel)]="assets" multiple>
33-
<mat-option *ngFor="let asset of availableAssets" [value]="asset">
34-
{{asset.id}}
33+
<mat-autocomplete #auto="matAutocomplete" [displayWith]="displayAsset">
34+
<mat-option *ngFor="let asset of filteredAssets" [value]="asset" (onSelectionChange)="addAsset($event, asset)">
35+
{{ asset.id }}
3536
</mat-option>
36-
</mat-select>
37+
</mat-autocomplete>
38+
39+
<mat-chip-listbox>
40+
<mat-chip *ngFor="let asset of selectedAssets" [removable]="true" (removed)="removeAsset(asset)">
41+
{{ asset.id }}
42+
<mat-icon matChipRemove>cancel</mat-icon>
43+
</mat-chip>
44+
45+
<input
46+
matInput
47+
placeholder="Search assets"
48+
[formControl]="assetControl"
49+
[matAutocomplete]="auto">
50+
</mat-chip-listbox>
3751
</mat-form-field>
3852
</div>
3953

src/app/pages/contract-definitions/contract-definition-new/contract-definition-new.component.ts

Lines changed: 53 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import { Component, OnInit, QueryList, ViewChildren } from '@angular/core';
22
import { AssetService } from "../../../shared/services/asset.service";
33
import { PolicyService } from "../../../shared/services/policy.service";
4-
import { Asset, PolicyDefinition, ContractDefinitionInput } from "../../../shared/models/edc-connector-entities";
4+
import { Asset, PolicyDefinition, ContractDefinitionInput, QuerySpec } from "../../../shared/models/edc-connector-entities";
55
import { NotificationService } from 'src/app/shared/services/notification.service';
66
import { ContractDefinitionService } from 'src/app/shared/services/contractDefinition.service';
7-
import { BehaviorSubject } from 'rxjs';
7+
import { BehaviorSubject, finalize, Observable, of, startWith, switchMap, tap } from 'rxjs';
88
import { Router } from '@angular/router';
9-
import { NgModel } from '@angular/forms';
9+
import { FormControl, NgModel } from '@angular/forms';
1010

1111

1212
@Component({
@@ -16,13 +16,16 @@ import { NgModel } from '@angular/forms';
1616
})
1717
export class ContractDefinitionNewComponent implements OnInit {
1818

19+
assetControl = new FormControl('');
20+
filteredAssets: Asset[] = [];
21+
selectedAssets: Asset[] = [];
22+
isLoading = false;
1923
policies: Array<PolicyDefinition> = [];
2024
availableAssets: Asset[] = [];
2125
name: string = '';
2226
editMode = false;
2327
accessPolicy?: PolicyDefinition;
2428
contractPolicy?: PolicyDefinition;
25-
assets: Asset[] = [];
2629
contractDefinition: ContractDefinitionInput = {
2730
"@id": '',
2831
assetsSelector: [],
@@ -45,14 +48,49 @@ export class ContractDefinitionNewComponent implements OnInit {
4548
this.accessPolicy = this.policies.find(policy => policy['@id'] === this.contractDefinition.accessPolicyId);
4649
this.contractPolicy = this.policies.find(policy => policy['@id'] === this.contractDefinition.contractPolicyId);
4750
});
48-
this.assetService.requestAssets().subscribe(assets => {
49-
this.availableAssets = assets;
50-
// preselection
51-
if (this.contractDefinition) {
52-
const assetIds = this.contractDefinition.assetsSelector.map(c => c.operandRight?.toString());
53-
this.assets = this.availableAssets.filter(asset => assetIds.includes(asset.id));
54-
}
55-
})
51+
52+
this.assetControl.valueChanges.pipe(
53+
startWith(''),
54+
tap(() => this.isLoading = true),
55+
switchMap(value => {
56+
const query = typeof value === 'string' ? value.trim() : '';
57+
const querySpec: QuerySpec = {
58+
offset: 0,
59+
limit: 50,
60+
filterExpression: [
61+
{
62+
operandLeft: 'id',
63+
operator: 'ilike',
64+
operandRight: `%${query}%`
65+
}
66+
]
67+
};
68+
return this.assetService.requestAssets(querySpec)
69+
.pipe(
70+
finalize(() => this.isLoading = false)
71+
);
72+
})
73+
).subscribe(results => {
74+
this.filteredAssets = results.filter(
75+
asset => !this.selectedAssets.some(sel => sel.id === asset.id)
76+
);
77+
78+
});
79+
}
80+
81+
displayAsset(asset: Asset): string {
82+
return asset ? asset.id : '';
83+
}
84+
85+
addAsset(event: any, asset: Asset): void {
86+
if (event.isUserInput && !this.selectedAssets.find(a => a.id === asset.id)) {
87+
this.selectedAssets.push(asset);
88+
this.assetControl.setValue('');
89+
}
90+
}
91+
92+
removeAsset(asset: Asset): void {
93+
this.selectedAssets = this.selectedAssets.filter(a => a.id !== asset.id);
5694
}
5795

5896
onSave() {
@@ -69,8 +107,9 @@ export class ContractDefinitionNewComponent implements OnInit {
69107
this.contractDefinition.contractPolicyId = this.contractPolicy['@id']!;
70108
this.contractDefinition.assetsSelector = [];
71109

72-
if (this.assets.length > 0) {
73-
const ids = this.assets.map(asset => asset.id);
110+
if (this.selectedAssets.length > 0) {
111+
const ids = this.selectedAssets.map(asset => asset.id);
112+
74113
this.contractDefinition.assetsSelector = [...this.contractDefinition.assetsSelector, {
75114
operandLeft: 'https://w3id.org/edc/v0.0.1/ns/id',
76115
operator: 'in',

src/app/pages/contract-definitions/contract-definitions.module.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@ import {ContractDefinitonsRoutingModule} from "./contract-definitions-routing.mo
44
import { ContractDefinitionViewerComponent } from './contract-definition-viewer/contract-definition-viewer.component';
55
import { SharedModule } from 'src/app/shared/shared.module';
66
import { ContractDefinitionNewComponent } from './contract-definition-new/contract-definition-new.component';
7+
import { ReactiveFormsModule } from '@angular/forms';
8+
import { MatAutocompleteModule } from '@angular/material/autocomplete';
9+
import { MatChipsModule } from '@angular/material/chips';
10+
import { MatFormFieldModule } from '@angular/material/form-field';
11+
import { MatIconModule } from '@angular/material/icon';
12+
import { MatInputModule } from '@angular/material/input';
713

814
@NgModule({
915
declarations: [
@@ -12,7 +18,13 @@ import { ContractDefinitionNewComponent } from './contract-definition-new/contra
1218
],
1319
imports: [
1420
ContractDefinitonsRoutingModule,
15-
SharedModule
21+
SharedModule,
22+
MatChipsModule,
23+
MatAutocompleteModule,
24+
MatInputModule,
25+
MatFormFieldModule,
26+
MatIconModule,
27+
ReactiveFormsModule,
1628
]
1729
})
1830
export class ContractDefinitionsModule { }

0 commit comments

Comments
 (0)