geonetwork-ui 2.6.0-dev.6681b0ab3 → 2.6.0-dev.6e0b3d33d

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 (235) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/common/distribution.mapper.mjs +3 -1
  2. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +40 -4
  3. package/esm2022/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.mjs +1 -1
  4. package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.mjs +8 -4
  5. package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.mjs +5 -2
  6. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +4 -4
  7. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +2 -2
  8. package/esm2022/libs/api/repository/src/lib/gn4/elasticsearch/constant.mjs +2 -1
  9. package/esm2022/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.mjs +3 -3
  10. package/esm2022/libs/api/repository/src/lib/gn4/gn4-repository.mjs +77 -17
  11. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +7 -1
  12. package/esm2022/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.mjs +2 -1
  13. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  14. package/esm2022/libs/common/domain/src/lib/repository/records-repository.interface.mjs +1 -1
  15. package/esm2022/libs/feature/dataviz/src/lib/service/data.service.mjs +32 -2
  16. package/esm2022/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.mjs +266 -11
  17. package/esm2022/libs/feature/record/src/index.mjs +2 -3
  18. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +31 -5
  19. package/esm2022/libs/feature/record/src/lib/state/mdview.actions.mjs +3 -1
  20. package/esm2022/libs/feature/record/src/lib/state/mdview.effects.mjs +7 -1
  21. package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +7 -13
  22. package/esm2022/libs/feature/record/src/lib/state/mdview.reducer.mjs +7 -1
  23. package/esm2022/libs/feature/record/src/lib/state/mdview.selectors.mjs +3 -1
  24. package/esm2022/libs/feature/search/src/lib/constants.mjs +2 -1
  25. package/esm2022/libs/feature/search/src/lib/results-list/results-list.container.component.mjs +6 -2
  26. package/esm2022/libs/feature/search/src/lib/results-table/results-table-container.component.mjs +13 -10
  27. package/esm2022/libs/ui/elements/src/index.mjs +2 -1
  28. package/esm2022/libs/ui/elements/src/lib/geo-data-badge/geo-data-badge.component.mjs +55 -0
  29. package/esm2022/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.mjs +42 -83
  30. package/esm2022/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.mjs +59 -0
  31. package/esm2022/libs/ui/elements/src/lib/kind-badge/kind-badge.component.mjs +22 -5
  32. package/esm2022/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.mjs +3 -3
  33. package/esm2022/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.mjs +50 -29
  34. package/esm2022/libs/ui/elements/src/lib/related-record-card/related-record-card.component.mjs +17 -7
  35. package/esm2022/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.mjs +12 -4
  36. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +14 -4
  37. package/esm2022/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.mjs +3 -3
  38. package/esm2022/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.mjs +3 -3
  39. package/esm2022/libs/ui/layout/src/index.mjs +2 -1
  40. package/esm2022/libs/ui/layout/src/lib/cell-popin/cell-popin.component.mjs +110 -0
  41. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table.component.mjs +20 -10
  42. package/esm2022/libs/ui/layout/src/lib/truncated-text/truncated-text.component.mjs +15 -49
  43. package/esm2022/libs/ui/layout/src/lib/ui-layout.module.mjs +2 -2
  44. package/esm2022/libs/ui/search/src/index.mjs +2 -1
  45. package/esm2022/libs/ui/search/src/lib/record-preview-row/record-preview-row.component.mjs +4 -8
  46. package/esm2022/libs/ui/search/src/lib/results-hits-search-kind/results-hits-search-kind.component.mjs +3 -3
  47. package/esm2022/libs/ui/search/src/lib/results-list/results-layout.config.mjs +2 -2
  48. package/esm2022/libs/ui/search/src/lib/results-list/results-list.component.mjs +3 -3
  49. package/esm2022/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.mjs +21 -12
  50. package/esm2022/libs/ui/search/src/lib/results-table/results-table.component.mjs +39 -18
  51. package/esm2022/libs/ui/search/src/lib/ui-search.module.mjs +10 -4
  52. package/esm2022/libs/util/i18n/src/lib/i18n.constants.mjs +42 -1
  53. package/esm2022/libs/util/i18n/src/lib/language-codes.mjs +24 -2
  54. package/esm2022/libs/util/shared/src/lib/links/link-classifier.service.mjs +4 -1
  55. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +4 -1
  56. package/esm2022/translations/de.json +39 -12
  57. package/esm2022/translations/en.json +36 -11
  58. package/esm2022/translations/es.json +38 -11
  59. package/esm2022/translations/fr.json +36 -11
  60. package/esm2022/translations/it.json +71 -44
  61. package/esm2022/translations/nl.json +38 -11
  62. package/esm2022/translations/pt.json +38 -11
  63. package/fesm2022/geonetwork-ui.mjs +2354 -1454
  64. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  65. package/libs/api/metadata-converter/src/lib/common/distribution.mapper.d.ts.map +1 -1
  66. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  67. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts +0 -1
  68. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts.map +1 -1
  69. package/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.d.ts +1 -0
  70. package/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.d.ts.map +1 -1
  71. package/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.d.ts.map +1 -1
  72. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  73. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  74. package/libs/api/repository/src/lib/gn4/elasticsearch/constant.d.ts.map +1 -1
  75. package/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.d.ts +1 -1
  76. package/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.d.ts.map +1 -1
  77. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts +13 -2
  78. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts.map +1 -1
  79. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +2 -0
  80. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  81. package/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.d.ts +1 -0
  82. package/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.d.ts.map +1 -1
  83. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +21 -18
  84. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  85. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts +6 -0
  86. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts.map +1 -1
  87. package/libs/feature/dataviz/src/lib/service/data.service.d.ts +1 -0
  88. package/libs/feature/dataviz/src/lib/service/data.service.d.ts.map +1 -1
  89. package/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.d.ts +48 -3
  90. package/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.d.ts.map +1 -1
  91. package/libs/feature/record/src/index.d.ts +1 -2
  92. package/libs/feature/record/src/index.d.ts.map +1 -1
  93. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  94. package/libs/feature/record/src/lib/state/mdview.actions.d.ts +10 -0
  95. package/libs/feature/record/src/lib/state/mdview.actions.d.ts.map +1 -1
  96. package/libs/feature/record/src/lib/state/mdview.effects.d.ts +6 -0
  97. package/libs/feature/record/src/lib/state/mdview.effects.d.ts.map +1 -1
  98. package/libs/feature/record/src/lib/state/mdview.facade.d.ts +24 -21
  99. package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
  100. package/libs/feature/record/src/lib/state/mdview.reducer.d.ts +2 -0
  101. package/libs/feature/record/src/lib/state/mdview.reducer.d.ts.map +1 -1
  102. package/libs/feature/record/src/lib/state/mdview.selectors.d.ts +2 -0
  103. package/libs/feature/record/src/lib/state/mdview.selectors.d.ts.map +1 -1
  104. package/libs/feature/search/src/lib/constants.d.ts.map +1 -1
  105. package/libs/feature/search/src/lib/results-list/results-list.container.component.d.ts +1 -1
  106. package/libs/feature/search/src/lib/results-list/results-list.container.component.d.ts.map +1 -1
  107. package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts +6 -5
  108. package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts.map +1 -1
  109. package/libs/ui/elements/src/index.d.ts +1 -0
  110. package/libs/ui/elements/src/index.d.ts.map +1 -1
  111. package/libs/ui/elements/src/lib/geo-data-badge/geo-data-badge.component.d.ts +15 -0
  112. package/libs/ui/elements/src/lib/geo-data-badge/geo-data-badge.component.d.ts.map +1 -0
  113. package/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.d.ts +6 -13
  114. package/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.d.ts.map +1 -1
  115. package/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.d.ts +14 -0
  116. package/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.d.ts.map +1 -0
  117. package/libs/ui/elements/src/lib/kind-badge/kind-badge.component.d.ts +3 -1
  118. package/libs/ui/elements/src/lib/kind-badge/kind-badge.component.d.ts.map +1 -1
  119. package/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.d.ts +20 -9
  120. package/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.d.ts.map +1 -1
  121. package/libs/ui/elements/src/lib/related-record-card/related-record-card.component.d.ts +8 -1
  122. package/libs/ui/elements/src/lib/related-record-card/related-record-card.component.d.ts.map +1 -1
  123. package/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.d.ts +1 -0
  124. package/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.d.ts.map +1 -1
  125. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +3 -1
  126. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  127. package/libs/ui/layout/src/index.d.ts +1 -0
  128. package/libs/ui/layout/src/index.d.ts.map +1 -1
  129. package/libs/ui/layout/src/lib/cell-popin/cell-popin.component.d.ts +28 -0
  130. package/libs/ui/layout/src/lib/cell-popin/cell-popin.component.d.ts.map +1 -0
  131. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts +4 -2
  132. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts.map +1 -1
  133. package/libs/ui/layout/src/lib/truncated-text/truncated-text.component.d.ts +5 -10
  134. package/libs/ui/layout/src/lib/truncated-text/truncated-text.component.d.ts.map +1 -1
  135. package/libs/ui/search/src/index.d.ts +1 -0
  136. package/libs/ui/search/src/index.d.ts.map +1 -1
  137. package/libs/ui/search/src/lib/results-list/results-list.component.d.ts.map +1 -1
  138. package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts +4 -3
  139. package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts.map +1 -1
  140. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts +10 -4
  141. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts.map +1 -1
  142. package/libs/ui/search/src/lib/ui-search.module.d.ts +2 -1
  143. package/libs/ui/search/src/lib/ui-search.module.d.ts.map +1 -1
  144. package/libs/util/i18n/src/lib/i18n.constants.d.ts +1 -0
  145. package/libs/util/i18n/src/lib/i18n.constants.d.ts.map +1 -1
  146. package/libs/util/i18n/src/lib/language-codes.d.ts +23 -1
  147. package/libs/util/i18n/src/lib/language-codes.d.ts.map +1 -1
  148. package/libs/util/shared/src/lib/links/link-classifier.service.d.ts.map +1 -1
  149. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  150. package/package.json +1 -1
  151. package/src/libs/api/metadata-converter/src/lib/common/distribution.mapper.ts +1 -0
  152. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +1 -1
  153. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +62 -4
  154. package/src/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.ts +0 -1
  155. package/src/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.ts +13 -3
  156. package/src/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.ts +5 -1
  157. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +8 -4
  158. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +4 -1
  159. package/src/libs/api/repository/src/lib/gn4/elasticsearch/constant.ts +1 -0
  160. package/src/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.ts +2 -2
  161. package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +116 -17
  162. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +11 -0
  163. package/src/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.ts +3 -0
  164. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +22 -14
  165. package/src/libs/common/domain/src/lib/repository/records-repository.interface.ts +6 -0
  166. package/src/libs/common/fixtures/src/lib/elasticsearch/metadata-links.fixtures.ts +10 -0
  167. package/src/libs/common/fixtures/src/lib/link.fixtures.ts +14 -0
  168. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +64 -1
  169. package/src/libs/feature/dataviz/src/lib/service/data.service.ts +37 -0
  170. package/src/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.html +117 -11
  171. package/src/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.ts +316 -6
  172. package/src/libs/feature/record/src/index.ts +1 -2
  173. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +35 -4
  174. package/src/libs/feature/record/src/lib/state/mdview.actions.ts +10 -0
  175. package/src/libs/feature/record/src/lib/state/mdview.effects.ts +22 -0
  176. package/src/libs/feature/record/src/lib/state/mdview.facade.ts +15 -15
  177. package/src/libs/feature/record/src/lib/state/mdview.reducer.ts +12 -0
  178. package/src/libs/feature/record/src/lib/state/mdview.selectors.ts +9 -0
  179. package/src/libs/feature/search/src/lib/constants.ts +1 -0
  180. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.ts +2 -0
  181. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.html +1 -0
  182. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.ts +13 -3
  183. package/src/libs/ui/elements/src/index.ts +1 -0
  184. package/src/libs/ui/elements/src/lib/geo-data-badge/geo-data-badge.component.css +4 -0
  185. package/src/libs/ui/elements/src/lib/geo-data-badge/geo-data-badge.component.html +13 -0
  186. package/src/libs/ui/elements/src/lib/geo-data-badge/geo-data-badge.component.ts +54 -0
  187. package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.html +68 -141
  188. package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.ts +38 -97
  189. package/src/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.html +69 -0
  190. package/src/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.ts +61 -0
  191. package/src/libs/ui/elements/src/lib/kind-badge/kind-badge.component.html +7 -5
  192. package/src/libs/ui/elements/src/lib/kind-badge/kind-badge.component.ts +21 -2
  193. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.html +1 -1
  194. package/src/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.html +96 -37
  195. package/src/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.ts +60 -29
  196. package/src/libs/ui/elements/src/lib/related-record-card/related-record-card.component.html +8 -29
  197. package/src/libs/ui/elements/src/lib/related-record-card/related-record-card.component.ts +14 -1
  198. package/src/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.html +15 -1
  199. package/src/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.ts +9 -1
  200. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +5 -0
  201. package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.html +1 -1
  202. package/src/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.html +1 -2
  203. package/src/libs/ui/layout/src/index.ts +1 -0
  204. package/src/libs/ui/layout/src/lib/cell-popin/cell-popin.component.html +40 -0
  205. package/src/libs/ui/layout/src/lib/cell-popin/cell-popin.component.ts +141 -0
  206. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +3 -2
  207. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.ts +13 -6
  208. package/src/libs/ui/layout/src/lib/truncated-text/truncated-text.component.html +25 -42
  209. package/src/libs/ui/layout/src/lib/truncated-text/truncated-text.component.ts +10 -49
  210. package/src/libs/ui/layout/src/lib/ui-layout.module.ts +1 -1
  211. package/src/libs/ui/search/src/index.ts +1 -0
  212. package/src/libs/ui/search/src/lib/record-preview-row/record-preview-row.component.html +9 -81
  213. package/src/libs/ui/search/src/lib/results-hits-search-kind/results-hits-search-kind.component.html +1 -0
  214. package/src/libs/ui/search/src/lib/results-list/results-layout.config.ts +2 -2
  215. package/src/libs/ui/search/src/lib/results-list/results-list.component.html +1 -1
  216. package/src/libs/ui/search/src/lib/results-list/results-list.component.ts +0 -1
  217. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.html +16 -6
  218. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.ts +15 -11
  219. package/src/libs/ui/search/src/lib/results-table/results-table.component.css +4 -0
  220. package/src/libs/ui/search/src/lib/results-table/results-table.component.html +31 -27
  221. package/src/libs/ui/search/src/lib/results-table/results-table.component.ts +33 -15
  222. package/src/libs/ui/search/src/lib/ui-search.module.ts +3 -0
  223. package/src/libs/util/i18n/src/lib/i18n.constants.ts +42 -0
  224. package/src/libs/util/i18n/src/lib/language-codes.ts +23 -1
  225. package/src/libs/util/shared/src/lib/links/link-classifier.service.ts +3 -0
  226. package/src/libs/util/shared/src/lib/links/link-utils.ts +3 -0
  227. package/tailwind.base.css +1 -1
  228. package/translations/de.json +39 -12
  229. package/translations/en.json +36 -11
  230. package/translations/es.json +38 -11
  231. package/translations/fr.json +36 -11
  232. package/translations/it.json +71 -44
  233. package/translations/nl.json +38 -11
  234. package/translations/pt.json +38 -11
  235. package/translations/sk.json +38 -11
