react-spatial 2.0.0-beta.1 → 2.0.0-beta.2

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 (213) hide show
  1. package/README.md +5 -10
  2. package/components/BaseLayerSwitcher/BaseLayerSwitcher.js +243 -220
  3. package/components/BaseLayerSwitcher/BaseLayerSwitcher.js.map +7 -1
  4. package/components/BaseLayerSwitcher/BaseLayerSwitcher.scss +6 -5
  5. package/components/BaseLayerSwitcher/index.js +1 -3
  6. package/components/BaseLayerSwitcher/index.js.map +7 -1
  7. package/components/BasicMap/BasicMap.js +165 -285
  8. package/components/BasicMap/BasicMap.js.map +7 -1
  9. package/components/BasicMap/index.js +1 -3
  10. package/components/BasicMap/index.js.map +7 -1
  11. package/components/CanvasSaveButton/CanvasSaveButton.js +434 -556
  12. package/components/CanvasSaveButton/CanvasSaveButton.js.map +7 -1
  13. package/components/CanvasSaveButton/CanvasSaveButton.md.scss +1 -1
  14. package/components/CanvasSaveButton/index.js +1 -3
  15. package/components/CanvasSaveButton/index.js.map +7 -1
  16. package/components/Copyright/Copyright.js +44 -77
  17. package/components/Copyright/Copyright.js.map +7 -1
  18. package/components/Copyright/index.js +1 -3
  19. package/components/Copyright/index.js.map +7 -1
  20. package/components/FeatureExportButton/FeatureExportButton.js +44 -92
  21. package/components/FeatureExportButton/FeatureExportButton.js.map +7 -1
  22. package/components/FeatureExportButton/index.js +1 -3
  23. package/components/FeatureExportButton/index.js.map +7 -1
  24. package/components/FitExtent/FitExtent.js +31 -46
  25. package/components/FitExtent/FitExtent.js.map +7 -1
  26. package/components/FitExtent/index.js +1 -3
  27. package/components/FitExtent/index.js.map +7 -1
  28. package/components/Geolocation/Geolocation.js +158 -228
  29. package/components/Geolocation/Geolocation.js.map +7 -1
  30. package/components/Geolocation/Geolocation.scss +7 -5
  31. package/components/Geolocation/index.js +1 -3
  32. package/components/Geolocation/index.js.map +7 -1
  33. package/components/LayerTree/LayerTree.js +359 -357
  34. package/components/LayerTree/LayerTree.js.map +7 -1
  35. package/components/LayerTree/LayerTree.scss +4 -6
  36. package/components/LayerTree/index.js +1 -3
  37. package/components/LayerTree/index.js.map +7 -1
  38. package/components/MousePosition/MousePosition.js +71 -109
  39. package/components/MousePosition/MousePosition.js.map +7 -1
  40. package/components/MousePosition/index.js +1 -3
  41. package/components/MousePosition/index.js.map +7 -1
  42. package/components/NorthArrow/NorthArrow.js +37 -61
  43. package/components/NorthArrow/NorthArrow.js.map +7 -1
  44. package/components/NorthArrow/index.js +1 -3
  45. package/components/NorthArrow/index.js.map +7 -1
  46. package/components/Overlay/Overlay.js +93 -123
  47. package/components/Overlay/Overlay.js.map +7 -1
  48. package/components/Overlay/index.js +1 -3
  49. package/components/Overlay/index.js.map +7 -1
  50. package/components/Permalink/Permalink.js +194 -229
  51. package/components/Permalink/Permalink.js.map +7 -1
  52. package/components/Permalink/index.js +1 -3
  53. package/components/Permalink/index.js.map +7 -1
  54. package/components/Popup/Popup.js +139 -215
  55. package/components/Popup/Popup.js.map +7 -1
  56. package/components/Popup/Popup.md.scss +1 -0
  57. package/components/Popup/Popup.scss +3 -1
  58. package/components/Popup/index.js +1 -3
  59. package/components/Popup/index.js.map +7 -1
  60. package/components/ResizeHandler/ResizeHandler.js +88 -137
  61. package/components/ResizeHandler/ResizeHandler.js.map +7 -1
  62. package/components/ResizeHandler/index.js +1 -3
  63. package/components/ResizeHandler/index.js.map +7 -1
  64. package/components/RouteSchedule/RouteSchedule.js +227 -277
  65. package/components/RouteSchedule/RouteSchedule.js.map +7 -1
  66. package/components/RouteSchedule/RouteSchedule.md.scss +4 -2
  67. package/components/RouteSchedule/RouteSchedule.scss +12 -23
  68. package/components/RouteSchedule/index.js +1 -3
  69. package/components/RouteSchedule/index.js.map +7 -1
  70. package/components/ScaleLine/ScaleLine.js +17 -39
  71. package/components/ScaleLine/ScaleLine.js.map +7 -1
  72. package/components/ScaleLine/ScaleLine.scss +6 -4
  73. package/components/ScaleLine/index.js +1 -3
  74. package/components/ScaleLine/index.js.map +7 -1
  75. package/components/StopsFinder/StopsFinder.js +134 -162
  76. package/components/StopsFinder/StopsFinder.js.map +7 -1
  77. package/components/StopsFinder/StopsFinderOption.js +30 -60
  78. package/components/StopsFinder/StopsFinderOption.js.map +7 -1
  79. package/components/StopsFinder/index.js +1 -3
  80. package/components/StopsFinder/index.js.map +7 -1
  81. package/components/Zoom/Zoom.js +102 -106
  82. package/components/Zoom/Zoom.js.map +7 -1
  83. package/components/Zoom/Zoom.md.scss +3 -1
  84. package/components/Zoom/Zoom.scss +7 -5
  85. package/components/Zoom/index.js +1 -3
  86. package/components/Zoom/index.js.map +7 -1
  87. package/images/geops_qr.png +0 -0
  88. package/package.json +88 -182
  89. package/propTypes.js +36 -24
  90. package/propTypes.js.map +7 -1
  91. package/setupTests.js +21 -4
  92. package/setupTests.js.map +7 -1
  93. package/themes/README.md +26 -0
  94. package/themes/default/components.scss +9 -14
  95. package/themes/default/examples.scss +20 -20
  96. package/themes/default/index.scss +3 -3
  97. package/themes/default/mixins.scss +7 -5
  98. package/themes/default/variables.scss +27 -25
  99. package/utils/GlobalsForOle.js +72 -73
  100. package/utils/GlobalsForOle.js.map +7 -1
  101. package/utils/KML.js +320 -381
  102. package/utils/KML.js.map +7 -1
  103. package/utils/Styles.js +25 -33
  104. package/utils/Styles.js.map +7 -1
  105. package/utils/getLayersAsFlatArray.js +14 -0
  106. package/utils/getLayersAsFlatArray.js.map +7 -0
  107. package/utils/getPolygonPattern.js +11 -44
  108. package/utils/getPolygonPattern.js.map +7 -1
  109. package/utils/timeUtils.js +20 -35
  110. package/utils/timeUtils.js.map +7 -1
  111. package/LayerService.js +0 -193
  112. package/LayerService.js.map +0 -1
  113. package/LayerService.test.js +0 -160
  114. package/LayerService.test.js.map +0 -1
  115. package/Projections.js +0 -16
  116. package/Projections.js.map +0 -1
  117. package/components/BaseLayerSwitcher/BaseLayerSwitcher.test.js +0 -88
  118. package/components/BaseLayerSwitcher/BaseLayerSwitcher.test.js.map +0 -1
  119. package/components/BaseLayerToggler/BaseLayerToggler.js +0 -490
  120. package/components/BaseLayerToggler/BaseLayerToggler.js.map +0 -1
  121. package/components/BaseLayerToggler/BaseLayerToggler.md.scss +0 -9
  122. package/components/BaseLayerToggler/BaseLayerToggler.scss +0 -49
  123. package/components/BaseLayerToggler/BaseLayerToggler.test.js +0 -127
  124. package/components/BaseLayerToggler/BaseLayerToggler.test.js.map +0 -1
  125. package/components/BaseLayerToggler/index.js +0 -3
  126. package/components/BaseLayerToggler/index.js.map +0 -1
  127. package/components/BasicMap/BasicMap.test.js +0 -288
  128. package/components/BasicMap/BasicMap.test.js.map +0 -1
  129. package/components/CanvasSaveButton/CanvasSaveButton.test.js +0 -173
  130. package/components/CanvasSaveButton/CanvasSaveButton.test.js.map +0 -1
  131. package/components/Copyright/Copyright.test.js +0 -133
  132. package/components/Copyright/Copyright.test.js.map +0 -1
  133. package/components/FeatureExportButton/FeatureExportButton.test.js +0 -407
  134. package/components/FeatureExportButton/FeatureExportButton.test.js.map +0 -1
  135. package/components/FilterButton/FilterButton.js +0 -131
  136. package/components/FilterButton/FilterButton.js.map +0 -1
  137. package/components/FilterButton/FilterButton.scss +0 -36
  138. package/components/FilterButton/FilterButton.test.js +0 -48
  139. package/components/FilterButton/FilterButton.test.js.map +0 -1
  140. package/components/FilterButton/index.js +0 -3
  141. package/components/FilterButton/index.js.map +0 -1
  142. package/components/FitExtent/FitExtent.test.js +0 -44
  143. package/components/FitExtent/FitExtent.test.js.map +0 -1
  144. package/components/FollowButton/FollowButton.js +0 -143
  145. package/components/FollowButton/FollowButton.js.map +0 -1
  146. package/components/FollowButton/FollowButton.scss +0 -36
  147. package/components/FollowButton/FollowButton.test.js +0 -57
  148. package/components/FollowButton/FollowButton.test.js.map +0 -1
  149. package/components/FollowButton/index.js +0 -3
  150. package/components/FollowButton/index.js.map +0 -1
  151. package/components/Geolocation/Geolocation.test.js +0 -263
  152. package/components/Geolocation/Geolocation.test.js.map +0 -1
  153. package/components/LayerTree/LayerTree.test.js +0 -323
  154. package/components/LayerTree/LayerTree.test.js.map +0 -1
  155. package/components/MousePosition/MousePosition.test.js +0 -125
  156. package/components/MousePosition/MousePosition.test.js.map +0 -1
  157. package/components/NorthArrow/NorthArrow.test.js +0 -106
  158. package/components/NorthArrow/NorthArrow.test.js.map +0 -1
  159. package/components/Overlay/Overlay.test.js +0 -145
  160. package/components/Overlay/Overlay.test.js.map +0 -1
  161. package/components/Permalink/Permalink.test.js +0 -267
  162. package/components/Permalink/Permalink.test.js.map +0 -1
  163. package/components/Popup/Popup.test.js +0 -291
  164. package/components/Popup/Popup.test.js.map +0 -1
  165. package/components/ResizeHandler/ResizeHandler.test.js +0 -410
  166. package/components/ResizeHandler/ResizeHandler.test.js.map +0 -1
  167. package/components/RouteSchedule/RouteSchedule.test.js +0 -102
  168. package/components/RouteSchedule/RouteSchedule.test.js.map +0 -1
  169. package/components/ScaleLine/ScaleLine.test.js +0 -32
  170. package/components/ScaleLine/ScaleLine.test.js.map +0 -1
  171. package/components/Search/Search.js +0 -230
  172. package/components/Search/Search.js.map +0 -1
  173. package/components/Search/Search.md.scss +0 -4
  174. package/components/Search/Search.scss +0 -78
  175. package/components/Search/Search.test.js +0 -15
  176. package/components/Search/Search.test.js.map +0 -1
  177. package/components/Search/SearchService.js +0 -72
  178. package/components/Search/SearchService.js.map +0 -1
  179. package/components/Search/engines/Engine.js +0 -26
  180. package/components/Search/engines/Engine.js.map +0 -1
  181. package/components/Search/engines/StopFinder.js +0 -47
  182. package/components/Search/engines/StopFinder.js.map +0 -1
  183. package/components/Search/index.js +0 -6
  184. package/components/Search/index.js.map +0 -1
  185. package/components/StopsFinder/StopsFinder.test.js +0 -19
  186. package/components/StopsFinder/StopsFinder.test.js.map +0 -1
  187. package/components/TrackerControl/TrackerControl.js +0 -171
  188. package/components/TrackerControl/TrackerControl.js.map +0 -1
  189. package/components/TrackerControl/TrackerControl.scss +0 -30
  190. package/components/TrackerControl/TrackerControl.test.js +0 -17
  191. package/components/TrackerControl/TrackerControl.test.js.map +0 -1
  192. package/components/TrackerControl/index.js +0 -3
  193. package/components/TrackerControl/index.js.map +0 -1
  194. package/components/Zoom/Zoom.test.js +0 -150
  195. package/components/Zoom/Zoom.test.js.map +0 -1
  196. package/images/FilterButton/filter.svg +0 -1
  197. package/images/FollowButton/follow.svg +0 -1
  198. package/images/baselayer/osm.baselayer.hot.png +0 -0
  199. package/images/baselayer/osm.baselayer.png +0 -0
  200. package/styleguidist/ComponentsList.js +0 -52
  201. package/styleguidist/ComponentsList.js.map +0 -1
  202. package/styleguidist/StyleGuide.js +0 -253
  203. package/styleguidist/StyleGuide.js.map +0 -1
  204. package/utils/KML.test.js +0 -163
  205. package/utils/KML.test.js.map +0 -1
  206. package/utils/KMLFormat.js +0 -105
  207. package/utils/KMLFormat.js.map +0 -1
  208. package/utils/KMLFormat.test.js +0 -22
  209. package/utils/KMLFormat.test.js.map +0 -1
  210. package/utils/getPolygonPattern.test.js +0 -66
  211. package/utils/getPolygonPattern.test.js.map +0 -1
  212. package/utils/timeUtils.test.js +0 -32
  213. package/utils/timeUtils.test.js.map +0 -1
