Skip to content

Commit 73e43d4

Browse files
committed
Show latest iot device metadata
1 parent 7ce8ede commit 73e43d4

File tree

10 files changed

+146
-3
lines changed

10 files changed

+146
-3
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<mat-expansion-panel class="my-2 mx-3">
2+
<mat-expansion-panel-header>
3+
<mat-panel-title>
4+
<p>
5+
<strong>{{ 'IOTDEVICE.LATEST-DATAPACKAGES' | translate }}</strong>
6+
</p>
7+
</mat-panel-title>
8+
</mat-expansion-panel-header>
9+
<div class="timestamps-container">
10+
<div>
11+
<p *ngFor="
12+
let metadata of sortedMetadata;
13+
let i = index
14+
">
15+
<strong>{{ i + 1 }}</strong>
16+
</p>
17+
</div>
18+
<div>
19+
<p *ngFor="
20+
let metadata of sortedMetadata;
21+
let i = index
22+
">
23+
{{ metadata.sentTime | tableDatePipe }}
24+
</p>
25+
</div>
26+
</div>
27+
</mat-expansion-panel>
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
.timestamps-container {
2+
display: flex;
3+
}
4+
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
2+
3+
import { DataPackagesTimestampComponent } from './data-packages-timestamp.component';
4+
5+
describe('DataPackagesTimestampComponent', () => {
6+
let component: DataPackagesTimestampComponent;
7+
let fixture: ComponentFixture<DataPackagesTimestampComponent>;
8+
9+
beforeEach(async(() => {
10+
TestBed.configureTestingModule({
11+
declarations: [ DataPackagesTimestampComponent ]
12+
})
13+
.compileComponents();
14+
}));
15+
16+
beforeEach(() => {
17+
fixture = TestBed.createComponent(DataPackagesTimestampComponent);
18+
component = fixture.componentInstance;
19+
fixture.detectChanges();
20+
});
21+
22+
it('should create', () => {
23+
expect(component).toBeTruthy();
24+
});
25+
});
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import {
2+
Component,
3+
Input,
4+
OnChanges,
5+
OnInit,
6+
SimpleChanges,
7+
} from '@angular/core';
8+
import { sortBy } from '@shared/helpers/array.helper';
9+
import { ReceivedMessageMetadata } from '@shared/models/received-message-metadata.model';
10+
11+
@Component({
12+
selector: 'app-data-packages-timestamp',
13+
templateUrl: './data-packages-timestamp.component.html',
14+
styleUrls: ['./data-packages-timestamp.component.scss'],
15+
})
16+
export class DataPackagesTimestampComponent implements OnInit, OnChanges {
17+
@Input() receivedMessagesMetadata: ReceivedMessageMetadata[] = [];
18+
sortedMetadata: ReceivedMessageMetadata[] = [];
19+
20+
ngOnInit(): void {}
21+
22+
ngOnChanges(changes: SimpleChanges): void {
23+
const { receivedMessagesMetadata } = changes;
24+
if (
25+
receivedMessagesMetadata.currentValue !==
26+
receivedMessagesMetadata.previousValue
27+
) {
28+
this.sortedMetadata = sortBy(
29+
receivedMessagesMetadata.currentValue,
30+
'sentTime',
31+
'desc'
32+
);
33+
}
34+
}
35+
}

src/app/applications/iot-devices/iot-device-detail/iot-device-detail.component.html

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,18 @@
1212
<!-- Datapackage, Downlink, API Key -->
1313
<mat-tab-group animationDuration="200ms">
1414
<mat-tab label="{{'IOTDEVICE.DETAIL-TAB' | translate}}">
15+
<ng-container *ngIf="device.latestReceivedMessage; else noSentTime">
1516
<app-data-package [latestReceivedMessage]="device.latestReceivedMessage">
1617
</app-data-package>
18+
<mat-divider></mat-divider>
19+
<app-data-packages-timestamp [receivedMessagesMetadata]="device.receivedMessagesMetadata">
20+
</app-data-packages-timestamp>
21+
</ng-container>
22+
<ng-template #noSentTime>
23+
<p class="my-2 mx-3">
24+
{{ 'IOTDEVICE.NO-DATAPACKAGE' | translate }}
25+
</p>
26+
</ng-template>
1727
</mat-tab>
1828
<mat-tab label="{{'IOTDEVICE.DOWNLINK-TAB' | translate}}" *ngIf="canStartDownlink">
1929
<app-downlink [device]="device" [errorMessages]="errorMessages"></app-downlink>
@@ -35,4 +45,4 @@
3545
</div>
3646
</div>
3747
</div>
38-
</div>
48+
</div>

