geonetwork-ui 2.4.1-dev.e5315d8c8 → 2.4.2-dev.096cd6eb9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +2 -3
  2. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +4 -1
  3. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  4. package/esm2022/libs/feature/dataviz/src/lib/service/data.service.mjs +4 -14
  5. package/esm2022/libs/feature/editor/src/lib/components/contact-card/contact-card.component.mjs +3 -3
  6. package/esm2022/libs/feature/editor/src/lib/components/generic-keywords/generic-keywords.component.mjs +3 -3
  7. package/esm2022/libs/feature/editor/src/lib/components/import-record/import-record.component.mjs +3 -4
  8. package/esm2022/libs/feature/editor/src/lib/components/online-resource-card/online-resource-card.component.mjs +3 -3
  9. package/esm2022/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.mjs +64 -50
  10. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts/form-field-contacts.component.mjs +3 -3
  11. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts-for-resource/form-field-contacts-for-resource.component.mjs +3 -3
  12. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.mjs +3 -3
  13. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-online-link-resources/form-field-online-link-resources.component.mjs +8 -9
  14. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-online-resources/form-field-online-resources.component.mjs +5 -25
  15. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.mjs +5 -4
  16. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.mjs +3 -3
  17. package/esm2022/libs/feature/editor/src/lib/fields.config.mjs +10 -2
  18. package/esm2022/libs/feature/record/src/lib/data-view/data-view.component.mjs +6 -3
  19. package/esm2022/libs/feature/record/src/lib/data-view-share/data-view-share.component.mjs +4 -6
  20. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +6 -3
  21. package/esm2022/libs/feature/search/src/lib/results-table/results-table-container.component.mjs +5 -3
  22. package/esm2022/libs/ui/inputs/src/lib/url-input/url-input.component.mjs +7 -2
  23. package/esm2022/libs/ui/search/src/lib/record-preview-feed/record-preview-feed.component.mjs +3 -1
  24. package/esm2022/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.mjs +3 -3
  25. package/esm2022/libs/ui/search/src/lib/results-table/results-table.component.mjs +6 -3
  26. package/esm2022/libs/util/data-fetcher/src/lib/data-fetcher.mjs +5 -1
  27. package/esm2022/libs/util/data-fetcher/src/lib/headers.mjs +3 -2
  28. package/esm2022/libs/util/data-fetcher/src/lib/model.mjs +2 -1
  29. package/esm2022/libs/util/data-fetcher/src/lib/readers/wfs.mjs +79 -0
  30. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +4 -7
  31. package/esm2022/translations/de.json +14 -5
  32. package/esm2022/translations/en.json +23 -14
  33. package/esm2022/translations/es.json +14 -5
  34. package/esm2022/translations/fr.json +24 -15
  35. package/esm2022/translations/it.json +33 -26
  36. package/esm2022/translations/nl.json +14 -5
  37. package/esm2022/translations/pt.json +14 -5
  38. package/fesm2022/geonetwork-ui.mjs +350 -205
  39. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  40. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  41. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  42. package/libs/feature/dataviz/src/lib/service/data.service.d.ts.map +1 -1
  43. package/libs/feature/editor/src/lib/components/import-record/import-record.component.d.ts +0 -1
  44. package/libs/feature/editor/src/lib/components/import-record/import-record.component.d.ts.map +1 -1
  45. package/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.d.ts +38 -17
  46. package/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.d.ts.map +1 -1
  47. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-online-link-resources/form-field-online-link-resources.component.d.ts +2 -2
  48. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-online-link-resources/form-field-online-link-resources.component.d.ts.map +1 -1
  49. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-online-resources/form-field-online-resources.component.d.ts +1 -6
  50. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-online-resources/form-field-online-resources.component.d.ts.map +1 -1
  51. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.d.ts.map +1 -1
  52. package/libs/feature/editor/src/lib/fields.config.d.ts.map +1 -1
  53. package/libs/feature/record/src/lib/data-view/data-view.component.d.ts +2 -1
  54. package/libs/feature/record/src/lib/data-view/data-view.component.d.ts.map +1 -1
  55. package/libs/feature/record/src/lib/data-view-share/data-view-share.component.d.ts +1 -2
  56. package/libs/feature/record/src/lib/data-view-share/data-view-share.component.d.ts.map +1 -1
  57. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts +2 -1
  58. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  59. package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts +2 -1
  60. package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts.map +1 -1
  61. package/libs/ui/inputs/src/lib/url-input/url-input.component.d.ts +3 -2
  62. package/libs/ui/inputs/src/lib/url-input/url-input.component.d.ts.map +1 -1
  63. package/libs/ui/search/src/lib/record-preview-feed/record-preview-feed.component.d.ts.map +1 -1
  64. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts +2 -1
  65. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts.map +1 -1
  66. package/libs/util/data-fetcher/src/lib/data-fetcher.d.ts +3 -2
  67. package/libs/util/data-fetcher/src/lib/data-fetcher.d.ts.map +1 -1
  68. package/libs/util/data-fetcher/src/lib/headers.d.ts.map +1 -1
  69. package/libs/util/data-fetcher/src/lib/model.d.ts +1 -1
  70. package/libs/util/data-fetcher/src/lib/model.d.ts.map +1 -1
  71. package/libs/util/data-fetcher/src/lib/readers/wfs.d.ts +21 -0
  72. package/libs/util/data-fetcher/src/lib/readers/wfs.d.ts.map +1 -0
  73. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  74. package/package.json +1 -1
  75. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +1 -0
  76. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +1 -2
  77. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +3 -0
  78. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +1 -1
  79. package/src/libs/feature/dataviz/src/lib/service/data.service.ts +4 -14
  80. package/src/libs/feature/editor/src/lib/components/contact-card/contact-card.component.html +1 -1
  81. package/src/libs/feature/editor/src/lib/components/generic-keywords/generic-keywords.component.html +1 -1
  82. package/src/libs/feature/editor/src/lib/components/import-record/import-record.component.html +4 -1
  83. package/src/libs/feature/editor/src/lib/components/import-record/import-record.component.ts +0 -4
  84. package/src/libs/feature/editor/src/lib/components/online-resource-card/online-resource-card.component.ts +2 -2
  85. package/src/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.html +20 -19
  86. package/src/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.ts +81 -57
  87. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts/form-field-contacts.component.html +1 -1
  88. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts-for-resource/form-field-contacts-for-resource.component.html +3 -1
  89. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.html +1 -1
  90. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-online-link-resources/form-field-online-link-resources.component.html +0 -1
  91. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-online-link-resources/form-field-online-link-resources.component.ts +6 -6
  92. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-online-resources/form-field-online-resources.component.html +24 -17
  93. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-online-resources/form-field-online-resources.component.ts +2 -27
  94. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.html +1 -1
  95. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.ts +2 -1
  96. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.html +1 -1
  97. package/src/libs/feature/editor/src/lib/fields.config.ts +9 -1
  98. package/src/libs/feature/record/src/lib/data-view/data-view.component.html +1 -0
  99. package/src/libs/feature/record/src/lib/data-view/data-view.component.ts +1 -0
  100. package/src/libs/feature/record/src/lib/data-view-share/data-view-share.component.html +1 -1
  101. package/src/libs/feature/record/src/lib/data-view-share/data-view-share.component.ts +0 -1
  102. package/src/libs/feature/record/src/lib/map-view/map-view.component.html +1 -0
  103. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +1 -0
  104. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.html +1 -0
  105. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.ts +1 -0
  106. package/src/libs/ui/inputs/src/lib/url-input/url-input.component.ts +9 -1
  107. package/src/libs/ui/search/src/lib/record-preview-feed/record-preview-feed.component.ts +3 -0
  108. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.html +5 -1
  109. package/src/libs/ui/search/src/lib/results-table/results-table.component.html +2 -2
  110. package/src/libs/ui/search/src/lib/results-table/results-table.component.ts +1 -0
  111. package/src/libs/util/data-fetcher/src/lib/data-fetcher.ts +9 -1
  112. package/src/libs/util/data-fetcher/src/lib/headers.ts +4 -3
  113. package/src/libs/util/data-fetcher/src/lib/model.ts +1 -0
  114. package/src/libs/util/data-fetcher/src/lib/readers/wfs.ts +112 -0
  115. package/src/libs/util/shared/src/lib/links/link-utils.ts +3 -6
  116. package/translations/de.json +14 -5
  117. package/translations/en.json +23 -14
  118. package/translations/es.json +14 -5
  119. package/translations/fr.json +24 -15
  120. package/translations/it.json +33 -26
  121. package/translations/nl.json +14 -5
  122. package/translations/pt.json +14 -5
  123. package/translations/sk.json +15 -6
