geonetwork-ui 2.6.0-dev.b1563a5e0 → 2.6.0-dev.c49d02679

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 (162) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +13 -2
  2. package/esm2022/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.mjs +1 -1
  3. package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.mjs +8 -4
  4. package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.mjs +5 -2
  5. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +3 -3
  6. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +2 -2
  7. package/esm2022/libs/api/repository/src/lib/gn4/elasticsearch/constant.mjs +2 -1
  8. package/esm2022/libs/api/repository/src/lib/gn4/gn4-repository.mjs +53 -14
  9. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +7 -1
  10. package/esm2022/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.mjs +2 -1
  11. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  12. package/esm2022/libs/common/domain/src/lib/repository/records-repository.interface.mjs +1 -1
  13. package/esm2022/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.mjs +266 -11
  14. package/esm2022/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-from-catalog.component.mjs +1 -1
  15. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +49 -23
  16. package/esm2022/libs/feature/search/src/lib/constants.mjs +3 -2
  17. package/esm2022/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.mjs +5 -3
  18. package/esm2022/libs/feature/search/src/lib/results-table/results-table-container.component.mjs +13 -10
  19. package/esm2022/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.mjs +19 -34
  20. package/esm2022/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.mjs +59 -0
  21. package/esm2022/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.mjs +35 -10
  22. package/esm2022/libs/ui/elements/src/lib/metadata-quality-item/metadata-quality-item.component.mjs +5 -1
  23. package/esm2022/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.mjs +50 -29
  24. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +7 -3
  25. package/esm2022/libs/ui/layout/src/index.mjs +2 -1
  26. package/esm2022/libs/ui/layout/src/lib/cell-popin/cell-popin.component.mjs +110 -0
  27. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table.component.mjs +20 -10
  28. package/esm2022/libs/ui/layout/src/lib/truncated-text/truncated-text.component.mjs +15 -49
  29. package/esm2022/libs/ui/layout/src/lib/ui-layout.module.mjs +2 -2
  30. package/esm2022/libs/ui/search/src/index.mjs +2 -1
  31. package/esm2022/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.mjs +21 -12
  32. package/esm2022/libs/ui/search/src/lib/results-table/results-table.component.mjs +39 -18
  33. package/esm2022/libs/ui/search/src/lib/ui-search.module.mjs +10 -4
  34. package/esm2022/libs/util/i18n/src/lib/i18n.constants.mjs +42 -1
  35. package/esm2022/libs/util/i18n/src/lib/language-codes.mjs +24 -2
  36. package/esm2022/translations/de.json +42 -6
  37. package/esm2022/translations/en.json +42 -6
  38. package/esm2022/translations/es.json +41 -5
  39. package/esm2022/translations/fr.json +42 -6
  40. package/esm2022/translations/it.json +41 -5
  41. package/esm2022/translations/nl.json +41 -5
  42. package/esm2022/translations/pt.json +41 -5
  43. package/fesm2022/geonetwork-ui.mjs +1573 -733
  44. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  45. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  46. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts +0 -1
  47. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts.map +1 -1
  48. package/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.d.ts +1 -0
  49. package/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.d.ts.map +1 -1
  50. package/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.d.ts.map +1 -1
  51. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  52. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  53. package/libs/api/repository/src/lib/gn4/elasticsearch/constant.d.ts.map +1 -1
  54. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts +10 -2
  55. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts.map +1 -1
  56. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +2 -0
  57. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  58. package/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.d.ts +1 -0
  59. package/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.d.ts.map +1 -1
  60. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +20 -17
  61. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  62. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts +4 -0
  63. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts.map +1 -1
  64. package/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.d.ts +48 -3
  65. package/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.d.ts.map +1 -1
  66. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts +13 -5
  67. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  68. package/libs/feature/search/src/lib/constants.d.ts.map +1 -1
  69. package/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.d.ts +2 -1
  70. package/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.d.ts.map +1 -1
  71. package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts +6 -5
  72. package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts.map +1 -1
  73. package/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.d.ts +3 -6
  74. package/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.d.ts.map +1 -1
  75. package/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.d.ts +14 -0
  76. package/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.d.ts.map +1 -0
  77. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts +3 -0
  78. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts.map +1 -1
  79. package/libs/ui/elements/src/lib/metadata-quality-item/metadata-quality-item.component.d.ts.map +1 -1
  80. package/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.d.ts +20 -9
  81. package/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.d.ts.map +1 -1
  82. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +2 -1
  83. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  84. package/libs/ui/layout/src/index.d.ts +1 -0
  85. package/libs/ui/layout/src/index.d.ts.map +1 -1
  86. package/libs/ui/layout/src/lib/cell-popin/cell-popin.component.d.ts +28 -0
  87. package/libs/ui/layout/src/lib/cell-popin/cell-popin.component.d.ts.map +1 -0
  88. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts +4 -2
  89. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts.map +1 -1
  90. package/libs/ui/layout/src/lib/truncated-text/truncated-text.component.d.ts +5 -10
  91. package/libs/ui/layout/src/lib/truncated-text/truncated-text.component.d.ts.map +1 -1
  92. package/libs/ui/search/src/index.d.ts +1 -0
  93. package/libs/ui/search/src/index.d.ts.map +1 -1
  94. package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts +4 -3
  95. package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts.map +1 -1
  96. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts +10 -4
  97. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts.map +1 -1
  98. package/libs/ui/search/src/lib/ui-search.module.d.ts +2 -1
  99. package/libs/ui/search/src/lib/ui-search.module.d.ts.map +1 -1
  100. package/libs/util/i18n/src/lib/i18n.constants.d.ts +1 -0
  101. package/libs/util/i18n/src/lib/i18n.constants.d.ts.map +1 -1
  102. package/libs/util/i18n/src/lib/language-codes.d.ts +23 -1
  103. package/libs/util/i18n/src/lib/language-codes.d.ts.map +1 -1
  104. package/package.json +1 -1
  105. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +1 -1
  106. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +18 -1
  107. package/src/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.ts +0 -1
  108. package/src/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.ts +13 -3
  109. package/src/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.ts +5 -1
  110. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +6 -3
  111. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +4 -1
  112. package/src/libs/api/repository/src/lib/gn4/elasticsearch/constant.ts +1 -0
  113. package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +70 -13
  114. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +11 -0
  115. package/src/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.ts +3 -0
  116. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +20 -14
  117. package/src/libs/common/domain/src/lib/repository/records-repository.interface.ts +4 -0
  118. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +63 -0
  119. package/src/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.html +117 -11
  120. package/src/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.ts +316 -6
  121. package/src/libs/feature/record/src/lib/map-view/map-view.component.html +27 -9
  122. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +84 -27
  123. package/src/libs/feature/search/src/lib/constants.ts +2 -1
  124. package/src/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.html +1 -1
  125. package/src/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.ts +1 -0
  126. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.html +1 -0
  127. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.ts +13 -3
  128. package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.html +7 -75
  129. package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.ts +20 -51
  130. package/src/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.html +69 -0
  131. package/src/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.ts +61 -0
  132. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.ts +48 -9
  133. package/src/libs/ui/elements/src/lib/metadata-quality-item/metadata-quality-item.component.ts +4 -0
  134. package/src/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.html +96 -37
  135. package/src/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.ts +60 -29
  136. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +2 -0
  137. package/src/libs/ui/layout/src/index.ts +1 -0
  138. package/src/libs/ui/layout/src/lib/cell-popin/cell-popin.component.html +40 -0
  139. package/src/libs/ui/layout/src/lib/cell-popin/cell-popin.component.ts +141 -0
  140. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +3 -2
  141. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.ts +13 -6
  142. package/src/libs/ui/layout/src/lib/truncated-text/truncated-text.component.html +25 -42
  143. package/src/libs/ui/layout/src/lib/truncated-text/truncated-text.component.ts +10 -49
  144. package/src/libs/ui/layout/src/lib/ui-layout.module.ts +1 -1
  145. package/src/libs/ui/search/src/index.ts +1 -0
  146. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.html +16 -6
  147. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.ts +15 -11
  148. package/src/libs/ui/search/src/lib/results-table/results-table.component.css +4 -0
  149. package/src/libs/ui/search/src/lib/results-table/results-table.component.html +31 -27
  150. package/src/libs/ui/search/src/lib/results-table/results-table.component.ts +33 -15
  151. package/src/libs/ui/search/src/lib/ui-search.module.ts +3 -0
  152. package/src/libs/util/i18n/src/lib/i18n.constants.ts +42 -0
  153. package/src/libs/util/i18n/src/lib/language-codes.ts +23 -1
  154. package/tailwind.base.css +1 -1
  155. package/translations/de.json +42 -6
  156. package/translations/en.json +42 -6
  157. package/translations/es.json +41 -5
  158. package/translations/fr.json +42 -6
  159. package/translations/it.json +41 -5
  160. package/translations/nl.json +41 -5
  161. package/translations/pt.json +41 -5
  162. package/translations/sk.json +41 -5
