geonetwork-ui 2.4.0-dev.a1bcfe22 → 2.4.0-dev.a6f221e3

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 (282) hide show
  1. package/esm2022/libs/api/metadata-converter/src/index.mjs +1 -2
  2. package/esm2022/libs/api/metadata-converter/src/lib/gn4/types/keywords.model.mjs +1 -1
  3. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.mjs +7 -5
  4. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +30 -2
  5. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/geometry.mjs +31 -0
  6. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +23 -1
  7. package/esm2022/libs/api/metadata-converter/src/lib/xml-utils.mjs +10 -3
  8. package/esm2022/libs/api/repository/src/lib/gn4/gn4-repository.mjs +21 -4
  9. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.mjs +11 -1
  10. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +11 -1
  11. package/esm2022/libs/common/domain/src/lib/model/record/contact.model.mjs +28 -1
  12. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  13. package/esm2022/libs/common/domain/src/lib/platform.service.interface.mjs +1 -1
  14. package/esm2022/libs/common/domain/src/lib/repository/records-repository.interface.mjs +1 -1
  15. package/esm2022/libs/feature/editor/src/lib/components/contact-card/contact-card.component.mjs +29 -0
  16. package/esm2022/libs/feature/editor/src/lib/components/generic-keywords/generic-keywords.component.mjs +78 -0
  17. package/esm2022/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.mjs +131 -0
  18. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts-for-resource/form-field-contacts-for-resource.component.mjs +170 -0
  19. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.mjs +15 -39
  20. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.mjs +101 -0
  21. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-open-data/form-field-open-data.component.mjs +47 -0
  22. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.mjs +21 -0
  23. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.mjs +111 -5
  24. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extents/form-field-temporal-extents.component.mjs +7 -6
  25. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.mjs +33 -9
  26. package/esm2022/libs/feature/editor/src/lib/components/record-form/record-form.component.mjs +3 -3
  27. package/esm2022/libs/feature/editor/src/lib/components/wizard-field/wizard-field.component.mjs +8 -8
  28. package/esm2022/libs/feature/editor/src/lib/feature-editor.module.mjs +6 -4
  29. package/esm2022/libs/feature/editor/src/lib/fields.config.mjs +37 -4
  30. package/esm2022/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-from-catalog.component.mjs +6 -6
  31. package/esm2022/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-record-preview/add-layer-record-preview.component.mjs +6 -5
  32. package/esm2022/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.mjs +8 -5
  33. package/esm2022/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.mjs +6 -7
  34. package/esm2022/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.mjs +8 -7
  35. package/esm2022/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.mjs +7 -6
  36. package/esm2022/libs/feature/map/src/lib/feature-map.module.mjs +7 -26
  37. package/esm2022/libs/feature/map/src/lib/layers-panel/layers-panel.component.mjs +29 -13
  38. package/esm2022/libs/feature/map/src/lib/utils/map-utils.service.mjs +10 -5
  39. package/esm2022/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.mjs +3 -3
  40. package/esm2022/libs/feature/search/src/lib/results-table/results-table-container.component.mjs +40 -7
  41. package/esm2022/libs/feature/search/src/lib/state/search.facade.mjs +6 -2
  42. package/esm2022/libs/ui/elements/src/index.mjs +2 -1
  43. package/esm2022/libs/ui/elements/src/lib/confirmation-dialog/confirmation-dialog.component.mjs +27 -0
  44. package/esm2022/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.mjs +4 -3
  45. package/esm2022/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.mjs +2 -2
  46. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +3 -3
  47. package/esm2022/libs/ui/elements/src/lib/record-api-form/record-api-form.component.mjs +5 -5
  48. package/esm2022/libs/ui/elements/src/lib/sortable-list/sortable-list.component.mjs +7 -3
  49. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +7 -4
  50. package/esm2022/libs/ui/inputs/src/index.mjs +2 -1
  51. package/esm2022/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.mjs +19 -5
  52. package/esm2022/libs/ui/inputs/src/lib/image-input/image-input.component.mjs +17 -14
  53. package/esm2022/libs/ui/inputs/src/lib/switch-toggle/switch-toggle.component.mjs +32 -0
  54. package/esm2022/libs/ui/inputs/src/lib/text-area/text-area.component.mjs +6 -21
  55. package/esm2022/libs/ui/inputs/src/lib/text-input/text-input.component.mjs +6 -17
  56. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +3 -7
  57. package/esm2022/libs/ui/inputs/src/lib/url-input/url-input.component.mjs +43 -0
  58. package/esm2022/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.mjs +3 -3
  59. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table.component.mjs +3 -3
  60. package/esm2022/libs/ui/map/src/lib/ui-map.module.mjs +3 -3
  61. package/esm2022/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.mjs +49 -11
  62. package/esm2022/libs/ui/search/src/lib/results-table/results-table.component.mjs +18 -6
  63. package/esm2022/translations/de.json +50 -17
  64. package/esm2022/translations/en.json +43 -10
  65. package/esm2022/translations/es.json +42 -9
  66. package/esm2022/translations/fr.json +54 -21
  67. package/esm2022/translations/it.json +43 -10
  68. package/esm2022/translations/nl.json +42 -9
  69. package/esm2022/translations/pt.json +42 -9
  70. package/fesm2022/geonetwork-ui.mjs +4607 -3394
  71. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  72. package/libs/api/metadata-converter/src/index.d.ts +0 -1
  73. package/libs/api/metadata-converter/src/index.d.ts.map +1 -1
  74. package/libs/api/metadata-converter/src/lib/gn4/types/keywords.model.d.ts +2 -6
  75. package/libs/api/metadata-converter/src/lib/gn4/types/keywords.model.d.ts.map +1 -1
  76. package/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.d.ts.map +1 -1
  77. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts +8 -1
  78. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  79. package/libs/api/metadata-converter/src/lib/iso19139/utils/geometry.d.ts +5 -0
  80. package/libs/api/metadata-converter/src/lib/iso19139/utils/geometry.d.ts.map +1 -0
  81. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts +3 -1
  82. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  83. package/libs/api/metadata-converter/src/lib/xml-utils.d.ts +1 -0
  84. package/libs/api/metadata-converter/src/lib/xml-utils.d.ts.map +1 -1
  85. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts +6 -1
  86. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts.map +1 -1
  87. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts.map +1 -1
  88. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +1 -0
  89. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  90. package/libs/common/domain/src/lib/model/record/contact.model.d.ts +1 -0
  91. package/libs/common/domain/src/lib/model/record/contact.model.d.ts.map +1 -1
  92. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +3 -1
  93. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  94. package/libs/common/domain/src/lib/platform.service.interface.d.ts +1 -0
  95. package/libs/common/domain/src/lib/platform.service.interface.d.ts.map +1 -1
  96. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts +8 -0
  97. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts.map +1 -1
  98. package/libs/feature/editor/src/lib/components/contact-card/contact-card.component.d.ts +12 -0
  99. package/libs/feature/editor/src/lib/components/contact-card/contact-card.component.d.ts.map +1 -0
  100. package/libs/feature/editor/src/lib/components/generic-keywords/generic-keywords.component.d.ts +32 -0
  101. package/libs/feature/editor/src/lib/components/generic-keywords/generic-keywords.component.d.ts.map +1 -0
  102. package/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.d.ts +27 -0
  103. package/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.d.ts.map +1 -0
  104. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts-for-resource/form-field-contacts-for-resource.component.d.ts +47 -0
  105. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts-for-resource/form-field-contacts-for-resource.component.d.ts.map +1 -0
  106. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.d.ts +4 -16
  107. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.d.ts.map +1 -1
  108. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.d.ts +22 -0
  109. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.d.ts.map +1 -0
  110. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-open-data/form-field-open-data.component.d.ts +17 -0
  111. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-open-data/form-field-open-data.component.d.ts.map +1 -0
  112. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.d.ts +11 -0
  113. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.d.ts.map +1 -0
  114. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.d.ts +23 -0
  115. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.d.ts.map +1 -1
  116. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extents/form-field-temporal-extents.component.d.ts +3 -1
  117. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extents/form-field-temporal-extents.component.d.ts.map +1 -1
  118. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts +9 -1
  119. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts.map +1 -1
  120. package/libs/feature/editor/src/lib/feature-editor.module.d.ts +2 -1
  121. package/libs/feature/editor/src/lib/feature-editor.module.d.ts.map +1 -1
  122. package/libs/feature/editor/src/lib/fields.config.d.ts +8 -0
  123. package/libs/feature/editor/src/lib/fields.config.d.ts.map +1 -1
  124. package/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-from-catalog.component.d.ts +1 -1
  125. package/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-from-catalog.component.d.ts.map +1 -1
  126. package/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-record-preview/add-layer-record-preview.component.d.ts +1 -1
  127. package/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-record-preview/add-layer-record-preview.component.d.ts.map +1 -1
  128. package/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.d.ts +1 -1
  129. package/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.d.ts.map +1 -1
  130. package/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.d.ts +1 -1
  131. package/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.d.ts.map +1 -1
  132. package/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.d.ts +1 -1
  133. package/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.d.ts.map +1 -1
  134. package/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.d.ts +1 -1
  135. package/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.d.ts.map +1 -1
  136. package/libs/feature/map/src/lib/feature-map.module.d.ts +16 -21
  137. package/libs/feature/map/src/lib/feature-map.module.d.ts.map +1 -1
  138. package/libs/feature/map/src/lib/layers-panel/layers-panel.component.d.ts +1 -1
  139. package/libs/feature/map/src/lib/layers-panel/layers-panel.component.d.ts.map +1 -1
  140. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts.map +1 -1
  141. package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts +11 -3
  142. package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts.map +1 -1
  143. package/libs/feature/search/src/lib/state/search.facade.d.ts +1 -0
  144. package/libs/feature/search/src/lib/state/search.facade.d.ts.map +1 -1
  145. package/libs/ui/elements/src/index.d.ts +1 -0
  146. package/libs/ui/elements/src/index.d.ts.map +1 -1
  147. package/libs/ui/elements/src/lib/confirmation-dialog/confirmation-dialog.component.d.ts +18 -0
  148. package/libs/ui/elements/src/lib/confirmation-dialog/confirmation-dialog.component.d.ts.map +1 -0
  149. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +1 -1
  150. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts +1 -1
  151. package/libs/ui/elements/src/lib/sortable-list/sortable-list.component.d.ts +4 -4
  152. package/libs/ui/elements/src/lib/sortable-list/sortable-list.component.d.ts.map +1 -1
  153. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +2 -1
  154. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  155. package/libs/ui/inputs/src/index.d.ts +1 -0
  156. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  157. package/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.d.ts +9 -1
  158. package/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.d.ts.map +1 -1
  159. package/libs/ui/inputs/src/lib/image-input/image-input.component.d.ts +3 -4
  160. package/libs/ui/inputs/src/lib/image-input/image-input.component.d.ts.map +1 -1
  161. package/libs/ui/inputs/src/lib/switch-toggle/switch-toggle.component.d.ts +17 -0
  162. package/libs/ui/inputs/src/lib/switch-toggle/switch-toggle.component.d.ts.map +1 -0
  163. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts +0 -4
  164. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts.map +1 -1
  165. package/libs/ui/inputs/src/lib/text-input/text-input.component.d.ts +2 -4
  166. package/libs/ui/inputs/src/lib/text-input/text-input.component.d.ts.map +1 -1
  167. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +34 -35
  168. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts.map +1 -1
  169. package/libs/ui/inputs/src/lib/url-input/url-input.component.d.ts +18 -0
  170. package/libs/ui/inputs/src/lib/url-input/url-input.component.d.ts.map +1 -0
  171. package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts +10 -1
  172. package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts.map +1 -1
  173. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts +6 -2
  174. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts.map +1 -1
  175. package/package.json +1 -1
  176. package/src/libs/api/metadata-converter/src/index.ts +0 -1
  177. package/src/libs/api/metadata-converter/src/lib/fixtures/generic.records.ts +6 -1
  178. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.ts +5 -1
  179. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +37 -12
  180. package/src/libs/api/metadata-converter/src/lib/fixtures/metawal.records.ts +5 -1
  181. package/src/libs/api/metadata-converter/src/lib/gn4/types/keywords.model.ts +2 -6
  182. package/src/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.ts +6 -2
  183. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +72 -2
  184. package/src/libs/api/metadata-converter/src/lib/iso19139/utils/geometry.ts +39 -0
  185. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +70 -1
  186. package/src/libs/api/metadata-converter/src/lib/xml-utils.ts +13 -5
  187. package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +24 -4
  188. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.ts +12 -1
  189. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +43 -12
  190. package/src/libs/common/domain/src/lib/model/record/contact.model.ts +28 -0
  191. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +3 -1
  192. package/src/libs/common/domain/src/lib/platform.service.interface.ts +4 -0
  193. package/src/libs/common/domain/src/lib/repository/records-repository.interface.ts +10 -0
  194. package/src/libs/feature/editor/src/lib/components/contact-card/contact-card.component.css +0 -0
  195. package/src/libs/feature/editor/src/lib/components/contact-card/contact-card.component.html +25 -0
  196. package/src/libs/feature/editor/src/lib/components/contact-card/contact-card.component.ts +30 -0
  197. package/src/libs/feature/editor/src/lib/components/generic-keywords/generic-keywords.component.css +0 -0
  198. package/src/libs/feature/editor/src/lib/components/generic-keywords/generic-keywords.component.html +26 -0
  199. package/src/libs/feature/editor/src/lib/components/generic-keywords/generic-keywords.component.ts +89 -0
  200. package/src/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.html +2 -1
  201. package/src/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.ts +110 -19
  202. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts-for-resource/form-field-contacts-for-resource.component.css +0 -0
  203. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts-for-resource/form-field-contacts-for-resource.component.html +76 -0
  204. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts-for-resource/form-field-contacts-for-resource.component.ts +271 -0
  205. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.html +7 -17
  206. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.ts +9 -48
  207. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.css +0 -0
  208. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.html +4 -0
  209. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.ts +128 -0
  210. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-open-data/form-field-open-data.component.css +0 -0
  211. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-open-data/form-field-open-data.component.html +6 -0
  212. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-open-data/form-field-open-data.component.ts +59 -0
  213. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.css +0 -0
  214. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.html +5 -0
  215. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.ts +22 -0
  216. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.html +15 -1
  217. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.ts +156 -1
  218. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extents/form-field-temporal-extents.component.ts +8 -7
  219. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.html +20 -3
  220. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.ts +30 -1
  221. package/src/libs/feature/editor/src/lib/components/record-form/record-form.component.html +1 -1
  222. package/src/libs/feature/editor/src/lib/components/wizard-field/wizard-field.component.html +1 -1
  223. package/src/libs/feature/editor/src/lib/feature-editor.module.ts +2 -1
  224. package/src/libs/feature/editor/src/lib/fields.config.ts +40 -3
  225. package/src/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-from-catalog.component.ts +3 -0
  226. package/src/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-record-preview/add-layer-record-preview.component.ts +5 -1
  227. package/src/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.ts +5 -0
  228. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.html +1 -1
  229. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.ts +10 -7
  230. package/src/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.html +1 -1
  231. package/src/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.ts +5 -0
  232. package/src/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.html +1 -1
  233. package/src/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.ts +6 -1
  234. package/src/libs/feature/map/src/lib/feature-map.module.ts +2 -15
  235. package/src/libs/feature/map/src/lib/layers-panel/layers-panel.component.ts +24 -1
  236. package/src/libs/feature/map/src/lib/utils/map-utils.service.ts +8 -4
  237. package/src/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.html +1 -1
  238. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.html +2 -1
  239. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.ts +52 -3
  240. package/src/libs/feature/search/src/lib/state/search.facade.ts +6 -0
  241. package/src/libs/ui/elements/src/index.ts +1 -0
  242. package/src/libs/ui/elements/src/lib/confirmation-dialog/confirmation-dialog.component.css +0 -0
  243. package/src/libs/ui/elements/src/lib/confirmation-dialog/confirmation-dialog.component.html +12 -0
  244. package/src/libs/ui/elements/src/lib/confirmation-dialog/confirmation-dialog.component.ts +37 -0
  245. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.html +4 -1
  246. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.css +2 -1
  247. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +12 -8
  248. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.html +2 -2
  249. package/src/libs/ui/elements/src/lib/sortable-list/sortable-list.component.html +3 -1
  250. package/src/libs/ui/elements/src/lib/sortable-list/sortable-list.component.ts +8 -4
  251. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +6 -1
  252. package/src/libs/ui/inputs/src/index.ts +1 -0
  253. package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.ts +15 -3
  254. package/src/libs/ui/inputs/src/lib/file-input/file-input.component.css +0 -0
  255. package/src/libs/ui/inputs/src/lib/file-input/file-input.component.html +85 -0
  256. package/src/libs/ui/inputs/src/lib/file-input/file-input.component.ts +91 -0
  257. package/src/libs/ui/inputs/src/lib/image-input/image-input.component.html +49 -49
  258. package/src/libs/ui/inputs/src/lib/image-input/image-input.component.ts +15 -13
  259. package/src/libs/ui/inputs/src/lib/text-area/text-area.component.html +2 -1
  260. package/src/libs/ui/inputs/src/lib/text-area/text-area.component.ts +2 -27
  261. package/src/libs/ui/inputs/src/lib/text-input/text-input.component.html +4 -3
  262. package/src/libs/ui/inputs/src/lib/text-input/text-input.component.ts +4 -16
  263. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +0 -3
  264. package/src/libs/ui/inputs/src/lib/url-input/url-input.component.css +9 -0
  265. package/src/libs/ui/inputs/src/lib/url-input/url-input.component.html +37 -0
  266. package/src/libs/ui/inputs/src/lib/url-input/url-input.component.ts +33 -0
  267. package/src/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.html +1 -1
  268. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +1 -0
  269. package/src/libs/ui/map/src/lib/ui-map.module.ts +1 -1
  270. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.html +10 -1
  271. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.ts +55 -3
  272. package/src/libs/ui/search/src/lib/results-table/results-table.component.html +7 -2
  273. package/src/libs/ui/search/src/lib/results-table/results-table.component.ts +9 -9
  274. package/tailwind.base.css +16 -4
  275. package/translations/de.json +50 -17
  276. package/translations/en.json +43 -10
  277. package/translations/es.json +42 -9
  278. package/translations/fr.json +54 -21
  279. package/translations/it.json +43 -10
  280. package/translations/nl.json +42 -9
  281. package/translations/pt.json +42 -9
  282. package/translations/sk.json +43 -10
