diff --git a/fake-backend/json/brokerCatalog.json b/fake-backend/json/brokerCatalog.json deleted file mode 100644 index e0e2d6b1b..000000000 --- a/fake-backend/json/brokerCatalog.json +++ /dev/null @@ -1,163 +0,0 @@ -{ - "availableFilters": { - "fields": [] - }, - "availableSortings": [ - { - "sorting": "MATCH", - "title": "by match" - }, - { - "sorting": "TITLE", - "title": "by title" - }, - { - "sorting": "MOST_RECENT", - "title": "most recent" - }, - { - "sorting": "ORIGINATOR", - "title": "by connector" - } - ], - "paginationMetadata": { - "numTotal": 1, - "numVisible": 1, - "pageOneBased": 1, - "pageSize": 1 - }, - "dataOffers": [ - { - "connectorInfo": { - "endpoint": "http://my-connector/ids/data", - "title": "Example Connector", - "description": "My example Connector...", - "onlineStatus": "ONLINE", - "offlineSinceOrLastUpdatedAt": "2023-05-25T16:23:34+02:00" - }, - "asset": { - "assetId": "urn:artifact:db-rail-network-2023-jan", - "createdAt": "2023-05-20T16:23:34+02:00", - "properties": { - "asset:prop:id": "urn:artifact:db-rail-network-2023-jan", - "asset:prop:name": "Rail Network DB 2023 January", - "asset:prop:version": "1.1", - "asset:prop:originator": "https://example-connector.rail-mgmt.bahn.de/api/v1/ids/data", - "asset:prop:originatorOrganization": "Deutsche Bahn AG", - "asset:prop:keywords": "db, bahn, rail, Rail-Designer", - "asset:prop:contenttype": "application/json", - "asset:prop:description": "Train Network Map released on 10.01.2023, valid until 31.02.2023. \nFile format is xyz as exported by Rail-Designer.", - "asset:prop:language": "https://w3id.org/idsa/code/EN", - "asset:prop:publisher": "https://my.cool-api.gg/about", - "asset:prop:standardLicense": "https://my.cool-api.gg/license", - "asset:prop:endpointDocumentation": "https://my.cool-api.gg/docs", - "http://w3id.org/mds#dataCategory": "Infrastructure and Logistics", - "http://w3id.org/mds#dataSubcategory": "General Information About Planning Of Routes", - "http://w3id.org/mds#dataModel": "my-data-model-001", - "http://w3id.org/mds#geoReferenceMethod": "my-geo-reference-method", - "http://w3id.org/mds#transportMode": "Rail" - } - }, - "policy": [ - { - "legacyPolicy": { - "permissions": [ - { - "edctype": "dataspaceconnector:permission", - "uid": null, - "target": "urn:artifact:bitcoin", - "action": { - "type": "USE", - "includedIn": null, - "constraint": null - }, - "assignee": null, - "assigner": null, - "constraints": [ - { - "edctype": "AtomicConstraint", - "leftExpression": { - "edctype": "dataspaceconnector:literalexpression", - "value": "POLICY_EVALUATION_TIME" - }, - "rightExpression": { - "edctype": "dataspaceconnector:literalexpression", - "value": "2023-01-01T23:00:00.000Z" - }, - "operator": "GT" - }, - { - "edctype": "AtomicConstraint", - "leftExpression": { - "edctype": "dataspaceconnector:literalexpression", - "value": "POLICY_EVALUATION_TIME" - }, - "rightExpression": { - "edctype": "dataspaceconnector:literalexpression", - "value": "2023-01-04T23:00:00.000Z" - }, - "operator": "LT" - } - ], - "duties": [] - } - ], - "prohibitions": [], - "obligations": [], - "extensibleProperties": {}, - "inheritsFrom": null, - "assigner": null, - "assignee": null, - "target": "urn:artifact:bitcoin", - "@type": { - "@policytype": "set" - } - } - }, - { - "legacyPolicy": { - "permissions": [ - { - "edctype": "dataspaceconnector:permission", - "uid": null, - "target": "urn:artifact:bitcoin", - "action": { - "type": "USE", - "includedIn": null, - "constraint": null - }, - "assignee": null, - "assigner": null, - "constraints": [ - { - "edctype": "AtomicConstraint", - "leftExpression": { - "edctype": "dataspaceconnector:literalexpression", - "value": "ALWAYS_TRUE" - }, - "rightExpression": { - "edctype": "dataspaceconnector:literalexpression", - "value": "true" - }, - "operator": "EQ" - } - ], - "duties": [] - } - ], - "prohibitions": [], - "obligations": [], - "extensibleProperties": {}, - "inheritsFrom": null, - "assigner": null, - "assignee": null, - "target": "urn:artifact:bitcoin", - "@type": { - "@policytype": "set" - } - } - } - ] - } - ] -} diff --git a/fake-backend/json/brokerCatalogPage.json b/fake-backend/json/brokerCatalogPage.json new file mode 100644 index 000000000..3195a6dfb --- /dev/null +++ b/fake-backend/json/brokerCatalogPage.json @@ -0,0 +1,79 @@ +{ + "availableFilters": {"fields": []}, + "availableSortings": [ + {"sorting": "MOST_RECENT", "title": "Most Recent"}, + {"sorting": "TITLE", "title": "By Title"}, + {"sorting": "ORIGINATOR", "title": "By Connector"} + ], + "paginationMetadata": { + "numTotal": 1, + "numVisible": 1, + "pageOneBased": 1, + "pageSize": 1 + }, + "dataOffers": [ + { + "assetId": "urn:artifact:my-asset", + "connectorEndpoint": "http://my-connector/ids/data", + "connectorOnlineStatus": "ONLINE", + "connectorOfflineSinceOrLastUpdatedAt": "2023-05-31T12:02:41+02:00", + "createdAt": "2023-05-26T12:02:41+02:00", + "updatedAt": "2023-05-31T12:02:41+02:00", + "properties": { + "asset:prop:id": "urn:artifact:db-rail-network-2023-jan", + "asset:prop:name": "Rail Network DB 2023 January", + "asset:prop:version": "1.1", + "asset:prop:originator": "https://example-connector.rail-mgmt.bahn.de/api/v1/ids/data", + "asset:prop:originatorOrganization": "Deutsche Bahn AG", + "asset:prop:keywords": "db, bahn, rail, Rail-Designer", + "asset:prop:contenttype": "application/json", + "asset:prop:description": "Train Network Map released on 10.01.2023, valid until 31.02.2023. \nFile format is xyz as exported by Rail-Designer.", + "asset:prop:language": "https://w3id.org/idsa/code/EN", + "asset:prop:publisher": "https://my.cool-api.gg/about", + "asset:prop:standardLicense": "https://my.cool-api.gg/license", + "asset:prop:endpointDocumentation": "https://my.cool-api.gg/docs", + "http://w3id.org/mds#dataCategory": "Infrastructure and Logistics", + "http://w3id.org/mds#dataSubcategory": "General Information About Planning Of Routes", + "http://w3id.org/mds#dataModel": "my-data-model-001", + "http://w3id.org/mds#geoReferenceMethod": "my-geo-reference-method", + "http://w3id.org/mds#transportMode": "Rail" + }, + "contractOffers": [ + { + "contractOfferId": "my-contract-offer-1", + "createdAt": "2023-05-26T12:02:41+02:00", + "updatedAt": "2023-05-31T12:02:41+02:00", + "contractPolicy": { + "legacyPolicy": { + "permissions": [ + { + "edctype": "dataspaceconnector:permission", + "action": { + "type": "USE" + }, + "constraints": [ + { + "edctype": "AtomicConstraint", + "leftExpression": { + "edctype": "dataspaceconnector:literalexpression", + "value": "ALWAYS_TRUE" + }, + "rightExpression": { + "edctype": "dataspaceconnector:literalexpression", + "value": "true" + }, + "operator": "EQ" + } + ] + } + ], + "@type": { + "@policytype": "set" + } + } + } + } + ] + } + ] +} diff --git a/fake-backend/json/brokerConnectorPage.json b/fake-backend/json/brokerConnectorPage.json new file mode 100644 index 000000000..51b7a5298 --- /dev/null +++ b/fake-backend/json/brokerConnectorPage.json @@ -0,0 +1,30 @@ +{ + "availableSortings": [ + {"sorting": "MOST_RECENT", "title": "Most Recent"}, + {"sorting": "TITLE", "title": "By Title"} + ], + "paginationMetadata": { + "numTotal": 2, + "numVisible": 2, + "pageOneBased": 2, + "pageSize": 1 + }, + "connectors": [ + { + "id": "https://example.com", + "endpoint": "https://example.com/ids/data", + "createdAt": "2023-05-31T14:06:21.536182+02:00", + "onlineStatus": "OFFLINE", + "numContractOffers": 0 + }, + { + "id": "https://other-connector.com", + "endpoint": "https://other-connector.com/ids/data", + "createdAt": "2023-05-31T14:06:21.536182+02:00", + "lastSuccessfulRefreshAt": "2023-05-31T14:06:21.536182+02:00", + "lastRefreshAttemptAt": "2023-05-31T14:06:21.536182+02:00", + "onlineStatus": "ONLINE", + "numContractOffers": 2 + } + ] +} diff --git a/fake-backend/serve.js b/fake-backend/serve.js index e0eeaa288..737a53dd9 100644 --- a/fake-backend/serve.js +++ b/fake-backend/serve.js @@ -102,9 +102,13 @@ app.get('/api/v1/data/wrapper/ui/pages/contract-agreement-page', (_, res) => { }); // Broker API Wrapper -const brokerCatalog = json('json/brokerCatalog.json'); +const brokerCatalogPage = json('json/brokerCatalogPage.json'); app.post('/api/v1/data/wrapper/broker/catalog-page', (_, res) => { - res.json(brokerCatalog); + res.json(brokerCatalogPage); +}); +const brokerConnectorPage = json('json/brokerConnectorPage.json'); +app.post('/api/v1/data/wrapper/broker/connector-page', (_, res) => { + res.json(brokerConnectorPage); }); app.listen(3000, function () { diff --git a/package-lock.json b/package-lock.json index 003933ef9..e2af1e486 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "@angular/platform-browser-dynamic": "^14.3.0", "@angular/router": "^14.3.0", "@ng-apimock/core": "^3.6.0", - "@sovity.de/edc-client": "0.20230517.123454-main-2f926aa6", + "@sovity.de/edc-client": "0.20230531.73811-main-e140ef56", "clean-deep": "^3.4.0", "date-fns": "^2.29.3", "dotenv": "^16.0.3", @@ -3420,9 +3420,9 @@ "dev": true }, "node_modules/@sovity.de/edc-client": { - "version": "0.20230517.123454-main-2f926aa6", - "resolved": "https://registry.npmjs.org/@sovity.de/edc-client/-/edc-client-0.20230517.123454-main-2f926aa6.tgz", - "integrity": "sha512-XC0drJPKZYRCWoUrwPsRBPZ8TwE5gRKpgA6lOSKoCmdPpTWv1iSLbWBc6apPq7wglG3/FC5DZ/eJPaQVPNv6SA==" + "version": "0.20230531.73811-main-e140ef56", + "resolved": "https://registry.npmjs.org/@sovity.de/edc-client/-/edc-client-0.20230531.73811-main-e140ef56.tgz", + "integrity": "sha512-VzO0sNV5rrEMbXk4OCeC/QXCadkqlkSLzOnXy7O4NVsFoU8RziICGVtX9yyUeqrWdad7dB2R3nt16kgbQ9kXaQ==" }, "node_modules/@tootallnate/once": { "version": "2.0.0", diff --git a/package.json b/package.json index 7f0dfd7f7..9d57310df 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "@angular/platform-browser-dynamic": "^14.3.0", "@angular/router": "^14.3.0", "@ng-apimock/core": "^3.6.0", - "@sovity.de/edc-client": "0.20230517.123454-main-2f926aa6", + "@sovity.de/edc-client": "0.20230531.73811-main-e140ef56", "clean-deep": "^3.4.0", "date-fns": "^2.29.3", "dotenv": "^16.0.3", diff --git a/src/app/component-library/catalog/asset-detail-dialog/asset-detail-dialog-data.service.ts b/src/app/component-library/catalog/asset-detail-dialog/asset-detail-dialog-data.service.ts new file mode 100644 index 000000000..26386f382 --- /dev/null +++ b/src/app/component-library/catalog/asset-detail-dialog/asset-detail-dialog-data.service.ts @@ -0,0 +1,108 @@ +import {Injectable} from '@angular/core'; +import {Policy} from '../../../core/services/api/legacy-managent-api-client'; +import {Asset} from '../../../core/services/models/asset'; +import {ContractOffer} from '../../../core/services/models/contract-offer'; +import {BrokerDataOffer} from '../../../routes/broker-ui/catalog-page/catalog-page/mapping/broker-data-offer'; +import {ContractAgreementCardMapped} from '../../../routes/connector-ui/contract-agreement-page/contract-agreement-cards/contract-agreement-card-mapped'; +import {AssetDetailDialogData} from './asset-detail-dialog-data'; +import {AssetPropertyGridGroupBuilder} from './asset-property-grid-group-builder'; + +@Injectable() +export class AssetDetailDialogDataService { + constructor( + private assetPropertyGridGroupBuilder: AssetPropertyGridGroupBuilder, + ) {} + + assetDetails(asset: Asset, allowDelete: boolean): AssetDetailDialogData { + const propertyGridGroups = [ + this.assetPropertyGridGroupBuilder.buildAssetPropertiesGroup(asset, null), + this.assetPropertyGridGroupBuilder.buildAdditionalPropertiesGroup(asset), + ].filter((it) => it.properties.length); + + return { + type: 'asset-details', + asset, + showDeleteButton: allowDelete, + propertyGridGroups, + }; + } + + contractOfferDetails(contractOffer: ContractOffer): AssetDetailDialogData { + let asset = contractOffer.asset; + let contractPolicy = contractOffer.policy; + + const propertyGridGroups = [ + this.assetPropertyGridGroupBuilder.buildAssetPropertiesGroup(asset, null), + this.assetPropertyGridGroupBuilder.buildAdditionalPropertiesGroup(asset), + this.assetPropertyGridGroupBuilder.buildPolicyGroup( + asset, + contractPolicy, + ), + ].filter((it) => it.properties.length); + + return { + type: 'contract-offer', + asset: contractOffer.asset, + contractOffer, + propertyGridGroups, + }; + } + + contractAgreementDetails( + contractAgreement: ContractAgreementCardMapped, + ): AssetDetailDialogData { + let asset = contractAgreement.asset; + let contractPolicy = contractAgreement.contractPolicy + .legacyPolicy as Policy; + + const propertyGridGroups = [ + this.assetPropertyGridGroupBuilder.buildContractAgreementGroup( + contractAgreement, + ), + this.assetPropertyGridGroupBuilder.buildPolicyGroup( + asset, + contractPolicy, + ), + this.assetPropertyGridGroupBuilder.buildAssetPropertiesGroup( + asset, + 'Asset', + ), + this.assetPropertyGridGroupBuilder.buildAdditionalPropertiesGroup(asset), + ].filter((it) => it.properties.length); + + return { + type: 'contract-agreement', + asset: contractAgreement.asset, + contractAgreement, + propertyGridGroups, + }; + } + + brokerDataOfferDetails(dataOffer: BrokerDataOffer): AssetDetailDialogData { + let asset = dataOffer.asset; + + const propertyGridGroups = [ + this.assetPropertyGridGroupBuilder.buildBrokerDataOfferGroup(dataOffer), + this.assetPropertyGridGroupBuilder.buildAssetPropertiesGroup( + asset, + 'Asset', + ), + this.assetPropertyGridGroupBuilder.buildAdditionalPropertiesGroup(asset), + ...dataOffer.contractOffers.map((contractOffer, i) => + this.assetPropertyGridGroupBuilder.buildContractOfferGroup( + asset, + contractOffer, + i, + dataOffer.contractOffers.length, + ), + ), + ].filter((it) => it.properties.length); + + return { + type: 'broker-data-offer', + asset: dataOffer.asset, + brokerDataOffer: dataOffer, + propertyGridGroups, + }; + } +} diff --git a/src/app/component-library/catalog/asset-detail-dialog/asset-detail-dialog-data.ts b/src/app/component-library/catalog/asset-detail-dialog/asset-detail-dialog-data.ts index 39f48c650..c896e769f 100644 --- a/src/app/component-library/catalog/asset-detail-dialog/asset-detail-dialog-data.ts +++ b/src/app/component-library/catalog/asset-detail-dialog/asset-detail-dialog-data.ts @@ -1,74 +1,19 @@ -import {Policy} from '../../../core/services/api/legacy-managent-api-client'; -import {Asset} from '../../../core/services/models/asset'; +import {Asset} from 'src/app/core/services/models/asset'; import {ContractOffer} from '../../../core/services/models/contract-offer'; -import {BrokerDataOffer} from '../../../routes/broker-ui/catalog-browser-page/catalog-page/mapping/broker-data-offer'; +import {BrokerDataOffer} from '../../../routes/broker-ui/catalog-page/catalog-page/mapping/broker-data-offer'; import {ContractAgreementCardMapped} from '../../../routes/connector-ui/contract-agreement-page/contract-agreement-cards/contract-agreement-card-mapped'; +import {PropertyGridGroup} from '../../property-grid/property-grid-group/property-grid-group'; -export class AssetDetailDialogData { - constructor( - public mode: - | 'asset-details' - | 'contract-offer' - | 'contract-agreement' - | 'broker-data-offer', - public asset: Asset, - public contractOffer: ContractOffer | null, - public contractAgreement: ContractAgreementCardMapped | null, - public brokerDataOffer: BrokerDataOffer | null, - public policy: Policy | null, - public allowDelete: boolean, - ) {} - - static forAssetDetails( - asset: Asset, - allowDelete: boolean, - ): AssetDetailDialogData { - return new AssetDetailDialogData( - 'asset-details', - asset, - null, - null, - null, - null, - allowDelete, - ); - } - - static forContractOffer(contractOffer: ContractOffer): AssetDetailDialogData { - return new AssetDetailDialogData( - 'contract-offer', - contractOffer.asset, - contractOffer, - null, - null, - contractOffer.policy, - false, - ); - } - - static forContractAgreement( - contractAgreement: ContractAgreementCardMapped, - ): AssetDetailDialogData { - return new AssetDetailDialogData( - 'contract-agreement', - contractAgreement.asset, - null, - contractAgreement, - null, - contractAgreement.contractPolicy.legacyPolicy, - false, - ); - } - - static forBrokerDataOffer(dataOffer: BrokerDataOffer): AssetDetailDialogData { - return new AssetDetailDialogData( - 'broker-data-offer', - dataOffer.asset, - null, - null, - dataOffer, - dataOffer.policy[0].legacyPolicy as Policy, - false, - ); - } +export interface AssetDetailDialogData { + type: + | 'asset-details' + | 'contract-offer' + | 'contract-agreement' + | 'broker-data-offer'; + propertyGridGroups: PropertyGridGroup[]; + asset: Asset; + contractOffer?: ContractOffer; + contractAgreement?: ContractAgreementCardMapped; + brokerDataOffer?: BrokerDataOffer; + showDeleteButton?: boolean; } diff --git a/src/app/component-library/catalog/asset-detail-dialog/asset-detail-dialog.component.html b/src/app/component-library/catalog/asset-detail-dialog/asset-detail-dialog.component.html index ec23e2acf..7ecd571d7 100644 --- a/src/app/component-library/catalog/asset-detail-dialog/asset-detail-dialog.component.html +++ b/src/app/component-library/catalog/asset-detail-dialog/asset-detail-dialog.component.html @@ -1,17 +1,17 @@