@@ -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({
@@ -129,9 +133,9 @@ export class Gn4Repository implements RecordsRepositoryInterface {
129
133
  return this.gn4SearchApi
130
134
  .search(
131
135
  'bucket',
132
- ['fcats'],
136
+ ['fcats', 'hassources'],
133
137
  JSON.stringify(
134
- this.gn4SearchHelper.getMetadataByIdPayload(uniqueIdentifier)
138
+ this.gn4SearchHelper.getMetadataByIdsPayload([uniqueIdentifier])
135
139
  )
136
140
  )
137
141
  .pipe(
@@ -142,6 +146,27 @@ export class Gn4Repository implements RecordsRepositoryInterface {
142
146
  )
143
147
  }
144
148
 
149
+ getMultipleRecords(
150
+ uniqueIdentifiers: string[]
151
+ ): Observable<CatalogRecord[] | null> {
152
+ return this.gn4SearchApi
153
+ .search(
154
+ 'bucket',
155
+ undefined,
156
+ JSON.stringify(
157
+ this.gn4SearchHelper.getMetadataByIdsPayload(uniqueIdentifiers)
158
+ )
159
+ )
160
+ .pipe(
161
+ map((results: Gn4SearchResults) => results.hits.hits),
162
+ switchMap((records) =>
163
+ records && records.length > 0
164
+ ? this.gn4Mapper.readRecords(records)
165
+ : of(null)
166
+ )
167
+ )
168
+ }
169
+
145
170
  private mapEmbeddedFeatureCatalog(
146
171
  featureTypes: Array<DatasetFeatureType>
147
172
  ): DatasetFeatureCatalog {
@@ -150,12 +175,21 @@ export class Gn4Repository implements RecordsRepositoryInterface {
150
175
  name: featureType.typeName || '',
151
176
  definition: featureType.definition || '',
152
177
  attributes: Array.isArray(featureType.attributeTable)
153
- ? featureType.attributeTable.map((attr) => ({
154
- name: attr.name,
155
- code: attr.code,
156
- title: attr.definition,
157
- type: attr.type,
158
- }))
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
+ })
159
193
  : [],
160
194
  })),