@@ -1,7 +1,7 @@
1
1
  <div class="mb-6 md-description sm:mb-4 sm:pr-16">
2
2
  <gn-ui-content-ghost ghostClass="h-32" [showContent]="fieldReady('abstract')">
3
3
  <gn-ui-max-lines [maxLines]="6" *ngIf="metadata.abstract">
4
- <div>
4
+ <div class="mb-6">
5
5
  <gn-ui-markdown-parser
6
6
  [textContent]="metadata.abstract"
7
7
  ></gn-ui-markdown-parser>
@@ -47,19 +47,23 @@
47
47
  </ng-template>
48
48
  </ng-container>
49
49
  <ng-container *ngIf="legalConstraints.length">
50
- <gn-ui-markdown-parser
51
- *ngFor="let constraint of legalConstraints"
52
- [textContent]="constraint"
53
- >
54
- </gn-ui-markdown-parser>
50
+ <div class="mb-6">
51
+ <gn-ui-markdown-parser
52
+ *ngFor="let constraint of legalConstraints"
53
+ [textContent]="constraint"
54
+ >
55
+ </gn-ui-markdown-parser>
56
+ </div>
55
57
  </ng-container>
56
58
  <ng-container *ngIf="otherConstraints.length">
57
59
  <div gnUiLinkify *ngFor="let constraint of otherConstraints">