@@ -85,6 +85,7 @@ export class MapViewComponent implements AfterViewInit {
85
85
  @Input() set excludeWfs(value: boolean) {
86
86
  this.excludeWfs$.next(value)
87
87
  }
88
+ @Input() displaySource = true
88
89
  @ViewChild('mapContainer') mapContainer: MapContainerComponent
89
90
 
90
91
  excludeWfs$ = new BehaviorSubject(false)
@@ -6,6 +6,7 @@
6
6
  [sortOrder]="sortBy$ | async"
7
7
  [canDelete]="canDelete"
8
8
  [canDuplicate]="canDuplicate"
9
+ [isDuplicating]="isDuplicating"
9
10
  (recordClick)="handleRecordClick($event)"
10
11
  (duplicateRecord)="handleDuplicateRecord($event)"
11
12
  (deleteRecord)="handleDeleteRecord($event)"
@@ -26,6 +26,7 @@ import { TranslateService } from '@ngx-translate/core'
26
26
  export class ResultsTableContainerComponent implements OnDestroy {
27
27
  @Input() canDuplicate: (record: CatalogRecord) => boolean = () => true
28
28
  @Input() canDelete: (record: CatalogRecord) => boolean = () => true
29
+ @Input() isDuplicating: false
29
30
 
30
31
  @Output() recordClick = new EventEmitter<CatalogRecord>()
31
32
  @Output() duplicateRecord = new EventEmitter<CatalogRecord>()
@@ -4,7 +4,9 @@ import {
4
4
  Component,
5
5
  EventEmitter,
6
6
  Input,
7
+ OnChanges,
7
8
  Output,
9
+ SimpleChanges,
8
10
  } from '@angular/core'
9
11
  import { CommonModule } from '@angular/common'
10
12
  import { ButtonComponent } from '../button/button.component'
@@ -29,7 +31,7 @@ import { iconoirArrowUp, iconoirLink } from '@ng-icons/iconoir'
29
31
  ],
30
32
  changeDetection: ChangeDetectionStrategy.OnPush,
31
33
  })
