@oneblink/apps-react 8.7.1-beta.1 → 8.7.1-beta.3

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.
@@ -52,7 +52,6 @@ function FormElementArcGISWebMap({ element, id, value, onChange, setIsDirty, ...
52
52
  const selectedGraphicForUpdate = React.useRef();
53
53
  const mapViewRef = React.useRef();
54
54
  const measurementLayerRef = React.useRef();
55
- const [overlayLayerIds, setOverlayLayerIds] = React.useState();
56
55
  const [loadError, setLoadError] = React.useState();
57
56
  const [isLoading, setIsLoading] = React.useState(false);
58
57
  const isPageVisible = useIsPageVisible();
@@ -311,30 +310,22 @@ function FormElementArcGISWebMap({ element, id, value, onChange, setIsDirty, ...
311
310
  addMeasurementLabels,
312
311
  clearMeasurementLabels,
313
312
  ]);
313
+ const [initialStringifedLayers] = React.useState(() => JSON.stringify(value === null || value === void 0 ? void 0 : value.layers));
314
+ const stringifedLayersRef = React.useRef(initialStringifedLayers);
314
315
  const onSubmissionValueChange = React.useCallback(() => {
315
- var _a, _b;
316
+ var _a;
316
317
  const view = mapViewRef.current;
317
318
  const map = (_a = mapViewRef.current) === null || _a === void 0 ? void 0 : _a.map;
318
319
  if (!view || !map)
319
320
  return;
320
- const newLayerIds = (_b = value === null || value === void 0 ? void 0 : value.layers) === null || _b === void 0 ? void 0 : _b.map((l) => l.id);
321
- // remove map layers no longer in submission value
322
- if (overlayLayerIds) {
323
- const layersToRemove = overlayLayerIds.reduce((toRemove, id) => {
324
- if (!(newLayerIds === null || newLayerIds === void 0 ? void 0 : newLayerIds.includes(id))) {
325
- const layer = map.layers.find((layer) => layer.id === id);
326
- if (layer)
327
- toRemove.push(layer);
328
- }
329
- return toRemove;
330
- }, []);
331
- map.layers.removeMany(layersToRemove);
332
- }
333
- if (value === null || value === void 0 ? void 0 : value.layers) {
334
- // determine if a layer is new or existing and handle accordingly
335
- for (const layer of value.layers) {
336
- const existingLayer = map.layers.find((mapLayer) => mapLayer.id === layer.id);
337
- if (!existingLayer) {
321
+ // if the layers have changed, remove all layers and repaint
322
+ const currentStringifedLayers = JSON.stringify(value === null || value === void 0 ? void 0 : value.layers);
323
+ if (stringifedLayersRef.current !== currentStringifedLayers) {
324
+ stringifedLayersRef.current = currentStringifedLayers;
325
+ // remove all layers and repaint
326
+ map.layers.removeAll();
327
+ if (value === null || value === void 0 ? void 0 : value.layers) {
328
+ for (const layer of value.layers) {
338
329
  const newLayer = new GraphicsLayer({
339
330
  title: layer.title,
340
331
  id: layer.id,
@@ -344,23 +335,15 @@ function FormElementArcGISWebMap({ element, id, value, onChange, setIsDirty, ...
344
335
  typeof layer.visible === 'boolean' ? layer.visible : true;
345
336
  map.layers.add(newLayer);
346
337
  }
347
- else if (existingLayer && existingLayer.type === 'graphics') {
348
- const existingGraphicLayer = existingLayer;
349
- existingGraphicLayer.title = layer.title;
350
- existingGraphicLayer.graphics.removeAll();
351
- existingGraphicLayer.addMany(layer.graphics.map((g) => Graphic.fromJSON(g)));
352
- existingGraphicLayer.visible =
353
- typeof layer.visible === 'boolean' ? layer.visible : true;
354
- }
355
338
  }
356
339
  }
357
- // finally, set the new layer ids in state
358
- setOverlayLayerIds(newLayerIds);
359
- // update the web map's drawing layers
340
+ // add the web map's drawing layers back
360
341
  const drawingLayer = drawingLayerRef.current;
361
342
  if ((value === null || value === void 0 ? void 0 : value.drawingLayer) && drawingLayer) {
362
343
  drawingLayer.removeAll();
363
344
  drawingLayer.addMany(value.drawingLayer.map((g) => Graphic.fromJSON(g)));
345
+ map.layers.add(drawingLayer);
346
+ map.layers.reorder(drawingLayer, map.layers.length - 1);
364
347
  }
365
348
  if (value === null || value === void 0 ? void 0 : value.view) {
366
349
  view.zoom = value.view.zoom;
@@ -369,7 +352,7 @@ function FormElementArcGISWebMap({ element, id, value, onChange, setIsDirty, ...
369
352
  longitude: value.view.longitude,
370
353
  });
371
354
  }
372
- }, [overlayLayerIds, value]);
355
+ }, [value]);
373
356
  React.useEffect(() => {
374
357
  if (!isLoading && mapViewRef.current) {
375
358
  onSubmissionValueChange();
@@ -1 +1 @@
1
- {"version":3,"file":"ArcGISWebMap.js","sourceRoot":"","sources":["../../src/components/ArcGISWebMap.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport { FormTypes } from '@oneblink/types'\nimport MapView from '@arcgis/core/views/MapView'\nimport WebMap from '@arcgis/core/WebMap'\nimport Home from '@arcgis/core/widgets/Home'\nimport Search from '@arcgis/core/widgets/Search'\nimport Zoom from '@arcgis/core/widgets/Zoom'\nimport LayerList from '@arcgis/core/widgets/LayerList'\nimport Expand from '@arcgis/core/widgets/Expand'\nimport BaseMapGallery from '@arcgis/core/widgets/BasemapGallery'\nimport Sketch from '@arcgis/core/widgets/Sketch'\nimport GraphicsLayer from '@arcgis/core/layers/GraphicsLayer'\nimport Graphic from '@arcgis/core/Graphic'\nimport Layer from '@arcgis/core/layers/Layer'\nimport Popup from '@arcgis/core/widgets/Popup'\nimport {\n Point,\n Polygon,\n SpatialReference,\n Polyline,\n} from '@arcgis/core/geometry'\nimport TextSymbol from '@arcgis/core/symbols/TextSymbol'\nimport * as geometryEngine from '@arcgis/core/geometry/geometryEngine'\nimport { Box, Divider, IconButton } from '@mui/material'\nimport throttle from 'lodash.throttle'\nimport { localisationService } from '@oneblink/apps'\nimport { v4 as uuid } from 'uuid'\n\nimport OnLoading from '../components/renderer/OnLoading'\nimport MaterialIcon from './MaterialIcon'\n\nimport useIsPageVisible from '../hooks/useIsPageVisible'\nimport { ArcGISWebMapElementValue } from '@oneblink/types/typescript/arcgis'\nimport { FormElementValueChangeHandler } from '../types/form'\nimport '../styles/arcgis-external.css'\n\ntype Props = {\n element: FormTypes.ArcGISWebMapElement\n id: string\n value: ArcGISWebMapElementValue | undefined\n onChange: FormElementValueChangeHandler<ArcGISWebMapElementValue>\n 'aria-describedby'?: string\n setIsDirty: () => void\n}\n\ntype SketchCreateTool = Parameters<Sketch['create']>[0]\n\nfunction DrawingOptionsList({\n options,\n sketchTool,\n onClose,\n sketchToolType,\n setSelectedGraphicAttributes,\n}: {\n options: { id: string; label: string; value: string; description?: string }[]\n onClose: () => void\n sketchTool: Sketch\n sketchToolType: SketchCreateTool\n setSelectedGraphicAttributes: (opt: {\n label: string\n value: string\n description?: string\n }) => void\n}) {\n return (\n <div className=\"esri-widget\">\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n }}\n >\n <b style={{ padding: '0.5rem' }}>Select an option</b>\n <IconButton\n onClick={(e) => {\n e.stopPropagation()\n onClose()\n }}\n size=\"small\"\n data-cypress=\"copy-to-clip-board-button\"\n >\n <MaterialIcon fontSize=\"small\">close</MaterialIcon>\n </IconButton>\n </Box>\n <Divider sx={{ backgroundColor: 'unset', margin: '0px 8px' }} />\n <Box sx={{ maxHeight: '200px', overflowY: 'auto' }}>\n {options?.map(({ id, value, label, description }) => (\n <div\n key={id}\n className=\"ob-list__item is-clickable\"\n style={{ alignItems: 'center' }}\n onClick={() => {\n onClose()\n sketchTool?.create(sketchToolType)\n setSelectedGraphicAttributes({ value, label, description })\n }}\n >\n {label}\n </div>\n ))}\n </Box>\n </div>\n )\n}\n\nfunction FormElementArcGISWebMap({\n element,\n id,\n value,\n onChange,\n setIsDirty,\n ...props\n}: Props) {\n const ref = React.useRef<HTMLDivElement | null>(null)\n const layerPanelRef = React.useRef<Expand>()\n const mapGalleryPanelRef = React.useRef<Expand>()\n const sketchToolRef = React.useRef<Sketch>()\n const drawingLayerRef = React.useRef<GraphicsLayer>()\n const selectedGraphicForUpdate = React.useRef<string>()\n const mapViewRef = React.useRef<MapView>()\n const measurementLayerRef = React.useRef<GraphicsLayer>()\n\n const [overlayLayerIds, setOverlayLayerIds] = React.useState<string[]>()\n const [loadError, setLoadError] = React.useState<Error>()\n const [isLoading, setIsLoading] = React.useState<boolean>(false)\n const isPageVisible = useIsPageVisible()\n const [selectedGraphicAttributes, setSelectedGraphicAttributes] =\n React.useState<{\n value: string\n label: string\n description?: string\n }>()\n // only used when an allowed drawing tool also has a list of graphic attribute options to display to the user\n const [activeSketchToolMenu, setActiveSketchToolMenu] =\n React.useState<SketchCreateTool>()\n\n const updateDrawingInputSubmissionValue = React.useCallback(() => {\n const updatedGraphics = drawingLayerRef.current?.graphics\n .toArray()\n .map((graphic) => graphic.toJSON())\n\n onChange(element, {\n value: {\n ...(value || {}),\n drawingLayer: updatedGraphics,\n userInput: updatedGraphics,\n },\n })\n\n setIsDirty()\n }, [element, onChange, setIsDirty, value])\n\n const updateMapViewSubmissionValue = React.useCallback(() => {\n const zoom = mapViewRef.current?.zoom\n const latitude = mapViewRef.current?.center.latitude\n const longitude = mapViewRef.current?.center.longitude\n if (zoom && latitude && longitude) {\n onChange(element, {\n value: {\n ...(value || {}),\n view: {\n zoom,\n latitude,\n longitude,\n },\n },\n })\n }\n }, [element, onChange, value])\n\n const getGeometryPoints = (\n geom: __esri.Geometry,\n spatialRef: SpatialReference,\n ) => {\n if (geom.type === 'polygon') {\n const polygon = geom as Polygon\n return polygon.rings[0].map(\n (ring) =>\n new Point({\n x: ring[0],\n y: ring[1],\n spatialReference: spatialRef,\n }),\n )\n } else if (geom.type === 'polyline') {\n const polyline = geom as Polyline\n return polyline.paths[0].map(\n (path) =>\n new Point({\n x: path[0],\n y: path[1],\n spatialReference: spatialRef,\n }),\n )\n }\n }\n\n const addMeasurementLabels = React.useCallback(\n (graphics: __esri.Graphic[]) => {\n if (!element.measurementDimensionsEnabled) return\n const spatialRef = new SpatialReference({ wkid: 3857 })\n const measurementLayer = measurementLayerRef.current\n const mapView = mapViewRef.current\n if (!measurementLayer || !mapView) return\n measurementLayer.removeAll()\n\n for (const graphic of graphics) {\n const geom = graphic.geometry\n if (!geom || (geom.type !== 'polygon' && geom.type !== 'polyline'))\n continue\n\n const points = getGeometryPoints(geom, spatialRef)\n if (!points) continue\n\n const { distanceUnit, distanceUnitShortName } =\n localisationService.getDistanceUnits()\n if (distanceUnit !== 'meters' && distanceUnit !== 'feet') {\n console.warn(\n 'Unsupported distance unit provided in tenant configuration: ',\n distanceUnit,\n )\n return\n }\n const graphics: Graphic[] = []\n\n for (let i = 1; i < points.length; i++) {\n const x1 = points[i].x\n const x2 = points[i - 1].x\n const y1 = points[i].y\n const y2 = points[i - 1].y\n\n const midpoint = new Point({\n x: (x1 + x2) / 2,\n y: (y1 + y2) / 2,\n spatialReference: spatialRef,\n })\n\n // Angle of the measurement label - this will be rotated to be parallel with the polygon or polyline edge\n const dx = x2 - x1\n const dy = y2 - y1\n const radians = Math.atan2(dy, dx)\n let angle = radians * (-180 / Math.PI)\n if (angle > 90 || angle < -90) {\n angle += 180\n }\n\n // offset of the measurement label against the edge of the polygon/polyline it's measuring\n const pixelOffset = 10\n const normalAngle = radians + Math.PI / 2\n const offsetScreenX = pixelOffset * Math.cos(normalAngle)\n const offsetScreenY = pixelOffset * Math.sin(normalAngle)\n\n const screenPoint = mapView.toScreen(midpoint)\n screenPoint.x += offsetScreenX\n screenPoint.y -= offsetScreenY\n const offsetMapPoint = mapView.toMap(screenPoint)\n\n const polyline = new Polyline({\n paths: [\n [\n [points[i].longitude, points[i].latitude],\n [points[i - 1].longitude, points[i - 1].latitude],\n ],\n ],\n spatialReference: { wkid: 4326 },\n })\n const distance = geometryEngine.geodesicLength(polyline, distanceUnit)\n graphics.push(\n new Graphic({\n geometry: offsetMapPoint,\n symbol: new TextSymbol({\n text: distance.toFixed(0) + distanceUnitShortName,\n color: 'black',\n haloColor: 'white',\n haloSize: 1,\n angle,\n }),\n }),\n )\n }\n\n measurementLayer.addMany(graphics)\n mapViewRef.current?.map.reorder(\n measurementLayer,\n mapViewRef.current?.map.layers.length,\n )\n }\n },\n [element],\n )\n\n const clearMeasurementLabels = React.useCallback(() => {\n if (measurementLayerRef.current) {\n measurementLayerRef.current.removeAll()\n }\n }, [])\n\n React.useEffect(() => {\n if (element.readOnly) return\n // event listeners for drawing tool creates/updates/deletes\n // these need to be removed and recreated when the submission value changes\n // to ensure they always have access to the latest submission value\n const createListener = sketchToolRef.current?.on(\n 'create',\n throttle((sketchEvent: __esri.SketchCreateEvent) => {\n if (sketchEvent.state === 'active') {\n addMeasurementLabels([sketchEvent.graphic])\n }\n if (sketchEvent.state === 'complete') {\n if (selectedGraphicAttributes) {\n sketchEvent.graphic.attributes = {\n name: selectedGraphicAttributes.value,\n label: selectedGraphicAttributes.label,\n description: selectedGraphicAttributes.description,\n }\n setSelectedGraphicAttributes(undefined)\n }\n updateDrawingInputSubmissionValue()\n clearMeasurementLabels()\n }\n if (sketchEvent.state === 'cancel') {\n setSelectedGraphicAttributes(undefined)\n clearMeasurementLabels()\n }\n }, 100),\n )\n\n const updateListener = sketchToolRef.current?.on(\n 'update',\n throttle((sketchEvent: __esri.SketchUpdateEvent) => {\n if (sketchEvent.state === 'active') {\n addMeasurementLabels(sketchEvent.graphics)\n }\n if (sketchEvent.state === 'complete') {\n // only update the submission value if the graphic's geometry was actually changed\n if (\n JSON.stringify(sketchEvent.graphics[0].geometry.toJSON()) !==\n selectedGraphicForUpdate.current\n ) {\n updateDrawingInputSubmissionValue()\n }\n selectedGraphicForUpdate.current = undefined\n clearMeasurementLabels()\n }\n if (sketchEvent.state === 'start') {\n selectedGraphicForUpdate.current = JSON.stringify(\n sketchEvent.graphics[0].geometry.clone().toJSON(),\n )\n addMeasurementLabels(sketchEvent.graphics)\n }\n }, 100),\n )\n\n const deleteListener = sketchToolRef.current?.on('delete', () => {\n mapViewRef.current?.closePopup()\n updateDrawingInputSubmissionValue()\n clearMeasurementLabels()\n })\n\n const mapViewChangeListener = mapViewRef.current?.watch(\n 'stationary',\n () => {\n const mapView = mapViewRef.current\n if (mapView && mapView.stationary) {\n const hasViewChanged =\n mapView.zoom !== value?.view?.zoom ||\n mapView.center.longitude !== value?.view?.longitude ||\n mapView.center.latitude !== value?.view?.latitude\n if (hasViewChanged) {\n updateMapViewSubmissionValue()\n }\n }\n },\n )\n\n const sketchToolListener = sketchToolRef.current?.viewModel.watch(\n 'activeTool',\n () => {\n if (selectedGraphicAttributes) {\n return\n }\n const activeTool = sketchToolRef.current?.activeTool\n const hasGraphicAttributeOptions = !!element.allowedDrawingTools?.find(\n (tool) => tool.type === activeTool,\n )?.graphicAttributeOptions?.length\n\n if (activeTool) {\n if (\n hasGraphicAttributeOptions &&\n (activeTool === 'point' ||\n activeTool === 'polygon' ||\n activeTool === 'circle' ||\n activeTool === 'rectangle' ||\n activeTool === 'polyline')\n ) {\n // the sketch.create() fn only allows active tools of the above 5 types\n // hence we must check above to keep the types happy further down the line\n sketchToolRef.current?.cancel()\n setActiveSketchToolMenu(activeTool)\n } else {\n setActiveSketchToolMenu(undefined)\n }\n }\n },\n )\n\n mapViewRef.current?.on('click', (event) => {\n mapViewRef.current?.hitTest(event).then((response) => {\n // the \"hit test\" will typically yield the graphic we want to display the popup for,\n // and an ArcGIS built-in graphic which highlights the selected graphic.\n // By filtering for the graphic with the \"label\" attribute, we're able to reliably\n // get the graphic we want to display the popup for.\n const result = response.results\n .filter((r) => r.type === 'graphic')\n .find((r) => !!r.graphic.attributes?.label)\n\n if (result) {\n mapViewRef.current?.openPopup({\n title: result.graphic.attributes.label,\n content: result.graphic.attributes.description,\n })\n }\n })\n })\n\n return () => {\n createListener?.remove()\n updateListener?.remove()\n deleteListener?.remove()\n mapViewChangeListener?.remove()\n sketchToolListener?.remove()\n }\n }, [\n isLoading,\n value,\n updateDrawingInputSubmissionValue,\n updateMapViewSubmissionValue,\n element,\n selectedGraphicAttributes,\n addMeasurementLabels,\n clearMeasurementLabels,\n ])\n\n const onSubmissionValueChange = React.useCallback(() => {\n const view = mapViewRef.current\n const map = mapViewRef.current?.map\n if (!view || !map) return\n\n const newLayerIds = value?.layers?.map((l) => l.id)\n // remove map layers no longer in submission value\n if (overlayLayerIds) {\n const layersToRemove = overlayLayerIds.reduce((toRemove: Layer[], id) => {\n if (!newLayerIds?.includes(id)) {\n const layer = map.layers.find((layer) => layer.id === id)\n if (layer) toRemove.push(layer)\n }\n return toRemove\n }, [])\n map.layers.removeMany(layersToRemove)\n }\n\n if (value?.layers) {\n // determine if a layer is new or existing and handle accordingly\n for (const layer of value.layers) {\n const existingLayer = map.layers.find(\n (mapLayer) => mapLayer.id === layer.id,\n )\n if (!existingLayer) {\n const newLayer = new GraphicsLayer({\n title: layer.title as string,\n id: layer.id,\n })\n newLayer.addMany(layer.graphics.map((g) => Graphic.fromJSON(g)))\n newLayer.visible =\n typeof layer.visible === 'boolean' ? layer.visible : true\n map.layers.add(newLayer)\n } else if (existingLayer && existingLayer.type === 'graphics') {\n const existingGraphicLayer = existingLayer as GraphicsLayer\n existingGraphicLayer.title = layer.title\n existingGraphicLayer.graphics.removeAll()\n existingGraphicLayer.addMany(\n layer.graphics.map((g) => Graphic.fromJSON(g)),\n )\n existingGraphicLayer.visible =\n typeof layer.visible === 'boolean' ? layer.visible : true\n }\n }\n }\n\n // finally, set the new layer ids in state\n setOverlayLayerIds(newLayerIds)\n\n // update the web map's drawing layers\n const drawingLayer = drawingLayerRef.current\n if (value?.drawingLayer && drawingLayer) {\n drawingLayer.removeAll()\n drawingLayer.addMany(value.drawingLayer.map((g) => Graphic.fromJSON(g)))\n }\n if (value?.view) {\n view.zoom = value.view.zoom\n view.center = new Point({\n latitude: value.view.latitude,\n longitude: value.view.longitude,\n })\n }\n }, [overlayLayerIds, value])\n\n React.useEffect(() => {\n if (!isLoading && mapViewRef.current) {\n onSubmissionValueChange()\n }\n // only run the above when the submission value changes or the map finishes loading\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value, isLoading])\n\n const drawingOptionsContainerId = `OneBlinkDrawingOptionsSelector-${element.id}`\n\n React.useEffect(() => {\n const loadMap = async () => {\n try {\n const map = new WebMap({\n portalItem: {\n id: element.webMapId,\n },\n basemap: element.basemapId || 'streets',\n })\n await map.load()\n\n const view = new MapView({\n map: map,\n container: ref.current || undefined,\n popup: new Popup({\n dockEnabled: true,\n dockOptions: {\n buttonEnabled: false,\n breakpoint: false,\n position: 'bottom-left',\n },\n }),\n })\n\n // remove default widgets\n const components = view.ui.getComponents()\n for (const component of components) {\n view.ui.remove(component)\n }\n\n if (element.addressSearchWidgetEnabled) {\n view.ui.add(\n new Search({\n view,\n }),\n 'top-left',\n )\n }\n\n if (element.homeWidgetEnabled) {\n view.ui.add(\n new Home({\n view,\n }),\n 'top-left',\n )\n }\n\n view.ui.add(\n new Zoom({\n view,\n }),\n 'bottom-right',\n )\n\n const layerList = new LayerList({\n view,\n })\n\n layerPanelRef.current = new Expand({\n expandIcon: 'layers',\n view,\n content: layerList,\n expanded: element.showLayerPanel,\n mode: 'floating',\n visible: false,\n })\n\n view.ui.add(layerPanelRef.current, 'top-right')\n\n const baseMapGallery = new BaseMapGallery({ view })\n\n mapGalleryPanelRef.current = new Expand({\n expandIcon: 'basemap',\n view,\n content: baseMapGallery,\n mode: 'floating',\n visible: false,\n })\n\n view.ui.add(mapGalleryPanelRef.current, 'top-left')\n\n if (!element.readOnly && element.allowedDrawingTools?.length) {\n const drawingLayer = new GraphicsLayer({\n id: uuid(),\n title: 'Drawing',\n })\n drawingLayerRef.current = drawingLayer\n map.layers.add(drawingLayer)\n\n // Add measurement layer above drawing layer\n if (element.measurementDimensionsEnabled) {\n const measurementLayer = new GraphicsLayer({\n id: uuid(),\n title: 'Measurements',\n listMode: 'hide',\n })\n measurementLayerRef.current = measurementLayer\n map.layers.add(measurementLayer)\n }\n\n const sketch = new Sketch({\n view,\n layer: drawingLayer,\n creationMode: 'single',\n layout: 'vertical',\n availableCreateTools: [\n 'point',\n 'polyline',\n 'polygon',\n 'rectangle',\n 'circle',\n ].filter((createTool) =>\n element.allowedDrawingTools?.find(\n (tool) => tool.type === createTool,\n ),\n ),\n // hiding the below by default\n visibleElements: {\n duplicateButton: false,\n settingsMenu: false,\n undoRedoMenu: false,\n selectionTools: {\n 'lasso-selection': false,\n 'rectangle-selection': false,\n },\n },\n })\n sketchToolRef.current = sketch\n view.ui.add(sketch, 'bottom-right')\n view.ui.add(drawingOptionsContainerId, 'bottom-right')\n }\n\n // once the view has loaded\n view.when(() => {\n mapViewRef.current = view\n setIsLoading(false)\n })\n } catch (e) {\n console.warn('Error while trying to load arcgis web map ', e)\n setLoadError(e as Error)\n setIsLoading(false)\n }\n }\n\n if (!mapViewRef.current && !isLoading) {\n setIsLoading(true)\n loadMap()\n }\n }, [drawingOptionsContainerId, element, isLoading, value])\n\n React.useEffect(() => {\n if (!isLoading) {\n if (isPageVisible) {\n if (layerPanelRef.current) {\n layerPanelRef.current.visible = true\n }\n if (mapGalleryPanelRef.current) {\n mapGalleryPanelRef.current.visible = true\n }\n } else {\n if (layerPanelRef.current) {\n layerPanelRef.current.visible = false\n }\n if (mapGalleryPanelRef.current) {\n mapGalleryPanelRef.current.visible = false\n }\n }\n }\n }, [isPageVisible, isLoading])\n\n if (loadError) {\n return (\n <figure className=\"ob-figure\">\n <div className=\"figure-content has-text-centered\">\n <MaterialIcon className=\"icon-large has-margin-bottom-6 has-text-warning\">\n error\n </MaterialIcon>\n <h4 className=\"title is-4\">We were unable to display your web map</h4>\n <p>{loadError.message}</p>\n </div>\n </figure>\n )\n }\n\n return (\n <>\n {isLoading && <OnLoading />}\n <div\n className=\"arcgis-web-map\"\n ref={ref}\n id={id}\n aria-describedby={props['aria-describedby']}\n />\n <div id={drawingOptionsContainerId}>\n {!!activeSketchToolMenu && sketchToolRef.current && (\n <DrawingOptionsList\n options={\n element.allowedDrawingTools?.find(\n (tool) => tool.type === activeSketchToolMenu,\n )?.graphicAttributeOptions || []\n }\n onClose={() => setActiveSketchToolMenu(undefined)}\n setSelectedGraphicAttributes={(opt) => {\n setSelectedGraphicAttributes(opt)\n }}\n sketchToolType={activeSketchToolMenu}\n sketchTool={sketchToolRef.current}\n />\n )}\n </div>\n </>\n )\n}\n\nexport default React.memo(FormElementArcGISWebMap)\n"]}
1
+ {"version":3,"file":"ArcGISWebMap.js","sourceRoot":"","sources":["../../src/components/ArcGISWebMap.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport { FormTypes } from '@oneblink/types'\nimport MapView from '@arcgis/core/views/MapView'\nimport WebMap from '@arcgis/core/WebMap'\nimport Home from '@arcgis/core/widgets/Home'\nimport Search from '@arcgis/core/widgets/Search'\nimport Zoom from '@arcgis/core/widgets/Zoom'\nimport LayerList from '@arcgis/core/widgets/LayerList'\nimport Expand from '@arcgis/core/widgets/Expand'\nimport BaseMapGallery from '@arcgis/core/widgets/BasemapGallery'\nimport Sketch from '@arcgis/core/widgets/Sketch'\nimport GraphicsLayer from '@arcgis/core/layers/GraphicsLayer'\nimport Graphic from '@arcgis/core/Graphic'\nimport Popup from '@arcgis/core/widgets/Popup'\nimport {\n Point,\n Polygon,\n SpatialReference,\n Polyline,\n} from '@arcgis/core/geometry'\nimport TextSymbol from '@arcgis/core/symbols/TextSymbol'\nimport * as geometryEngine from '@arcgis/core/geometry/geometryEngine'\nimport { Box, Divider, IconButton } from '@mui/material'\nimport throttle from 'lodash.throttle'\nimport { localisationService } from '@oneblink/apps'\nimport { v4 as uuid } from 'uuid'\n\nimport OnLoading from '../components/renderer/OnLoading'\nimport MaterialIcon from './MaterialIcon'\n\nimport useIsPageVisible from '../hooks/useIsPageVisible'\nimport { ArcGISWebMapElementValue } from '@oneblink/types/typescript/arcgis'\nimport { FormElementValueChangeHandler } from '../types/form'\nimport '../styles/arcgis-external.css'\n\ntype Props = {\n element: FormTypes.ArcGISWebMapElement\n id: string\n value: ArcGISWebMapElementValue | undefined\n onChange: FormElementValueChangeHandler<ArcGISWebMapElementValue>\n 'aria-describedby'?: string\n setIsDirty: () => void\n}\n\ntype SketchCreateTool = Parameters<Sketch['create']>[0]\n\nfunction DrawingOptionsList({\n options,\n sketchTool,\n onClose,\n sketchToolType,\n setSelectedGraphicAttributes,\n}: {\n options: { id: string; label: string; value: string; description?: string }[]\n onClose: () => void\n sketchTool: Sketch\n sketchToolType: SketchCreateTool\n setSelectedGraphicAttributes: (opt: {\n label: string\n value: string\n description?: string\n }) => void\n}) {\n return (\n <div className=\"esri-widget\">\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n }}\n >\n <b style={{ padding: '0.5rem' }}>Select an option</b>\n <IconButton\n onClick={(e) => {\n e.stopPropagation()\n onClose()\n }}\n size=\"small\"\n data-cypress=\"copy-to-clip-board-button\"\n >\n <MaterialIcon fontSize=\"small\">close</MaterialIcon>\n </IconButton>\n </Box>\n <Divider sx={{ backgroundColor: 'unset', margin: '0px 8px' }} />\n <Box sx={{ maxHeight: '200px', overflowY: 'auto' }}>\n {options?.map(({ id, value, label, description }) => (\n <div\n key={id}\n className=\"ob-list__item is-clickable\"\n style={{ alignItems: 'center' }}\n onClick={() => {\n onClose()\n sketchTool?.create(sketchToolType)\n setSelectedGraphicAttributes({ value, label, description })\n }}\n >\n {label}\n </div>\n ))}\n </Box>\n </div>\n )\n}\n\nfunction FormElementArcGISWebMap({\n element,\n id,\n value,\n onChange,\n setIsDirty,\n ...props\n}: Props) {\n const ref = React.useRef<HTMLDivElement | null>(null)\n const layerPanelRef = React.useRef<Expand>()\n const mapGalleryPanelRef = React.useRef<Expand>()\n const sketchToolRef = React.useRef<Sketch>()\n const drawingLayerRef = React.useRef<GraphicsLayer>()\n const selectedGraphicForUpdate = React.useRef<string>()\n const mapViewRef = React.useRef<MapView>()\n const measurementLayerRef = React.useRef<GraphicsLayer>()\n\n const [loadError, setLoadError] = React.useState<Error>()\n const [isLoading, setIsLoading] = React.useState<boolean>(false)\n const isPageVisible = useIsPageVisible()\n const [selectedGraphicAttributes, setSelectedGraphicAttributes] =\n React.useState<{\n value: string\n label: string\n description?: string\n }>()\n // only used when an allowed drawing tool also has a list of graphic attribute options to display to the user\n const [activeSketchToolMenu, setActiveSketchToolMenu] =\n React.useState<SketchCreateTool>()\n\n const updateDrawingInputSubmissionValue = React.useCallback(() => {\n const updatedGraphics = drawingLayerRef.current?.graphics\n .toArray()\n .map((graphic) => graphic.toJSON())\n\n onChange(element, {\n value: {\n ...(value || {}),\n drawingLayer: updatedGraphics,\n userInput: updatedGraphics,\n },\n })\n\n setIsDirty()\n }, [element, onChange, setIsDirty, value])\n\n const updateMapViewSubmissionValue = React.useCallback(() => {\n const zoom = mapViewRef.current?.zoom\n const latitude = mapViewRef.current?.center.latitude\n const longitude = mapViewRef.current?.center.longitude\n if (zoom && latitude && longitude) {\n onChange(element, {\n value: {\n ...(value || {}),\n view: {\n zoom,\n latitude,\n longitude,\n },\n },\n })\n }\n }, [element, onChange, value])\n\n const getGeometryPoints = (\n geom: __esri.Geometry,\n spatialRef: SpatialReference,\n ) => {\n if (geom.type === 'polygon') {\n const polygon = geom as Polygon\n return polygon.rings[0].map(\n (ring) =>\n new Point({\n x: ring[0],\n y: ring[1],\n spatialReference: spatialRef,\n }),\n )\n } else if (geom.type === 'polyline') {\n const polyline = geom as Polyline\n return polyline.paths[0].map(\n (path) =>\n new Point({\n x: path[0],\n y: path[1],\n spatialReference: spatialRef,\n }),\n )\n }\n }\n\n const addMeasurementLabels = React.useCallback(\n (graphics: __esri.Graphic[]) => {\n if (!element.measurementDimensionsEnabled) return\n const spatialRef = new SpatialReference({ wkid: 3857 })\n const measurementLayer = measurementLayerRef.current\n const mapView = mapViewRef.current\n if (!measurementLayer || !mapView) return\n measurementLayer.removeAll()\n\n for (const graphic of graphics) {\n const geom = graphic.geometry\n if (!geom || (geom.type !== 'polygon' && geom.type !== 'polyline'))\n continue\n\n const points = getGeometryPoints(geom, spatialRef)\n if (!points) continue\n\n const { distanceUnit, distanceUnitShortName } =\n localisationService.getDistanceUnits()\n if (distanceUnit !== 'meters' && distanceUnit !== 'feet') {\n console.warn(\n 'Unsupported distance unit provided in tenant configuration: ',\n distanceUnit,\n )\n return\n }\n const graphics: Graphic[] = []\n\n for (let i = 1; i < points.length; i++) {\n const x1 = points[i].x\n const x2 = points[i - 1].x\n const y1 = points[i].y\n const y2 = points[i - 1].y\n\n const midpoint = new Point({\n x: (x1 + x2) / 2,\n y: (y1 + y2) / 2,\n spatialReference: spatialRef,\n })\n\n // Angle of the measurement label - this will be rotated to be parallel with the polygon or polyline edge\n const dx = x2 - x1\n const dy = y2 - y1\n const radians = Math.atan2(dy, dx)\n let angle = radians * (-180 / Math.PI)\n if (angle > 90 || angle < -90) {\n angle += 180\n }\n\n // offset of the measurement label against the edge of the polygon/polyline it's measuring\n const pixelOffset = 10\n const normalAngle = radians + Math.PI / 2\n const offsetScreenX = pixelOffset * Math.cos(normalAngle)\n const offsetScreenY = pixelOffset * Math.sin(normalAngle)\n\n const screenPoint = mapView.toScreen(midpoint)\n screenPoint.x += offsetScreenX\n screenPoint.y -= offsetScreenY\n const offsetMapPoint = mapView.toMap(screenPoint)\n\n const polyline = new Polyline({\n paths: [\n [\n [points[i].longitude, points[i].latitude],\n [points[i - 1].longitude, points[i - 1].latitude],\n ],\n ],\n spatialReference: { wkid: 4326 },\n })\n const distance = geometryEngine.geodesicLength(polyline, distanceUnit)\n graphics.push(\n new Graphic({\n geometry: offsetMapPoint,\n symbol: new TextSymbol({\n text: distance.toFixed(0) + distanceUnitShortName,\n color: 'black',\n haloColor: 'white',\n haloSize: 1,\n angle,\n }),\n }),\n )\n }\n\n measurementLayer.addMany(graphics)\n mapViewRef.current?.map.reorder(\n measurementLayer,\n mapViewRef.current?.map.layers.length,\n )\n }\n },\n [element],\n )\n\n const clearMeasurementLabels = React.useCallback(() => {\n if (measurementLayerRef.current) {\n measurementLayerRef.current.removeAll()\n }\n }, [])\n\n React.useEffect(() => {\n if (element.readOnly) return\n // event listeners for drawing tool creates/updates/deletes\n // these need to be removed and recreated when the submission value changes\n // to ensure they always have access to the latest submission value\n const createListener = sketchToolRef.current?.on(\n 'create',\n throttle((sketchEvent: __esri.SketchCreateEvent) => {\n if (sketchEvent.state === 'active') {\n addMeasurementLabels([sketchEvent.graphic])\n }\n if (sketchEvent.state === 'complete') {\n if (selectedGraphicAttributes) {\n sketchEvent.graphic.attributes = {\n name: selectedGraphicAttributes.value,\n label: selectedGraphicAttributes.label,\n description: selectedGraphicAttributes.description,\n }\n setSelectedGraphicAttributes(undefined)\n }\n updateDrawingInputSubmissionValue()\n clearMeasurementLabels()\n }\n if (sketchEvent.state === 'cancel') {\n setSelectedGraphicAttributes(undefined)\n clearMeasurementLabels()\n }\n }, 100),\n )\n\n const updateListener = sketchToolRef.current?.on(\n 'update',\n throttle((sketchEvent: __esri.SketchUpdateEvent) => {\n if (sketchEvent.state === 'active') {\n addMeasurementLabels(sketchEvent.graphics)\n }\n if (sketchEvent.state === 'complete') {\n // only update the submission value if the graphic's geometry was actually changed\n if (\n JSON.stringify(sketchEvent.graphics[0].geometry.toJSON()) !==\n selectedGraphicForUpdate.current\n ) {\n updateDrawingInputSubmissionValue()\n }\n selectedGraphicForUpdate.current = undefined\n clearMeasurementLabels()\n }\n if (sketchEvent.state === 'start') {\n selectedGraphicForUpdate.current = JSON.stringify(\n sketchEvent.graphics[0].geometry.clone().toJSON(),\n )\n addMeasurementLabels(sketchEvent.graphics)\n }\n }, 100),\n )\n\n const deleteListener = sketchToolRef.current?.on('delete', () => {\n mapViewRef.current?.closePopup()\n updateDrawingInputSubmissionValue()\n clearMeasurementLabels()\n })\n\n const mapViewChangeListener = mapViewRef.current?.watch(\n 'stationary',\n () => {\n const mapView = mapViewRef.current\n if (mapView && mapView.stationary) {\n const hasViewChanged =\n mapView.zoom !== value?.view?.zoom ||\n mapView.center.longitude !== value?.view?.longitude ||\n mapView.center.latitude !== value?.view?.latitude\n if (hasViewChanged) {\n updateMapViewSubmissionValue()\n }\n }\n },\n )\n\n const sketchToolListener = sketchToolRef.current?.viewModel.watch(\n 'activeTool',\n () => {\n if (selectedGraphicAttributes) {\n return\n }\n const activeTool = sketchToolRef.current?.activeTool\n const hasGraphicAttributeOptions = !!element.allowedDrawingTools?.find(\n (tool) => tool.type === activeTool,\n )?.graphicAttributeOptions?.length\n\n if (activeTool) {\n if (\n hasGraphicAttributeOptions &&\n (activeTool === 'point' ||\n activeTool === 'polygon' ||\n activeTool === 'circle' ||\n activeTool === 'rectangle' ||\n activeTool === 'polyline')\n ) {\n // the sketch.create() fn only allows active tools of the above 5 types\n // hence we must check above to keep the types happy further down the line\n sketchToolRef.current?.cancel()\n setActiveSketchToolMenu(activeTool)\n } else {\n setActiveSketchToolMenu(undefined)\n }\n }\n },\n )\n\n mapViewRef.current?.on('click', (event) => {\n mapViewRef.current?.hitTest(event).then((response) => {\n // the \"hit test\" will typically yield the graphic we want to display the popup for,\n // and an ArcGIS built-in graphic which highlights the selected graphic.\n // By filtering for the graphic with the \"label\" attribute, we're able to reliably\n // get the graphic we want to display the popup for.\n const result = response.results\n .filter((r) => r.type === 'graphic')\n .find((r) => !!r.graphic.attributes?.label)\n\n if (result) {\n mapViewRef.current?.openPopup({\n title: result.graphic.attributes.label,\n content: result.graphic.attributes.description,\n })\n }\n })\n })\n\n return () => {\n createListener?.remove()\n updateListener?.remove()\n deleteListener?.remove()\n mapViewChangeListener?.remove()\n sketchToolListener?.remove()\n }\n }, [\n isLoading,\n value,\n updateDrawingInputSubmissionValue,\n updateMapViewSubmissionValue,\n element,\n selectedGraphicAttributes,\n addMeasurementLabels,\n clearMeasurementLabels,\n ])\n\n const [initialStringifedLayers] = React.useState(() =>\n JSON.stringify(value?.layers),\n )\n const stringifedLayersRef = React.useRef<string>(initialStringifedLayers)\n\n const onSubmissionValueChange = React.useCallback(() => {\n const view = mapViewRef.current\n const map = mapViewRef.current?.map\n if (!view || !map) return\n\n // if the layers have changed, remove all layers and repaint\n const currentStringifedLayers = JSON.stringify(value?.layers)\n if (stringifedLayersRef.current !== currentStringifedLayers) {\n stringifedLayersRef.current = currentStringifedLayers\n // remove all layers and repaint\n map.layers.removeAll()\n\n if (value?.layers) {\n for (const layer of value.layers) {\n const newLayer = new GraphicsLayer({\n title: layer.title as string,\n id: layer.id,\n })\n newLayer.addMany(layer.graphics.map((g) => Graphic.fromJSON(g)))\n newLayer.visible =\n typeof layer.visible === 'boolean' ? layer.visible : true\n map.layers.add(newLayer)\n }\n }\n }\n\n // add the web map's drawing layers back\n const drawingLayer = drawingLayerRef.current\n if (value?.drawingLayer && drawingLayer) {\n drawingLayer.removeAll()\n drawingLayer.addMany(value.drawingLayer.map((g) => Graphic.fromJSON(g)))\n map.layers.add(drawingLayer)\n map.layers.reorder(drawingLayer, map.layers.length - 1)\n }\n if (value?.view) {\n view.zoom = value.view.zoom\n view.center = new Point({\n latitude: value.view.latitude,\n longitude: value.view.longitude,\n })\n }\n }, [value])\n\n React.useEffect(() => {\n if (!isLoading && mapViewRef.current) {\n onSubmissionValueChange()\n }\n // only run the above when the submission value changes or the map finishes loading\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value, isLoading])\n\n const drawingOptionsContainerId = `OneBlinkDrawingOptionsSelector-${element.id}`\n\n React.useEffect(() => {\n const loadMap = async () => {\n try {\n const map = new WebMap({\n portalItem: {\n id: element.webMapId,\n },\n basemap: element.basemapId || 'streets',\n })\n await map.load()\n\n const view = new MapView({\n map: map,\n container: ref.current || undefined,\n popup: new Popup({\n dockEnabled: true,\n dockOptions: {\n buttonEnabled: false,\n breakpoint: false,\n position: 'bottom-left',\n },\n }),\n })\n\n // remove default widgets\n const components = view.ui.getComponents()\n for (const component of components) {\n view.ui.remove(component)\n }\n\n if (element.addressSearchWidgetEnabled) {\n view.ui.add(\n new Search({\n view,\n }),\n 'top-left',\n )\n }\n\n if (element.homeWidgetEnabled) {\n view.ui.add(\n new Home({\n view,\n }),\n 'top-left',\n )\n }\n\n view.ui.add(\n new Zoom({\n view,\n }),\n 'bottom-right',\n )\n\n const layerList = new LayerList({\n view,\n })\n\n layerPanelRef.current = new Expand({\n expandIcon: 'layers',\n view,\n content: layerList,\n expanded: element.showLayerPanel,\n mode: 'floating',\n visible: false,\n })\n\n view.ui.add(layerPanelRef.current, 'top-right')\n\n const baseMapGallery = new BaseMapGallery({ view })\n\n mapGalleryPanelRef.current = new Expand({\n expandIcon: 'basemap',\n view,\n content: baseMapGallery,\n mode: 'floating',\n visible: false,\n })\n\n view.ui.add(mapGalleryPanelRef.current, 'top-left')\n\n if (!element.readOnly && element.allowedDrawingTools?.length) {\n const drawingLayer = new GraphicsLayer({\n id: uuid(),\n title: 'Drawing',\n })\n drawingLayerRef.current = drawingLayer\n map.layers.add(drawingLayer)\n\n // Add measurement layer above drawing layer\n if (element.measurementDimensionsEnabled) {\n const measurementLayer = new GraphicsLayer({\n id: uuid(),\n title: 'Measurements',\n listMode: 'hide',\n })\n measurementLayerRef.current = measurementLayer\n map.layers.add(measurementLayer)\n }\n\n const sketch = new Sketch({\n view,\n layer: drawingLayer,\n creationMode: 'single',\n layout: 'vertical',\n availableCreateTools: [\n 'point',\n 'polyline',\n 'polygon',\n 'rectangle',\n 'circle',\n ].filter((createTool) =>\n element.allowedDrawingTools?.find(\n (tool) => tool.type === createTool,\n ),\n ),\n // hiding the below by default\n visibleElements: {\n duplicateButton: false,\n settingsMenu: false,\n undoRedoMenu: false,\n selectionTools: {\n 'lasso-selection': false,\n 'rectangle-selection': false,\n },\n },\n })\n sketchToolRef.current = sketch\n view.ui.add(sketch, 'bottom-right')\n view.ui.add(drawingOptionsContainerId, 'bottom-right')\n }\n\n // once the view has loaded\n view.when(() => {\n mapViewRef.current = view\n setIsLoading(false)\n })\n } catch (e) {\n console.warn('Error while trying to load arcgis web map ', e)\n setLoadError(e as Error)\n setIsLoading(false)\n }\n }\n\n if (!mapViewRef.current && !isLoading) {\n setIsLoading(true)\n loadMap()\n }\n }, [drawingOptionsContainerId, element, isLoading, value])\n\n React.useEffect(() => {\n if (!isLoading) {\n if (isPageVisible) {\n if (layerPanelRef.current) {\n layerPanelRef.current.visible = true\n }\n if (mapGalleryPanelRef.current) {\n mapGalleryPanelRef.current.visible = true\n }\n } else {\n if (layerPanelRef.current) {\n layerPanelRef.current.visible = false\n }\n if (mapGalleryPanelRef.current) {\n mapGalleryPanelRef.current.visible = false\n }\n }\n }\n }, [isPageVisible, isLoading])\n\n if (loadError) {\n return (\n <figure className=\"ob-figure\">\n <div className=\"figure-content has-text-centered\">\n <MaterialIcon className=\"icon-large has-margin-bottom-6 has-text-warning\">\n error\n </MaterialIcon>\n <h4 className=\"title is-4\">We were unable to display your web map</h4>\n <p>{loadError.message}</p>\n </div>\n </figure>\n )\n }\n\n return (\n <>\n {isLoading && <OnLoading />}\n <div\n className=\"arcgis-web-map\"\n ref={ref}\n id={id}\n aria-describedby={props['aria-describedby']}\n />\n <div id={drawingOptionsContainerId}>\n {!!activeSketchToolMenu && sketchToolRef.current && (\n <DrawingOptionsList\n options={\n element.allowedDrawingTools?.find(\n (tool) => tool.type === activeSketchToolMenu,\n )?.graphicAttributeOptions || []\n }\n onClose={() => setActiveSketchToolMenu(undefined)}\n setSelectedGraphicAttributes={(opt) => {\n setSelectedGraphicAttributes(opt)\n }}\n sketchToolType={activeSketchToolMenu}\n sketchTool={sketchToolRef.current}\n />\n )}\n </div>\n </>\n )\n}\n\nexport default React.memo(FormElementArcGISWebMap)\n"]}
@@ -7,6 +7,7 @@ import { localisationService } from '@oneblink/apps';
7
7
  import { formElementsService } from '@oneblink/sdk-core';
8
8
  import QuillHTML from '../components/QuillHTML';
9
9
  import MaterialIcon from '../components/MaterialIcon';
10
+ import useFormDefinition from '../hooks/useFormDefinition';
10
11
  const isUnenteredValue = (value) => {
11
12
  return !value && value !== 0;
12
13
  };
@@ -21,6 +22,7 @@ function roundToFixed(number, decimals) {
21
22
  }
22
23
  function FormElementCalculation({ element, onChange, value }) {
23
24
  const { formSubmissionModel } = useFormSubmissionModel();
25
+ const form = useFormDefinition();
24
26
  const htmlValue = React.useMemo(() => {
25
27
  let htmlTemplate;
26
28
  if (!isNaN(value)) {
@@ -119,6 +121,16 @@ function FormElementCalculation({ element, onChange, value }) {
119
121
  return total + value;
120
122
  }, 0);
121
123
  }
124
+ // if the value is an object, we take the element name and check to see
125
+ // if this element is a nested form element. If so, we take the next nested element name,
126
+ // find its value in the object and return it for the next iteration to handle
127
+ if (typeof elementValue === 'object') {
128
+ const formFormElement = formElementsService.findFormElement(form.elements, (e) => e.type === 'form' && e.name === nestedElementNames[index]);
129
+ const nextElementName = nestedElementNames[index + 1];
130
+ if (formFormElement && nextElementName) {
131
+ return elementValue[nextElementName];
132
+ }
133
+ }
122
134
  // "compliance" form element has an object value with a "value" property.
123
135
  if (isObjectWithValue(elementValue) &&
124
136
  typeof elementValue.value === 'string') {
@@ -129,7 +141,7 @@ function FormElementCalculation({ element, onChange, value }) {
129
141
  return NaN;
130
142
  }, defaultAccumulator);
131
143
  });
132
- }, []);
144
+ }, [form.elements]);
133
145
  const { calculation, hasError } = React.useMemo(() => {
134
146
  const exprParser = new ExpressionParser();
135
147
  exprParser.registerFunction('ROUND', (value, precision) => {
@@ -1 +1 @@
1
- {"version":3,"file":"FormElementCalculation.js","sourceRoot":"","sources":["../../src/form-elements/FormElementCalculation.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport ExpressionParser from 'morph-expressions'\nimport escapeString from 'escape-string-regexp'\nimport useFormSubmissionModel from '../hooks/useFormSubmissionModelContext'\nimport { FormTypes, SubmissionTypes } from '@oneblink/types'\nimport { Sentry } from '@oneblink/apps'\nimport { localisationService } from '@oneblink/apps'\nimport { FormElementValueChangeHandler } from '../types/form'\nimport { formElementsService } from '@oneblink/sdk-core'\nimport QuillHTML from '../components/QuillHTML'\nimport MaterialIcon from '../components/MaterialIcon'\n\ntype Props = {\n element: FormTypes.CalculationElement\n onChange: FormElementValueChangeHandler<number>\n value: unknown | undefined\n}\n\nconst isUnenteredValue = (value: unknown | undefined) => {\n return !value && value !== 0\n}\n\nconst isObjectWithValue = (obj: unknown): obj is { value: unknown } => {\n return typeof obj === 'object' && obj !== null && 'value' in obj\n}\n\n// workaround for .toFixed() not rounding floating point numbers correctly\nfunction roundToFixed(number: number, decimals: number) {\n const multiplier = Math.pow(10, decimals)\n const roundedNumber = Math.round(number * multiplier) / multiplier\n return roundedNumber.toFixed(decimals)\n}\n\nfunction FormElementCalculation({ element, onChange, value }: Props) {\n const { formSubmissionModel } = useFormSubmissionModel()\n\n const htmlValue = React.useMemo(() => {\n let htmlTemplate\n\n if (!isNaN(value as number)) {\n htmlTemplate = element.defaultValue\n } else {\n console.log(\n '[Calculation] Was not a number... setting pre-calculation display',\n )\n htmlTemplate = element.preCalculationDisplay\n }\n\n const numberValue = typeof value === 'number' ? value : 0\n return (htmlTemplate || '').replace(\n /{result}/gi,\n element.displayAsCurrency\n ? localisationService.formatCurrency(numberValue)\n : localisationService.formatNumber(numberValue),\n )\n }, [element, value])\n\n const registerProperty = React.useCallback(\n (\n exprParser: typeof ExpressionParser,\n {\n replacement,\n nestedElementNames,\n }: {\n replacement: string\n nestedElementNames: string[]\n },\n ) => {\n exprParser.registerProperty(\n replacement,\n (submission: SubmissionTypes.S3SubmissionData['submission']) => {\n const defaultAccumulator = submission[nestedElementNames[0]]\n return nestedElementNames.reduce(\n (\n elementValue: unknown | undefined,\n elementName: string,\n index: number,\n ) => {\n // Numbers can just be returned as is\n if (typeof elementValue === 'number') {\n return elementValue\n }\n\n // attempt to get a number from the element value as a string.\n // NaN is accounted for is the calculation\n // so we can return that from here\n if (typeof elementValue === 'string') {\n // The string could be an iso date string, or a string\n // resembling a date. We need to parse the value as an ISO string\n // and as a date in the format below to cover all calculation checks\n // with 'date', 'datetime' and 'time' elements. If the string is not\n // one of these, then we want to parse it as a float.\n\n const parsedIsoDate = localisationService.generateDate({\n value: elementValue,\n daysOffset: undefined,\n })\n if (parsedIsoDate) {\n return parsedIsoDate.getTime()\n }\n const parsedDate = localisationService.generateDate({\n value: elementValue,\n daysOffset: undefined,\n })\n if (parsedDate) {\n return parsedDate.getTime()\n }\n\n return parseFloat(elementValue)\n }\n\n if (Array.isArray(elementValue)) {\n // If there are no entries, we can return null\n // to prevent the calculation from running.\n if (!elementValue.length) {\n return NaN\n }\n\n // An array could be an element that allows multiple\n // values e.g. checkboxes. If thats that case, we just\n // add them all together and move on\n const elementValues = elementValue.map((entry) =>\n parseFloat(entry),\n )\n if (elementValues.every((entry) => !Number.isNaN(entry))) {\n return elementValues.reduce(\n (number, entry) => number + entry,\n 0,\n )\n }\n\n // Other wise attempt to process it as a repeatable set\n // If we found another repeatable set to process,\n // pass it to the next element name to\n // iterate over the entries\n\n // If we are processing the entries in a repeatable set,\n // we can sum the numbers elements in the entries\n const nextElementName = nestedElementNames[index + 1]\n\n let isNestedRepeatableSet = false\n const nestedElementValues = elementValue.reduce(\n (nestedElementValues, entry) => {\n if (entry) {\n const nextElementValue = entry[nextElementName]\n if (Array.isArray(nextElementValue)) {\n if (nextElementValue.length) {\n nestedElementValues.push(...nextElementValue)\n isNestedRepeatableSet = true\n }\n } else {\n nestedElementValues.push(nextElementValue)\n }\n }\n return nestedElementValues\n },\n [],\n )\n\n // If the nested element values are all arrays, we can pass them on to the next iteration\n if (isNestedRepeatableSet) {\n return nestedElementValues\n }\n\n return nestedElementValues.reduce(\n (total: number, nestedElementValue: unknown | undefined) => {\n if (Number.isNaN(total)) {\n return NaN\n }\n const value = parseFloat(nestedElementValue as string)\n if (Number.isNaN(value)) {\n return NaN\n }\n return total + value\n },\n 0,\n )\n }\n\n // \"compliance\" form element has an object value with a \"value\" property.\n if (\n isObjectWithValue(elementValue) &&\n typeof elementValue.value === 'string'\n ) {\n return parseFloat(elementValue.value)\n }\n\n // We did not find a number value from the known elements,\n // we will assume we are at the end of the line.\n return NaN\n },\n defaultAccumulator,\n )\n },\n )\n },\n [],\n )\n\n const { calculation, hasError } = React.useMemo(() => {\n const exprParser = new ExpressionParser()\n exprParser.registerFunction('ROUND', (value: number, precision: number) => {\n if (!Number.isNaN(value) && Number.isFinite(value)) {\n return parseFloat(roundToFixed(value, precision))\n }\n return null\n })\n exprParser.registerFunction('ROUND_DOWN', (value: number) => {\n if (!Number.isNaN(value) && Number.isFinite(value)) {\n return Math.floor(value)\n }\n return null\n })\n exprParser.registerFunction('ROUND_UP', (value: number) => {\n if (!Number.isNaN(value) && Number.isFinite(value)) {\n return Math.ceil(value)\n }\n return null\n })\n exprParser.registerFunction(\n 'ISNULL',\n (value: unknown | undefined, defaultValue: number) => {\n if (isUnenteredValue(value)) {\n return defaultValue || 0\n }\n return value\n },\n )\n\n try {\n if (!element.calculation) throw new Error('Element has no calculation.')\n const elementNames: string[] = []\n formElementsService.matchElementsTagRegex(\n element.calculation,\n ({ elementName }) => {\n elementNames.push(elementName)\n },\n )\n\n const code = elementNames.reduce((code, elementName, index) => {\n const regex = new RegExp(escapeString(`{ELEMENT:${elementName}}`), 'g')\n const replacement = `a${index}`\n registerProperty(exprParser, {\n replacement,\n nestedElementNames: elementName.split('|'),\n })\n return code.replace(regex, replacement)\n }, element.calculation || '')\n\n return {\n calculation: exprParser.parse(code.trim()),\n hasError: false,\n }\n } catch (e) {\n console.warn(\n 'Error while setting up parsing for calculation element',\n element,\n e,\n )\n Sentry.captureException(e)\n return {\n calculation: null,\n hasError: true,\n }\n }\n }, [element, registerProperty])\n\n const calculateContent = React.useCallback(\n (formSubmissionModel) => {\n if (!calculation) {\n return\n }\n try {\n return calculation.eval(formSubmissionModel)\n } catch {\n //do nothing\n }\n return\n },\n [calculation],\n )\n\n // MODEL LISTENER\n React.useEffect(() => {\n const newValue = calculateContent(formSubmissionModel)\n if (value === newValue || (value === undefined && isNaN(newValue))) {\n return\n }\n if (!isNaN(newValue)) {\n onChange(element, {\n value: newValue,\n })\n } else {\n onChange(element, {\n value: undefined,\n })\n }\n }, [element, formSubmissionModel, onChange, value, calculateContent])\n\n return (\n <div className=\"cypress-calculation-element\">\n <div className=\"ob-form__element ob-calculation\">\n <QuillHTML\n html={htmlValue}\n className=\"cypress-calculation-result ob-calculation__content\"\n />\n {hasError && (\n <div\n className=\"notification cypress-calculation-is-invalid\"\n role=\"alert\"\n >\n <div className=\"columns is-vcentered\">\n <div className=\"column is-narrow\">\n <MaterialIcon className=\"has-text-warning\">error</MaterialIcon>\n </div>\n <div className=\"column\">\n <p>There is an error in the calculation for this element.</p>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n )\n}\n\nexport default React.memo(FormElementCalculation)\n"]}
1
+ {"version":3,"file":"FormElementCalculation.js","sourceRoot":"","sources":["../../src/form-elements/FormElementCalculation.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport ExpressionParser from 'morph-expressions'\nimport escapeString from 'escape-string-regexp'\nimport useFormSubmissionModel from '../hooks/useFormSubmissionModelContext'\nimport { FormTypes, SubmissionTypes } from '@oneblink/types'\nimport { Sentry } from '@oneblink/apps'\nimport { localisationService } from '@oneblink/apps'\nimport { FormElementValueChangeHandler } from '../types/form'\nimport { formElementsService } from '@oneblink/sdk-core'\nimport QuillHTML from '../components/QuillHTML'\nimport MaterialIcon from '../components/MaterialIcon'\nimport useFormDefinition from '../hooks/useFormDefinition'\n\ntype Props = {\n element: FormTypes.CalculationElement\n onChange: FormElementValueChangeHandler<number>\n value: unknown | undefined\n}\n\nconst isUnenteredValue = (value: unknown | undefined) => {\n return !value && value !== 0\n}\n\nconst isObjectWithValue = (obj: unknown): obj is { value: unknown } => {\n return typeof obj === 'object' && obj !== null && 'value' in obj\n}\n\n// workaround for .toFixed() not rounding floating point numbers correctly\nfunction roundToFixed(number: number, decimals: number) {\n const multiplier = Math.pow(10, decimals)\n const roundedNumber = Math.round(number * multiplier) / multiplier\n return roundedNumber.toFixed(decimals)\n}\n\nfunction FormElementCalculation({ element, onChange, value }: Props) {\n const { formSubmissionModel } = useFormSubmissionModel()\n const form = useFormDefinition()\n\n const htmlValue = React.useMemo(() => {\n let htmlTemplate\n\n if (!isNaN(value as number)) {\n htmlTemplate = element.defaultValue\n } else {\n console.log(\n '[Calculation] Was not a number... setting pre-calculation display',\n )\n htmlTemplate = element.preCalculationDisplay\n }\n\n const numberValue = typeof value === 'number' ? value : 0\n return (htmlTemplate || '').replace(\n /{result}/gi,\n element.displayAsCurrency\n ? localisationService.formatCurrency(numberValue)\n : localisationService.formatNumber(numberValue),\n )\n }, [element, value])\n\n const registerProperty = React.useCallback(\n (\n exprParser: typeof ExpressionParser,\n {\n replacement,\n nestedElementNames,\n }: {\n replacement: string\n nestedElementNames: string[]\n },\n ) => {\n exprParser.registerProperty(\n replacement,\n (submission: SubmissionTypes.S3SubmissionData['submission']) => {\n const defaultAccumulator = submission[nestedElementNames[0]]\n return nestedElementNames.reduce(\n (\n elementValue: unknown | undefined,\n elementName: string,\n index: number,\n ) => {\n // Numbers can just be returned as is\n if (typeof elementValue === 'number') {\n return elementValue\n }\n\n // attempt to get a number from the element value as a string.\n // NaN is accounted for is the calculation\n // so we can return that from here\n if (typeof elementValue === 'string') {\n // The string could be an iso date string, or a string\n // resembling a date. We need to parse the value as an ISO string\n // and as a date in the format below to cover all calculation checks\n // with 'date', 'datetime' and 'time' elements. If the string is not\n // one of these, then we want to parse it as a float.\n\n const parsedIsoDate = localisationService.generateDate({\n value: elementValue,\n daysOffset: undefined,\n })\n if (parsedIsoDate) {\n return parsedIsoDate.getTime()\n }\n const parsedDate = localisationService.generateDate({\n value: elementValue,\n daysOffset: undefined,\n })\n if (parsedDate) {\n return parsedDate.getTime()\n }\n\n return parseFloat(elementValue)\n }\n\n if (Array.isArray(elementValue)) {\n // If there are no entries, we can return null\n // to prevent the calculation from running.\n if (!elementValue.length) {\n return NaN\n }\n\n // An array could be an element that allows multiple\n // values e.g. checkboxes. If thats that case, we just\n // add them all together and move on\n const elementValues = elementValue.map((entry) =>\n parseFloat(entry),\n )\n if (elementValues.every((entry) => !Number.isNaN(entry))) {\n return elementValues.reduce(\n (number, entry) => number + entry,\n 0,\n )\n }\n\n // Other wise attempt to process it as a repeatable set\n // If we found another repeatable set to process,\n // pass it to the next element name to\n // iterate over the entries\n\n // If we are processing the entries in a repeatable set,\n // we can sum the numbers elements in the entries\n const nextElementName = nestedElementNames[index + 1]\n\n let isNestedRepeatableSet = false\n const nestedElementValues = elementValue.reduce(\n (nestedElementValues, entry) => {\n if (entry) {\n const nextElementValue = entry[nextElementName]\n if (Array.isArray(nextElementValue)) {\n if (nextElementValue.length) {\n nestedElementValues.push(...nextElementValue)\n isNestedRepeatableSet = true\n }\n } else {\n nestedElementValues.push(nextElementValue)\n }\n }\n return nestedElementValues\n },\n [],\n )\n\n // If the nested element values are all arrays, we can pass them on to the next iteration\n if (isNestedRepeatableSet) {\n return nestedElementValues\n }\n\n return nestedElementValues.reduce(\n (total: number, nestedElementValue: unknown | undefined) => {\n if (Number.isNaN(total)) {\n return NaN\n }\n const value = parseFloat(nestedElementValue as string)\n if (Number.isNaN(value)) {\n return NaN\n }\n return total + value\n },\n 0,\n )\n }\n\n // if the value is an object, we take the element name and check to see\n // if this element is a nested form element. If so, we take the next nested element name,\n // find its value in the object and return it for the next iteration to handle\n if (typeof elementValue === 'object') {\n const formFormElement = formElementsService.findFormElement(\n form.elements,\n (e) =>\n e.type === 'form' && e.name === nestedElementNames[index],\n )\n const nextElementName = nestedElementNames[index + 1]\n if (formFormElement && nextElementName) {\n return (elementValue as Record<string, unknown>)[\n nextElementName\n ]\n }\n }\n\n // \"compliance\" form element has an object value with a \"value\" property.\n if (\n isObjectWithValue(elementValue) &&\n typeof elementValue.value === 'string'\n ) {\n return parseFloat(elementValue.value)\n }\n\n // We did not find a number value from the known elements,\n // we will assume we are at the end of the line.\n return NaN\n },\n defaultAccumulator,\n )\n },\n )\n },\n [form.elements],\n )\n\n const { calculation, hasError } = React.useMemo(() => {\n const exprParser = new ExpressionParser()\n exprParser.registerFunction('ROUND', (value: number, precision: number) => {\n if (!Number.isNaN(value) && Number.isFinite(value)) {\n return parseFloat(roundToFixed(value, precision))\n }\n return null\n })\n exprParser.registerFunction('ROUND_DOWN', (value: number) => {\n if (!Number.isNaN(value) && Number.isFinite(value)) {\n return Math.floor(value)\n }\n return null\n })\n exprParser.registerFunction('ROUND_UP', (value: number) => {\n if (!Number.isNaN(value) && Number.isFinite(value)) {\n return Math.ceil(value)\n }\n return null\n })\n exprParser.registerFunction(\n 'ISNULL',\n (value: unknown | undefined, defaultValue: number) => {\n if (isUnenteredValue(value)) {\n return defaultValue || 0\n }\n return value\n },\n )\n\n try {\n if (!element.calculation) throw new Error('Element has no calculation.')\n const elementNames: string[] = []\n formElementsService.matchElementsTagRegex(\n element.calculation,\n ({ elementName }) => {\n elementNames.push(elementName)\n },\n )\n\n const code = elementNames.reduce((code, elementName, index) => {\n const regex = new RegExp(escapeString(`{ELEMENT:${elementName}}`), 'g')\n const replacement = `a${index}`\n registerProperty(exprParser, {\n replacement,\n nestedElementNames: elementName.split('|'),\n })\n return code.replace(regex, replacement)\n }, element.calculation || '')\n\n return {\n calculation: exprParser.parse(code.trim()),\n hasError: false,\n }\n } catch (e) {\n console.warn(\n 'Error while setting up parsing for calculation element',\n element,\n e,\n )\n Sentry.captureException(e)\n return {\n calculation: null,\n hasError: true,\n }\n }\n }, [element, registerProperty])\n\n const calculateContent = React.useCallback(\n (formSubmissionModel) => {\n if (!calculation) {\n return\n }\n try {\n return calculation.eval(formSubmissionModel)\n } catch {\n //do nothing\n }\n return\n },\n [calculation],\n )\n\n // MODEL LISTENER\n React.useEffect(() => {\n const newValue = calculateContent(formSubmissionModel)\n if (value === newValue || (value === undefined && isNaN(newValue))) {\n return\n }\n if (!isNaN(newValue)) {\n onChange(element, {\n value: newValue,\n })\n } else {\n onChange(element, {\n value: undefined,\n })\n }\n }, [element, formSubmissionModel, onChange, value, calculateContent])\n\n return (\n <div className=\"cypress-calculation-element\">\n <div className=\"ob-form__element ob-calculation\">\n <QuillHTML\n html={htmlValue}\n className=\"cypress-calculation-result ob-calculation__content\"\n />\n {hasError && (\n <div\n className=\"notification cypress-calculation-is-invalid\"\n role=\"alert\"\n >\n <div className=\"columns is-vcentered\">\n <div className=\"column is-narrow\">\n <MaterialIcon className=\"has-text-warning\">error</MaterialIcon>\n </div>\n <div className=\"column\">\n <p>There is an error in the calculation for this element.</p>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n )\n}\n\nexport default React.memo(FormElementCalculation)\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@oneblink/apps-react",
3
3
  "description": "Helper functions for OneBlink apps in ReactJS.",
4
- "version": "8.7.1-beta.1",
4
+ "version": "8.7.1-beta.3",
5
5
  "author": "OneBlink <developers@oneblink.io> (https://oneblink.io)",
6
6
  "bugs": {
7
7
  "url": "https://github.com/oneblink/apps-react/issues"