diff --git a/fake-backend/json/brokerCatalogPage.json b/fake-backend/json/brokerCatalogPage.json index 7da924633..24e3a2c3b 100644 --- a/fake-backend/json/brokerCatalogPage.json +++ b/fake-backend/json/brokerCatalogPage.json @@ -109,6 +109,132 @@ } } ] + }, + { + "assetId": "urn:artifact:my-asset", + "connectorEndpoint": "http://my-connector/ids/data", + "connectorOnlineStatus": "OFFLINE", + "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 TEST2", + "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" + } + } + } + } + ] + }, + { + "assetId": "urn:artifact:my-asset", + "connectorEndpoint": "http://my-connector/ids/data", + "connectorOnlineStatus": "DEAD", + "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 TEST3", + "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 index 51b7a5298..0ad1f36d4 100644 --- a/fake-backend/json/brokerConnectorPage.json +++ b/fake-backend/json/brokerConnectorPage.json @@ -25,6 +25,13 @@ "lastRefreshAttemptAt": "2023-05-31T14:06:21.536182+02:00", "onlineStatus": "ONLINE", "numContractOffers": 2 + }, + { + "id": "https://example2.com", + "endpoint": "https://example2.com/ids/data", + "createdAt": "2022-05-31T14:06:21.536182+02:00", + "onlineStatus": "DEAD", + "numContractOffers": 0 } ] } diff --git a/fake-backend/json/logs.json b/fake-backend/json/logs.json new file mode 100644 index 000000000..82202a573 --- /dev/null +++ b/fake-backend/json/logs.json @@ -0,0 +1,35 @@ +[ + { + "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", + "asset:prop:some-unsupported-property": "F10E2821BBBEA527EA02200352313BC059445190" + } + }, + { + "properties": { + "asset:prop:id": "urn:artifact:bitcoin-data", + "asset:prop:name": "Bitcoin Data", + "asset:prop:contenttype": "application/json", + "asset:prop:description": "description", + "asset:prop:version": "1.0", + "asset:prop:type": "HttpData", + "asset:prop:originator": "https://sovity-001.stage-sovity.azure.sovity.io/control/api/v1/ids/data" + } + } +] diff --git a/package-lock.json b/package-lock.json index bd4e71802..84ee3504a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,7 +22,7 @@ "@angular/router": "^14.3.0", "@ng-apimock/core": "^3.6.0", "@ngxs/store": "^3.8.1", - "@sovity.de/broker-server-client": "0.20230703.152001-main-d1ec5276", + "@sovity.de/broker-server-client": "0.20230712.71619-main-a4860cff", "@sovity.de/edc-client": "0.20230706.64046-main-d2fd35a8", "clean-deep": "^3.4.0", "date-fns": "^2.29.3", @@ -3438,9 +3438,9 @@ "dev": true }, "node_modules/@sovity.de/broker-server-client": { - "version": "0.20230703.152001-main-d1ec5276", - "resolved": "https://registry.npmjs.org/@sovity.de/broker-server-client/-/broker-server-client-0.20230703.152001-main-d1ec5276.tgz", - "integrity": "sha512-3azcUFMg0tLHrCqPG/vw8vIYqShLrJnAQDhtH0VyHvYyyt+waokdS6Pf0nGvL0RzWEBQZY81pFt2TvE56AS5ug==" + "version": "0.20230712.71619-main-a4860cff", + "resolved": "https://registry.npmjs.org/@sovity.de/broker-server-client/-/broker-server-client-0.20230712.71619-main-a4860cff.tgz", + "integrity": "sha512-305vHJj38Ma9x9YADM3SJh3sdqePeLcrUB1hHlYsuPdx7wYe9vwgb503KYStJ+5iN/ojP2xu8k6Unt+y+Bu5iQ==" }, "node_modules/@sovity.de/edc-client": { "version": "0.20230706.64046-main-d2fd35a8", diff --git a/package.json b/package.json index 90b40e4e9..976c960a9 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "@angular/router": "^14.3.0", "@ng-apimock/core": "^3.6.0", "@ngxs/store": "^3.8.1", - "@sovity.de/broker-server-client": "0.20230703.152001-main-d1ec5276", + "@sovity.de/broker-server-client": "0.20230712.71619-main-a4860cff", "@sovity.de/edc-client": "0.20230706.64046-main-d2fd35a8", "clean-deep": "^3.4.0", "date-fns": "^2.29.3", 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 814dca84c..22dd75f8f 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 @@ -2,9 +2,11 @@ upload - - sim_card - + + {{ data.contractAgreement!!.direction === 'PROVIDING' ? 'upload' : 'download' diff --git a/src/app/component-library/catalog/asset-detail-dialog/asset-property-grid-group-builder.ts b/src/app/component-library/catalog/asset-detail-dialog/asset-property-grid-group-builder.ts index 756ff7f2f..5c45068dd 100644 --- a/src/app/component-library/catalog/asset-detail-dialog/asset-property-grid-group-builder.ts +++ b/src/app/component-library/catalog/asset-detail-dialog/asset-property-grid-group-builder.ts @@ -13,6 +13,10 @@ import {PropertyGridGroup} from '../../property-grid/property-grid-group/propert import {PropertyGridField} from '../../property-grid/property-grid/property-grid-field'; import {PropertyGridFieldService} from '../../property-grid/property-grid/property-grid-field.service'; import {formatDateAgo} from '../../ui-elements/ago/formatDateAgo'; +import { + getOnlineStatusColor, + getOnlineStatusIcon, +} from '../icon-with-online-status/online-status-utils'; @Injectable() export class AssetPropertyGridGroupBuilder { @@ -324,15 +328,19 @@ export class AssetPropertyGridGroupBuilder { copyButton: true, }, { - icon: 'link', + icon: getOnlineStatusIcon(dataOffer.connectorOnlineStatus), label: 'Status', labelTitle: `Last updated ${lastUpdate}`, text: dataOffer.connectorOnlineStatus == 'ONLINE' ? `Online` : `Offline since ${lastUpdate}`, - additionalClasses: - dataOffer.connectorOnlineStatus == 'ONLINE' ? '' : 'text-warn', + additionalClasses: getOnlineStatusColor( + dataOffer.connectorOnlineStatus, + ), + additionalIconClasses: getOnlineStatusColor( + dataOffer.connectorOnlineStatus, + ), }, ], }; diff --git a/src/app/component-library/catalog/catalog.module.ts b/src/app/component-library/catalog/catalog.module.ts index c0d0b3db0..987959124 100644 --- a/src/app/component-library/catalog/catalog.module.ts +++ b/src/app/component-library/catalog/catalog.module.ts @@ -16,6 +16,7 @@ import {AssetDetailDialogComponent} from './asset-detail-dialog/asset-detail-dia import {AssetPropertyGridGroupBuilder} from './asset-detail-dialog/asset-property-grid-group-builder'; import {ContractOfferCardsComponent} from './contract-offer-cards/contract-offer-cards.component'; import {ContractOfferIconComponent} from './contract-offer-icon/contract-offer-icon.component'; +import {IconWithOnlineStatusComponent} from './icon-with-online-status/icon-with-online-status.component'; import {TransferHistoryMiniListComponent} from './transfer-history-mini-list/transfer-history-mini-list.component'; @NgModule({ @@ -43,12 +44,14 @@ import {TransferHistoryMiniListComponent} from './transfer-history-mini-list/tra ContractOfferCardsComponent, ContractOfferIconComponent, TransferHistoryMiniListComponent, + IconWithOnlineStatusComponent, ], exports: [ AssetDetailDialogComponent, ContractOfferCardsComponent, ContractOfferIconComponent, TransferHistoryMiniListComponent, + IconWithOnlineStatusComponent, ], providers: [AssetPropertyGridGroupBuilder, AssetDetailDialogDataService], }) diff --git a/src/app/component-library/catalog/icon-with-online-status/icon-with-online-status.component.ts b/src/app/component-library/catalog/icon-with-online-status/icon-with-online-status.component.ts new file mode 100644 index 000000000..83941eb5c --- /dev/null +++ b/src/app/component-library/catalog/icon-with-online-status/icon-with-online-status.component.ts @@ -0,0 +1,38 @@ +import {Component, HostBinding, Input} from '@angular/core'; +import { + ConnectorOnlineStatus, + getOnlineStatusColor, + getOnlineStatusIcon, +} from './online-status-utils'; + +@Component({ + selector: 'icon-with-online-status', + template: ` + {{ onlineStatusIcon }} + + {{ mainIcon }} + `, +}) +export class IconWithOnlineStatusComponent { + @HostBinding('class.mat-icon-[40px]') + cls = true; + + @Input() + mainIcon!: string; + + @Input() + onlineStatus!: ConnectorOnlineStatus; + + get onlineStatusColor(): string { + return getOnlineStatusColor(this.onlineStatus); + } + + get onlineStatusIcon(): string { + return getOnlineStatusIcon(this.onlineStatus); + } +} diff --git a/src/app/component-library/catalog/icon-with-online-status/online-status-utils.ts b/src/app/component-library/catalog/icon-with-online-status/online-status-utils.ts new file mode 100644 index 000000000..ca4691f55 --- /dev/null +++ b/src/app/component-library/catalog/icon-with-online-status/online-status-utils.ts @@ -0,0 +1,38 @@ +import { + CatalogDataOfferConnectorOnlineStatusEnum, + ConnectorDetailPageResultOnlineStatusEnum, + ConnectorListEntryOnlineStatusEnum, + DataOfferDetailPageResultConnectorOnlineStatusEnum, +} from '@sovity.de/broker-server-client'; + +export type ConnectorOnlineStatus = + | CatalogDataOfferConnectorOnlineStatusEnum + | ConnectorListEntryOnlineStatusEnum + | DataOfferDetailPageResultConnectorOnlineStatusEnum + | ConnectorDetailPageResultOnlineStatusEnum; + +export function getOnlineStatusColor(status: ConnectorOnlineStatus): string { + switch (status) { + case 'ONLINE': + return 'broker-online-status-online'; + case 'OFFLINE': + return 'broker-online-status-offline'; + case 'DEAD': + return 'broker-online-status-dead'; + default: + return ''; + } +} + +export function getOnlineStatusIcon(status: ConnectorOnlineStatus): string { + switch (status) { + case 'ONLINE': + return 'check_circle'; + case 'OFFLINE': + return 'pause_circle'; + case 'DEAD': + return 'remove_circle'; + default: + return ''; + } +} diff --git a/src/app/component-library/property-grid/property-grid/property-grid-field.ts b/src/app/component-library/property-grid/property-grid/property-grid-field.ts index 7e73eb5e0..49eeb5721 100644 --- a/src/app/component-library/property-grid/property-grid/property-grid-field.ts +++ b/src/app/component-library/property-grid/property-grid/property-grid-field.ts @@ -18,8 +18,17 @@ export interface PropertyGridField { url?: string; onclick?: () => void; + + /** + * Additional classes for the value text. + */ additionalClasses?: string; + /** + * Additional classes for the icon. + */ + additionalIconClasses?: string; + copyButton?: boolean; tooltip?: string | null; textIconAfter?: string | null; diff --git a/src/app/component-library/property-grid/property-grid/property-grid.component.html b/src/app/component-library/property-grid/property-grid/property-grid.component.html index 2f6196054..eab8edd6d 100644 --- a/src/app/component-library/property-grid/property-grid/property-grid.component.html +++ b/src/app/component-library/property-grid/property-grid/property-grid.component.html @@ -11,8 +11,9 @@ style="flex-shrink: 0; margin-top: 6px" [matTooltip]="prop.tooltip!" [attr.title]="prop.labelTitle" - >{{ prop.icon }} + [ngClass]="prop.additionalIconClasses"> + {{ prop.icon }} +
- sim_card + + - - link + + + {{ connector.endpoint }} diff --git a/src/styles.scss b/src/styles.scss index 2deeb7c4e..b8c120796 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -10,6 +10,18 @@ body { margin: 0; } +.broker-online-status-online { + color: green; +} + +.broker-online-status-offline { + color: #cb8e1a; +} + +.broker-online-status-dead { + color: var(--warn-color); +} + .snackbar-info-style { background-color: orange; color: black;