react-spatial 1.1.0 → 1.1.2-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.
- package/components/CanvasSaveButton/CanvasSaveButton.js +99 -37
- package/components/CanvasSaveButton/CanvasSaveButton.js.map +1 -1
- package/components/CanvasSaveButton/CanvasSaveButton.test.js +0 -3
- package/components/CanvasSaveButton/CanvasSaveButton.test.js.map +1 -1
- package/components/Zoom/Zoom.js +1 -1
- package/components/Zoom/Zoom.js.map +1 -1
- package/package.json +5 -5
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/* eslint-disable no-param-reassign */
|
|
1
2
|
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
3
|
import React, { PureComponent } from 'react';
|
|
3
4
|
import PropTypes from 'prop-types';
|
|
@@ -200,32 +201,43 @@ var CanvasSaveButton = /*@__PURE__*/(function (PureComponent) {
|
|
|
200
201
|
return destContext.font;
|
|
201
202
|
};
|
|
202
203
|
|
|
203
|
-
//
|
|
204
|
-
CanvasSaveButton.prototype.
|
|
205
|
-
|
|
206
|
-
|
|
204
|
+
// eslint-disable-next-line class-methods-use-this
|
|
205
|
+
CanvasSaveButton.prototype.drawTextBackground = function drawTextBackground (
|
|
206
|
+
destContext,
|
|
207
|
+
textMeasure,
|
|
208
|
+
textX,
|
|
209
|
+
textY,
|
|
210
|
+
padding,
|
|
211
|
+
styleOptions
|
|
212
|
+
) {
|
|
213
|
+
if ( styleOptions === void 0 ) styleOptions = {};
|
|
214
|
+
|
|
215
|
+
/// get width of text
|
|
216
|
+
var width = textMeasure.width;
|
|
217
|
+
var height = textMeasure.height;
|
|
218
|
+
var actualBoundingBoxAscent = textMeasure.actualBoundingBoxAscent;
|
|
219
|
+
destContext.save();
|
|
220
|
+
// Dflt is a white background
|
|
221
|
+
destContext.fillStyle = 'rgba(255,255,255,.8)';
|
|
207
222
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
}
|
|
214
|
-
}
|
|
223
|
+
// To simplify usability the user could pass a boolean to use only default values.
|
|
224
|
+
if (typeof styleOptions === 'object') {
|
|
225
|
+
Object.entries(styleOptions).forEach(function (ref) {
|
|
226
|
+
var key = ref[0];
|
|
227
|
+
var value = ref[1];
|
|
215
228
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
this.padding,
|
|
220
|
-
destCanvas.height / scale - 3 * this.padding
|
|
221
|
-
);
|
|
229
|
+
destContext[key] = value;
|
|
230
|
+
});
|
|
231
|
+
}
|
|
222
232
|
|
|
223
|
-
|
|
224
|
-
destContext.
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
233
|
+
/// draw background rect assuming height of font
|
|
234
|
+
destContext.fillRect(
|
|
235
|
+
textX - padding,
|
|
236
|
+
textY - actualBoundingBoxAscent - padding,
|
|
237
|
+
width + padding * 2,
|
|
238
|
+
height + padding * 2
|
|
228
239
|
);
|
|
240
|
+
destContext.restore();
|
|
229
241
|
};
|
|
230
242
|
|
|
231
243
|
CanvasSaveButton.prototype.drawCopyright = function drawCopyright (destContext, destCanvas, maxWidth) {
|
|
@@ -236,33 +248,83 @@ var CanvasSaveButton = /*@__PURE__*/(function (PureComponent) {
|
|
|
236
248
|
var text = ref$1.text;
|
|
237
249
|
var font = ref$1.font;
|
|
238
250
|
var fillStyle = ref$1.fillStyle;
|
|
251
|
+
var background = ref$1.background;
|
|
239
252
|
var copyright = typeof text === 'function' ? text() : text;
|
|
240
|
-
this.multilineCopyright = false;
|
|
241
253
|
|
|
242
254
|
destContext.save();
|
|
243
255
|
destContext.scale(scale, scale);
|
|
244
|
-
// eslint-disable-next-line no-param-reassign
|
|
245
256
|
destContext.font = font || '12px Arial';
|
|
246
|
-
|
|
257
|
+
destContext.font = this.decreaseFontSize(
|
|
258
|
+
destContext,
|
|
259
|
+
maxWidth,
|
|
260
|
+
copyright,
|
|
261
|
+
scale
|
|
262
|
+
);
|
|
263
|
+
|
|
264
|
+
destContext.scale(scale, scale);
|
|
247
265
|
destContext.fillStyle = fillStyle || 'black';
|
|
248
266
|
|
|
249
|
-
|
|
267
|
+
// We search if the display on 2 line is necessary
|
|
268
|
+
var firstLine = copyright;
|
|
269
|
+
var wordNumber = copyright.split(' ').length;
|
|
250
270
|
|
|
271
|
+
// If the text is bigger than the max width we split itinto 2 lines
|
|
251
272
|
if (this.multilineCopyright) {
|
|
252
|
-
|
|
273
|
+
for (var i = 0; i < wordNumber; i += 1) {
|
|
274
|
+
firstLine = firstLine.substring(0, firstLine.lastIndexOf(' '));
|
|
275
|
+
// Stop removing word when fits within one line.
|
|
276
|
+
if (destContext.measureText(firstLine).width * scale < maxWidth) {
|
|
277
|
+
break;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
var secondLine = copyright.replace(firstLine, '');
|
|
282
|
+
|
|
283
|
+
// Draw first line (line break isn't supported for fillText).
|
|
284
|
+
var textX = this.padding;
|
|
285
|
+
var textMeasure = destContext.measureText(firstLine);
|
|
286
|
+
textMeasure.height =
|
|
287
|
+
textMeasure.actualBoundingBoxAscent +
|
|
288
|
+
textMeasure.actualBoundingBoxDescent;
|
|
289
|
+
var firstLineY = destCanvas.height / scale - this.padding;
|
|
290
|
+
var secondLineY = firstLineY;
|
|
291
|
+
var paddingBetweenLines = 3;
|
|
292
|
+
var paddingBackground = paddingBetweenLines / 2;
|
|
293
|
+
|
|
294
|
+
if (secondLine) {
|
|
295
|
+
firstLineY -= textMeasure.height + paddingBetweenLines;
|
|
296
|
+
}
|
|
297
|
+
if (background) {
|
|
298
|
+
this.drawTextBackground(
|
|
253
299
|
destContext,
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
} else {
|
|
260
|
-
destContext.fillText(
|
|
261
|
-
copyright,
|
|
262
|
-
this.padding,
|
|
263
|
-
destCanvas.height / scale - this.padding
|
|
300
|
+
textMeasure,
|
|
301
|
+
textX,
|
|
302
|
+
firstLineY,
|
|
303
|
+
paddingBackground,
|
|
304
|
+
background
|
|
264
305
|
);
|
|
265
306
|
}
|
|
307
|
+
destContext.fillText(firstLine, textX, firstLineY);
|
|
308
|
+
|
|
309
|
+
// Draw second line.
|
|
310
|
+
if (secondLine) {
|
|
311
|
+
textMeasure = destContext.measureText(secondLine);
|
|
312
|
+
textMeasure.height =
|
|
313
|
+
textMeasure.actualBoundingBoxAscent +
|
|
314
|
+
textMeasure.actualBoundingBoxDescent;
|
|
315
|
+
if (background) {
|
|
316
|
+
this.drawTextBackground(
|
|
317
|
+
destContext,
|
|
318
|
+
textMeasure,
|
|
319
|
+
textX,
|
|
320
|
+
secondLineY,
|
|
321
|
+
paddingBackground,
|
|
322
|
+
background
|
|
323
|
+
);
|
|
324
|
+
}
|
|
325
|
+
destContext.fillText(secondLine, textX, secondLineY);
|
|
326
|
+
}
|
|
327
|
+
|
|
266
328
|
destContext.restore();
|
|
267
329
|
};
|
|
268
330
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CanvasSaveButton.js","sources":["../../../src/components/CanvasSaveButton/CanvasSaveButton.js"],"sourcesContent":["import 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 return destContext.font;\n }\n\n // If minimal fontsize is reached, divide copyright in two lines.\n splitCopyrightLine(destContext, destCanvas, maxWidth, copyright, scale) {\n let newCopyright = copyright;\n const wordNumber = copyright.split(' ').length;\n\n for (let i = 0; i < wordNumber; i += 1) {\n newCopyright = newCopyright.substring(0, newCopyright.lastIndexOf(' '));\n // Stop removing word when fits within one line.\n if (destContext.measureText(newCopyright).width * scale < maxWidth) {\n break;\n }\n }\n\n // Draw fist line (line break isn't supported for fillText).\n destContext.fillText(\n newCopyright,\n this.padding,\n destCanvas.height / scale - 3 * this.padding,\n );\n\n // Draw second line.\n destContext.fillText(\n copyright.replace(newCopyright, ''),\n this.padding,\n destCanvas.height / scale - this.padding,\n );\n }\n\n drawCopyright(destContext, destCanvas, maxWidth) {\n const { extraData, scale } = this.props;\n const { text, font, fillStyle } = extraData.copyright;\n const copyright = typeof text === 'function' ? text() : text;\n this.multilineCopyright = false;\n\n destContext.save();\n destContext.scale(scale, scale);\n // eslint-disable-next-line no-param-reassign\n destContext.font = font || '12px Arial';\n // eslint-disable-next-line no-param-reassign\n destContext.fillStyle = fillStyle || 'black';\n\n this.decreaseFontSize(destContext, maxWidth, copyright, scale);\n\n if (this.multilineCopyright) {\n this.splitCopyrightLine(\n destContext,\n destCanvas,\n maxWidth,\n copyright,\n scale,\n );\n } else {\n destContext.fillText(\n copyright,\n this.padding,\n destCanvas.height / scale - this.padding,\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((customItemSize = [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 customItemSize,\n );\n }\n\n // Copyright\n arrowPromise.then((arrowWidth) => {\n const widestElement = Math.max(customItemSize[0], arrowWidth);\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
|
+
{"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 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 const copyright = typeof text === 'function' ? text() : text;\n\n destContext.save();\n destContext.scale(scale, scale);\n destContext.font = font || '12px Arial';\n destContext.font = this.decreaseFontSize(\n destContext,\n maxWidth,\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 (destContext.measureText(firstLine).width * scale < maxWidth) {\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((customItemSize = [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 customItemSize,\n );\n }\n\n // Copyright\n arrowPromise.then((arrowWidth) => {\n const widestElement = Math.max(customItemSize[0], arrowWidth);\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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"}
|
|
@@ -116,7 +116,6 @@ describe('CanvasSaveButton', function () {
|
|
|
116
116
|
});
|
|
117
117
|
var spy = jest.spyOn(CanvasSaveButton.prototype, 'createCanvasImage');
|
|
118
118
|
var spy2 = jest.spyOn(CanvasSaveButton.prototype, 'downloadCanvasImage');
|
|
119
|
-
var spy4 = jest.spyOn(CanvasSaveButton.prototype, 'splitCopyrightLine');
|
|
120
119
|
jest
|
|
121
120
|
.spyOn(olMap.getTargetElement(), 'getElementsByTagName')
|
|
122
121
|
.mockReturnValue([canvas]);
|
|
@@ -135,11 +134,9 @@ describe('CanvasSaveButton', function () {
|
|
|
135
134
|
expect(link.href).toBe('http://localhost/fooblob');
|
|
136
135
|
expect(link.download).toBe('.jpg');
|
|
137
136
|
expect(link.click).toHaveBeenCalledTimes(1);
|
|
138
|
-
expect(spy4).toHaveBeenCalledTimes(1);
|
|
139
137
|
spy.mockRestore();
|
|
140
138
|
spy2.mockRestore();
|
|
141
139
|
spy3.mockRestore();
|
|
142
|
-
spy4.mockRestore();
|
|
143
140
|
done();
|
|
144
141
|
});
|
|
145
142
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CanvasSaveButton.test.js","sources":["../../../src/components/CanvasSaveButton/CanvasSaveButton.test.js"],"sourcesContent":["import 'jest-canvas-mock';\nimport React from 'react';\nimport renderer from 'react-test-renderer';\nimport { configure, shallow } from 'enzyme';\nimport Adapter from 'enzyme-adapter-react-16';\nimport Map from 'ol/Map';\nimport View from 'ol/View';\nimport { TiImage } from 'react-icons/ti';\nimport RenderEvent from 'ol/render/Event';\nimport CanvasSaveButton from './CanvasSaveButton';\n\nconfigure({ adapter: new Adapter() });\n\ndescribe('CanvasSaveButton', () => {\n let olMap;\n const conf = {\n title: 'Karte als Bild speichern.',\n icon: <TiImage focusable={false} />,\n className: 'ta-example',\n saveFormat: 'image/jpeg',\n };\n\n beforeEach(() => {\n const target = document.createElement('div');\n document.body.appendChild(target);\n target.style.width = '100px';\n target.style.height = '100px';\n olMap = new Map({\n target,\n controls: [],\n view: new View({\n center: [0, 0],\n zoom: 0,\n }),\n });\n olMap.getView().setCenter([1, 1]);\n });\n\n afterEach(() => {\n if (olMap.getTargetElement()) {\n document.body.removeChild(olMap.getTargetElement());\n }\n olMap.setTarget(null);\n });\n\n test('should match snapshot.', () => {\n const component = renderer.create(\n <CanvasSaveButton format={conf.saveFormat} map={olMap}>\n {conf.icon}\n </CanvasSaveButton>,\n );\n const tree = component.toJSON();\n expect(tree).toMatchSnapshot();\n });\n\n test('should match snapshot with a different attributes', () => {\n const component = renderer.create(\n // eslint-disable-next-line jsx-a11y/tabindex-no-positive\n <CanvasSaveButton title={conf.title} className=\"foo\" tabIndex=\"1\">\n {conf.icon}\n </CanvasSaveButton>,\n );\n const tree = component.toJSON();\n expect(tree).toMatchSnapshot();\n });\n\n test('should call onSaveBefore then download then onSaveEnd function on click.', async (done) => {\n const saveStart = jest.fn((m) => {\n return Promise.resolve(m);\n });\n const saveEnd = jest.fn();\n const wrapper = shallow(\n <CanvasSaveButton\n className=\"ta-example\"\n map={olMap}\n format={conf.saveFormat}\n onSaveStart={saveStart}\n onSaveEnd={saveEnd}\n extraData={{\n copyright: {\n text: () => {\n return (\n 'contributors, SRTM | map style: © OpenTopoMap (CC-BY-SA)' +\n 'contributors, SRTM | map style: © OpenTopoMap (CC-BY-SA)' +\n 'contributors, SRTM | map style: © OpenTopoMap (CC-BY-SA)' +\n 'contributors, SRTM | map style: © OpenTopoMap (CC-BY-SA)' +\n 'contributors, SRTM | map style: © OpenTopoMap (CC-BY-SA)' +\n 'contributors, SRTM | map style: © OpenTopoMap (CC-BY-SA)' +\n 'contributors, SRTM | map style: © OpenTopoMap (CC-BY-SA)'\n );\n },\n },\n }}\n >\n {conf.icon}\n </CanvasSaveButton>,\n );\n const link = document.createElement('a');\n link.click = jest.fn();\n const div = document.createElement('div');\n const canvas = document.createElement('canvas');\n canvas.toBlob = jest.fn((callback) => {\n return callback();\n });\n global.URL.createObjectURL = jest.fn(() => {\n return 'fooblob';\n });\n // We use a spy here to be able to correctly restore the initial function\n const spy3 = jest\n .spyOn(global.document, 'createElement')\n .mockImplementation((elt) => {\n if (elt === 'canvas') {\n return canvas;\n }\n if (elt === 'div') {\n return div;\n }\n if (elt === 'a') {\n return link;\n }\n return {};\n });\n const spy = jest.spyOn(CanvasSaveButton.prototype, 'createCanvasImage');\n const spy2 = jest.spyOn(CanvasSaveButton.prototype, 'downloadCanvasImage');\n const spy4 = jest.spyOn(CanvasSaveButton.prototype, 'splitCopyrightLine');\n jest\n .spyOn(olMap.getTargetElement(), 'getElementsByTagName')\n .mockReturnValue([canvas]);\n await wrapper.find('.ta-example').simulate('click');\n await olMap.dispatchEvent(\n new RenderEvent('rendercomplete', undefined, undefined, {\n canvas,\n }),\n );\n await window.setTimeout(() => {\n expect(spy).toHaveBeenCalledTimes(1);\n expect(saveStart).toHaveBeenCalledTimes(1);\n expect(saveEnd).toHaveBeenCalledTimes(1);\n expect(spy2.mock.calls[0][0]).toBe(canvas);\n expect(spy2.mock.calls[0][0].toBlob).toHaveBeenCalledTimes(1);\n expect(link.href).toBe('http://localhost/fooblob');\n expect(link.download).toBe('.jpg');\n expect(link.click).toHaveBeenCalledTimes(1);\n expect(spy4).toHaveBeenCalledTimes(1);\n spy.mockRestore();\n spy2.mockRestore();\n spy3.mockRestore();\n spy4.mockRestore();\n done();\n });\n });\n\n test('stops click event propagation on ie.', () => {\n const wrapper = shallow(\n <CanvasSaveButton className=\"ta-example\" title={conf.title} map={olMap}>\n {conf.icon}\n </CanvasSaveButton>,\n );\n\n const evt = {\n stopPropagation: jest.fn(),\n preventDefault: jest.fn(),\n };\n window.navigator.msSaveBlob = true;\n\n const canvas = document.createElement('canvas');\n const p = new Promise((resolve) => {\n resolve(canvas);\n });\n jest\n .spyOn(CanvasSaveButton.prototype, 'createCanvasImage')\n .mockReturnValue(p);\n\n wrapper.find('.ta-example').simulate('click', evt);\n expect(evt.stopPropagation).toHaveBeenCalledTimes(1);\n expect(evt.preventDefault).toHaveBeenCalledTimes(1);\n\n window.navigator.msSaveBlob = false;\n });\n});\n"],"names":["let","const"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CanvasSaveButton.test.js","sources":["../../../src/components/CanvasSaveButton/CanvasSaveButton.test.js"],"sourcesContent":["import 'jest-canvas-mock';\nimport React from 'react';\nimport renderer from 'react-test-renderer';\nimport { configure, shallow } from 'enzyme';\nimport Adapter from 'enzyme-adapter-react-16';\nimport Map from 'ol/Map';\nimport View from 'ol/View';\nimport { TiImage } from 'react-icons/ti';\nimport RenderEvent from 'ol/render/Event';\nimport CanvasSaveButton from './CanvasSaveButton';\n\nconfigure({ adapter: new Adapter() });\n\ndescribe('CanvasSaveButton', () => {\n let olMap;\n const conf = {\n title: 'Karte als Bild speichern.',\n icon: <TiImage focusable={false} />,\n className: 'ta-example',\n saveFormat: 'image/jpeg',\n };\n\n beforeEach(() => {\n const target = document.createElement('div');\n document.body.appendChild(target);\n target.style.width = '100px';\n target.style.height = '100px';\n olMap = new Map({\n target,\n controls: [],\n view: new View({\n center: [0, 0],\n zoom: 0,\n }),\n });\n olMap.getView().setCenter([1, 1]);\n });\n\n afterEach(() => {\n if (olMap.getTargetElement()) {\n document.body.removeChild(olMap.getTargetElement());\n }\n olMap.setTarget(null);\n });\n\n test('should match snapshot.', () => {\n const component = renderer.create(\n <CanvasSaveButton format={conf.saveFormat} map={olMap}>\n {conf.icon}\n </CanvasSaveButton>,\n );\n const tree = component.toJSON();\n expect(tree).toMatchSnapshot();\n });\n\n test('should match snapshot with a different attributes', () => {\n const component = renderer.create(\n // eslint-disable-next-line jsx-a11y/tabindex-no-positive\n <CanvasSaveButton title={conf.title} className=\"foo\" tabIndex=\"1\">\n {conf.icon}\n </CanvasSaveButton>,\n );\n const tree = component.toJSON();\n expect(tree).toMatchSnapshot();\n });\n\n test('should call onSaveBefore then download then onSaveEnd function on click.', async (done) => {\n const saveStart = jest.fn((m) => {\n return Promise.resolve(m);\n });\n const saveEnd = jest.fn();\n const wrapper = shallow(\n <CanvasSaveButton\n className=\"ta-example\"\n map={olMap}\n format={conf.saveFormat}\n onSaveStart={saveStart}\n onSaveEnd={saveEnd}\n extraData={{\n copyright: {\n text: () => {\n return (\n 'contributors, SRTM | map style: © OpenTopoMap (CC-BY-SA)' +\n 'contributors, SRTM | map style: © OpenTopoMap (CC-BY-SA)' +\n 'contributors, SRTM | map style: © OpenTopoMap (CC-BY-SA)' +\n 'contributors, SRTM | map style: © OpenTopoMap (CC-BY-SA)' +\n 'contributors, SRTM | map style: © OpenTopoMap (CC-BY-SA)' +\n 'contributors, SRTM | map style: © OpenTopoMap (CC-BY-SA)' +\n 'contributors, SRTM | map style: © OpenTopoMap (CC-BY-SA)'\n );\n },\n },\n }}\n >\n {conf.icon}\n </CanvasSaveButton>,\n );\n const link = document.createElement('a');\n link.click = jest.fn();\n const div = document.createElement('div');\n const canvas = document.createElement('canvas');\n canvas.toBlob = jest.fn((callback) => {\n return callback();\n });\n global.URL.createObjectURL = jest.fn(() => {\n return 'fooblob';\n });\n // We use a spy here to be able to correctly restore the initial function\n const spy3 = jest\n .spyOn(global.document, 'createElement')\n .mockImplementation((elt) => {\n if (elt === 'canvas') {\n return canvas;\n }\n if (elt === 'div') {\n return div;\n }\n if (elt === 'a') {\n return link;\n }\n return {};\n });\n const spy = jest.spyOn(CanvasSaveButton.prototype, 'createCanvasImage');\n const spy2 = jest.spyOn(CanvasSaveButton.prototype, 'downloadCanvasImage');\n jest\n .spyOn(olMap.getTargetElement(), 'getElementsByTagName')\n .mockReturnValue([canvas]);\n await wrapper.find('.ta-example').simulate('click');\n await olMap.dispatchEvent(\n new RenderEvent('rendercomplete', undefined, undefined, {\n canvas,\n }),\n );\n await window.setTimeout(() => {\n expect(spy).toHaveBeenCalledTimes(1);\n expect(saveStart).toHaveBeenCalledTimes(1);\n expect(saveEnd).toHaveBeenCalledTimes(1);\n expect(spy2.mock.calls[0][0]).toBe(canvas);\n expect(spy2.mock.calls[0][0].toBlob).toHaveBeenCalledTimes(1);\n expect(link.href).toBe('http://localhost/fooblob');\n expect(link.download).toBe('.jpg');\n expect(link.click).toHaveBeenCalledTimes(1);\n spy.mockRestore();\n spy2.mockRestore();\n spy3.mockRestore();\n done();\n });\n });\n\n test('stops click event propagation on ie.', () => {\n const wrapper = shallow(\n <CanvasSaveButton className=\"ta-example\" title={conf.title} map={olMap}>\n {conf.icon}\n </CanvasSaveButton>,\n );\n\n const evt = {\n stopPropagation: jest.fn(),\n preventDefault: jest.fn(),\n };\n window.navigator.msSaveBlob = true;\n\n const canvas = document.createElement('canvas');\n const p = new Promise((resolve) => {\n resolve(canvas);\n });\n jest\n .spyOn(CanvasSaveButton.prototype, 'createCanvasImage')\n .mockReturnValue(p);\n\n wrapper.find('.ta-example').simulate('click', evt);\n expect(evt.stopPropagation).toHaveBeenCalledTimes(1);\n expect(evt.preventDefault).toHaveBeenCalledTimes(1);\n\n window.navigator.msSaveBlob = false;\n });\n});\n"],"names":["let","const"],"mappings":"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"}
|
package/components/Zoom/Zoom.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Zoom.js","sources":["../../../src/components/Zoom/Zoom.js"],"sourcesContent":["import React, {\n useEffect,\n useRef,\n useCallback,\n useState,\n useMemo,\n} from 'react';\nimport PropTypes from 'prop-types';\nimport { FaPlus, FaMinus } from 'react-icons/fa';\nimport { ZoomSlider } from 'ol/control';\nimport OLMap from 'ol/Map';\n\nconst propTypes = {\n /**\n * An [ol/map](https://openlayers.org/en/latest/apidoc/module-ol_Map-Map.html).\n */\n map: PropTypes.instanceOf(OLMap).isRequired,\n\n /**\n * The zoom delta applied on each click.\n */\n delta: PropTypes.number,\n\n /**\n * Titles HTML attribtues for button.\n */\n titles: PropTypes.shape({\n zoomIn: PropTypes.string,\n zoomOut: PropTypes.
|
|
1
|
+
{"version":3,"file":"Zoom.js","sources":["../../../src/components/Zoom/Zoom.js"],"sourcesContent":["import React, {\n useEffect,\n useRef,\n useCallback,\n useState,\n useMemo,\n} from 'react';\nimport PropTypes from 'prop-types';\nimport { FaPlus, FaMinus } from 'react-icons/fa';\nimport { ZoomSlider } from 'ol/control';\nimport OLMap from 'ol/Map';\n\nconst propTypes = {\n /**\n * An [ol/map](https://openlayers.org/en/latest/apidoc/module-ol_Map-Map.html).\n */\n map: PropTypes.instanceOf(OLMap).isRequired,\n\n /**\n * The zoom delta applied on each click.\n */\n delta: PropTypes.number,\n\n /**\n * Titles HTML attribtues for button.\n */\n titles: PropTypes.shape({\n zoomIn: PropTypes.string,\n zoomOut: PropTypes.string,\n }),\n\n /**\n * Children content of the zoom in button.\n */\n zoomInChildren: PropTypes.node,\n\n /**\n * Children content of the zoom out button.\n */\n zoomOutChildren: PropTypes.node,\n\n /**\n * Display a slider to zoom.\n */\n zoomSlider: PropTypes.bool,\n};\n\nconst defaultProps = {\n titles: {\n zoomIn: 'Zoom in',\n zoomOut: 'Zoom out',\n },\n zoomInChildren: <FaPlus focusable={false} />,\n zoomOutChildren: <FaMinus focusable={false} />,\n zoomSlider: false,\n delta: 1,\n};\n\nconst updateZoom = (map, zoomAction) => {\n map.getView().cancelAnimations();\n const zoom = map.getView().getZoom();\n\n map.getView().animate({ zoom: zoom + zoomAction });\n};\n\n/**\n * The Zoom component creates a zoom wrapper containing zoom-in and zoom-out buttons\n * and an optional [ol/ZoomSlider](https://openlayers.org/en/latest/apidoc/module-ol_control_ZoomSlider-ZoomSlider.html).\n */\nfunction Zoom({\n map,\n titles,\n zoomInChildren,\n zoomOutChildren,\n zoomSlider,\n delta,\n ...other\n}) {\n const ref = useRef();\n const [currentZoom, setZoom] = useState();\n\n const zoomIn = useCallback(\n (evt) => {\n if (!evt.which || evt.which === 13) {\n updateZoom(map, delta);\n }\n },\n [delta, map],\n );\n\n const zoomOut = useCallback(\n (evt) => {\n if (!evt.which || evt.which === 13) {\n updateZoom(map, -delta);\n }\n },\n [delta, map],\n );\n\n const zoomInDisabled = useMemo(() => {\n return (\n currentZoom >=\n map.getView().getConstrainedZoom(map.getView().getMaxZoom())\n );\n }, [currentZoom, map]);\n\n const zoomOutDisabled = useMemo(() => {\n return (\n currentZoom <=\n map.getView().getConstrainedZoom(map.getView().getMinZoom())\n );\n }, [currentZoom, map]);\n\n useEffect(() => {\n /* Trigger zoom update to disable zooms on max and min */\n const zoomListener = () => {\n return setZoom(map.getView().getZoom());\n };\n map.on('moveend', zoomListener);\n\n let control;\n if (zoomSlider && ref.current) {\n control = new ZoomSlider();\n // We don't want to navigate to the zoom slider using TAB navigation.\n control.element.firstElementChild.tabIndex = -1;\n // Set the zoom slider in the custom control wrapper.\n control.setTarget(ref.current);\n map.addControl(control);\n }\n return () => {\n map.un('moveend', zoomListener);\n if (control) {\n map.removeControl(control);\n }\n };\n }, [map, zoomSlider]);\n\n return (\n // eslint-disable-next-line react/jsx-props-no-spreading\n <div className=\"rs-zooms-bar\" {...other}>\n <button\n type=\"button\"\n tabIndex={0}\n className=\"rs-zoom-in\"\n title={titles.zoomIn}\n onClick={zoomIn}\n onKeyPress={zoomIn}\n disabled={zoomInDisabled}\n >\n {zoomInChildren}\n </button>\n {zoomSlider ? <div className=\"rs-zoomslider-wrapper\" ref={ref} /> : null}\n <button\n type=\"button\"\n tabIndex={0}\n className=\"rs-zoom-out\"\n title={titles.zoomOut}\n onClick={zoomOut}\n onKeyPress={zoomOut}\n disabled={zoomOutDisabled}\n >\n {zoomOutChildren}\n </button>\n </div>\n );\n}\n\nZoom.propTypes = propTypes;\nZoom.defaultProps = defaultProps;\n\nexport default React.memo(Zoom);\n"],"names":["const","let"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-spatial",
|
|
3
3
|
"description": "Components to build React map apps.",
|
|
4
|
-
"version": "1.1.
|
|
4
|
+
"version": "1.1.2-beta.2",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"dependencies": {
|
|
7
|
-
"@geops/geops-ui": "0.1.
|
|
7
|
+
"@geops/geops-ui": "0.1.13",
|
|
8
8
|
"@material-ui/core": "4.12.3",
|
|
9
9
|
"@material-ui/icons": "4.11.2",
|
|
10
10
|
"@material-ui/lab": "4.0.0-alpha.60",
|
|
11
|
-
"@svgr/webpack": "5.5.0",
|
|
12
11
|
"abortcontroller-polyfill": "1.7.3",
|
|
13
|
-
"file-loader": "6.2.0",
|
|
14
12
|
"query-string": "7.0.1",
|
|
15
13
|
"radians-degrees": "1.0.0",
|
|
16
14
|
"re-resizable": "6.9.1",
|
|
@@ -32,6 +30,7 @@
|
|
|
32
30
|
"@babel/plugin-transform-runtime": "7.15.0",
|
|
33
31
|
"@babel/preset-env": "7.15.0",
|
|
34
32
|
"@babel/preset-react": "7.14.5",
|
|
33
|
+
"@svgr/webpack": "5.5.0",
|
|
35
34
|
"babel-core": "7.0.0-bridge.0",
|
|
36
35
|
"babel-jest": "27.0.2",
|
|
37
36
|
"babel-loader": "8.2.2",
|
|
@@ -48,6 +47,7 @@
|
|
|
48
47
|
"eslint-plugin-prettier": "4.0.0",
|
|
49
48
|
"eslint-plugin-react": "7.26.1",
|
|
50
49
|
"eslint-plugin-react-hooks": "4.2.0",
|
|
50
|
+
"file-loader": "6.2.0",
|
|
51
51
|
"fixpack": "3.0.6",
|
|
52
52
|
"generact": "0.4.0",
|
|
53
53
|
"husky": "4.2.5",
|
|
@@ -64,7 +64,6 @@
|
|
|
64
64
|
"lint-staged": "11.2.0",
|
|
65
65
|
"mapbox-gl": "1.13.1",
|
|
66
66
|
"mobility-toolbox-js": "1.6.3",
|
|
67
|
-
"node-sass": "6.0.1",
|
|
68
67
|
"ol": "6.6.1",
|
|
69
68
|
"prettier": "2.4.1",
|
|
70
69
|
"proj4": "2.7.5",
|
|
@@ -75,6 +74,7 @@
|
|
|
75
74
|
"react-styleguidist": "11.0.8",
|
|
76
75
|
"react-svg-loader": "3.0.3",
|
|
77
76
|
"react-test-renderer": "16.13.1",
|
|
77
|
+
"sass": "1.49.9",
|
|
78
78
|
"sass-loader": "10.2.0",
|
|
79
79
|
"stream-array": "1.1.2",
|
|
80
80
|
"style-loader": "2.0.0",
|