geonetwork-ui 2.6.0-dev.a6b2f3e85 → 2.6.0-dev.a8e63e487

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 (222) 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 +37 -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 +41 -9
  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/dataviz/src/lib/service/data.service.mjs +32 -2
  14. package/esm2022/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.mjs +266 -11
  15. package/esm2022/libs/feature/record/src/index.mjs +2 -3
  16. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +31 -5
  17. package/esm2022/libs/feature/record/src/lib/state/mdview.actions.mjs +3 -1
  18. package/esm2022/libs/feature/record/src/lib/state/mdview.effects.mjs +7 -1
  19. package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +13 -13
  20. package/esm2022/libs/feature/record/src/lib/state/mdview.reducer.mjs +7 -1
  21. package/esm2022/libs/feature/record/src/lib/state/mdview.selectors.mjs +3 -1
  22. package/esm2022/libs/feature/search/src/lib/constants.mjs +2 -1
  23. package/esm2022/libs/feature/search/src/lib/results-list/results-list.container.component.mjs +6 -2
  24. package/esm2022/libs/ui/elements/src/index.mjs +3 -1
  25. package/esm2022/libs/ui/elements/src/lib/geo-data-badge/geo-data-badge.component.mjs +55 -0
  26. package/esm2022/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.mjs +27 -53
  27. package/esm2022/libs/ui/elements/src/lib/kind-badge/kind-badge.component.mjs +22 -5
  28. package/esm2022/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.mjs +3 -3
  29. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +3 -3
  30. package/esm2022/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.mjs +3 -3
  31. package/esm2022/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.mjs +51 -0
  32. package/esm2022/libs/ui/elements/src/lib/related-record-card/related-record-card.component.mjs +17 -7
  33. package/esm2022/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.mjs +12 -4
  34. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +10 -4
  35. package/esm2022/libs/ui/inputs/src/index.mjs +2 -1
  36. package/esm2022/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.mjs +3 -3
  37. package/esm2022/libs/ui/inputs/src/lib/search-feature-catalog/search-feature-catalog.component.mjs +68 -0
  38. package/esm2022/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.mjs +3 -3
  39. package/esm2022/libs/ui/layout/src/lib/expandable-panel/expandable-panel.component.mjs +34 -13
  40. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table.component.mjs +3 -3
  41. package/esm2022/libs/ui/layout/src/lib/truncated-text/truncated-text.component.mjs +65 -14
  42. package/esm2022/libs/ui/search/src/index.mjs +2 -1
  43. package/esm2022/libs/ui/search/src/lib/record-preview-row/record-preview-row.component.mjs +4 -8
  44. package/esm2022/libs/ui/search/src/lib/results-hits-search-kind/results-hits-search-kind.component.mjs +3 -3
  45. package/esm2022/libs/ui/search/src/lib/results-list/results-layout.config.mjs +2 -2
  46. package/esm2022/libs/ui/search/src/lib/results-list/results-list.component.mjs +3 -3
  47. package/esm2022/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.mjs +19 -12
  48. package/esm2022/libs/ui/search/src/lib/results-table/results-table.component.mjs +27 -14
  49. package/esm2022/libs/ui/search/src/lib/ui-search.module.mjs +10 -4
  50. package/esm2022/libs/util/i18n/src/lib/i18n.constants.mjs +42 -1
  51. package/esm2022/libs/util/i18n/src/lib/language-codes.mjs +24 -2
  52. package/esm2022/libs/util/shared/src/lib/links/link-classifier.service.mjs +4 -1
  53. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +4 -1
  54. package/esm2022/translations/de.json +34 -5
  55. package/esm2022/translations/en.json +34 -7
  56. package/esm2022/translations/es.json +33 -4
  57. package/esm2022/translations/fr.json +34 -7
  58. package/esm2022/translations/it.json +64 -35
  59. package/esm2022/translations/nl.json +33 -4
  60. package/esm2022/translations/pt.json +33 -4
  61. package/fesm2022/geonetwork-ui.mjs +1580 -665
  62. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  63. package/libs/api/metadata-converter/src/lib/common/distribution.mapper.d.ts.map +1 -1
  64. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  65. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts +0 -1
  66. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts.map +1 -1
  67. package/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.d.ts +1 -0
  68. package/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.d.ts.map +1 -1
  69. package/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.d.ts.map +1 -1
  70. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  71. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  72. package/libs/api/repository/src/lib/gn4/elasticsearch/constant.d.ts.map +1 -1
  73. package/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.d.ts +1 -1
  74. package/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.d.ts.map +1 -1
  75. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts +7 -2
  76. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts.map +1 -1
  77. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +2 -1
  78. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  79. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts +3 -0
  80. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts.map +1 -1
  81. package/libs/feature/dataviz/src/lib/service/data.service.d.ts +1 -0
  82. package/libs/feature/dataviz/src/lib/service/data.service.d.ts.map +1 -1
  83. package/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.d.ts +48 -3
  84. package/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.d.ts.map +1 -1
  85. package/libs/feature/record/src/index.d.ts +1 -2
  86. package/libs/feature/record/src/index.d.ts.map +1 -1
  87. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  88. package/libs/feature/record/src/lib/state/mdview.actions.d.ts +10 -0
  89. package/libs/feature/record/src/lib/state/mdview.actions.d.ts.map +1 -1
  90. package/libs/feature/record/src/lib/state/mdview.effects.d.ts +6 -0
  91. package/libs/feature/record/src/lib/state/mdview.effects.d.ts.map +1 -1
  92. package/libs/feature/record/src/lib/state/mdview.facade.d.ts +28 -21
  93. package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
  94. package/libs/feature/record/src/lib/state/mdview.reducer.d.ts +2 -0
  95. package/libs/feature/record/src/lib/state/mdview.reducer.d.ts.map +1 -1
  96. package/libs/feature/record/src/lib/state/mdview.selectors.d.ts +2 -0
  97. package/libs/feature/record/src/lib/state/mdview.selectors.d.ts.map +1 -1
  98. package/libs/feature/search/src/lib/constants.d.ts.map +1 -1
  99. package/libs/feature/search/src/lib/results-list/results-list.container.component.d.ts +1 -1
  100. package/libs/feature/search/src/lib/results-list/results-list.container.component.d.ts.map +1 -1
  101. package/libs/ui/elements/src/index.d.ts +2 -0
  102. package/libs/ui/elements/src/index.d.ts.map +1 -1
  103. package/libs/ui/elements/src/lib/geo-data-badge/geo-data-badge.component.d.ts +15 -0
  104. package/libs/ui/elements/src/lib/geo-data-badge/geo-data-badge.component.d.ts.map +1 -0
  105. package/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.d.ts +3 -7
  106. package/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.d.ts.map +1 -1
  107. package/libs/ui/elements/src/lib/kind-badge/kind-badge.component.d.ts +3 -1
  108. package/libs/ui/elements/src/lib/kind-badge/kind-badge.component.d.ts.map +1 -1
  109. package/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.d.ts +16 -0
  110. package/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.d.ts.map +1 -0
  111. package/libs/ui/elements/src/lib/related-record-card/related-record-card.component.d.ts +8 -1
  112. package/libs/ui/elements/src/lib/related-record-card/related-record-card.component.d.ts.map +1 -1
  113. package/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.d.ts +1 -0
  114. package/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.d.ts.map +1 -1
  115. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +2 -1
  116. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  117. package/libs/ui/inputs/src/index.d.ts +1 -0
  118. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  119. package/libs/ui/inputs/src/lib/search-feature-catalog/search-feature-catalog.component.d.ts +17 -0
  120. package/libs/ui/inputs/src/lib/search-feature-catalog/search-feature-catalog.component.d.ts.map +1 -0
  121. package/libs/ui/layout/src/lib/expandable-panel/expandable-panel.component.d.ts +15 -8
  122. package/libs/ui/layout/src/lib/expandable-panel/expandable-panel.component.d.ts.map +1 -1
  123. package/libs/ui/layout/src/lib/truncated-text/truncated-text.component.d.ts +15 -6
  124. package/libs/ui/layout/src/lib/truncated-text/truncated-text.component.d.ts.map +1 -1
  125. package/libs/ui/search/src/index.d.ts +1 -0
  126. package/libs/ui/search/src/index.d.ts.map +1 -1
  127. package/libs/ui/search/src/lib/results-list/results-list.component.d.ts.map +1 -1
  128. package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts +3 -3
  129. package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts.map +1 -1
  130. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts +5 -1
  131. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts.map +1 -1
  132. package/libs/ui/search/src/lib/ui-search.module.d.ts +2 -1
  133. package/libs/ui/search/src/lib/ui-search.module.d.ts.map +1 -1
  134. package/libs/util/i18n/src/lib/i18n.constants.d.ts +1 -0
  135. package/libs/util/i18n/src/lib/i18n.constants.d.ts.map +1 -1
  136. package/libs/util/i18n/src/lib/language-codes.d.ts +23 -1
  137. package/libs/util/i18n/src/lib/language-codes.d.ts.map +1 -1
  138. package/libs/util/shared/src/lib/links/link-classifier.service.d.ts.map +1 -1
  139. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  140. package/package.json +1 -1
  141. package/src/libs/api/metadata-converter/src/lib/common/distribution.mapper.ts +1 -0
  142. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +1 -1
  143. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +55 -4
  144. package/src/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.ts +0 -1
  145. package/src/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.ts +13 -3
  146. package/src/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.ts +5 -1
  147. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +8 -4
  148. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +4 -1
  149. package/src/libs/api/repository/src/lib/gn4/elasticsearch/constant.ts +1 -0
  150. package/src/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.ts +2 -2
  151. package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +65 -7
  152. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +8 -1
  153. package/src/libs/common/domain/src/lib/repository/records-repository.interface.ts +3 -0
  154. package/src/libs/common/fixtures/src/lib/elasticsearch/metadata-links.fixtures.ts +10 -0
  155. package/src/libs/common/fixtures/src/lib/link.fixtures.ts +14 -0
  156. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +1 -1
  157. package/src/libs/feature/dataviz/src/lib/service/data.service.ts +37 -0
  158. package/src/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.html +117 -11
  159. package/src/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.ts +316 -6
  160. package/src/libs/feature/record/src/index.ts +1 -2
  161. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +35 -4
  162. package/src/libs/feature/record/src/lib/state/mdview.actions.ts +10 -0
  163. package/src/libs/feature/record/src/lib/state/mdview.effects.ts +22 -0
  164. package/src/libs/feature/record/src/lib/state/mdview.facade.ts +22 -15
  165. package/src/libs/feature/record/src/lib/state/mdview.reducer.ts +12 -0
  166. package/src/libs/feature/record/src/lib/state/mdview.selectors.ts +9 -0
  167. package/src/libs/feature/search/src/lib/constants.ts +1 -0
  168. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.ts +2 -0
  169. package/src/libs/ui/elements/src/index.ts +2 -0
  170. package/src/libs/ui/elements/src/lib/geo-data-badge/geo-data-badge.component.css +4 -0
  171. package/src/libs/ui/elements/src/lib/geo-data-badge/geo-data-badge.component.html +13 -0
  172. package/src/libs/ui/elements/src/lib/geo-data-badge/geo-data-badge.component.ts +54 -0
  173. package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.html +133 -138
  174. package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.ts +19 -47
  175. package/src/libs/ui/elements/src/lib/kind-badge/kind-badge.component.html +7 -5
  176. package/src/libs/ui/elements/src/lib/kind-badge/kind-badge.component.ts +21 -2
  177. package/src/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.html +6 -3
  178. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +4 -0
  179. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.html +1 -1
  180. package/src/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.html +48 -0
  181. package/src/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.ts +52 -0
  182. package/src/libs/ui/elements/src/lib/related-record-card/related-record-card.component.html +8 -29
  183. package/src/libs/ui/elements/src/lib/related-record-card/related-record-card.component.ts +14 -1
  184. package/src/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.html +15 -1
  185. package/src/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.ts +9 -1
  186. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +3 -1
  187. package/src/libs/ui/inputs/src/index.ts +1 -0
  188. package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.html +1 -1
  189. package/src/libs/ui/inputs/src/lib/search-feature-catalog/search-feature-catalog.component.css +0 -0
  190. package/src/libs/ui/inputs/src/lib/search-feature-catalog/search-feature-catalog.component.html +43 -0
  191. package/src/libs/ui/inputs/src/lib/search-feature-catalog/search-feature-catalog.component.ts +77 -0
  192. package/src/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.html +1 -2
  193. package/src/libs/ui/layout/src/lib/expandable-panel/expandable-panel.component.html +24 -8
  194. package/src/libs/ui/layout/src/lib/expandable-panel/expandable-panel.component.ts +36 -10
  195. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +1 -0
  196. package/src/libs/ui/layout/src/lib/truncated-text/truncated-text.component.html +8 -10
  197. package/src/libs/ui/layout/src/lib/truncated-text/truncated-text.component.ts +75 -7
  198. package/src/libs/ui/search/src/index.ts +1 -0
  199. package/src/libs/ui/search/src/lib/record-preview-row/record-preview-row.component.html +9 -81
  200. package/src/libs/ui/search/src/lib/results-hits-search-kind/results-hits-search-kind.component.html +1 -0
  201. package/src/libs/ui/search/src/lib/results-list/results-layout.config.ts +2 -2
  202. package/src/libs/ui/search/src/lib/results-list/results-list.component.html +1 -0
  203. package/src/libs/ui/search/src/lib/results-list/results-list.component.ts +0 -1
  204. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.html +11 -3
  205. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.ts +14 -11
  206. package/src/libs/ui/search/src/lib/results-table/results-table.component.css +4 -0
  207. package/src/libs/ui/search/src/lib/results-table/results-table.component.html +27 -17
  208. package/src/libs/ui/search/src/lib/results-table/results-table.component.ts +20 -10
  209. package/src/libs/ui/search/src/lib/ui-search.module.ts +3 -0
  210. package/src/libs/util/i18n/src/lib/i18n.constants.ts +42 -0
  211. package/src/libs/util/i18n/src/lib/language-codes.ts +23 -1
  212. package/src/libs/util/shared/src/lib/links/link-classifier.service.ts +3 -0
  213. package/src/libs/util/shared/src/lib/links/link-utils.ts +3 -0
  214. package/tailwind.base.css +1 -1
  215. package/translations/de.json +34 -5
  216. package/translations/en.json +34 -7
  217. package/translations/es.json +33 -4
  218. package/translations/fr.json +34 -7
  219. package/translations/it.json +64 -35
  220. package/translations/nl.json +33 -4
  221. package/translations/pt.json +33 -4
  222. package/translations/sk.json +33 -4