161
195
  }
@@ -203,6 +237,24 @@ export class Gn4Repository implements RecordsRepositoryInterface {
203
237
  )
204
238
  }
205
239
 
240
+ getSources(record: CatalogRecord): Observable<CatalogRecord[]> {
241
+ const sourcesIdentifiers = record.extras?.['sourcesIdentifiers'] as string[]
242
+ if (sourcesIdentifiers && sourcesIdentifiers.length > 0) {
243
+ return this.getMultipleRecords(sourcesIdentifiers)
244
+ }
245
+ return of(null)
246
+ }
247
+
248
+ getSourceOf(record: CatalogRecord): Observable<CatalogRecord[]> {
249
+ const sourceOfIdentifiers = record.extras?.[
250
+ 'sourceOfIdentifiers'
251
+ ] as string[]
252
+ if (sourceOfIdentifiers && sourceOfIdentifiers.length > 0) {
253
+ return this.getMultipleRecords(sourceOfIdentifiers)
254
+ }
255
+ return of(null)
256
+ }
257
+
206
258
  aggregate(params: AggregationsParams): Observable<Aggregations> {
207
259
  // if aggregations are empty, return an empty object right away
208
260
  if (Object.keys(params).length === 0) return of({})
@@ -255,14 +307,46 @@ export class Gn4Repository implements RecordsRepositoryInterface {
255
307
  : of(true)
256
308
  }
257
309
 
258
- canEditRecord(uniqueIdentifier: string): Observable<boolean> {
259
- return this.getRecord(uniqueIdentifier).pipe(
260
- map((record) => {
261
- 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
+ )
262
321
  })
263
322
  )
264
323
  }