58
60
  <h5 translate class="font-medium text-black text-sm mb-[2px] mt-[16px]">
59
61
  record.metadata.otherConstraints
60
62
  </h5>
61
- <gn-ui-markdown-parser [textContent]="constraint">
62
- </gn-ui-markdown-parser>
63
+ <div class="mb-6">
64
+ <gn-ui-markdown-parser [textContent]="constraint">
65
+ </gn-ui-markdown-parser>
66
+ </div>
63
67
  </div>
64
68
  </ng-container>
65
69
 
@@ -21,7 +21,7 @@
21
21
  class="mr-2 w-20"
22
22
  (valueChange)="setLimit($event)"
23
23
  [value]="displayLimit$ | async"
24
- hint=""
24
+ placeholder=""
25
25
  >
26
26
  </gn-ui-text-input>
27
27
  <div class="flex items-center">
@@ -47,7 +47,7 @@
47
47
  [value]="offset$ | async"
48
48
  [disabled]="!supportOffset"
49
49
  (valueChange)="supportOffset ? setOffset($event) : null"
50
- hint=""
50
+ placeholder=""
51
51
  >
52
52
  </gn-ui-text-input>
53
53
  <div
@@ -12,7 +12,9 @@
12
12
  class="sortable-list flex flex-col gap-3 p-2"