@@ -4,6 +4,7 @@ export function matchProtocol(protocol: string): ServiceProtocol {
4
4
  if (/wms/i.test(protocol)) return 'wms'
5
5
  if (/wfs/i.test(protocol)) return 'wfs'
6
6
  if (/wmts/i.test(protocol)) return 'wmts'
7
+ if (/tms/i.test(protocol)) return 'tms'
7
8
  if (/wps/i.test(protocol)) return 'wps'
8
9
  if (/ogc\W*api\W*features/i.test(protocol)) return 'ogcFeatures'
9
10
  if (/esri/i.test(protocol)) return 'esriRest'
@@ -617,7 +617,7 @@ Die Quelle ist zu bezeichnen: „Quelle: Stadt Zürich“.`,
617
617
  status: 'completed',
618
618
  updateFrequency: 'asNeeded',
619
619
  defaultLanguage: 'de',
620
- otherLanguages: ['fr', 'it', 'en', 'rm'],
620
+ otherLanguages: ['fr', 'it', 'en', 'rm', 'aar'],
621
621
  translations: {
622
622
  abstract: {
623
623
  en: 'The perimeters of the Alpine Convention in Switzerland. The Alpine Convention is an international treaty between the eight Alpine countries: Germany, France, Italy, Liechtenstein, Monaco, Austria, Switzerland and Slovenia, plus the European Union. The aim of the treaty is to protect the Alps by means of cross-sectoral, integrated and sustainable policies.',
@@ -152,12 +152,22 @@ export class Gn4FieldMapper {
152
152
  )
153
153
  const languages = langList.map((lang) => LANG_3_TO_2_MAPPER[lang])
154
154
  const defaultLanguage = output.defaultLanguage ?? languages[0] ?? null // set the first language as main one as fallback
155
+
156
+ return {
157
+ ...output,
158
+ defaultLanguage,
159
+ }
160
+ },
161
+ otherLanguage: (output, source) => {
162
+ const langList = getAsArray(selectField<string>(source, 'otherLanguage'))
163
+ const languages = langList.map((lang) => LANG_3_TO_2_MAPPER[lang])
164
+ const defaultLanguage = output.defaultLanguage ?? languages[0] ?? null
155
165
  const otherLanguages = languages.filter(
156
166
  (lang) => lang !== defaultLanguage
157
167
  )
168
+
158
169
  return {
159
170
  ...output,
160
- defaultLanguage,
161
171
  otherLanguages,
162
172
  }
163
173
  },
@@ -294,12 +304,52 @@ export class Gn4FieldMapper {
294
304
  ) ?? {},
295
305
  '_source'
296
306
  )
297
- const featureCatalogIdentifier = selectField(
307
+ const featureCatalogIdentifier: string = selectField(
298
308
  <SourceWithUnknownProps>fcatSource,
299
309
  'uuid'
300
310
  )
301
- return featureCatalogIdentifier
302
- ? this.addExtra({ featureCatalogIdentifier }, output)
311
+ const sourceOfLinks = getAsArray(
312
+ selectField(
313
+ <SourceWithUnknownProps>selectField(source, 'related'),
314
+ 'hassources'
315
+ )
316
+ )
317
+ const sourceOfIdentifiers: string[] = sourceOfLinks
318
+ .filter((link) => link['origin'] === 'catalog')
319
+ .map((link) => {
320
+ return selectField(
321
+ selectField(<SourceWithUnknownProps>link, '_source'),
322
+ 'uuid'
323
+ )
324
+ })
325
+ const extraValues: Record<string, string | string[]> = {}
326
+ if (featureCatalogIdentifier) {
327
+ extraValues.featureCatalogIdentifier = featureCatalogIdentifier
328
+ }
329
+ if (sourceOfIdentifiers && sourceOfIdentifiers.length > 0) {
330
+ extraValues.sourceOfIdentifiers = sourceOfIdentifiers
331
+ }
332
+ return Object.keys(extraValues).length > 0
333
+ ? this.addExtra(extraValues, output)
334
+ : output
335
+ },
336
+ recordLink: (output, source) => {
337
+ const recordLinks = getAsArray(
338
+ selectField<SourceWithUnknownProps[]>(source, 'recordLink')
339
+ )
340
+ const sourcesIdentifiers: string[] = recordLinks
341
+ .filter(
342
+ (link) => link['origin'] === 'catalog' && link['type'] === 'sources'
343
+ )
344
+ .map((link) => selectField(<SourceWithUnknownProps>link, 'to'))
345
+
346
+ return sourcesIdentifiers && sourcesIdentifiers.length > 0
347
+ ? this.addExtra(
348
+ {
349
+ sourcesIdentifiers,
350
+ },
351
+ output
352
+ )
303
353
  : output
304
354
  },
305
355
  isPublishedToAll: (output, source) =>
@@ -430,6 +480,7 @@ export class Gn4FieldMapper {
430
480
  /^OGC:WMS/.test(protocol) ||
431
481
  /^OGC:WFS/.test(protocol) ||
432
482
  /^OGC:WMTS/.test(protocol) ||
483
+ /TMS/i.test(protocol) ||
433
484
  /ogc\W*api\W*features/i.test(protocol) ||
434
485
  (/^WWW:DOWNLOAD-/.test(protocol) && /data.geopf.fr/.test(url)) // TO DO : change with the good protocol when decided
435
486
  ) {
@@ -164,7 +164,6 @@ export type MetadataObject = Partial<{
164
164
  resourceDate: ResourceDate[]
165
165
  resourceEdition: string
166
166
  resourceIdentifier: ResourceIdentifier[]
167
- resourceLanguage: string[]
168
167
  resourceTemporalDateRange: ResourceTemporalDateRange[]
169
168
  resourceTemporalExtentDateRange: ResourceTemporalDateRange[]
170
169
  resourceTitleObject: MultilingualField
@@ -363,11 +363,18 @@ export function readOnlineResources(rootEl: XmlElement): OnlineResource[] {
363
363
  )(rootEl)
364
364
  }
365
365
 
366
- function readLocaleElement(): ChainableFunction<XmlElement, LanguageCode> {
366
+ export function readLocaleElement(): ChainableFunction<
367
+ XmlElement,
368
+ LanguageCode
369
+ > {
367
370
  return pipe(
368
371
  findChildElement('lan:LanguageCode'),
369
372
  readAttribute('codeListValue'),
370
- map((lang) => (lang ? LANG_3_TO_2_MAPPER[lang.toLowerCase()] : null))
373
+ map((lang) => {
374
+ const normalized = lang?.toLowerCase()
375
+ const iso2Lang = LANG_3_TO_2_MAPPER[normalized]
376
+ return iso2Lang ?? lang
377
+ })
371
378
  )
372
379
  }
373
380
 
@@ -381,6 +388,9 @@ export function readDefaultLanguage(rootEl: XmlElement): LanguageCode {
381
388
  export function readOtherLanguages(rootEl: XmlElement): LanguageCode[] {
382
389
  return pipe(
383
390
  findChildrenElement('mdb:otherLocale', false),
384
- mapArray(readLocaleElement())
391
+ mapArray(readLocaleElement()),
392
+ map((languages) =>
393
+ languages.filter((lang): lang is LanguageCode => lang !== null)
394
+ )
385
395
  )(rootEl)
386
396
  }
@@ -529,7 +529,11 @@ export function writeOnlineResources(
529
529
  }
530
530
 
531
531
  function writeLocaleElement(language: LanguageCode) {
532
- const lang3 = LANG_2_TO_3_MAPPER[language.toLowerCase()]
532
+ const normalizedLang = language.toLowerCase()
533
+ const lang3 =
534
+ normalizedLang.length === 2
535
+ ? LANG_2_TO_3_MAPPER[normalizedLang]
536
+ : normalizedLang
533
537
  return pipe(
534
538
  findChildOrCreate('lan:PT_Locale'),
535
539
  writeAttribute('id', language.toUpperCase()),
@@ -65,7 +65,8 @@ export function extractCharacterString(): ChainableFunction<
65
65
  return pipe(
66
66
  fallback(
67
67
  findChildElement('gco:CharacterString', false),
68
- findChildElement('gmx:Anchor', false)
68
+ findChildElement('gmx:Anchor', false),
69
+ findChildElement('gmx:MimeFileType', false)
69
70
  ),
70
71
  readText()
71
72
  )
@@ -1161,11 +1162,14 @@ export function readOtherLanguages(rootEl: XmlElement): LanguageCode[] {
1161
1162
  findChildrenElement('gmd:locale', false),
1162
1163
  mapArray(
1163
1164
  pipe(
1164
- findChildElement('gmd:LanguageCode'),
1165
+ findChildElement('lan:LanguageCode'),
1165
1166
  readAttribute('codeListValue'),
1166
- map((lang) => LANG_3_TO_2_MAPPER[lang.toLowerCase()])
1167
+ map((lang) => LANG_3_TO_2_MAPPER[lang.toLowerCase()] ?? lang)
1167
1168
  )
1168
1169
  ),
1170
+ map((languages) =>
1171
+ languages.filter((lang): lang is LanguageCode => lang !== null)
1172
+ ),
1169
1173
  map((languages) => (languages.length ? languages : [defaultLanguage]))
1170
1174
  )(rootEl)
1171
1175
  }
@@ -1173,7 +1177,7 @@ export function readOtherLanguages(rootEl: XmlElement): LanguageCode[] {
1173
1177
  export function readDefaultLanguage(rootEl: XmlElement): LanguageCode {
1174
1178
  return pipe(
1175
1179
  findChildElement('gmd:language', false),
1176
- findChildElement('gmd:LanguageCode'),
1180
+ findChildElement('lan:LanguageCode'),
1177
1181
  readAttribute('codeListValue'),
1178
1182
  map((lang) => (lang ? LANG_3_TO_2_MAPPER[lang.toLowerCase()] : null))
1179
1183
  )(rootEl)
@@ -1471,7 +1471,10 @@ export function writeLanguages(record: DatasetRecord, rootEl: XmlElement) {
1471
1471
  writeAttribute('id', lang.toUpperCase()),
1472
1472
  createNestedChild('gmd:languageCode', 'gmd:LanguageCode'),
1473
1473
  writeAttribute('codeList', 'http://www.loc.gov/standards/iso639-2/'),
1474
- writeAttribute('codeListValue', LANG_2_TO_3_MAPPER[lang])
1474
+ writeAttribute(
1475
+ 'codeListValue',
1476
+ lang.length === 2 ? LANG_2_TO_3_MAPPER[lang] : lang
1477
+ )
1475
1478
  )
1476
1479
 
1477
1480
  // add new languages (only if other than default one)
@@ -8,6 +8,7 @@ export const ES_SOURCE_SUMMARY = [
8
8
  'overview',
9
9
  'logo',
10
10
  'codelist_status_text',
11
+ 'link',
11
12
  'linkProtocol',
12
13
  'contactForResource.organisation',
13
14
  'contact.organisation',
@@ -124,11 +124,11 @@ export class ElasticsearchService {
124
124
  this.runtimeFields[fieldName] = expression
125
125
  }
126
126
 
127
- getMetadataByIdPayload(uuid: string): EsSearchParams {
127
+ getMetadataByIdsPayload(uuids: string[]): EsSearchParams {
128
128
  return {
129
129
  query: {
130
130
  ids: {
131
- values: [uuid],
131
+ values: uuids,
132
132
  },
133
133
  },
134
134
  }
@@ -31,7 +31,7 @@ import { RecordsRepositoryInterface } from '../../../../../../libs/common/domain
31
31
  import {
32
32
  RecordsApiService,
33
33
  SearchApiService,
34
- FeatureResponseApiModel,
34
+ LanguagesApiService,
35
35
  } from '../../../../../../libs/data-access/gn4/src'
36
36
  import {
37
37
  combineLatest,
@@ -47,6 +47,7 @@ import {
47
47
  import { catchError, map, tap } from 'rxjs/operators'
48
48
  import { lt } from 'semver'
49
49
  import { ElasticsearchService } from './elasticsearch'
50
+ import { LANG_3_TO_2_MAPPER } from '../../../../../../libs/util/i18n/src'
50
51
 
51
52
  const minPublicationApiVersion = '4.2.5'
52
53
 
@@ -65,7 +66,8 @@ export class Gn4Repository implements RecordsRepositoryInterface {
65
66
  private gn4SearchHelper: ElasticsearchService,
66
67
  private gn4Mapper: Gn4Converter,
67
68
  private gn4RecordsApi: RecordsApiService,
68
- private platformService: PlatformServiceInterface
69
+ private platformService: PlatformServiceInterface,
70
+ private gn4LanguagesApi: LanguagesApiService
69
71
  ) {}
70
72
 
71
73
  search({
@@ -129,9 +131,9 @@ export class Gn4Repository implements RecordsRepositoryInterface {
129
131
  return this.gn4SearchApi
130
132
  .search(
131
133
  'bucket',
132
- ['fcats'],
134
+ ['fcats', 'hassources'],
133
135
  JSON.stringify(
134
- this.gn4SearchHelper.getMetadataByIdPayload(uniqueIdentifier)
136
+ this.gn4SearchHelper.getMetadataByIdsPayload([uniqueIdentifier])
135
137
  )
136
138
  )
137
139
  .pipe(
@@ -142,6 +144,27 @@ export class Gn4Repository implements RecordsRepositoryInterface {
142
144
  )
143
145
  }
144
146
 
147
+ getMultipleRecords(
148
+ uniqueIdentifiers: string[]
149
+ ): Observable<CatalogRecord[] | null> {
150
+ return this.gn4SearchApi
151
+ .search(
152
+ 'bucket',
153
+ undefined,
154
+ JSON.stringify(
155
+ this.gn4SearchHelper.getMetadataByIdsPayload(uniqueIdentifiers)
156
+ )
157
+ )
158
+ .pipe(
159
+ map((results: Gn4SearchResults) => results.hits.hits),
160
+ switchMap((records) =>
161
+ records && records.length > 0
162
+ ? this.gn4Mapper.readRecords(records)
163
+ : of(null)
164
+ )
165
+ )
166
+ }
167
+
145
168
  private mapEmbeddedFeatureCatalog(
146
169
  featureTypes: Array<DatasetFeatureType>
147
170
  ): DatasetFeatureCatalog {
@@ -154,6 +177,7 @@ export class Gn4Repository implements RecordsRepositoryInterface {
154
177
  name: attr.name,
155
178
  code: attr.code,
156
179
  title: attr.definition,
180
+ type: attr.type,
157
181
  }))
158
182
  : [],
159
183
  })),
@@ -165,7 +189,8 @@ export class Gn4Repository implements RecordsRepositoryInterface {
165
189
  ): Observable<DatasetFeatureCatalog | null> {
166
190
  if (
167
191
  record.extras?.['featureTypes'] &&
168
- Array.isArray(record.extras['featureTypes'])
192
+ Array.isArray(record.extras['featureTypes']) &&
193
+ record.extras['featureTypes'].length > 0
169
194
  ) {
170
195
  return of(this.mapEmbeddedFeatureCatalog(record.extras['featureTypes']))
171
196
  }
@@ -201,6 +226,24 @@ export class Gn4Repository implements RecordsRepositoryInterface {
201
226
  )
202
227
  }
203
228
 
229
+ getSources(record: CatalogRecord): Observable<CatalogRecord[]> {
230
+ const sourcesIdentifiers = record.extras?.['sourcesIdentifiers'] as string[]
231
+ if (sourcesIdentifiers && sourcesIdentifiers.length > 0) {
232
+ return this.getMultipleRecords(sourcesIdentifiers)
233
+ }
234
+ return of(null)
235
+ }
236
+
237
+ getSourceOf(record: CatalogRecord): Observable<CatalogRecord[]> {
238
+ const sourceOfIdentifiers = record.extras?.[
239
+ 'sourceOfIdentifiers'
240
+ ] as string[]
241
+ if (sourceOfIdentifiers && sourceOfIdentifiers.length > 0) {
242
+ return this.getMultipleRecords(sourceOfIdentifiers)
243
+ }
244
+ return of(null)
245
+ }
246
+
204
247
  aggregate(params: AggregationsParams): Observable<Aggregations> {
205
248
  // if aggregations are empty, return an empty object right away
206
249
  if (Object.keys(params).length === 0) return of({})
@@ -363,9 +406,12 @@ export class Gn4Repository implements RecordsRepositoryInterface {
363
406
  const record = await converter.readRecord(fetchedRecordAsXml)
364
407
 
365
408
  record.title = `${record.title} (Copy)`
366
- await converter.writeRecord(record, fetchedRecordAsXml)
409
+ const recordAsXml = await converter.writeRecord(
410
+ record,
411
+ fetchedRecordAsXml
412
+ )
367
413
 
368
- return this.saveRecord(record, '', false)
414
+ return this.saveRecord(record, recordAsXml, false)
369
415
  }),
370
416
  exhaustMap((uuidObservable: Observable<string>) => uuidObservable),
371
417
  catchError((error: HttpErrorResponse) => {
@@ -466,6 +512,18 @@ export class Gn4Repository implements RecordsRepositoryInterface {
466
512
  )
467
513
  }
468
514
 
515
+ getApplicationLanguages(): Observable<string[]> {
516
+ return this.gn4LanguagesApi
517
+ .getApplicationLanguages()
518
+ .pipe(
519
+ map((languages) =>
520
+ languages
521
+ .map((lang) => LANG_3_TO_2_MAPPER[lang.id ?? ''])
522
+ .filter((code): code is string => !!code)
523
+ )
524
+ )
525
+ }
526
+
469
527
  private getRecordAsXml(uniqueIdentifier: string): Observable<string | null> {
470
528
  return this.gn4RecordsApi
471
529
  .getRecordAs(
@@ -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'
@@ -272,7 +274,12 @@ export interface DatasetFeatureType {
272
274
  isAbstract: string
273
275
  typeName: string
274
276
  definition: string
275
- attributeTable: Array<{ name: string; definition: string; code: string }>
277
+ attributeTable: Array<{
278
+ name: string
279
+ definition: string
280
+ type: string
281
+ code: string
282
+ }>
276
283
  }
277
284
 
278
285
  export type ReuseType = 'application' | 'map' | 'other'
@@ -19,6 +19,8 @@ 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>
23
25
  abstract canEditRecord(uniqueIdentifier: string): Observable<boolean>
24
26
  /**
@@ -95,4 +97,5 @@ export abstract class RecordsRepositoryInterface {
95
97
  localRecord: CatalogRecord
96
98
  ): Observable<{ user: string; date: Date }>
97
99
  abstract getRecordPublicationStatus(uuid: string): Observable<boolean>
100
+ abstract getApplicationLanguages(): Observable<string[]>
98
101
  }
@@ -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',
@@ -231,7 +231,7 @@ As such, **it is not very interesting at all.**`,
231
231
  recordUpdated: new Date('2022-04-15T14:18:19'),
232
232
  resourceUpdated: new Date('2022-03-29'),
233
233
  title:
234
- "Plan local d'urbanisme (PLU) dématérialisé - commune d'Avrigny - approbation du 29/03/2022",
234
+ "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
235
  abstract: `Plan local d'urbanisme (PLU) dématérialisé - commune d'Avrigny - approbation du 29/03/2022.
236
236
 
237
237
  Ce lot informe du droit à bâtir sur la commune d'Avrigny.
@@ -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>