265
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
+
266
350
  openRecordForEdition(
267
351
  uniqueIdentifier: string
268
352
  ): Observable<[CatalogRecord, string, boolean] | null> {
@@ -365,9 +449,12 @@ export class Gn4Repository implements RecordsRepositoryInterface {
365
449
  const record = await converter.readRecord(fetchedRecordAsXml)
366
450
 
367
451
  record.title = `${record.title} (Copy)`
368
- await converter.writeRecord(record, fetchedRecordAsXml)
452
+ const recordAsXml = await converter.writeRecord(
453
+ record,
454
+ fetchedRecordAsXml
455
+ )
369
456
 
370
- return this.saveRecord(record, '', false)
457
+ return this.saveRecord(record, recordAsXml, false)
371
458
  }),
372
459
  exhaustMap((uuidObservable: Observable<string>) => uuidObservable),
373
460
  catchError((error: HttpErrorResponse) => {
@@ -468,6 +555,18 @@ export class Gn4Repository implements RecordsRepositoryInterface {
468
555
  )
469
556
  }
470
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
+
471
570
  private getRecordAsXml(uniqueIdentifier: string): Observable<string | null> {
472
571
  return this.gn4RecordsApi
473
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) {
@@ -152,6 +152,8 @@ export type ServiceProtocol =
152
152
  | 'esriRest'
153
153
  | 'ogcFeatures'
154
154
  | 'GPFDL'
155
+ | 'tms'
156
+ | 'maplibre-style'
155
157
  | 'other'
156
158
 
157
159
  export type OnlineResourceType = 'service' | 'download' | 'link' | 'endpoint'
@@ -231,14 +233,6 @@ export interface DatasetRecord extends BaseRecord {
231
233
  spatialRepresentation?: SpatialRepresentationType
232
234
  }
233
235
 
234
- export type DatasetFeatureCatalog = {
235
- featureTypes: Array<{
236
- name: string
237
- definition: string
238
- attributes: Array<{ name: string; title: string; code: string }>
239
- }>
240
- }
241
-
242
236
  export interface ServiceEndpoint {
243
237
  url: URL
244
238
  accessServiceProtocol: ServiceProtocol
@@ -266,18 +260,32 @@ export interface ReuseRecord extends BaseRecord {
266
260
  temporalExtents: Array<DatasetTemporalExtent>
267
261
  }
268
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
+ }
269
282
  export interface DatasetFeatureType {
270
283
  aliases: string
271
284
  code: string
272
285
  isAbstract: string
273
286
  typeName: string
274
287
  definition: string
275
- attributeTable: Array<{
276
- name: string
277
- definition: string
278
- type: string
279
- code: string
280
- }>
288
+ attributeTable: Array<DatasetFeatureAttribute>
281
289
  }
282
290
 
283
291
  export type ReuseType = 'application' | 'map' | 'other'
@@ -19,8 +19,13 @@ export abstract class RecordsRepositoryInterface {
19
19
  abstract getSimilarRecords(
20
20
  similarTo: CatalogRecord
21
21
  ): Observable<CatalogRecord[]>
22
+ abstract getSources(record: CatalogRecord): Observable<CatalogRecord[]>
23
+ abstract getSourceOf(record: CatalogRecord): Observable<CatalogRecord[]>
22
24
  abstract fuzzySearch(query: string): Observable<SearchResults>
25
+ abstract canDuplicate(record: CatalogRecord): boolean
26
+ abstract canDelete(record: CatalogRecord): Observable<boolean>
23
27
  abstract canEditRecord(uniqueIdentifier: string): Observable<boolean>
28
+ abstract canEditIndexedRecord(record: CatalogRecord): Observable<boolean>
24
29
  /**
25
30
  * This emits once:
26
31
  * - record object; if a draft exists, this will return it
@@ -95,4 +100,5 @@ export abstract class RecordsRepositoryInterface {
95
100
  localRecord: CatalogRecord
96
101
  ): Observable<{ user: string; date: Date }>
97
102
  abstract getRecordPublicationStatus(uuid: string): Observable<boolean>
103
+ abstract getApplicationLanguages(): Observable<string[]>
98
104
  }
@@ -144,4 +144,14 @@ export const elasticLinkFixture = (): Record<string, unknown> => ({
144
144
  name: 'ogcapi features layer',
145
145
  url: 'https://mel.integration.apps.gs-fr-prod.camptocamp.com/data/ogcapi/collections/comptages_velo/items?',
146
146
  },
147
+ maplayerTms: {
148
+ accessServiceProtocol: 'TMS',
149
+ name: 'mytmslayer',
150
+ url: 'https://my.tms.server/MapServer',
151
+ },
152
+ maplayerTms2: {
153
+ accessServiceProtocol: 'OSGeo:TMS',
154
+ name: 'myothertmslayer',
155
+ url: 'https://my.tms.server/MapServer',
156
+ },
147
157
  })
@@ -185,6 +185,20 @@ export const aSetOfLinksFixture = () => ({
185
185
  url: new URL('https://my.ogc.server/wms'),
186
186
  accessServiceProtocol: 'wms',
187
187
  }) as DatasetServiceDistribution,
188
+ geodataTms: () =>
189
+ ({
190
+ name: 'mytmslayer',
191
+ type: 'service',
192
+ url: new URL('https://my.ogc.server/tms'),
193
+ accessServiceProtocol: 'tms',
194
+ }) as DatasetServiceDistribution,
195
+ geodataAsMaplibreStyle: () =>
196
+ ({
197
+ name: 'mytmslayerAsMaplibreJson',
198
+ type: 'service',
199
+ url: new URL('https://my.ogc.server/tms/layer/style.json'),
200
+ accessServiceProtocol: 'maplibre-style',
201
+ }) as DatasetServiceDistribution,
188
202
  geodataWfs2: () =>
189
203
  ({
190
204
  name: 'myotherlayer',
@@ -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',
@@ -231,7 +246,7 @@ As such, **it is not very interesting at all.**`,
231
246
  recordUpdated: new Date('2022-04-15T14:18:19'),
232
247
  resourceUpdated: new Date('2022-03-29'),
233
248
  title:
234
- "Plan local d'urbanisme (PLU) dématérialisé - commune d'Avrigny - approbation du 29/03/2022",
249
+ "Plan local d'urbanisme (PLU) dématérialisé - commune d'Avrigny - approbation du 29/03/2022 (Ce lot informe du droit à bâtir sur la commune d'Avrigny)",
235
250
  abstract: `Plan local d'urbanisme (PLU) dématérialisé - commune d'Avrigny - approbation du 29/03/2022.
236
251
 
237
252
  Ce lot informe du droit à bâtir sur la commune d'Avrigny.
@@ -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',
@@ -6,6 +6,7 @@ import {
6
6
  OgcApiRecord,
7
7
  WfsEndpoint,
8
8
  WfsVersion,
9
+ TmsEndpoint,
9
10
  } from '@camptocamp/ogc-client'
10
11
  import {
11
12
  BaseReader,
@@ -231,6 +232,42 @@ export class DataService {
231
232
  })
232
233
  }
233
234
 
235
+ async getGeodataLinksFromTms(
236
+ tmsLink: DatasetServiceDistribution,
237
+ keepOriginalLink = false
238
+ ): Promise<DatasetServiceDistribution[]> {
239
+ const endpoint = new TmsEndpoint(tmsLink.url.toString())
240
+ const tileMaps = await endpoint.allTileMaps
241
+ if (!tileMaps?.length) return null
242
+
243
+ // TODO: at some point use the identifierInService field if more that one layers in the TMS service
244
+ const tileMapInfo = await endpoint.getTileMapInfo(tileMaps[0].href)
245
+
246
+ // case 1: no styles; return a plain TMS link
247
+ if (!tileMapInfo?.metadata?.length) return [tmsLink]
248
+
249
+ // case 2: styles present; return each as a separate link
250
+ const styleLinks = tileMapInfo.metadata
251
+ .filter((meta) => meta.href)
252
+ .map((meta) => {
253
+ const fileName = meta.href.split('/').pop() || ''
254
+ const linkName =
255
+ tmsLink.description || ('name' in tmsLink ? tmsLink.name : '')
256
+ const styleName = fileName.split('.')[0]
257
+ const name = `${linkName} - ${styleName}`
258
+ return {
259
+ type: 'service',
260
+ url: new URL(meta.href),
261
+ name,
262
+ accessServiceProtocol: 'maplibre-style',
263
+ } as DatasetServiceDistribution
264
+ })
265
+ if (keepOriginalLink) {
266
+ styleLinks.unshift(tmsLink)
267
+ }
268
+ return styleLinks
269
+ }
270
+
234
271
  getDownloadLinksFromEsriRest(
235
272
  esriRestLink: DatasetServiceDistribution
236
273
  ): DatasetOnlineResource[] {
@@ -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>