@@ -19,6 +19,7 @@ export const ES_SOURCE_SUMMARY = [
19
19
  'cl_maintenanceAndUpdateFrequency',
20
20
  'tag',
21
21
  'MD_LegalConstraintsUseLimitationObject',
22
+ 'MD_LegalConstraintsOtherConstraintsObject',
22
23
  'qualityScore',
23
24
  ]
24
25
 
@@ -14,8 +14,8 @@ import {
14
14
  import { PublicationVersionError } from '../../../../../../libs/common/domain/src/lib/model/error'
15
15
  import {
16
16
  CatalogRecord,
17
- DatasetFeatureType,
18
17
  DatasetFeatureCatalog,
18
+ DatasetFeatureType,
19
19
  } from '../../../../../../libs/common/domain/src/lib/model/record'
20
20
  import {
21
21
  Aggregations,
@@ -29,10 +29,11 @@ import {
29
29
  import { PlatformServiceInterface } from '../../../../../../libs/common/domain/src/lib/platform.service.interface'
30
30
  import { RecordsRepositoryInterface } from '../../../../../../libs/common/domain/src/lib/repository/records-repository.interface'
31
31
  import {
32
+ LanguagesApiService,
32
33
  RecordsApiService,
33
34
  SearchApiService,
34
- FeatureResponseApiModel,
35
35
  } from '../../../../../../libs/data-access/gn4/src'
36
+ import { LANG_3_TO_2_MAPPER } from '../../../../../../libs/util/i18n/src'
36
37
  import {
37
38
  combineLatest,
38
39
  exhaustMap,
@@ -47,6 +48,7 @@ import {
47
48
  import { catchError, map, tap } from 'rxjs/operators'
48
49
  import { lt } from 'semver'
49
50
  import { ElasticsearchService } from './elasticsearch'
51
+ import { Gn4SettingsService } from './settings/gn4-settings.service'
50
52
 
51
53
  const minPublicationApiVersion = '4.2.5'
52
54
 
@@ -65,7 +67,9 @@ export class Gn4Repository implements RecordsRepositoryInterface {
65
67
  private gn4SearchHelper: ElasticsearchService,
66
68
  private gn4Mapper: Gn4Converter,
67
69
  private gn4RecordsApi: RecordsApiService,
68
- private platformService: PlatformServiceInterface
70
+ private platformService: PlatformServiceInterface,
71
+ private gn4LanguagesApi: LanguagesApiService,
72
+ private settingsService: Gn4SettingsService
69
73
  ) {}
70
74
 
71
75
  search({
@@ -171,12 +175,21 @@ export class Gn4Repository implements RecordsRepositoryInterface {
171
175
  name: featureType.typeName || '',
172
176
  definition: featureType.definition || '',
173
177
  attributes: Array.isArray(featureType.attributeTable)
174
- ? featureType.attributeTable.map((attr) => ({
175
- name: attr.name,
176
- code: attr.code,
177
- title: attr.definition,
178
- type: attr.type,
179
- }))
178
+ ? featureType.attributeTable.map((attr) => {
179
+ const values = attr.values
180
+ ?.filter((v) => v.code || v.label)
181
+ .map((v) => ({
182
+ code: v.code,
183
+ label: v.label,
184
+ }))
185
+ return {
186
+ name: attr.name,
187
+ code: attr.code,
188
+ definition: attr.definition,
189
+ type: attr.type,
190
+ ...(values?.length > 0 ? { values } : {}),
191
+ }
192
+ })
180
193
  : [],
181
194
  })),
182
195
  }
@@ -294,14 +307,46 @@ export class Gn4Repository implements RecordsRepositoryInterface {
294
307
  : of(true)
295
308
  }
296
309
 
297
- canEditRecord(uniqueIdentifier: string): Observable<boolean> {
298
- return this.getRecord(uniqueIdentifier).pipe(
299
- map((record) => {
300
- return record.extras['edit'] as boolean
310
+ canDuplicate(record: CatalogRecord): boolean {
311
+ return record.kind === 'dataset'
312
+ }
313
+
314
+ canDelete(record: CatalogRecord): Observable<boolean> {
315
+ return this.settingsService.allowEditHarvested$.pipe(
316
+ map((allowEditHarvested) => {
317
+ return (
318
+ record.extras['edit'] &&
319
+ (!record.extras['isHarvested'] || allowEditHarvested)
320
+ )
301
321
  })
302
322
  )
303
323
  }
304
324
 
325
+ private canEdit(record: CatalogRecord, allowEditHarvested: boolean): boolean {
326
+ return (
327
+ record.kind === 'dataset' &&
328
+ record.extras['edit'] &&
329
+ (!record.extras['isHarvested'] || allowEditHarvested)
330
+ )
331
+ }
332
+
333
+ canEditRecord(uniqueIdentifier: string): Observable<boolean> {
334
+ return combineLatest([
335
+ this.getRecord(uniqueIdentifier),
336
+ this.settingsService.allowEditHarvested$,
337
+ ]).pipe(
338
+ map(([record, allowEditHarvested]) =>
339
+ record ? this.canEdit(record, allowEditHarvested) : false
340
+ )
341
+ )
342
+ }
343
+
344
+ canEditIndexedRecord(record: CatalogRecord): Observable<boolean> {
345
+ return this.settingsService.allowEditHarvested$.pipe(
346
+ map((allowEditHarvested) => this.canEdit(record, allowEditHarvested))
347
+ )
348
+ }
349
+
305
350
  openRecordForEdition(
306
351
  uniqueIdentifier: string
307
352
  ): Observable<[CatalogRecord, string, boolean] | null> {
@@ -510,6 +555,18 @@ export class Gn4Repository implements RecordsRepositoryInterface {
510
555
  )
511
556
  }
512
557
 
558
+ getApplicationLanguages(): Observable<string[]> {
559
+ return this.gn4LanguagesApi
560
+ .getApplicationLanguages()
561
+ .pipe(
562
+ map((languages) =>
563
+ languages
564
+ .map((lang) => LANG_3_TO_2_MAPPER[lang.id ?? ''])
565
+ .filter((code): code is string => !!code)
566
+ )
567
+ )
568
+ }
569
+
513
570
  private getRecordAsXml(uniqueIdentifier: string): Observable<string | null> {
514
571
  return this.gn4RecordsApi
515
572
  .getRecordAs(
@@ -82,6 +82,13 @@ export class Gn4PlatformService implements PlatformServiceInterface {
82
82
  shareReplay(1)
83
83
  )
84
84
 
85
+ private readonly allowEditHarvestedMd$ = this.settings$.pipe(
86
+ map((info) => {
87
+ return info['system/harvester/enableEditing'] as boolean
88
+ }),
89
+ shareReplay(1)
90
+ )
91
+
85
92
  /**
86
93
  * A map of already loaded thesauri (groups of keywords); the key is a URI
87
94
  * @private
@@ -123,6 +130,10 @@ export class Gn4PlatformService implements PlatformServiceInterface {
123
130
  return this.apiVersion$
124
131
  }
125
132
 
133
+ getAllowEditHarvestedMd(): Observable<boolean> {
134
+ return this.allowEditHarvestedMd$
135
+ }
136
+
126
137
  getMe(): Observable<UserModel> {
127
138
  return this.me$
128
139
  }
@@ -11,6 +11,9 @@ export class Gn4SettingsService {
11
11
  'system/users/identicon'
12
12
  )
13
13
 
14
+ public allowEditHarvested$: Observable<boolean> =
15
+ this.getSettingsSetValueByKey('system/harvester/enableEditing')
16
+
14
17
  constructor(private siteApiService: SiteApiService) {}
15
18
 
16
19
  private getSettingsSetValueByKey(key: string) {
@@ -233,14 +233,6 @@ export interface DatasetRecord extends BaseRecord {
233
233
  spatialRepresentation?: SpatialRepresentationType
234
234
  }
235
235
 
236
- export type DatasetFeatureCatalog = {
237
- featureTypes: Array<{
238
- name: string
239
- definition: string
240
- attributes: Array<{ name: string; title: string; code: string }>
241
- }>
242
- }
243
-
244
236
  export interface ServiceEndpoint {
245
237
  url: URL
246
238
  accessServiceProtocol: ServiceProtocol
@@ -268,18 +260,32 @@ export interface ReuseRecord extends BaseRecord {
268
260
  temporalExtents: Array<DatasetTemporalExtent>
269
261
  }
270
262
 
263
+ export type DatasetFeatureCatalog = {
264
+ featureTypes: Array<{
265
+ name: string
266
+ definition: string
267
+ attributes: DatasetFeatureAttribute[]
268
+ }>
269
+ }
270
+ export interface DatasetFeatureAttributeValue {
271
+ code?: string
272
+ definition?: string
273
+ label?: string
274
+ }
275
+ export interface DatasetFeatureAttribute {
276
+ name: string
277
+ definition: string
278
+ type: string
279
+ code: string
280
+ values?: Array<DatasetFeatureAttributeValue>
281
+ }
271
282
  export interface DatasetFeatureType {
272
283
  aliases: string
273
284
  code: string
274
285
  isAbstract: string
275
286
  typeName: string
276
287
  definition: string
277
- attributeTable: Array<{
278
- name: string
279
- definition: string
280
- type: string
281
- code: string
282
- }>
288
+ attributeTable: Array<DatasetFeatureAttribute>
283
289
  }
284
290
 
285
291
  export type ReuseType = 'application' | 'map' | 'other'
@@ -22,7 +22,10 @@ export abstract class RecordsRepositoryInterface {
22
22
  abstract getSources(record: CatalogRecord): Observable<CatalogRecord[]>
23
23
  abstract getSourceOf(record: CatalogRecord): Observable<CatalogRecord[]>
24
24
  abstract fuzzySearch(query: string): Observable<SearchResults>
25
+ abstract canDuplicate(record: CatalogRecord): boolean
26
+ abstract canDelete(record: CatalogRecord): Observable<boolean>
25
27
  abstract canEditRecord(uniqueIdentifier: string): Observable<boolean>
28
+ abstract canEditIndexedRecord(record: CatalogRecord): Observable<boolean>
26
29
  /**
27
30
  * This emits once:
28
31
  * - record object; if a draft exists, this will return it
@@ -97,4 +100,5 @@ export abstract class RecordsRepositoryInterface {
97
100
  localRecord: CatalogRecord
98
101
  ): Observable<{ user: string; date: Date }>
99
102
  abstract getRecordPublicationStatus(uuid: string): Observable<boolean>
103
+ abstract getApplicationLanguages(): Observable<string[]>
100
104
  }
@@ -3,6 +3,7 @@ import {
3
3
  DatasetRecord,
4
4
  DatasetSpatialExtent,
5
5
  Keyword,
6
+ ServiceRecord,
6
7
  } from '../../../../../libs/common/domain/src/lib/model/record'
7
8
 
8
9
  export const datasetRecordsFixture: () => CatalogRecord[] = () => [
@@ -176,6 +177,20 @@ As such, **it is not very interesting at all.**`,
176
177
  link: '',
177
178
  definition: 'Nom de la rue',
178
179
  type: 'String (48)',
180
+ values: [
181
+ {
182
+ code: 'Pomme',
183
+ label: 'Les Pommiers',
184
+ description: 'Sous les pommiers',
185
+ },
186
+ {
187
+ code: 'Cotton',
188
+ label: 'Rue Cotton',
189
+ description: 'Rue Cotton',
190
+ },
191
+ { code: "Passage de l'échiquier" },
192
+ { description: 'Rue du Charlieu' },
193
+ ],
179
194
  },
180
195
  {
181
196
  code: 'RUE',
@@ -811,6 +826,54 @@ export const importDatasetRecordAsXmlFixture = (): string => `
811
826
  </gmd:identificationInfo>
812
827
  </gmd:MD_Metadata>`
813
828
 
829
+ export const simpleServiceRecordFixture = (): ServiceRecord => ({
830
+ kind: 'service',
831
+ status: null,
832
+ lineage: null,
833
+ recordUpdated: new Date('2023-03-17T07:38:08.875Z'),
834
+ recordPublished: null,
835
+ ownerOrganization: null,
836
+ licenses: [],
837
+ legalConstraints: [],
838
+ securityConstraints: [],
839
+ otherConstraints: [],
840
+ contacts: [],
841
+ contactsForResource: [],
842
+ keywords: [],
843
+ topics: [],
844
+ spatialExtents: [],
845
+ temporalExtents: [],
846
+ overviews: [],
847
+ defaultLanguage: null,
848
+ otherLanguages: [],
849
+ title: 'Sites de gestion des déchets miniers - Service de visualisation WMS',
850
+ onlineResources: [
851
+ {
852
+ name: 'Service de visualisation WMS',
853
+ description:
854
+ 'Adresse de connexion au service de visualisation WMS de la série de couches de données "Sites de gestion des déchets miniers"',
855
+ type: 'service',
856
+ url: new URL(
857
+ 'https://geoservices.wallonie.be/arcgis/services/SOL_SOUS_SOL/DECHETS_MINIERS/MapServer/WMSServer?request=GetCapabilities&service=WMS'
858
+ ),
859
+ accessServiceProtocol: 'wms',
860
+ accessRestricted: false,
861
+ },
862
+ ],
863
+ uniqueIdentifier: '00b22798-ec8e-4500-89e8-90eeeda45919',
864
+ landingPage: new URL(
865
+ 'http://localhost:4200/geonetwork/srv/fre/catalog.search#/metadata/00b22798-ec8e-4500-89e8-90eeeda45919'
866
+ ),
867
+ extras: {
868
+ isPublishedToAll: true,
869
+ id: '723',
870
+ isHarvested: true,
871
+ ownerInfo: 'admin|admin|admin|Administrator',
872
+ edit: true,
873
+ },
874
+ recordCreated: new Date('2023-03-17T07:38:08.875Z'),
875
+ })
876
+
814
877
  export const NATIONAL_KEYWORD = {
815
878
  key: 'http://inspire.ec.europa.eu/metadata-codelist/SpatialScope/national',
816
879
  label: 'National',
@@ -1,14 +1,120 @@
1
1
  <div
2
- class="flex flex-col h-full w-[302px] bg-neutral-100 border-l border-gray-300 py-9 px-3 gap-8"
2
+ class="flex flex-col h-full w-[302px] bg-neutral-100 border-l border-gray-300 py-8 px-3 gap-6 overflow-auto"
3
3
  >
4
- <span class="text-3xl font-title text-black/80 px-2" translate
5
- >editor.record.form.multilingual.title</span
6
- >
7
- <gn-ui-check-toggle
8
- class="p-2"
9
- [label]="'editor.record.form.multilingual.enable' | translate"
10
- [color]="'primary'"
11
- [value]="translationsEnabled"
12
- (toggled)="translationsEnabled = $event"
13
- ></gn-ui-check-toggle>
4
+ <div class="flex flex-row px-2 justify-between">
5
+ <span class="text-3xl font-title text-black/80" translate
6
+ >editor.record.form.multilingual.title</span
7
+ >
8
+ <button
9
+ [title]="'editor.record.form.multilingual.open' | translate"
10
+ (click)="toggleLanguageSelection()"
11
+ *ngIf="isMultilingual"
12
+ data-test="activateSelection"
13
+ >
14
+ <ng-icon class="mt-1" name="iconoirSettings"></ng-icon>
15
+ </button>
16
+ </div>
17
+ <div class="flex flex-col gap-2" *ngIf="editTranslations || !isMultilingual">
18
+ <gn-ui-check-toggle
19
+ class="p-2"
20
+ [label]="'editor.record.form.multilingual.enable' | translate"
21
+ [color]="'primary'"
22
+ [(value)]="isMultilingual"
23
+ (toggled)="switchMultilingual($event)"
24
+ ></gn-ui-check-toggle>
25
+ <div *ngIf="isMultilingual" class="flex flex-col gap-2">
26
+ <div class="flex flex-row justify-between border-t border-gray-300 p-3">
27
+ <span class="mt-2 text-sm text-gray-600" translate
28
+ >editor.record.form.multilingual.activate</span
29
+ >
30
+ <gn-ui-button
31
+ extraClass="w-16 h-8 font-bold"
32
+ type="gray"
33
+ (buttonClick)="validateTranslations()"
34
+ data-test="validateSelection"
35
+ >{{ 'editor.record.form.multilingual.validate' | translate }}
36
+ </gn-ui-button>
37
+ </div>
38
+ <ng-container *ngIf="supportedLanguages$ | async as languages">
39
+ <div
40
+ class="flex flex-col gap-2 w-full px-2"
41
+ data-test="langAvailable"
42
+ *ngFor="let lang of languages"
43
+ >
44
+ <gn-ui-button
45
+ [extraClass]="getExtraClass(lang)"
46
+ type="gray"
47
+ (buttonClick)="toggleLanguage(lang)"
48
+ [disabled]="lang === _record.defaultLanguage"
49
+ [title]="getToggleTitle(lang)"
50
+ >
51
+ <span [class]="getIconClass(lang)"></span>
52
+ <span class="ml-2">{{ 'language.' + lang | translate }}</span>
53
+ </gn-ui-button>
54
+ </div>
55
+ </ng-container>
56
+ </div>
57
+ </div>
58
+ <div *ngIf="!editTranslations && isMultilingual" class="flex flex-col gap-2">
59
+ <gn-ui-button
60
+ *ngFor="let recordLang of sortLanguages(recordLanguages); let i = index"
61
+ extraClass="flex flex-row justify-between bg-white border border-white rounded mb-1 h-[34px] w-full"
62
+ [ngClass]="{
63
+ 'mt-8': isFirstUnsupported(i),
64
+ '': true,
65
+ }"
66
+ (buttonClick)="switchFormLang(recordLang)"
67
+ type="outline"
68
+ data-test="langSwitch"
69
+ >
70
+ <div class="flex flex-row gap-2 items-center">
71
+ <ng-icon
72
+ *ngIf="recordLang === formLanguage"
73
+ class="text-primary mt-1"
74
+ name="iconoirCheckCircle"
75
+ ></ng-icon>
76
+ <ng-icon
77
+ *ngIf="recordLang !== formLanguage"
78
+ class="text-gray-800 mt-1"
79
+ name="iconoirCircle"
80
+ ></ng-icon>
81
+ <span
82
+ *ngIf="recordLang.length === 2"
83
+ [class]="getIconClass(recordLang) + 'mt-1'"
84
+ ></span>
85
+ <span [ngClass]="recordLang === formLanguage ? 'text-black' : ''">{{
86
+ isLangSupported(recordLang)
87
+ ? ('language.' + recordLang | translate)
88
+ : recordLang.toUpperCase()
89
+ }}</span>
90
+ </div>
91
+ <div class="flex flex-row gap-2 items-center">
92
+ <span
93
+ *ngIf="recordLang === formLanguage"
94
+ class="text-xs text-base"
95
+ translate
96
+ >editor.record.form.multilingual.default</span
97
+ >
98
+ <button
99
+ (click)="
100
+ openActionMenu(recordLang, template); $event.stopPropagation()
101
+ "
102
+ cdkOverlayOrigin
103
+ #actionMenuButton
104
+ >
105
+ <ng-icon class="pb-5" name="matMoreHorizOutline"></ng-icon>
106
+ </button>
107
+ <ng-template #template>
108
+ <gn-ui-action-menu
109
+ [canDelete]="recordLang !== _record.defaultLanguage"
110
+ page="record"
111
+ (delete)="confirmDeleteAction(recordLang)"
112
+ (closeActionMenu)="closeActionMenu()"
113
+ (switch)="switchDefaultLang(recordLang)"
114
+ >
115
+ </gn-ui-action-menu>
116
+ </ng-template>
117
+ </div>
118
+ </gn-ui-button>
119
+ </div>
14
120
  </div>