@@ -1 +1,7 @@
1
- {"version":3,"file":"CanvasSaveButton.js","sources":["../../../src/components/CanvasSaveButton/CanvasSaveButton.js"],"sourcesContent":["/* eslint-disable no-param-reassign */\nimport React, { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport OLMap from 'ol/Map';\nimport { getTopLeft, getBottomRight } from 'ol/extent';\nimport NorthArrowSimple from '../../images/northArrow.url.svg';\nimport NorthArrowCircle from '../../images/northArrowCircle.url.svg';\n\nconst propTypes = {\n /**\n * Automatically download the image saved.\n */\n autoDownload: PropTypes.bool,\n\n /**\n * Children content of the button.\n */\n children: PropTypes.node,\n\n /**\n * Output format of the image.\n */\n format: PropTypes.oneOf(['image/jpeg', 'image/png']),\n\n /** An [ol/map](https://openlayers.org/en/latest/apidoc/module-ol_Map-Map.html). */\n map: PropTypes.instanceOf(OLMap),\n\n /**\n * Extent for the export. If no extent is given, the whole map is exported.\n */\n extent: PropTypes.arrayOf(PropTypes.number),\n\n /**\n * Array of 4 [ol/Coordinate](https://openlayers.org/en/latest/apidoc/module-ol_coordinate.html#~Coordinate).\n * If no coordinates and no extent are given, the whole map is exported.\n * This property must be used to export rotated map.\n * If you don't need to export rotated map the extent property can be used as well.\n * If extent is specified, coordinates property is ignored.\n */\n coordinates: PropTypes.arrayOf(PropTypes.arrayOf(PropTypes.number)),\n\n /**\n * Scale the map for better quality. Possible values: 1, 2 or 3.\n * WARNING: The tiled layer with a WMTS or XYZ source must provides an url\n * for each scale in the config file.\n */\n scale: PropTypes.number,\n\n /**\n * Function called before the dowload process begins.\n */\n onSaveStart: PropTypes.func,\n\n /**\n * Function called after the dowload process ends.\n *\n * @param {object} error Error message the process fails.\n */\n onSaveEnd: PropTypes.func,\n\n /**\n * Extra data, such as copyright, north arrow configuration.\n * All extra data is optional.\n *\n * Example 1:\n *\n {\n copyright: {\n text: 'Example copyright', // Copyright text or function\n font: '10px Arial', // Font, default is '12px Arial'\n fillStyle: 'blue', // Fill style, default is 'black'\n },\n northArrow, // True if the north arrow\n // should be placed with default configuration\n // (default image, rotation=0, circled=False)\n }\n * Example 2:\n *\n {\n northArrow: {\n src: NorthArrowCustom,\n width: 60, // Width in px, default is 80\n height: 100, // Height in px, default is 80\n rotation: 25, // Absolute rotation in degrees as number or function\n\n }\n }\n * Example 3:\n *\n {\n copyright: {\n text: () => { // Copyright as function\n return this.copyright;\n },\n },\n northArrow: {\n rotation: () => { // Rotation as function\n return NorthArrow.radToDeg(this.map.getView().getRotation());\n },\n circled, // Display circle around the north arrow (Does not work for custom src)\n },\n }\n */\n extraData: PropTypes.object,\n};\n\nconst defaultProps = {\n autoDownload: true,\n children: null,\n map: null,\n format: 'image/png',\n extent: null,\n extraData: null,\n coordinates: null,\n scale: 1,\n onSaveStart: (map) => {\n return Promise.resolve(map);\n },\n onSaveEnd: () => {},\n};\n\n/**\n * The CanvasSaveButton component creates a button to save\n * an [ol/map](https://openlayers.org/en/latest/apidoc/module-ol_Map-Map.html)\n * canvas as an image.\n */\nclass CanvasSaveButton extends PureComponent {\n constructor(props) {\n super(props);\n const { format } = this.props;\n this.fileExt = format === 'image/jpeg' ? 'jpg' : 'png';\n this.padding = 5;\n }\n\n onClick(evt) {\n const { map, onSaveStart, onSaveEnd, autoDownload } = this.props;\n if (window.navigator.msSaveBlob) {\n // ie only\n evt.preventDefault();\n evt.stopPropagation();\n }\n onSaveStart(map).then((mapToExport) => {\n return this.createCanvasImage(mapToExport || map)\n .then((canvas) => {\n if (autoDownload) {\n this.downloadCanvasImage(canvas).then((blob) => {\n onSaveEnd(mapToExport, canvas, blob);\n });\n } else {\n onSaveEnd(mapToExport, canvas);\n }\n })\n .catch((err) => {\n if (err) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n onSaveEnd(mapToExport, err);\n });\n });\n }\n\n getDownloadImageName() {\n return (\n `${window.document.title.replace(/ /g, '_').toLowerCase()}` +\n `.${this.fileExt}`\n );\n }\n\n // Ensure the font size fita with the image width.\n decreaseFontSize(destContext, maxWidth, copyright, scale) {\n const minFontSize = 8;\n let sizeMatch;\n let fontSize;\n do {\n sizeMatch = destContext.font.match(/[0-9]+(?:\\.[0-9]+)?(px)/i);\n fontSize = parseInt(sizeMatch[0].replace(sizeMatch[1], ''), 10);\n\n // eslint-disable-next-line no-param-reassign\n destContext.font = destContext.font.replace(fontSize, fontSize - 1);\n\n if (fontSize - 1 === minFontSize) {\n this.multilineCopyright = true;\n }\n } while (\n fontSize - 1 > minFontSize &&\n destContext.measureText(copyright).width * scale > maxWidth\n );\n\n return destContext.font;\n }\n\n // eslint-disable-next-line class-methods-use-this\n drawTextBackground(\n destContext,\n textMeasure,\n textX,\n textY,\n padding,\n styleOptions = {},\n ) {\n /// get width of text\n const { width, height, actualBoundingBoxAscent } = textMeasure;\n destContext.save();\n // Dflt is a white background\n destContext.fillStyle = 'rgba(255,255,255,.8)';\n\n // To simplify usability the user could pass a boolean to use only default values.\n if (typeof styleOptions === 'object') {\n Object.entries(styleOptions).forEach(([key, value]) => {\n destContext[key] = value;\n });\n }\n\n /// draw background rect assuming height of font\n destContext.fillRect(\n textX - padding,\n textY - actualBoundingBoxAscent - padding,\n width + padding * 2,\n height + padding * 2,\n );\n destContext.restore();\n }\n\n drawCopyright(destContext, destCanvas, maxWidth) {\n const { extraData, scale } = this.props;\n const { text, font, fillStyle, background } = extraData.copyright;\n let copyright = typeof text === 'function' ? text() : text;\n\n if (Array.isArray(copyright)) {\n copyright = copyright.join();\n }\n\n destContext.save();\n destContext.scale(scale, scale);\n destContext.font = font || '12px Arial';\n destContext.font = this.decreaseFontSize(\n destContext,\n maxWidth - this.padding,\n copyright,\n scale,\n );\n\n destContext.scale(scale, scale);\n destContext.fillStyle = fillStyle || 'black';\n\n // We search if the display on 2 line is necessary\n let firstLine = copyright;\n const wordNumber = copyright.split(' ').length;\n\n // If the text is bigger than the max width we split itinto 2 lines\n if (this.multilineCopyright) {\n for (let i = 0; i < wordNumber; i += 1) {\n firstLine = firstLine.substring(0, firstLine.lastIndexOf(' '));\n // Stop removing word when fits within one line.\n if (\n destContext.measureText(firstLine).width * scale <\n maxWidth - this.padding\n ) {\n break;\n }\n }\n }\n const secondLine = copyright.replace(firstLine, '');\n\n // Draw first line (line break isn't supported for fillText).\n const textX = this.padding;\n let textMeasure = destContext.measureText(firstLine);\n textMeasure.height =\n textMeasure.actualBoundingBoxAscent +\n textMeasure.actualBoundingBoxDescent;\n let firstLineY = destCanvas.height / scale - this.padding;\n const secondLineY = firstLineY;\n const paddingBetweenLines = 3;\n const paddingBackground = paddingBetweenLines / 2;\n\n if (secondLine) {\n firstLineY -= textMeasure.height + paddingBetweenLines;\n }\n if (background) {\n this.drawTextBackground(\n destContext,\n textMeasure,\n textX,\n firstLineY,\n paddingBackground,\n background,\n );\n }\n destContext.fillText(firstLine, textX, firstLineY);\n\n // Draw second line.\n if (secondLine) {\n textMeasure = destContext.measureText(secondLine);\n textMeasure.height =\n textMeasure.actualBoundingBoxAscent +\n textMeasure.actualBoundingBoxDescent;\n if (background) {\n this.drawTextBackground(\n destContext,\n textMeasure,\n textX,\n secondLineY,\n paddingBackground,\n background,\n );\n }\n destContext.fillText(secondLine, textX, secondLineY);\n }\n\n destContext.restore();\n }\n\n drawElement(data, destCanvas, previousItemSize = [0, 0]) {\n const destContext = destCanvas.getContext('2d');\n const { scale } = this.props;\n const { src, width, height, rotation } = data;\n\n return new Promise((resolve) => {\n const img = new Image();\n img.crossOrigin = 'Anonymous';\n img.src = src;\n img.onload = () => {\n destContext.save();\n const elementWidth = (width || 80) * scale;\n const elementHeight = (height || 80) * scale;\n destContext.translate(\n destCanvas.width - 2 * this.padding - elementWidth / 2,\n destCanvas.height -\n 2 * this.padding -\n elementHeight / 2 -\n previousItemSize[1],\n );\n\n if (rotation) {\n const angle = typeof rotation === 'function' ? rotation() : rotation;\n destContext.rotate(angle * (Math.PI / 180));\n }\n\n destContext.drawImage(\n img,\n -elementWidth / 2,\n -elementHeight / 2,\n elementWidth,\n elementHeight,\n );\n destContext.restore();\n\n // Return the pixels width of the arrow and the margin right,\n // that must not be occupied by the copyright.\n resolve([\n elementWidth + 2 * this.padding,\n elementHeight + 2 * this.padding,\n ]);\n };\n\n img.onerror = () => {\n resolve();\n };\n });\n }\n\n calculatePixelsToExport(mapToExport) {\n const { extent, coordinates } = this.props;\n let firstCoordinate;\n let oppositeCoordinate;\n\n if (extent) {\n firstCoordinate = getTopLeft(extent);\n oppositeCoordinate = getBottomRight(extent);\n } else if (coordinates) {\n // In case of coordinates coming from DragBox interaction:\n // firstCoordinate is the first coordinate drawn by the user.\n // oppositeCoordinate is the coordinate of the point dragged by the user.\n [firstCoordinate, , oppositeCoordinate] = coordinates;\n }\n\n if (firstCoordinate && oppositeCoordinate) {\n const firstPixel = mapToExport.getPixelFromCoordinate(firstCoordinate);\n const oppositePixel =\n mapToExport.getPixelFromCoordinate(oppositeCoordinate);\n const pixelTopLeft = [\n firstPixel[0] <= oppositePixel[0] ? firstPixel[0] : oppositePixel[0],\n firstPixel[1] <= oppositePixel[1] ? firstPixel[1] : oppositePixel[1],\n ];\n const pixelBottomRight = [\n firstPixel[0] > oppositePixel[0] ? firstPixel[0] : oppositePixel[0],\n firstPixel[1] > oppositePixel[1] ? firstPixel[1] : oppositePixel[1],\n ];\n\n return {\n x: pixelTopLeft[0],\n y: pixelTopLeft[1],\n w: pixelBottomRight[0] - pixelTopLeft[0],\n h: pixelBottomRight[1] - pixelTopLeft[1],\n };\n }\n return null;\n }\n\n createCanvasImage(mapToExport) {\n const { extraData } = this.props;\n\n return new Promise((resolve) => {\n mapToExport.once('rendercomplete', () => {\n // Find all layer canvases and add it to dest canvas.\n const canvases = mapToExport\n .getTargetElement()\n .getElementsByTagName('canvas');\n\n // Create the canvas to export with the good size.\n let destCanvas;\n let destContext;\n\n // canvases is an HTMLCollection, we don't try to transform to array because some compilers like cra doesn't translate it right.\n for (let i = 0; i < canvases.length; i += 1) {\n const canvas = canvases[i];\n if (!canvas.width || !canvas.height) {\n // eslint-disable-next-line no-continue\n continue;\n }\n const clip = this.calculatePixelsToExport(mapToExport) || {\n x: 0,\n y: 0,\n w: canvas.width,\n h: canvas.height,\n };\n\n if (!destCanvas) {\n destCanvas = document.createElement('canvas');\n destCanvas.width = clip.w;\n destCanvas.height = clip.h;\n destContext = destCanvas.getContext('2d');\n }\n\n // Draw canvas to the canvas to export.\n destContext.drawImage(\n canvas,\n clip.x,\n clip.y,\n clip.w,\n clip.h,\n 0,\n 0,\n destCanvas.width,\n destCanvas.height,\n );\n }\n\n // Custom info\n let logoPromise = Promise.resolve();\n if (destContext && extraData && extraData.logo) {\n logoPromise = this.drawElement(extraData.logo, destCanvas);\n }\n\n logoPromise.then((logoSize = [0, 0]) => {\n // North arrow\n let arrowPromise = Promise.resolve();\n if (destContext && extraData && extraData.northArrow) {\n arrowPromise = this.drawElement(\n {\n src: extraData.northArrow.circled\n ? NorthArrowCircle\n : NorthArrowSimple,\n ...extraData.northArrow,\n },\n destCanvas,\n logoSize,\n );\n }\n\n // Copyright\n arrowPromise.then((arrowSize = [0, 0]) => {\n const widestElement = Math.max(logoSize[0], arrowSize[0]);\n if (\n destContext &&\n extraData &&\n extraData.copyright &&\n extraData.copyright.text\n ) {\n const maxWidth = widestElement\n ? destContext.canvas.width - widestElement\n : destContext.canvas.width;\n this.drawCopyright(destContext, destCanvas, maxWidth);\n }\n resolve(destCanvas);\n });\n });\n });\n mapToExport.renderSync();\n });\n }\n\n downloadCanvasImage(canvas) {\n // Use blob for large images\n const promise = new Promise((resolve) => {\n const { format } = this.props;\n if (/msie (9|10)/gi.test(window.navigator.userAgent.toLowerCase())) {\n // ie 9 and 10\n const url = canvas.toDataURL(format);\n const w = window.open('about:blank', '');\n w.document.write(`<img src=\"${url}\" alt=\"from canvas\"/>`);\n resolve(url);\n }\n if (window.navigator.msSaveBlob) {\n // ie 11 and higher\n let image;\n try {\n image = canvas.msToBlob();\n } catch (e) {\n // eslint-disable-next-line no-console\n console.log(e);\n }\n const blob = new Blob([image], {\n type: format,\n });\n resolve(blob);\n window.navigator.msSaveBlob(blob, this.getDownloadImageName());\n } else {\n canvas.toBlob((blob) => {\n const link = document.createElement('a');\n link.download = this.getDownloadImageName();\n link.href = URL.createObjectURL(blob);\n // append child to document for firefox to be able to download.\n document.body.appendChild(link);\n link.click();\n resolve(blob);\n }, format);\n }\n });\n return promise;\n }\n\n render() {\n const { children, ...other } = this.props;\n\n delete other.onSaveStart;\n delete other.onSaveEnd;\n delete other.extraData;\n delete other.extent;\n delete other.format;\n delete other.map;\n delete other.coordinates;\n delete other.autoDownload;\n delete other.scale;\n\n return (\n <div\n role=\"button\"\n className=\"rs-canvas-save-button\"\n tabIndex={0}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...other}\n onClick={(e) => {\n return this.onClick(e);\n }}\n onKeyPress={(e) => {\n return e.which === 13 && this.onClick(e);\n }}\n >\n {children}\n </div>\n );\n }\n}\n\nCanvasSaveButton.propTypes = propTypes;\nCanvasSaveButton.defaultProps = defaultProps;\n\nexport default CanvasSaveButton;\n"],"names":["const","super","this","let"],"mappings":"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"}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/CanvasSaveButton/CanvasSaveButton.js"],
4
+ "sourcesContent": ["/* eslint-disable no-param-reassign */\nimport { getBottomRight, getTopLeft } from \"ol/extent\";\nimport OLMap from \"ol/Map\";\nimport PropTypes from \"prop-types\";\nimport React, { useCallback } from \"react\";\n\nimport NorthArrowSimple from \"../../images/northArrow.url.svg\";\nimport NorthArrowCircle from \"../../images/northArrowCircle.url.svg\";\n\nconst extraDataImgPropType = PropTypes.shape({\n circled: PropTypes.bool,\n height: PropTypes.number,\n rotation: PropTypes.oneOfType([PropTypes.number, PropTypes.func]),\n src: PropTypes.string,\n width: PropTypes.number,\n});\n\n// support server-side rendering where `Element` will not be defined\nconst CanvasPatternType =\n typeof CanvasPattern === \"undefined\" ? Function : CanvasPattern;\n\nconst propTypes = {\n /**\n * Automatically download the image saved.\n */\n autoDownload: PropTypes.bool,\n\n /**\n * Children content of the button.\n */\n children: PropTypes.node,\n\n /**\n * Array of 4 [ol/Coordinate](https://openlayers.org/en/latest/apidoc/module-ol_coordinate.html#~Coordinate).\n * If no coordinates and no extent are given, the whole map is exported.\n * This property must be used to export rotated map.\n * If you don't need to export rotated map the extent property can be used as well.\n * If extent is specified, coordinates property is ignored.\n */\n coordinates: PropTypes.arrayOf(PropTypes.arrayOf(PropTypes.number)),\n\n /**\n * Extent for the export. If no extent is given, the whole map is exported.\n */\n extent: PropTypes.arrayOf(PropTypes.number),\n\n /**\n * Extra data, such as copyright, north arrow configuration.\n * All extra data is optional.\n *\n * Example 1:\n *\n {\n copyright: {\n text: 'Example copyright', // Copyright text or function\n font: '10px Arial', // Font, default is '12px Arial'\n fillStyle: 'blue', // Fill style, default is 'black'\n },\n northArrow, // True if the north arrow\n // should be placed with default configuration\n // (default image, rotation=0, circled=false)\n }\n * Example 2:\n *\n {\n northArrow: {\n src: NorthArrowCustom,\n width: 60, // Width in px, default is 80\n height: 100, // Height in px, default is 80\n rotation: 25, // Absolute rotation in degrees as number or function\n\n }\n }\n * Example 3:\n *\n {\n copyright: {\n text: () => { // Copyright as function\n return this.copyright;\n },\n },\n northArrow: {\n rotation: () => { // Rotation as function\n return NorthArrow.radToDeg(this.map.getView().getRotation());\n },\n circled, // Display circle around the north arrow (Does not work for custom src)\n },\n }\n */\n extraData: PropTypes.shape({\n copyright: PropTypes.shape({\n background: PropTypes.bool,\n fillStyle: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.instanceOf(CanvasPatternType),\n ]),\n font: PropTypes.string,\n maxWidth: PropTypes.number,\n paddingBackground: PropTypes.number,\n paddingBottom: PropTypes.number,\n text: PropTypes.oneOfType([PropTypes.string, PropTypes.func]),\n }),\n logo: extraDataImgPropType,\n northArrow: extraDataImgPropType,\n qrCode: extraDataImgPropType,\n }),\n\n /**\n * Output format of the image.\n */\n format: PropTypes.oneOf([\"image/jpeg\", \"image/png\"]),\n\n /**\n * Return the file name of the image to download.\n */\n getDownloadImageName: PropTypes.func,\n\n /** An [ol/map](https://openlayers.org/en/latest/apidoc/module-ol_Map-Map.html). */\n map: PropTypes.instanceOf(OLMap),\n\n /**\n * Space (in pixels) between the border of the canvas and the elements.\n * Default to 1% of the canvas width.\n */\n margin: PropTypes.number,\n\n /**\n * Function called after the dowload process ends.\n *\n * @param {object} error Error message the process fails.\n */\n onSaveEnd: PropTypes.func,\n\n /**\n * Function called before the dowload process begins.\n */\n onSaveStart: PropTypes.func,\n\n /**\n * Space (in pixels) between elements.\n * Default to 5px.\n */\n padding: PropTypes.number,\n\n /**\n * Scale the map for better quality. Possible values: 1, 2 or 3.\n * WARNING: The tiled layer with a WMTS or XYZ source must provides an url\n * for each scale in the config file.\n */\n scale: PropTypes.number,\n};\n\nconst getMargin = (destCanvas) => {\n const newMargin = destCanvas.width / 100; // 1% of the canvas width\n return newMargin;\n};\n\nconst getDefaultDownloadImageName = (format) => {\n const fileExt = format === \"image/jpeg\" ? \"jpg\" : \"png\";\n return `${window.document.title.replace(/ /g, \"_\").toLowerCase()}.${fileExt}`;\n};\n\nlet multilineCopyright = false;\nlet copyrightY = 0;\n\n// Ensure the font size fita with the image width.\nconst decreaseFontSize = (destContext, maxWidth, copyright, scale) => {\n const minFontSize = 8;\n let sizeMatch;\n let fontSize;\n do {\n sizeMatch = destContext.font.match(/[0-9]+(?:\\.[0-9]+)?(px)/i);\n fontSize = parseInt(sizeMatch[0].replace(sizeMatch[1], \"\"), 10);\n\n // eslint-disable-next-line no-param-reassign\n destContext.font = destContext.font.replace(fontSize, fontSize - 1);\n\n multilineCopyright = false;\n\n if (fontSize - 1 === minFontSize) {\n multilineCopyright = true;\n }\n } while (\n fontSize - 1 > minFontSize &&\n destContext.measureText(copyright).width * scale > maxWidth\n );\n\n return destContext.font;\n};\n\n// eslint-disable-next-line class-methods-use-this\nconst drawTextBackground = (\n destContext,\n x,\n y,\n width,\n height,\n styleOptions = {},\n) => {\n destContext.save();\n // Dflt is a white background\n destContext.fillStyle = \"rgba(255,255,255,.8)\";\n\n // To simplify usability the user could pass a boolean to use only default values.\n if (typeof styleOptions === \"object\") {\n Object.entries(styleOptions).forEach(([key, value]) => {\n destContext[key] = value;\n });\n }\n\n /// draw background rect assuming height of font\n destContext.fillRect(x, y, width, height);\n destContext.restore();\n};\n\nconst drawCopyright = (\n destContext,\n destCanvas,\n maxWidth,\n extraData,\n scale,\n margin,\n padding,\n) => {\n const { background, fillStyle, font, text } = extraData.copyright;\n const { paddingBackground = 2, paddingBottom = padding } =\n extraData.copyright;\n\n let copyright = typeof text === \"function\" ? text() : text?.trim();\n\n if (Array.isArray(copyright)) {\n copyright = copyright.join();\n }\n\n destContext.save();\n destContext.scale(scale, scale);\n destContext.font = font || \"12px Arial\";\n destContext.font = decreaseFontSize(destContext, maxWidth, copyright, scale);\n destContext.textBaseline = \"bottom\";\n destContext.scale(scale, scale);\n destContext.fillStyle = fillStyle || \"black\";\n\n // We search if the display on 2 line is necessary\n let firstLine = copyright;\n let firstLineMetrics = destContext.measureText(firstLine);\n\n // If the text is bigger than the max width we split it into 2 lines\n if (multilineCopyright) {\n const wordNumber = copyright.split(\" \").length;\n for (let i = 0; i < wordNumber; i += 1) {\n // Stop removing word when fits within one line.\n if (firstLineMetrics.width * scale < maxWidth) {\n break;\n }\n firstLine = firstLine.substring(0, firstLine.lastIndexOf(\" \"));\n firstLineMetrics = destContext.measureText(firstLine);\n }\n }\n\n // Define second line if necessary\n const secondLine = copyright.replace(firstLine, \"\").trim();\n\n // At this point we the number of lines to display.\n const lines = [firstLine, secondLine].filter((l) => !!l).reverse();\n\n // We draw from bottom to top because textBaseline is 'bottom\n let lineX = margin;\n let lineY = destCanvas.height - paddingBottom; // we apply the margin only on the left side\n\n lines.forEach((line) => {\n const { fontBoundingBoxAscent, fontBoundingBoxDescent, width } =\n destContext.measureText(line);\n const height = fontBoundingBoxAscent + fontBoundingBoxDescent; // we include paddingBackground to have a bit of distance between lines\n let lineTop = lineY - height;\n\n if (background) {\n const backgroundX = margin;\n lineTop -= paddingBackground * 2;\n drawTextBackground(\n destContext,\n backgroundX,\n lineTop,\n width + paddingBackground * 2,\n height + paddingBackground * 2,\n background,\n );\n lineX += paddingBackground;\n lineY -= paddingBackground;\n }\n\n destContext.fillText(line, lineX, lineY);\n lineY = lineTop;\n });\n\n copyrightY = lineY;\n destContext.restore();\n};\n\nconst drawElement = (\n data,\n destCanvas,\n scale,\n margin,\n padding,\n previousItemSize = [0, 0],\n side = \"right\",\n) => {\n const destContext = destCanvas.getContext(\"2d\");\n const { height, rotation, src, width } = data;\n\n return new Promise((resolve) => {\n const img = new Image();\n img.crossOrigin = \"Anonymous\";\n img.src = src;\n img.onload = () => {\n destContext.save();\n const elementWidth = (width || 80) * scale;\n const elementHeight = (height || 80) * scale;\n const left =\n side === \"left\"\n ? margin + elementWidth / 2\n : destCanvas.width - margin - elementWidth / 2;\n const top =\n (side === \"left\" && copyrightY\n ? copyrightY - padding\n : destCanvas.height) -\n margin -\n elementHeight / 2 -\n previousItemSize[1];\n\n destContext.translate(left, top);\n\n if (rotation) {\n const angle = typeof rotation === \"function\" ? rotation() : rotation;\n destContext.rotate(angle * (Math.PI / 180));\n }\n\n destContext.drawImage(\n img,\n -elementWidth / 2,\n -elementHeight / 2,\n elementWidth,\n elementHeight,\n );\n destContext.restore();\n\n // Return the pixels width of the arrow and the margin right,\n // that must not be occupied by the copyright.\n resolve([elementWidth + 2 * padding, elementHeight + 2 * padding]);\n };\n\n img.onerror = () => {\n resolve();\n };\n });\n};\n\nconst calculatePixelsToExport = (mapToExport, extent, coordinates) => {\n let firstCoordinate;\n let oppositeCoordinate;\n\n if (extent) {\n firstCoordinate = getTopLeft(extent);\n oppositeCoordinate = getBottomRight(extent);\n } else if (coordinates) {\n // In case of coordinates coming from DragBox interaction:\n // firstCoordinate is the first coordinate drawn by the user.\n // oppositeCoordinate is the coordinate of the point dragged by the user.\n [firstCoordinate, , oppositeCoordinate] = coordinates;\n }\n\n if (firstCoordinate && oppositeCoordinate) {\n const firstPixel = mapToExport.getPixelFromCoordinate(firstCoordinate);\n const oppositePixel =\n mapToExport.getPixelFromCoordinate(oppositeCoordinate);\n const pixelTopLeft = [\n firstPixel[0] <= oppositePixel[0] ? firstPixel[0] : oppositePixel[0],\n firstPixel[1] <= oppositePixel[1] ? firstPixel[1] : oppositePixel[1],\n ];\n const pixelBottomRight = [\n firstPixel[0] > oppositePixel[0] ? firstPixel[0] : oppositePixel[0],\n firstPixel[1] > oppositePixel[1] ? firstPixel[1] : oppositePixel[1],\n ];\n\n return {\n h: pixelBottomRight[1] - pixelTopLeft[1],\n w: pixelBottomRight[0] - pixelTopLeft[0],\n x: pixelTopLeft[0],\n y: pixelTopLeft[1],\n };\n }\n return null;\n};\n\nconst createCanvasImage = (\n mapToExport,\n extraData,\n scale,\n extent,\n coordinates,\n margin,\n padding,\n) => {\n return new Promise((resolve) => {\n mapToExport.once(\"rendercomplete\", () => {\n // Find all layer canvases and add it to dest canvas.\n const canvases = mapToExport\n .getTargetElement()\n .getElementsByTagName(\"canvas\");\n\n // Create the canvas to export with the good size.\n let destCanvas;\n let destContext;\n\n // canvases is an HTMLCollection, we don't try to transform to array because some compilers like cra doesn't translate it right.\n for (let i = 0; i < canvases.length; i += 1) {\n const canvas = canvases[i];\n if (!canvas.width || !canvas.height) {\n // eslint-disable-next-line no-continue\n continue;\n }\n const clip = calculatePixelsToExport(\n mapToExport,\n extent,\n coordinates,\n ) || {\n h: canvas.height,\n w: canvas.width,\n x: 0,\n y: 0,\n };\n\n if (!destCanvas) {\n destCanvas = document.createElement(\"canvas\");\n destCanvas.width = clip.w;\n destCanvas.height = clip.h;\n destContext = destCanvas.getContext(\"2d\");\n }\n\n // Draw canvas to the canvas to export.\n destContext.drawImage(\n canvas,\n clip.x,\n clip.y,\n clip.w,\n clip.h,\n 0,\n 0,\n destCanvas.width,\n destCanvas.height,\n );\n }\n\n margin = margin || getMargin(destCanvas);\n\n // Custom info\n let logoPromise = Promise.resolve();\n if (destContext && extraData && extraData.logo) {\n logoPromise = drawElement(\n extraData.logo,\n destCanvas,\n scale,\n margin,\n padding,\n );\n }\n\n logoPromise.then((logoSize = [0, 0]) => {\n // North arrow\n let arrowPromise = Promise.resolve();\n if (destContext && extraData && extraData.northArrow) {\n arrowPromise = drawElement(\n {\n src: extraData.northArrow.circled\n ? NorthArrowCircle\n : NorthArrowSimple,\n ...extraData.northArrow,\n },\n destCanvas,\n scale,\n margin,\n padding,\n logoSize,\n );\n }\n\n // Copyright\n arrowPromise.then((arrowSize = [0, 0]) => {\n const widestElement = Math.max(logoSize[0], arrowSize[0]);\n if (\n destContext &&\n extraData &&\n extraData.copyright &&\n extraData.copyright.text\n ) {\n const maxWidth =\n extraData.copyright.maxWidth ||\n (widestElement\n ? destContext.canvas.width - widestElement - margin\n : destContext.canvas.width);\n drawCopyright(\n destContext,\n destCanvas,\n maxWidth,\n extraData,\n scale,\n margin,\n padding,\n );\n }\n let qrCodePromise = Promise.resolve();\n if (destContext && extraData && extraData.qrCode) {\n qrCodePromise = drawElement(\n extraData.qrCode,\n destCanvas,\n scale,\n margin,\n padding,\n undefined,\n \"left\",\n );\n }\n qrCodePromise.then(() => {\n return resolve(destCanvas);\n });\n });\n });\n });\n mapToExport.renderSync();\n });\n};\n\nconst downloadCanvasImage = (canvas, format, getDownloadImageName) => {\n // Use blob for large images\n const promise = new Promise((resolve) => {\n if (/msie (9|10)/gi.test(window.navigator.userAgent.toLowerCase())) {\n // ie 9 and 10\n const url = canvas.toDataURL(format);\n const w = window.open(\"about:blank\", \"\");\n w.document.write(`<img src=\"${url}\" alt=\"from canvas\"/>`);\n resolve(url);\n }\n if (window.navigator.msSaveBlob) {\n // ie 11 and higher\n let image;\n try {\n image = canvas.msToBlob();\n } catch (e) {\n // eslint-disable-next-line no-console\n console.log(e);\n }\n const blob = new Blob([image], {\n type: format,\n });\n resolve(blob);\n window.navigator.msSaveBlob(blob, getDownloadImageName(format));\n } else {\n canvas.toBlob((blob) => {\n const link = document.createElement(\"a\");\n link.download = getDownloadImageName(format);\n link.href = URL.createObjectURL(blob);\n // append child to document for firefox to be able to download.\n document.body.appendChild(link);\n link.click();\n resolve(blob);\n }, format);\n }\n });\n return promise;\n};\n\n/**\n * The CanvasSaveButton component creates a button to save\n * an [ol/map](https://openlayers.org/en/latest/apidoc/module-ol_Map-Map.html)\n * canvas as an image.\n */\nfunction CanvasSaveButton({\n autoDownload = true,\n children = null,\n coordinates = null,\n extent = null,\n extraData = null,\n format = \"image/png\",\n getDownloadImageName = getDefaultDownloadImageName,\n map = null,\n margin = null,\n onSaveEnd = () => {},\n onSaveStart = (mapp) => {\n return Promise.resolve(mapp);\n },\n padding = 5,\n scale = 1,\n}) {\n const onClick = useCallback(\n (evt) => {\n if (window.navigator.msSaveBlob) {\n // ie only\n evt.preventDefault();\n evt.stopPropagation();\n }\n multilineCopyright = false;\n copyrightY = 0;\n onSaveStart(map).then((mapToExport) => {\n return createCanvasImage(\n mapToExport || map,\n extraData,\n scale,\n extent,\n coordinates,\n margin,\n padding,\n )\n .then((canvas) => {\n if (autoDownload) {\n downloadCanvasImage(canvas, format, getDownloadImageName).then(\n (blob) => {\n onSaveEnd(mapToExport, canvas, blob);\n },\n );\n } else {\n onSaveEnd(mapToExport, canvas);\n }\n })\n .catch((err) => {\n if (err) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n onSaveEnd(mapToExport, err);\n });\n });\n },\n [\n autoDownload,\n coordinates,\n extent,\n extraData,\n format,\n map,\n margin,\n onSaveEnd,\n onSaveStart,\n padding,\n scale,\n getDownloadImageName,\n ],\n );\n\n return (\n <>\n {React.Children.map(children, (child) => {\n return React.cloneElement(child, { onClick });\n })}\n </>\n );\n}\n\nCanvasSaveButton.propTypes = propTypes;\n\nexport default CanvasSaveButton;\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -3,7 +3,7 @@
3
3
  display: flex;
4
4
  flex-direction: column;
5
5
 
6
- div[role='button'] {
6
+ button {
7
7
  display: flex;
8
8
  align-items: center;
9
9
  margin: 10px auto;
@@ -1,3 +1 @@
1
- export { default } from './CanvasSaveButton';
2
-
3
- //# sourceMappingURL=index.js.map
1
+ export { default } from "./CanvasSaveButton";
@@ -1 +1,7 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/components/CanvasSaveButton/index.js"],"sourcesContent":["export { default } from './CanvasSaveButton';\n"],"names":[],"mappings":"AAAA,SAAS,OAAO,QAAQ,oBAAoB,CAAC;"}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/CanvasSaveButton/index.js"],
4
+ "sourcesContent": ["export { default } from \"./CanvasSaveButton\";\n"],
5
+ "mappings": "AAAA,SAAS,eAAe;",
6
+ "names": []
7
+ }
@@ -1,96 +1,63 @@
1
- function objectWithoutProperties (obj, exclude) { var target = {}; for (var k in obj) if (Object.prototype.hasOwnProperty.call(obj, k) && exclude.indexOf(k) === -1) target[k] = obj[k]; return target; }
2
- import React, { useMemo, useEffect, useState } from 'react';
3
- import PropTypes from 'prop-types';
4
- import { Map } from 'ol';
5
- import { CopyrightControl } from 'mobility-toolbox-js/ol';
6
-
7
- var propTypes = {
1
+ import { CopyrightControl } from "mobility-toolbox-js/ol";
2
+ import { Map } from "ol";
3
+ import PropTypes from "prop-types";
4
+ import React, { useEffect, useMemo, useState } from "react";
5
+ const propTypes = {
8
6
  /**
9
- * A map.
7
+ * CSS class of th root element
10
8
  */
11
- map: PropTypes.instanceOf(Map).isRequired,
12
-
9
+ className: PropTypes.string,
13
10
  /**
14
11
  * Format function. Called with an array of copyrights from visible layers
15
12
  * and returns the copyright.
16
13
  */
17
14
  format: PropTypes.func,
18
-
19
15
  /**
20
- * CSS class of th root element
16
+ * A map.
21
17
  */
22
- className: PropTypes.string,
18
+ map: PropTypes.instanceOf(Map).isRequired
23
19
  };
24
-
25
- var defaultProps = {
26
- format: function (copyrights) {
27
- return copyrights.join(' | ');
28
- },
29
- className: 'rs-copyright',
20
+ const defaultProps = {
21
+ className: "rs-copyright",
22
+ format: (copyrights) => {
23
+ return copyrights.join(" | ");
24
+ }
30
25
  };
31
-
32
- /**
33
- * The Copyright component uses the
34
- * [mobility-toolbox-js CopyrightControl](https://mobility-toolbox-js.geops.io/api/class/src/mapbox/controls/CopyrightControl%20js~CopyrightControl%20html-offset-anchor)
35
- * to render the layer copyrights.
36
- */
37
- function Copyright(ref) {
38
- var map = ref.map;
39
- var format = ref.format;
40
- var rest = objectWithoutProperties( ref, ["map", "format"] );
41
- var other = rest;
42
-
43
- var ref$1 = useState([]);
44
- var copyrights = ref$1[0];
45
- var setCopyrights = ref$1[1];
46
-
47
- var control = useMemo(
48
- function () {
49
- return new CopyrightControl({
50
- target: document.createElement('div'),
51
- element: document.createElement('div'),
52
- render: function render() {
53
- // eslint-disable-next-line react/no-this-in-sfc
54
- var newCopyrights = this.getCopyrights();
55
- if (copyrights.toString() !== newCopyrights.toString()) {
56
- setCopyrights(newCopyrights);
57
- }
58
- },
59
- });
60
- },
61
- // eslint-disable-next-line react-hooks/exhaustive-deps
62
- []
63
- );
64
-
65
- // Ensure the control is not associated to the wrong map
66
- useEffect(function () {
26
+ function Copyright({
27
+ className = defaultProps.className,
28
+ format = defaultProps.format,
29
+ map,
30
+ ...other
31
+ }) {
32
+ const [node, setNode] = useState(null);
33
+ const control = useMemo(() => {
34
+ if (!node) {
35
+ return null;
36
+ }
37
+ return new CopyrightControl({
38
+ element: document.createElement("div"),
39
+ format,
40
+ target: node
41
+ });
42
+ }, [node, format]);
43
+ useEffect(() => {
67
44
  if (!control) {
68
- return function () {};
45
+ return () => {
46
+ };
69
47
  }
70
-
71
- control.map = map;
72
-
73
- return function () {
74
- control.map = null;
48
+ map.addControl(control);
49
+ return () => {
50
+ map.removeControl(control);
75
51
  };
76
52
  }, [map, control]);
77
-
78
- if (!control || !control.getCopyrights().length) {
79
- return null;
80
- }
81
-
82
- return (
83
- React.createElement( 'div', Object.assign({},
84
- // eslint-disable-next-line react/jsx-props-no-spreading
85
- other, { dangerouslySetInnerHTML: {
86
- __html: format(copyrights) || '',
87
- } }))
53
+ return /* @__PURE__ */ React.createElement(
54
+ "div",
55
+ {
56
+ className,
57
+ ref: (nod) => setNode(nod),
58
+ ...other
59
+ }
88
60
  );
89
61
  }
90
-
91
62
  Copyright.propTypes = propTypes;
92
- Copyright.defaultProps = defaultProps;
93
-
94
63
  export default React.memo(Copyright);
95
-
96
- //# sourceMappingURL=Copyright.js.map
@@ -1 +1,7 @@
1
- {"version":3,"file":"Copyright.js","sources":["../../../src/components/Copyright/Copyright.js"],"sourcesContent":["import React, { useMemo, useEffect, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { Map } from 'ol';\nimport { CopyrightControl } from 'mobility-toolbox-js/ol';\n\nconst propTypes = {\n /**\n * A map.\n */\n map: PropTypes.instanceOf(Map).isRequired,\n\n /**\n * Format function. Called with an array of copyrights from visible layers\n * and returns the copyright.\n */\n format: PropTypes.func,\n\n /**\n * CSS class of th root element\n */\n className: PropTypes.string,\n};\n\nconst defaultProps = {\n format: (copyrights) => {\n return copyrights.join(' | ');\n },\n className: 'rs-copyright',\n};\n\n/**\n * The Copyright component uses the\n * [mobility-toolbox-js CopyrightControl](https://mobility-toolbox-js.geops.io/api/class/src/mapbox/controls/CopyrightControl%20js~CopyrightControl%20html-offset-anchor)\n * to render the layer copyrights.\n */\nfunction Copyright({ map, format, ...other }) {\n const [copyrights, setCopyrights] = useState([]);\n\n const control = useMemo(\n () => {\n return new CopyrightControl({\n target: document.createElement('div'),\n element: document.createElement('div'),\n render() {\n // eslint-disable-next-line react/no-this-in-sfc\n const newCopyrights = this.getCopyrights();\n if (copyrights.toString() !== newCopyrights.toString()) {\n setCopyrights(newCopyrights);\n }\n },\n });\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n\n // Ensure the control is not associated to the wrong map\n useEffect(() => {\n if (!control) {\n return () => {};\n }\n\n control.map = map;\n\n return () => {\n control.map = null;\n };\n }, [map, control]);\n\n if (!control || !control.getCopyrights().length) {\n return null;\n }\n\n return (\n <div\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...other}\n // eslint-disable-next-line react/no-danger\n dangerouslySetInnerHTML={{\n __html: format(copyrights) || '',\n }}\n />\n );\n}\n\nCopyright.propTypes = propTypes;\nCopyright.defaultProps = defaultProps;\n\nexport default React.memo(Copyright);\n"],"names":["const"],"mappings":";AAAA,OAAO,KAAK,IAAI,OAAO,EAAE,SAAS,EAAE,QAAQ,QAAQ,OAAO,CAAC;AAC5D,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,SAAS,GAAG,QAAQ,IAAI,CAAC;AACzB,SAAS,gBAAgB,QAAQ,wBAAwB,CAAC;AAC1D;AACAA,GAAK,CAAC,SAAS,GAAG;AAClB;AACA;AACA;AACA,EAAE,GAAG,EAAE,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,UAAU;AAC3C;AACA;AACA;AACA;AACA;AACA,EAAE,MAAM,EAAE,SAAS,CAAC,IAAI;AACxB;AACA;AACA;AACA;AACA,EAAE,SAAS,EAAE,SAAS,CAAC,MAAM;AAC7B,CAAC,CAAC;AACF;AACAA,GAAK,CAAC,YAAY,GAAG;AACrB,EAAE,MAAM,WAAE,CAAC,UAAU,EAAK;AAC1B,IAAI,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAClC,GAAG;AACH,EAAE,SAAS,EAAE,cAAc;AAC3B,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,SAAS,IAA0B,EAAE,CAAzB;oBAAK;0BAAQ;+DAAG;;AAAU;AAC/C,WAAmC,GAAG,QAAQ,CAAC,EAAE;EAAxC;EAAY,6BAA8B;AACnD;AACA,EAAEA,GAAK,CAAC,OAAO,GAAG,OAAO;AACzB,aAAI,GAAM;AACV,MAAM,OAAO,IAAI,gBAAgB,CAAC;AAClC,QAAQ,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAC7C,QAAQ,OAAO,EAAE,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAC9C,QAAQ,uBAAM,GAAG;AACjB;AACA,UAAUA,GAAK,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;AACrD,UAAU,IAAI,UAAU,CAAC,QAAQ,EAAE,KAAK,aAAa,CAAC,QAAQ,EAAE,EAAE;AAClE,YAAY,aAAa,CAAC,aAAa,CAAC,CAAC;AACzC,WAAW;AACX,SAAS;AACT,OAAO,CAAC,CAAC;AACT,KAAK;AACL;AACA,IAAI,EAAG;AACP,GAAG,CAAC;AACJ;AACA;AACA,EAAE,SAAS,UAAC,GAAM;AAClB,IAAI,IAAI,CAAC,OAAO,EAAE;AAClB,MAAM,gBAAO,GAAM,EAAE,CAAC;AACtB,KAAK;AACL;AACA,IAAI,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC;AACtB;AACA,IAAI,gBAAO,GAAM;AACjB,MAAM,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;AACzB,KAAK,CAAC;AACN,GAAG,EAAE,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;AACrB;AACA,EAAE,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,MAAM,EAAE;AACnD,IAAI,OAAO,IAAI,CAAC;AAChB,GAAG;AACH;AACA,EAAE,OAAO;AACT,IAAI,sBAAC,uBAAG;AACR;AACA,MAAU,KAAM,IAEV,yBAAyB;AAC/B,QAAQ,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE;AACxC,UAAQ,CACF;AACN,GAAG,CAAC;AACJ,CAAC;AACD;AACA,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC;AAChC,SAAS,CAAC,YAAY,GAAG,YAAY,CAAC;AACtC;AACA,eAAe,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;"}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/Copyright/Copyright.js"],
4
+ "sourcesContent": ["import { CopyrightControl } from \"mobility-toolbox-js/ol\";\nimport { Map } from \"ol\";\nimport PropTypes from \"prop-types\";\nimport React, { useEffect, useMemo, useState } from \"react\";\n\nconst propTypes = {\n /**\n * CSS class of th root element\n */\n className: PropTypes.string,\n\n /**\n * Format function. Called with an array of copyrights from visible layers\n * and returns the copyright.\n */\n format: PropTypes.func,\n\n /**\n * A map.\n */\n map: PropTypes.instanceOf(Map).isRequired,\n};\n\nconst defaultProps = {\n className: \"rs-copyright\",\n format: (copyrights) => {\n return copyrights.join(\" | \");\n },\n};\n\n/**\n * The Copyright component uses the\n * [mobility-toolbox-js CopyrightControl](https://mobility-toolbox-js.geops.io/api/class/src/mapbox/controls/CopyrightControl%20js~CopyrightControl%20html-offset-anchor)\n * to render the layer copyrights.\n */\nfunction Copyright({\n className = defaultProps.className,\n format = defaultProps.format,\n map,\n ...other\n}) {\n const [node, setNode] = useState(null);\n\n const control = useMemo(() => {\n if (!node) {\n return null;\n }\n return new CopyrightControl({\n element: document.createElement(\"div\"),\n format,\n target: node,\n });\n }, [node, format]);\n\n // Ensure the control is not associated to the wrong map\n useEffect(() => {\n if (!control) {\n return () => {};\n }\n\n map.addControl(control);\n\n return () => {\n map.removeControl(control);\n };\n }, [map, control]);\n\n return (\n <div\n className={className}\n ref={(nod) => setNode(nod)}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...other}\n />\n );\n}\n\nCopyright.propTypes = propTypes;\n\nexport default React.memo(Copyright);\n"],
5
+ "mappings": "AAAA,SAAS,wBAAwB;AACjC,SAAS,WAAW;AACpB,OAAO,eAAe;AACtB,OAAO,SAAS,WAAW,SAAS,gBAAgB;AAEpD,MAAM,YAAY;AAAA;AAAA;AAAA;AAAA,EAIhB,WAAW,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,EAMrB,QAAQ,UAAU;AAAA;AAAA;AAAA;AAAA,EAKlB,KAAK,UAAU,WAAW,GAAG,EAAE;AACjC;AAEA,MAAM,eAAe;AAAA,EACnB,WAAW;AAAA,EACX,QAAQ,CAAC,eAAe;AACtB,WAAO,WAAW,KAAK,KAAK;AAAA,EAC9B;AACF;AAOA,SAAS,UAAU;AAAA,EACjB,YAAY,aAAa;AAAA,EACzB,SAAS,aAAa;AAAA,EACtB;AAAA,EACA,GAAG;AACL,GAAG;AACD,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,IAAI;AAErC,QAAM,UAAU,QAAQ,MAAM;AAC5B,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,IACT;AACA,WAAO,IAAI,iBAAiB;AAAA,MAC1B,SAAS,SAAS,cAAc,KAAK;AAAA,MACrC;AAAA,MACA,QAAQ;AAAA,IACV,CAAC;AAAA,EACH,GAAG,CAAC,MAAM,MAAM,CAAC;AAGjB,YAAU,MAAM;AACd,QAAI,CAAC,SAAS;AACZ,aAAO,MAAM;AAAA,MAAC;AAAA,IAChB;AAEA,QAAI,WAAW,OAAO;AAEtB,WAAO,MAAM;AACX,UAAI,cAAc,OAAO;AAAA,IAC3B;AAAA,EACF,GAAG,CAAC,KAAK,OAAO,CAAC;AAEjB,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,KAAK,CAAC,QAAQ,QAAQ,GAAG;AAAA,MAExB,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,UAAU,YAAY;AAEtB,eAAe,MAAM,KAAK,SAAS;",
6
+ "names": []
7
+ }
@@ -1,3 +1 @@
1
- export { default } from './Copyright';
2
-
3
- //# sourceMappingURL=index.js.map
1
+ export { default } from "./Copyright";
@@ -1 +1,7 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/components/Copyright/index.js"],"sourcesContent":["export { default } from './Copyright';\n"],"names":[],"mappings":"AAAA,SAAS,OAAO,QAAQ,aAAa,CAAC;"}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/Copyright/index.js"],
4
+ "sourcesContent": ["export { default } from \"./Copyright\";\n"],
5
+ "mappings": "AAAA,SAAS,eAAe;",
6
+ "names": []
7
+ }
@@ -1,128 +1,80 @@
1
- function objectWithoutProperties (obj, exclude) { var target = {}; for (var k in obj) if (Object.prototype.hasOwnProperty.call(obj, k) && exclude.indexOf(k) === -1) target[k] = obj[k]; return target; }
2
- import React, { PureComponent } from 'react';
3
- import PropTypes from 'prop-types';
4
- import KMLFormat from 'ol/format/KML';
5
- import { Layer } from 'mobility-toolbox-js/ol';
6
- import KML from '../../utils/KML';
7
-
8
- var propTypes = {
1
+ import KMLFormat from "ol/format/KML";
2
+ import Layer from "ol/layer/Layer";
3
+ import PropTypes from "prop-types";
4
+ import React, { PureComponent } from "react";
5
+ import KML from "../../utils/KML";
6
+ const propTypes = {
9
7
  /**
10
8
  * Children content of the Feature export button.
11
9
  */
12
10
  children: PropTypes.node,
13
-
14
11
  /**
15
12
  * Format to export features (function).
16
13
  * Supported formats: https://openlayers.org/en/latest/apidoc/module-ol_format_Feature-FeatureFormat.html
17
14
  */
18
15
  format: PropTypes.func,
19
-
20
16
  /**
21
- * An existing [mobility-toolbox-js Layer](https://mobility-toolbox-js.geops.io/api/identifiers%20html#ol-layers),
17
+ * A layer extending an [ol/layer/Layer](https://openlayers.org/en/latest/apidoc/module-ol_layer_Layer.html),
22
18
  * using a valid [ol/source/Vector](https://openlayers.org/en/latest/apidoc/module-ol_source_Vector.html)
23
19
  */
24
20
  layer: PropTypes.instanceOf(Layer).isRequired,
25
-
26
21
  /**
27
22
  * Map projection.
28
23
  */
29
- projection: PropTypes.string,
24
+ projection: PropTypes.string
30
25
  };
31
-
32
- var defaultProps = {
26
+ const defaultProps = {
33
27
  children: null,
34
28
  format: KMLFormat,
35
- projection: 'EPSG:3857',
29
+ projection: "EPSG:3857"
36
30
  };
37
-
38
- /**
39
- * The FeatureExportButton component creates a button that exports feature geometries
40
- * from a [[mobility-toolbox-js Layer](https://mobility-toolbox-js.geops.io/api/identifiers%20html#ol-layers)]
41
- * containing an [ol/layer/Vector](https://openlayers.org/en/latest/apidoc/module-ol_layer_Vector-VectorLayer.html)
42
- * with a [ol/source/Vector](https://openlayers.org/en/latest/apidoc/module-ol_source_Vector.html) on click.<br>
43
- * The default export format is KML, which supports the features' style export.<br>
44
- * Other formats do not always support style export (See specific format specs).
45
- */
46
- var FeatureExportButton = /*@__PURE__*/(function (PureComponent) {
47
- function FeatureExportButton () {
48
- PureComponent.apply(this, arguments);
49
- }
50
-
51
- if ( PureComponent ) FeatureExportButton.__proto__ = PureComponent;
52
- FeatureExportButton.prototype = Object.create( PureComponent && PureComponent.prototype );
53
- FeatureExportButton.prototype.constructor = FeatureExportButton;
54
-
55
- FeatureExportButton.createFeatureString = function createFeatureString (layer, projection, format) {
31
+ class FeatureExportButton extends PureComponent {
32
+ static createFeatureString(layer, projection, format) {
56
33
  if (format === KMLFormat) {
57
34
  return KML.writeFeatures(layer, projection);
58
35
  }
59
-
60
- // eslint-disable-next-line new-cap
61
- return new format().writeFeatures(layer.olLayer.getSource().getFeatures(), {
62
- featureProjection: projection,
36
+ return new format().writeFeatures(layer.getSource().getFeatures(), {
37
+ featureProjection: projection
63
38
  });
64
- };
65
-
66
- FeatureExportButton.exportFeatures = function exportFeatures (layer, projection, format) {
67
- var now = new Date()
68
- .toJSON()
69
- .slice(0, 20)
70
- .replace(/[.:T-]+/g, '');
71
- var featString = this.createFeatureString(layer, projection, format);
72
-
73
- var formatString = featString
74
- ? featString.match(/<(\w+)\s+\w+.*?>/)[1]
75
- : 'xml';
76
-
77
- var fileName = "exported_features_" + now + "." + formatString;
78
- var charset = document.characterSet || 'UTF-8';
79
- var type = (formatString === 'kml'
80
- ? 'data:application/vnd.google-earth.kml+xml'
81
- : 'data:text/xml') + ";charset=" + charset;
82
-
39
+ }
40
+ static exportFeatures(layer, projection, format) {
41
+ const now = (/* @__PURE__ */ new Date()).toJSON().slice(0, 20).replace(/[.:T-]+/g, "");
42
+ const featString = this.createFeatureString(layer, projection, format);
43
+ const formatString = featString ? featString.match(/<(\w+)\s+\w+.*?>/)[1] : "xml";
44
+ const fileName = `exported_features_${now}.${formatString}`;
45
+ const charset = document.characterSet || "UTF-8";
46
+ const type = `${formatString === "kml" ? "data:application/vnd.google-earth.kml+xml" : "data:text/xml"};charset=${charset}`;
83
47
  if (featString) {
84
48
  if (window.navigator.msSaveBlob) {
85
- // ie 11 and higher
86
- window.navigator.msSaveBlob(new Blob([featString], { type: type }), fileName);
49
+ window.navigator.msSaveBlob(new Blob([featString], { type }), fileName);
87
50
  } else {
88
- var link = document.createElement('a');
51
+ const link = document.createElement("a");
89
52
  link.download = fileName;
90
- link.href = type + "," + (encodeURIComponent(featString));
53
+ link.href = `${type},${encodeURIComponent(featString)}`;
91
54
  link.click();
92
55
  }
93
56
  }
94
- };
95
-
96
- FeatureExportButton.prototype.render = function render () {
97
- var ref = this.props;
98
- var children = ref.children;
99
- var layer = ref.layer;
100
- var projection = ref.projection;
101
- var format = ref.format;
102
- var rest = objectWithoutProperties( ref, ["children", "layer", "projection", "format"] );
103
- var other = rest;
104
-
105
- return (
106
- React.createElement( 'div', Object.assign({},
107
- { role: "button", className: "rs-feature-export-button", tabIndex: 0 }, other, { onClick: function () {
57
+ }
58
+ render() {
59
+ const { children, format, layer, projection, ...other } = this.props;
60
+ return /* @__PURE__ */ React.createElement(
61
+ "div",
62
+ {
63
+ className: "rs-feature-export-button",
64
+ role: "button",
65
+ tabIndex: 0,
66
+ ...other,
67
+ onClick: () => {
108
68
  return FeatureExportButton.exportFeatures(layer, projection, format);
109
- }, onKeyPress: function (evt) {
110
- return (
111
- evt.which === 13 &&
112
- FeatureExportButton.exportFeatures(layer, projection, format)
113
- );
114
- } }),
115
- children
116
- )
69
+ },
70
+ onKeyPress: (evt) => {
71
+ return evt.which === 13 && FeatureExportButton.exportFeatures(layer, projection, format);
72
+ }
73
+ },
74
+ children
117
75
  );
118
- };
119
-
120
- return FeatureExportButton;
121
- }(PureComponent));
122
-
76
+ }
77
+ }
123
78
  FeatureExportButton.propTypes = propTypes;
124
79
  FeatureExportButton.defaultProps = defaultProps;
125
-
126
80
  export default FeatureExportButton;
127
-
128
- //# sourceMappingURL=FeatureExportButton.js.map
@@ -1 +1,7 @@
1
- {"version":3,"file":"FeatureExportButton.js","sources":["../../../src/components/FeatureExportButton/FeatureExportButton.js"],"sourcesContent":["import React, { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport KMLFormat from 'ol/format/KML';\nimport { Layer } from 'mobility-toolbox-js/ol';\nimport KML from '../../utils/KML';\n\nconst propTypes = {\n /**\n * Children content of the Feature export button.\n */\n children: PropTypes.node,\n\n /**\n * Format to export features (function).\n * Supported formats: https://openlayers.org/en/latest/apidoc/module-ol_format_Feature-FeatureFormat.html\n */\n format: PropTypes.func,\n\n /**\n * An existing [mobility-toolbox-js Layer](https://mobility-toolbox-js.geops.io/api/identifiers%20html#ol-layers),\n * using a valid [ol/source/Vector](https://openlayers.org/en/latest/apidoc/module-ol_source_Vector.html)\n */\n layer: PropTypes.instanceOf(Layer).isRequired,\n\n /**\n * Map projection.\n */\n projection: PropTypes.string,\n};\n\nconst defaultProps = {\n children: null,\n format: KMLFormat,\n projection: 'EPSG:3857',\n};\n\n/**\n * The FeatureExportButton component creates a button that exports feature geometries\n * from a [[mobility-toolbox-js Layer](https://mobility-toolbox-js.geops.io/api/identifiers%20html#ol-layers)]\n * containing an [ol/layer/Vector](https://openlayers.org/en/latest/apidoc/module-ol_layer_Vector-VectorLayer.html)\n * with a [ol/source/Vector](https://openlayers.org/en/latest/apidoc/module-ol_source_Vector.html) on click.<br>\n * The default export format is KML, which supports the features' style export.<br>\n * Other formats do not always support style export (See specific format specs).\n */\nclass FeatureExportButton extends PureComponent {\n static createFeatureString(layer, projection, format) {\n if (format === KMLFormat) {\n return KML.writeFeatures(layer, projection);\n }\n\n // eslint-disable-next-line new-cap\n return new format().writeFeatures(layer.olLayer.getSource().getFeatures(), {\n featureProjection: projection,\n });\n }\n\n static exportFeatures(layer, projection, format) {\n const now = new Date()\n .toJSON()\n .slice(0, 20)\n .replace(/[.:T-]+/g, '');\n const featString = this.createFeatureString(layer, projection, format);\n\n const formatString = featString\n ? featString.match(/<(\\w+)\\s+\\w+.*?>/)[1]\n : 'xml';\n\n const fileName = `exported_features_${now}.${formatString}`;\n const charset = document.characterSet || 'UTF-8';\n const type = `${\n formatString === 'kml'\n ? 'data:application/vnd.google-earth.kml+xml'\n : 'data:text/xml'\n };charset=${charset}`;\n\n if (featString) {\n if (window.navigator.msSaveBlob) {\n // ie 11 and higher\n window.navigator.msSaveBlob(new Blob([featString], { type }), fileName);\n } else {\n const link = document.createElement('a');\n link.download = fileName;\n link.href = `${type},${encodeURIComponent(featString)}`;\n link.click();\n }\n }\n }\n\n render() {\n const { children, layer, projection, format, ...other } = this.props;\n\n return (\n <div\n role=\"button\"\n className=\"rs-feature-export-button\"\n tabIndex={0}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...other}\n onClick={() => {\n return FeatureExportButton.exportFeatures(layer, projection, format);\n }}\n onKeyPress={(evt) => {\n return (\n evt.which === 13 &&\n FeatureExportButton.exportFeatures(layer, projection, format)\n );\n }}\n >\n {children}\n </div>\n );\n }\n}\n\nFeatureExportButton.propTypes = propTypes;\nFeatureExportButton.defaultProps = defaultProps;\n\nexport default FeatureExportButton;\n"],"names":["const"],"mappings":";AAAA,OAAO,KAAK,IAAI,aAAa,QAAQ,OAAO,CAAC;AAC7C,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,SAAS,MAAM,eAAe,CAAC;AACtC,SAAS,KAAK,QAAQ,wBAAwB,CAAC;AAC/C,OAAO,GAAG,MAAM,iBAAiB,CAAC;AAClC;AACAA,GAAK,CAAC,SAAS,GAAG;AAClB;AACA;AACA;AACA,EAAE,QAAQ,EAAE,SAAS,CAAC,IAAI;AAC1B;AACA;AACA;AACA;AACA;AACA,EAAE,MAAM,EAAE,SAAS,CAAC,IAAI;AACxB;AACA;AACA;AACA;AACA;AACA,EAAE,KAAK,EAAE,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,UAAU;AAC/C;AACA;AACA;AACA;AACA,EAAE,UAAU,EAAE,SAAS,CAAC,MAAM;AAC9B,CAAC,CAAC;AACF;AACAA,GAAK,CAAC,YAAY,GAAG;AACrB,EAAE,QAAQ,EAAE,IAAI;AAChB,EAAE,MAAM,EAAE,SAAS;AACnB,EAAE,UAAU,EAAE,WAAW;AACzB,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAM,mBAAmB,GAAsB;;;;;;;;;EAC7C,oBAAO,mDAAmB,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE;AACxD,IAAI,IAAI,MAAM,KAAK,SAAS,EAAE;AAC9B,MAAM,OAAO,GAAG,CAAC,aAAa,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;AAClD,KAAK;AACL;AACA;AACA,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,WAAW,EAAE,EAAE;AAC/E,MAAM,iBAAiB,EAAE,UAAU;AACnC,KAAK,CAAC,CAAC;AACP,IAAG;AACH;AACA,EAAE,oBAAO,yCAAc,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE;AACnD,IAAIA,GAAK,CAAC,GAAG,GAAG,IAAI,IAAI,EAAE;AAC1B,OAAO,MAAM,EAAE;AACf,OAAO,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;AACnB,OAAO,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAC/B,IAAIA,GAAK,CAAC,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;AAC3E;AACA,IAAIA,GAAK,CAAC,YAAY,GAAG,UAAU;AACnC,QAAQ,UAAU,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;AAC/C,QAAQ,KAAK,CAAC;AACd;AACA,IAAIA,GAAK,CAAC,QAAQ,GAAG,uBAAqB,GAAG,SAAI,YAAc,CAAC;AAChE,IAAIA,GAAK,CAAC,OAAO,GAAG,QAAQ,CAAC,YAAY,IAAI,OAAO,CAAC;AACrD,IAAIA,GAAK,CAAC,IAAI,IACR,YAAY,KAAK,KAAK;AAC5B,UAAU,2CAA2C;AACrD,UAAU,gBAAe,iBACT,OAAS,CAAC;AAC1B;AACA,IAAI,IAAI,UAAU,EAAE;AACpB,MAAM,IAAI,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE;AACvC;AACA,QAAQ,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,EAAE,QAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;AAChF,OAAO,MAAM;AACb,QAAQA,GAAK,CAAC,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;AACjD,QAAQ,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;AACjC,QAAQ,IAAI,CAAC,IAAI,GAAM,IAAI,UAAI,kBAAkB,CAAC,UAAU,EAAG,CAAC;AAChE,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC;AACrB,OAAO;AACP,KAAK;AACL,IAAG;AACH;AACA,gCAAE,yBAAM,GAAG;AACX,WAA2D,GAAG,IAAI,CAAC;IAAvD;IAAU;IAAO;IAAY;IAAQ;IAAG,iBAAqB;AACzE;AACA,IAAI,OAAO;AACX,MAAM,sBAAC,uBAAG;AACV,UAAQ,MAAK,QAAQ,EACb,WAAU,0BAA0B,EACpC,UAAU,GAAE,EAER,KAAM,IACV,kBAAS,GAAM;AACvB,UAAU,OAAO,mBAAmB,CAAC,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;AAC/E,SAAU,EACF,qBAAY,CAAC,GAAG,EAAK;AAC7B,UAAU,OAAO;AACjB,YAAY,GAAG,CAAC,KAAK,KAAK,EAAE;AAC5B,YAAY,mBAAmB,CAAC,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC;AACzE,WAAW,CAAC;AACZ,aACO;AACP,QAAS,QAAS;AAClB,MAAM,CAAM;AACZ,KAAK,CAAC;AACN;;;EAnEkC,gBAoEjC;AACD;AACA,mBAAmB,CAAC,SAAS,GAAG,SAAS,CAAC;AAC1C,mBAAmB,CAAC,YAAY,GAAG,YAAY,CAAC;AAChD;AACA,eAAe,mBAAmB,CAAC;"}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/FeatureExportButton/FeatureExportButton.js"],
4
+ "sourcesContent": ["import KMLFormat from \"ol/format/KML\";\nimport Layer from \"ol/layer/Layer\";\nimport PropTypes from \"prop-types\";\nimport React, { PureComponent } from \"react\";\n\nimport KML from \"../../utils/KML\";\n\nconst propTypes = {\n /**\n * Children content of the Feature export button.\n */\n children: PropTypes.node,\n\n /**\n * Format to export features (function).\n * Supported formats: https://openlayers.org/en/latest/apidoc/module-ol_format_Feature-FeatureFormat.html\n */\n format: PropTypes.func,\n\n /**\n * A layer extending an [ol/layer/Layer](https://openlayers.org/en/latest/apidoc/module-ol_layer_Layer.html),\n * using a valid [ol/source/Vector](https://openlayers.org/en/latest/apidoc/module-ol_source_Vector.html)\n */\n layer: PropTypes.instanceOf(Layer).isRequired,\n\n /**\n * Map projection.\n */\n projection: PropTypes.string,\n};\n\nconst defaultProps = {\n children: null,\n format: KMLFormat,\n projection: \"EPSG:3857\",\n};\n\n/**\n * The FeatureExportButton component creates a button that exports feature geometries\n * from an [ol/layer/Vector](https://openlayers.org/en/latest/apidoc/module-ol_layer_Vector-VectorLayer.html)\n * with a [ol/source/Vector](https://openlayers.org/en/latest/apidoc/module-ol_source_Vector.html) on click.<br>\n * The default export format is KML, which supports the features' style export.<br>\n * Other formats do not always support style export (See specific format specs).\n */\nclass FeatureExportButton extends PureComponent {\n static createFeatureString(layer, projection, format) {\n if (format === KMLFormat) {\n return KML.writeFeatures(layer, projection);\n }\n\n // eslint-disable-next-line new-cap\n return new format().writeFeatures(layer.getSource().getFeatures(), {\n featureProjection: projection,\n });\n }\n\n static exportFeatures(layer, projection, format) {\n const now = new Date()\n .toJSON()\n .slice(0, 20)\n .replace(/[.:T-]+/g, \"\");\n const featString = this.createFeatureString(layer, projection, format);\n\n const formatString = featString\n ? featString.match(/<(\\w+)\\s+\\w+.*?>/)[1]\n : \"xml\";\n\n const fileName = `exported_features_${now}.${formatString}`;\n const charset = document.characterSet || \"UTF-8\";\n const type = `${\n formatString === \"kml\"\n ? \"data:application/vnd.google-earth.kml+xml\"\n : \"data:text/xml\"\n };charset=${charset}`;\n\n if (featString) {\n if (window.navigator.msSaveBlob) {\n // ie 11 and higher\n window.navigator.msSaveBlob(new Blob([featString], { type }), fileName);\n } else {\n const link = document.createElement(\"a\");\n link.download = fileName;\n link.href = `${type},${encodeURIComponent(featString)}`;\n link.click();\n }\n }\n }\n\n render() {\n const { children, format, layer, projection, ...other } = this.props;\n\n return (\n <div\n className=\"rs-feature-export-button\"\n role=\"button\"\n tabIndex={0}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...other}\n onClick={() => {\n return FeatureExportButton.exportFeatures(layer, projection, format);\n }}\n onKeyPress={(evt) => {\n return (\n evt.which === 13 &&\n FeatureExportButton.exportFeatures(layer, projection, format)\n );\n }}\n >\n {children}\n </div>\n );\n }\n}\n\nFeatureExportButton.propTypes = propTypes;\nFeatureExportButton.defaultProps = defaultProps;\n\nexport default FeatureExportButton;\n"],
5
+ "mappings": "AAAA,OAAO,eAAe;AACtB,OAAO,WAAW;AAClB,OAAO,eAAe;AACtB,OAAO,SAAS,qBAAqB;AAErC,OAAO,SAAS;AAEhB,MAAM,YAAY;AAAA;AAAA;AAAA;AAAA,EAIhB,UAAU,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,EAMpB,QAAQ,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,EAMlB,OAAO,UAAU,WAAW,KAAK,EAAE;AAAA;AAAA;AAAA;AAAA,EAKnC,YAAY,UAAU;AACxB;AAEA,MAAM,eAAe;AAAA,EACnB,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,YAAY;AACd;AASA,MAAM,4BAA4B,cAAc;AAAA,EAC9C,OAAO,oBAAoB,OAAO,YAAY,QAAQ;AACpD,QAAI,WAAW,WAAW;AACxB,aAAO,IAAI,cAAc,OAAO,UAAU;AAAA,IAC5C;AAGA,WAAO,IAAI,OAAO,EAAE,cAAc,MAAM,UAAU,EAAE,YAAY,GAAG;AAAA,MACjE,mBAAmB;AAAA,IACrB,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,eAAe,OAAO,YAAY,QAAQ;AAC/C,UAAM,OAAM,oBAAI,KAAK,GAClB,OAAO,EACP,MAAM,GAAG,EAAE,EACX,QAAQ,YAAY,EAAE;AACzB,UAAM,aAAa,KAAK,oBAAoB,OAAO,YAAY,MAAM;AAErE,UAAM,eAAe,aACjB,WAAW,MAAM,kBAAkB,EAAE,CAAC,IACtC;AAEJ,UAAM,WAAW,qBAAqB,GAAG,IAAI,YAAY;AACzD,UAAM,UAAU,SAAS,gBAAgB;AACzC,UAAM,OAAO,GACX,iBAAiB,QACb,8CACA,eACN,YAAY,OAAO;AAEnB,QAAI,YAAY;AACd,UAAI,OAAO,UAAU,YAAY;AAE/B,eAAO,UAAU,WAAW,IAAI,KAAK,CAAC,UAAU,GAAG,EAAE,KAAK,CAAC,GAAG,QAAQ;AAAA,MACxE,OAAO;AACL,cAAM,OAAO,SAAS,cAAc,GAAG;AACvC,aAAK,WAAW;AAChB,aAAK,OAAO,GAAG,IAAI,IAAI,mBAAmB,UAAU,CAAC;AACrD,aAAK,MAAM;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA,EAEA,SAAS;AACP,UAAM,EAAE,UAAU,QAAQ,OAAO,YAAY,GAAG,MAAM,IAAI,KAAK;AAE/D,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,MAAK;AAAA,QACL,UAAU;AAAA,QAET,GAAG;AAAA,QACJ,SAAS,MAAM;AACb,iBAAO,oBAAoB,eAAe,OAAO,YAAY,MAAM;AAAA,QACrE;AAAA,QACA,YAAY,CAAC,QAAQ;AACnB,iBACE,IAAI,UAAU,MACd,oBAAoB,eAAe,OAAO,YAAY,MAAM;AAAA,QAEhE;AAAA;AAAA,MAEC;AAAA,IACH;AAAA,EAEJ;AACF;AAEA,oBAAoB,YAAY;AAChC,oBAAoB,eAAe;AAEnC,eAAe;",
6
+ "names": []
7
+ }
@@ -1,3 +1 @@
1
- export { default } from './FeatureExportButton';
2
-
3
- //# sourceMappingURL=index.js.map
1
+ export { default } from "./FeatureExportButton";
@@ -1 +1,7 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/components/FeatureExportButton/index.js"],"sourcesContent":["export { default } from './FeatureExportButton';\n"],"names":[],"mappings":"AAAA,SAAS,OAAO,QAAQ,uBAAuB,CAAC;"}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/FeatureExportButton/index.js"],
4
+ "sourcesContent": ["export { default } from \"./FeatureExportButton\";\n"],
5
+ "mappings": "AAAA,SAAS,eAAe;",
6
+ "names": []
7
+ }