From 2dd728818a066b87c561a68faffa70f211987c97 Mon Sep 17 00:00:00 2001 From: Tom <58078313+reed-tom@users.noreply.github.com> Date: Wed, 17 Apr 2024 11:13:30 -0400 Subject: [PATCH 01/14] switched to custom list reordering --- package-lock.json | 51 ++-- package.json | 2 +- src/helpers/OLHelpers.js | 2 +- src/helpers/SC.css | 9 +- src/helpers/react.js | 15 ++ src/sidebar/components/toc/TOC.jsx | 2 +- .../components/toc/toc-list-new/LayerItem.css | 141 +++++++++++ .../components/toc/toc-list-new/LayerItem.jsx | 146 +++++++++++ .../components/toc/toc-list-new/Layers.css | 14 ++ .../components/toc/toc-list-new/Layers.jsx | 237 ++++++++++++++++++ .../toc/toc-list-new/TOCListView.css | 26 ++ .../toc/toc-list-new/TOCListView.jsx | 84 +++++++ 12 files changed, 688 insertions(+), 41 deletions(-) create mode 100644 src/sidebar/components/toc/toc-list-new/LayerItem.css create mode 100644 src/sidebar/components/toc/toc-list-new/LayerItem.jsx create mode 100644 src/sidebar/components/toc/toc-list-new/Layers.css create mode 100644 src/sidebar/components/toc/toc-list-new/Layers.jsx create mode 100644 src/sidebar/components/toc/toc-list-new/TOCListView.css create mode 100644 src/sidebar/components/toc/toc-list-new/TOCListView.jsx diff --git a/package-lock.json b/package-lock.json index cd0c3112..bff356ec 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "github-buttons": "^2.27.0", "html-to-image": "^1.11.11", "moment": "^2.29.4", - "ol": "^9.1.0", + "ol": "^7.5.1", "ol-mapbox-style": "^11.0.3", "proj4": "^2.7.5", "rc-menu": "^9.11.1", @@ -6502,36 +6502,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/color-parse": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-2.0.2.tgz", - "integrity": "sha512-eCtOz5w5ttWIUcaKLiktF+DxZO1R9KLNY/xhbV6CkhM7sR3GhVghmt6X6yOnzeaM24po+Z9/S1apbXMwA3Iepw==", - "dependencies": { - "color-name": "^2.0.0" - } - }, - "node_modules/color-parse/node_modules/color-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.0.0.tgz", - "integrity": "sha512-SbtvAMWvASO5TE2QP07jHBMXKafgdZz8Vrsrn96fiL+O92/FN/PLARzUW5sKt013fjAprK2d2iCn2hk2Xb5oow==", - "engines": { - "node": ">=12.20" - } - }, - "node_modules/color-rgba": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/color-rgba/-/color-rgba-3.0.0.tgz", - "integrity": "sha512-PPwZYkEY3M2THEHHV6Y95sGUie77S7X8v+h1r6LSAPF3/LL2xJ8duUXSrkic31Nzc4odPwHgUbiX/XuTYzQHQg==", - "dependencies": { - "color-parse": "^2.0.0", - "color-space": "^2.0.0" - } - }, - "node_modules/color-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-space/-/color-space-2.0.1.tgz", - "integrity": "sha512-nKqUYlo0vZATVOFHY810BSYjmCARrG7e5R3UE3CQlyjJTvv5kSSmPG1kzm/oDyyqjehM+lW1RnEt9It9GNa5JA==" - }, "node_modules/color-string": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", @@ -13303,14 +13273,13 @@ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" }, "node_modules/ol": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/ol/-/ol-9.1.0.tgz", - "integrity": "sha512-nDrkJ2tzZNpo/wzN/PpHV5zdxbnXZaFktoMaD2cFLEc6gCwlgLY21Yd8wnt/4FjaVYwLBnbN9USXSwIBGcyksQ==", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/ol/-/ol-7.5.1.tgz", + "integrity": "sha512-CFXDhO8YdQt7I+zwrGYSONo/ZM2oLr7vUvxqpLEUyy+USaQjUeE8L6FBOWIPboopGVhnSVYd5hdEirn9ifKBZQ==", "dependencies": { - "color-rgba": "^3.0.0", - "color-space": "^2.0.1", "earcut": "^2.2.3", "geotiff": "^2.0.7", + "ol-mapbox-style": "^10.1.0", "pbf": "3.2.1", "rbush": "^3.0.1" }, @@ -13331,6 +13300,16 @@ "ol": ">=8.0.0 || >8.0.0-dev.0 < 8.0.0 || >=7.0.0 <=7.5.1" } }, + "node_modules/ol/node_modules/ol-mapbox-style": { + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/ol-mapbox-style/-/ol-mapbox-style-10.7.0.tgz", + "integrity": "sha512-S/UdYBuOjrotcR95Iq9AejGYbifKeZE85D9VtH11ryJLQPTZXZSW1J5bIXcr4AlAH6tyjPPHTK34AdkwB32Myw==", + "dependencies": { + "@mapbox/mapbox-gl-style-spec": "^13.23.1", + "mapbox-to-css-font": "^2.4.1", + "ol": "^7.3.0" + } + }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", diff --git a/package.json b/package.json index e4afc478..7ea7470a 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "github-buttons": "^2.27.0", "html-to-image": "^1.11.11", "moment": "^2.29.4", - "ol": "^9.1.0", + "ol": "^7.5.1", "ol-mapbox-style": "^11.0.3", "proj4": "^2.7.5", "rc-menu": "^9.11.1", diff --git a/src/helpers/OLHelpers.js b/src/helpers/OLHelpers.js index 2756b61b..68cdf79e 100644 --- a/src/helpers/OLHelpers.js +++ b/src/helpers/OLHelpers.js @@ -4,7 +4,7 @@ import { get, createObjectURL } from "../helpers/api"; // OPEN LAYERS import { Image as ImageLayer, Tile as TileLayer, Vector as VectorLayer, Group as LayerGroup, VectorTile as VectorTileLayer } from "ol/layer.js"; import WebGLTileLayer from "ol/layer/WebGLTile.js"; -import { ImageWMS, OSM, TileArcGISRest, ImageArcGISRest, TileWMS, TileImage, Vector, XYZ, ImageStatic, GeoTIFF, StadiaMaps as Stamen } from "ol/source.js"; +import { ImageWMS, OSM, TileArcGISRest, ImageArcGISRest, TileWMS, TileImage, Vector, XYZ, ImageStatic, GeoTIFF, Stamen } from "ol/source.js"; import WMTS, { optionsFromCapabilities } from "ol/source/WMTS"; import VectorTileSource from "ol/source/VectorTile"; // import stylefunction from "ol-mapbox-style/dist/stylefunction"; diff --git a/src/helpers/SC.css b/src/helpers/SC.css index b09eada9..1988c1c5 100644 --- a/src/helpers/SC.css +++ b/src/helpers/SC.css @@ -382,6 +382,12 @@ p { .sc-fieldset > legend > img { vertical-align: text-bottom; } +.sc-draggable { +} + +/* (Optional) Apply a "closed-hand" cursor during drag operation. */ +.sc-draggable:active { +} .sc-noselect { -webkit-touch-callout: none; /* iOS Safari */ @@ -389,8 +395,7 @@ p { -khtml-user-select: none; /* Konqueror HTML */ -moz-user-select: none; /* Firefox */ -ms-user-select: none; /* Internet Explorer/Edge */ - user-select: none; /* Non-prefixed version, currently - supported by Chrome and Opera */ + user-select: none; /* Non-prefixed version, currently supported by Chrome and Opera */ } .sc-disabled { diff --git a/src/helpers/react.js b/src/helpers/react.js index c502459b..153fc026 100644 --- a/src/helpers/react.js +++ b/src/helpers/react.js @@ -9,3 +9,18 @@ export function generateKey(obj) { export function getUID() { return uuidv4(); } + +export function debounce(func, wait) { + let timeout; + return function executedFunction(...args) { + console.log("debounce", func, args); + + const later = () => { + clearTimeout(timeout); + func(...args); + }; + + clearTimeout(timeout); + timeout = setTimeout(later, wait); + }; +} diff --git a/src/sidebar/components/toc/TOC.jsx b/src/sidebar/components/toc/TOC.jsx index 9d030069..15a3c238 100644 --- a/src/sidebar/components/toc/TOC.jsx +++ b/src/sidebar/components/toc/TOC.jsx @@ -7,7 +7,7 @@ import { isMobile } from "react-device-detect"; import * as TOCHelpers from "./common/TOCHelpers.jsx"; import TOCHeader from "./common/TOCHeader.jsx"; import LayerOptionsMenu from "./common/LayerOptionsMenu.jsx"; -import TOCListView from "./toc-list-view/TOCListView.jsx"; +import TOCListView from "./toc-list-new/TOCListView.jsx"; import TOCFolderView from "./toc-folder-view/TOCFolderView.jsx"; import * as helpers from "../../../helpers/helpers"; import { LayerHelpers } from "../../../helpers/OLHelpers"; diff --git a/src/sidebar/components/toc/toc-list-new/LayerItem.css b/src/sidebar/components/toc/toc-list-new/LayerItem.css new file mode 100644 index 00000000..29671f80 --- /dev/null +++ b/src/sidebar/components/toc/toc-list-new/LayerItem.css @@ -0,0 +1,141 @@ +.sc-toc-item-container { + display: table; + user-select: none; + margin-right: 2px; + margin-left: 2px; + font-family: Verdana, Arial, sans-serif !important; + font-size: 9pt; +} +.sc-toc-item-container.on { + font-weight: bold; +} + +.sc-toc-item-container.not-in-scale { + font-style: italic; +} + +.sc-toc-item-container.not-in-scale.on { + color: gray; +} + +.sc-toc-item-layer-label { + display: inline-table; + position: relative; + bottom: 2px; + max-width: 274px; +} + +.sc-toc-item-layer-info-live-layer { + display: inline-table; + vertical-align: middle; + margin-left: 5px; +} + +.sc-toc-item-layer-info-download { + display: inline-table; + vertical-align: middle; + margin-left: 5px; + margin-bottom: 2px; +} + +.sc-toc-item-layer-info-secured { + display: inline-table; + vertical-align: middle; + margin-left: 5px; + margin-bottom: 2px; +} + +.sc-toc-item-plus-minus-container { + display: inline-table; + vertical-align: middle; + cursor: pointer; + margin-right: 3px; +} + +.sc-toc-list-item-toolbox { + cursor: pointer; + display: table-cell; + float: right; + padding-right: 5px; + margin-top: -22px; +} + +.sc-toc-item-plus-minus-sign { + height: 5px; + width: 10px; + position: relative; + top: -11px; + right: -8px; + background: url(../images/horizontal_dots.png) 0px no-repeat; +} + +.sc-toc-item-layer-name { + display: inline-table; + margin-left: 5px; + width: 290px; + height: 20px; + cursor: default; + height: 100%; + word-break: break-all; + vertical-align: text-top; +} + +.sc-toc-item-layer-info-container-open-vertical-lines { + height: 22px; + width: 11px; + position: relative; + top: -11px; + right: -6px; + display: table-cell; + + background: url(../images/verticle_dots.png) 0px repeat-y; +} +.sc-toc-item-layer-info-container-open-horizontal-lines { + height: 5px; + width: 11px; + position: relative; + top: 15px; + right: 2px; + background: url(../images/horizontal_dots.png) 0px no-repeat; +} +.sc-toc-item-layer-info-container-open { + display: table; + height: auto; +} +.sc-toc-item-layer-info-container-closed { + display: none; +} + +.sc-toc-item-layer-info-legend { + padding-left: 16px; +} + +.sc-toc-item-checkbox { + display: inline-table; + margin-left: 5px; + margin-top: 0px; + transform: scale(1.1, 1.1); +} + +.sc-toc-layer-info-container { + display: table; +} + +/* Safari 10.1+ */ +/* Safari 10.1+ (alternate method) */ +@media not all and (min-resolution: 0.001dpcm) { + @supports (-webkit-appearance: none) { + .sc-toc-item-checkbox { + transform: scale(1, 1); + } + + .sc-toc-item-layer-label { + bottom: 0px; + } + + .sc-toc-item-plus-minus-container { + margin-top: 3px; + margin-right: 4px; + } + } +} diff --git a/src/sidebar/components/toc/toc-list-new/LayerItem.jsx b/src/sidebar/components/toc/toc-list-new/LayerItem.jsx new file mode 100644 index 00000000..3548360e --- /dev/null +++ b/src/sidebar/components/toc/toc-list-new/LayerItem.jsx @@ -0,0 +1,146 @@ +import React, { Component } from "react"; +import * as helpers from "../../../../helpers/helpers"; +import Highlighter from "react-highlight-words"; +import LayerLegend from "../common/LayerLegend"; +import { acceptDisclaimer } from "../common/TOCHelpers.jsx"; +import { FaPaperclip } from "react-icons/fa"; + +import "./LayerItem.css"; +class LayerItem extends Component { + _isMounted = false; + constructor(props) { + super(props); + + this.state = {}; + + this.isVisibleAtScale = true; + } + + componentDidMount() { + this.setVisibleScale(); + + this._isMounted = true; + window.map.on("moveend", () => { + this.setVisibleScale(); + if (this._isMounted) this.forceUpdate(); + }); + } + + setVisibleScale = () => { + const { layerInfo } = this.props; + const mapResolution = window.map.getView().getResolution(); + let minScale = 0; + let maxScale = 100000000000; + if (layerInfo.minScale !== undefined) minScale = layerInfo.minScale; + if (layerInfo.maxScale !== undefined) maxScale = layerInfo.maxScale; + let minResolution = helpers.scaleToResolution(minScale); + let maxResolution = helpers.scaleToResolution(maxScale); + this.isVisibleAtScale = mapResolution >= minResolution && mapResolution <= maxResolution; + }; + + componentWillUnmount() { + this._isMounted = false; + } + + onCheckboxChange = (layer) => { + if (layer.disclaimer !== undefined) { + if ( + !acceptDisclaimer(layer, () => { + this.onCheckboxChange(layer); + }) + ) { + return; + } + } + layer.layer.setVisible(!layer.visible); + layer.visible = !layer.visible; + this.props.onLayerChange(layer, layer.group); + }; + + render() { + //console.log("List View Layer Item Render"); + const { layerInfo } = this.props; + let containerClassName = "sc-toc-item-container"; + if (!this.isVisibleAtScale) containerClassName += " not-in-scale"; + if (layerInfo.visible) containerClassName += " on"; + + return ( +
+
+
this.props.onLegendToggle(layerInfo, this.props.group)}> + legend toggle +
+
+
+ + +
+ callout +
+
+ +
+
+ can download +
+
+ secure +
+
+ user added layer +
+
+
this.props.onLayerOptionsClick(evt, layerInfo)}> + more options +
+
+
+
+ +
+
+ ); + } +} + +export default LayerItem; + +// IMPORT ALL IMAGES +const images = importAllImages(require.context("../images", false, /\.(png|jpe?g|svg|gif)$/)); +function importAllImages(r) { + let images = {}; + r.keys().map((item, index) => (images[item.replace("./", "")] = r(item))); + return images; +} diff --git a/src/sidebar/components/toc/toc-list-new/Layers.css b/src/sidebar/components/toc/toc-list-new/Layers.css new file mode 100644 index 00000000..f2563b15 --- /dev/null +++ b/src/sidebar/components/toc/toc-list-new/Layers.css @@ -0,0 +1,14 @@ +.sc-layers-slider { + padding-top: 5px !important; + padding-bottom: 5px !important; + padding-left: 5px !important; + padding-right: 5px !important; + font-size: 10pt; + width: 160px; + margin-left: 5px !important; +} + +.sc-dragover { + background-color: blueviolet; + padding-left: 10px; +} diff --git a/src/sidebar/components/toc/toc-list-new/Layers.jsx b/src/sidebar/components/toc/toc-list-new/Layers.jsx new file mode 100644 index 00000000..b7f96ce4 --- /dev/null +++ b/src/sidebar/components/toc/toc-list-new/Layers.jsx @@ -0,0 +1,237 @@ +// REACT +//https://medium.com/nerd-for-tech/simple-drag-and-drop-in-react-without-an-external-library-ebf1c1b809e +import React, { useState, useEffect, useRef } from "react"; +import * as helpers from "../../../../helpers/helpers"; +import { debounce } from "../../../../helpers/react"; + +import LayerItem from "./LayerItem.jsx"; +import "./Layers.css"; +// CUSTOM +import "./Layers.css"; +import { preventDefault } from "ol/events/Event.js"; +const Layers = (props) => { + const storageKey = "Layers"; + const lastPositionRef = useRef(null); + const virtualId = "sc-toc-list-layers-sortablevirtuallist-virtual-layers"; + const [recalcId, setRecalcId] = useState(""); + const [layers, setLayers] = useState([]); + const [allLayers, setAllLayers] = useState([]); + const startYRef = useRef(); + const draggedElementRef = useRef(); + const dragItemRef = useRef(); + const dragOverItemRef = useRef(); + const [dragItem, setDragItem] = useState(); + const [dragOverItem, setDragOverItem] = useState(); + + useEffect(() => { + // LISTEN FOR SEARCH RESULT + const activeTocLayerListener = (layerItem) => { + if (props.visible) onActivateLayer(layerItem); + }; + window.emitter.addListener("activeTocLayer", activeTocLayerListener); + window.addEventListener("resize", updateRecalcId); + return () => { + window.emitter.removeListener("activeTocLayer", activeTocLayerListener); + window.removeEventListener("resize", updateRecalcId); + }; + }, []); + + useEffect(() => { + if (props.group.layers && props.group.layers.length > 0) { + setAllLayers(props.group.layers); + setLayers( + props.group.layers.filter((layer) => { + if (props.searchText === "") return true; + else if (layer.tocDisplayName.toUpperCase().indexOf(props.searchText.toUpperCase()) !== -1) return true; + else return false; + }) + ); + } + }, [props.searchText, props.group]); + + const updateRecalcId = () => { + if (!props.visible) return; + try { + lastPositionRef.current = document.getElementById(virtualId).scrollTop; + } catch (e) { + return; + } + setRecalcId(helpers.getUID()); + setTimeout(() => { + document.getElementById(virtualId).scrollTop += lastPositionRef.current; + }, 10); + }; + + const onActivateLayer = (layerItem) => { + if (!props.visible) return; + const elementId = layerItem.fullName + "_" + layerItem.layerGroup + "-container"; + + allLayers.forEach((layer) => { + if (layer.name === layerItem.fullName) { + document.getElementById(virtualId).scrollTop = 0; + + var i = 0; + var elemFound = false; + for (i = 1; i <= 100; i++) { + if (elemFound) return; + // eslint-disable-next-line + ((index) => { + setTimeout(() => { + if (elemFound) return; + + const elem = document.getElementById(elementId); + if (elem !== null) { + elemFound = true; + elem.scrollIntoView(); + return; + } else { + document.getElementById(virtualId).scrollTop += i * 5; + } + }, i * 100); + })(i); + } + } + }); + }; + + const handleDragStart = (e) => { + startYRef.current = e.clientY; + draggedElementRef.current = e.target; + e.dataTransfer.effectAllowed = "move"; + // e.dataTransfer.setDragImage(e.target.firstChild.firstChild, 10, 10); + var di = new Image(); + // di.src = toDataURL("image/png"); + e.dataTransfer.setDragImage(di, 10, 10); + dragItemRef.current = e.target.id; + setDragItem(e.target.id); + }; + const handleDragLeave = (callback) => { + callback(dragOverItemRef.current); + }; + const handleDragEnter = (e) => { + e.preventDefault(); + if (e.currentTarget.id === dragItemRef.current || dragOverItemRef.current === e.currentTarget.id) return; + dragOverItemRef.current = e.currentTarget.id; + setDragOverItem(e.currentTarget.id); + }; + const handleDragEnd = () => { + const oldIndex = allLayers.indexOf(allLayers.find((layer) => props.id + "-" + helpers.getHash(layer.name) + "-container" === dragItemRef.current)); + const newIndex = allLayers.indexOf(allLayers.find((layer) => props.id + "-" + helpers.getHash(layer.name) + "-container" === dragOverItemRef.current)); + const oldIndexFiltered = layers.indexOf(layers.find((layer) => props.id + "-" + helpers.getHash(layer.name) + "-container" === dragItemRef.current)); + const newIndexFiltered = layers.indexOf(layers.find((layer) => props.id + "-" + helpers.getHash(layer.name) + "-container" === dragOverItemRef.current)); + const newLayers = [...layers]; + const movedLayer = newLayers.splice(oldIndexFiltered, 1); + newLayers.splice(newIndexFiltered, 0, movedLayer[0]); + // setLayers(newLayers); + + props.onSortEnd({ oldIndex: oldIndex, newIndex: newIndex }); + draggedElementRef.current.style.transform = ""; + dragItemRef.current = null; + dragOverItemRef.current = null; + setDragOverItem(null); + setDragItem(null); + }; + const handleDragCancel = () => { + draggedElementRef.current.style.transform = ""; + dragItemRef.current = null; + dragOverItemRef.current = null; + setDragOverItem(null); + setDragItem(null); + }; + const handleDragOver = (e) => { + e.preventDefault(); + const deltaY = e.clientY - startYRef.current; + draggedElementRef.current.style.transform = `translateY(${deltaY}px)`; + }; + + if (props.group.layers === undefined) return
; + else + return ( +
+
    + {layers.map((layer) => ( + + ))} +
+
+ ); +}; + +export default Layers; + +const LayerListItem = (props) => { + const [open, setOpen] = useState(false); + const { layer, parent } = props; + + useEffect(() => { + if (props.id !== props.currentSelection) setOpen(false); + }, [props.currentSelection]); + const handleDragEnter = (e) => { + e.preventDefault(); + if (props.id !== props.draggedItem) setOpen(true); + props.onDragEnter(e); + }; + const handleDragLeave = (e) => { + e.preventDefault(); + }; + const handleDragEnd = () => { + setOpen(false); + props.onDragEnd(); + }; + const handleDragExit = () => { + setOpen(false); + props.onDragExit(); + }; + + return ( +
  • props.onDragStart(e)} + onDragEnter={(e) => handleDragEnter(e)} + onDragEnd={() => handleDragEnd()} + onDragExit={() => handleDragExit()} + onDragOver={(e) => props.onDragOver(e)} + onDragLeave={(e) => handleDragLeave(e)} + id={props.id} + draggable + style={{ + minHeight: "30px", + transition: "padding 50ms linear 50ms", + padding: open ? "0px 0px 30px 0px" : "", + border: "1px dashed #000", + }} + > + +
  • + ); +}; diff --git a/src/sidebar/components/toc/toc-list-new/TOCListView.css b/src/sidebar/components/toc/toc-list-new/TOCListView.css new file mode 100644 index 00000000..8b428acf --- /dev/null +++ b/src/sidebar/components/toc/toc-list-new/TOCListView.css @@ -0,0 +1,26 @@ +.sc-toc-main-container { + height: 40px; +} + +.sc-toc-layer-container { + max-width: 400px; + position: absolute; + top: 148px; + bottom: 0px; + width: 100%; + overflow-y: scroll; + margin-left: 0px; + user-select: all; +} + +.sc-toc-layer-container > ul { + list-style: none; + padding: 0; + margin: 0; + user-select: all; +} + +.sc-toc-footer-button.tools { + background-position-x: 6px; + width: 122px; +} diff --git a/src/sidebar/components/toc/toc-list-new/TOCListView.jsx b/src/sidebar/components/toc/toc-list-new/TOCListView.jsx new file mode 100644 index 00000000..87f75457 --- /dev/null +++ b/src/sidebar/components/toc/toc-list-new/TOCListView.jsx @@ -0,0 +1,84 @@ +// REACT +import React, { Component } from "react"; +import Select from "react-select"; + +// CUSTOM +import "./TOCListView.css"; +import * as helpers from "../../../../helpers/helpers"; + +import Layers from "./Layers.jsx"; + +class TOCListView extends Component { + constructor(props) { + super(props); + this.state = {}; + } + + shouldComponentUpdate(nextProps, nextState) { + return nextProps.visible || this.props.visible; + } + onGroupDropDownChange = (selectedGroup) => { + this.props.onGroupDropDownChange(selectedGroup, () => {}); + helpers.addAppStat("TOC Group", selectedGroup.label); + }; + + render() { + const groupsDropDownStyles = { + control: (provided) => ({ + ...provided, + minHeight: "30px", + }), + indicatorsContainer: (provided) => ({ + ...provided, + height: "30px", + }), + clearIndicator: (provided) => ({ + ...provided, + padding: "5px", + }), + dropdownIndicator: (provided) => ({ + ...provided, + padding: "5px", + }), + }; + + return ( +
    +
    +
    +
    -
    this.props.onLayerOptionsClick(evt, layerInfo)}> +
    this.props.onLayerOptionsClick(evt, layerInfo)}> more options
    diff --git a/src/sidebar/components/toc/toc-list-new/Layers.css b/src/sidebar/components/toc/toc-list-new/Layers.css index f2563b15..e6d61c28 100644 --- a/src/sidebar/components/toc/toc-list-new/Layers.css +++ b/src/sidebar/components/toc/toc-list-new/Layers.css @@ -8,7 +8,17 @@ margin-left: 5px !important; } -.sc-dragover { - background-color: blueviolet; - padding-left: 10px; +#sc-toc-list-layers-sortablevirtuallist-virtual-layers { + list-style: none; + padding: 0; + margin: 0; +} + +.sc-toc-list-layers-sortablevirtuallist-virtual-layers-listitem { + min-height: 30px; + list-style: none; +} + +.sc-toc-list-layers-sortablevirtuallist-virtual-layers-listitem.sc-dragged { + z-index: 4 !important; /*override default z-index to show dragged item above sidebar*/ } diff --git a/src/sidebar/components/toc/toc-list-new/Layers.jsx b/src/sidebar/components/toc/toc-list-new/Layers.jsx index b7f96ce4..f133fc3c 100644 --- a/src/sidebar/components/toc/toc-list-new/Layers.jsx +++ b/src/sidebar/components/toc/toc-list-new/Layers.jsx @@ -2,31 +2,23 @@ //https://medium.com/nerd-for-tech/simple-drag-and-drop-in-react-without-an-external-library-ebf1c1b809e import React, { useState, useEffect, useRef } from "react"; import * as helpers from "../../../../helpers/helpers"; -import { debounce } from "../../../../helpers/react"; - +import { List, arrayMove } from "react-movable"; import LayerItem from "./LayerItem.jsx"; import "./Layers.css"; // CUSTOM import "./Layers.css"; -import { preventDefault } from "ol/events/Event.js"; -const Layers = (props) => { +const Layers = (layersProps) => { const storageKey = "Layers"; const lastPositionRef = useRef(null); const virtualId = "sc-toc-list-layers-sortablevirtuallist-virtual-layers"; const [recalcId, setRecalcId] = useState(""); const [layers, setLayers] = useState([]); const [allLayers, setAllLayers] = useState([]); - const startYRef = useRef(); - const draggedElementRef = useRef(); - const dragItemRef = useRef(); - const dragOverItemRef = useRef(); - const [dragItem, setDragItem] = useState(); - const [dragOverItem, setDragOverItem] = useState(); useEffect(() => { // LISTEN FOR SEARCH RESULT const activeTocLayerListener = (layerItem) => { - if (props.visible) onActivateLayer(layerItem); + if (layersProps.visible) onActivateLayer(layerItem); }; window.emitter.addListener("activeTocLayer", activeTocLayerListener); window.addEventListener("resize", updateRecalcId); @@ -37,20 +29,20 @@ const Layers = (props) => { }, []); useEffect(() => { - if (props.group.layers && props.group.layers.length > 0) { - setAllLayers(props.group.layers); + if (layersProps.group.layers && layersProps.group.layers.length > 0) { + setAllLayers(layersProps.group.layers); setLayers( - props.group.layers.filter((layer) => { - if (props.searchText === "") return true; - else if (layer.tocDisplayName.toUpperCase().indexOf(props.searchText.toUpperCase()) !== -1) return true; + layersProps.group.layers.filter((layer) => { + if (layersProps.searchText === "") return true; + else if (layer.tocDisplayName.toUpperCase().indexOf(layersProps.searchText.toUpperCase()) !== -1) return true; else return false; }) ); } - }, [props.searchText, props.group]); + }, [layersProps.searchText, layersProps.group]); const updateRecalcId = () => { - if (!props.visible) return; + if (!layersProps.visible) return; try { lastPositionRef.current = document.getElementById(virtualId).scrollTop; } catch (e) { @@ -63,7 +55,7 @@ const Layers = (props) => { }; const onActivateLayer = (layerItem) => { - if (!props.visible) return; + if (!layersProps.visible) return; const elementId = layerItem.fullName + "_" + layerItem.layerGroup + "-container"; allLayers.forEach((layer) => { @@ -94,144 +86,47 @@ const Layers = (props) => { }); }; - const handleDragStart = (e) => { - startYRef.current = e.clientY; - draggedElementRef.current = e.target; - e.dataTransfer.effectAllowed = "move"; - // e.dataTransfer.setDragImage(e.target.firstChild.firstChild, 10, 10); - var di = new Image(); - // di.src = toDataURL("image/png"); - e.dataTransfer.setDragImage(di, 10, 10); - dragItemRef.current = e.target.id; - setDragItem(e.target.id); - }; - const handleDragLeave = (callback) => { - callback(dragOverItemRef.current); - }; - const handleDragEnter = (e) => { - e.preventDefault(); - if (e.currentTarget.id === dragItemRef.current || dragOverItemRef.current === e.currentTarget.id) return; - dragOverItemRef.current = e.currentTarget.id; - setDragOverItem(e.currentTarget.id); - }; - const handleDragEnd = () => { - const oldIndex = allLayers.indexOf(allLayers.find((layer) => props.id + "-" + helpers.getHash(layer.name) + "-container" === dragItemRef.current)); - const newIndex = allLayers.indexOf(allLayers.find((layer) => props.id + "-" + helpers.getHash(layer.name) + "-container" === dragOverItemRef.current)); - const oldIndexFiltered = layers.indexOf(layers.find((layer) => props.id + "-" + helpers.getHash(layer.name) + "-container" === dragItemRef.current)); - const newIndexFiltered = layers.indexOf(layers.find((layer) => props.id + "-" + helpers.getHash(layer.name) + "-container" === dragOverItemRef.current)); - const newLayers = [...layers]; - const movedLayer = newLayers.splice(oldIndexFiltered, 1); - newLayers.splice(newIndexFiltered, 0, movedLayer[0]); - // setLayers(newLayers); - - props.onSortEnd({ oldIndex: oldIndex, newIndex: newIndex }); - draggedElementRef.current.style.transform = ""; - dragItemRef.current = null; - dragOverItemRef.current = null; - setDragOverItem(null); - setDragItem(null); - }; - const handleDragCancel = () => { - draggedElementRef.current.style.transform = ""; - dragItemRef.current = null; - dragOverItemRef.current = null; - setDragOverItem(null); - setDragItem(null); - }; - const handleDragOver = (e) => { - e.preventDefault(); - const deltaY = e.clientY - startYRef.current; - draggedElementRef.current.style.transform = `translateY(${deltaY}px)`; - }; - - if (props.group.layers === undefined) return
    ; + if (layersProps.group.layers === undefined) return
    ; else return (
    -
      - {layers.map((layer) => ( - - ))} -
    + { + if (layersProps.sortAlpha) return; + const oldIndexAllLayers = allLayers.indexOf(layers[oldIndex]); + const newIndexAllLayers = allLayers.indexOf(layers[newIndex]); + + setLayers(arrayMove(layers, oldIndex, newIndex)); + layersProps.onSortEnd({ oldIndex: oldIndexAllLayers, newIndex: newIndexAllLayers }); + }} + lockVertically={true} + beforeDrag={() => { + if (layersProps.sortAlpha) return; + }} + renderList={({ children, props }) => ( +
      + {children} +
    + )} + renderItem={({ value, props, isDragged, isSelected }) => ( +
  • + +
  • + )} + />
    ); }; export default Layers; - -const LayerListItem = (props) => { - const [open, setOpen] = useState(false); - const { layer, parent } = props; - - useEffect(() => { - if (props.id !== props.currentSelection) setOpen(false); - }, [props.currentSelection]); - const handleDragEnter = (e) => { - e.preventDefault(); - if (props.id !== props.draggedItem) setOpen(true); - props.onDragEnter(e); - }; - const handleDragLeave = (e) => { - e.preventDefault(); - }; - const handleDragEnd = () => { - setOpen(false); - props.onDragEnd(); - }; - const handleDragExit = () => { - setOpen(false); - props.onDragExit(); - }; - - return ( -
  • props.onDragStart(e)} - onDragEnter={(e) => handleDragEnter(e)} - onDragEnd={() => handleDragEnd()} - onDragExit={() => handleDragExit()} - onDragOver={(e) => props.onDragOver(e)} - onDragLeave={(e) => handleDragLeave(e)} - id={props.id} - draggable - style={{ - minHeight: "30px", - transition: "padding 50ms linear 50ms", - padding: open ? "0px 0px 30px 0px" : "", - border: "1px dashed #000", - }} - > - -
  • - ); -}; From 776089a4c82a9b0ecb0bea0232068e40740ffe77 Mon Sep 17 00:00:00 2001 From: Tom <58078313+reed-tom@users.noreply.github.com> Date: Fri, 26 Apr 2024 15:23:14 -0400 Subject: [PATCH 03/14] Updated to React18 (#231) --- .env | 5 + Dockerfile | 6 +- package-lock.json | 39 +- package.json | 4 +- src/App.test.js | 9 +- src/header/Header.jsx | 3 +- src/helpers/AttributeTable.jsx | 40 +- src/helpers/FloatingMenu.jsx | 23 +- src/helpers/ModalWindowR.jsx | 37 +- src/helpers/Popup.jsx | 17 +- src/helpers/ShowMessage.jsx | 1 + src/helpers/helpers.js | 120 ++- src/index.js | 22 +- src/layerInfo/App.test.js | 10 +- src/layerInfo/index.js | 9 +- src/legend/App.test.js | 9 +- src/map/BasicBasemapSwitcher.jsx | 3 +- src/map/SCMap.jsx | 4 +- src/sidebar/Sidebar.jsx | 834 +++++++++--------- src/sidebar/components/mymaps/ColorPicker.jsx | 89 +- src/sidebar/components/mymaps/MyMaps.jsx | 11 +- .../components/mymaps/MyMapsFooter.jsx | 12 +- .../localrealestate/LocalRealEstate.jsx | 11 +- src/sidebar/components/toc/TOC.jsx | 13 +- .../components/toc/common/LayerLegend.jsx | 81 +- .../components/toc/common/TOCHeader.jsx | 4 +- .../toc/toc-folder-view/GroupItem.jsx | 3 +- .../components/toc/toc-folder-view/Layers.jsx | 2 +- .../toc/toc-folder-view/TOCFolderView.css | 6 +- 29 files changed, 764 insertions(+), 663 deletions(-) create mode 100644 .env diff --git a/.env b/.env new file mode 100644 index 00000000..87c01f4e --- /dev/null +++ b/.env @@ -0,0 +1,5 @@ +REACT_APP_SECURED="false" +REACT_APP_TENANT="TENANT_ID" +REACT_APP_DEFAULT_SCOPE="DEFAULT_SCOPE" +REACT_APP_CLIENTID="CLIENT_ID" +REACT_APP_AUTHORITY="AUTHORITY" \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 674242c7..ccb3f74c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ #Stage 1 -FROM node:18-alpine -# Create app directory -WORKDIR /app +# FROM node:18-alpine +# # Create app directory +# WORKDIR /app FROM nginx:1.25.0-alpine WORKDIR /usr/share/nginx/html RUN rm -rf ./* diff --git a/package-lock.json b/package-lock.json index 1ef0c98f..d8d8b9b6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,13 +25,13 @@ "rc-menu": "^9.11.1", "rc-slider": "^9.7.5", "re-resizable": "^6.9.1", - "react": "^17.0.2", + "react": "^18.2.0", "react-collapsible": "^2.10.0", "react-color": "^2.19.3", "react-copy-to-clipboard": "^5.0.4", "react-datepicker": "^4.16.0", "react-device-detect": "^2.2.3", - "react-dom": "^17.0.2", + "react-dom": "^18.2.0", "react-ga4": "^2.0.0", "react-highlight-words": "^0.20.0", "react-icons": "^4.8.0", @@ -3903,9 +3903,9 @@ } }, "node_modules/@rc-component/trigger": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-2.0.0.tgz", - "integrity": "sha512-niwKADPdY5dhdIblV6uwSayVivwo2uUISfJqri+/ovYQcH/omxDYBJKo755QKeoIIsWptxnRpgr7reEnNEZGFg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-2.1.1.tgz", + "integrity": "sha512-UjHkedkgtEcgQu87w1VuWug1idoDJV7VUt0swxHXRcmei2uu1AuUzGBPEUlmOmXGJ+YtTgZfVLi7kuAUKoZTMA==", "dependencies": { "@babel/runtime": "^7.23.2", "@rc-component/portal": "^1.1.0", @@ -15372,12 +15372,11 @@ } }, "node_modules/react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "loose-envify": "^1.1.0" }, "engines": { "node": ">=0.10.0" @@ -15562,16 +15561,15 @@ } }, "node_modules/react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", "dependencies": { "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" + "scheduler": "^0.23.0" }, "peerDependencies": { - "react": "17.0.2" + "react": "^18.2.0" } }, "node_modules/react-error-overlay": { @@ -16534,12 +16532,11 @@ } }, "node_modules/scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "loose-envify": "^1.1.0" } }, "node_modules/schema-utils": { diff --git a/package.json b/package.json index 3b204cfd..eceeef0c 100644 --- a/package.json +++ b/package.json @@ -21,13 +21,13 @@ "rc-menu": "^9.11.1", "rc-slider": "^9.7.5", "re-resizable": "^6.9.1", - "react": "^17.0.2", + "react": "^18.2.0", "react-collapsible": "^2.10.0", "react-color": "^2.19.3", "react-copy-to-clipboard": "^5.0.4", "react-datepicker": "^4.16.0", "react-device-detect": "^2.2.3", - "react-dom": "^17.0.2", + "react-dom": "^18.2.0", "react-ga4": "^2.0.0", "react-highlight-words": "^0.20.0", "react-icons": "^4.8.0", diff --git a/src/App.test.js b/src/App.test.js index 635a333f..0d5b554a 100644 --- a/src/App.test.js +++ b/src/App.test.js @@ -1,9 +1,10 @@ import React from "react"; -import ReactDOM from "react-dom"; +import { createRoot } from "react-dom/client"; import App from "./App"; it("renders without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render(, div); - ReactDOM.unmountComponentAtNode(div); + const div = document.createElement("div"); + const root = createRoot(div); // createRoot(container!) if you use TypeScript + root.render(); + root.unmount(); }); diff --git a/src/header/Header.jsx b/src/header/Header.jsx index 9875d130..375c3a6d 100644 --- a/src/header/Header.jsx +++ b/src/header/Header.jsx @@ -1,5 +1,4 @@ import React, { useState, useEffect } from "react"; -import ReactDOM from "react-dom"; import "./Header.css"; import Search from "./Search.jsx"; import * as helpers from "../helpers/helpers"; @@ -50,7 +49,7 @@ const Header = (props) => { ); - ReactDOM.render(menu, document.getElementById("portal-root")); + window.portalRoot.render(menu); helpers.addAppStat("Header Dot Menu", "Click"); }; diff --git a/src/helpers/AttributeTable.jsx b/src/helpers/AttributeTable.jsx index 10723d42..e07dbdfb 100644 --- a/src/helpers/AttributeTable.jsx +++ b/src/helpers/AttributeTable.jsx @@ -1,4 +1,4 @@ -import React, { Component } from "react"; +import React, { Component, useEffect } from "react"; import * as helpers from "./helpers"; import "./AttributeTable.css"; import { Resizable } from "re-resizable"; @@ -6,12 +6,12 @@ import AttributeTableTabs from "./AttributeTableTabs.jsx"; import FloatingMenu, { FloatingMenuItem } from "../helpers/FloatingMenu.jsx"; import { Item as MenuItem } from "rc-menu"; import Portal from "../helpers/Portal.jsx"; -import ReactDOM from "react-dom"; +import { createRoot } from "react-dom/client"; class AttrbuteTable extends Component { constructor(props) { super(props); - + this.resizable = {}; this.numRecordsToPull = 200; this.state = { visible: false, @@ -44,6 +44,7 @@ class AttrbuteTable extends Component { resizeFromMap = () => { const mapWidth = document.getElementById("map").offsetWidth; + if (!this.resizable) return; this.resizable.updateSize({ width: mapWidth, height: this.resizable.resizable.offsetHeight, @@ -195,7 +196,21 @@ class AttrbuteTable extends Component { ); - ReactDOM.render(menu, document.getElementById("portal-root")); + const uniqueId = `portal-root-${"attribute-table-header"}}`; + const element = document.createElement("div"); + element.setAttribute("id", uniqueId); + document.getElementById("portal-root").appendChild(element); + const root = createRoot(document.getElementById(uniqueId)); + const MenuWithCallback = () => { + useEffect(() => { + return () => { + root.unmount(); + document.getElementById(uniqueId).remove(); + }; + }, []); + return menu; + }; + root.render(); }; onRowClick = (evt, item, rowIndex) => { @@ -217,7 +232,22 @@ class AttrbuteTable extends Component { ); - ReactDOM.render(menu, document.getElementById("portal-root")); + const uniqueId = `portal-root-${"attribute-table-row"}`; + const element = document.createElement("div"); + element.setAttribute("id", uniqueId); + document.getElementById("portal-root").appendChild(element); + const root = createRoot(document.getElementById(uniqueId)); + const MenuWithCallback = () => { + useEffect(() => { + return () => { + root.unmount(); + document.getElementById(uniqueId).remove(); + }; + }, []); + return menu; + }; + + root.render(); }; onRowMenuItemClick = (key, item, rowIndex) => { diff --git a/src/helpers/FloatingMenu.jsx b/src/helpers/FloatingMenu.jsx index 752ea046..ae4c123d 100644 --- a/src/helpers/FloatingMenu.jsx +++ b/src/helpers/FloatingMenu.jsx @@ -7,13 +7,16 @@ import { waitForLoad } from "./helpers"; // PROPER USE OF THIS COMPONENT IS TO USE A PORTAL. HAVE A LOOK AT MyMapsItem FOR AN EXAMPLE. const FloatingMenu = (props) => { + let { positionX, positionY } = props; + if (positionX === undefined) positionX = props.buttonEvent.pageX; + if (positionY === undefined) positionY = props.buttonEvent.pageY; const isMounted = useRef(false); const [isVisible, setIsVisible] = useState(true); const [style, setStyle] = useState({ position: "absolute", zIndex: 10000, - top: props.buttonEvent.pageY, - left: props.buttonEvent.pageX, + top: positionY, + left: positionX, backgroundColor: "white", width: "180px", }); @@ -36,7 +39,7 @@ const FloatingMenu = (props) => { getStyle((newStyle) => { setStyle(newStyle); }); - }, [props.autoX, props.autoY, props.buttonEvent.pageX, props.buttonEvent.pageY, props.styleMode]); + }, [props.autoX, props.autoY, props.buttonEvent.pageX, props.buttonEvent.pageY, props.styleMode, props.positionX, props.positionY, props.yOffset, props.xOffset, props.width]); const cleanup = () => { document.body.removeEventListener("click", handleClickAway, true); container.current = null; @@ -89,17 +92,17 @@ const FloatingMenu = (props) => { } if (props.styleMode === "right") { - xOffset = props.buttonEvent.pageX; + xOffset = positionX; } else if (props.styleMode === "left") { - xOffset = props.buttonEvent.pageX - 180; + xOffset = positionX - 180; } else if (props.autoX) { - if (props.buttonEvent.pageX < 180) { - xOffset = props.buttonEvent.pageX; + if (positionX < 180) { + xOffset = positionX; } else { - xOffset = props.buttonEvent.pageX - 180; + xOffset = positionX - 180; } } else { - xOffset = props.buttonEvent.pageX; + xOffset = positionX; } if (props.yOffset !== undefined) yOffset = props.yOffset; @@ -108,7 +111,7 @@ const FloatingMenu = (props) => { style = { position: "absolute", zIndex: 1000, - top: props.buttonEvent.pageY - yOffset, + top: positionY - yOffset, //left: this.state.styleMode === "right" ? this.props.buttonEvent.pageX : this.props.buttonEvent.pageX - 180, left: xOffset, backgroundColor: "white", diff --git a/src/helpers/ModalWindowR.jsx b/src/helpers/ModalWindowR.jsx index c54dfc06..801aa436 100644 --- a/src/helpers/ModalWindowR.jsx +++ b/src/helpers/ModalWindowR.jsx @@ -1,28 +1,25 @@ import React from "react"; -import ReactDOM from "react-dom"; import Modal from "react-responsive-modal"; export default class ModalWindowR extends React.Component { - state = { - open: this.props.open ? true : false, - }; + state = { + open: this.props.open ? true : false, + }; - onOpenModal = () => { - this.setState({ open: true }); - }; + onOpenModal = () => { + this.setState({ open: true }); + }; - onCloseModal = () => { - this.setState({ open: false }); - }; + onCloseModal = () => { + this.setState({ open: false }); + }; - render() { - const { open } = this.state; - return ( - -

    Simple centered modal

    -
    - ); - } + render() { + const { open } = this.state; + return ( + +

    Simple centered modal

    +
    + ); + } } - -//ReactDOM.render(, document.getElementById('root')); diff --git a/src/helpers/Popup.jsx b/src/helpers/Popup.jsx index bc8729ee..01e52b8b 100644 --- a/src/helpers/Popup.jsx +++ b/src/helpers/Popup.jsx @@ -1,6 +1,7 @@ // THIS CODE WAS PULLED FROM https://github.com/walkermatt/ol-popup import React from "react"; -import ReactDOM from "react-dom"; +import { createRoot } from "react-dom/client"; + import Overlay from "ol/Overlay"; import "./Popup.css"; import { getWidth } from "ol/extent.js"; @@ -67,7 +68,6 @@ export default class Popup extends Overlay { this.contentNextButton.href = "#"; this.contentNextButtonContainer.appendChild(this.contentNextButton); this.contentPrevButtonContainer.appendChild(this.contentPrevButton); - this.contentNextButton.addEventListener("click", () => { this.contentIndex++; if (this.contentIndex >= this.contentArray.length) { @@ -84,16 +84,14 @@ export default class Popup extends Overlay { this.contentNextButtonContainer.className = "sc-popup-content-next-button"; this.contentPrevButtonContainer.className = "sc-popup-content-prev-button"; } - this.headerTitle.innerHTML = this.contentArray[this.contentIndex].title || "Info"; - //ReactDOM.render(html, this.content); if (isDOMTypeElement(this.contentArray[this.contentIndex].html)) { // REGULAR HTML this.content.innerHTML = ""; this.content.appendChild(this.contentArray[this.contentIndex].html); } else { // REACT COMPONENT - ReactDOM.render(this.contentArray[this.contentIndex].html, this.content); + this.root.render(this.contentArray[this.contentIndex].html); } }); this.contentPrevButton.addEventListener("click", () => { @@ -113,14 +111,13 @@ export default class Popup extends Overlay { } // SET TITLE this.headerTitle.innerHTML = this.contentArray[this.contentIndex].title; - //ReactDOM.render(html, this.content); if (isDOMTypeElement(this.contentArray[this.contentIndex].html)) { // REGULAR HTML this.content.innerHTML = ""; this.content.appendChild(this.contentArray[this.contentIndex].html); } else { // REACT COMPONENT - ReactDOM.render(this.contentArray[this.contentIndex].html, this.content); + this.root.render(this.contentArray[this.contentIndex].html); } }); this.headerCloseContainer = document.createElement("div"); @@ -162,6 +159,9 @@ export default class Popup extends Overlay { this.content = document.createElement("div"); this.content.className = "ol-popup-content"; + this.uniqueId = `sc-popup-content-${helpers.getUID()}}`; + this.content.setAttribute("id", this.uniqueId); + this.root = createRoot(this.content); this.container.appendChild(this.content); // Apply workaround to enable scrolling of content div on touch devices @@ -225,14 +225,13 @@ export default class Popup extends Overlay { // SET TITLE this.headerTitle.innerHTML = title; - //ReactDOM.render(html, this.content); if (isDOMTypeElement(html)) { // REGULAR HTML this.content.innerHTML = ""; this.content.appendChild(html); } else { // REACT COMPONENT - ReactDOM.render(html, this.content); + this.root.render(html); } this.container.style.display = "block"; diff --git a/src/helpers/ShowMessage.jsx b/src/helpers/ShowMessage.jsx index 39997a21..cafb725b 100644 --- a/src/helpers/ShowMessage.jsx +++ b/src/helpers/ShowMessage.jsx @@ -27,6 +27,7 @@ class ShowMessage extends Component { this._isMounted = false; } onCloseClick = (value) => { + if (this.props.onClose) this.props.onClose(value); if (this._isMounted) this.setState({ hide: true }); }; diff --git a/src/helpers/helpers.js b/src/helpers/helpers.js index a90683c0..baa2e699 100644 --- a/src/helpers/helpers.js +++ b/src/helpers/helpers.js @@ -1,6 +1,6 @@ // REACT -import React from "react"; -import ReactDOM from "react-dom"; +import React, { useEffect } from "react"; +import { createRoot } from "react-dom/client"; // OPEN LAYERS import Feature from "ol/Feature"; @@ -123,22 +123,58 @@ export function isMobile() { // SHOW CONTENT WINDOW export function showWindow(contents, options = { title: "Information", showFooter: false, mode: "normal", hideScroll: false }) { - ReactDOM.render( - , - document.getElementById("map-modal-window") - ); + const uniqueId = `map-modal-window-${getUID()}}`; + const element = document.createElement("div"); + element.setAttribute("id", uniqueId); + document.getElementById("map-modal-window").appendChild(element); + const root = createRoot(document.getElementById(uniqueId)); + + const ShowWindowWithCallback = (props) => { + useEffect(() => { + return () => { + try { + root.unmount(); + document.getElementById(uniqueId).remove(); + } catch (err) { + console.log(err); + } + }; + }, []); + return ; + }; + root.render(); } // SHOW URL WINDOW export function showURLWindow(url, showFooter = false, mode = "normal", honorDontShow = false, hideScroll = false) { let isSameOrigin = true; + const uniqueId = `map-modal-window-${getUID()}}`; + const element = document.createElement("div"); + element.setAttribute("id", uniqueId); + document.getElementById("map-modal-window").appendChild(element); + const root = createRoot(document.getElementById(uniqueId)); + + const URLWindowWithCallback = (props) => { + useEffect(() => { + return () => { + try { + root.unmount(); + document.getElementById(uniqueId).remove(); + } catch (err) { + console.log(err); + } + }; + }, []); + return ; + }; + waitForLoad("settings", Date.now(), 30, () => { if (window.config.restrictOriginForUrlWindow) { if (url !== undefined) isSameOrigin = url.toLowerCase().indexOf(window.location.origin.toLowerCase()) !== -1; } if (isSameOrigin) { - ReactDOM.render(, document.getElementById("map-modal-window")); + root.render(); } else { window.open(url, "_blank"); } @@ -414,7 +450,7 @@ export function showTerms(title = "Terms and Condition", messageText = "Message" const domId = "portal-root"; const termsDomId = "sc-show-terms-root"; - ReactDOM.render( + window.portalRoot.render( { try { - ReactDOM.unmountComponentAtNode(ref.current.parentNode); + window.portalRoot.unmount(); } catch (err) { console.log(err); } }} - />, - document.getElementById("portal-root") + /> ); } @@ -442,24 +477,42 @@ export function showMessage(title = "Info", messageText = "Message", color = mes const domId = "sc-show-message-content"; var existingMsg = document.getElementById(domId); if (existingMsg !== undefined && existingMsg !== null) existingMsg.remove(); - try { - ReactDOM.unmountComponentAtNode(document.getElementById("sc-sidebar-message-container")); - } catch {} - const message = ReactDOM.render( - , - document.getElementById("sc-sidebar-message-container"), - () => { + const uniqueId = `sc-sidebar-message-container-${getUID()}}`; + const messageElement = document.createElement("div"); + messageElement.setAttribute("id", uniqueId); + document.getElementById("sc-sidebar-message-container").appendChild(messageElement); + + const root = createRoot(document.getElementById(uniqueId), { identifierPrefix: getUID() }); + + const ShowMessageWithCallback = (props) => { + const handleOnClose = () => { + try { + root.unmount(); + document.getElementById(uniqueId).remove(); + } catch (err) { + console.log(err); + } + }; + useEffect(() => { setTimeout(() => { try { - ReactDOM.unmountComponentAtNode(document.getElementById("sc-sidebar-message-container")); + handleOnClose(); } catch (err) { console.log(err); } - }, timeout); - } - ); + }, props.timeout); + return () => { + try { + if (props.onClose) props.onClose(); + } catch (err) { + console.log(err); + } + }; + }, [props.timeout]); + return ; + }; + root.render(); } - export function searchArrayByKey(nameKey, myArray) { for (var i = 0; i < myArray.length; i++) { if (myArray[i].name === nameKey) { @@ -1184,7 +1237,7 @@ function _escapeRegExp(str) { } export function showFeaturePopup(coord, feature) { - window.popup.show(coord, ); + window.popup.show(coord, , feature.get("layerDisplayName") || "Feature Info"); } export function removeURLParameter(url, parameter) { @@ -1211,7 +1264,22 @@ export function FilterKeys(feature) { //WILDCARD = .* //LITERAL STRING = [] EG: [_][.] //NOT STRING = (?!string) EG: geostasis[.](?!test).* - const filterKeys = ["[_].*", "id", "geometry", "geom", "extent_geom", ".*gid.*", "globalid", "objectid.*", "shape.*", "displayfieldname", "displayfieldvalue", "geostasis[.].*", ".*fid.*"]; + const filterKeys = [ + "[_].*", + "id", + "geometry", + "geom", + "extent_geom", + ".*gid.*", + "globalid", + "objectid.*", + "shape.*", + "displayfieldname", + "displayfieldvalue", + "layerdisplayname", + "geostasis[.].*", + ".*fid.*", + ]; const featureProps = feature.getProperties(); let keys = Object.keys(featureProps); @@ -1403,7 +1471,7 @@ export function getBase64FromImageUrl(url, callback) { export function waitForLoad(items, startTime = Date.now(), timeout = 30, callback) { if (startTime + timeout * 1000 <= Date.now()) { showMessage("Timeout", "Items Failed to load in a timely manner. Please reload the page", messageColors.red); - console.error("timeout loading", items); + console.error("timeout loading", items, window.loaded); } else { if (isLoaded(items)) { callback(); diff --git a/src/index.js b/src/index.js index df59ac05..76656eba 100644 --- a/src/index.js +++ b/src/index.js @@ -1,28 +1,36 @@ // import 'react-app-polyfill/ie11'; import React from "react"; -import ReactDOM from "react-dom"; +import { createRoot } from "react-dom/client"; + import "./index.css"; import * as serviceWorker from "./serviceWorker"; import { MsalProvider } from "@azure/msal-react"; import { Configuration, PublicClientApplication } from "@azure/msal-browser"; import "alertifyjs/build/css/alertify.css"; import "alertifyjs/build/css/themes/default.min.css"; + +const root = createRoot(document.getElementById("root")); +let element = document.createElement("div"); +element.setAttribute("id", "portal-root"); +document.getElementById("root").appendChild(element); +window.portalRoot = createRoot(document.getElementById("portal-root")); + if (process.env.REACT_APP_SECURED === "true") { import(`./AppSecure.jsx`) .then((module) => { const AppSecure = module.default; // MSAL configuration - const configuration: Configuration = { + const configuration = Configuration({ auth: { clientId: process.env.REACT_APP_CLIENTID, }, - }; + }); const pca = new PublicClientApplication(configuration); - ReactDOM.render( + + root.render( - , - document.getElementById("root") + ); }) .catch((error) => { @@ -32,7 +40,7 @@ if (process.env.REACT_APP_SECURED === "true") { import(`./App.js`) .then((module) => { const App = module.default; - ReactDOM.render(, document.getElementById("root")); + root.render(); }) .catch((error) => { console.log(error); diff --git a/src/layerInfo/App.test.js b/src/layerInfo/App.test.js index 635a333f..bb0dc284 100644 --- a/src/layerInfo/App.test.js +++ b/src/layerInfo/App.test.js @@ -1,9 +1,11 @@ import React from "react"; -import ReactDOM from "react-dom"; +import { createRoot } from "react-dom/client"; import App from "./App"; it("renders without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render(, div); - ReactDOM.unmountComponentAtNode(div); + const div = document.createElement("div"); + + const root = createRoot(div); // createRoot(container!) if you use TypeScript + root.render(); + root.unmount(); }); diff --git a/src/layerInfo/index.js b/src/layerInfo/index.js index 781cb802..cecbde2b 100644 --- a/src/layerInfo/index.js +++ b/src/layerInfo/index.js @@ -1,10 +1,15 @@ import React from "react"; -import ReactDOM from "react-dom"; +import { createRoot } from "react-dom/client"; import "./index.css"; import App from "./App"; import * as serviceWorker from "./serviceWorker"; -ReactDOM.render(, document.getElementById("root")); +const uniqueId = `root-${"layerInfo"}}`; +const element = document.createElement("div"); +element.setAttribute("id", uniqueId); +document.getElementById("root").appendChild(element); +const root = createRoot(document.getElementById(uniqueId)); +root.render(); // If you want your app to work offline and load faster, you can change // unregister() to register() below. Note this comes with some pitfalls. diff --git a/src/legend/App.test.js b/src/legend/App.test.js index 635a333f..0d5b554a 100644 --- a/src/legend/App.test.js +++ b/src/legend/App.test.js @@ -1,9 +1,10 @@ import React from "react"; -import ReactDOM from "react-dom"; +import { createRoot } from "react-dom/client"; import App from "./App"; it("renders without crashing", () => { - const div = document.createElement("div"); - ReactDOM.render(, div); - ReactDOM.unmountComponentAtNode(div); + const div = document.createElement("div"); + const root = createRoot(div); // createRoot(container!) if you use TypeScript + root.render(); + root.unmount(); }); diff --git a/src/map/BasicBasemapSwitcher.jsx b/src/map/BasicBasemapSwitcher.jsx index b42bbc5e..48d10e59 100644 --- a/src/map/BasicBasemapSwitcher.jsx +++ b/src/map/BasicBasemapSwitcher.jsx @@ -1,5 +1,4 @@ import React, { useState, useRef, useContext, useEffect } from "react"; -import ReactDOM from "react-dom"; import Slider from "rc-slider"; import "./BasicBasemapSwitcher.css"; import * as helpers from "../helpers/helpers"; @@ -186,7 +185,7 @@ const BasicBasemapSwitcher = (props) => { ); - ReactDOM.render(menu, document.getElementById("portal-root")); + window.portalRoot.render(menu); }; const controlStateChange = (control, state) => { diff --git a/src/map/SCMap.jsx b/src/map/SCMap.jsx index f0bddbd1..550d4dfa 100644 --- a/src/map/SCMap.jsx +++ b/src/map/SCMap.jsx @@ -1,5 +1,4 @@ import React, { useState, useRef, useEffect, Fragment } from "react"; -import ReactDOM from "react-dom"; // import GitHubButton from "react-github-btn"; import GitHubButton from "../components/sc-github-btn"; //OPENLAYERS @@ -230,7 +229,8 @@ const SCMap = (props) => { ); - ReactDOM.render(menu, document.getElementById("portal-root")); + + window.portalRoot.render(menu); }); // APP STAT diff --git a/src/sidebar/Sidebar.jsx b/src/sidebar/Sidebar.jsx index 599c4488..6d61cc50 100644 --- a/src/sidebar/Sidebar.jsx +++ b/src/sidebar/Sidebar.jsx @@ -1,4 +1,5 @@ -import React, { Component } from "react"; +import React, { useState, useRef, useEffect } from "react"; +import { flushSync } from "react-dom"; import "./Sidebar.css"; import * as helpers from "../helpers/helpers"; @@ -13,179 +14,165 @@ import SidebarComponent from "../components/sc-sidebar.jsx"; import SidebarSlim from "./SidebarSlim.jsx"; import MenuButton from "./MenuButton.jsx"; -class Sidebar extends Component { - constructor(props) { - super(props); - - // BIND THIS FUNCTIONS - this.togglePanelVisibility = this.togglePanelVisibility.bind(this); - this.activateSidebarItem = this.activateSidebarItem.bind(this); - this.onPanelComponentClose = this.onPanelComponentClose.bind(this); - this.onSetSidebarOpen = this.onSetSidebarOpen.bind(this); - - this.state = { - // TOOLS AND THEMES ARE IN HERE - toolComponents: [], - - // CLASSES - tabClassName: "sidebar-advanced-tab", - sidebarOpen: false, - tocLoaded: false, - // SELECTED TAB - tabIndex: 0, - isMyMapsEditing: false, - //hide components - hideTools: false, - hideThemes: false, - hideLayers: false, - hideMyMaps: false, - hideReports: false, - //TAB CONFIG ITEMS - layers: { - title: "Layers", - icon: "legend-32x32.png", - }, - tools: { - title: "Tools", - icon: "tools-32x32.png", - }, - myMaps: { - title: "My Maps", - icon: "map-32x32.png", - }, - themes: { - title: "Themes", - icon: "theme-32x32.png", - }, - reports: { - title: "Reports", - icon: "report-32x32.png", - }, - // COMPONENTS - activeTabComponents: { - layers: , - mymaps: , - reports: { - default: , - loadedComponent: null, - }, - tools: { - default: , - loadedComponent: null, - }, - themes: { - default: , - loadedComponent: null, - }, - }, - }; - // LISTEN FOR TOC TO LOAD - window.emitter.addListener("tocLoaded", () => this.setState({ tocLoaded: true })); - } - - onMyMapsEditing = (isMyMapsEditing) => { +const Sidebar = (props) => { + const toolComponentsRef = useRef([]); + + const toolComponentsLoaded = useRef(false); + const mapLoadingRef = useRef(props.mapLoading); + const headerLoadingRef = useRef(props.headerLoading); + + const tabClassName = "sidebar-advanced-tab"; + const [sidebarOpen, setSidebarOpen] = useState(false); + const [tabIndex, setTabIndex] = useState(0); + const [isMyMapsEditing, setIsMyMapsEditing] = useState(false); + const [hideTools, setHideTools] = useState(false); + const [hideThemes, setHideThemes] = useState(false); + const [hideLayers, setHideLayers] = useState(false); + const [hideMyMaps, setHideMyMaps] = useState(false); + const [hideReports, setHideReports] = useState(false); + + const layers = { + title: "Layers", + icon: "legend-32x32.png", + }; + const [tools, setTools] = useState({ + title: "Tools", + icon: "tools-32x32.png", + }); + const myMaps = { + title: "My Maps", + icon: "map-32x32.png", + }; + const [themes, setThemes] = useState({ + title: "Themes", + icon: "theme-32x32.png", + }); + const reports = { + title: "Reports", + icon: "report-32x32.png", + }; + const onMyMapsEditing = (isMyMapsEditingLocal) => { // DISABLE PARCEL CLICK - window.disableParcelClick = isMyMapsEditing; + window.disableParcelClick = isMyMapsEditingLocal; // DISABLE POPUPS - window.isDrawingOrEditing = isMyMapsEditing; - - this.setState({ isMyMapsEditing }); + window.isDrawingOrEditing = isMyMapsEditingLocal; + setIsMyMapsEditing(isMyMapsEditingLocal); }; + // TOOL AND THEME ITEMS CLICK + const activateSidebarItem = (name, type, options = undefined) => { + // THIS HANDLES WHAT TOOL/THEME IS LOADED IN THE SIDEBAR + if (type === "tools") { + toolComponentsRef.current.map((Component) => { + if (Component.props.name.toLowerCase() === name.toLowerCase()) { + // CREATE TOOL COMPONENT + var comp = ( + togglePanelVisibility()} + config={Component.props.config} + options={options} + /> + ); + setToolTabComponent(comp); + return comp; + } else return null; + }); - onSetSidebarOpen(open) { - this.setState({ sidebarOpen: open }); - } - - addComponent = (componentConfig, typeFolder, callback = undefined) => { - // THIS IMPORTS THE COMPONENTS - //console.log(`Loading ${componentConfig.name} component...`); - const typeLowerCase = `${componentConfig.componentName}`.toLowerCase().replace(/\s/g, ""); - const path = `./components/${typeFolder}/${typeLowerCase}/${componentConfig.componentName}.jsx`; - - import(`${path}`) - .then((component) => { - // SET PROPS FROM CONFIG - let comp = component.default; - comp.props = []; - comp.props.active = false; - comp.props.id = helpers.getUID(); - comp.props.description = componentConfig.description; - comp.props.name = componentConfig.name; - comp.props.componentName = componentConfig.componentName; - comp.props.helpLink = componentConfig.helpLink; - comp.props.config = componentConfig.config; - if (componentConfig.hideHeader !== undefined) comp.props.hideHeader = componentConfig.hideHeader; - - // ADD COMPONENT TO LIST - this.setState( - { - toolComponents: this.state.toolComponents.concat(comp), - }, - callback("success") - ); - }) - .catch((error) => { - console.log(error); - console.error(`"${componentConfig.name}" not yet supported`); - callback("failure"); - }) - .finally(() => { - if (callback === undefined) return "Done"; + helpers.addAppStat("Tool", name); + } else { + toolComponentsRef.current.map((Component) => { + if (Component.props.name.toLowerCase() === name.toLowerCase()) { + // CREATE THEME COMPONENT + var comp = ( + togglePanelVisibility()} + config={Component.props.config} + options={options} + /> + ); + setThemeTabComponent(comp); + return comp; + } else return null; }); - }; - componentDidMount() { + helpers.addAppStat("Theme", name); + } + }; + const defaultLayersTabComponentGUID = helpers.getUID(); + const defaultToolTabComponentGUID = helpers.getUID(); + const defaultThemeTabComponentGUID = helpers.getUID(); + const defaultMyMapTabComponentGUID = helpers.getUID(); + const defaultReportTabComponentGUID = helpers.getUID(); + const defaultLayersTabComponent = ; + const defaultToolTabComponent = ; + const defaultThemeTabComponent = ; + const defaultMyMapTabComponent = ; + const defaultReportTabComponent = ; + + const [activeLayersTabComponent, setLayersTabComponent] = useState(defaultLayersTabComponent); + const [activeToolTabComponent, setToolTabComponent] = useState(null); + const [activeThemeTabComponent, setThemeTabComponent] = useState(null); + const [activeMyMapTabComponent, setMyMapTabComponent] = useState(defaultMyMapTabComponent); + const [activeReportTabComponent, setReportTabComponent] = useState(null); + + useEffect(() => { // LISTEN FOR ITEM ACTIVATION FROM OTHER COMPONENTS - window.emitter.addListener("activateSidebarItem", (name, type, options = undefined) => { - helpers.waitForLoad("sidebar", Date.now(), 30, () => { - this.activateItemFromEmmiter(name, type, options); - }); - }); + window.emitter.addListener("activateSidebarItem", activateItemFromEmmiter); + // LISTEN FOR OPEN OR CLOSE FROM OTHER COMPONENTS (CLOSE OR OPEN) - window.emitter.addListener("setSidebarVisiblity", (openOrClose) => { - helpers.waitForLoad("sidebar", Date.now(), 30, () => { - this.sidebarVisiblityEventHandler(openOrClose); - }); - }); + window.emitter.addListener("setSidebarVisiblity", sidebarVisiblityEventHandler); // LISTEN FOR TAB ACTIVATION FROM OTHER COMPONENTS - window.emitter.addListener("activateTab", (tabName) => { - helpers.waitForLoad("sidebar", Date.now(), 30, () => { - this.activateTab(tabName); - }); - }); + window.emitter.addListener("activateTab", activateTab); // LISTEN FOR REPORT LOADING - window.emitter.addListener("loadReport", (content) => { - helpers.waitForLoad("sidebar", Date.now(), 30, () => { - this.loadReport(content); - }); - }); + window.emitter.addListener("loadReport", loadReport); + initSidebar(); + + return () => { + window.emitter.removeListener("activateSidebarItem", activateItemFromEmmiter); + window.emitter.removeListener("setSidebarVisiblity", sidebarVisiblityEventHandler); + window.emitter.removeListener("activateTab", activateTab); + window.emitter.removeListener("loadReport", loadReport); + }; + }, []); + + const initSidebar = () => { helpers.waitForLoad("settings", Date.now(), 30, () => { // IMPORT TOOLS FROM CONFIG and CHECK VISIBILITY let tools = window.config.sidebarToolComponents; tools = tools.filter((item) => item.enabled === undefined || item.enabled); if (tools.length === 1) { - this.setState({ tools: { title: tools[0].name, icon: tools[0].imageName } }); + setTools({ title: tools[0].name, icon: tools[0].imageName }); tools[0]["hideHeader"] = true; } - if (tools.length === 0 || (window.config.mainSidebarItems !== undefined && window.config.mainSidebarItems["hideTools"])) this.setState({ hideTools: true }); - let loadedTools = []; - let toolsProcessed = 0; - tools.map((component) => - this.addComponent(component, "tools", (result) => { - if (result === "success") loadedTools.push(component); - else { - window.config.sidebarToolComponents = window.config.sidebarToolComponents.map((item) => { - if (component.name === item.name) item["enabled"] = false; - return item; + if (tools.length === 0 || (window.config.mainSidebarItems !== undefined && window.config.mainSidebarItems["hideTools"])) setHideTools(true); + let componentPromises = []; + componentPromises.push( + ...tools.map((component) => { + return new Promise((resolve, reject) => { + addComponent(component, "tools", (result) => { + if (result) { + resolve({ component: result, type: "tools", loadedComponent: component }); + } else { + window.config.sidebarToolComponents = window.config.sidebarToolComponents.map((item) => { + if (component.name === item.name) item["enabled"] = false; + return item; + }); + reject(); + } }); - } - toolsProcessed++; - if (toolsProcessed >= tools.length) { - helpers.addIsLoaded("tools"); - } + }); }) ); @@ -193,68 +180,132 @@ class Sidebar extends Component { let themes = window.config.sidebarThemeComponents; themes = themes.filter((item) => item.enabled === undefined || item.enabled); if (themes.length === 1) { - this.setState({ themes: { title: themes[0].name, icon: themes[0].imageName } }); + setThemes({ title: themes[0].name, icon: themes[0].imageName }); themes[0]["hideHeader"] = true; } - if (themes.length === 0 || (window.config.mainSidebarItems !== undefined && window.config.mainSidebarItems["hideThemes"])) this.setState({ hideThemes: true }); - let loadedThemes = []; - let themesProcessed = 0; - themes.map((component) => - this.addComponent(component, "themes", (result) => { - if (result === "success") loadedThemes.push(component); - else { - window.config.sidebarThemeComponents = window.config.sidebarThemeComponents.map((item) => { - if (component.name === item.name) item["enabled"] = false; - return item; + if (themes.length === 0 || (window.config.mainSidebarItems !== undefined && window.config.mainSidebarItems["hideThemes"])) setHideThemes(true); + componentPromises.push( + ...themes.map((component) => { + return new Promise((resolve, reject) => { + addComponent(component, "themes", (result) => { + if (result) { + resolve({ component: result, type: "themes", loadedComponent: component }); + } else { + window.config.sidebarThemeComponents = window.config.sidebarThemeComponents.map((item) => { + if (component.name === item.name) item["enabled"] = false; + return item; + }); + reject(); + } }); - } - themesProcessed++; - if (themesProcessed >= themes.length) { - helpers.addIsLoaded("themes"); - } + }); }) ); + let loadedThemes = []; + let loadedTools = []; + Promise.allSettled(componentPromises).then((results) => { + let loadedComponents = []; + results + .filter((result) => result.status === "fulfilled") + .forEach((result) => { + const { value } = result; + if (value.type === "themes") loadedThemes.push(value.loadedComponent); + if (value.type === "tools") loadedTools.push(value.loadedComponent); + loadedComponents.push(value.component); + }); + + toolComponentsLoaded.current = true; + toolComponentsRef.current = loadedComponents; + }); + // CHECK VISIBILITY OF LAYERS MENUE - if (window.config.mainSidebarItems !== undefined && window.config.mainSidebarItems["hideLayers"]) this.setState({ hideLayers: true }); + if (window.config.mainSidebarItems !== undefined && window.config.mainSidebarItems["hideLayers"]) setHideLayers(true); // CHECK VISIBILITY OF MY MAPS - if (window.config.mainSidebarItems !== undefined && window.config.mainSidebarItems["hideMyMaps"]) this.setState({ hideMyMaps: true }); + if (window.config.mainSidebarItems !== undefined && window.config.mainSidebarItems["hideMyMaps"]) setHideMyMaps(true); // CHECK VISIBILITY OF REPORTS - if (window.config.mainSidebarItems !== undefined && window.config.mainSidebarItems["hideReports"]) this.setState({ hideReports: true }); + if (window.config.mainSidebarItems !== undefined && window.config.mainSidebarItems["hideReports"]) setHideReports(true); const shortcuts = window.config.sidebarShortcutParams; // HANDLE ADVANCED MODE PARAMETER window.sidebarOpen = false; if (window.config.viewerMode !== undefined && window.config.viewerMode !== null) { - if (window.config.viewerMode.toUpperCase() === "ADVANCED") this.sidebarVisiblityEventHandler("OPEN"); + if (window.config.viewerMode.toUpperCase() === "ADVANCED") sidebarVisiblityEventHandler("OPEN"); } - helpers.waitForLoad(["tools", "themes"], Date.now(), 30, () => { - this.initToolAndThemeUrlParameter({ tools: loadedTools, themes: loadedThemes, shortcuts: shortcuts }, () => { + + helpers.waitForLoad(["tools", "themes", "header", "map"], Date.now(), 30, () => { + initToolAndThemeUrlParameter({ tools: loadedTools, themes: loadedThemes, shortcuts: shortcuts }, () => { // TAB PARAMETER const tabNameParameter = helpers.getURLParameter("TAB"); if (tabNameParameter != null) { - this.sidebarVisiblityEventHandler("OPEN", () => { - this.activateTab(tabNameParameter.toLowerCase()); + sidebarVisiblityEventHandler("OPEN", () => { + activateTab(tabNameParameter.toLowerCase()); }); } - window.emitter.emit("sidebarLoaded"); helpers.addIsLoaded("sidebar"); }); }); }); - } + }; + + useEffect(() => { + helpers.addIsLoaded("tools"); + helpers.addIsLoaded("themes"); + }, [toolComponentsRef]); - initToolAndThemeUrlParameter = (components, callback) => { - if (components.tools.length + components.themes.length === this.state.toolComponents.length && !this.props.mapLoading && !this.props.headerLoading) { + useEffect(() => { + mapLoadingRef.current = props.mapLoading; + }, [props.mapLoading]); + + useEffect(() => { + headerLoadingRef.current = props.headerLoading; + }, [props.headerLoading]); + const onSetSidebarOpen = (open) => { + setSidebarOpen(open); + }; + + const addComponent = (componentConfig, typeFolder, callback = undefined) => { + // THIS IMPORTS THE COMPONENTS + const typeLowerCase = `${componentConfig.componentName}`.toLowerCase().replace(/\s/g, ""); + const path = `./components/${typeFolder}/${typeLowerCase}/${componentConfig.componentName}.jsx`; + + import(`${path}`) + .then((component) => { + // SET PROPS FROM CONFIG + let comp = component.default; + comp.props = []; + comp.props.active = false; + comp.props.id = helpers.getUID(); + comp.props.description = componentConfig.description; + comp.props.name = componentConfig.name; + comp.props.componentName = componentConfig.componentName; + comp.props.helpLink = componentConfig.helpLink; + comp.props.config = componentConfig.config; + if (componentConfig.hideHeader !== undefined) comp.props.hideHeader = componentConfig.hideHeader; + + // ADD COMPONENT TO LIST + callback(comp); + }) + .catch((error) => { + console.log(error); + console.error(`"${componentConfig.name}" not yet supported`); + callback(); + }) + .finally(() => { + if (callback === undefined) return "Done"; + }); + }; + + const initToolAndThemeUrlParameter = (components, callback) => { + if (components.tools.length + components.themes.length === toolComponentsRef.current.length && !mapLoadingRef.current && !headerLoadingRef.current) { // HANDLE ADVANCED MODE PARAMETER callback(); const queryString = window.location.search; if (queryString !== "") { const urlParams = new URLSearchParams(queryString.toLowerCase()); - const item = undefined; let shortcuts = []; let params = []; - components.tools.map((item) => { + components.tools.forEach((item) => { shortcuts.push({ name: item.name.toLowerCase(), component: item.name, @@ -263,7 +314,7 @@ class Sidebar extends Component { }); if (!params.includes("tool")) params.push("tool"); }); - components.themes.map((item) => { + components.themes.forEach((item) => { shortcuts.push({ name: item.name.toLowerCase(), component: item.name, @@ -272,7 +323,7 @@ class Sidebar extends Component { }); if (!params.includes("theme")) params.push("theme"); }); - components.shortcuts.map((item) => { + components.shortcuts.forEach((item) => { shortcuts.push({ name: item.matchValue, component: item.component, @@ -283,7 +334,7 @@ class Sidebar extends Component { }); if (!params.includes(item.url_param.toLowerCase())) params.push(item.url_param.toLowerCase()); }); - params.map((param) => { + params.forEach((param) => { var shortcutParam = urlParams.get(param); if (shortcutParam !== null) { const shortcut = shortcuts.filter( @@ -293,8 +344,8 @@ class Sidebar extends Component { if (shortcut.type === "search") { window.emitter.emit("searchItem", shortcut.component, shortcutParam, shortcut.hidden, shortcut.timeout); } else { - this.sidebarVisiblityEventHandler("OPEN", () => { - this.activateItemFromEmmiter(shortcut.component, shortcut.type); + sidebarVisiblityEventHandler("OPEN", () => { + activateItemFromEmmiter(shortcut.component, shortcut.type); }); } } @@ -303,273 +354,206 @@ class Sidebar extends Component { } } else { setTimeout(() => { - this.initToolAndThemeUrlParameter(components, callback); - }, 50); + initToolAndThemeUrlParameter(components, callback); + }, 500); } }; - loadReport = (content) => { - let activeTabComponents = this.state.activeTabComponents; - activeTabComponents.reports.loadedComponent = {content}; - this.setState({ activeTabComponents: activeTabComponents }); - this.sidebarVisiblityEventHandler("OPEN"); - this.activateTab("reports"); + const loadReport = (content) => { + helpers.waitForLoad("sidebar", Date.now(), 30, () => { + setReportTabComponent({content}); + sidebarVisiblityEventHandler("OPEN"); + activateTab("reports"); + }); }; - activateItemFromEmmiter(name, type, options = undefined) { - const active = this.state.activeTabComponents; - if (type === "tools") { - //SAME TOOL WAS SELECTED - if (active.tools.loadedComponent != null && type === "tools" && active.tools.loadedComponent.props.name === name) { - this.activateTab("tools"); - return; - } - - this.setState({ tabIndex: 1 }, () => { - //CLEAR LOADED TOOL - let activeTabComponents = this.state.activeTabComponents; - activeTabComponents.tools.loadedComponent = null; - this.setState({ activeTabComponents: activeTabComponents }, () => { - // ASK TOOLS TO CLOSE - window.emitter.emit("closeToolsOrThemes", type); - - // ACTIVATE THE NEW ITEM - this.activateSidebarItem(name, type, options); + const activateItemFromEmmiter = (name, type, options = undefined) => { + helpers.waitForLoad("sidebar", Date.now(), 30, () => { + if (type === "tools") { + //SAME TOOL WAS SELECTED + if (activeToolTabComponent != null && type === "tools" && activeToolTabComponent.props.name === name) { + activateTab("tools"); + return; + } + flushSync(() => { + setTabIndex(1); + //CLEAR LOADED TOOL + setToolTabComponent(null); }); - }); - } else if (type === "themes") { - // SAME THEME WAS SELECTED - if (active.themes.loadedComponent != null && type === "themes" && active.themes.loadedComponent.props.name === name) { - this.activateTab("themes"); - return; - } - - this.setState({ tabIndex: 3 }, () => { - //CLEAR LOADED THEME - let activeTabComponents = this.state.activeTabComponents; - activeTabComponents.themes.loadedComponent = null; - this.setState({ activeTabComponents: activeTabComponents }); + // ASK TOOLS TO CLOSE + window.emitter.emit("closeToolsOrThemes", type); + // ACTIVATE THE NEW ITEM + activateSidebarItem(name, type, options); + } else if (type === "themes") { + // SAME THEME WAS SELECTED + if (activeThemeTabComponent != null && type === "themes" && activeThemeTabComponent.props.name === name) { + activateTab("themes"); + return; + } + flushSync(() => { + setTabIndex(3); + //CLEAR LOADED THEME + setThemeTabComponent(null); + }); // ASK THEMES TO CLOSE window.emitter.emit("closeToolsOrThemes", type); // ACTIVATE THE NEW ITEM - this.activateSidebarItem(name, type, options); - }); - } else if (type === "mymaps") { - this.activateTab("mymaps"); - } else if (type === "reports") { - this.activateTab("reports"); - } + activateSidebarItem(name, type, options); + } else if (type === "mymaps") { + activateTab("mymaps"); + } else if (type === "reports") { + activateTab("reports"); + } - // OPEN PANEL - this.sidebarVisiblityEventHandler("OPEN"); - } - - activateTab(tabName) { - // OPEN PANEL - this.sidebarVisiblityEventHandler("OPEN"); - - // SET SELECTED TAB - if (tabName === "layers") this.setState({ tabIndex: 0 }); - else if (tabName === "tools") this.setState({ tabIndex: 1 }); - else if (tabName === "mymaps") this.setState({ tabIndex: 2 }); - else if (tabName === "themes") this.setState({ tabIndex: 3 }); - else if (tabName === "reports") this.setState({ tabIndex: 4 }); - else console.log("NO VALID TAB FOUND"); - } - - sidebarVisiblityEventHandler(openOrClose, callback = undefined) { - // CHECK IF NEED TO DO ANYTHING - if ((openOrClose === "CLOSE" && window.sidebarOpen === false) || (openOrClose === "OPEN" && window.sidebarOpen === true)) { - if (callback === undefined) return; - else callback(); - } else { - // TOGGLE IT - this.togglePanelVisibility(callback); - } - } + // OPEN PANEL + sidebarVisiblityEventHandler("OPEN"); + }); + }; - togglePanelVisibility(callback = undefined) { - // PANEL IN AND OUT CLASSES - window.sidebarOpen = !window.sidebarOpen; - this.setState({ sidebarOpen: window.sidebarOpen }, () => { - // EMIT A CHANGE IN THE SIDEBAR (IN OR OUT) - window.emitter.emit("sidebarChanged", window.sidebarOpen); - if (callback !== undefined && typeof callback === "function") callback(); + const activateTab = (tabName) => { + helpers.waitForLoad("sidebar", Date.now(), 30, () => { + // OPEN PANEL + sidebarVisiblityEventHandler("OPEN"); + flushSync(() => { + // SET SELECTED TAB + if (tabName === "layers") setTabIndex(0); + else if (tabName === "tools") setTabIndex(1); + else if (tabName === "mymaps") setTabIndex(2); + else if (tabName === "themes") setTabIndex(3); + else if (tabName === "reports") setTabIndex(4); + else console.log("NO VALID TAB FOUND"); + }); }); - } + }; - // TOOL AND THEME ITEMS CLICK - activateSidebarItem(name, type, options = undefined) { - // THIS HANDLES WHAT TOOL/THEME IS LOADED IN THE SIDEBAR - if (type === "tools") { - var loadedTool = this.state.activeTabComponents.tools.loadedComponent; - if (loadedTool != null) { - this.setState({ activeComponent: loadedTool }); + const sidebarVisiblityEventHandler = (openOrClose, callback = undefined) => { + helpers.waitForLoad("sidebar", Date.now(), 30, () => { + // CHECK IF NEED TO DO ANYTHING + if ((openOrClose === "CLOSE" && window.sidebarOpen === false) || (openOrClose === "OPEN" && window.sidebarOpen === true)) { + if (callback === undefined) return; + else callback(); } else { - this.state.toolComponents.map((Component) => { - if (Component.props.name.toLowerCase() === name.toLowerCase()) { - // CREATE TOOL COMPONENT - var comp = ( - this.togglePanelVisibility()} - config={Component.props.config} - options={options} - /> - ); - let activeTabComponents = this.state.activeTabComponents; - activeTabComponents.tools.loadedComponent = comp; - this.setState({ activeTabComponents: activeTabComponents }); - return comp; - } else return null; - }); + // TOGGLE IT + togglePanelVisibility(callback); } + }); + }; - helpers.addAppStat("Tool", name); - } else { - var loadedTheme = this.state.activeTabComponents.themes.loadedComponent; - if (loadedTheme != null) this.setState({ activeComponent: loadedTheme }); - else { - this.state.toolComponents.map((Component) => { - if (Component.props.name.toLowerCase() === name.toLowerCase()) { - // CREATE THEME COMPONENT - var comp = ( - this.togglePanelVisibility()} - config={Component.props.config} - options={options} - /> - ); - let activeTabComponents = this.state.activeTabComponents; - activeTabComponents.themes.loadedComponent = comp; - this.setState({ activeTabComponents: activeTabComponents }); - //helpers.showMessage("Property Report", "Property Report Click is disabled while theme is active.", "green" , 5000); - return comp; - } else return null; - }); - } - helpers.addAppStat("Theme", name); - } - } + const togglePanelVisibility = (callback = undefined) => { + // PANEL IN AND OUT CLASSES + window.sidebarOpen = !window.sidebarOpen; + setSidebarOpen(window.sidebarOpen); + // EMIT A CHANGE IN THE SIDEBAR (IN OR OUT) + window.emitter.emit("sidebarChanged", window.sidebarOpen); + if (callback !== undefined && typeof callback === "function") callback(); + }; - onPanelComponentClose(evt) { + const onPanelComponentClose = (evt) => { // HANDLES UNLOADING OF TOOL/THEME - if (this.state.tabIndex === 1) { + if (tabIndex === 1) { // SET TOOLS - let activeTabComponents = this.state.activeTabComponents; - activeTabComponents.tools.loadedComponent = null; - this.setState({ activeTabComponents: activeTabComponents }); - } else if (this.state.tabIndex === 3) { + setToolTabComponent(null); + } else if (tabIndex === 3) { // SET THEMES - let activeTabComponents = this.state.activeTabComponents; - activeTabComponents.themes.loadedComponent = null; - this.setState({ activeTabComponents: activeTabComponents }); + setThemeTabComponent(null); } - } + }; - slimSidebarButtonClick = (name) => { - this.sidebarVisiblityEventHandler("OPEN", () => { - this.activateTab(name); + const slimSidebarButtonClick = (name) => { + sidebarVisiblityEventHandler("OPEN", () => { + activateTab(name); helpers.addAppStat("Sidebar Slim", name); }); }; - onTabSelect = (tabIndex) => { - this.setState({ tabIndex }); - if (tabIndex === 0) helpers.addAppStat("Tab", "Layers"); - else if (tabIndex === 1) helpers.addAppStat("Tab", "Tools"); - else if (tabIndex === 2) helpers.addAppStat("Tab", "MyMaps"); - else if (tabIndex === 3) helpers.addAppStat("Tab", "Themes"); - else if (tabIndex === 4) helpers.addAppStat("Tab", "Reports"); + const onTabSelect = (tabIndexLocal) => { + setTabIndex(tabIndexLocal); + if (tabIndexLocal === 0) helpers.addAppStat("Tab", "Layers"); + else if (tabIndexLocal === 1) helpers.addAppStat("Tab", "Tools"); + else if (tabIndexLocal === 2) helpers.addAppStat("Tab", "MyMaps"); + else if (tabIndexLocal === 3) helpers.addAppStat("Tab", "Themes"); + else if (tabIndexLocal === 4) helpers.addAppStat("Tab", "Reports"); }; - // this.setState({ tabIndex })} selectedIndex={this.state.tabIndex}> - render() { - return ( - - - - - - - - - - - - - - - - - - - - - {this.state.activeTabComponents.layers} - - {this.state.activeTabComponents.tools.loadedComponent ? this.state.activeTabComponents.tools.loadedComponent : this.state.activeTabComponents.tools.default} - - {this.state.activeTabComponents.mymaps} - - {this.state.activeTabComponents.themes.loadedComponent ? this.state.activeTabComponents.themes.loadedComponent : this.state.activeTabComponents.themes.default} - - - {this.state.activeTabComponents.reports.loadedComponent ? this.state.activeTabComponents.reports.loadedComponent : this.state.activeTabComponents.reports.default} - - - -
    this.togglePanelVisibility()}> - Close Tab -
    - -
    - {this.state.sidebarOpen ? : ""} - - } - open={this.state.sidebarOpen} - onSetOpen={this.onSetSidebarOpen} - styles={{ sidebar: { background: "white" } }} - /> - ); - } -} + return ( + + + + + + + + + + + + + + + + + + + + + + {activeLayersTabComponent} + + + {activeToolTabComponent ? activeToolTabComponent : defaultToolTabComponent} + + + {activeMyMapTabComponent} + + + {activeThemeTabComponent ? activeThemeTabComponent : defaultThemeTabComponent} + + + {activeReportTabComponent ? activeReportTabComponent : defaultReportTabComponent} + + + +
    togglePanelVisibility()}> + Close Tab +
    + +
    + {sidebarOpen ? : ""} + + } + open={sidebarOpen} + onSetOpen={onSetSidebarOpen} + styles={{ sidebar: { background: "white" } }} + /> + ); +}; export default Sidebar; diff --git a/src/sidebar/components/mymaps/ColorPicker.jsx b/src/sidebar/components/mymaps/ColorPicker.jsx index 1efb2e54..fbf5d294 100644 --- a/src/sidebar/components/mymaps/ColorPicker.jsx +++ b/src/sidebar/components/mymaps/ColorPicker.jsx @@ -1,50 +1,49 @@ import React from "react"; -import ReactDOM from "react-dom"; +// import * as helpers from "../../../helpers/helpers"; import Portal from "../../../helpers/Portal.jsx"; export default class ColorPicker { - constructor(evt, elements, callerId) { - this.evt = evt; - this.elements = elements; - this.callerId = callerId; - - this.documentClick = (evt) => { - const e = document.elementFromPoint(evt.pageX, evt.pageY); - if (evt.target.id !== this.callerId && e.getAttribute("spellcheck") === null) { - this.hide(); - } - }; - - this.clickHandler = this.documentClick.bind(this); - - // CLICK ANYWHERE ELSE WILL CLOSE MENU - document.body.addEventListener("click", this.clickHandler); - } - - show() { - if (document.getElementById("sc-color-picker-container") !== null) document.getElementById("sc-color-picker-container").classList.remove("sc-hidden"); - - const portalStyle = { - position: "absolute", - zIndex: 10000, - top: this.evt.pageY, - left: this.evt.pageX, - }; - - const menu = ( - -
    - {this.elements} -
    -
    - ); - - ReactDOM.render(menu, document.getElementById("portal-root")); - } - - hide() { - if (document.getElementById("sc-color-picker-container") !== null) document.getElementById("sc-color-picker-container").classList.add("sc-hidden"); - - document.body.removeEventListener("click", this.clickHandler); - } + constructor(evt, elements, callerId) { + this.evt = evt; + this.elements = elements; + this.callerId = callerId; + + this.documentClick = (evt) => { + const e = document.elementFromPoint(evt.pageX, evt.pageY); + if (evt.target.id !== this.callerId && e.getAttribute("spellcheck") === null) { + this.hide(); + } + }; + + this.clickHandler = this.documentClick.bind(this); + + // CLICK ANYWHERE ELSE WILL CLOSE MENU + document.body.addEventListener("click", this.clickHandler); + } + + show() { + if (document.getElementById("sc-color-picker-container") !== null) document.getElementById("sc-color-picker-container").classList.remove("sc-hidden"); + + const portalStyle = { + position: "absolute", + zIndex: 10000, + top: this.evt.pageY, + left: this.evt.pageX, + }; + + const menu = ( + +
    + {this.elements} +
    +
    + ); + + window.portalRoot.render(menu); + } + + hide() { + if (document.getElementById("sc-color-picker-container") !== null) document.getElementById("sc-color-picker-container").classList.add("sc-hidden"); + document.body.removeEventListener("click", this.clickHandler); + } } diff --git a/src/sidebar/components/mymaps/MyMaps.jsx b/src/sidebar/components/mymaps/MyMaps.jsx index 46b04d22..ac0aa92d 100644 --- a/src/sidebar/components/mymaps/MyMaps.jsx +++ b/src/sidebar/components/mymaps/MyMaps.jsx @@ -1,6 +1,6 @@ // REACT -import React, { Component, Fragment } from "react"; -import ReactDOM from "react-dom"; +import React, { Component, Fragment, useEffect } from "react"; +import { createRoot } from "react-dom/client"; import { CSSTransition, TransitionGroup } from "react-transition-group"; import { SubMenu, Item as MenuItem } from "rc-menu"; @@ -811,8 +811,7 @@ class MyMaps extends Component { ); - - ReactDOM.render(menu, document.getElementById("portal-root")); + window.portalRoot.render(menu); }; onMenuItemClick = (action, item) => { @@ -963,7 +962,6 @@ class MyMaps extends Component { var evtClone = Object.assign({}, evt); const feature = helpers.getFeatureFromGeoJSON(item.featureGeoJSON); const showCoordinates = feature.get("is_open_data"); - const menu = ( ); - - ReactDOM.render(menu, document.getElementById("portal-root")); + window.portalRoot.render(menu); }; deleteSelected = (selected) => { diff --git a/src/sidebar/components/mymaps/MyMapsFooter.jsx b/src/sidebar/components/mymaps/MyMapsFooter.jsx index 6d7b23a8..0c8b1ea6 100644 --- a/src/sidebar/components/mymaps/MyMapsFooter.jsx +++ b/src/sidebar/components/mymaps/MyMapsFooter.jsx @@ -1,5 +1,4 @@ import React from "react"; -import ReactDOM from "react-dom"; import "./MyMapsFooter.css"; import * as helpers from "../../../helpers/helpers"; import FloatingMenu, { FloatingMenuItem } from "../../../helpers/FloatingMenu.jsx"; @@ -13,11 +12,18 @@ const MyMapsFooter = (props) => { // PARENT CHANGES THE COLOR FROM STORAGE //useEffect(() => {}); + function getPositionXY(element) { + let rect = element.getBoundingClientRect(); + return { positionX: rect.x, positionY: rect.y }; + } function onToolsClick(evt) { var evtClone = Object.assign({}, evt); + const { positionX, positionY } = getPositionXY(document.getElementById("sc-mymaps-footer-button-tools")); const menu = ( { ); - ReactDOM.render(menu, document.getElementById("portal-root")); + window.portalRoot.render(menu); } return ( @@ -63,7 +69,7 @@ const MyMapsFooter = (props) => { -
    diff --git a/src/sidebar/components/themes/localrealestate/LocalRealEstate.jsx b/src/sidebar/components/themes/localrealestate/LocalRealEstate.jsx index c18d6870..252e171f 100644 --- a/src/sidebar/components/themes/localrealestate/LocalRealEstate.jsx +++ b/src/sidebar/components/themes/localrealestate/LocalRealEstate.jsx @@ -1,10 +1,11 @@ import React, { Component } from "react"; +import { createRoot } from "react-dom/client"; + import "./LocalRealEstate.css"; import PanelComponent from "../../../PanelComponent"; import config from "./config.json"; import LocalRealEstateLayerToggler from "./LocalRealEstateLayerToggler.jsx"; import * as helpers from "../../../../helpers/helpers"; -import ReactDOM from "react-dom"; import LocalRealEstateImageSlider from "./LocalRealEstateImageSlider.jsx"; import LocalRealEstateRecents from "./LocalRealEstateRecents.jsx"; import LocalRealEstatePopupContent from "./LocalRealEstatePopupContent.jsx"; @@ -26,13 +27,14 @@ class LocalRealEstate extends Component { this.imageSlider.id = "sc-theme-real-estate-photo-slider"; this.storageKey = "theme-real-estate"; this.state = { visibleLayers: null, viewedItems: [] }; + this.root = null; } componentDidMount() { //window.disableParcelClick = true; // CREATE DIV FOR SLIDER document.body.appendChild(this.imageSlider); - + this.root = createRoot(document.getElementById(this.imageSlider.id)); let visibleLayers = []; config.layers.forEach((layer) => { if (layer.visible && layer.displayName !== "All") visibleLayers.push(layer.displayName); @@ -46,10 +48,7 @@ class LocalRealEstate extends Component { } renderImageSlider = () => { - ReactDOM.render( - , - document.getElementById(this.imageSlider.id) - ); + this.root.render(); }; componentWillUnmount() { //window.disableParcelClick = false; diff --git a/src/sidebar/components/toc/TOC.jsx b/src/sidebar/components/toc/TOC.jsx index 15a3c238..193db79d 100644 --- a/src/sidebar/components/toc/TOC.jsx +++ b/src/sidebar/components/toc/TOC.jsx @@ -1,6 +1,5 @@ // REACT import React, { Component } from "react"; -import ReactDOM from "react-dom"; import { isMobile } from "react-device-detect"; //CUSTOM @@ -98,7 +97,10 @@ class TOC extends Component { layers.forEach((layer) => { if (layer.visible && layer.liveLayer) { LayerHelpers.identifyFeatures(layer.layer, evt.coordinate, (feature) => { - if (feature !== undefined) helpers.showFeaturePopup(evt.coordinate, feature); + if (feature !== undefined) { + feature.setProperties({ layerDisplayName: layer.displayName }); + helpers.showFeaturePopup(evt.coordinate, feature); + } }); } }); @@ -494,7 +496,10 @@ class TOC extends Component { allLayers.forEach((layer) => { if (layer.visible && layer.liveLayer) { LayerHelpers.identifyFeatures(layer.layer, evt.coordinate, (feature) => { - if (feature !== undefined) helpers.showFeaturePopup(evt.coordinate, feature); + if (feature !== undefined) { + feature.setProperties({ layerDisplayName: layer.displayName }); + helpers.showFeaturePopup(evt.coordinate, feature); + } }); } }); @@ -923,7 +928,7 @@ class TOC extends Component { onLayerOptionsClick = (evt, layerInfo) => { var evtClone = Object.assign({}, evt); const menu = ; - ReactDOM.render(menu, document.getElementById("portal-root")); + window.portalRoot.render(menu); }; //#endregion //#region HANDLE HEADER CALLBACKS diff --git a/src/sidebar/components/toc/common/LayerLegend.jsx b/src/sidebar/components/toc/common/LayerLegend.jsx index 9fa93eb7..ce5302b4 100644 --- a/src/sidebar/components/toc/common/LayerLegend.jsx +++ b/src/sidebar/components/toc/common/LayerLegend.jsx @@ -1,55 +1,54 @@ // REACT import React, { Component } from "react"; -import ReactDOM from "react-dom"; import * as helpers from "../../../../helpers/helpers"; import "./LayerLegend.css"; class LayerLegend extends Component { - constructor(props) { - super(props); - this.state = {}; - } + constructor(props) { + super(props); + this.state = {}; + } - render() { - return ( -
    -
    - -
    - ); - } + render() { + return ( +
    +
    + +
    + ); + } } export default LayerLegend; const Legend = ({ legendImage, legendObj }) => { - if (legendImage !== undefined && legendImage !== null) { - return style; - } else if (legendObj !== undefined) { - if (legendObj.legend === undefined) return
    ; - return ( -
      - {legendObj.legend.map((item) => { - return ; - })} -
    - ); - } else { - return
    ; - } + if (legendImage !== undefined && legendImage !== null) { + return style; + } else if (legendObj !== undefined) { + if (legendObj.legend === undefined) return
    ; + return ( +
      + {legendObj.legend.map((item) => { + return ; + })} +
    + ); + } else { + return
    ; + } }; const LegendItem = ({ legend }) => { - return ( -
  • - style -
    - {legend.label.trim()} -
    -
  • - ); + return ( +
  • + style +
    + {legend.label.trim()} +
    +
  • + ); }; diff --git a/src/sidebar/components/toc/common/TOCHeader.jsx b/src/sidebar/components/toc/common/TOCHeader.jsx index c3e435c3..2e032664 100644 --- a/src/sidebar/components/toc/common/TOCHeader.jsx +++ b/src/sidebar/components/toc/common/TOCHeader.jsx @@ -1,6 +1,5 @@ // REACT import React, { Component } from "react"; -import ReactDOM from "react-dom"; import Switch from "react-switch"; import { Item as MenuItem } from "rc-menu"; import { Tooltip as ReactTooltip } from "react-tooltip"; @@ -19,7 +18,6 @@ class TOCHeader extends Component { searchText: "", }; } - onSettingsClick = (evt) => { var evtClone = Object.assign({}, evt); var switchMenuLabel = `Switch to ${this.props.tocType === "LIST" ? "Folder" : "List"} View`; @@ -61,7 +59,7 @@ class TOCHeader extends Component { ); - ReactDOM.render(menu, document.getElementById("portal-root")); + window.portalRoot.render(menu); }; onSettingsMenuItemClick = (action) => { diff --git a/src/sidebar/components/toc/toc-folder-view/GroupItem.jsx b/src/sidebar/components/toc/toc-folder-view/GroupItem.jsx index fb5b0466..8bb79d85 100644 --- a/src/sidebar/components/toc/toc-folder-view/GroupItem.jsx +++ b/src/sidebar/components/toc/toc-folder-view/GroupItem.jsx @@ -1,5 +1,4 @@ import React, { Component } from "react"; -import ReactDOM from "react-dom"; import * as helpers from "../../../../helpers/helpers"; import FloatingMenu, { FloatingMenuItem } from "../../../../helpers/FloatingMenu.jsx"; import { Item as MenuItem } from "rc-menu"; @@ -104,7 +103,7 @@ class GroupItem extends Component { ); - ReactDOM.render(menu, document.getElementById("portal-root")); + window.portalRoot.render(menu); }; componentDidMount() { this._isMounted = true; diff --git a/src/sidebar/components/toc/toc-folder-view/Layers.jsx b/src/sidebar/components/toc/toc-folder-view/Layers.jsx index 4dcf1275..7ee4e12f 100644 --- a/src/sidebar/components/toc/toc-folder-view/Layers.jsx +++ b/src/sidebar/components/toc/toc-folder-view/Layers.jsx @@ -53,7 +53,7 @@ class Layers extends Component { }); return ( -
    +
    {layers.map((layer) => ( div > div { +.sc-toc-layer-container-folder > div > div { height: unset; } -.sc-toc-layer-container > div > div > div { +.sc-toc-layer-container-folder > div > div > div { max-height: unset; } From 4a39e4f6a4519885fcc537b5a1cbb4834eaef2b9 Mon Sep 17 00:00:00 2001 From: Tom <58078313+reed-tom@users.noreply.github.com> Date: Tue, 30 Apr 2024 08:37:18 -0400 Subject: [PATCH 04/14] fixed table of contents styling issue --- src/sidebar/components/toc/toc-list-new/LayerItem.css | 4 ++-- src/sidebar/components/toc/toc-list-new/LayerItem.jsx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/sidebar/components/toc/toc-list-new/LayerItem.css b/src/sidebar/components/toc/toc-list-new/LayerItem.css index dfb26cac..da349c1b 100644 --- a/src/sidebar/components/toc/toc-list-new/LayerItem.css +++ b/src/sidebar/components/toc/toc-list-new/LayerItem.css @@ -83,7 +83,7 @@ vertical-align: text-top; } -.sc-toc-item-layer-info-container-open-vertical-lines { +.sc-toc-item-layer-list-info-container-open-vertical-lines { height: 22px; width: 11px; position: relative; @@ -93,7 +93,7 @@ background: url(../images/verticle_dots.png) 0px repeat-y; } -.sc-toc-item-layer-info-container-open-horizontal-lines { +.sc-toc-item-layer-list-info-container-open-horizontal-lines { height: 5px; width: 11px; position: relative; diff --git a/src/sidebar/components/toc/toc-list-new/LayerItem.jsx b/src/sidebar/components/toc/toc-list-new/LayerItem.jsx index 433af6f4..8139cc6b 100644 --- a/src/sidebar/components/toc/toc-list-new/LayerItem.jsx +++ b/src/sidebar/components/toc/toc-list-new/LayerItem.jsx @@ -129,8 +129,8 @@ class LayerItem extends Component { more options
    -
    -
    +
    +
    From b8ef07b72ebabd0597ba208e4669351c13626b4d Mon Sep 17 00:00:00 2001 From: Tom <58078313+reed-tom@users.noreply.github.com> Date: Tue, 30 Apr 2024 10:38:32 -0400 Subject: [PATCH 05/14] fixed my maps item selection issue --- src/sidebar/components/mymaps/MyMapsItem.jsx | 26 +++++++++----------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/src/sidebar/components/mymaps/MyMapsItem.jsx b/src/sidebar/components/mymaps/MyMapsItem.jsx index d87b14dc..fa52fd66 100644 --- a/src/sidebar/components/mymaps/MyMapsItem.jsx +++ b/src/sidebar/components/mymaps/MyMapsItem.jsx @@ -10,15 +10,14 @@ import * as helpers from "../../../helpers/helpers"; function MyMapsItem(props) { const [label, setLabel] = useState(props.info.label); const [checked, setChecked] = useState(props.info.visible); - const [vectorLayer, setVectorLayer] = useState(null); - + const vectorLayerRef = React.createRef(); useEffect(() => { return () => { - if (vectorLayer !== null) { - window.map.removeLayer(vectorLayer); + if (vectorLayerRef.current !== null) { + window.map.removeLayer(vectorLayerRef.current); } }; - }, [vectorLayer]); + }, []); const onLabelTextChange = (evt) => { const newLabel = evt.target.value; @@ -28,9 +27,9 @@ function MyMapsItem(props) { const onItemDelete = (evt) => { props.onItemDelete && props.onItemDelete(props.info.id); - if (vectorLayer !== null) { - window.map.removeLayer(vectorLayer); - setVectorLayer(null); + if (vectorLayerRef.current !== null) { + window.map.removeLayer(vectorLayerRef.current); + vectorLayerRef.current = null; } }; @@ -81,7 +80,7 @@ function MyMapsItem(props) { geometry: feature.getGeometry(), }); - const highlightLayer = new VectorLayer({ + vectorLayerRef.current = new VectorLayer({ source: new VectorSource({ features: [highlightFeature], }), @@ -89,14 +88,13 @@ function MyMapsItem(props) { style: shadowStyle, }); - setVectorLayer(highlightLayer); - window.map.addLayer(highlightLayer); + window.map.addLayer(vectorLayerRef.current); }; const onMouseOut = (evt) => { - if (vectorLayer !== null) { - window.map.removeLayer(vectorLayer); - setVectorLayer(null); + if (vectorLayerRef.current !== null) { + window.map.removeLayer(vectorLayerRef.current); + vectorLayerRef.current = null; } }; From 86fb1d9337491675aa17f1d348b48ea528e0b402 Mon Sep 17 00:00:00 2001 From: Tom <58078313+reed-tom@users.noreply.github.com> Date: Tue, 30 Apr 2024 11:52:55 -0400 Subject: [PATCH 06/14] fixed crash when saving layers on an invalid map_id --- src/sidebar/components/toc/TOC.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sidebar/components/toc/TOC.jsx b/src/sidebar/components/toc/TOC.jsx index 193db79d..6d360e21 100644 --- a/src/sidebar/components/toc/TOC.jsx +++ b/src/sidebar/components/toc/TOC.jsx @@ -1066,7 +1066,7 @@ class TOC extends Component { savedLayers[layer.name] = saveLayer; }); let currentGroup = currentGroupList.filter((item) => item.value === group)[0]; - + if (currentGroup === undefined) continue; savedGroup["name"] = groupName; savedGroup["value"] = currentGroup.value; savedGroup["label"] = currentGroup.label; From d91ec8b31d6c31d7c495c85b597e2b97f56971a7 Mon Sep 17 00:00:00 2001 From: Tom <58078313+reed-tom@users.noreply.github.com> Date: Tue, 30 Apr 2024 11:53:23 -0400 Subject: [PATCH 07/14] fixed showWindow bug --- src/helpers/helpers.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/helpers/helpers.js b/src/helpers/helpers.js index baa2e699..76c6f783 100644 --- a/src/helpers/helpers.js +++ b/src/helpers/helpers.js @@ -123,7 +123,9 @@ export function isMobile() { // SHOW CONTENT WINDOW export function showWindow(contents, options = { title: "Information", showFooter: false, mode: "normal", hideScroll: false }) { - const uniqueId = `map-modal-window-${getUID()}}`; + const uniqueId = `map-modal-window-${"show-window"}}`; + if (document.getElementById(uniqueId) !== null) document.getElementById(uniqueId).remove(); + const element = document.createElement("div"); element.setAttribute("id", uniqueId); document.getElementById("map-modal-window").appendChild(element); @@ -140,9 +142,9 @@ export function showWindow(contents, options = { title: "Information", showFoote } }; }, []); - return ; + return ; }; - root.render(); + root.render(); } // SHOW URL WINDOW @@ -1586,6 +1588,7 @@ export function loadConfig(configSecured = {}, callback) { }, 1500); window.config = config; callback(); + return; } const settings = JSON.parse(result.json); if (settings.name !== undefined) document.title = settings.name; From d938377637c1e0a6bcf7b7679f9a84f0b3090b9d Mon Sep 17 00:00:00 2001 From: Tom <58078313+reed-tom@users.noreply.github.com> Date: Tue, 30 Apr 2024 13:05:34 -0400 Subject: [PATCH 08/14] removed unused imports --- src/sidebar/components/mymaps/MyMaps.jsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/sidebar/components/mymaps/MyMaps.jsx b/src/sidebar/components/mymaps/MyMaps.jsx index ac0aa92d..22b5ccc2 100644 --- a/src/sidebar/components/mymaps/MyMaps.jsx +++ b/src/sidebar/components/mymaps/MyMaps.jsx @@ -1,6 +1,5 @@ // REACT -import React, { Component, Fragment, useEffect } from "react"; -import { createRoot } from "react-dom/client"; +import React, { Component, Fragment } from "react"; import { CSSTransition, TransitionGroup } from "react-transition-group"; import { SubMenu, Item as MenuItem } from "rc-menu"; From f643d961c6e0faf473b2e0470ae93f87891eaa70 Mon Sep 17 00:00:00 2001 From: Tom <58078313+reed-tom@users.noreply.github.com> Date: Fri, 3 May 2024 10:42:50 -0400 Subject: [PATCH 09/14] fixed render bug in popup --- src/helpers/Popup.jsx | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/helpers/Popup.jsx b/src/helpers/Popup.jsx index 01e52b8b..cd33b24a 100644 --- a/src/helpers/Popup.jsx +++ b/src/helpers/Popup.jsx @@ -39,10 +39,10 @@ export default class Popup extends Overlay { } //options.stopEvent = false; - var element = document.createElement("div"); options.element = element; super(options); + this.root = null; this.container = element; this.container.className = "ol-popup"; this.container.id = "sc-window-popup"; @@ -91,7 +91,7 @@ export default class Popup extends Overlay { this.content.appendChild(this.contentArray[this.contentIndex].html); } else { // REACT COMPONENT - this.root.render(this.contentArray[this.contentIndex].html); + this.renderRoot(this.contentArray[this.contentIndex].html); } }); this.contentPrevButton.addEventListener("click", () => { @@ -117,7 +117,7 @@ export default class Popup extends Overlay { this.content.appendChild(this.contentArray[this.contentIndex].html); } else { // REACT COMPONENT - this.root.render(this.contentArray[this.contentIndex].html); + this.renderRoot(this.contentArray[this.contentIndex].html); } }); this.headerCloseContainer = document.createElement("div"); @@ -159,11 +159,9 @@ export default class Popup extends Overlay { this.content = document.createElement("div"); this.content.className = "ol-popup-content"; - this.uniqueId = `sc-popup-content-${helpers.getUID()}}`; + this.uniqueId = `sc-window-popup-content`; this.content.setAttribute("id", this.uniqueId); - this.root = createRoot(this.content); this.container.appendChild(this.content); - // Apply workaround to enable scrolling of content div on touch devices Popup.enableTouchScroll_(this.content); @@ -183,7 +181,21 @@ export default class Popup extends Overlay { window.popupActive = false; }; } - + renderRoot(child) { + if (isDOMTypeElement(child)) { + // REGULAR HTML + this.content.innerHTML = ""; + this.content.appendChild(child); + } else { + // REACT COMPONENT + if (this.root !== null) { + this.root.render(child); + } else { + this.root = createRoot(this.content); + this.root.render(child); + } + } + } /** * Show the popup. * @param {ol.Coordinate} coord Where to anchor the popup. @@ -231,7 +243,7 @@ export default class Popup extends Overlay { this.content.appendChild(html); } else { // REACT COMPONENT - this.root.render(html); + this.renderRoot(html); } this.container.style.display = "block"; From 5e26b7e6f4e8390764b5201694756b1a3af2606f Mon Sep 17 00:00:00 2001 From: Tom <58078313+reed-tom@users.noreply.github.com> Date: Fri, 3 May 2024 10:58:20 -0400 Subject: [PATCH 10/14] fixed styling issue on point sytle symbolizer popup --- src/map/OLOverrides.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/map/OLOverrides.css b/src/map/OLOverrides.css index da8a424a..184f4d93 100644 --- a/src/map/OLOverrides.css +++ b/src/map/OLOverrides.css @@ -62,7 +62,7 @@ z-index: 1; padding: 6px !important; background-color: #fff !important; - max-height: 275px !important; + max-height: 276px !important; min-height: 50px !important; overflow: hidden; overflow-y: auto; From 6f95a16cd7d4055d9e4f7ef6273f913f2c8afdd0 Mon Sep 17 00:00:00 2001 From: Tom <58078313+reed-tom@users.noreply.github.com> Date: Fri, 3 May 2024 11:24:00 -0400 Subject: [PATCH 11/14] fixed rerender issue with right click menu --- src/map/SCMap.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/map/SCMap.jsx b/src/map/SCMap.jsx index 550d4dfa..b806c99c 100644 --- a/src/map/SCMap.jsx +++ b/src/map/SCMap.jsx @@ -181,7 +181,7 @@ const SCMap = (props) => { const menu = ( - + Date: Fri, 3 May 2024 14:12:21 -0400 Subject: [PATCH 12/14] additional fixes for right click popup menu --- src/App.css | 6 ++++ src/helpers/FloatingMenu.jsx | 53 +++++++++++++++++++++--------------- src/map/SCMap.jsx | 2 +- 3 files changed, 38 insertions(+), 23 deletions(-) diff --git a/src/App.css b/src/App.css index ee014384..1b80fb7f 100644 --- a/src/App.css +++ b/src/App.css @@ -1,5 +1,11 @@ +body { + overflow: hidden; +} #root { /* width: 100%; height: 100%; position: absolute; */ } + +#portal-root { +} diff --git a/src/helpers/FloatingMenu.jsx b/src/helpers/FloatingMenu.jsx index ae4c123d..f3bee8a8 100644 --- a/src/helpers/FloatingMenu.jsx +++ b/src/helpers/FloatingMenu.jsx @@ -7,33 +7,37 @@ import { waitForLoad } from "./helpers"; // PROPER USE OF THIS COMPONENT IS TO USE A PORTAL. HAVE A LOOK AT MyMapsItem FOR AN EXAMPLE. const FloatingMenu = (props) => { - let { positionX, positionY } = props; - if (positionX === undefined) positionX = props.buttonEvent.pageX; - if (positionY === undefined) positionY = props.buttonEvent.pageY; + const positionXRef = useRef(props.positionX || props.buttonEvent.pageX); + const positionYRef = useRef(props.positionY || props.buttonEvent.pageY); const isMounted = useRef(false); const [isVisible, setIsVisible] = useState(true); const [style, setStyle] = useState({ position: "absolute", - zIndex: 10000, - top: positionY, - left: positionX, + zIndex: 0, + top: positionYRef.current, + left: positionXRef.current, backgroundColor: "white", width: "180px", }); const container = useRef(null); + useEffect(() => { + if (props.positionX !== undefined) positionXRef.current = props.positionX; + if (props.positionY !== undefined) positionYRef.current = props.positionY; + if (props.buttonEvent.pageX !== undefined) positionXRef.current = props.buttonEvent.pageX; + if (props.buttonEvent.pageY !== undefined) positionYRef.current = props.buttonEvent.pageY; + if (props.isVisible !== undefined) setIsVisible(props.isVisible); + }, [props.positionX, props.positionY, props.buttonEvent.pageX, props.buttonEvent.pageY, props.isVisible]); + useEffect(() => { isMounted.current = true; waitForLoad("settings", Date.now(), 30, () => { document.body.addEventListener("click", handleClickAway, true); }); - }, []); - useEffect( - () => () => { + return () => { isMounted.current = false; cleanup(); - }, - [] - ); + }; + }, []); useEffect(() => { if (isMounted.current === false) return; getStyle((newStyle) => { @@ -78,9 +82,13 @@ const FloatingMenu = (props) => { }; const getStyle = (callback) => { + if (!isVisible || !isMounted.current) { + callback({ display: "none" }); + return; + } let yOffset = 0; let xOffset = 0; - let style = null; + let styleLocal = null; window.requestAnimationFrame(() => { if (props.autoY) { if (container.current !== undefined && container.current !== null) { @@ -92,33 +100,34 @@ const FloatingMenu = (props) => { } if (props.styleMode === "right") { - xOffset = positionX; + xOffset = positionXRef.current; } else if (props.styleMode === "left") { - xOffset = positionX - 180; + xOffset = positionXRef.current - 180; } else if (props.autoX) { - if (positionX < 180) { - xOffset = positionX; + if (positionXRef.current < 180) { + xOffset = positionXRef.current; } else { - xOffset = positionX - 180; + xOffset = positionXRef.current - 180; } } else { - xOffset = positionX; + xOffset = positionXRef.current; } if (props.yOffset !== undefined) yOffset = props.yOffset; if (props.xOffset !== undefined) xOffset = props.xOffset; let width = props.width !== undefined ? props.width : "180px"; - style = { + styleLocal = { position: "absolute", zIndex: 1000, - top: positionY - yOffset, + top: positionYRef.current - yOffset, //left: this.state.styleMode === "right" ? this.props.buttonEvent.pageX : this.props.buttonEvent.pageX - 180, left: xOffset, backgroundColor: "white", width: width, }; - callback(style); + if (callback) callback(styleLocal); + else return styleLocal; }); }; diff --git a/src/map/SCMap.jsx b/src/map/SCMap.jsx index b806c99c..550d4dfa 100644 --- a/src/map/SCMap.jsx +++ b/src/map/SCMap.jsx @@ -181,7 +181,7 @@ const SCMap = (props) => { const menu = ( - + Date: Wed, 8 May 2024 09:56:13 -0400 Subject: [PATCH 13/14] removed unused toc components --- package-lock.json | 30 +-- package.json | 1 - src/sidebar/components/toc/TOC.jsx | 2 +- .../components/toc/toc-list-new/LayerItem.css | 144 -------------- .../components/toc/toc-list-new/LayerItem.jsx | 149 -------------- .../components/toc/toc-list-new/Layers.css | 24 --- .../components/toc/toc-list-new/Layers.jsx | 132 ------------- .../toc/toc-list-new/TOCListView.css | 26 --- .../toc/toc-list-new/TOCListView.jsx | 84 -------- .../toc/toc-list-view/LayerItem.css | 181 +++++++++--------- .../toc/toc-list-view/LayerItem.jsx | 26 ++- .../components/toc/toc-list-view/Layers.css | 29 ++- .../components/toc/toc-list-view/Layers.jsx | 179 +++++++++-------- .../toc/toc-list-view/TOCListView.css | 28 ++- .../toc/toc-list-view/TOCListView.jsx | 136 ++++++------- .../components/toc/toc-list-view/VTStyles.jsx | 75 -------- .../toc/toc-list-view/VirtualLayers.css | 3 - .../toc/toc-list-view/VirtualLayers.jsx | 101 ---------- 18 files changed, 311 insertions(+), 1039 deletions(-) delete mode 100644 src/sidebar/components/toc/toc-list-new/LayerItem.css delete mode 100644 src/sidebar/components/toc/toc-list-new/LayerItem.jsx delete mode 100644 src/sidebar/components/toc/toc-list-new/Layers.css delete mode 100644 src/sidebar/components/toc/toc-list-new/Layers.jsx delete mode 100644 src/sidebar/components/toc/toc-list-new/TOCListView.css delete mode 100644 src/sidebar/components/toc/toc-list-new/TOCListView.jsx delete mode 100644 src/sidebar/components/toc/toc-list-view/VTStyles.jsx delete mode 100644 src/sidebar/components/toc/toc-list-view/VirtualLayers.css delete mode 100644 src/sidebar/components/toc/toc-list-view/VirtualLayers.jsx diff --git a/package-lock.json b/package-lock.json index d8d8b9b6..9fe69f6f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,7 +42,6 @@ "react-scripts": "5.0.1", "react-select": "^5.7.4", "react-slick": "^0.29.0", - "react-sortable-hoc": "^2.0.0", "react-switch": "^7.0.0", "react-table": "^7.8.0", "react-table-sticky": "^1.1.3", @@ -7615,9 +7614,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/ejs": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", - "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dependencies": { "jake": "^10.8.5" }, @@ -9996,14 +9995,6 @@ "node": ">= 0.4" } }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, "node_modules/ipaddr.js": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", @@ -15838,21 +15829,6 @@ "react-dom": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/react-sortable-hoc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/react-sortable-hoc/-/react-sortable-hoc-2.0.0.tgz", - "integrity": "sha512-JZUw7hBsAHXK7PTyErJyI7SopSBFRcFHDjWW5SWjcugY0i6iH7f+eJkY8cJmGMlZ1C9xz1J3Vjz0plFpavVeRg==", - "dependencies": { - "@babel/runtime": "^7.2.0", - "invariant": "^2.2.4", - "prop-types": "^15.5.7" - }, - "peerDependencies": { - "prop-types": "^15.5.7", - "react": "^16.3.0 || ^17.0.0", - "react-dom": "^16.3.0 || ^17.0.0" - } - }, "node_modules/react-switch": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/react-switch/-/react-switch-7.0.0.tgz", diff --git a/package.json b/package.json index eceeef0c..465adcef 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,6 @@ "react-scripts": "5.0.1", "react-select": "^5.7.4", "react-slick": "^0.29.0", - "react-sortable-hoc": "^2.0.0", "react-switch": "^7.0.0", "react-table": "^7.8.0", "react-table-sticky": "^1.1.3", diff --git a/src/sidebar/components/toc/TOC.jsx b/src/sidebar/components/toc/TOC.jsx index 6d360e21..e6f2a61a 100644 --- a/src/sidebar/components/toc/TOC.jsx +++ b/src/sidebar/components/toc/TOC.jsx @@ -6,7 +6,7 @@ import { isMobile } from "react-device-detect"; import * as TOCHelpers from "./common/TOCHelpers.jsx"; import TOCHeader from "./common/TOCHeader.jsx"; import LayerOptionsMenu from "./common/LayerOptionsMenu.jsx"; -import TOCListView from "./toc-list-new/TOCListView.jsx"; +import TOCListView from "./toc-list-view/TOCListView.jsx"; import TOCFolderView from "./toc-folder-view/TOCFolderView.jsx"; import * as helpers from "../../../helpers/helpers"; import { LayerHelpers } from "../../../helpers/OLHelpers"; diff --git a/src/sidebar/components/toc/toc-list-new/LayerItem.css b/src/sidebar/components/toc/toc-list-new/LayerItem.css deleted file mode 100644 index da349c1b..00000000 --- a/src/sidebar/components/toc/toc-list-new/LayerItem.css +++ /dev/null @@ -1,144 +0,0 @@ -.sc-toc-item-container { - display: table; - -webkit-user-select: none; /* Chrome all / Safari all */ - -moz-user-select: none; /* Firefox all */ - -ms-user-select: none; /* IE 10+ */ - user-select: none; - margin-right: 2px; - margin-left: 2px; - font-family: Verdana, Arial, sans-serif !important; - font-size: 9pt; -} -.sc-toc-item-container.on { - font-weight: bold; -} - -.sc-toc-item-container.not-in-scale { - font-style: italic; -} - -.sc-toc-item-container.not-in-scale.on { - color: gray; -} - -.sc-toc-item-layer-label { - display: inline-table; - position: relative; - bottom: 2px; - max-width: 274px; -} - -.sc-toc-item-layer-info-live-layer { - display: inline-table; - vertical-align: middle; - margin-left: 5px; -} - -.sc-toc-item-layer-info-download { - display: inline-table; - vertical-align: middle; - margin-left: 5px; - margin-bottom: 2px; -} - -.sc-toc-item-layer-info-secured { - display: inline-table; - vertical-align: middle; - margin-left: 5px; - margin-bottom: 2px; -} - -.sc-toc-item-plus-minus-container { - display: inline-table; - vertical-align: middle; - cursor: pointer; - margin-right: 3px; -} - -.sc-toc-list-item-toolbox { - cursor: pointer; - display: table-cell; - float: right; - padding-right: 5px; - margin-top: -22px; -} - -.sc-toc-item-plus-minus-sign { - height: 5px; - width: 10px; - position: relative; - top: -11px; - right: -8px; - background: url(../images/horizontal_dots.png) 0px no-repeat; -} - -.sc-toc-item-layer-name { - display: inline-table; - margin-left: 5px; - width: 290px; - height: 20px; - cursor: default; - height: 100%; - word-break: break-all; - vertical-align: text-top; -} - -.sc-toc-item-layer-list-info-container-open-vertical-lines { - height: 22px; - width: 11px; - position: relative; - top: -11px; - right: -6px; - display: table-cell; - - background: url(../images/verticle_dots.png) 0px repeat-y; -} -.sc-toc-item-layer-list-info-container-open-horizontal-lines { - height: 5px; - width: 11px; - position: relative; - top: 15px; - right: 2px; - background: url(../images/horizontal_dots.png) 0px no-repeat; -} -.sc-toc-item-layer-info-container-open { - display: table; - height: auto; -} -.sc-toc-item-layer-info-container-closed { - display: none; -} - -.sc-toc-item-layer-info-legend { - padding-left: 16px; -} - -.sc-toc-item-checkbox { - display: inline-table; - margin-left: 5px; - margin-top: 0px; - transform: scale(1.1, 1.1); -} - -.sc-toc-layer-info-container { - display: table; -} - -/* Safari 10.1+ */ -/* Safari 10.1+ (alternate method) */ -@media not all and (min-resolution: 0.001dpcm) { - @supports (-webkit-appearance: none) { - .sc-toc-item-checkbox { - transform: scale(1, 1); - } - - .sc-toc-item-layer-label { - bottom: 0px; - } - - .sc-toc-item-plus-minus-container { - margin-top: 3px; - margin-right: 4px; - } - } -} diff --git a/src/sidebar/components/toc/toc-list-new/LayerItem.jsx b/src/sidebar/components/toc/toc-list-new/LayerItem.jsx deleted file mode 100644 index 8139cc6b..00000000 --- a/src/sidebar/components/toc/toc-list-new/LayerItem.jsx +++ /dev/null @@ -1,149 +0,0 @@ -import React, { Component } from "react"; -import * as helpers from "../../../../helpers/helpers"; -import Highlighter from "react-highlight-words"; -import LayerLegend from "../common/LayerLegend"; -import { acceptDisclaimer } from "../common/TOCHelpers.jsx"; -import { FaPaperclip } from "react-icons/fa"; -import { IoReorderThreeSharp } from "react-icons/io5"; - -import "./LayerItem.css"; -class LayerItem extends Component { - _isMounted = false; - constructor(props) { - super(props); - - this.state = {}; - - this.isVisibleAtScale = true; - } - - componentDidMount() { - this.setVisibleScale(); - - this._isMounted = true; - window.map.on("moveend", () => { - this.setVisibleScale(); - if (this._isMounted) this.forceUpdate(); - }); - } - - setVisibleScale = () => { - const { layerInfo } = this.props; - const mapResolution = window.map.getView().getResolution(); - let minScale = 0; - let maxScale = 100000000000; - if (layerInfo.minScale !== undefined) minScale = layerInfo.minScale; - if (layerInfo.maxScale !== undefined) maxScale = layerInfo.maxScale; - let minResolution = helpers.scaleToResolution(minScale); - let maxResolution = helpers.scaleToResolution(maxScale); - this.isVisibleAtScale = mapResolution >= minResolution && mapResolution <= maxResolution; - }; - - componentWillUnmount() { - this._isMounted = false; - } - - onCheckboxChange = (layer) => { - if (layer.disclaimer !== undefined) { - if ( - !acceptDisclaimer(layer, () => { - this.onCheckboxChange(layer); - }) - ) { - return; - } - } - layer.layer.setVisible(!layer.visible); - layer.visible = !layer.visible; - this.props.onLayerChange(layer, layer.group); - }; - - render() { - //console.log("List View Layer Item Render"); - const { layerInfo } = this.props; - let containerClassName = "sc-toc-item-container"; - if (!this.isVisibleAtScale) containerClassName += " not-in-scale"; - if (layerInfo.visible) containerClassName += " on"; - - return ( -
    -
    - - -
    this.props.onLegendToggle(layerInfo, this.props.group)}> - legend toggle -
    -
    -
    - - -
    - callout -
    -
    - -
    -
    - can download -
    -
    - secure -
    -
    - user added layer -
    -
    -
    this.props.onLayerOptionsClick(evt, layerInfo)}> - more options -
    -
    -
    -
    - -
    -
    - ); - } -} - -export default LayerItem; - -// IMPORT ALL IMAGES -const images = importAllImages(require.context("../images", false, /\.(png|jpe?g|svg|gif)$/)); -function importAllImages(r) { - let images = {}; - r.keys().map((item, index) => (images[item.replace("./", "")] = r(item))); - return images; -} diff --git a/src/sidebar/components/toc/toc-list-new/Layers.css b/src/sidebar/components/toc/toc-list-new/Layers.css deleted file mode 100644 index e6d61c28..00000000 --- a/src/sidebar/components/toc/toc-list-new/Layers.css +++ /dev/null @@ -1,24 +0,0 @@ -.sc-layers-slider { - padding-top: 5px !important; - padding-bottom: 5px !important; - padding-left: 5px !important; - padding-right: 5px !important; - font-size: 10pt; - width: 160px; - margin-left: 5px !important; -} - -#sc-toc-list-layers-sortablevirtuallist-virtual-layers { - list-style: none; - padding: 0; - margin: 0; -} - -.sc-toc-list-layers-sortablevirtuallist-virtual-layers-listitem { - min-height: 30px; - list-style: none; -} - -.sc-toc-list-layers-sortablevirtuallist-virtual-layers-listitem.sc-dragged { - z-index: 4 !important; /*override default z-index to show dragged item above sidebar*/ -} diff --git a/src/sidebar/components/toc/toc-list-new/Layers.jsx b/src/sidebar/components/toc/toc-list-new/Layers.jsx deleted file mode 100644 index f133fc3c..00000000 --- a/src/sidebar/components/toc/toc-list-new/Layers.jsx +++ /dev/null @@ -1,132 +0,0 @@ -// REACT -//https://medium.com/nerd-for-tech/simple-drag-and-drop-in-react-without-an-external-library-ebf1c1b809e -import React, { useState, useEffect, useRef } from "react"; -import * as helpers from "../../../../helpers/helpers"; -import { List, arrayMove } from "react-movable"; -import LayerItem from "./LayerItem.jsx"; -import "./Layers.css"; -// CUSTOM -import "./Layers.css"; -const Layers = (layersProps) => { - const storageKey = "Layers"; - const lastPositionRef = useRef(null); - const virtualId = "sc-toc-list-layers-sortablevirtuallist-virtual-layers"; - const [recalcId, setRecalcId] = useState(""); - const [layers, setLayers] = useState([]); - const [allLayers, setAllLayers] = useState([]); - - useEffect(() => { - // LISTEN FOR SEARCH RESULT - const activeTocLayerListener = (layerItem) => { - if (layersProps.visible) onActivateLayer(layerItem); - }; - window.emitter.addListener("activeTocLayer", activeTocLayerListener); - window.addEventListener("resize", updateRecalcId); - return () => { - window.emitter.removeListener("activeTocLayer", activeTocLayerListener); - window.removeEventListener("resize", updateRecalcId); - }; - }, []); - - useEffect(() => { - if (layersProps.group.layers && layersProps.group.layers.length > 0) { - setAllLayers(layersProps.group.layers); - setLayers( - layersProps.group.layers.filter((layer) => { - if (layersProps.searchText === "") return true; - else if (layer.tocDisplayName.toUpperCase().indexOf(layersProps.searchText.toUpperCase()) !== -1) return true; - else return false; - }) - ); - } - }, [layersProps.searchText, layersProps.group]); - - const updateRecalcId = () => { - if (!layersProps.visible) return; - try { - lastPositionRef.current = document.getElementById(virtualId).scrollTop; - } catch (e) { - return; - } - setRecalcId(helpers.getUID()); - setTimeout(() => { - document.getElementById(virtualId).scrollTop += lastPositionRef.current; - }, 10); - }; - - const onActivateLayer = (layerItem) => { - if (!layersProps.visible) return; - const elementId = layerItem.fullName + "_" + layerItem.layerGroup + "-container"; - - allLayers.forEach((layer) => { - if (layer.name === layerItem.fullName) { - document.getElementById(virtualId).scrollTop = 0; - - var i = 0; - var elemFound = false; - for (i = 1; i <= 100; i++) { - if (elemFound) return; - // eslint-disable-next-line - ((index) => { - setTimeout(() => { - if (elemFound) return; - - const elem = document.getElementById(elementId); - if (elem !== null) { - elemFound = true; - elem.scrollIntoView(); - return; - } else { - document.getElementById(virtualId).scrollTop += i * 5; - } - }, i * 100); - })(i); - } - } - }); - }; - - if (layersProps.group.layers === undefined) return
    ; - else - return ( -
    - { - if (layersProps.sortAlpha) return; - const oldIndexAllLayers = allLayers.indexOf(layers[oldIndex]); - const newIndexAllLayers = allLayers.indexOf(layers[newIndex]); - - setLayers(arrayMove(layers, oldIndex, newIndex)); - layersProps.onSortEnd({ oldIndex: oldIndexAllLayers, newIndex: newIndexAllLayers }); - }} - lockVertically={true} - beforeDrag={() => { - if (layersProps.sortAlpha) return; - }} - renderList={({ children, props }) => ( -
      - {children} -
    - )} - renderItem={({ value, props, isDragged, isSelected }) => ( -
  • - -
  • - )} - /> -
    - ); -}; - -export default Layers; diff --git a/src/sidebar/components/toc/toc-list-new/TOCListView.css b/src/sidebar/components/toc/toc-list-new/TOCListView.css deleted file mode 100644 index 8b428acf..00000000 --- a/src/sidebar/components/toc/toc-list-new/TOCListView.css +++ /dev/null @@ -1,26 +0,0 @@ -.sc-toc-main-container { - height: 40px; -} - -.sc-toc-layer-container { - max-width: 400px; - position: absolute; - top: 148px; - bottom: 0px; - width: 100%; - overflow-y: scroll; - margin-left: 0px; - user-select: all; -} - -.sc-toc-layer-container > ul { - list-style: none; - padding: 0; - margin: 0; - user-select: all; -} - -.sc-toc-footer-button.tools { - background-position-x: 6px; - width: 122px; -} diff --git a/src/sidebar/components/toc/toc-list-new/TOCListView.jsx b/src/sidebar/components/toc/toc-list-new/TOCListView.jsx deleted file mode 100644 index 87f75457..00000000 --- a/src/sidebar/components/toc/toc-list-new/TOCListView.jsx +++ /dev/null @@ -1,84 +0,0 @@ -// REACT -import React, { Component } from "react"; -import Select from "react-select"; - -// CUSTOM -import "./TOCListView.css"; -import * as helpers from "../../../../helpers/helpers"; - -import Layers from "./Layers.jsx"; - -class TOCListView extends Component { - constructor(props) { - super(props); - this.state = {}; - } - - shouldComponentUpdate(nextProps, nextState) { - return nextProps.visible || this.props.visible; - } - onGroupDropDownChange = (selectedGroup) => { - this.props.onGroupDropDownChange(selectedGroup, () => {}); - helpers.addAppStat("TOC Group", selectedGroup.label); - }; - - render() { - const groupsDropDownStyles = { - control: (provided) => ({ - ...provided, - minHeight: "30px", - }), - indicatorsContainer: (provided) => ({ - ...provided, - height: "30px", - }), - clearIndicator: (provided) => ({ - ...provided, - padding: "5px", - }), - dropdownIndicator: (provided) => ({ - ...provided, - padding: "5px", - }), - }; - - return ( -
    -
    -
    - this.onCheckboxChange(this.props.layerInfo)} checked={layerInfo.visible} /> +
    -
    this.props.onLayerOptionsClick(evt, layerInfo)}> +
    this.props.onLayerOptionsClick(evt, layerInfo)}> more options
    -
    -
    +
    +
    diff --git a/src/sidebar/components/toc/toc-list-view/Layers.css b/src/sidebar/components/toc/toc-list-view/Layers.css index cc2c38bb..e6d61c28 100644 --- a/src/sidebar/components/toc/toc-list-view/Layers.css +++ b/src/sidebar/components/toc/toc-list-view/Layers.css @@ -1,9 +1,24 @@ .sc-layers-slider { - padding-top: 5px !important; - padding-bottom: 5px !important; - padding-left: 5px !important; - padding-right: 5px !important; - font-size: 10pt; - width: 160px; - margin-left: 5px !important; + padding-top: 5px !important; + padding-bottom: 5px !important; + padding-left: 5px !important; + padding-right: 5px !important; + font-size: 10pt; + width: 160px; + margin-left: 5px !important; +} + +#sc-toc-list-layers-sortablevirtuallist-virtual-layers { + list-style: none; + padding: 0; + margin: 0; +} + +.sc-toc-list-layers-sortablevirtuallist-virtual-layers-listitem { + min-height: 30px; + list-style: none; +} + +.sc-toc-list-layers-sortablevirtuallist-virtual-layers-listitem.sc-dragged { + z-index: 4 !important; /*override default z-index to show dragged item above sidebar*/ } diff --git a/src/sidebar/components/toc/toc-list-view/Layers.jsx b/src/sidebar/components/toc/toc-list-view/Layers.jsx index a565432d..3e8804a4 100644 --- a/src/sidebar/components/toc/toc-list-view/Layers.jsx +++ b/src/sidebar/components/toc/toc-list-view/Layers.jsx @@ -1,62 +1,66 @@ // REACT -import React, { Component } from "react"; -import { SortableContainer } from "react-sortable-hoc"; -import { AutoSizer } from "react-virtualized"; -import VirtualLayers from "./VirtualLayers.jsx"; -import * as helpers from "../../../../helpers/helpers"; - +//https://medium.com/nerd-for-tech/simple-drag-and-drop-in-react-without-an-external-library-ebf1c1b809e +import React, { useState, useEffect, useRef } from "react"; +import * as helpers from "../../../../helpers/helpers.js"; +import { List, arrayMove } from "react-movable"; +import LayerItem from "./LayerItem.jsx"; +import "./Layers.css"; // CUSTOM import "./Layers.css"; - -const SortableVirtualList = SortableContainer(VirtualLayers, { withRef: true }); - -class Layers extends Component { - constructor(props) { - super(props); - this.storageKey = "Layers"; - this.lastPosition = null; - this.virtualId = "sc-toc-list-layers-sortablevirtuallist-virtual-layers"; - - //this.virtualId = "sc-toc-list-layers-virtual-layers"; - - this.state = { - //allLayers: {}, - //layers: [], - recalcId: "", - }; - +const Layers = (layersProps) => { + const storageKey = "Layers"; + const lastPositionRef = useRef(null); + const virtualId = "sc-toc-list-layers-sortablevirtuallist-virtual-layers"; + const [recalcId, setRecalcId] = useState(""); + const [layers, setLayers] = useState([]); + const [allLayers, setAllLayers] = useState([]); + + useEffect(() => { // LISTEN FOR SEARCH RESULT - window.emitter.addListener("activeTocLayer", (layerItem) => { - if (this.props.visible) this.onActivateLayer(layerItem); - }); - - window.addEventListener("resize", this.updateRecalcId); - } + const activeTocLayerListener = (layerItem) => { + if (layersProps.visible) onActivateLayer(layerItem); + }; + window.emitter.addListener("activeTocLayer", activeTocLayerListener); + window.addEventListener("resize", updateRecalcId); + return () => { + window.emitter.removeListener("activeTocLayer", activeTocLayerListener); + window.removeEventListener("resize", updateRecalcId); + }; + }, []); + + useEffect(() => { + if (layersProps.group.layers && layersProps.group.layers.length > 0) { + setAllLayers(layersProps.group.layers); + setLayers( + layersProps.group.layers.filter((layer) => { + if (layersProps.searchText === "") return true; + else if (layer.tocDisplayName.toUpperCase().indexOf(layersProps.searchText.toUpperCase()) !== -1) return true; + else return false; + }) + ); + } + }, [layersProps.searchText, layersProps.group]); - updateRecalcId = () => { - if (!this.props.visible) return; + const updateRecalcId = () => { + if (!layersProps.visible) return; try { - this.lastPosition = document.getElementById(this.virtualId).scrollTop; + lastPositionRef.current = document.getElementById(virtualId).scrollTop; } catch (e) { return; } - this.setState({ recalcId: helpers.getUID() }, () => { - setTimeout(() => { - document.getElementById(this.virtualId).scrollTop += this.lastPosition; - }, 10); - }); + setRecalcId(helpers.getUID()); + setTimeout(() => { + document.getElementById(virtualId).scrollTop += lastPositionRef.current; + }, 10); }; - onActivateLayer = (layerItem) => { - if (!this.props.visible) return; - const elementId = layerItem.fullName + "_" + layerItem.layerGroup + "_listview"; + const onActivateLayer = (layerItem) => { + if (!layersProps.visible) return; + const elementId = layerItem.fullName + "_" + layerItem.layerGroup + "-container"; - this.props.group.layers.forEach((layer) => { + allLayers.forEach((layer) => { if (layer.name === layerItem.fullName) { - //layer.visible = true; - //layer.layer.setVisible(true); - - document.getElementById(this.virtualId).scrollTop = 0; + document.getElementById(virtualId).scrollTop = 0; var i = 0; var elemFound = false; @@ -73,7 +77,7 @@ class Layers extends Component { elem.scrollIntoView(); return; } else { - document.getElementById(this.virtualId).scrollTop += i * 5; + document.getElementById(virtualId).scrollTop += i * 5; } }, i * 100); })(i); @@ -82,54 +86,47 @@ class Layers extends Component { }); }; - render() { - if (this.props.group.layers === undefined) return
    ; - - // FILTER LAYERS FROM SEARCH INPUT - // eslint-disable-next-line - const layers = this.props.group.layers.filter((layer) => { - if (this.props.searchText === "") return layer; - - if (layer.tocDisplayName.toUpperCase().indexOf(this.props.searchText.toUpperCase()) !== -1) return layer; - }); - + if (layersProps.group.layers === undefined) return
    ; + else return (
    - - {({ height }) => { - return ( - { - this.SortableVirtualList = instance; - }} - items={layers} - sortAlpha={this.props.sortAlpha} - onSortMove={this.props.onSortMove} - onSortEnd={this.props.onSortEnd} - helperClass={"sc-layer-list-sortable-helper"} - rowHeight={height} - height={height} - lockAxis={"y"} - distance={5} - group={this.props.group} - onLegendToggle={this.props.onLegendToggle} - onCheckboxChange={this.props.onCheckboxChange} - searchText={this.props.searchText} - onLayerOptionsClick={this.props.onLayerOptionsClick} - onLayerChange={this.props.onLayerChange} - scrollTop={this.props.id + "-sortablevirtuallist"} - - //scrollToIndex={50} - /> - ); + { + if (layersProps.sortAlpha) return; + const oldIndexAllLayers = allLayers.indexOf(layers[oldIndex]); + const newIndexAllLayers = allLayers.indexOf(layers[newIndex]); + + setLayers(arrayMove(layers, oldIndex, newIndex)); + layersProps.onSortEnd({ oldIndex: oldIndexAllLayers, newIndex: newIndexAllLayers }); }} - + lockVertically={true} + beforeDrag={() => { + if (layersProps.sortAlpha) return; + }} + renderList={({ children, props }) => ( +
      + {children} +
    + )} + renderItem={({ value, props, isDragged, isSelected }) => ( +
  • + +
  • + )} + />
    ); - } -} +}; export default Layers; diff --git a/src/sidebar/components/toc/toc-list-view/TOCListView.css b/src/sidebar/components/toc/toc-list-view/TOCListView.css index 325539a5..8b428acf 100644 --- a/src/sidebar/components/toc/toc-list-view/TOCListView.css +++ b/src/sidebar/components/toc/toc-list-view/TOCListView.css @@ -1,18 +1,26 @@ .sc-toc-main-container { - height: 40px; + height: 40px; } .sc-toc-layer-container { - max-width: 400px; - position: absolute; - top: 148px; - bottom: 0px; - width: 100%; - overflow: visible; - margin-left: 5px; + max-width: 400px; + position: absolute; + top: 148px; + bottom: 0px; + width: 100%; + overflow-y: scroll; + margin-left: 0px; + user-select: all; +} + +.sc-toc-layer-container > ul { + list-style: none; + padding: 0; + margin: 0; + user-select: all; } .sc-toc-footer-button.tools { - background-position-x: 6px; - width: 122px; + background-position-x: 6px; + width: 122px; } diff --git a/src/sidebar/components/toc/toc-list-view/TOCListView.jsx b/src/sidebar/components/toc/toc-list-view/TOCListView.jsx index b6151e60..62e021d2 100644 --- a/src/sidebar/components/toc/toc-list-view/TOCListView.jsx +++ b/src/sidebar/components/toc/toc-list-view/TOCListView.jsx @@ -4,81 +4,81 @@ import Select from "react-select"; // CUSTOM import "./TOCListView.css"; -import * as helpers from "../../../../helpers/helpers"; +import * as helpers from "../../../../helpers/helpers.js"; import Layers from "./Layers.jsx"; class TOCListView extends Component { - constructor(props) { - super(props); - this.state = {}; - } + constructor(props) { + super(props); + this.state = {}; + } - shouldComponentUpdate(nextProps, nextState) { - return nextProps.visible || this.props.visible; - } - onGroupDropDownChange = (selectedGroup) => { - this.props.onGroupDropDownChange(selectedGroup, () => {}); - helpers.addAppStat("TOC Group", selectedGroup.label); - }; + shouldComponentUpdate(nextProps, nextState) { + return nextProps.visible || this.props.visible; + } + onGroupDropDownChange = (selectedGroup) => { + this.props.onGroupDropDownChange(selectedGroup, () => {}); + helpers.addAppStat("TOC Group", selectedGroup.label); + }; - render() { - const groupsDropDownStyles = { - control: (provided) => ({ - ...provided, - minHeight: "30px", - }), - indicatorsContainer: (provided) => ({ - ...provided, - height: "30px", - }), - clearIndicator: (provided) => ({ - ...provided, - padding: "5px", - }), - dropdownIndicator: (provided) => ({ - ...provided, - padding: "5px", - }), - }; + render() { + const groupsDropDownStyles = { + control: (provided) => ({ + ...provided, + minHeight: "30px", + }), + indicatorsContainer: (provided) => ({ + ...provided, + height: "30px", + }), + clearIndicator: (provided) => ({ + ...provided, + padding: "5px", + }), + dropdownIndicator: (provided) => ({ + ...provided, + padding: "5px", + }), + }; - return ( -
    -
    -
    - +
    +
    +
    + { + // this.layerRef = ref; + // }} + group={this.props.selectedGroup} + searchText={this.props.searchText} + sortAlpha={this.props.sortAlpha} + visible={this.props.visible} + onLayerOptionsClick={this.props.onLayerOptionsClick} + onLegendToggle={this.props.onLegendToggle} + onLayerChange={this.props.onLayerChange} + onSortMove={this.props.onSortMove} + onSortEnd={this.props.onSortEnd} + /> +
    +
    + ); + } } export default TOCListView; diff --git a/src/sidebar/components/toc/toc-list-view/VTStyles.jsx b/src/sidebar/components/toc/toc-list-view/VTStyles.jsx deleted file mode 100644 index 7b865a46..00000000 --- a/src/sidebar/components/toc/toc-list-view/VTStyles.jsx +++ /dev/null @@ -1,75 +0,0 @@ -// THIS FILE CONTAINS STYLE FOR VECTOR TILES - -//import {Fill, Stroke, Style} from 'ol/style.js'; -import { Stroke, Style } from "ol/style.js"; -import * as helpers from "../../../../helpers/helpers"; - -const vtLayers = [ - { name: "simcoe:teranet_dapf", function: getTeranetDapf }, - { name: "simcoe:teranet_dapf_labels", function: getTeranetDapfLabels }, - { name: "simcoe:ssview_sc_2008contours2m", function: getContours }, -]; - -export function getVectorTileStyle(name, feature) { - const obj = helpers.searchArrayByKey(name, vtLayers); - if (obj === undefined) return null; - - return obj.function(feature); -} - -function getTeranetDapf(feature) { - // SCALE RANGE - if (helpers.getMapScale() > 20000) return undefined; - - return new Style({ - stroke: new Stroke({ - color: "#A9A8A6", - width: 1, - }), - }); -} - -function getTeranetDapfLabels(feature) { - // SCALE RANGE - if (helpers.getMapScale() > 20000) return undefined; - - let textStyle = helpers.createTextStyle( - feature, - "arn", - 18000, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - "#ffffff", - 3 - ); - //let textStyle = createTextStyle(feature, 'arn', 18000,undefined,undefined); - let text = feature.get("arn"); - text = text.substring(text.length - 8, text.length - 5) + "-" + text.substring(text.length - 5, text.length); - textStyle.setText(text); - return new Style({ - text: textStyle, - }); -} - -function getContours(feature) { - // SCALE RANGE - if (helpers.getMapScale() > 25000) return undefined; - - return new Style({ - stroke: new Stroke({ - color: "#ceb881", - width: 0.8, - }), - text: helpers.createTextStyle(feature, "label", 18000), - }); -} diff --git a/src/sidebar/components/toc/toc-list-view/VirtualLayers.css b/src/sidebar/components/toc/toc-list-view/VirtualLayers.css deleted file mode 100644 index 5ce066ae..00000000 --- a/src/sidebar/components/toc/toc-list-view/VirtualLayers.css +++ /dev/null @@ -1,3 +0,0 @@ -.sc-toc-layer-list-item { - list-style: none; -} diff --git a/src/sidebar/components/toc/toc-list-view/VirtualLayers.jsx b/src/sidebar/components/toc/toc-list-view/VirtualLayers.jsx deleted file mode 100644 index d5e98579..00000000 --- a/src/sidebar/components/toc/toc-list-view/VirtualLayers.jsx +++ /dev/null @@ -1,101 +0,0 @@ -// REACT -import React, { Component } from "react"; -import { SortableElement } from "react-sortable-hoc"; -import { List } from "react-virtualized"; - -// CUSTOM -import LayerItem from "./LayerItem.jsx"; -import "./VirtualLayers.css"; - -// LIST ITEM SORTABLE -const SortableItem = SortableElement(({ value, id, style, item, group, onLegendToggle, onCheckboxChange, onLayerChange, searchText, onLayerOptionsClick }) => { - item.elementId = id + "-element"; - - //console.log("Virtual Layer Item Render"); - return ( -
  • - -
  • - ); -}); - -class VirtualLayers extends Component { - _isMounted = false; - constructor(props) { - super(props); - - this.state = { - //msgIndex: 100 - }; - } - - componentDidMount() { - this._isMounted = true; - } - componentWillUnmount() { - this._isMounted = false; - } - componentDidUpdate() { - if (this._isMounted) { - this.list.recomputeRowHeights(); - } - } - renderRow = ({ index, key, style }) => { - const { items } = this.props; - const item = items[index]; - - return ( - - ); - }; - - render() { - const { items, height, id } = this.props; - const listId = id + "-virtual-layers"; - // MOBILE TWEEK - let mobileAdjustment = -1; - if (window.innerWidth <= 400) mobileAdjustment = 400 - window.innerWidth; - return ( - (this.list = ref)} - rowHeight={({ index }) => items[index].height} - rowRenderer={this.renderRow} - rowCount={items.length} - width={mobileAdjustment !== -1 ? 360 - mobileAdjustment : 360} - height={height} - style={{ outline: "none" }} - /> - ); - } -} - -export default VirtualLayers; From 04d0e0b1ad2be3a6fd1552758e4118b94c2d00d8 Mon Sep 17 00:00:00 2001 From: Tom <58078313+reed-tom@users.noreply.github.com> Date: Wed, 15 May 2024 14:57:27 -0400 Subject: [PATCH 14/14] various minor bug fixes --- package-lock.json | 1422 ++++++++--------- package.json | 4 +- src/components/sc-sidebar.jsx | 36 +- src/header/Search.jsx | 1 + src/helpers/InfoRow.jsx | 3 +- src/helpers/esriHelpers.js | 25 +- src/index.js | 12 - src/map/Identify.jsx | 2 +- .../components/mymaps/FeatureReportPopup.jsx | 3 - .../LocalRealEstateImageSlider.jsx | 2 +- .../components/toc/common/TOCHeader.jsx | 2 +- .../toc/toc-folder-view/GroupItem.jsx | 2 +- .../components/toc/toc-list-view/Layers.jsx | 23 +- 13 files changed, 757 insertions(+), 780 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9fe69f6f..e46e8f7a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "github-buttons": "^2.27.0", "html-to-image": "^1.11.11", "moment": "^2.29.4", - "ol": "^7.5.1", + "ol": "7.5.1", "ol-mapbox-style": "^11.0.3", "proj4": "^2.7.5", "rc-menu": "^9.11.1", @@ -45,7 +45,7 @@ "react-switch": "^7.0.0", "react-table": "^7.8.0", "react-table-sticky": "^1.1.3", - "react-tabs": "^4.3.0", + "react-tabs": "^6.0.2", "react-tooltip": "^5.20.0", "react-transition-group": "^4.4.5", "react-virtualized": "^9.22.5", @@ -58,14 +58,6 @@ "dotenv": "^16.4.5" } }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", @@ -105,33 +97,33 @@ } }, "node_modules/@azure/msal-browser": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.11.1.tgz", - "integrity": "sha512-tZFJnP5ZpgkmazSriEDW+Xl3/4WI823uhnYhWCHPkGywFWEZoPA5VkiCK8x4x8ECXp3mGr5qEI82MU43PBiaKA==", + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.14.0.tgz", + "integrity": "sha512-Un85LhOoecJ3HDTS3Uv3UWnXC9/43ZSO+Kc+anSqpZvcEt58SiO/3DuVCAe1A3I5UIBYJNMgTmZPGXQ0MVYrwA==", "dependencies": { - "@azure/msal-common": "14.8.1" + "@azure/msal-common": "14.10.0" }, "engines": { "node": ">=0.8.0" } }, "node_modules/@azure/msal-common": { - "version": "14.8.1", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.8.1.tgz", - "integrity": "sha512-9HfBMDTIgtFFkils+o6gO/aGEoLLuc4z+QLLfhy/T1bTNPiVsX/9CjaBPMZGnMltN/IlMkU5SGGNggGh55p5xA==", + "version": "14.10.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.10.0.tgz", + "integrity": "sha512-Zk6DPDz7e1wPgLoLgAp0349Yay9RvcjPM5We/ehuenDNsz/t9QEFI7tRoHpp/e47I4p20XE3FiDlhKwAo3utDA==", "engines": { "node": ">=0.8.0" } }, "node_modules/@azure/msal-react": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/@azure/msal-react/-/msal-react-2.0.14.tgz", - "integrity": "sha512-12FcC6e+JRrRI8JMX8KmFNd2s9e41YFDGwuYd9UWpg4AmE+ojBRdYrO0Vau6DuxFq0/+yM1Qa//VTXYV6z5l4g==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@azure/msal-react/-/msal-react-2.0.16.tgz", + "integrity": "sha512-fToFi/wG5e81Dir7Lw3/a2rZRRxvyD89ufI/GeVxcK3rblzJ6BT7fUoYnQsYTB6VR+z3MzRHpbJ3XgfESRk5ng==", "engines": { "node": ">=10" }, "peerDependencies": { - "@azure/msal-browser": "^3.11.1", + "@azure/msal-browser": "^3.14.0", "react": "^16.8.0 || ^17 || ^18" } }, @@ -148,28 +140,28 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.1.tgz", - "integrity": "sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", + "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.3.tgz", - "integrity": "sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", + "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.1", + "@babel/generator": "^7.24.5", "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.1", - "@babel/parser": "^7.24.1", + "@babel/helper-module-transforms": "^7.24.5", + "@babel/helpers": "^7.24.5", + "@babel/parser": "^7.24.5", "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -198,9 +190,9 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.1.tgz", - "integrity": "sha512-d5guuzMlPeDfZIbpQ8+g1NaCNuAGBBGNECh0HVqz1sjOeVLh2CEaifuOysCH18URW6R7pqXINvf5PaR/dC6jLQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.5.tgz", + "integrity": "sha512-gsUcqS/fPlgAw1kOtpss7uhY6E9SFFANQ6EFX5GTvzUwaV0+sGaZWk6xq22MOdeT9wfxyokW3ceCUvOiRtZciQ==", "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", @@ -211,7 +203,7 @@ }, "peerDependencies": { "@babel/core": "^7.11.0", - "eslint": "^7.5.0 || ^8.0.0" + "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" } }, "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": { @@ -231,11 +223,11 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz", - "integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", + "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", "dependencies": { - "@babel/types": "^7.24.0", + "@babel/types": "^7.24.5", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -290,18 +282,18 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.1.tgz", - "integrity": "sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.5.tgz", + "integrity": "sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.24.5", "@babel/helper-optimise-call-expression": "^7.22.5", "@babel/helper-replace-supers": "^7.24.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-split-export-declaration": "^7.24.5", "semver": "^6.3.1" }, "engines": { @@ -344,9 +336,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz", - "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-plugin-utils": "^7.22.5", @@ -390,11 +382,11 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.5.tgz", + "integrity": "sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==", "dependencies": { - "@babel/types": "^7.23.0" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -412,15 +404,15 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz", + "integrity": "sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-imports": "^7.24.3", + "@babel/helper-simple-access": "^7.24.5", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/helper-validator-identifier": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -441,9 +433,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz", + "integrity": "sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==", "engines": { "node": ">=6.9.0" } @@ -481,11 +473,11 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz", + "integrity": "sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -503,11 +495,11 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", + "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -522,9 +514,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", + "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", "engines": { "node": ">=6.9.0" } @@ -538,37 +530,37 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.5.tgz", + "integrity": "sha512-/xxzuNvgRl4/HLNKvnFwdhdgN3cpLxgLROeLDl83Yx0AJ1SGvq1ak0OszTOjDfiB8Vx03eJbeDWh9r+jCCWttw==", "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" + "@babel/helper-function-name": "^7.23.0", + "@babel/template": "^7.24.0", + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.1.tgz", - "integrity": "sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz", + "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==", "dependencies": { "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0" + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", - "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz", + "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.5", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" @@ -578,9 +570,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", - "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", + "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", "bin": { "parser": "bin/babel-parser.js" }, @@ -588,6 +580,21 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.5.tgz", + "integrity": "sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.24.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.24.1", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", @@ -1087,11 +1094,11 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.1.tgz", - "integrity": "sha512-h71T2QQvDgM2SmT29UYU6ozjMlAt7s7CSs5Hvy8f8cf/GM/Z4a2zMfN+fjVGaieeCrXR3EdQl6C4gQG+OgmbKw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.5.tgz", + "integrity": "sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1116,11 +1123,11 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.1.tgz", - "integrity": "sha512-FUHlKCn6J3ERiu8Dv+4eoz7w8+kFLSyeVG4vDAikwADGjUCoHw/JHokyGtr8OR4UjpwPVivyF+h8Q5iv/JmrtA==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz", + "integrity": "sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-create-class-features-plugin": "^7.24.4", "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, @@ -1132,17 +1139,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", - "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.5.tgz", + "integrity": "sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-split-export-declaration": "^7.24.5", "globals": "^11.1.0" }, "engines": { @@ -1168,11 +1175,11 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", - "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.5.tgz", + "integrity": "sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1482,14 +1489,14 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz", - "integrity": "sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.5.tgz", + "integrity": "sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA==", "dependencies": { "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.1" + "@babel/plugin-transform-parameters": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1529,11 +1536,11 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz", - "integrity": "sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.5.tgz", + "integrity": "sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, @@ -1545,11 +1552,11 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", - "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.5.tgz", + "integrity": "sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1574,13 +1581,13 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz", - "integrity": "sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.5.tgz", + "integrity": "sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-create-class-features-plugin": "^7.24.5", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1793,11 +1800,11 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz", - "integrity": "sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.5.tgz", + "integrity": "sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1807,13 +1814,13 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.1.tgz", - "integrity": "sha512-liYSESjX2fZ7JyBFkYG78nfvHlMKE6IpNdTVnxmlYUR+j5ZLsitFbaAE+eJSK2zPPkNWNw4mXL51rQ8WrvdK0w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.5.tgz", + "integrity": "sha512-E0VWu/hk83BIFUWnsKZ4D81KXjN5L3MobvevOHErASk9IPwKHOkTgvqzvNo1yP/ePJWqqK2SpUR5z+KQbl6NVw==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-create-class-features-plugin": "^7.24.5", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/plugin-syntax-typescript": "^7.24.1" }, "engines": { @@ -1883,14 +1890,15 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.3.tgz", - "integrity": "sha512-fSk430k5c2ff8536JcPvPWK4tZDwehWLGlBp0wrsBUjZVdeQV6lePbwKWZaZfK2vnh/1kQX1PzAJWsnBmVgGJA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.5.tgz", + "integrity": "sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ==", "dependencies": { - "@babel/compat-data": "^7.24.1", + "@babel/compat-data": "^7.24.4", "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.5", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", @@ -1917,12 +1925,12 @@ "@babel/plugin-transform-async-generator-functions": "^7.24.3", "@babel/plugin-transform-async-to-generator": "^7.24.1", "@babel/plugin-transform-block-scoped-functions": "^7.24.1", - "@babel/plugin-transform-block-scoping": "^7.24.1", + "@babel/plugin-transform-block-scoping": "^7.24.5", "@babel/plugin-transform-class-properties": "^7.24.1", - "@babel/plugin-transform-class-static-block": "^7.24.1", - "@babel/plugin-transform-classes": "^7.24.1", + "@babel/plugin-transform-class-static-block": "^7.24.4", + "@babel/plugin-transform-classes": "^7.24.5", "@babel/plugin-transform-computed-properties": "^7.24.1", - "@babel/plugin-transform-destructuring": "^7.24.1", + "@babel/plugin-transform-destructuring": "^7.24.5", "@babel/plugin-transform-dotall-regex": "^7.24.1", "@babel/plugin-transform-duplicate-keys": "^7.24.1", "@babel/plugin-transform-dynamic-import": "^7.24.1", @@ -1942,13 +1950,13 @@ "@babel/plugin-transform-new-target": "^7.24.1", "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", "@babel/plugin-transform-numeric-separator": "^7.24.1", - "@babel/plugin-transform-object-rest-spread": "^7.24.1", + "@babel/plugin-transform-object-rest-spread": "^7.24.5", "@babel/plugin-transform-object-super": "^7.24.1", "@babel/plugin-transform-optional-catch-binding": "^7.24.1", - "@babel/plugin-transform-optional-chaining": "^7.24.1", - "@babel/plugin-transform-parameters": "^7.24.1", + "@babel/plugin-transform-optional-chaining": "^7.24.5", + "@babel/plugin-transform-parameters": "^7.24.5", "@babel/plugin-transform-private-methods": "^7.24.1", - "@babel/plugin-transform-private-property-in-object": "^7.24.1", + "@babel/plugin-transform-private-property-in-object": "^7.24.5", "@babel/plugin-transform-property-literals": "^7.24.1", "@babel/plugin-transform-regenerator": "^7.24.1", "@babel/plugin-transform-reserved-words": "^7.24.1", @@ -1956,7 +1964,7 @@ "@babel/plugin-transform-spread": "^7.24.1", "@babel/plugin-transform-sticky-regex": "^7.24.1", "@babel/plugin-transform-template-literals": "^7.24.1", - "@babel/plugin-transform-typeof-symbol": "^7.24.1", + "@babel/plugin-transform-typeof-symbol": "^7.24.5", "@babel/plugin-transform-unicode-escapes": "^7.24.1", "@babel/plugin-transform-unicode-property-regex": "^7.24.1", "@babel/plugin-transform-unicode-regex": "^7.24.1", @@ -2039,9 +2047,9 @@ "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" }, "node_modules/@babel/runtime": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.1.tgz", - "integrity": "sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz", + "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -2063,18 +2071,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", - "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", + "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", "dependencies": { - "@babel/code-frame": "^7.24.1", - "@babel/generator": "^7.24.1", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.1", - "@babel/types": "^7.24.0", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/parser": "^7.24.5", + "@babel/types": "^7.24.5", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2083,12 +2091,12 @@ } }, "node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", + "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.1", + "@babel/helper-validator-identifier": "^7.24.5", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2461,9 +2469,9 @@ } }, "node_modules/@emotion/serialize": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.3.tgz", - "integrity": "sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.4.tgz", + "integrity": "sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==", "dependencies": { "@emotion/hash": "^0.9.1", "@emotion/memoize": "^0.8.1", @@ -2478,14 +2486,14 @@ "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" }, "node_modules/@emotion/styled": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz", - "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==", + "version": "11.11.5", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.5.tgz", + "integrity": "sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==", "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.11.0", - "@emotion/is-prop-valid": "^1.2.1", - "@emotion/serialize": "^1.1.2", + "@emotion/is-prop-valid": "^1.2.2", + "@emotion/serialize": "^1.1.4", "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", "@emotion/utils": "^1.2.1" }, @@ -2634,12 +2642,12 @@ "integrity": "sha512-wHQYWFtDa6c328EraXEVZvgOiaQyYr0yuaaZ0G3cB4C3lSkWefW34L/e5TLAhtuG3zJ/wR6pl5X1YYNfBc0/4Q==" }, "node_modules/@esri/calcite-components": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@esri/calcite-components/-/calcite-components-2.7.0.tgz", - "integrity": "sha512-iSh7KKMEXnINmO/mqGWZ0danMaQdssIGRpH0jxd4PtK7g5bEfNsagalRYl1rfh3pf3bVT5AWoqrS3eZXO4+RbA==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/@esri/calcite-components/-/calcite-components-2.8.2.tgz", + "integrity": "sha512-eQvYWQVcT5+Wpm0xECnyw1oCSg36E6y0i5qBn7PjwrOtEbYQwlLqOmSzEk0JLbZxRvjJjegtqZhn5H75rnngIQ==", "dependencies": { "@floating-ui/dom": "1.6.3", - "@stencil/core": "4.9.0", + "@stencil/core": "4.17.1", "@types/color": "3.0.6", "color": "4.2.3", "composed-offset-position": "0.0.4", @@ -2647,7 +2655,8 @@ "focus-trap": "7.5.4", "lodash-es": "4.17.21", "sortablejs": "1.15.1", - "timezone-groups": "0.8.0" + "timezone-groups": "0.8.0", + "type-fest": "4.18.2" } }, "node_modules/@esri/calcite-components/node_modules/sortablejs": { @@ -2656,11 +2665,11 @@ "integrity": "sha512-P5Cjvb0UG1ZVNiDPj/n4V+DinttXG6K8n7vM/HQf0C25K3YKQTQY6fsr/sEGsJGpQ9exmPxluHxKBc0mLKU1lQ==" }, "node_modules/@floating-ui/core": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", - "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.2.tgz", + "integrity": "sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==", "dependencies": { - "@floating-ui/utils": "^0.2.1" + "@floating-ui/utils": "^0.2.0" } }, "node_modules/@floating-ui/dom": { @@ -2673,11 +2682,11 @@ } }, "node_modules/@floating-ui/react-dom": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz", - "integrity": "sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.9.tgz", + "integrity": "sha512-q0umO0+LQK4+p6aGyvzASqKbKOJcAHJ7ycE9CuUvfx3s9zTHWmGJTPOIlM/hmSBfUfg/XfY5YhLBLR/LHwShQQ==", "dependencies": { - "@floating-ui/dom": "^1.6.1" + "@floating-ui/dom": "^1.0.0" }, "peerDependencies": { "react": ">=16.8.0", @@ -2685,9 +2694,9 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", - "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz", + "integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==" }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", @@ -2715,9 +2724,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==" }, "node_modules/@icons/material": { "version": "0.2.4", @@ -2834,54 +2843,6 @@ "node": ">=6" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -3543,23 +3504,23 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.15.14", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.14.tgz", - "integrity": "sha512-on75VMd0XqZfaQW+9pGjSNiqW+ghc5E2ZSLRBXwcXl/C4YzjfyjrLPhrEpKnR9Uym9KXBvxrhoHfPcczYHweyA==", + "version": "5.15.17", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.17.tgz", + "integrity": "sha512-DVAejDQkjNnIac7MfP8sLzuo7fyrBPxNdXe+6bYqOqg1z2OPTlfFAejSNzWe7UenRMuFu9/AyFXj/X2vN2w6dA==", "funding": { "type": "opencollective", "url": "https://opencollective.com/mui-org" } }, "node_modules/@mui/material": { - "version": "5.15.14", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.14.tgz", - "integrity": "sha512-kEbRw6fASdQ1SQ7LVdWR5OlWV3y7Y54ZxkLzd6LV5tmz+NpO3MJKZXSfgR0LHMP7meKsPiMm4AuzV0pXDpk/BQ==", + "version": "5.15.17", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.17.tgz", + "integrity": "sha512-ru/MLvTkCh0AZXmqwIpqGTOoVBS/sX48zArXq/DvktxXZx4fskiRA2PEc7Rk5ZlFiZhKh4moL4an+l8zZwq49Q==", "dependencies": { "@babel/runtime": "^7.23.9", "@mui/base": "5.0.0-beta.40", - "@mui/core-downloads-tracker": "^5.15.14", - "@mui/system": "^5.15.14", + "@mui/core-downloads-tracker": "^5.15.17", + "@mui/system": "^5.15.15", "@mui/types": "^7.2.14", "@mui/utils": "^5.15.14", "@types/react-transition-group": "^4.4.10", @@ -3653,9 +3614,9 @@ } }, "node_modules/@mui/system": { - "version": "5.15.14", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.14.tgz", - "integrity": "sha512-auXLXzUaCSSOLqJXmsAaq7P96VPRXg2Rrz6OHNV7lr+kB8lobUF+/N84Vd9C4G/wvCXYPs5TYuuGBRhcGbiBGg==", + "version": "5.15.15", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.15.tgz", + "integrity": "sha512-aulox6N1dnu5PABsfxVGOZffDVmlxPOVgj56HrUnJE8MCSh8lOvvkd47cebIVQQYAjpwieXQXiDPj5pwM40jTQ==", "dependencies": { "@babel/runtime": "^7.23.9", "@mui/private-theming": "^5.15.14", @@ -3797,9 +3758,9 @@ "integrity": "sha512-Sj7gKl1TLcDbF7B6KUhtvr+1UCxdhMbNY5KxdU5IfMFWqL8oy1ZeAcCANjoB1TL0AJTcPmcCFsCbHf8X2jGDUA==" }, "node_modules/@petamoriken/float16": { - "version": "3.8.6", - "resolved": "https://registry.npmjs.org/@petamoriken/float16/-/float16-3.8.6.tgz", - "integrity": "sha512-GNJhABTtcmt9al/nqdJPycwFD46ww2+q2zwZzTjY0dFFwUAFRw9zszvEr9osyJRd9krRGy6hUDopWUg9fX7VVw==" + "version": "3.8.7", + "resolved": "https://registry.npmjs.org/@petamoriken/float16/-/float16-3.8.7.tgz", + "integrity": "sha512-/Ri4xDDpe12NT6Ex/DRgHzLlobiQXEW/hmG08w1wj/YU7hLemk97c+zHQFp0iZQ9r7YqgLEXZR2sls4HxBf9NA==" }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", @@ -3811,15 +3772,13 @@ } }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.5.11", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz", - "integrity": "sha512-7j/6vdTym0+qZ6u4XbSAxrWBGYSdCfTzySkj7WAFgDLmSyWlOrWvpyzxlFh5jtw9dn0oL/jtW+06XfFiisN3JQ==", + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.13.tgz", + "integrity": "sha512-odZVYXly+JwzYri9rKqqUAk0cY6zLpv4dxoKinhoJNShV36Gpxf+CyDIILJ4tYsJ1ZxIWs233Y39iVnynvDA/g==", "dependencies": { "ansi-html-community": "^0.0.8", - "common-path-prefix": "^3.0.0", "core-js-pure": "^3.23.3", "error-stack-parser": "^2.0.6", - "find-up": "^5.0.0", "html-entities": "^2.1.0", "loader-utils": "^2.0.4", "schema-utils": "^3.0.0", @@ -3834,7 +3793,7 @@ "sockjs-client": "^1.4.0", "type-fest": ">=0.17.0 <5.0.0", "webpack": ">=4.43.0 <6.0.0", - "webpack-dev-server": "3.x || 4.x", + "webpack-dev-server": "3.x || 4.x || 5.x", "webpack-hot-middleware": "2.x", "webpack-plugin-serve": "0.x || 1.x" }, @@ -3922,9 +3881,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.3.tgz", - "integrity": "sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==", + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.16.1.tgz", + "integrity": "sha512-es2g3dq6Nb07iFxGk5GuHN20RwBZOsuDQN7izWIisUcv9r+d2C5jQxqmgkdebXgReWfiyUabcki6Fg77mSNrig==", "engines": { "node": ">=14.0.0" } @@ -4004,9 +3963,9 @@ "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" }, "node_modules/@rushstack/eslint-patch": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.9.0.tgz", - "integrity": "sha512-AAWymnpvHbGty1BmgbdfbqQDboXs6xN6h2yAacO4yKVyyUUBnpYkp+P9jjPrV9zrAGw7JVVriRtGOHPInnfjZQ==" + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.2.tgz", + "integrity": "sha512-hw437iINopmQuxWPSUEvqE56NCPsiU8N4AYtfHmJFckclktzK9YQJieD3XkDCDH4OjL+C7zgPUh73R/nrcHrqw==" }, "node_modules/@sinclair/typebox": { "version": "0.24.51", @@ -4030,9 +3989,9 @@ } }, "node_modules/@stencil/core": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.9.0.tgz", - "integrity": "sha512-aWSkhBmk3yPwRAkUwBbzRwmdhb8hKiQ/JMr9m5jthpBZLjtppYbzz6PN2MhSMDfRp6K93eQw5WogSEH4HHuB6w==", + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.17.1.tgz", + "integrity": "sha512-nlARe1QtK5abnCG8kPQKJMWiELg39vKabvf3ebm6YEhQA35CgrxC1pVYTsYq3yktJKoY+k+VzGRnATLKyaLbvA==", "bin": { "stencil": "bin/stencil" }, @@ -4346,9 +4305,9 @@ } }, "node_modules/@types/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-87W6MJCKZYDhLAx/J1ikW8niMvmGRyY+rpUxWpL1cO7F8Uu5CHuQoFv+R0/L5pgNdW4jTyda42kv60uwVIPjLw==" + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-hulKeREDdLFesGQjl96+4aoJSHY5b2GRjagzzcqCfIrWhe5vkCqIvrLbqzBaI1q94Vg8DNJZZqTR5ocdWmWclg==" }, "node_modules/@types/connect": { "version": "3.4.38", @@ -4368,9 +4327,9 @@ } }, "node_modules/@types/eslint": { - "version": "8.56.6", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.6.tgz", - "integrity": "sha512-ymwc+qb1XkjT/gfoQwxIeHZ6ixH23A+tCT2ADSA/DPVKzAjwYkTXBMCQ/f6fe4wEa85Lhp26VPeUxI7wMhAi7A==", + "version": "8.56.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", + "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -4402,9 +4361,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.43", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz", - "integrity": "sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.0.tgz", + "integrity": "sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -4475,9 +4434,9 @@ "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" }, "node_modules/@types/node": { - "version": "20.11.30", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz", - "integrity": "sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==", + "version": "20.12.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", + "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", "dependencies": { "undici-types": "~5.26.4" } @@ -4511,9 +4470,9 @@ "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==" }, "node_modules/@types/qs": { - "version": "6.9.14", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.14.tgz", - "integrity": "sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==" + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==" }, "node_modules/@types/range-parser": { "version": "1.2.7", @@ -4521,9 +4480,9 @@ "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" }, "node_modules/@types/react": { - "version": "18.2.73", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.73.tgz", - "integrity": "sha512-XcGdod0Jjv84HOC7N5ziY3x+qL0AfmubvKOZ9hJjJ2yd5EE+KYjWhdOjt387e9HPheHkdggF9atTifMRtyAaRA==", + "version": "18.3.2", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.2.tgz", + "integrity": "sha512-Btgg89dAnqD4vV7R3hlwOxgqobUQKgx3MmrQRi0yYbs/P0ym8XozIAlkqVilPqHQwXs4e9Tf63rrCgl58BcO4w==", "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -4573,13 +4532,13 @@ } }, "node_modules/@types/serve-static": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", - "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "dependencies": { "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" + "@types/node": "*", + "@types/send": "*" } }, "node_modules/@types/sockjs": { @@ -4845,36 +4804,36 @@ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" }, "node_modules/@vaadin/a11y-base": { - "version": "24.3.10", - "resolved": "https://registry.npmjs.org/@vaadin/a11y-base/-/a11y-base-24.3.10.tgz", - "integrity": "sha512-vtCsgNmqNCuBTeRv8AC6sa3S4Rh9gnMmgJ0UiaHEqbDHkMfuEYh2e7HuGkEXnnIwIPXh6JqeFl6IVDEF1P59VA==", + "version": "24.3.13", + "resolved": "https://registry.npmjs.org/@vaadin/a11y-base/-/a11y-base-24.3.13.tgz", + "integrity": "sha512-7iEbJiJM/+YIC/D7HzQUuU3OX27MhcNoX8k3mWLBQu8SCVGDerCZUlHCHfeFpbJc76aWDNUrvEhAzBVrM/mn+A==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.3.10", + "@vaadin/component-base": "~24.3.13", "lit": "^3.0.0" } }, "node_modules/@vaadin/checkbox": { - "version": "24.3.10", - "resolved": "https://registry.npmjs.org/@vaadin/checkbox/-/checkbox-24.3.10.tgz", - "integrity": "sha512-ULfsYiv+buhyMeWnS5VOB70nbnRlM8smXDMIkO1dRHo9xyPdSAjdMfLJRhXT1CUDEvyGBl9ro9XdEAZaLzHgkA==", + "version": "24.3.13", + "resolved": "https://registry.npmjs.org/@vaadin/checkbox/-/checkbox-24.3.13.tgz", + "integrity": "sha512-YT67/M31Dq7UKwtZ+hEUjOrVHnje+7wpf4aBYAeKoEqa57uw2Q9+lGTwoWgviVzXKtXhoQd/oLiNUaxeOVcNzA==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.3.10", - "@vaadin/component-base": "~24.3.10", - "@vaadin/field-base": "~24.3.10", - "@vaadin/vaadin-lumo-styles": "~24.3.10", - "@vaadin/vaadin-material-styles": "~24.3.10", - "@vaadin/vaadin-themable-mixin": "~24.3.10", + "@vaadin/a11y-base": "~24.3.13", + "@vaadin/component-base": "~24.3.13", + "@vaadin/field-base": "~24.3.13", + "@vaadin/vaadin-lumo-styles": "~24.3.13", + "@vaadin/vaadin-material-styles": "~24.3.13", + "@vaadin/vaadin-themable-mixin": "~24.3.13", "lit": "^3.0.0" } }, "node_modules/@vaadin/component-base": { - "version": "24.3.10", - "resolved": "https://registry.npmjs.org/@vaadin/component-base/-/component-base-24.3.10.tgz", - "integrity": "sha512-3kJA4tOYUibjarupwQO9Xny6P9lYhhYNQg5RJbc1STSZyY0mI36xSOoeA37lpJXda8w/vKAqkJl+Gce5pgI48A==", + "version": "24.3.13", + "resolved": "https://registry.npmjs.org/@vaadin/component-base/-/component-base-24.3.13.tgz", + "integrity": "sha512-UjokKlcs3NVnUATmv03Av55dZGCqvRXEaY2N1PO0C5OYATNekF5wlnz2nQ1+j1Tvk9eI+bzZKN28Yu0S3kvl0A==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", @@ -4884,115 +4843,115 @@ } }, "node_modules/@vaadin/field-base": { - "version": "24.3.10", - "resolved": "https://registry.npmjs.org/@vaadin/field-base/-/field-base-24.3.10.tgz", - "integrity": "sha512-t6PH6nlGhjNoA4SRXE52/VjODeM6yBzXctXAF2uur4kRCAc32fd7AaOq9tH2PIbXhpM4mcshTrqQ9v0yWMNlYQ==", + "version": "24.3.13", + "resolved": "https://registry.npmjs.org/@vaadin/field-base/-/field-base-24.3.13.tgz", + "integrity": "sha512-Qc2OUaBDGbskBnnSlDNhQd682tL8QlpqFfoS9lrZhRV286OlkfEiQ06kMZc75Q9fIeVIz3S2BPhtdoxd/8Tc4w==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.3.10", - "@vaadin/component-base": "~24.3.10", + "@vaadin/a11y-base": "~24.3.13", + "@vaadin/component-base": "~24.3.13", "lit": "^3.0.0" } }, "node_modules/@vaadin/grid": { - "version": "24.3.10", - "resolved": "https://registry.npmjs.org/@vaadin/grid/-/grid-24.3.10.tgz", - "integrity": "sha512-abdW7CDAXiZfhv6XwwLCXny8tnkeL3JxjIciADlInvzvKvDCQN4/1KjR+paU/bBJxjT+oMswXWlIpB/LCGDGrQ==", + "version": "24.3.13", + "resolved": "https://registry.npmjs.org/@vaadin/grid/-/grid-24.3.13.tgz", + "integrity": "sha512-oRNP9V6d7khFlB49wDfPfHG1fHFImc9dagX9Tlatpo3j1TLJ9JlfkrdWsuYY1aYtYnx5huvH3iOAV93fV1CFFg==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.3.10", - "@vaadin/checkbox": "~24.3.10", - "@vaadin/component-base": "~24.3.10", - "@vaadin/lit-renderer": "~24.3.10", - "@vaadin/text-field": "~24.3.10", - "@vaadin/vaadin-lumo-styles": "~24.3.10", - "@vaadin/vaadin-material-styles": "~24.3.10", - "@vaadin/vaadin-themable-mixin": "~24.3.10" + "@vaadin/a11y-base": "~24.3.13", + "@vaadin/checkbox": "~24.3.13", + "@vaadin/component-base": "~24.3.13", + "@vaadin/lit-renderer": "~24.3.13", + "@vaadin/text-field": "~24.3.13", + "@vaadin/vaadin-lumo-styles": "~24.3.13", + "@vaadin/vaadin-material-styles": "~24.3.13", + "@vaadin/vaadin-themable-mixin": "~24.3.13" } }, "node_modules/@vaadin/icon": { - "version": "24.3.10", - "resolved": "https://registry.npmjs.org/@vaadin/icon/-/icon-24.3.10.tgz", - "integrity": "sha512-qVpghNytnu8AZ9TOzG+s8nznNU1RVR+XtM88EJxIa8tV3itMaSJs3Rl3uMp6Nh5v9utm5wKFuA1q2n6kReJhrg==", + "version": "24.3.13", + "resolved": "https://registry.npmjs.org/@vaadin/icon/-/icon-24.3.13.tgz", + "integrity": "sha512-uH28N3fYJO6FObz+WLNfqHLm2VPbL1hNkmoU/yDiMldfIyTqpbSO2DlwNMXbsm3T8xkJRlHM+LWATheMsIynOw==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.3.10", - "@vaadin/vaadin-lumo-styles": "~24.3.10", - "@vaadin/vaadin-themable-mixin": "~24.3.10", + "@vaadin/component-base": "~24.3.13", + "@vaadin/vaadin-lumo-styles": "~24.3.13", + "@vaadin/vaadin-themable-mixin": "~24.3.13", "lit": "^3.0.0" } }, "node_modules/@vaadin/input-container": { - "version": "24.3.10", - "resolved": "https://registry.npmjs.org/@vaadin/input-container/-/input-container-24.3.10.tgz", - "integrity": "sha512-Y9eyPdgQFHFL2c9KKhnMQtD+axMjMGDGc7NupX1jabrwkIHtZBDmhmvJN0FC1WZillj9Nergt56TI4FXKAIX+w==", + "version": "24.3.13", + "resolved": "https://registry.npmjs.org/@vaadin/input-container/-/input-container-24.3.13.tgz", + "integrity": "sha512-Rg77JYKwxMdnTqxTIQWkaiNCZGiI4sIP3V6sxYJxqn0v1Nwwy80OQ5nzGQj+KyNk4B6SajmAwgHbu+IcFthN1A==", "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.3.10", - "@vaadin/vaadin-lumo-styles": "~24.3.10", - "@vaadin/vaadin-material-styles": "~24.3.10", - "@vaadin/vaadin-themable-mixin": "~24.3.10", + "@vaadin/component-base": "~24.3.13", + "@vaadin/vaadin-lumo-styles": "~24.3.13", + "@vaadin/vaadin-material-styles": "~24.3.13", + "@vaadin/vaadin-themable-mixin": "~24.3.13", "lit": "^3.0.0" } }, "node_modules/@vaadin/lit-renderer": { - "version": "24.3.10", - "resolved": "https://registry.npmjs.org/@vaadin/lit-renderer/-/lit-renderer-24.3.10.tgz", - "integrity": "sha512-p71fErjux/VwQVeBlk4VU1InSZk+WgRmsQPtQAwZ4evu9VRNxL/iPBGaXIuxCtKwJXGGx4WnabEWLJyCHpTloQ==", + "version": "24.3.13", + "resolved": "https://registry.npmjs.org/@vaadin/lit-renderer/-/lit-renderer-24.3.13.tgz", + "integrity": "sha512-5/qtyj6YfdM7BjwH9cpA1y0rPRdKQYr2s6Ze/Ocgfb26DUR6n4daXzilB3TceUanvAFFScGx16CqlA/my1cozQ==", "dependencies": { "lit": "^3.0.0" } }, "node_modules/@vaadin/text-field": { - "version": "24.3.10", - "resolved": "https://registry.npmjs.org/@vaadin/text-field/-/text-field-24.3.10.tgz", - "integrity": "sha512-AzaFv77VymA1hEmJ2C8SbOvdDmdKISTcusN41WwffhkYonFednt+bcZljLP4j3L/mwu0Vyh+c1zJithxo5g/vA==", + "version": "24.3.13", + "resolved": "https://registry.npmjs.org/@vaadin/text-field/-/text-field-24.3.13.tgz", + "integrity": "sha512-+f0DGrD+KmVw6s75Gdprugb01LYhsCdLgc2QLTrNjmyx/kvNfw76jTHZEeUuYYjxTMVyKXVstcWxG/oWt/sZSQ==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.3.10", - "@vaadin/component-base": "~24.3.10", - "@vaadin/field-base": "~24.3.10", - "@vaadin/input-container": "~24.3.10", - "@vaadin/vaadin-lumo-styles": "~24.3.10", - "@vaadin/vaadin-material-styles": "~24.3.10", - "@vaadin/vaadin-themable-mixin": "~24.3.10", + "@vaadin/a11y-base": "~24.3.13", + "@vaadin/component-base": "~24.3.13", + "@vaadin/field-base": "~24.3.13", + "@vaadin/input-container": "~24.3.13", + "@vaadin/vaadin-lumo-styles": "~24.3.13", + "@vaadin/vaadin-material-styles": "~24.3.13", + "@vaadin/vaadin-themable-mixin": "~24.3.13", "lit": "^3.0.0" } }, "node_modules/@vaadin/vaadin-development-mode-detector": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vaadin/vaadin-development-mode-detector/-/vaadin-development-mode-detector-2.0.6.tgz", - "integrity": "sha512-N6a5nLT/ytEUlpPo+nvdCKIGoyNjPsj3rzPGvGYK8x9Ceg76OTe1xI/GtN71mRW9e2HUScR0kCNOkl1Z63YDjw==" + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@vaadin/vaadin-development-mode-detector/-/vaadin-development-mode-detector-2.0.7.tgz", + "integrity": "sha512-9FhVhr0ynSR3X2ao+vaIEttcNU5XfzCbxtmYOV8uIRnUCtNgbvMOIcyGBvntsX9I5kvIP2dV3cFAOG9SILJzEA==" }, "node_modules/@vaadin/vaadin-lumo-styles": { - "version": "24.3.10", - "resolved": "https://registry.npmjs.org/@vaadin/vaadin-lumo-styles/-/vaadin-lumo-styles-24.3.10.tgz", - "integrity": "sha512-on8O4hraLCHoIuYeTOY3+S69+Qm2i3Q9mNHSpze1jspEOBz5sjoILwdk1oKJ45IRyvC9eGnvLkFh7vh6UT1I4g==", + "version": "24.3.13", + "resolved": "https://registry.npmjs.org/@vaadin/vaadin-lumo-styles/-/vaadin-lumo-styles-24.3.13.tgz", + "integrity": "sha512-43h6sKTVdNJ2Gv3mTcD1oVHjrNKj28Zs+VqcTUS5Vn2bxmGsIm3V5qLMdSe5GWNeZPbl+5dFa1VjFUjQWElMYw==", "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.3.10", - "@vaadin/icon": "~24.3.10", - "@vaadin/vaadin-themable-mixin": "~24.3.10" + "@vaadin/component-base": "~24.3.13", + "@vaadin/icon": "~24.3.13", + "@vaadin/vaadin-themable-mixin": "~24.3.13" } }, "node_modules/@vaadin/vaadin-material-styles": { - "version": "24.3.10", - "resolved": "https://registry.npmjs.org/@vaadin/vaadin-material-styles/-/vaadin-material-styles-24.3.10.tgz", - "integrity": "sha512-V5afMiem6nHYP7aU5+FsCT5tquxaHeUQtptQuHawYm2Iz2ImH7c4884oZ8m98+B9VKwhWP+Vlmi55+unOFqcTA==", + "version": "24.3.13", + "resolved": "https://registry.npmjs.org/@vaadin/vaadin-material-styles/-/vaadin-material-styles-24.3.13.tgz", + "integrity": "sha512-TG+y/YPI4M2rXkkyzbb6EzLl2dFaf+sNEH7tZXz4RLAUciKC7QHgpEESwQ0mfdonov2xP9Op48eBhkWalhKxDA==", "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.3.10", - "@vaadin/vaadin-themable-mixin": "~24.3.10" + "@vaadin/component-base": "~24.3.13", + "@vaadin/vaadin-themable-mixin": "~24.3.13" } }, "node_modules/@vaadin/vaadin-themable-mixin": { - "version": "24.3.10", - "resolved": "https://registry.npmjs.org/@vaadin/vaadin-themable-mixin/-/vaadin-themable-mixin-24.3.10.tgz", - "integrity": "sha512-PGlTGJ4C9YF1Y41iX3YpkPukr+ydYxGYdIljHnRxFJxXoyX0kudICqMEMwEMkNqHZETHbX3nTQMM9NE4x3Nr3Q==", + "version": "24.3.13", + "resolved": "https://registry.npmjs.org/@vaadin/vaadin-themable-mixin/-/vaadin-themable-mixin-24.3.13.tgz", + "integrity": "sha512-OmDLX92U1tefwgnmlP/OBsf/z/GGjy3IOoEUqEPCgf01+xB6wM6uCRaY1dBU8NgHQeaJq80YzQjP0z5D+SqTkA==", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "lit": "^3.0.0" @@ -5157,9 +5116,9 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, "node_modules/@zip.js/zip.js": { - "version": "2.7.40", - "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.40.tgz", - "integrity": "sha512-kSYwO0Wth6G66QM4CejZqG0nRhBsVVTaR18M/Ta8EcqcvaV0dYrnDDyKAstfy0V5+ejK4b9w5xc1W0ECATJTvA==", + "version": "2.7.44", + "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.44.tgz", + "integrity": "sha512-ZzMhAcAyRAYi1FZELsvKaw8I4ADxNTqbiVIjyo/syBe4HGWop9+OADnuBnHpm2TxgXPogxxhhPffOhDD40jUdA==", "engines": { "bun": ">=0.7.0", "deno": ">=1.0.0", @@ -5302,14 +5261,14 @@ } }, "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -5330,9 +5289,9 @@ } }, "node_modules/alertifyjs": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/alertifyjs/-/alertifyjs-1.13.1.tgz", - "integrity": "sha512-CckZE2dZDsEEXglOXKxT00vUDV5A6udZom+bn1XHdIWlbSFZgYq7UXCBlwkShhIH3Li/1VxLmr55GOQFQ12WSg==" + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/alertifyjs/-/alertifyjs-1.14.0.tgz", + "integrity": "sha512-jUxJTcNYhJ2P1Wal73nmyTwMkaPim4PjZP9CAG+S8SK2SinraXxvOxnPrEY81/wc2iBPDFBP7mdg61db4WsuHQ==" }, "node_modules/ansi-escapes": { "version": "4.3.2", @@ -5348,6 +5307,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ansi-html-community": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", @@ -5862,12 +5832,12 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", - "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.1", + "@babel/helper-define-polyfill-provider": "^0.6.2", "semver": "^6.3.1" }, "peerDependencies": { @@ -5895,11 +5865,11 @@ } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz", - "integrity": "sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", + "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.1" + "@babel/helper-define-polyfill-provider": "^0.6.2" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -6284,9 +6254,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001600", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz", - "integrity": "sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==", + "version": "1.0.30001618", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001618.tgz", + "integrity": "sha512-p407+D1tIkDvsEAPS22lJxLQQaG8OTBEqo0KhzfABGk0TU4juBNDSfH0hyAp/HRyx+M8L17z/ltyhxh27FTfQg==", "funding": [ { "type": "opencollective", @@ -6401,9 +6371,9 @@ } }, "node_modules/cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", + "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==" }, "node_modules/classnames": { "version": "2.5.1", @@ -6440,9 +6410,9 @@ } }, "node_modules/clsx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", - "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "engines": { "node": ">=6" } @@ -6540,11 +6510,6 @@ "node": ">= 12" } }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" - }, "node_modules/common-tags": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", @@ -6673,9 +6638,9 @@ } }, "node_modules/core-js": { - "version": "3.36.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.36.1.tgz", - "integrity": "sha512-BTvUrwxVBezj5SZ3f10ImnX2oRByMxql3EimVqMysepbC9EeMUOpLwdy6Eoili2x6E4kf+ZUB5k/+Jv55alPfA==", + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.1.tgz", + "integrity": "sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -6683,9 +6648,9 @@ } }, "node_modules/core-js-compat": { - "version": "3.36.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz", - "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==", + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", + "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", "dependencies": { "browserslist": "^4.23.0" }, @@ -6695,9 +6660,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.36.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.36.1.tgz", - "integrity": "sha512-NXCvHvSVYSrewP0L5OhltzXeWFJLo2AL2TYnj6iLV3Bw8mM62wAQMNgUCRI6EBu6hVVpbCxmOPlxh1Ikw2PfUA==", + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.37.1.tgz", + "integrity": "sha512-J/r5JTHSmzTxbiYYrzXg9w1VpqrYt+gexenBE9pugeyhwPZTAEJddyiReJWsLO6uNQ8xJZFbod6XC7KKwatCiA==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -6799,15 +6764,15 @@ } }, "node_modules/css-loader": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.10.0.tgz", - "integrity": "sha512-LTSA/jWbwdMlk+rhmElbDR2vbtQoTBPr7fkJE+mxrHj+7ru0hUmHafDRzWIjIHTwpitWVaqY2/UWGRca3yUgRw==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", "dependencies": { "icss-utils": "^5.1.0", "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.4", - "postcss-modules-scope": "^3.1.1", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", "semver": "^7.5.4" @@ -6870,14 +6835,14 @@ } }, "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -7628,9 +7593,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.719", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.719.tgz", - "integrity": "sha512-FbWy2Q2YgdFzkFUW/W5jBjE9dj+804+98E4Pup78JBPnbdb3pv6IneY2JCPKdeKLh3AOKHQeYf+KwLr7mxGh6Q==" + "version": "1.4.769", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.769.tgz", + "integrity": "sha512-bZu7p623NEA2rHTc9K1vykl57ektSPQYFFqQir8BOYf6EKOB+yIsbFB9Kpm7Cgt6tsLr9sRkqfqSZUw7LP1XxQ==" }, "node_modules/emittery": { "version": "0.8.1", @@ -7665,9 +7630,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", - "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.1.tgz", + "integrity": "sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw==", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -7706,9 +7671,9 @@ } }, "node_modules/es-abstract": { - "version": "1.23.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.2.tgz", - "integrity": "sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w==", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", "dependencies": { "array-buffer-byte-length": "^1.0.1", "arraybuffer.prototype.slice": "^1.0.3", @@ -7749,11 +7714,11 @@ "safe-regex-test": "^1.0.3", "string.prototype.trim": "^1.2.9", "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.7", + "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.2", "typed-array-byte-length": "^1.0.1", "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.5", + "typed-array-length": "^1.0.6", "unbox-primitive": "^1.0.2", "which-typed-array": "^1.1.15" }, @@ -7789,13 +7754,13 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.0.18", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz", - "integrity": "sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==", + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", + "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", + "es-abstract": "^1.23.3", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", @@ -7813,9 +7778,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.0.tgz", - "integrity": "sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==" + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.2.tgz", + "integrity": "sha512-l60ETUTmLqbVbVHv1J4/qj+M8nq7AwMzEcg3kmJDt9dCNrTk+yHcYFf/Kw75pMDwd9mPcIGCG5LcS20SxYRzFA==" }, "node_modules/es-object-atoms": { "version": "1.0.0", @@ -8199,9 +8164,9 @@ } }, "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", "engines": { "node": ">=10" }, @@ -8309,14 +8274,14 @@ } }, "node_modules/eslint-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -8426,6 +8391,21 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eslint/node_modules/globals": { "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", @@ -8459,6 +8439,48 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eslint/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -8902,18 +8924,15 @@ "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" }, "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dependencies": { - "locate-path": "^6.0.0", + "locate-path": "^5.0.0", "path-exists": "^4.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/flat-cache": { @@ -9190,9 +9209,9 @@ } }, "node_modules/fs-monkey": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", - "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", + "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==" }, "node_modules/fs.realpath": { "version": "1.0.0", @@ -9338,9 +9357,9 @@ } }, "node_modules/github-buttons": { - "version": "2.27.0", - "resolved": "https://registry.npmjs.org/github-buttons/-/github-buttons-2.27.0.tgz", - "integrity": "sha512-PmfRMI2Rttg/2jDfKBeSl621sEznrsKF019SuoLdoNlO7qRUZaOyEI5Li4uW+79pVqnDtKfIEVuHTIJ5lgy64w==" + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/github-buttons/-/github-buttons-2.28.0.tgz", + "integrity": "sha512-KsCbYiA+MiHO3ytzdGvGt/GNde4GfG9BrrLxxc+ut2snBF9IAjrn2F5mNgHHEXdG/CfFIHOMV8Uxy4LNhxZwUA==" }, "node_modules/glob": { "version": "7.2.3", @@ -9421,11 +9440,12 @@ } }, "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -9996,9 +10016,9 @@ } }, "node_modules/ipaddr.js": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", - "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", "engines": { "node": ">= 10" } @@ -10591,9 +10611,9 @@ } }, "node_modules/jake": { - "version": "10.8.7", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", - "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz", + "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==", "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", @@ -12558,9 +12578,9 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/lit": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lit/-/lit-3.1.2.tgz", - "integrity": "sha512-VZx5iAyMtX7CV4K8iTLdCkMaYZ7ipjJZ0JcSdJ0zIdGxxyurjIn7yuuSxNBD7QmjvcNJwr0JS4cAdAtsy7gZ6w==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lit/-/lit-3.1.3.tgz", + "integrity": "sha512-l4slfspEsnCcHVRTvaP7YnkTZEZggNFywLEIhQaGhYDczG+tu/vlgm/KaWIEjIp+ZyV20r2JnZctMb8LeLCG7Q==", "dependencies": { "@lit/reactive-element": "^2.0.4", "lit-element": "^4.0.4", @@ -12568,9 +12588,9 @@ } }, "node_modules/lit-element": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.0.4.tgz", - "integrity": "sha512-98CvgulX6eCPs6TyAIQoJZBCQPo80rgXR+dVBs61cstJXqtI+USQZAbA4gFHh6L/mxBx9MrgPLHLsUgDUHAcCQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.0.5.tgz", + "integrity": "sha512-iTWskWZEtn9SyEf4aBG6rKT8GABZMrTWop1+jopsEOgEcugcXJGKuX5bEbkq9qfzY+XB4MAgCaSPwnNpdsNQ3Q==", "dependencies": { "@lit-labs/ssr-dom-shim": "^1.2.0", "@lit/reactive-element": "^2.0.4", @@ -12578,9 +12598,9 @@ } }, "node_modules/lit-html": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.1.2.tgz", - "integrity": "sha512-3OBZSUrPnAHoKJ9AMjRL/m01YJxQMf+TMHanNtTHG68ubjnZxK0RFl102DPzsw4mWnHibfZIBJm3LWCZ/LmMvg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.1.3.tgz", + "integrity": "sha512-FwIbqDD8O/8lM4vUZ4KvQZjPPNx7V1VhT7vmRB8RBAO0AU6wuTVdoXiu2CivVjEGdugvcbPNBLtPE1y0ifplHA==", "dependencies": { "@types/trusted-types": "^2.0.2" } @@ -12607,17 +12627,14 @@ } }, "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dependencies": { - "p-locate": "^5.0.0" + "p-locate": "^4.1.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/lodash": { @@ -12849,9 +12866,9 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.8.1.tgz", - "integrity": "sha512-/1HDlyFRxWIZPI1ZpgqlZ8jMw/1Dp/dl3P0L1jtZ+zVcHqwPhGwaJwKL00WVgfnBy6PWCde9W65or7IIETImuA==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.0.tgz", + "integrity": "sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA==", "dependencies": { "schema-utils": "^4.0.0", "tapable": "^2.2.1" @@ -12868,14 +12885,14 @@ } }, "node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -12941,9 +12958,9 @@ } }, "node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.1.tgz", + "integrity": "sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==", "engines": { "node": ">=16 || 14 >=14.17" } @@ -13111,9 +13128,9 @@ } }, "node_modules/nwsapi": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", - "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==" + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.10.tgz", + "integrity": "sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==" }, "node_modules/object-assign": { "version": "4.1.1", @@ -13360,47 +13377,44 @@ } }, "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dependencies": { - "yocto-queue": "^0.1.0" + "p-try": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dependencies": { - "p-limit": "^3.0.2" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/p-retry": { @@ -13522,24 +13536,24 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-scurry": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", - "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", "engines": { "node": "14 || >=16.14" } @@ -13575,9 +13589,9 @@ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -13617,54 +13631,6 @@ "node": ">=8" } }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/pkg-up": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", @@ -13699,20 +13665,6 @@ "node": ">=6" } }, - "node_modules/pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/pkg-up/node_modules/p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", @@ -14242,9 +14194,9 @@ } }, "node_modules/postcss-load-config/node_modules/yaml": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", - "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz", + "integrity": "sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==", "bin": { "yaml": "bin.mjs" }, @@ -14388,9 +14340,9 @@ } }, "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -14399,9 +14351,9 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz", - "integrity": "sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", + "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", "dependencies": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^6.0.2", @@ -14415,9 +14367,9 @@ } }, "node_modules/postcss-modules-scope": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz", - "integrity": "sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", + "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", "dependencies": { "postcss-selector-parser": "^6.0.4" }, @@ -15093,9 +15045,9 @@ } }, "node_modules/qs": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.0.tgz", - "integrity": "sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==", + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz", + "integrity": "sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==", "dependencies": { "side-channel": "^1.0.6" }, @@ -15341,9 +15293,9 @@ } }, "node_modules/rc-util": { - "version": "5.39.1", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.39.1.tgz", - "integrity": "sha512-OW/ERynNDgNr4y0oiFmtes3rbEamXw7GHGbkbNd9iRr7kgT03T6fT0b9WpJ3mbxKhyOcAHnGcIoh5u/cjrC2OQ==", + "version": "5.39.3", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.39.3.tgz", + "integrity": "sha512-j9wOELkLQ8gC/NkUg3qg9mHZcJf+5mYYv40JrDHqnaf8VSycji4pCf7kJ5fdTXQPDIF0vr5zpb/T2HdrMs9rWA==", "dependencies": { "@babel/runtime": "^7.18.3", "react-is": "^18.2.0" @@ -15354,18 +15306,18 @@ } }, "node_modules/re-resizable": { - "version": "6.9.11", - "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.9.11.tgz", - "integrity": "sha512-a3hiLWck/NkmyLvGWUuvkAmN1VhwAz4yOhS6FdMTaxCUVN9joIWkT11wsO68coG/iEYuwn+p/7qAmfQzRhiPLQ==", + "version": "6.9.16", + "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.9.16.tgz", + "integrity": "sha512-D9+ofwgPQRC6PL6cwavCZO9MUR8TKKxV1nHjbutSdNaFHK9v5k8m6DcESMXrw1+mRJn7fBHJRhZpa7EQ1ZWEEA==", "peerDependencies": { "react": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0" } }, "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "dependencies": { "loose-envify": "^1.1.0" }, @@ -15512,6 +15464,21 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/react-dev-utils/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/react-dev-utils/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -15528,6 +15495,48 @@ "node": ">= 12.13.0" } }, + "node_modules/react-dev-utils/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/react-dev-utils/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -15552,15 +15561,15 @@ } }, "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "dependencies": { "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" + "scheduler": "^0.23.2" }, "peerDependencies": { - "react": "^18.2.0" + "react": "^18.3.1" } }, "node_modules/react-error-overlay": { @@ -15600,9 +15609,9 @@ } }, "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, "node_modules/react-lifecycles-compat": { "version": "3.0.4", @@ -15627,9 +15636,9 @@ } }, "node_modules/react-onclickoutside": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.13.0.tgz", - "integrity": "sha512-ty8So6tcUpIb+ZE+1HAhbLROvAIJYyJe/1vRrrcmW+jLsaM+/powDRqxzo6hSh9CuRZGSL1Q8mvcF5WRD93a0A==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.13.1.tgz", + "integrity": "sha512-LdrrxK/Yh9zbBQdFbMTXPp3dTSN9B+9YJQucdDu3JNKRrbdU+H+/TVONJoWtOwy4II8Sqf1y/DTI6w/vGPYW0w==", "funding": { "type": "individual", "url": "https://github.com/Pomax/react-onclickoutside/blob/master/FUNDING.md" @@ -15679,11 +15688,11 @@ } }, "node_modules/react-router": { - "version": "6.22.3", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.3.tgz", - "integrity": "sha512-dr2eb3Mj5zK2YISHK++foM9w4eBnO23eKnZEDs7c880P6oKbrjz/Svg9+nxqtHQK+oMW4OtjZca0RqPglXxguQ==", + "version": "6.23.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.23.1.tgz", + "integrity": "sha512-fzcOaRF69uvqbbM7OhvQyBTFDVrrGlsFdS3AL+1KfIBtGETibHzi3FkoTRyiDJnWNc2VxrfvR+657ROHjaNjqQ==", "dependencies": { - "@remix-run/router": "1.15.3" + "@remix-run/router": "1.16.1" }, "engines": { "node": ">=14.0.0" @@ -15693,12 +15702,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.22.3", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.3.tgz", - "integrity": "sha512-7ZILI7HjcE+p31oQvwbokjk6OA/bnFxrhJ19n82Ex9Ph8fNAq+Hm/7KchpMGlTgWhUxRHMMCut+vEtNpWpowKw==", + "version": "6.23.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.23.1.tgz", + "integrity": "sha512-utP+K+aSTtEdbWpC+4gxhdlPFwuEfDKq8ZrPFU65bbRJY+l706qjR7yaidBpo3MSeA/fzwbXWbKBI6ftOnP3OQ==", "dependencies": { - "@remix-run/router": "1.15.3", - "react-router": "6.22.3" + "@remix-run/router": "1.16.1", + "react-router": "6.23.1" }, "engines": { "node": ">=14.0.0" @@ -15859,29 +15868,21 @@ "integrity": "sha512-9hyjbveY1aDyo9wkyMOsmKIpQdFUaw2yG6/f8c5SPE4pOTuKm7L2zLnDa+AxpG+3315USulViaO4XSOkX1KdVA==" }, "node_modules/react-tabs": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/react-tabs/-/react-tabs-4.3.0.tgz", - "integrity": "sha512-2GfoG+f41kiBIIyd3gF+/GRCCYtamC8/2zlAcD8cqQmqI9Q+YVz7fJLHMmU9pXDVYYHpJeCgUSBJju85vu5q8Q==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/react-tabs/-/react-tabs-6.0.2.tgz", + "integrity": "sha512-aQXTKolnM28k3KguGDBSAbJvcowOQr23A+CUJdzJtOSDOtTwzEaJA+1U4KwhNL9+Obe+jFS7geuvA7ICQPXOnQ==", "dependencies": { - "clsx": "^1.1.0", + "clsx": "^2.0.0", "prop-types": "^15.5.0" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-0 || ^18.0.0" - } - }, - "node_modules/react-tabs/node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "engines": { - "node": ">=6" + "react": "^18.0.0" } }, "node_modules/react-tooltip": { - "version": "5.26.3", - "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-5.26.3.tgz", - "integrity": "sha512-MpYAws8CEHUd/RC4GaDCdoceph/T4KHM5vS5Dbk8FOmLMvvIht2ymP2htWdrke7K6lqPO8rz8+bnwWUIXeDlzg==", + "version": "5.26.4", + "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-5.26.4.tgz", + "integrity": "sha512-5WyDrsfw1+6qNVSr3IjqElqJ+cCwE8+44b+HpJ8qRLv7v0a3mcKf8wvv+NfgALFS6QpksGFqTLV2JQ60c+okZQ==", "dependencies": { "@floating-ui/dom": "^1.6.1", "classnames": "^2.3.0" @@ -16508,9 +16509,9 @@ } }, "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", "dependencies": { "loose-envify": "^1.1.0" } @@ -16550,12 +16551,9 @@ } }, "node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "bin": { "semver": "bin/semver.js" }, @@ -16563,22 +16561,6 @@ "node": ">=10" } }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -17427,30 +17409,30 @@ } }, "node_modules/sucrase/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "version": "10.3.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.15.tgz", + "integrity": "sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw==", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", + "jackspeak": "^2.3.6", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "minipass": "^7.0.4", + "path-scurry": "^1.11.0" }, "bin": { "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/sucrase/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -17705,9 +17687,9 @@ } }, "node_modules/terser": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.30.0.tgz", - "integrity": "sha512-Y/SblUl5kEyEFzhMAQdsxVHh+utAxd4IuRNJzKywY/4uzSogh3G219jqbDDxYu4MXO9CzY3tSEqmZvW6AoEDJw==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.0.tgz", + "integrity": "sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -17857,9 +17839,9 @@ } }, "node_modules/tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", @@ -17973,11 +17955,11 @@ } }, "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.18.2.tgz", + "integrity": "sha512-+suCYpfJLAe4OXS6+PPXjW3urOS4IoP9waSiLuXfLgqZODKw/aWwASvzqE886wA0kQgGy0mIWyhd87VpqIy6Xg==", "engines": { - "node": ">=10" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -18209,9 +18191,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", + "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", "funding": [ { "type": "opencollective", @@ -18227,8 +18209,8 @@ } ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -18488,14 +18470,14 @@ } }, "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -18595,14 +18577,14 @@ } }, "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -18644,9 +18626,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", + "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", "engines": { "node": ">=10.0.0" }, @@ -18972,14 +18954,14 @@ } }, "node_modules/workbox-build/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", diff --git a/package.json b/package.json index 465adcef..ee77497b 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "github-buttons": "^2.27.0", "html-to-image": "^1.11.11", "moment": "^2.29.4", - "ol": "^7.5.1", + "ol": "7.5.1", "ol-mapbox-style": "^11.0.3", "proj4": "^2.7.5", "rc-menu": "^9.11.1", @@ -41,7 +41,7 @@ "react-switch": "^7.0.0", "react-table": "^7.8.0", "react-table-sticky": "^1.1.3", - "react-tabs": "^4.3.0", + "react-tabs": "^6.0.2", "react-tooltip": "^5.20.0", "react-transition-group": "^4.4.5", "react-virtualized": "^9.22.5", diff --git a/src/components/sc-sidebar.jsx b/src/components/sc-sidebar.jsx index 64f16a8e..43782ee8 100644 --- a/src/components/sc-sidebar.jsx +++ b/src/components/sc-sidebar.jsx @@ -54,22 +54,22 @@ const defaultStyles = { const Sidebar = ({ children, - styles, + styles = {}, rootClassName, sidebarClassName, contentClassName, overlayClassName, sidebar, - docked, - open, - transitions, - touch, - touchHandleWidth, - pullRight, - shadow, - dragToggleDistance, - onSetOpen, - defaultSidebarWidth, + docked = false, + open = false, + transitions =true, + touch = true, + touchHandleWidth = 20, + pullRight = false, + shadow = true, + dragToggleDistance = 30, + onSetOpen = () => {}, + defaultSidebarWidth = 0, rootId, sidebarId, contentId, @@ -328,18 +328,4 @@ Sidebar.propTypes = { overlayId: PropTypes.string, }; -Sidebar.defaultProps = { - docked: false, - open: false, - transitions: true, - touch: true, - touchHandleWidth: 20, - pullRight: false, - shadow: true, - dragToggleDistance: 30, - onSetOpen: () => {}, - styles: {}, - defaultSidebarWidth: 0, -}; - export default Sidebar; diff --git a/src/header/Search.jsx b/src/header/Search.jsx index 740f7c58..f57a5213 100644 --- a/src/header/Search.jsx +++ b/src/header/Search.jsx @@ -838,6 +838,7 @@ const Search = (props) => { if (item.type === "Map Layer") type = item.layerGroupName; else if (item.type === "Tool" || item.type === "Theme") type = ""; else type = item.municipality; + delete props["key"]; //remove key from props return (
    diff --git a/src/helpers/InfoRow.jsx b/src/helpers/InfoRow.jsx index 693f7119..29e05172 100644 --- a/src/helpers/InfoRow.jsx +++ b/src/helpers/InfoRow.jsx @@ -1,6 +1,5 @@ import React from "react"; import moment from "moment"; -import * as helpers from "../helpers/helpers"; import Attachments from "../map/Attachments"; export const InfoRow = (props) => { // CONVERT URL'S TO LINKS @@ -30,7 +29,7 @@ export const InfoRow = (props) => { {props.value} ); - } else if (props.value != null && props.value.length >= 8 && moment(props.value, formats, true).isValid()) { + } else if (props.value != null && props.value.length >= 8 && moment(props.value, formats, true).isValid() && !label.toUpperCase().includes("NUMBER")) { value = moment(props.value).format("YYYY-MM-DD"); } diff --git a/src/helpers/esriHelpers.js b/src/helpers/esriHelpers.js index 8506e176..368f8004 100644 --- a/src/helpers/esriHelpers.js +++ b/src/helpers/esriHelpers.js @@ -55,17 +55,22 @@ export const login = (callback) => { configSecured = window.config.configSecured; initialize(configSecured.securedArcGIS.appId, configSecured.securedArcGIS.portalUrl); - let creds = signIn().then( - (result) => { - return result; - }, - (error) => { - console.error(error); - } - ); + let creds = new Promise((resolve, reject) => { + signIn().then( + (result) => { + resolve(result); + }, + (error) => { + console.error(error); + reject(error); + } + ); + }); - if (!callback) return creds; - else callback(creds); + creds.then((result) => { + if (!callback) return result; + else callback(result); + }); }); }; diff --git a/src/index.js b/src/index.js index 76656eba..874794f7 100644 --- a/src/index.js +++ b/src/index.js @@ -4,8 +4,6 @@ import { createRoot } from "react-dom/client"; import "./index.css"; import * as serviceWorker from "./serviceWorker"; -import { MsalProvider } from "@azure/msal-react"; -import { Configuration, PublicClientApplication } from "@azure/msal-browser"; import "alertifyjs/build/css/alertify.css"; import "alertifyjs/build/css/themes/default.min.css"; @@ -19,18 +17,8 @@ if (process.env.REACT_APP_SECURED === "true") { import(`./AppSecure.jsx`) .then((module) => { const AppSecure = module.default; - // MSAL configuration - const configuration = Configuration({ - auth: { - clientId: process.env.REACT_APP_CLIENTID, - }, - }); - const pca = new PublicClientApplication(configuration); - root.render( - - ); }) .catch((error) => { diff --git a/src/map/Identify.jsx b/src/map/Identify.jsx index 42dce8bc..ef7e2b1c 100644 --- a/src/map/Identify.jsx +++ b/src/map/Identify.jsx @@ -32,7 +32,7 @@ class Identify extends Component { }); } - componentWillReceiveProps(nextProps) { + UNSAFE_componentWillReceiveProps(nextProps) { this.refreshLayers(nextProps); } diff --git a/src/sidebar/components/mymaps/FeatureReportPopup.jsx b/src/sidebar/components/mymaps/FeatureReportPopup.jsx index 5855f991..a27f2de3 100644 --- a/src/sidebar/components/mymaps/FeatureReportPopup.jsx +++ b/src/sidebar/components/mymaps/FeatureReportPopup.jsx @@ -60,9 +60,6 @@ class FeatureReportPopup extends Component { this.setState({ isLoading: false }); }); } - componentWillReceiveProps(nextProps) { - // this.popupLabelRef.forceUpdate(); - } render() { return ( diff --git a/src/sidebar/components/themes/localrealestate/LocalRealEstateImageSlider.jsx b/src/sidebar/components/themes/localrealestate/LocalRealEstateImageSlider.jsx index 48c4addc..99f22454 100644 --- a/src/sidebar/components/themes/localrealestate/LocalRealEstateImageSlider.jsx +++ b/src/sidebar/components/themes/localrealestate/LocalRealEstateImageSlider.jsx @@ -61,7 +61,7 @@ class LocalRealEstateImageSlider extends Component { this.onMapMoveEvent = window.map.on("moveend", this.onMapMoveEnd); } - componentWillReceiveProps(nextProps) { + UNSAFE_componentWillReceiveProps(nextProps) { this.updateFeatures(nextProps); } diff --git a/src/sidebar/components/toc/common/TOCHeader.jsx b/src/sidebar/components/toc/common/TOCHeader.jsx index 2e032664..96f7a77b 100644 --- a/src/sidebar/components/toc/common/TOCHeader.jsx +++ b/src/sidebar/components/toc/common/TOCHeader.jsx @@ -100,7 +100,7 @@ class TOCHeader extends Component { this.props.onSearchChange(searchText); }); }; - componentWillReceiveProps(nextProps) { + UNSAFE_componentWillReceiveProps(nextProps) { if (nextProps.searchText === "" && this.state.searchText !== "") { this.setState({ searchText: nextProps.searchText }); } diff --git a/src/sidebar/components/toc/toc-folder-view/GroupItem.jsx b/src/sidebar/components/toc/toc-folder-view/GroupItem.jsx index 8bb79d85..cadb66f9 100644 --- a/src/sidebar/components/toc/toc-folder-view/GroupItem.jsx +++ b/src/sidebar/components/toc/toc-folder-view/GroupItem.jsx @@ -115,7 +115,7 @@ class GroupItem extends Component { componentWillUnmount() { this._isMounted = false; } - componentWillReceiveProps(nextProps) { + UNSAFE_componentWillReceiveProps(nextProps) { this.setState({ newProps: true }, () => { this.setOpenState(nextProps.panelOpen); this.setActiveLayerCount(); diff --git a/src/sidebar/components/toc/toc-list-view/Layers.jsx b/src/sidebar/components/toc/toc-list-view/Layers.jsx index 3e8804a4..6243f6c6 100644 --- a/src/sidebar/components/toc/toc-list-view/Layers.jsx +++ b/src/sidebar/components/toc/toc-list-view/Layers.jsx @@ -109,8 +109,17 @@ const Layers = (layersProps) => { {children} )} - renderItem={({ value, props, isDragged, isSelected }) => ( -
  • + renderItem={({ value, props, isDragged, isSelected }) => ( +
  • + { ); }; + +const LayerListItem = ({children, virtualId, isDragged, isSelected, options}) => { + console.log("LayerListItem", virtualId, isDragged, isSelected, options); + return ( +
  • + {children} +
  • + + ); +} export default Layers;