Skip to content

Commit 92aac5a

Browse files
Merge pull request #210 from OS2iot/feature/IOT-1610-Metadata-for-ODDK
IOT-1610: Added new metadata fields for ODDK
2 parents dfc50ca + a30a329 commit 92aac5a

File tree

8 files changed

+314
-110
lines changed

8 files changed

+314
-110
lines changed

package-lock.json

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

src/app/app-routing.module.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { PreloadAllModules, RouterModule, Routes } from "@angular/router";
33
import { NewUserComponent } from "./admin/users/new-kombit-user-page/new-user.component";
44
import { UserPageComponent } from "./admin/users/user-page/user-page.component";
55
import { AuthGuardService as AuthGuard } from "./auth/auth-guard.service";
6-
import { AuthComponent } from "./auth/auth.component";
6+
import { AuthComponent } from "@auth/auth.component";
77
import { ErrorPageComponent } from "./error-page/error-page.component";
88

99
const routes: Routes = [

src/app/applications/datatarget/opendatadk/opendatadk-dataset.model.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,14 @@ export class OpenDataDkDataset {
44
resourceTitle: string;
55
description: string;
66
keywords: string[];
7+
keywordTags: string;
78
keywordsInput: string;
89
license = "https://creativecommons.org/publicdomain/zero/1.0/";
910
authorName: string; //required
1011
authorEmail: string; //reqired
1112
url: string; // autogenerated with orgid as input
1213
acceptTerms = false;
14+
updateFrequency: string;
15+
documentationUrl: string;
16+
dataDirectory: boolean = false;
1317
}

src/app/applications/datatarget/opendatadk/opendatadk-detail/opendatadk-detail.component.html

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@
1818
{{ openDataDkDataset.keywords ? openDataDkDataset.keywords : ("OPENDATADK.DETAILS.NA" | translate) }}
1919
</p>
2020

21+
<p>
22+
<strong>{{ "OPENDATADK.DETAILS.TAGS" | translate }}</strong>
23+
{{ openDataDkDataset.keywordTags ?? ("OPENDATADK.DETAILS.NA" | translate) }}
24+
</p>
25+
2126
<p>
2227
<strong>{{ "OPENDATADK.DETAILS.AUTHORNAME" | translate }}</strong>
2328
{{ openDataDkDataset.authorName }}
@@ -28,6 +33,21 @@
2833
{{ openDataDkDataset.authorEmail }}
2934
</p>
3035

36+
<p>
37+
<strong>{{ "OPENDATADK.DETAILS.UPDATE-FREQUENCY" | translate }}</strong>
38+
{{ openDataDkDataset.updateFrequency ? ("OPENDATADK.QUESTION.UPDATE-FREQUENCY-OPTIONS." + openDataDkDataset.updateFrequency | translate) : ("OPENDATADK.DETAILS.NA" | translate) }}
39+
</p>
40+
41+
<p>
42+
<strong>{{ "OPENDATADK.DETAILS.DOCUMENTATION-URL" | translate }}</strong>
43+
{{ openDataDkDataset.documentationUrl ?? ("OPENDATADK.DETAILS.NA" | translate) }}
44+
</p>
45+
46+
<p>
47+
<strong>{{ "OPENDATADK.DETAILS.DATA-DIRECTORY" | translate }}</strong>
48+
{{ openDataDkDataset.dataDirectory | yesNo }}
49+
</p>
50+
3151
<p>
3252
<strong>{{ "OPENDATADK.DETAILS.URL" | translate }}</strong>
3353
{{ openDataDkDataset.url }}

src/app/applications/datatarget/opendatadk/opendatadk-edit/opendatadk-edit.component.html

Lines changed: 163 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -146,8 +146,7 @@ <h3>{{ (datatargetId ? "FORM.EDIT-DATATARGET" : "FORM.CREATE-NEW-DATATARGET") |
146146
matTooltipHideDelay="2000"
147147
matTooltipPosition="above"
148148
matTooltipShowDelay="600"
149-
>
150-
</fa-icon>
149+
/>
151150
<input
152151
[(ngModel)]="datatarget.openDataDkDataset.resourceTitle"
153152
[ngClass]="{
@@ -240,19 +239,27 @@ <h3>{{ (datatargetId ? "FORM.EDIT-DATATARGET" : "FORM.CREATE-NEW-DATATARGET") |
240239
</div>
241240
</div>
242241

243-
<!-- Keywords -->
242+
<!-- Theme -->
244243
<div class="row mb-2">
245244
<div class="form-group mt-3 col-12">
246245
<label class="form-label" for="openDataDkDataset.keywords">
247-
{{ "OPENDATADK.QUESTION.GIVE-OPENDATADK-KEYWORDS" | translate }}
246+
{{ "OPENDATADK.QUESTION.GIVE-OPENDATADK-THEME" | translate }}
248247
</label>
248+
<fa-icon
249+
[icon]="faQuestionCircle"
250+
[matTooltip]="'OPENDATADK.QUESTION.GIVE-OPENDATADK-THEME-INFO' | translate"
251+
class="form-info-icon"
252+
matTooltipHideDelay="2000"
253+
matTooltipPosition="above"
254+
matTooltipShowDelay="600"
255+
/>
249256
<mat-select
250257
[(value)]="datatarget.openDataDkDataset.keywords"
251258
[ngClass]="{
252259
'is-invalid': formFailedSubmit && errorFields.includes('openDataDkDataset.keywords'),
253260
'is-valid': formFailedSubmit && !errorFields.includes('openDataDkDataset.keywords')
254261
}"
255-
[placeholder]="'OPENDATADK.QUESTION.GIVE-OPENDATADK-KEYWORDS-PLACEHOLDER' | translate"
262+
[placeholder]="'OPENDATADK.QUESTION.GIVE-OPENDATADK-THEME-PLACEHOLDER' | translate"
256263
class="form-control"
257264
id="openDataDkDataset.keywords"
258265
multiple
@@ -266,13 +273,111 @@ <h3>{{ (datatargetId ? "FORM.EDIT-DATATARGET" : "FORM.CREATE-NEW-DATATARGET") |
266273
</div>
267274
</div>
268275

276+
<!-- Keywords tags -->
277+
<div class="row mb-2">
278+
<div class="form-group mt-3 col-12">
279+
<label class="form-label" for="openDataDkDataset.keyWordTags">
280+
{{ "OPENDATADK.QUESTION.GIVE-OPENDATADK-TAGS" | translate }}
281+
</label>
282+
<fa-icon
283+
[icon]="faQuestionCircle"
284+
[matTooltip]="'OPENDATADK.QUESTION.GIVE-OPENDATADK-TAGS-INFO' | translate"
285+
class="form-info-icon"
286+
matTooltipHideDelay="2000"
287+
matTooltipPosition="above"
288+
matTooltipShowDelay="600"
289+
/>
290+
<input
291+
[(ngModel)]="datatarget.openDataDkDataset.keywordTags"
292+
[ngClass]="{
293+
'is-invalid': formFailedSubmit && errorFields.includes('openDataDkDataset.keywordTags'),
294+
'is-valid': formFailedSubmit && !errorFields.includes('openDataDkDataset.keywordTags')
295+
}"
296+
[placeholder]="'OPENDATADK.QUESTION.GIVE-OPENDATADK-TAGS-PLACEHOLDER' | translate"
297+
class="form-control"
298+
id="openDataDkDataset.keyWordTags"
299+
name="openDataDkDataset.keyWordTags"
300+
type="text"
301+
/>
302+
</div>
303+
</div>
304+
305+
<!-- Update frequency -->
306+
<div class="row mb-2">
307+
<div class="form-group mt-3 col-12">
308+
<label class="form-label" for="openDataDkDataset.updateFrequency">
309+
{{ "OPENDATADK.QUESTION.GIVE-UPDATE-FREQUENCY" | translate }}
310+
</label>
311+
<mat-select
312+
[(value)]="datatarget.openDataDkDataset.updateFrequency"
313+
[ngClass]="{
314+
'is-invalid': formFailedSubmit && errorFields.includes('openDataDkDataset.updateFrequency'),
315+
'is-valid': formFailedSubmit && !errorFields.includes('openDataDkDataset.updateFrequency')
316+
}"
317+
[placeholder]="'OPENDATADK.QUESTION.GIVE-UPDATE-FREQUENCY-PLACEHOLDER' | translate"
318+
class="form-control"
319+
id="openDataDkDataset.updateFrequency"
320+
>
321+
@for (frequency of selectableUpdateFrequencies; track frequency) {
322+
<mat-option
323+
[value]="frequency">{{ "OPENDATADK.QUESTION.UPDATE-FREQUENCY-OPTIONS." + frequency | translate }}
324+
</mat-option>
325+
}
326+
</mat-select>
327+
</div>
328+
</div>
329+
330+
<!-- Documentation url -->
331+
<div class="row mb-2">
332+
<div class="form-group mt-3 col-12">
333+
<label class="form-label" for="openDataDkDataset.documentationUrl">
334+
{{ "OPENDATADK.QUESTION.GIVE-OPENDATADK-DOCUMENTATION-URL" | translate }}
335+
</label>
336+
<fa-icon
337+
[icon]="faQuestionCircle"
338+
[matTooltip]="'OPENDATADK.QUESTION.GIVE-OPENDATADK-DOCUMENTATION-URL-INFO' | translate"
339+
class="form-info-icon"
340+
matTooltipHideDelay="2000"
341+
matTooltipPosition="above"
342+
matTooltipShowDelay="600"
343+
/>
344+
<input
345+
[(ngModel)]="datatarget.openDataDkDataset.documentationUrl"
346+
[ngClass]="{
347+
'is-invalid': formFailedSubmit && errorFields.includes('openDataDkDataset.documentationUrl'),
348+
'is-valid': formFailedSubmit && !errorFields.includes('openDataDkDataset.documentationUrl')
349+
}"
350+
[placeholder]="'OPENDATADK.QUESTION.GIVE-OPENDATADK-DOCUMENTATION-URL-PLACEHOLDER' | translate"
351+
class="form-control"
352+
id="openDataDkDataset.documentationUrl"
353+
name="openDataDkDataset.documentationUrl"
354+
type="text"
355+
/>
356+
</div>
357+
</div>
358+
359+
<!-- Datavejviser checkmark -->
360+
<div class="row mt-3">
361+
<div class="col-12">
362+
<mat-checkbox [(ngModel)]="datatarget.openDataDkDataset.dataDirectory" name="openDataDkDataset.dataDirectory">
363+
<p>
364+
{{ "OPENDATADK.QUESTION.DATA-DIRECTORY-DESCRIPTION" | translate }}
365+
<a
366+
href="https://datavejviser.dk/om-datavejviser#vilkaar-for-anvendelse-af-data-og-datasaetbeskrivelser-i-datavejviseren">
367+
Datavejviser
368+
</a>
369+
</p>
370+
</mat-checkbox>
371+
</div>
372+
</div>
373+
269374
<!-- Terms and conditions checkmark -->
270375
<div class="row mt-3">
271376
<div class="col-12">
272377
<mat-checkbox [(ngModel)]="datatarget.openDataDkDataset.acceptTerms" name="acceptTerms">
273378
<p>
274379
{{ "OPENDATADK.QUESTION.ACCEPT-TERMS-PART-ONE" | translate }}
275-
<a href=" https://creativecommons.org/publicdomain/zero/1.0/deed.da">
380+
<a href=" https://creativecommons.org/publicdomain/zero/1.0/deed.da" target="_blank">
276381
{{ "OPENDATADK.QUESTION.TERMS-AND-CONDITIONS" | translate }}
277382
</a>
278383
</p>
@@ -295,60 +400,60 @@ <h6 class="mt-3">{{ "QUESTION.DATATARGET.RELATIONS" | translate }}</h6>
295400
@if (devices && payloadDecoders && payloadDeviceDatatarget?.length > 0) {
296401
<table class="table table-striped table-bordered">
297402
<tbody>
298-
@for (element of payloadDeviceDatatarget; track element; let i = $index) {
299-
<tr [attr.data-index]="i">
300-
<td>
301-
<div class="row">
302-
<mat-form-field appearance="fill">
303-
<mat-label>{{ "QUESTION.DATATARGET.SELECT-DEVICES" | translate }}</mat-label>
304-
<mat-select
305-
[(value)]="element.iotDeviceIds"
306-
[compareWith]="payloadDevicesDropdownCompare"
307-
multiple
308-
name="devices"
309-
>
310-
<mat-option class="filter-option" disabled="disabled">
311-
<button (click)="selectAllDevices(i)" class="mat-primary fill text-sm" mat-raised-button>
312-
{{ "QUESTION.DATATARGET.SELECTALLDEVICES" | translate }}
313-
</button>
314-
<button (click)="deSelectAllDevices(i)" class="mat-primary fill text-sm" mat-raised-button>
315-
{{ "QUESTION.DATATARGET.DESELECTALLDEVICES" | translate }}
316-
</button>
317-
</mat-option>
318-
@for (device of devices; track device) {
319-
<mat-option [value]="device.id">{{ device.name }}</mat-option>
320-
}
321-
</mat-select>
322-
</mat-form-field>
323-
</div>
324-
</td>
325-
<td>
326-
<div class="row">
327-
<mat-form-field appearance="fill">
328-
<mat-label>{{ "QUESTION.DATATARGET.SELECT-PAYLOADDECODER" | translate }}</mat-label>
329-
<mat-select [(value)]="element.payloadDecoderId" matNativeControl name="payloadDecoderId">
330-
<mat-option [value]="0">
331-
{{ "QUESTION.DATATARGET.NO-PAYLOAD-DECODER-SELECTED" | translate }}
332-
</mat-option>
333-
@for (payloadDecoder of payloadDecoders; track payloadDecoder) {
334-
<mat-option [value]="payloadDecoder.id">
335-
{{ payloadDecoder.name }}
403+
@for (element of payloadDeviceDatatarget; track element; let i = $index) {
404+
<tr [attr.data-index]="i">
405+
<td>
406+
<div class="row">
407+
<mat-form-field appearance="fill">
408+
<mat-label>{{ "QUESTION.DATATARGET.SELECT-DEVICES" | translate }}</mat-label>
409+
<mat-select
410+
[(value)]="element.iotDeviceIds"
411+
[compareWith]="payloadDevicesDropdownCompare"
412+
multiple
413+
name="devices"
414+
>
415+
<mat-option class="filter-option" disabled="disabled">
416+
<button (click)="selectAllDevices(i)" class="mat-primary fill text-sm" mat-raised-button>
417+
{{ "QUESTION.DATATARGET.SELECTALLDEVICES" | translate }}
418+
</button>
419+
<button (click)="deSelectAllDevices(i)" class="mat-primary fill text-sm" mat-raised-button>
420+
{{ "QUESTION.DATATARGET.DESELECTALLDEVICES" | translate }}
421+
</button>
422+
</mat-option>
423+
@for (device of devices; track device) {
424+
<mat-option [value]="device.id">{{ device.name }}</mat-option>
425+
}
426+
</mat-select>
427+
</mat-form-field>
428+
</div>
429+
</td>
430+
<td>
431+
<div class="row">
432+
<mat-form-field appearance="fill">
433+
<mat-label>{{ "QUESTION.DATATARGET.SELECT-PAYLOADDECODER" | translate }}</mat-label>
434+
<mat-select [(value)]="element.payloadDecoderId" matNativeControl name="payloadDecoderId">
435+
<mat-option [value]="0">
436+
{{ "QUESTION.DATATARGET.NO-PAYLOAD-DECODER-SELECTED" | translate }}
336437
</mat-option>
337-
}
338-
</mat-select>
339-
</mat-form-field>
340-
</div>
341-
</td>
342-
<td>
343-
<a (click)="openDeleteDialog(i)">
344-
<div class="text-center m-2">
345-
<fa-icon [icon]="faTimesCircle"></fa-icon>
346-
<p>{{ "DATATARGET.DELETE" | translate }}</p>
438+
@for (payloadDecoder of payloadDecoders; track payloadDecoder) {
439+
<mat-option [value]="payloadDecoder.id">
440+
{{ payloadDecoder.name }}
441+
</mat-option>
442+
}
443+
</mat-select>
444+
</mat-form-field>
347445
</div>
348-
</a>
349-
</td>
350-
</tr>
351-
}
446+
</td>
447+
<td>
448+
<a (click)="openDeleteDialog(i)">
449+
<div class="text-center m-2">
450+
<fa-icon [icon]="faTimesCircle"></fa-icon>
451+
<p>{{ "DATATARGET.DELETE" | translate }}</p>
452+
</div>
453+
</a>
454+
</td>
455+
</tr>
456+
}
352457
</tbody>
353458
</table>
354459
}

src/app/applications/datatarget/opendatadk/opendatadk-edit/opendatadk-edit.component.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,39 @@ export class OpendatadkEditComponent implements DatatargetEdit, OnDestroy {
5959
"Økonomi og finanser",
6060
];
6161

62+
selectableUpdateFrequencies = [
63+
"CONT",
64+
"1MIN",
65+
"5MIN",
66+
"10MIN",
67+
"15MIN",
68+
"TRIHOURLY",
69+
"30MIN",
70+
"HOURLY",
71+
"BIHOURLY",
72+
"12HRS",
73+
"DAILY",
74+
"WEEKLY",
75+
"BIWEEKLY",
76+
"MONTHLY",
77+
"BIMONTHLY",
78+
"QUARTERLY",
79+
"ANNUAL",
80+
"NEVER",
81+
"UNKNOWN",
82+
"OTHER",
83+
// Unused options from specificaion
84+
// "TRIENNIAL",
85+
// "QUADRENNIAL",
86+
// "QUINQUENNIAL",
87+
// "AS_NEEDED",
88+
// "NOT_PLANNED",
89+
// "TRIDECENNIAL",
90+
// "BIDECENNIAL",
91+
// "DECENNIAL",
92+
// "BIENNIAL",
93+
];
94+
6295
errorMessages: any[];
6396
errorFields: string[];
6497

src/app/shared/services/scroll-to-top.service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export class ScrollToTopService {
1111
const currentScroll = document.documentElement.scrollTop || document.body.scrollTop;
1212
if (currentScroll > 0) {
1313
window.requestAnimationFrame(smoothscroll);
14-
window.scrollTo(0, currentScroll - currentScroll / 5);
14+
window.scrollTo(0, 0);
1515
}
1616
})();
1717
}

0 commit comments

Comments
 (0)