@eeacms/volto-n2k 0.1.1

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 (233) hide show
  1. package/.coverage.babel.config.js +9 -0
  2. package/.release-it.json +17 -0
  3. package/CHANGELOG.md +155 -0
  4. package/DEVELOP.md +53 -0
  5. package/Jenkinsfile +209 -0
  6. package/LICENSE.md +9 -0
  7. package/README.md +62 -0
  8. package/bootstrap +41 -0
  9. package/cypress/fixtures/example.json +5 -0
  10. package/cypress/integration/block-basics.js +32 -0
  11. package/cypress/plugins/index.js +26 -0
  12. package/cypress/support/commands.js +315 -0
  13. package/cypress/support/index.js +53 -0
  14. package/cypress.json +12 -0
  15. package/jest-addon.config.js +36 -0
  16. package/package.json +57 -0
  17. package/src/actions.js +20 -0
  18. package/src/components/index.js +3 -0
  19. package/src/components/manage/Blocks/BodyClass/Edit.jsx +29 -0
  20. package/src/components/manage/Blocks/BodyClass/View.jsx +13 -0
  21. package/src/components/manage/Blocks/BodyClass/index.js +24 -0
  22. package/src/components/manage/Blocks/BodyClass/schema.js +19 -0
  23. package/src/components/manage/Blocks/BubbleChart/BubbleChart.jsx +101 -0
  24. package/src/components/manage/Blocks/BubbleChart/Chart.jsx +67 -0
  25. package/src/components/manage/Blocks/BubbleChart/ChartContext.jsx +3 -0
  26. package/src/components/manage/Blocks/BubbleChart/View.jsx +63 -0
  27. package/src/components/manage/Blocks/BubbleChart/index.js +17 -0
  28. package/src/components/manage/Blocks/BubbleChart/schema.js +124 -0
  29. package/src/components/manage/Blocks/BubbleChart/style.less +12 -0
  30. package/src/components/manage/Blocks/CarouselHorizontal/HorizontalView.jsx +221 -0
  31. package/src/components/manage/Blocks/CarouselHorizontal/index.js +19 -0
  32. package/src/components/manage/Blocks/CarouselHorizontal/schema.js +32 -0
  33. package/src/components/manage/Blocks/CddaShape/View.jsx +109 -0
  34. package/src/components/manage/Blocks/CddaShape/index.js +23 -0
  35. package/src/components/manage/Blocks/CddaShape/schema.js +19 -0
  36. package/src/components/manage/Blocks/CddaShape/style.less +14 -0
  37. package/src/components/manage/Blocks/ContactBlock/View.jsx +56 -0
  38. package/src/components/manage/Blocks/ContactBlock/icons/domain.svg +1 -0
  39. package/src/components/manage/Blocks/ContactBlock/icons/email.svg +1 -0
  40. package/src/components/manage/Blocks/ContactBlock/icons/location.svg +1 -0
  41. package/src/components/manage/Blocks/ContactBlock/index.js +17 -0
  42. package/src/components/manage/Blocks/ContactBlock/schema.js +57 -0
  43. package/src/components/manage/Blocks/ContactBlock/styles.less +31 -0
  44. package/src/components/manage/Blocks/ExplodedPiesChart/Pie.jsx +125 -0
  45. package/src/components/manage/Blocks/ExplodedPiesChart/View.jsx +80 -0
  46. package/src/components/manage/Blocks/ExplodedPiesChart/index.js +17 -0
  47. package/src/components/manage/Blocks/ExplodedPiesChart/schema.js +75 -0
  48. package/src/components/manage/Blocks/ExplodedPiesChart/style.less +80 -0
  49. package/src/components/manage/Blocks/ExploreHabitats/Edit.jsx +29 -0
  50. package/src/components/manage/Blocks/ExploreHabitats/View.jsx +177 -0
  51. package/src/components/manage/Blocks/ExploreHabitats/index.js +24 -0
  52. package/src/components/manage/Blocks/ExploreHabitats/schema.js +15 -0
  53. package/src/components/manage/Blocks/ExploreHabitats/style.less +15 -0
  54. package/src/components/manage/Blocks/ExploreSites/Edit.jsx +29 -0
  55. package/src/components/manage/Blocks/ExploreSites/View.jsx +175 -0
  56. package/src/components/manage/Blocks/ExploreSites/index.js +24 -0
  57. package/src/components/manage/Blocks/ExploreSites/schema.js +15 -0
  58. package/src/components/manage/Blocks/ExploreSites/style.less +15 -0
  59. package/src/components/manage/Blocks/ExploreSpecies/Edit.jsx +29 -0
  60. package/src/components/manage/Blocks/ExploreSpecies/View.jsx +177 -0
  61. package/src/components/manage/Blocks/ExploreSpecies/index.js +24 -0
  62. package/src/components/manage/Blocks/ExploreSpecies/schema.js +15 -0
  63. package/src/components/manage/Blocks/ExploreSpecies/style.less +15 -0
  64. package/src/components/manage/Blocks/HabitatClassification/View.jsx +30 -0
  65. package/src/components/manage/Blocks/HabitatClassification/index.js +17 -0
  66. package/src/components/manage/Blocks/HabitatClassification/schema.js +19 -0
  67. package/src/components/manage/Blocks/HabitatClassification/style.less +3 -0
  68. package/src/components/manage/Blocks/HabitatDistribution/View.jsx +97 -0
  69. package/src/components/manage/Blocks/HabitatDistribution/index.js +23 -0
  70. package/src/components/manage/Blocks/HabitatDistribution/schema.js +19 -0
  71. package/src/components/manage/Blocks/HabitatDistribution/style.less +5 -0
  72. package/src/components/manage/Blocks/HabitatProtectedSites/View.jsx +97 -0
  73. package/src/components/manage/Blocks/HabitatProtectedSites/index.js +23 -0
  74. package/src/components/manage/Blocks/HabitatProtectedSites/schema.js +19 -0
  75. package/src/components/manage/Blocks/HabitatProtectedSites/style.less +5 -0
  76. package/src/components/manage/Blocks/HabitatsBanner/View.jsx +39 -0
  77. package/src/components/manage/Blocks/HabitatsBanner/index.js +17 -0
  78. package/src/components/manage/Blocks/HabitatsBanner/schema.js +19 -0
  79. package/src/components/manage/Blocks/HabitatsBanner/style.less +49 -0
  80. package/src/components/manage/Blocks/ImageText/Edit.jsx +98 -0
  81. package/src/components/manage/Blocks/ImageText/View.jsx +66 -0
  82. package/src/components/manage/Blocks/ImageText/index.js +24 -0
  83. package/src/components/manage/Blocks/ImageText/schema.js +69 -0
  84. package/src/components/manage/Blocks/ImageText/styles.less +87 -0
  85. package/src/components/manage/Blocks/Landing/DefalutView.jsx +83 -0
  86. package/src/components/manage/Blocks/Landing/Edit.jsx +219 -0
  87. package/src/components/manage/Blocks/Landing/EditBlockWrapper.jsx +161 -0
  88. package/src/components/manage/Blocks/Landing/View.jsx +65 -0
  89. package/src/components/manage/Blocks/Landing/images/background.webp +0 -0
  90. package/src/components/manage/Blocks/Landing/images/coasts_and_seas.webp +0 -0
  91. package/src/components/manage/Blocks/Landing/images/forests.webp +0 -0
  92. package/src/components/manage/Blocks/Landing/images/grasslands.webp +0 -0
  93. package/src/components/manage/Blocks/Landing/images/hiker.webp +0 -0
  94. package/src/components/manage/Blocks/Landing/images/islands.webp +0 -0
  95. package/src/components/manage/Blocks/Landing/images/mountains.webp +0 -0
  96. package/src/components/manage/Blocks/Landing/images/natura2000.webp +0 -0
  97. package/src/components/manage/Blocks/Landing/images/natura2000_square.webp +0 -0
  98. package/src/components/manage/Blocks/Landing/images/peatlands.webp +0 -0
  99. package/src/components/manage/Blocks/Landing/images/people_and_nature.webp +0 -0
  100. package/src/components/manage/Blocks/Landing/images/rivers.webp +0 -0
  101. package/src/components/manage/Blocks/Landing/index.js +104 -0
  102. package/src/components/manage/Blocks/Landing/schema.js +62 -0
  103. package/src/components/manage/Blocks/Landing/style.less +174 -0
  104. package/src/components/manage/Blocks/List/View.jsx +37 -0
  105. package/src/components/manage/Blocks/List/index.js +17 -0
  106. package/src/components/manage/Blocks/List/schema.js +49 -0
  107. package/src/components/manage/Blocks/List/style.less +12 -0
  108. package/src/components/manage/Blocks/NavigationAnchors/Edit.jsx +33 -0
  109. package/src/components/manage/Blocks/NavigationAnchors/View.jsx +132 -0
  110. package/src/components/manage/Blocks/NavigationAnchors/assets/external.png +0 -0
  111. package/src/components/manage/Blocks/NavigationAnchors/index.js +23 -0
  112. package/src/components/manage/Blocks/NavigationAnchors/schema.js +76 -0
  113. package/src/components/manage/Blocks/NavigationAnchors/styles.less +104 -0
  114. package/src/components/manage/Blocks/SimpleDataTable/index.js +16 -0
  115. package/src/components/manage/Blocks/SimpleDataTable/templates/colored/View.jsx +178 -0
  116. package/src/components/manage/Blocks/SimpleDataTable/templates/colored/index.js +4 -0
  117. package/src/components/manage/Blocks/SimpleDataTable/templates/colored/schema.js +56 -0
  118. package/src/components/manage/Blocks/SimpleDataTable/templates/colored/style.less +54 -0
  119. package/src/components/manage/Blocks/SiteBanner/View.jsx +148 -0
  120. package/src/components/manage/Blocks/SiteBanner/index.js +17 -0
  121. package/src/components/manage/Blocks/SiteBanner/schema.js +19 -0
  122. package/src/components/manage/Blocks/SiteBanner/style.less +106 -0
  123. package/src/components/manage/Blocks/SiteHabitatsList/View.jsx +89 -0
  124. package/src/components/manage/Blocks/SiteHabitatsList/index.js +17 -0
  125. package/src/components/manage/Blocks/SiteHabitatsList/schema.js +19 -0
  126. package/src/components/manage/Blocks/SiteHabitatsList/style.less +70 -0
  127. package/src/components/manage/Blocks/SiteProtectedHabitats/View.jsx +47 -0
  128. package/src/components/manage/Blocks/SiteProtectedHabitats/images/background.webp +0 -0
  129. package/src/components/manage/Blocks/SiteProtectedHabitats/index.js +17 -0
  130. package/src/components/manage/Blocks/SiteProtectedHabitats/schema.js +19 -0
  131. package/src/components/manage/Blocks/SiteProtectedHabitats/style.less +90 -0
  132. package/src/components/manage/Blocks/SiteProtectedSpecies/View.jsx +55 -0
  133. package/src/components/manage/Blocks/SiteProtectedSpecies/images/background.webp +0 -0
  134. package/src/components/manage/Blocks/SiteProtectedSpecies/index.js +17 -0
  135. package/src/components/manage/Blocks/SiteProtectedSpecies/schema.js +19 -0
  136. package/src/components/manage/Blocks/SiteProtectedSpecies/style.less +90 -0
  137. package/src/components/manage/Blocks/SiteShape/View.jsx +107 -0
  138. package/src/components/manage/Blocks/SiteShape/index.js +23 -0
  139. package/src/components/manage/Blocks/SiteShape/schema.js +19 -0
  140. package/src/components/manage/Blocks/SiteShape/style.less +15 -0
  141. package/src/components/manage/Blocks/SiteSpeciesList/Filters/SortBy.jsx +52 -0
  142. package/src/components/manage/Blocks/SiteSpeciesList/Filters/SpeciesGroups.jsx +43 -0
  143. package/src/components/manage/Blocks/SiteSpeciesList/Filters/View.jsx +200 -0
  144. package/src/components/manage/Blocks/SiteSpeciesList/Filters/index.js +4 -0
  145. package/src/components/manage/Blocks/SiteSpeciesList/View.jsx +253 -0
  146. package/src/components/manage/Blocks/SiteSpeciesList/index.js +17 -0
  147. package/src/components/manage/Blocks/SiteSpeciesList/schema.js +19 -0
  148. package/src/components/manage/Blocks/SiteSpeciesList/style.less +264 -0
  149. package/src/components/manage/Blocks/SiteSpeciesList/utils.js +33 -0
  150. package/src/components/manage/Blocks/SlateLink/render.jsx +77 -0
  151. package/src/components/manage/Blocks/SlateLink/styles.less +22 -0
  152. package/src/components/manage/Blocks/SlateSVG/constants.js +1 -0
  153. package/src/components/manage/Blocks/SlateSVG/extensions.js +11 -0
  154. package/src/components/manage/Blocks/SlateSVG/index.js +47 -0
  155. package/src/components/manage/Blocks/SlateSVG/render.jsx +42 -0
  156. package/src/components/manage/Blocks/SlateSVG/schema.js +12 -0
  157. package/src/components/manage/Blocks/SlateSVG/styles.less +6 -0
  158. package/src/components/manage/Blocks/SpeciesBanner/View.jsx +109 -0
  159. package/src/components/manage/Blocks/SpeciesBanner/index.js +17 -0
  160. package/src/components/manage/Blocks/SpeciesBanner/schema.js +19 -0
  161. package/src/components/manage/Blocks/SpeciesBanner/style.less +115 -0
  162. package/src/components/manage/Blocks/SpeciesClassification/View.jsx +19 -0
  163. package/src/components/manage/Blocks/SpeciesClassification/index.js +17 -0
  164. package/src/components/manage/Blocks/SpeciesClassification/schema.js +19 -0
  165. package/src/components/manage/Blocks/SpeciesClassification/style.less +3 -0
  166. package/src/components/manage/Blocks/SpeciesDistribution/View.jsx +97 -0
  167. package/src/components/manage/Blocks/SpeciesDistribution/index.js +23 -0
  168. package/src/components/manage/Blocks/SpeciesDistribution/schema.js +19 -0
  169. package/src/components/manage/Blocks/SpeciesDistribution/style.less +5 -0
  170. package/src/components/manage/Blocks/SpeciesProtectedSites/View.jsx +97 -0
  171. package/src/components/manage/Blocks/SpeciesProtectedSites/index.js +23 -0
  172. package/src/components/manage/Blocks/SpeciesProtectedSites/schema.js +19 -0
  173. package/src/components/manage/Blocks/SpeciesProtectedSites/style.less +5 -0
  174. package/src/components/manage/Blocks/StackedBarChart/Chart.jsx +127 -0
  175. package/src/components/manage/Blocks/StackedBarChart/ChartContext.jsx +3 -0
  176. package/src/components/manage/Blocks/StackedBarChart/StackedBars.jsx +116 -0
  177. package/src/components/manage/Blocks/StackedBarChart/View.jsx +64 -0
  178. package/src/components/manage/Blocks/StackedBarChart/index.js +17 -0
  179. package/src/components/manage/Blocks/StackedBarChart/schema.js +25 -0
  180. package/src/components/manage/Blocks/StackedBarChart/style.less +37 -0
  181. package/src/components/manage/Blocks/TilesImages/Edit.jsx +32 -0
  182. package/src/components/manage/Blocks/TilesImages/View.jsx +37 -0
  183. package/src/components/manage/Blocks/TilesImages/index.js +23 -0
  184. package/src/components/manage/Blocks/TilesImages/schema.js +72 -0
  185. package/src/components/manage/Blocks/TilesImages/styles.less +57 -0
  186. package/src/components/theme/AppExtras/CopyPaste/CopyPaste.jsx +176 -0
  187. package/src/components/theme/AppExtras/CopyPaste/index.js +3 -0
  188. package/src/components/theme/AppExtras/CopyPaste/style.less +18 -0
  189. package/src/components/theme/AppExtras/MultilingualRedirector/MultilingualRedirector.jsx +35 -0
  190. package/src/components/theme/AppExtras/index.js +13 -0
  191. package/src/components/theme/Footer/Footer.jsx +209 -0
  192. package/src/components/theme/Header/Header.jsx +81 -0
  193. package/src/components/theme/LanguageSelector/LanguageSelector.jsx +79 -0
  194. package/src/components/theme/LanguageSelector/styles.less +44 -0
  195. package/src/components/theme/Navigation/Navigation.jsx +453 -0
  196. package/src/components/theme/Sitemap/Sitemap.jsx +152 -0
  197. package/src/fonts/OpenSans-Bold.ttf +0 -0
  198. package/src/fonts/OpenSans-Regular.ttf +0 -0
  199. package/src/fonts/OpenSans-Semibold.ttf +0 -0
  200. package/src/fonts/Rajdhani-Bold.ttf +0 -0
  201. package/src/fonts/Rajdhani-Regular.ttf +0 -0
  202. package/src/grid.js +78 -0
  203. package/src/helpers.js +148 -0
  204. package/src/hocs/index.js +6 -0
  205. package/src/hocs/useResizeObserver.jsx +26 -0
  206. package/src/hocs/withLocalStorage.jsx +37 -0
  207. package/src/hocs/withScreenSize.jsx +43 -0
  208. package/src/icons/home.svg +12 -0
  209. package/src/icons/info.svg +5 -0
  210. package/src/icons/n2k-logo-transparent.png +0 -0
  211. package/src/icons/n2k-logo.png +0 -0
  212. package/src/icons/natura2000.svg +142 -0
  213. package/src/icons/placeholders/Algae.png +0 -0
  214. package/src/icons/placeholders/Amphibians.png +0 -0
  215. package/src/icons/placeholders/Birds.png +0 -0
  216. package/src/icons/placeholders/Conifers.png +0 -0
  217. package/src/icons/placeholders/Fishes.png +0 -0
  218. package/src/icons/placeholders/Fungi.png +0 -0
  219. package/src/icons/placeholders/Mammals.png +0 -0
  220. package/src/icons/placeholders/Plants.png +0 -0
  221. package/src/icons/placeholders/Reptiles.png +0 -0
  222. package/src/icons/placeholders/default.png +0 -0
  223. package/src/index.js +163 -0
  224. package/src/less/globals.less +3 -0
  225. package/src/less/styles.less +691 -0
  226. package/src/less/variables.less +2 -0
  227. package/src/static/cca.svg +61 -0
  228. package/src/static/ec.png +0 -0
  229. package/src/static/eea.png +0 -0
  230. package/src/static/eu.jpg +0 -0
  231. package/src/static/forest.svg +100 -0
  232. package/src/static/wise.png +0 -0
  233. package/src/store.js +24 -0