32
- export class UrlInputComponent {
34
+ export class UrlInputComponent implements OnChanges {
33
35
  @Input() set value(v: string) {
34
36
  // we're making sure to only update the input if the URL representation of it has changed; otherwise we keep it identical
35
37
  // to avoid glitches when starting to write a URL and having some characters added/replaced automatically
@@ -57,6 +59,12 @@ export class UrlInputComponent {
57
59
 
58
60
  constructor(private cd: ChangeDetectorRef) {}
59
61
 
62
+ ngOnChanges(changes: SimpleChanges) {
63
+ if (changes['value']) {
64
+ this.inputValue = changes['value'].currentValue
65
+ }
66
+ }
67
+
60
68
  handleInput(event: Event) {
61
69
  const value = (event.target as HTMLInputElement).value
62
70
  this.inputValue = value
@@ -2,6 +2,9 @@ import { ChangeDetectionStrategy, Component, ElementRef } from '@angular/core'
2
2
  import { RecordPreviewComponent } from '../record-preview/record-preview.component'
3
3
  import { TranslateService } from '@ngx-translate/core'
4
4
  import Duration from 'duration-relativetimeformat'
5
+ import { marker } from '@biesbjerg/ngx-translate-extract-marker'
6
+
7
+ marker('record.was.created.time')
5
8
 
6
9
  @Component({
7
10
  selector: 'gn-ui-record-preview-feed',
@@ -11,7 +11,11 @@
11
11
  (buttonClick)="duplicate.emit()"
12
12
  [disabled]="!canDuplicate"
13
13
  data-test="record-menu-duplicate-button"
14
- ><span translate>record.action.duplicate</span></gn-ui-button
14
+ >
15
+ <span *ngIf="canDuplicate" translate>record.action.duplicate</span>
16
+ <span *ngIf="!canDuplicate" translate
17
+ >record.action.duplicating</span
18
+ ></gn-ui-button
15
19
  >
16
20
  <gn-ui-button
17
21
  type="light"
@@ -85,7 +85,7 @@
85
85
 
86
86
  <!-- OWNER COLUMN -->
87
87
  <gn-ui-interactive-table-column
88
- [width]="'9rem'"
88
+ [width]="'12rem'"
89
89
  [sortable]="true"
90
90
  [activeSort]="isSortedBy('recordOwner')"
91
91
  (sortChange)="setSortBy('recordOwner', $event)"
@@ -160,7 +160,7 @@
160
160
  </gn-ui-button>
161
161
  <ng-template #template>
162
162
  <gn-ui-action-menu
163
- [canDuplicate]="canDuplicate(item)"
163
+ [canDuplicate]="canDuplicate(item) && !isDuplicating"
164
164
  [canDelete]="canDelete(item)"
165
165
  (duplicate)="handleDuplicate(item)"
166
166
  (delete)="handleDelete(item)"
@@ -66,6 +66,7 @@ export class ResultsTableComponent {
66
66
  @Input() canDuplicate: (record: CatalogRecord) => boolean = () => true
67
67
  @Input() canDelete: (record: CatalogRecord) => boolean = () => true
68
68
  @Input() isDraftPage = false
69
+ @Input() isDuplicating = false
69
70
 
70
71
  // emits the column (field) as well as the order
71
72
  @Output() sortByChange = new EventEmitter<[string, 'asc' | 'desc']>()
@@ -8,11 +8,16 @@ import { inferDatasetType } from './utils'
8
8
  import { BaseReader } from './readers/base'
9
9
  import { GmlReader } from './readers/gml'
10
10
  import { WfsVersion } from '@camptocamp/ogc-client'
11
+ import { WfsReader } from './readers/wfs'
11
12
 
12
13
  export async function openDataset(
13
14
  url: string,
14
15
  typeHint?: SupportedType,
15
- options?: { namespace: string; wfsVersion: WfsVersion }
16
+ options?: {
17
+ namespace?: string
18
+ wfsVersion?: WfsVersion
19
+ wfsFeatureType?: string
20
+ }
16
21
  ): Promise<BaseReader> {
17
22
  const fileType = await inferDatasetType(url, typeHint)
18
23
  let reader: BaseReader
@@ -33,6 +38,9 @@ export async function openDataset(
33
38
  case 'gml':
34
39
  reader = new GmlReader(url, options.namespace, options.wfsVersion)
35
40
  break
41
+ case 'wfs':
42
+ reader = await WfsReader.createReader(url, options.wfsFeatureType)
43
+ break
36
44
  }
37
45
  reader.load()
38
46
  return reader
@@ -5,9 +5,10 @@ export function parseHeaders(httpHeaders: Headers): DatasetHeaders {
5
5
  if (httpHeaders.has('Content-Type')) {
6
6
  result.mimeType = httpHeaders.get('Content-Type').split(';')[0]
7
7
  const supported =
8
- SupportedTypes.filter(
9
- (type) => AllMimeTypes[type].indexOf(result.mimeType as never) > -1
10
- )[0] || null
8
+ SupportedTypes.filter((type) => type !== 'wfs') // Ignore wfs type as it is not a file type
9
+ .filter(
10
+ (type) => AllMimeTypes[type].indexOf(result.mimeType as never) > -1
11
+ )[0] || null
11
12
  if (supported !== null) result.supportedType = supported
12
13
  }
13
14
  if (httpHeaders.has('Content-Length')) {
@@ -60,6 +60,7 @@ export const SupportedTypes = [
60
60
  'geojson',
61
61
  'excel',
62
62
  'gml',
63
+ 'wfs',
63
64
  ] as const
64
65
  export type SupportedType = (typeof SupportedTypes)[number]
65
66
 
@@ -0,0 +1,112 @@
1
+ import { WfsEndpoint, WfsVersion } from '@camptocamp/ogc-client'
2
+ import { DataItem, DatasetInfo, PropertyInfo } from '../model'
3
+ import { fetchDataAsText } from '../utils'
4
+ import { BaseReader } from './base'
5
+ import { GmlReader, parseGml } from './gml'
6
+ import { GeojsonReader, parseGeojson } from './geojson'
7
+
8
+ export class WfsReader extends BaseReader {
9
+ endpoint: WfsEndpoint
10
+ featureTypeName: string
11
+ version: WfsVersion
12
+
13
+ constructor(url: string, wfsEndpoint: WfsEndpoint, featureTypeName: string) {
14
+ super(url)
15
+ this.endpoint = wfsEndpoint
16
+ this.featureTypeName = featureTypeName
17
+ this.version = this.endpoint.getVersion()
18
+ }
19
+
20
+ get properties(): Promise<PropertyInfo[]> {
21
+ return this.getData().then((result) => result.properties)
22
+ }
23
+
24
+ get info(): Promise<DatasetInfo> {
25
+ return this.endpoint.getFeatureTypeFull(this.featureTypeName).then(
26
+ (result) =>
27
+ ({
28
+ itemsCount: result.objectCount,
29
+ }) as DatasetInfo
30
+ )
31
+ }
32
+
33
+ static async createReader(wfsUrlEndpoint: string, featureTypeName?: string) {
34
+ const wfsEndpoint = await new WfsEndpoint(wfsUrlEndpoint).isReady()
35
+ const featureTypes = wfsEndpoint.getFeatureTypes()
36
+ const featureType = wfsEndpoint.getFeatureTypeSummary(
37
+ featureTypes.length === 1 && !featureTypeName
38
+ ? featureTypes[0].name
39
+ : featureTypeName
40
+ )
41
+ if (!featureType) {
42
+ throw new Error('wfs.featuretype.notfound')
43
+ }
44
+
45
+ if (wfsEndpoint.supportsStartIndex()) {
46
+ return new WfsReader(wfsUrlEndpoint, wfsEndpoint, featureType.name)
47
+ } else if (wfsEndpoint.supportsJson(featureType.name)) {
48
+ return new GeojsonReader(
49
+ wfsEndpoint.getFeatureUrl(featureType.name, {
50
+ asJson: true,
51
+ outputCrs: 'EPSG:4326',
52
+ })
53
+ )
54
+ } else {
55
+ if (
56
+ featureType.outputFormats.find((f) =>
57
+ f.toLowerCase().includes('gml')
58
+ ) &&
59
+ (featureType.defaultCrs === 'EPSG:4326' ||
60
+ featureType.otherCrs?.includes('EPSG:4326'))
61
+ ) {
62
+ return new GmlReader(
63
+ wfsEndpoint.getFeatureUrl(featureType.name, {
64
+ outputFormat: featureType.outputFormats.find((f) =>
65
+ f.toLowerCase().includes('gml')
66
+ ),
67
+ outputCrs: 'EPSG:4326',
68
+ }),
69
+ featureType.name,
70
+ wfsEndpoint.getVersion()
71
+ )
72
+ }
73
+ throw new Error('wfs.geojsongml.notsupported')
74
+ }
75
+ }
76
+
77
+ protected getData() {
78
+ const asJson = this.endpoint.supportsJson(this.featureTypeName)
79
+ let url = this.endpoint.getFeatureUrl(this.featureTypeName, {
80
+ ...(this.startIndex !== null && { startIndex: this.startIndex }),
81
+ ...(this.count !== null && { maxFeatures: this.count }),
82
+ asJson,
83
+ outputCrs: 'EPSG:4326',
84
+ // sortBy: this.sort // TODO: no sort in ogc-client?
85
+ })
86
+
87
+ if (Array.isArray(this.sort) && this.sort.length > 0) {
88
+ const finalUrl = new URL(url)
89
+ const sorts = this.sort
90
+ .map(
91
+ (fieldSort) => `${fieldSort[1]}+${fieldSort[0] === 'asc' ? 'A' : 'D'}`
92
+ )
93
+ .join(',')
94
+ // Direct update on string url to prevent encoding of +A and +D
95
+ url = `${url}${finalUrl.search ? '&' : ''}SORTBY=${sorts}`
96
+ }
97
+
98
+ return fetchDataAsText(url).then((text) =>
99
+ asJson
100
+ ? parseGeojson(text)
101
+ : parseGml(text, this.featureTypeName, this.version)
102
+ )
103
+ }
104
+
105
+ load() {
106
+ // Nothing to load for Wfs
107
+ }
108
+
109
+ async read(): Promise<DataItem[]> {
110
+ return (await this.getData()).items
111
+ }
112
+ }
@@ -258,21 +258,18 @@ export async function getLayers(url: string, serviceProtocol: ServiceProtocol) {
258
258
  return layers
259
259
  }
260
260
  case 'wfs': {
261
- const endpointWfs = new WfsEndpoint(url)
262
- await endpointWfs.isReady()
261
+ const endpointWfs = await new WfsEndpoint(url).isReady()
263
262
  return endpointWfs.getFeatureTypes()
264
263
  }
265
264
  case 'wms': {
266
- const endpointWms = new WmsEndpoint(url)
267
- await endpointWms.isReady()
265
+ const endpointWms = await new WmsEndpoint(url).isReady()
268
266
  return endpointWms
269
267
  .getLayers()
270
268
  .flatMap(wmsLayerFlatten)
271
269
  .filter((l) => l.name)
272
270
  }
273
271
  case 'wmts': {
274
- const endpointWmts = new WmtsEndpoint(url)
275
- await endpointWmts.isReady()
272
+ const endpointWmts = await new WmtsEndpoint(url).isReady()
276
273
  return endpointWmts.getLayers()
277
274
  }
278
275
  default:
@@ -25,7 +25,8 @@
25
25
  "dashboard.createRecord": "Neuer Eintrag",
26
26
  "dashboard.importRecord": "",
27
27
  "dashboard.importRecord.importExternal": "",
28
- "dashboard.importRecord.importExternalLabel": "",
28
+ "dashboard.importRecord.importExternal.subtitle": "",
29
+ "dashboard.importRecord.importExternal.title": "",
29
30
  "dashboard.labels.catalog": "Katalog",
30
31
  "dashboard.labels.mySpace": "Mein Bereich",
31
32
  "dashboard.records.all": "Metadatenkatalog",
@@ -194,8 +195,7 @@
194
195
  "downloads.format.unknown": "unbekannt",
195
196
  "downloads.wfs.featuretype.not.found": "Der Layer wurde nicht gefunden",
196
197
  "dropFile": "Datei ablegen",
197
- "editor.form.keywords.placeholder": "",
198
- "editor.form.placeKeywordWithoutExtent": "",
198
+ "editor.new.record.title": "",
199
199
  "editor.record.delete.confirmation.cancelText": "Stornieren",
200
200
  "editor.record.delete.confirmation.confirmText": "Löschen",
201
201
  "editor.record.delete.confirmation.message": "Sind Sie sicher, dass Sie diesen Datensatz löschen möchten?",
@@ -228,7 +228,9 @@
228
228
  "editor.record.form.field.abstract": "Kurzbeschreibung",
229
229
  "editor.record.form.field.constraintsShortcuts": "",
230
230
  "editor.record.form.field.contacts.noContact": "",
231
+ "editor.record.form.field.contacts.placeholder": "",
231
232
  "editor.record.form.field.contactsForResource.noContact": "",
233
+ "editor.record.form.field.contactsForResource.placeholder": "",
232
234
  "editor.record.form.field.keywords": "Schlagwörter",
233
235
  "editor.record.form.field.legalConstraints": "Rechtliche Einschränkung",
234
236
  "editor.record.form.field.license": "Lizenz",
@@ -237,12 +239,12 @@
237
239
  "editor.record.form.field.onlineResource.confirm": "",
238
240
  "editor.record.form.field.onlineResource.dialogTitle": "",
239
241
  "editor.record.form.field.onlineResource.edit.description": "",
240
- "editor.record.form.field.onlineResource.edit.protocol": "",
241
242
  "editor.record.form.field.onlineResource.edit.identifier.error": "Schichten konnten nicht vom Protokoll abgerufen werden",
242
243
  "editor.record.form.field.onlineResource.edit.identifier.placeholder": "Ebenenname",
243
244
  "editor.record.form.field.onlineResource.edit.identifier.placeholder.wps": "Prozessname",
244
245
  "editor.record.form.field.onlineResource.edit.identifier.select.label": "Wählen Sie eine Ebene",
245
246
  "editor.record.form.field.onlineResource.edit.identifier.submit": "Link zum Dienst",
247
+ "editor.record.form.field.onlineResource.edit.protocol": "",
246
248
  "editor.record.form.field.onlineResource.edit.title": "",
247
249
  "editor.record.form.field.onlineResource.fileSize": "",
248
250
  "editor.record.form.field.onlineResource.modify": "",
@@ -262,6 +264,9 @@
262
264
  "editor.record.form.field.title.placeholder": "Geben Sie einen Titel ein",
263
265
  "editor.record.form.field.uniqueIdentifier": "Eindeutige Kennung (ID)",
264
266
  "editor.record.form.field.updateFrequency": "Aktualisierungshäufigkeit",
267
+ "editor.record.form.keywords.place.placeholder": "",
268
+ "editor.record.form.keywords.place.withoutExtent": "",
269
+ "editor.record.form.keywords.placeholder": "",
265
270
  "editor.record.form.license.cc-by": "",
266
271
  "editor.record.form.license.cc-by-sa": "",
267
272
  "editor.record.form.license.cc-zero": "",
@@ -273,7 +278,7 @@
273
278
  "editor.record.form.license.unknown": "",
274
279
  "editor.record.form.page.accessAndContact": "",
275
280
  "editor.record.form.page.description": "",
276
- "editor.record.form.page.ressources": "",
281
+ "editor.record.form.page.resources": "",
277
282
  "editor.record.form.section.about.description": "",
278
283
  "editor.record.form.section.about.label": "",
279
284
  "editor.record.form.section.annexes.description": "",
@@ -419,6 +424,7 @@
419
424
  "record.action.delete": "Löschen",
420
425
  "record.action.download": "Herunterladen",
421
426
  "record.action.duplicate": "",
427
+ "record.action.duplicating": "",
422
428
  "record.action.view": "Anzeigen",
423
429
  "record.externalViewer.open": "In externem Kartenviewer öffnen",
424
430
  "record.feature.limit": "Die Ressource enthält mehr als {count} Features und kann hier nicht angezeigt werden.",
@@ -449,6 +455,8 @@
449
455
  "record.metadata.api.form.productTooltip": "",
450
456
  "record.metadata.api.form.reset": "Zurücksetzen",
451
457
  "record.metadata.api.form.resetTooltip": "",
458
+ "record.metadata.api.form.title": "Benutzerdefinierte URL generieren",
459
+ "record.metadata.api.form.title.gpf": "",
452
460
  "record.metadata.api.form.type": "Ausgabeformat",
453
461
  "record.metadata.api.form.zoneTitle": "",
454
462
  "record.metadata.api.form.zoneTooltip": "",
@@ -517,6 +525,7 @@
517
525
  "record.tab.chart": "Diagramm",
518
526
  "record.tab.data": "Tabelle",
519
527
  "record.tab.map": "Karte",
528
+ "record.was.created.time": "erstellte diesen Datensatz {time}",
520
529
  "records": "Datensätze",
521
530
  "results.layout.selectOne": "Layout auswählen",
522
531
  "results.records.hits.displayedOn": "{displayed, plural, =0{Kein Datensatz.} one{1 Datensatz} other{{displayed} Datensätze }} {hits, plural, other{angezeigt von {hits} insgesamt.}}",
@@ -25,7 +25,8 @@
25
25
  "dashboard.createRecord": "New dataset",
26
26
  "dashboard.importRecord": "Import",
27
27
  "dashboard.importRecord.importExternal": "Import an external file",
28
- "dashboard.importRecord.importExternalLabel": "External file URL",
28
+ "dashboard.importRecord.importExternal.subtitle": "(link to an XML file)",
29
+ "dashboard.importRecord.importExternal.title": "External file URL",
29
30
  "dashboard.labels.catalog": "Catalog",
30
31
  "dashboard.labels.mySpace": "My space",
31
32
  "dashboard.records.all": "Datasets",
@@ -194,8 +195,7 @@
194
195
  "downloads.format.unknown": "Unknown",
195
196
  "downloads.wfs.featuretype.not.found": "The layer was not found",
196
197
  "dropFile": "Drop file",
197
- "editor.form.keywords.placeholder": "Select a keyword",
198
- "editor.form.placeKeywordWithoutExtent": "This keyword is not associated with any geographical extent",
198
+ "editor.new.record.title": "My dataset",
199
199
  "editor.record.delete.confirmation.cancelText": "Cancel",
200
200
  "editor.record.delete.confirmation.confirmText": "Delete",
201
201
  "editor.record.delete.confirmation.message": "Are you sure you want to delete this dataset?",
@@ -220,15 +220,17 @@
220
220
  "editor.record.form.constraint.header.securityConstraints": "Applicable security conditions",
221
221
  "editor.record.form.constraint.legalConstraints": "Legal constraints",
222
222
  "editor.record.form.constraint.markdown.placeholder": "Your text here",
223
- "editor.record.form.constraint.not.applicable": "No conditions apply.",
224
- "editor.record.form.constraint.not.known": "The conditions are unknown.",
223
+ "editor.record.form.constraint.not.applicable": "No conditions apply",
224
+ "editor.record.form.constraint.not.known": "The conditions are unknown",
225
225
  "editor.record.form.constraint.otherConstraints": "Other constraints",
226
226
  "editor.record.form.constraint.securityConstraints": "Security constraints",
227
227
  "editor.record.form.draft.updateAlert": "Since you created this draft, the dataset has been updated on { date } by { user }. Publishing your draft might erase their edits. To avoid this, you need to either cancel your changes or knowingly publish your own version.",
228
228
  "editor.record.form.field.abstract": "Abstract",
229
229
  "editor.record.form.field.constraintsShortcuts": "",
230
230
  "editor.record.form.field.contacts.noContact": "Please provide at least one point of contact.",
231
+ "editor.record.form.field.contacts.placeholder": "Choose a contact",
231
232
  "editor.record.form.field.contactsForResource.noContact": "Please provide at least one point of contact responsible for the data.",
233
+ "editor.record.form.field.contactsForResource.placeholder": "Choose a contact",
232
234
  "editor.record.form.field.keywords": "Keywords",
233
235
  "editor.record.form.field.legalConstraints": "Legal constraint",
234
236
  "editor.record.form.field.license": "License",
@@ -237,12 +239,12 @@
237
239
  "editor.record.form.field.onlineResource.confirm": "Confirm",
238
240
  "editor.record.form.field.onlineResource.dialogTitle": "Modify the dataset preview",
239
241
  "editor.record.form.field.onlineResource.edit.description": "Description",
240
- "editor.record.form.field.onlineResource.edit.protocol": "Protocol",
241
242
  "editor.record.form.field.onlineResource.edit.identifier.error": "Unable to retrieve layers from protocol",
242
243
  "editor.record.form.field.onlineResource.edit.identifier.placeholder": "Layer name",
243
244
  "editor.record.form.field.onlineResource.edit.identifier.placeholder.wps": "Process name",
244
245
  "editor.record.form.field.onlineResource.edit.identifier.select.label": "Select a layer",
245
246
  "editor.record.form.field.onlineResource.edit.identifier.submit": "Link to the service",
247
+ "editor.record.form.field.onlineResource.edit.protocol": "Protocol",
246
248
  "editor.record.form.field.onlineResource.edit.title": "Title",
247
249
  "editor.record.form.field.onlineResource.fileSize": "{sizeMB}MB",
248
250
  "editor.record.form.field.onlineResource.modify": "Modify",
@@ -250,7 +252,7 @@
250
252
  "editor.record.form.field.onlineResource.toggle.service": "Link to a service",
251
253
  "editor.record.form.field.onlineResources": "Distribution",
252
254
  "editor.record.form.field.otherConstraints": "Other constraint",
253
- "editor.record.form.field.overviews": "Overviews",
255
+ "editor.record.form.field.overviews": "Overview",
254
256
  "editor.record.form.field.recordUpdated": "Record updated",
255
257
  "editor.record.form.field.resourceCreated": "Dataset created",
256
258
  "editor.record.form.field.resourceIdentifier": "Identifier",
@@ -262,6 +264,9 @@
262
264
  "editor.record.form.field.title.placeholder": "Enter a title",
263
265
  "editor.record.form.field.uniqueIdentifier": "Unique identifier",
264
266
  "editor.record.form.field.updateFrequency": "Update frequency",
267
+ "editor.record.form.keywords.place.placeholder": "Search for place keywords",
268
+ "editor.record.form.keywords.place.withoutExtent": "This keyword is not associated with any geographical extent",
269
+ "editor.record.form.keywords.placeholder": "Select a keyword",
265
270
  "editor.record.form.license.cc-by": "Creative Commons CC-BY",
266
271
  "editor.record.form.license.cc-by-sa": "Creative Commons CC-BY-SA",
267
272
  "editor.record.form.license.cc-zero": "Creative Commons CC-0",
@@ -273,26 +278,26 @@
273
278
  "editor.record.form.license.unknown": "Unknown or absent",
274
279
  "editor.record.form.page.accessAndContact": "Information for use",
275
280
  "editor.record.form.page.description": "Dataset description",
276
- "editor.record.form.page.ressources": "Resources",
277
- "editor.record.form.section.about.description": "This section describes the dataset.",
281
+ "editor.record.form.page.resources": "Resources",
282
+ "editor.record.form.section.about.description": "This section describes the dataset",
278
283
  "editor.record.form.section.about.label": "About the dataset",
279
284
  "editor.record.form.section.annexes.description": "Annexes are optional resources. They are attached to the dataset, and help understand the data (manual, etc.).",
280
285
  "editor.record.form.section.annexes.label": "Annexes",
281
- "editor.record.form.section.associatedResources.description": "Point out where the data can be found.",
286
+ "editor.record.form.section.associatedResources.description": "Point out where the data can be found",
282
287
  "editor.record.form.section.associatedResources.label": "Associated resources",
283
- "editor.record.form.section.classification.description": "Appropriate keywords help users find the dataset.",
288
+ "editor.record.form.section.classification.description": "Appropriate keywords help users find the dataset",
284
289
  "editor.record.form.section.classification.label": "Keywords",
285
- "editor.record.form.section.dataManagers.description": "The data managers are responsible for the data.",
290
+ "editor.record.form.section.dataManagers.description": "The data managers are responsible for the data",
286
291
  "editor.record.form.section.dataManagers.label": "Data managers",
287
292
  "editor.record.form.section.geographicalCoverage.label": "Geographical coverage",
288
- "editor.record.form.section.metadataPointOfContact.description": "This information concerns the metadata.",
293
+ "editor.record.form.section.metadataPointOfContact.description": "This information concerns the metadata",
289
294
  "editor.record.form.section.metadataPointOfContact.label": "Metadata point of contact",
290
295
  "editor.record.form.section.useAndAccessConditions.label": "Use and access conditions",
291
296
  "editor.record.form.temporalExtents.addDate": "Time instant",
292
297
  "editor.record.form.temporalExtents.addRange": "Time period",
293
298
  "editor.record.form.temporalExtents.date": "Date",
294
299
  "editor.record.form.temporalExtents.range": "Date range",
295
- "editor.record.form.updateFrequency.planned": "This dataset is updated regularly.",
300
+ "editor.record.form.updateFrequency.planned": "This dataset is updated regularly",
296
301
  "editor.record.importFromExternalFile.failure.body": "Failure",
297
302
  "editor.record.importFromExternalFile.failure.title": "The dataset import failed: ",
298
303
  "editor.record.importFromExternalFile.success.body": "Import successful",
@@ -419,6 +424,7 @@
419
424
  "record.action.delete": "Delete",
420
425
  "record.action.download": "Download",
421
426
  "record.action.duplicate": "Duplicate",
427
+ "record.action.duplicating": "Duplicating...",
422
428
  "record.action.view": "View",
423
429
  "record.externalViewer.open": "Open in the external map viewer",
424
430
  "record.feature.limit": "The resource contains more than {count} features and cannot be displayed here.",
@@ -449,6 +455,8 @@
449
455
  "record.metadata.api.form.productTooltip": "",
450
456
  "record.metadata.api.form.reset": "Reset",
451
457
  "record.metadata.api.form.resetTooltip": "Reset all filters",
458
+ "record.metadata.api.form.title": "Generate a custom URL",
459
+ "record.metadata.api.form.title.gpf": "Download data",
452
460
  "record.metadata.api.form.type": "Output format",
453
461
  "record.metadata.api.form.zoneTitle": "Zone",
454
462
  "record.metadata.api.form.zoneTooltip": "Dropdown for selecting a geographic zone",
@@ -517,6 +525,7 @@
517
525
  "record.tab.chart": "Chart",
518
526
  "record.tab.data": "Table",
519
527
  "record.tab.map": "Map",
528
+ "record.was.created.time": "created this dataset {time}",
520
529
  "records": "datasets",
521
530
  "results.layout.selectOne": "Results layout",
522
531
  "results.records.hits.displayedOn": "{displayed, plural, =0{No dataset.} one{1 } other{{displayed} }} {hits, plural, other{displayed on {hits} total.}}",
@@ -25,7 +25,8 @@
25
25
  "dashboard.createRecord": "",
26
26
  "dashboard.importRecord": "",
27
27
  "dashboard.importRecord.importExternal": "",
28
- "dashboard.importRecord.importExternalLabel": "",
28
+ "dashboard.importRecord.importExternal.subtitle": "",
29
+ "dashboard.importRecord.importExternal.title": "",
29
30
  "dashboard.labels.catalog": "Catálogo",
30
31
  "dashboard.labels.mySpace": "Mi espacio",
31
32
  "dashboard.records.all": "Catálogo",
@@ -194,8 +195,7 @@
194
195
  "downloads.format.unknown": "",
195
196
  "downloads.wfs.featuretype.not.found": "",
196
197
  "dropFile": "",
197
- "editor.form.keywords.placeholder": "",
198
- "editor.form.placeKeywordWithoutExtent": "",
198
+ "editor.new.record.title": "",
199
199
  "editor.record.delete.confirmation.cancelText": "",
200
200
  "editor.record.delete.confirmation.confirmText": "",
201
201
  "editor.record.delete.confirmation.message": "",
@@ -228,7 +228,9 @@
228
228
  "editor.record.form.field.abstract": "",
229
229
  "editor.record.form.field.constraintsShortcuts": "",
230
230
  "editor.record.form.field.contacts.noContact": "",
231
+ "editor.record.form.field.contacts.placeholder": "",
231
232
  "editor.record.form.field.contactsForResource.noContact": "",
233
+ "editor.record.form.field.contactsForResource.placeholder": "",
232
234
  "editor.record.form.field.keywords": "",
233
235
  "editor.record.form.field.legalConstraints": "",
234
236
  "editor.record.form.field.license": "",
@@ -237,12 +239,12 @@
237
239
  "editor.record.form.field.onlineResource.confirm": "",
238
240
  "editor.record.form.field.onlineResource.dialogTitle": "",
239
241
  "editor.record.form.field.onlineResource.edit.description": "",
240
- "editor.record.form.field.onlineResource.edit.protocol": "",
241
242
  "editor.record.form.field.onlineResource.edit.identifier.error": "No se pueden recuperar las capas del protocolo",
242
243
  "editor.record.form.field.onlineResource.edit.identifier.placeholder": "Nombre de la capa",
243
244
  "editor.record.form.field.onlineResource.edit.identifier.placeholder.wps": "Nombre del proceso",
244
245
  "editor.record.form.field.onlineResource.edit.identifier.select.label": "Selecciona una capa",
245
246
  "editor.record.form.field.onlineResource.edit.identifier.submit": "Enlace al servicio",
247
+ "editor.record.form.field.onlineResource.edit.protocol": "",
246
248
  "editor.record.form.field.onlineResource.edit.title": "",
247
249
  "editor.record.form.field.onlineResource.fileSize": "",
248
250
  "editor.record.form.field.onlineResource.modify": "",
@@ -262,6 +264,9 @@
262
264
  "editor.record.form.field.title.placeholder": "Introduzca un título",
263
265
  "editor.record.form.field.uniqueIdentifier": "",
264
266
  "editor.record.form.field.updateFrequency": "",
267
+ "editor.record.form.keywords.place.placeholder": "",
268
+ "editor.record.form.keywords.place.withoutExtent": "",
269
+ "editor.record.form.keywords.placeholder": "",
265
270
  "editor.record.form.license.cc-by": "",
266
271
  "editor.record.form.license.cc-by-sa": "",
267
272
  "editor.record.form.license.cc-zero": "",
@@ -273,7 +278,7 @@
273
278
  "editor.record.form.license.unknown": "",
274
279
  "editor.record.form.page.accessAndContact": "",
275
280
  "editor.record.form.page.description": "",
276
- "editor.record.form.page.ressources": "",
281
+ "editor.record.form.page.resources": "",
277
282
  "editor.record.form.section.about.description": "",
278
283
  "editor.record.form.section.about.label": "",
279
284
  "editor.record.form.section.annexes.description": "",
@@ -419,6 +424,7 @@
419
424
  "record.action.delete": "",
420
425
  "record.action.download": "",
421
426
  "record.action.duplicate": "",
427
+ "record.action.duplicating": "",
422
428
  "record.action.view": "",
423
429
  "record.externalViewer.open": "",
424
430
  "record.feature.limit": "",
@@ -449,6 +455,8 @@
449
455
  "record.metadata.api.form.productTooltip": "",
450
456
  "record.metadata.api.form.reset": "",
451
457
  "record.metadata.api.form.resetTooltip": "",
458
+ "record.metadata.api.form.title": "",
459
+ "record.metadata.api.form.title.gpf": "",
452
460
  "record.metadata.api.form.type": "",
453
461
  "record.metadata.api.form.zoneTitle": "",
454
462
  "record.metadata.api.form.zoneTooltip": "",
@@ -517,6 +525,7 @@
517
525
  "record.tab.chart": "",
518
526
  "record.tab.data": "",
519
527
  "record.tab.map": "",
528
+ "record.was.created.time": "",
520
529
  "records": "",
521
530
  "results.layout.selectOne": "",
522
531
  "results.records.hits.displayedOn": "",