13
13
  (cdkDropListDropped)="drop($event)"
14
14
  >
15
- <ng-container *ngFor="let element of elements; index as index">
15
+ <ng-container
16
+ *ngFor="let element of elements; index as index; trackBy: trackByFn"
17
+ >
16
18
  <div class="sortable-box bg-white flex items-center" cdkDrag>
17
19
  <span
18
20
  cdkDragHandle
@@ -17,9 +17,9 @@ import {
17
17
  import { MatIconModule } from '@angular/material/icon'
18
18
  import { ButtonComponent } from '../../../../../../libs/ui/inputs/src'
19
19
 
20
- type DynamicElement = {
21
- component: Type<any>
22
- inputs: Record<string, any>
20
+ export type DynamicElement = {
21
+ component: Type<unknown>
22
+ inputs: Record<string, unknown>
23
23
  }
24
24
 
25
25
  @Component({
@@ -40,7 +40,7 @@ type DynamicElement = {
40
40
  })
41
41
  export class SortableListComponent {
42
42
  @Input() elements: Array<DynamicElement>
43
- @Input() addOptions: Array<{ buttonLabel: string; eventName: string }>
43
+ @Input() addOptions: Array<{ buttonLabel: string; eventName: string }> = []
44
44
  @Output() elementsChange = new EventEmitter<Array<DynamicElement>>()
45
45
  @Output() add = new EventEmitter<string>()
46
46
 
@@ -53,4 +53,8 @@ export class SortableListComponent {
53
53
  this.elements = this.elements.filter((_, i) => i !== index)
54
54
  this.elementsChange.emit(this.elements)
55
55
  }
56
+
57
+ trackByFn(index: number) {
58
+ return index
59
+ }
56
60
  }
@@ -20,7 +20,11 @@ import { MetadataQualityItemComponent } from './metadata-quality-item/metadata-q
20
20
  import { ErrorComponent } from './error/error.component'
21
21
  import { PaginationComponent } from './pagination/pagination.component'
22
22
  import { ThumbnailComponent } from './thumbnail/thumbnail.component'
23
- import { BadgeComponent, UiInputsModule } from '../../../../../libs/ui/inputs/src'
23
+ import {
24
+ BadgeComponent,
25
+ TextInputComponent,
26
+ UiInputsModule,
27
+ } from '../../../../../libs/ui/inputs/src'
24
28
  import { FormsModule } from '@angular/forms'
25
29
  import { AvatarComponent } from './avatar/avatar.component'
26
30
  import { UserPreviewComponent } from './user-preview/user-preview.component'
@@ -51,6 +55,7 @@ import { TimeSincePipe } from './user-feedback-item/time-since.pipe'
51
55
  TimeSincePipe,
52
56
  BadgeComponent,
53
57
  MaxLinesComponent,
58
+ TextInputComponent,
54
59
  ],
55
60
  declarations: [
56
61
  MetadataInfoComponent,
@@ -21,3 +21,4 @@ export * from './lib/text-input/text-input.component'
21
21
  export * from './lib/ui-inputs.module'
22
22
  export * from './lib/viewport-intersector/viewport-intersector.component'
23
23
  export * from './lib/previous-next-buttons/previous-next-buttons.component'
24
+ export * from './lib/switch-toggle/switch-toggle.component'
@@ -61,6 +61,7 @@ export class AutocompleteComponent
61
61
  @Input() action: (value: string) => Observable<AutocompleteItem[]>
62
62
  @Input() value?: AutocompleteItem
63
63
  @Input() clearOnSelection = false
64
+ @Input() preventCompleteOnSelection = false
64
65
  @Input() autoFocus = false
65
66
  @Input() minCharacterCount? = 3
66
67
  @Input() allowSubmit = true
@@ -206,13 +207,24 @@ export class AutocompleteComponent
206
207
  this.inputSubmitted.emit(this.inputRef.nativeElement.value)
207
208
  }
208
209
 
210
+ /**
211
+ * This function is triggered when an item is selected in the list of displayed items.
212
+ * If preventCompleteOnSelection is true then the input will be left as entered by the user.
213
+ * If preventCompleteOnSelection is false (by default) then the input will be completed with the item selected by the user.
214
+ * If clearOnSelection is true then the input will be cleared upon selection.
215
+ * @param event
216
+ */
209
217
  handleSelection(event: MatAutocompleteSelectedEvent) {
210
218
  this.cancelEnter = true
211
219
  this.itemSelected.emit(event.option.value)
212
- if (this.clearOnSelection) {
213
- this.lastInputValue$.pipe(first()).subscribe((any) => {
214
- this.inputRef.nativeElement.value = any
220
+ if (this.preventCompleteOnSelection) {
221
+ this.lastInputValue$.pipe(first()).subscribe((lastInputValue) => {
222
+ this.inputRef.nativeElement.value = lastInputValue
215
223
  })
224
+ return
225
+ }
226
+ if (this.clearOnSelection) {
227
+ this.inputRef.nativeElement.value = ''
216
228
  }
217
229
  }
218
230
  }
@@ -0,0 +1,85 @@
1
+ <div class="w-full flex flex-col gap-[16px]">
2
+ <label
3
+ gnUiFilesDrop
4
+ class="flex-1 border-2 border-dashed rounded-lg p-6 flex flex-col items-center justify-center gap-4 transition-colors duration-100"
5
+ [ngClass]="{
6
+ 'border-primary-lighter bg-primary-white': dragFilesOver,
7
+ 'border-gray-300': !dragFilesOver
8
+ }"
9
+ (dragFilesOver)="handleDragFilesOver($event)"
10
+ (dropFiles)="handleDropFiles($event)"
11
+ >
12
+ <div
13
+ class="w-14 h-14 rounded-md bg-gray-50 grid"
14
+ *ngIf="!isUploadInProgress"
15
+ >
16
+ <mat-icon
17
+ *ngIf="!dragFilesOver"
18
+ class="material-symbols-outlined place-self-center text-primary"
19
+ >cloud_upload</mat-icon
20
+ >
21
+ <mat-icon
22
+ *ngIf="dragFilesOver"
23
+ class="material-symbols-outlined place-self-center text-primary"
24
+ >add_box</mat-icon
25
+ >
26
+ </div>
27
+ <div
28
+ *ngIf="isUploadInProgress"
29
+ class="w-14 h-14 grid items-center justify-center"
30
+ >
31
+ <div class="text-gray-100 absolute">
32
+ <mat-progress-spinner
33
+ class="place-self-center"
34
+ [diameter]="56"
35
+ mode="determinate"
36
+ [value]="100"
37
+ ></mat-progress-spinner>
38
+ </div>
39
+ <div class="text-primary absolute">
40
+ <mat-progress-spinner
41
+ class="place-self-center"
42
+ [diameter]="56"
43
+ mode="determinate"
44
+ [value]="uploadProgress"
45
+ ></mat-progress-spinner>
46
+ </div>
47
+ <span class="text-sm text-main font-bold">{{ uploadProgress }}%</span>
48
+ </div>
49
+ <div class="flex flex-col items-center gap-1">
50
+ <p class="font-medium">
51
+ {{ getPrimaryText() | translate: { sizeMB: maxSizeMB.toFixed(0) } }}
52
+ </p>
53
+ <p
54
+ class="text-sm"
55
+ [class]="
56
+ isUploadInProgress
57
+ ? 'font-bold text-primary cursor-pointer'
58
+ : 'font-medium text-gray-500'
59
+ "
60
+ (click)="handleSecondaryTextClick()"
61
+ >
62
+ {{ getSecondaryText() | translate }}
63
+ </p>
64
+ </div>
65
+ <p class="w-full flex flex-row items-center justify-stretch gap-[16px]">
66
+ <span class="border-b border-gray-300 grow"></span>
67
+ <span class="text-sm font-medium text-gray-500 or-input-url" translate>
68
+ input.file.orInputUrl</span
69
+ >
70
+ <span class="border-b border-gray-300 grow"></span>
71
+ </p>
72
+ <input
73
+ type="file"
74
+ class="hidden"
75
+ (change)="handleFileInput($event)"
76
+ [disabled]="isUploadInProgress"
77
+ />
78
+
79
+ <gn-ui-url-input
80
+ class="w-full"
81
+ [disabled]="isUploadInProgress"
82
+ (valueChange)="handleUrlChange($event)"
83
+ ></gn-ui-url-input>
84
+ </label>
85
+ </div>
@@ -0,0 +1,91 @@
1
+ import { CommonModule } from '@angular/common'
2
+ import {
3
+ ChangeDetectionStrategy,
4
+ ChangeDetectorRef,
5
+ Component,
6
+ EventEmitter,
7
+ Input,
8
+ Output,
9
+ } from '@angular/core'
10
+ import { MatIconModule } from '@angular/material/icon'
11
+ import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'
12
+ import { ButtonComponent } from '../button/button.component'
13
+ import { FilesDropDirective } from '../files-drop/files-drop.directive'
14
+ import { TranslateModule } from '@ngx-translate/core'
15
+ import { marker } from '@biesbjerg/ngx-translate-extract-marker'
16
+ import { UrlInputComponent } from '../url-input/url-input.component'
17
+
18
+ @Component({
19
+ selector: 'gn-ui-file-input',
20
+ templateUrl: './file-input.component.html',
21
+ styleUrls: ['./file-input.component.css'],
22
+ changeDetection: ChangeDetectionStrategy.OnPush,
23
+ standalone: true,
24
+ imports: [
25
+ CommonModule,
26
+ ButtonComponent,
27
+ MatIconModule,
28
+ FilesDropDirective,
29
+ MatProgressSpinnerModule,
30
+ TranslateModule,
31
+ UrlInputComponent,
32
+ ],
33
+ })
34
+ export class FileInputComponent {
35
+ @Input() maxSizeMB: number
36
+ @Input() uploadProgress?: number
37
+ @Output() fileChange: EventEmitter<File> = new EventEmitter()
38
+ @Output() urlChange: EventEmitter<string> = new EventEmitter()
39
+ @Output() uploadCancel: EventEmitter<void> = new EventEmitter()
40
+
41
+ dragFilesOver = false
42
+
43
+ get isUploadInProgress() {
44
+ return this.uploadProgress !== undefined
45
+ }
46
+
47
+ constructor(private cd: ChangeDetectorRef) {}
48
+
49
+ getPrimaryText() {
50
+ if (this.uploadProgress) {
51
+ return marker('input.file.uploadProgressLabel')
52
+ }
53
+ return marker('input.file.selectFileLabel')
54
+ }
55
+
56
+ getSecondaryText() {
57
+ if (this.uploadProgress) {
58
+ return marker('input.file.uploadProgressCancel')
59
+ }
60
+ return marker('input.file.dropFileLabel')
61
+ }
62
+
63
+ handleDragFilesOver(dragFilesOver: boolean) {
64
+ this.dragFilesOver = dragFilesOver
65
+ this.cd.markForCheck()
66
+ }
67
+
68
+ handleDropFiles(files: File[]) {
69
+ if (files.length > 0) {
70
+ this.fileChange.emit(files[0])
71
+ }
72
+ }
73
+
74
+ handleFileInput(event: Event) {
75
+ this.handleDropFiles(Array.from((event.target as HTMLInputElement).files))
76
+ }
77
+
78
+ handleUrlChange(url: string) {
79
+ this.urlChange.emit(url)
80
+ }
81
+
82
+ handleSecondaryTextClick() {
83
+ if (this.uploadProgress) {
84
+ this.handleCancel()
85
+ }
86
+ }
87
+
88
+ handleCancel() {
89
+ this.uploadCancel.emit()
90
+ }
91
+ }
@@ -19,14 +19,12 @@
19
19
  <mat-icon class="material-symbols-outlined">delete</mat-icon>
20
20
  </gn-ui-button>
21
21
  </div>
22
- <input
22
+ <gn-ui-text-input
23
23
  *ngIf="showAltTextInput"
24
- type="text"
25
- class="py-3 px-2 border-2 border-gray-300 rounded-lg text-sm font-medium"
26
24
  [placeholder]="'input.image.altTextPlaceholder' | translate"
27
- [value]="altText"
28
- (change)="handleAltTextChange($event)"
29
- />
25
+ [value]="altText ?? ''"
26
+ (valueChange)="handleAltTextChange($event)"
27
+ ></gn-ui-text-input>
30
28
  <div class="flex flex-row gap-2">
31
29
  <gn-ui-button
32
30
  [extraClass]="'bg-gray-200 font-bold'"
@@ -51,46 +49,66 @@
51
49
  <div class="w-full h-full flex flex-col gap-2">
52
50
  <label
53
51
  gnUiFilesDrop
54
- class="block flex-1 border-2 border-dashed border-gray-300 rounded-lg p-6 flex flex-col items-center justify-center gap-4"
52
+ class="flex-1 border-2 border-dashed rounded-lg p-6 flex flex-col items-center justify-center gap-4"
53
+ [ngClass]="{
54
+ 'border-primary-lighter bg-primary-white': dragFilesOver,
55
+ 'border-gray-300': !dragFilesOver
56
+ }"
55
57
  (dragFilesOver)="handleDragFilesOver($event)"
56
58
  (dropFiles)="handleDropFiles($event)"
57
59
  >
58
- <div class="w-14 h-14 rounded-md bg-gray-200 grid">
60
+ <div
61
+ class="w-14 h-14 rounded-md bg-gray-50 grid"
62
+ *ngIf="!isUploadInProgress && !uploadError"
63
+ >
59
64
  <mat-icon
60
- *ngIf="!dragFilesOver && !uploadProgress && !uploadError"
61
- class="material-symbols-outlined place-self-center text-blue-500"
65
+ *ngIf="!dragFilesOver"
66
+ class="material-symbols-outlined place-self-center text-primary"
62
67
  >image</mat-icon
63
68
  >
64
69
  <mat-icon
65
- *ngIf="dragFilesOver && !uploadProgress && !uploadError"
66
- class="material-symbols-outlined place-self-center text-blue-500"
70
+ *ngIf="dragFilesOver"
71
+ class="material-symbols-outlined place-self-center text-primary"
67
72
  >add_box</mat-icon
68
73
  >
69
- <div *ngIf="uploadProgress">
74
+ </div>
75
+
76
+ <div
77
+ *ngIf="isUploadInProgress && !uploadError"
78
+ class="w-14 h-14 grid items-center justify-center"
79
+ >
80
+ <div class="text-gray-100 absolute">
81
+ <mat-progress-spinner
82
+ class="place-self-center"
83
+ [diameter]="56"
84
+ mode="determinate"
85
+ [value]="100"
86
+ ></mat-progress-spinner>
87
+ </div>
88
+ <div class="text-primary absolute">
70
89
  <mat-progress-spinner
71
90
  class="place-self-center"
72
91
  [diameter]="56"
73
- [mode]="'determinate'"
92
+ mode="determinate"
74
93
  [value]="uploadProgress"
75
94
  ></mat-progress-spinner>
76
- <span
77
- class="text-sm font-medium relative inline-block width-[30px] bottom-[40px] left-[15px]"
78
- >
79
- {{ uploadProgress }}%
80
- </span>
81
95
  </div>
96
+ <span class="text-sm text-main font-bold">{{ uploadProgress }}%</span>
97
+ </div>
98
+
99
+ <div class="w-14 h-14 rounded-md bg-gray-50 grid" *ngIf="uploadError">
82
100
  <mat-icon
83
- *ngIf="uploadError"
84
101
  class="material-symbols-outlined place-self-center text-rose-500"
85
102
  >broken_image</mat-icon
86
103
  >
87
104
  </div>
105
+
88
106
  <div class="flex flex-col items-center gap-1">
89
107
  <p class="font-medium">{{ getPrimaryText() | translate }}</p>
90
108
  <p
91
109
  class="text-sm"
92
110
  [class]="
93
- uploadProgress || uploadError
111
+ isUploadInProgress || uploadError
94
112
  ? 'font-bold text-blue-500 cursor-pointer'
95
113
  : 'font-medium text-gray-500'
96
114
  "
@@ -103,9 +121,10 @@
103
121
  type="file"
104
122
  class="hidden"
105
123
  (change)="handleFileInput($event)"
106
- [disabled]="showUrlInput || uploadProgress || uploadError"
124
+ [disabled]="showUrlInput || isUploadInProgress || uploadError"
107
125
  />
108
126
  </label>
127
+
109
128
  <div *ngIf="!showUrlInput" class="flex-none">
110
129
  <gn-ui-button
111
130
  [extraClass]="'bg-gray-200 font-bold'"
@@ -115,32 +134,13 @@
115
134
  {{ 'input.image.displayUrlInput' | translate }}
116
135
  </gn-ui-button>
117
136
  </div>
118
- <div *ngIf="showUrlInput" class="flex-none flex flex-col gap-2">
119
- <div class="h-2"></div>
120
- <div class="flex gap-2 items-center">
121
- <div class="flex-1 flex rounded-lg">
122
- <span
123
- class="material-symbols-outlined px-4 inline-flex items-center min-w-fit rounded-s-lg border-2 border-e-0 border-gray-300"
124
- >link</span
125
- >
126
- <input
127
- type="text"
128
- class="py-3 ps-1 block w-full border-2 border-s-0 border-e-0 border-gray-300 text-sm font-medium"
129
- placeholder="https://exemple.com/image.jpg"
130
- (change)="handleUrlChange($event)"
131
- />
132
- <gn-ui-button
133
- class="px-1 inline-flex items-center min-w-fit rounded-e-lg border-2 border-s-0 border-gray-300 text-white"
134
- [extraClass]="
135
- urlInputValue && !downloadError ? 'bg-blue-500' : 'bg-gray-500'
136
- "
137
- [disabled]="!urlInputValue || downloadError"
138
- (buttonClick)="downloadUrl()"
139
- >
140
- <mat-icon class="material-symbols-outlined">arrow_upward</mat-icon>
141
- </gn-ui-button>
142
- </div>
143
- </div>
144
- </div>
137
+
138
+ <gn-ui-url-input
139
+ *ngIf="showUrlInput"
140
+ class="mt-3.5"
141
+ (valueChange)="downloadUrl($event)"
142
+ [disabled]="isUploadInProgress"
143
+ >
144
+ </gn-ui-url-input>
145
145
  </div>
146
146
  </ng-template>
@@ -16,6 +16,8 @@ import { ButtonComponent } from '../button/button.component'
16
16
  import { FilesDropDirective } from '../files-drop/files-drop.directive'
17
17
  import { TranslateModule } from '@ngx-translate/core'
18
18
  import { marker } from '@biesbjerg/ngx-translate-extract-marker'
19
+ import { UrlInputComponent } from '../url-input/url-input.component'
20
+ import { TextInputComponent } from '../text-input/text-input.component'
19
21
 
20
22
  @Component({
21
23
  selector: 'gn-ui-image-input',
@@ -30,6 +32,8 @@ import { marker } from '@biesbjerg/ngx-translate-extract-marker'
30
32
  FilesDropDirective,
31
33
  MatProgressSpinnerModule,
32
34
  TranslateModule,
35
+ UrlInputComponent,
36
+ TextInputComponent,
33
37
  ],
34
38
  })
35
39
  export class ImageInputComponent {
@@ -49,10 +53,13 @@ export class ImageInputComponent {
49
53
  downloadError = false
50
54
  showAltTextInput = false
51
55
 
52
- urlInputValue?: string
53
56
  lastUploadType?: 'file' | 'url'
54
57
  lastUploadContent?: string | File
55
58
 
59
+ get isUploadInProgress() {
60
+ return this.uploadProgress !== undefined
61
+ }
62
+
56
63
  constructor(private http: HttpClient, private cd: ChangeDetectorRef) {}
57
64
 
58
65
  getPrimaryText() {
@@ -104,24 +111,20 @@ export class ImageInputComponent {
104
111
  this.showUrlInput = true
105
112
  }
106
113
 
107
- handleUrlChange(event: Event) {
114
+ async downloadUrl(url: string) {
108
115
  this.downloadError = false
109
- this.urlInputValue = (event.target as HTMLInputElement).value
110
- }
111
-
112
- async downloadUrl() {
113
- const name = this.urlInputValue.split('/').pop()
116
+ const name = url.split('/').pop()
114
117
 
115
118
  try {
116
119
  const response = await firstValueFrom(
117
- this.http.head(this.urlInputValue, { observe: 'response' })
120
+ this.http.head(url, { observe: 'response' })
118
121
  )
119
122
  if (
120
123
  response.headers.get('content-type')?.startsWith('image/') &&
121
124
  parseInt(response.headers.get('content-length')) <
122
125
  megabytesToBytes(this.maxSizeMB)
123
126
  ) {
124
- this.http.get(this.urlInputValue, { responseType: 'blob' }).subscribe({
127
+ this.http.get(url, { responseType: 'blob' }).subscribe({
125
128
  next: (blob) => {
126
129
  this.cd.markForCheck()
127
130
  const file = new File([blob], name)
@@ -130,7 +133,7 @@ export class ImageInputComponent {
130
133
  error: () => {
131
134
  this.downloadError = true
132
135
  this.cd.markForCheck()
133
- this.urlChange.emit(this.urlInputValue)
136
+ this.urlChange.emit(url)
134
137
  },
135
138
  })
136
139
  }
@@ -172,9 +175,8 @@ export class ImageInputComponent {
172
175
  this.showAltTextInput = !this.showAltTextInput
173
176
  }
174
177
 
175
- handleAltTextChange(event: Event) {
176
- const input = event.target as HTMLInputElement
177
- this.altTextChange.emit(input.value)
178
+ handleAltTextChange(altText: string) {
179
+ this.altTextChange.emit(altText)
178
180
  }
179
181
 
180
182
  private filterTypeImage(files: File[]) {
@@ -2,12 +2,13 @@
2
2
  <textarea
3
3
  #input
4
4
  name="textArea"
5
+ class="gn-ui-text-input leading-tight"
6
+ [ngClass]="extraClass"
5
7
  [disabled]="disabled"
6
8
  [placeholder]="placeholder"
7
9
  [value]="value"
8
10
  (change)="handleChange($event)"
9
11
  (input)="handleChange($event)"
10
- [class]="classList"
11
12
  [attr.required]="required || null"
12
13
  ></textarea>
13
14
  </div>
@@ -7,17 +7,16 @@ import {
7
7
  } from '@angular/core'
8
8
  import { Subject } from 'rxjs'
9
9
  import { distinctUntilChanged } from 'rxjs/operators'
10
+ import { CommonModule } from '@angular/common'
10
11
 
11
12
  @Component({
12
13
  selector: 'gn-ui-text-area',
13
14
  templateUrl: './text-area.component.html',
14
15
  styleUrls: ['./text-area.component.css'],
15
16
  standalone: true,
17
+ imports: [CommonModule],
16
18
  })
17
19
  export class TextAreaComponent implements AfterViewInit {
18
- private readonly baseClasses: string
19
- private readonly disabledClasses: string
20
-
21
20
  @Input() value = ''
22
21
  @Input() disabled = false
23
22
  @Input() extraClass = ''
@@ -29,30 +28,6 @@ export class TextAreaComponent implements AfterViewInit {
29
28
 
30
29
  @ViewChild('input') input
31
30
 
32
- constructor() {
33
- this.baseClasses = [
34
- 'w-full',
35
- 'pt-2',
36
- 'pl-2',
37
- 'resize-none',
38
- 'border',
39
- 'border-gray-800',
40
- 'rounded italic',
41
- 'leading-tight',
42
- 'focus:outline-none',
43
- 'focus:bg-background',
44
- 'focus:border-primary',
45
- ].join(' ')
46
-
47
- this.disabledClasses = ['cursor-not-allowed'].join(' ')
48
- }
49
-
50
- get classList() {
51
- return `${this.baseClasses} ${this.extraClass} ${
52
- this.disabled ? this.disabledClasses : ''
53
- }`
54
- }
55
-
56
31
  ngAfterViewInit() {
57
32
  this.checkRequired(this.input.nativeElement.value)
58
33
  }
@@ -1,12 +1,13 @@
1
1
  <input
2
2
  #input
3
- [class]="classList"
3
+ class="gn-ui-text-input"
4
+ [ngClass]="extraClass"
4
5
  type="text"
5
6
  [value]="value"
6
7
  (change)="handleChange($event)"
7
8
  (input)="handleChange($event)"
8
- [placeholder]="hint"
9
- [attr.aria-label]="hint"
9
+ [placeholder]="placeholder"
10
+ [attr.aria-label]="placeholder"
10
11
  [attr.required]="required || null"
11
12
  [disabled]="disabled"
12
13
  />