src/app/applications/iot-devices/iot-devices.module.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import { PipesModule } from '@shared/pipes/pipes.module';
1919
import { DeviceModelComponent } from './iot-device-detail/device-model/device-model.component';
2020
import { MonacoEditorModule } from 'ngx-monaco-editor';
2121
import { DataPackageComponent } from './iot-device-detail/data-package/data-package.component';
22+
import { DataPackagesTimestampComponent } from './iot-device-detail/data-packages-timestamp/data-packages-timestamp.component';
2223

2324
@NgModule({
2425
declarations: [
@@ -32,7 +33,8 @@ import { DataPackageComponent } from './iot-device-detail/data-package/data-pack
3233
DownlinkComponent,
3334
DownlinkDialogComponent,
3435
DeviceModelComponent,
35-
DataPackageComponent
36+
DataPackageComponent,
37+
DataPackagesTimestampComponent,
3638
],
3739
exports: [
3840
IotDevicesTableComponent,

src/app/shared/helpers/array.helper.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,20 @@ export const splitList = <T extends unknown>(
99

1010
return dataBatches;
1111
};
12+
13+
export const sortBy = <T>(
14+
value: T[],
15+
column: keyof T,
16+
order: 'asc' | 'desc' = 'asc'
17+
): T[] => {
18+
if (!value?.length) {
19+
return value;
20+
}
21+
22+
const copy = value.slice();
23+
copy.sort((a, b) =>
24+
a[column] === b[column] ? 0 : a[column] > b[column] ? 1 : -1
25+
);
26+
27+
return order === 'asc' ? copy : copy.reverse();
28+
};

src/app/shared/pipes/pipes.module.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { isGlobalAdminPipe } from './is-global-admin.pipe';
66
import { CreatedUpdatedByPipe } from './created-updated-by.pipe';
77
import { CustomDatePipe, CustomTableDatePipe } from './custom-date.pipe';
88
import { FilterDevicesPipe } from './filter-devices.pipe';
9+
import { SortByPipe } from './sort-by.pipe';
910

1011
@NgModule({
1112
declarations: [
@@ -16,6 +17,7 @@ import { FilterDevicesPipe } from './filter-devices.pipe';
1617
CustomTableDatePipe,
1718
CreatedUpdatedByPipe,
1819
FilterDevicesPipe,
20+
SortByPipe
1921
],
2022
imports: [CommonModule],
2123
exports: [
@@ -26,6 +28,7 @@ import { FilterDevicesPipe } from './filter-devices.pipe';
2628
CustomTableDatePipe,
2729
CreatedUpdatedByPipe,
2830
FilterDevicesPipe,
31+
SortByPipe
2932
],
3033
})
3134
export class PipesModule {}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { Pipe, PipeTransform } from '@angular/core';
2+
import { sortBy } from '@shared/helpers/array.helper';
3+
4+
@Pipe({ name: 'sortBy' })
5+
export class SortByPipe implements PipeTransform {
6+
/**
7+
* Example:
8+
* ```
9+
* *ngFor="let c of arrayOfObjects | sortBy:<propertyName>:'asc'"
10+
* ```
11+
*/
12+
transform<T>(
13+
value: T[],
14+
column: keyof T,
15+
order: 'asc' | 'desc' = 'asc'
16+
): T[] {
17+
return sortBy(value, column, order);
18+
}
19+
}

src/assets/i18n/da.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@
172172
"AUTHORIZATIONHEADER": "Authorization header",
173173
"NO-AUTHORIZATIONHEADER": "Ingen Authorization header angivet",
174174
"ADD-TO-OPENDATADK": "Send data til OpenDataDK",
175-
"OPENDATA-DK": "OpenDataDK",
175+
"OPENDATA-DK": "OpenDataDK",
176176
"NO-OPENDATA-DK": "Der er ikke oprettet nogen datadeling med Open Data DK endnu",
177177
"HTTP_PUSH": "HTTP Push",
178178
"FIWARE": "FIWARE"
@@ -677,6 +677,7 @@
677677
},
678678
"LORAWANSETUP": "LoRaWAN specifik opsætning",
679679
"LATEST-DATAPACKAGE": "Seneste datapakke sendt fra enheden:",
680+
"LATEST-DATAPACKAGES": "Seneste modtagelser af datapakker (nyeste først):",
680681
"NO-DATAPACKAGE": "Der er ikke modtaget nogle datapakker",
681682
"DATAPACKAGE": "Datapakke",
682683
"LORA": {

0 commit comments

Comments
 (0)