@@ -0,0 +1,177 @@
1
+ import React, { useState, useEffect } from 'react';
2
+ import { Message, Container } from 'semantic-ui-react';
3
+ import { connect } from 'react-redux';
4
+ import Map from '@eeacms/volto-openlayers-map/Map';
5
+ import { Interactions } from '@eeacms/volto-openlayers-map/Interactions';
6
+ import { Controls } from '@eeacms/volto-openlayers-map/Controls';
7
+ import { Layers, Layer } from '@eeacms/volto-openlayers-map/Layers';
8
+ import { openlayers } from '@eeacms/volto-openlayers-map';
9
+ import { getActiveSpeciesURL } from './index';
10
+ import './style.less';
11
+
12
+ const View = (props) => {
13
+ const [options, setOptions] = React.useState({});
14
+ const [vectorSource, setVectorSource] = useState(null);
15
+ const [tileWMSSource, setTileWMSSource] = useState(null);
16
+ const { extent, format, proj, style, source } = openlayers;
17
+
18
+ const { results = [], payload = {} } = props.search || {};
19
+
20
+ const activePageResults = results.filter((_, index) => {
21
+ return (
22
+ index >= (payload?.activePage - 1) * payload?.row_size &&
23
+ index <= payload?.activePage * payload?.row_size - 1
24
+ );
25
+ });
26
+
27
+ useEffect(() => {
28
+ if (__SERVER__) return;
29
+ setVectorSource(new source.Vector());
30
+ setTileWMSSource(
31
+ new source.TileWMS({
32
+ extent: [
33
+ -3690067.3068000004,
34
+ 3129776.6937999986,
35
+ 3858418.0045999996,
36
+ 1.1124223900300004e7,
37
+ ],
38
+ url:
39
+ 'https://bio.discomap.eea.europa.eu/arcgis/services/Article17/HabitatsDirective_ART_17_WMS_version_2020_08_public/MapServer/WmsServer',
40
+ params: { LAYERS: '7', TILED: true },
41
+ serverType: 'geoserver',
42
+ // Countries have transparency, so do not fade tiles:
43
+ transition: 0,
44
+ }),
45
+ );
46
+ /* eslint-disable-next-line */
47
+ }, []);
48
+
49
+ useEffect(() => {
50
+ if (__SERVER__ || !vectorSource) {
51
+ return;
52
+ }
53
+
54
+ if (activePageResults.length === 0 && vectorSource) {
55
+ vectorSource.clear();
56
+ setOptions({
57
+ ...options,
58
+ extent: new extent.buffer(
59
+ [
60
+ -3690067.3068000004,
61
+ 3129776.6937999986,
62
+ 3858418.0045999996,
63
+ 1.1124223900300004e7,
64
+ ],
65
+ -3690067.3068000004 * 0.01,
66
+ ),
67
+ });
68
+ return;
69
+ }
70
+
71
+ const esrijsonFormat = new format.EsriJSON();
72
+
73
+ // Get species of active page
74
+ fetch(
75
+ getActiveSpeciesURL(
76
+ activePageResults.map((item) => `'${item.code_2000}'`),
77
+ ),
78
+ ).then(function (response) {
79
+ if (response.status !== 200) return;
80
+
81
+ vectorSource.clear();
82
+
83
+ response.json().then(function (data) {
84
+ if (data.features && data.features.length > 0) {
85
+ const features = esrijsonFormat.readFeatures(data);
86
+ if (features.length > 0) {
87
+ vectorSource.addFeatures(features);
88
+ const vectorExtent = vectorSource.getExtent();
89
+ let size = extent.getSize(vectorExtent);
90
+ setOptions({
91
+ ...options,
92
+ extent: new extent.buffer(vectorExtent, size[0] * 0.03),
93
+ });
94
+ }
95
+ }
96
+ });
97
+ });
98
+ /* eslint-disable-next-line */
99
+ }, [JSON.stringify(activePageResults)]);
100
+
101
+ if (__SERVER__ || !vectorSource) return '';
102
+ return (
103
+ <div className="explore-species-wrapper full-width">
104
+ <div className="explore-species">
105
+ <Map
106
+ view={{
107
+ center: proj.fromLonLat([20, 50]),
108
+ showFullExtent: true,
109
+ zoom: 5,
110
+ }}
111
+ {...options}
112
+ >
113
+ <Layers>
114
+ <Layer.Tile zIndex={0} />
115
+ <Layer.Tile source={tileWMSSource} zIndex={1} />
116
+ <Layer.Vector
117
+ source={vectorSource}
118
+ title="highlightLayer"
119
+ style={
120
+ new style.Style({
121
+ fill: new style.Fill({
122
+ color: 'rgba(255,255,255,0.4)',
123
+ }),
124
+ stroke: new style.Stroke({
125
+ color: '#04A77D',
126
+ // color: '#F8E473',
127
+ width: 3,
128
+ }),
129
+ image: new style.Circle({
130
+ radius: 5,
131
+ fill: new style.Fill({ color: 'rgba(4, 167, 125,0.6)' }),
132
+ // fill: new style.Fill({ color: 'rgba(248,228,115,0.6)' }),
133
+ stroke: new style.Stroke({
134
+ color: 'rgba(242, 180, 87, 1)',
135
+ width: 2,
136
+ }),
137
+ }),
138
+ })
139
+ }
140
+ zIndex={2}
141
+ />
142
+ </Layers>
143
+ <Controls attribution={true} zoom={false} />
144
+ <Interactions
145
+ doubleClickZoom={true}
146
+ dragAndDrop={false}
147
+ dragPan={true}
148
+ keyboardPan={true}
149
+ keyboardZoom={true}
150
+ mouseWheelZoom={true}
151
+ pointer={false}
152
+ select={false}
153
+ />
154
+ </Map>
155
+ </div>
156
+ <Container className="map-info-notice">
157
+ <Message style={{ color: '#3B7f02' }}>
158
+ <p>
159
+ The designations employed and the presentation of material on this
160
+ map do not imply the expression of any opinion whatsoever on the
161
+ part of the European Union concerning the legal status of any
162
+ country, territory, city or area or of its authorities, or
163
+ concerning the delimitation of its frontiers or boundaries.
164
+ </p>
165
+ <p>
166
+ <strong>Note:</strong> When you perform a search we will highlight
167
+ only the results available on the active page of the results table.
168
+ </p>
169
+ </Message>
170
+ </Container>
171
+ </div>
172
+ );
173
+ };
174
+
175
+ export default connect((state) => ({
176
+ search: state.table_search || {},
177
+ }))(View);
@@ -0,0 +1,24 @@
1
+ import ExploreSpeciesEdit from './Edit';
2
+ import ExploreSpeciesView from './View';
3
+
4
+ import worldSVG from '@plone/volto/icons/world.svg';
5
+
6
+ export function getActiveSpeciesURL(site_codes) {
7
+ return encodeURI(
8
+ `https://bio.discomap.eea.europa.eu/arcgis/rest/services/Article17/HabitatsDirective_ART_17_WMS_version_2020_08_public/MapServer/3/query?f=json&where=speciescode IN (${site_codes.join(
9
+ ',',
10
+ )})&returnGeometry=true&spatialRel=esriSpatialRelIntersects&outFields=OBJECTID,speciescode&outSR=102100`,
11
+ );
12
+ }
13
+
14
+ export default (config) => {
15
+ config.blocks.blocksConfig.explore_species_map = {
16
+ id: 'explore_species_map',
17
+ title: 'Explore species map',
18
+ icon: worldSVG,
19
+ group: 'natura_2000',
20
+ edit: ExploreSpeciesEdit,
21
+ view: ExploreSpeciesView,
22
+ };
23
+ return config;
24
+ };
@@ -0,0 +1,15 @@
1
+ export default {
2
+ title: 'Explore species map',
3
+
4
+ fieldsets: [
5
+ {
6
+ id: 'default',
7
+ title: 'Default',
8
+ fields: [],
9
+ },
10
+ ],
11
+
12
+ properties: {},
13
+
14
+ required: [],
15
+ };
@@ -0,0 +1,15 @@
1
+ div#view .ui.container > .explore-species-wrapper,
2
+ div#view .ui.container > .explore-species {
3
+ margin-bottom: 0;
4
+ }
5
+
6
+ .explore-species {
7
+ display: flex;
8
+ justify-content: center;
9
+ margin-bottom: 0;
10
+ background-color: #f8f8f8;
11
+
12
+ &.visible.transition {
13
+ display: flex !important;
14
+ }
15
+ }
@@ -0,0 +1,30 @@
1
+ import React from 'react';
2
+ import { UniversalLink } from '@plone/volto/components';
3
+ import './style.less';
4
+
5
+ const View = (props) => {
6
+ const provider_data = props.provider_data || {};
7
+ const { habitat_code = [], level = [], scientific_name = [] } = provider_data;
8
+ const rows = habitat_code?.length || 0;
9
+
10
+ return (
11
+ <div className="habitat-classification">
12
+ {props.mode === 'edit' ? <p>Habitat classification</p> : ''}
13
+ {Array(Math.max(0, rows))
14
+ .fill()
15
+ .map((_, row) => (
16
+ <p
17
+ key={`classification-${scientific_name[row]}`}
18
+ className={`level-${level[row]}`}
19
+ style={{ marginLeft: `${level[row] - 1}rem` }}
20
+ >
21
+ <UniversalLink href="#">
22
+ {habitat_code[row]}. {scientific_name[row]}
23
+ </UniversalLink>
24
+ </p>
25
+ ))}
26
+ </div>
27
+ );
28
+ };
29
+
30
+ export default View;
@@ -0,0 +1,17 @@
1
+ import HabitatClassification from './View';
2
+ import getSchema from './schema';
3
+
4
+ export default (config) => {
5
+ config.blocks.blocksConfig.custom_connected_block = {
6
+ ...config.blocks.blocksConfig.custom_connected_block,
7
+ blocks: {
8
+ ...config.blocks.blocksConfig.custom_connected_block.blocks,
9
+ habitat_classification: {
10
+ view: HabitatClassification,
11
+ getSchema: getSchema,
12
+ title: 'Habitat classification',
13
+ },
14
+ },
15
+ };
16
+ return config;
17
+ };
@@ -0,0 +1,19 @@
1
+ const getSchema = (props) => {
2
+ return {
3
+ title: 'Habitat classification',
4
+
5
+ fieldsets: [
6
+ {
7
+ id: 'default',
8
+ title: 'Default',
9
+ fields: [],
10
+ },
11
+ ],
12
+
13
+ properties: {},
14
+
15
+ required: [],
16
+ };
17
+ };
18
+
19
+ export default getSchema;
@@ -0,0 +1,3 @@
1
+ // .habitat-classification {
2
+
3
+ // }
@@ -0,0 +1,97 @@
1
+ import React, { useState, useEffect } from 'react';
2
+ import { Message, Container } from 'semantic-ui-react';
3
+ import Map from '@eeacms/volto-openlayers-map/Map';
4
+ import { Interactions } from '@eeacms/volto-openlayers-map/Interactions';
5
+ import { Controls } from '@eeacms/volto-openlayers-map/Controls';
6
+ import { Layers, Layer } from '@eeacms/volto-openlayers-map/Layers';
7
+ import { openlayers } from '@eeacms/volto-openlayers-map';
8
+ import { getHabitatDistributionURL } from './index';
9
+ import './style.less';
10
+
11
+ const View = (props) => {
12
+ const [options, setOptions] = React.useState({});
13
+ const [vectorSource, setVectorSource] = useState(null);
14
+ const { extent, format, proj, style, source } = openlayers;
15
+ const provider_data = props.provider_data || {};
16
+ const { code_2000 = [] } = provider_data;
17
+
18
+ useEffect(() => {
19
+ if (__SERVER__) return;
20
+ setVectorSource(new source.Vector());
21
+ /* eslint-disable-next-line */
22
+ }, []);
23
+
24
+ useEffect(() => {
25
+ if (__SERVER__ || !vectorSource || !code_2000[0]) return;
26
+ const esrijsonFormat = new format.EsriJSON();
27
+ // Get habitat location on sites
28
+ fetch(getHabitatDistributionURL(code_2000[0])).then(function (response) {
29
+ if (response.status !== 200) return;
30
+ response.json().then(function (data) {
31
+ if (data.features && data.features.length > 0) {
32
+ const features = esrijsonFormat.readFeatures(data);
33
+ if (features.length > 0) {
34
+ vectorSource.addFeatures(features);
35
+ const vectorExtent = vectorSource.getExtent();
36
+ let size = extent.getSize(vectorExtent);
37
+ setOptions({
38
+ ...options,
39
+ extent: new extent.buffer(vectorExtent, size[0] * 0.1),
40
+ });
41
+ }
42
+ }
43
+ });
44
+ });
45
+ /* eslint-disable-next-line */
46
+ }, [code_2000?.[0]]);
47
+
48
+ if (__SERVER__ || !vectorSource) return '';
49
+ return (
50
+ <div className="habitat-distribution-wrapper">
51
+ <div className="habitat-distribution">
52
+ <Map
53
+ view={{
54
+ center: proj.fromLonLat([20, 50]),
55
+ showFullExtent: true,
56
+ zoom: 5,
57
+ }}
58
+ {...options}
59
+ >
60
+ <Layers>
61
+ <Layer.Tile zIndex={0} />
62
+ <Layer.Vector
63
+ source={vectorSource}
64
+ style={
65
+ new style.Style({
66
+ fill: new style.Fill({
67
+ color: 'rgba(255,255,255,0.4)',
68
+ }),
69
+ stroke: new style.Stroke({
70
+ color: '#04A77D',
71
+ width: 3,
72
+ }),
73
+ })
74
+ }
75
+ zIndex={1}
76
+ />
77
+ </Layers>
78
+ <Controls attribution={true} />
79
+ <Interactions pointer={false} select={false} />
80
+ </Map>
81
+ </div>
82
+ <Container className="map-info-notice">
83
+ <Message>
84
+ <p>
85
+ The designations employed and the presentation of material on this
86
+ map do not imply the expression of any opinion whatsoever on the
87
+ part of the European Union concerning the legal status of any
88
+ country, territory, city or area or of its authorities, or
89
+ concerning the delimitation of its frontiers or boundaries.
90
+ </p>
91
+ </Message>
92
+ </Container>
93
+ </div>
94
+ );
95
+ };
96
+
97
+ export default View;
@@ -0,0 +1,23 @@
1
+ import HabitatDistributionView from './View';
2
+ import getSchema from './schema';
3
+
4
+ export function getHabitatDistributionURL(code_2000) {
5
+ return encodeURI(
6
+ `https://bio.discomap.eea.europa.eu/arcgis/rest/services/Article17/HabitatsDirective_ART_17_WMS_version_2020_08_public/MapServer/1/query?f=json&where=habitatcode LIKE '%${code_2000.toUpperCase()}%'&returnGeometry=true&spatialRel=esriSpatialRelIntersects&outFields=habitatcode,OBJECTID&outSR=102100`,
7
+ );
8
+ }
9
+
10
+ export default (config) => {
11
+ config.blocks.blocksConfig.custom_connected_block = {
12
+ ...config.blocks.blocksConfig.custom_connected_block,
13
+ blocks: {
14
+ ...config.blocks.blocksConfig.custom_connected_block.blocks,
15
+ habitat_distribution: {
16
+ view: HabitatDistributionView,
17
+ getSchema: getSchema,
18
+ title: 'Habitat distribution map',
19
+ },
20
+ },
21
+ };
22
+ return config;
23
+ };
@@ -0,0 +1,19 @@
1
+ const getSchema = (props) => {
2
+ return {
3
+ title: 'Habitat distribution map',
4
+
5
+ fieldsets: [
6
+ {
7
+ id: 'default',
8
+ title: 'Default',
9
+ fields: [],
10
+ },
11
+ ],
12
+
13
+ properties: {},
14
+
15
+ required: [],
16
+ };
17
+ };
18
+
19
+ export default getSchema;
@@ -0,0 +1,5 @@
1
+ .habitat-distribution {
2
+ display: flex;
3
+ justify-content: center;
4
+ margin-bottom: 0;
5
+ }
@@ -0,0 +1,97 @@
1
+ import React, { useState, useEffect } from 'react';
2
+ import { Message, Container } from 'semantic-ui-react';
3
+ import Map from '@eeacms/volto-openlayers-map/Map';
4
+ import { Interactions } from '@eeacms/volto-openlayers-map/Interactions';
5
+ import { Controls } from '@eeacms/volto-openlayers-map/Controls';
6
+ import { Layers, Layer } from '@eeacms/volto-openlayers-map/Layers';
7
+ import { openlayers } from '@eeacms/volto-openlayers-map';
8
+ import { getHabitatProtectedSitesURL } from './index';
9
+ import './style.less';
10
+
11
+ const View = (props) => {
12
+ const [options, setOptions] = React.useState({});
13
+ const [vectorSource, setVectorSource] = useState(null);
14
+ const { extent, format, proj, style, source } = openlayers;
15
+ const provider_data = props.provider_data || {};
16
+ const { code_2000 = [] } = provider_data;
17
+
18
+ useEffect(() => {
19
+ if (__SERVER__) return;
20
+ setVectorSource(new source.Vector());
21
+ /* eslint-disable-next-line */
22
+ }, []);
23
+
24
+ useEffect(() => {
25
+ if (__SERVER__ || !vectorSource || !code_2000[0]) return;
26
+ const esrijsonFormat = new format.EsriJSON();
27
+ // Get habitat protected sites
28
+ fetch(getHabitatProtectedSitesURL(code_2000[0])).then(function (response) {
29
+ if (response.status !== 200) return;
30
+ response.json().then(function (data) {
31
+ if (data.features && data.features.length > 0) {
32
+ const features = esrijsonFormat.readFeatures(data);
33
+ if (features.length > 0) {
34
+ vectorSource.addFeatures(features);
35
+ const vectorExtent = vectorSource.getExtent();
36
+ let size = extent.getSize(vectorExtent);
37
+ setOptions({
38
+ ...options,
39
+ extent: new extent.buffer(vectorExtent, size[0] * 0.1),
40
+ });
41
+ }
42
+ }
43
+ });
44
+ });
45
+ /* eslint-disable-next-line */
46
+ }, [code_2000?.[0]]);
47
+
48
+ if (__SERVER__ || !vectorSource) return '';
49
+ return (
50
+ <div className="habitat-protectes-sites-wrapper">
51
+ <div className="habitat-protectes-sites">
52
+ <Map
53
+ view={{
54
+ center: proj.fromLonLat([20, 50]),
55
+ showFullExtent: true,
56
+ zoom: 5,
57
+ }}
58
+ {...options}
59
+ >
60
+ <Layers>
61
+ <Layer.Tile zIndex={0} />
62
+ <Layer.VectorImage
63
+ source={vectorSource}
64
+ style={
65
+ new style.Style({
66
+ fill: new style.Fill({
67
+ color: 'rgba(255,255,255,0.4)',
68
+ }),
69
+ stroke: new style.Stroke({
70
+ color: '#04A77D',
71
+ width: 3,
72
+ }),
73
+ })
74
+ }
75
+ zIndex={1}
76
+ />
77
+ </Layers>
78
+ <Controls attribution={true} />
79
+ <Interactions pointer={false} select={false} />
80
+ </Map>
81
+ </div>
82
+ <Container className="map-info-notice">
83
+ <Message>
84
+ <p>
85
+ The designations employed and the presentation of material on this
86
+ map do not imply the expression of any opinion whatsoever on the
87
+ part of the European Union concerning the legal status of any
88
+ country, territory, city or area or of its authorities, or
89
+ concerning the delimitation of its frontiers or boundaries.
90
+ </p>
91
+ </Message>
92
+ </Container>
93
+ </div>
94
+ );
95
+ };
96
+
97
+ export default View;
@@ -0,0 +1,23 @@
1
+ import HabitatProtectedSitesView from './View';
2
+ import getSchema from './schema';
3
+
4
+ export function getHabitatProtectedSitesURL(code_2000) {
5
+ return encodeURI(
6
+ `https://bio.discomap.eea.europa.eu/arcgis/rest/services/ProtectedSites/EUNIS_Website_Dyna_WM/MapServer/1/query?f=json&where=HABITATCODE LIKE '%${code_2000.toUpperCase()}%'&returnGeometry=true&spatialRel=esriSpatialRelIntersects&outFields=SPECIESCODE,SITECODE,HABITATCODE,OBJECTID&outSR=102100`,
7
+ );
8
+ }
9
+
10
+ export default (config) => {
11
+ config.blocks.blocksConfig.custom_connected_block = {
12
+ ...config.blocks.blocksConfig.custom_connected_block,
13
+ blocks: {
14
+ ...config.blocks.blocksConfig.custom_connected_block.blocks,
15
+ habitat_protected_sites: {
16
+ view: HabitatProtectedSitesView,
17
+ getSchema: getSchema,
18
+ title: 'Habitat protectes sites map',
19
+ },
20
+ },
21
+ };
22
+ return config;
23
+ };
@@ -0,0 +1,19 @@
1
+ const getSchema = (props) => {
2
+ return {
3
+ title: 'Habitat protectes sites map',
4
+
5
+ fieldsets: [
6
+ {
7
+ id: 'default',
8
+ title: 'Default',
9
+ fields: [],
10
+ },
11
+ ],
12
+
13
+ properties: {},
14
+
15
+ required: [],
16
+ };
17
+ };
18
+
19
+ export default getSchema;
@@ -0,0 +1,5 @@
1
+ .habitat-protectes-sites {
2
+ display: flex;
3
+ justify-content: center;
4
+ margin-bottom: 0;
5
+ }
@@ -0,0 +1,39 @@
1
+ import React from 'react';
2
+ import { Container } from 'semantic-ui-react';
3
+ import './style.less';
4
+
5
+ const View = (props) => {
6
+ const provider_data = props.provider_data || {};
7
+ const {
8
+ code_2000 = [],
9
+ // habitat_description = [],
10
+ habitat_prioriy = [],
11
+ habitat_type = [],
12
+ // number_countries = [],
13
+ // number_sites = [],
14
+ scientific_name = [],
15
+ } = provider_data;
16
+
17
+ if (!code_2000[0]) return '';
18
+ return (
19
+ <div className="habitat-banner-details full-width">
20
+ <Container>
21
+ <div className="habitat-details">
22
+ <div className="habitat-metadata">
23
+ <h2 className="name">{scientific_name[0]}</h2>
24
+ <p className="info">
25
+ {habitat_type[0]} {code_2000[0]}
26
+ </p>
27
+ {habitat_prioriy[0] ? (
28
+ <p className="info">Priority habitat {habitat_prioriy[0]}</p>
29
+ ) : (
30
+ ''
31
+ )}
32
+ </div>
33
+ </div>
34
+ </Container>
35
+ </div>
36
+ );
37
+ };
38
+
39
+ export default View;
@@ -0,0 +1,17 @@
1
+ import HabitatsBannerView from './View';
2
+ import getSchema from './schema';
3
+
4
+ export default (config) => {
5
+ config.blocks.blocksConfig.custom_connected_block = {
6
+ ...config.blocks.blocksConfig.custom_connected_block,
7
+ blocks: {
8
+ ...config.blocks.blocksConfig.custom_connected_block.blocks,
9
+ habitats_banner: {
10
+ view: HabitatsBannerView,
11
+ getSchema: getSchema,
12
+ title: 'Habitat banner',
13
+ },
14
+ },
15
+ };
16
+ return config;
17
+ };
@@ -0,0 +1,19 @@
1
+ const getSchema = (props) => {
2
+ return {
3
+ title: 'Habitats banner',
4
+
5
+ fieldsets: [
6
+ {
7
+ id: 'default',
8
+ title: 'Default',
9
+ fields: [],
10
+ },
11
+ ],
12
+
13
+ properties: {},
14
+
15
+ required: [],
16
+ };
17
+ };
18
+
19
+ export default getSchema;