From 0cc6b6f95e5bfc696686a25b5ad4975a122a41d7 Mon Sep 17 00:00:00 2001 From: Lucius Creamer Date: Tue, 7 Apr 2026 17:49:23 -0500 Subject: [PATCH 1/2] Mostly formatting changes throughout. No breaking changes. --- .github/workflows/build-to-pages.yml | 2 +- .github/workflows/linter.yml | 2 +- .github/workflows/publish-widgets.yml | 2 +- ABLS/manifest.json | 5 -- ABLS/package.json | 10 +-- ABLS/src/runtime/widget.tsx | 3 +- ABLS/src/setting/setting.tsx | 6 +- ABLS/src/setting/utils.ts | 9 +-- Calendar/manifest.json | 3 +- Calendar/src/runtime/widget.tsx | 13 +++- Calendar/src/setting/setting.tsx | 64 +++++++++++-------- CamViewer/src/runtime/widget.tsx | 6 +- CamViewer/src/setting/setting.tsx | 6 +- FIMLS/src/runtime/widget.tsx | 16 +++-- FIMLS/src/setting/setting.tsx | 19 +++--- FIMLS/src/setting/utils.ts | 42 ++++++------ MDPrint/src/runtime/formatUtils.ts | 4 +- MDPrint/src/runtime/widget.tsx | 7 +- MDPrint/src/setting/setting.tsx | 10 +-- indicator/src/runtime/queries.ts | 6 +- indicator/src/runtime/utils.ts | 20 +++--- indicator/src/runtime/widget.tsx | 6 +- .../src/setting/number-format-setting.tsx | 2 +- indicator/src/setting/setting.tsx | 36 +++++------ indicator/src/setting/text-style-setting.tsx | 2 +- new-radar/src/runtime/assets/sw-radar.js | 2 +- new-radar/src/runtime/radar-utils.ts | 27 ++++---- new-radar/src/runtime/widget.tsx | 30 +++++---- new-radar/src/runtime/wms-utils.ts | 26 ++++---- new-radar/src/setting/setting.tsx | 5 +- slider-filter/src/runtime/widget.tsx | 8 ++- slider-filter/src/setting/setting.tsx | 12 ++-- 32 files changed, 218 insertions(+), 193 deletions(-) diff --git a/.github/workflows/build-to-pages.yml b/.github/workflows/build-to-pages.yml index 3e6e537..2d18c0c 100644 --- a/.github/workflows/build-to-pages.yml +++ b/.github/workflows/build-to-pages.yml @@ -21,7 +21,7 @@ jobs: - name: Download Experience Builder run: | - URL=$(curl -s 'https://downloads.arcgis.com/dms/rest/download/secured/arcgis-experience-builder-1.19.zip?f=json&folder=software%2FExperienceBuilder%2F1.19' | jq -r '.url') + URL=$(curl -s 'https://downloads.arcgis.com/dms/rest/download/secured/arcgis-experience-builder-1.20.zip?f=json&folder=software%2FExperienceBuilder%2F1.20' | jq -r '.url') curl -L -o exb.zip "$URL" - name: Unzip Experience Builder diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index 521bcff..5a26315 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -17,7 +17,7 @@ jobs: - name: Download Experience Builder shell: pwsh run: | - $jsonResponse = Invoke-RestMethod -Uri 'https://downloads.arcgis.com/dms/rest/download/secured/arcgis-experience-builder-1.19.zip?f=json&folder=software%2FExperienceBuilder%2F1.19' + $jsonResponse = Invoke-RestMethod -Uri 'https://downloads.arcgis.com/dms/rest/download/secured/arcgis-experience-builder-1.20.zip?f=json&folder=software%2FExperienceBuilder%2F1.20' Invoke-WebRequest -Uri $jsonResponse.url -OutFile exb.zip - name: Unzip Experience Builder diff --git a/.github/workflows/publish-widgets.yml b/.github/workflows/publish-widgets.yml index 521a66c..1ea308f 100644 --- a/.github/workflows/publish-widgets.yml +++ b/.github/workflows/publish-widgets.yml @@ -49,7 +49,7 @@ jobs: - name: Download Experience Builder shell: pwsh run: | - $jsonResponse = Invoke-RestMethod -Uri 'https://downloads.arcgis.com/dms/rest/download/secured/arcgis-experience-builder-1.19.zip?f=json&folder=software%2FExperienceBuilder%2F1.19' + $jsonResponse = Invoke-RestMethod -Uri 'https://downloads.arcgis.com/dms/rest/download/secured/arcgis-experience-builder-1.20.zip?f=json&folder=software%2FExperienceBuilder%2F1.20' Invoke-WebRequest -Uri $jsonResponse.url -OutFile exb.zip - name: Unzip Experience Builder diff --git a/ABLS/manifest.json b/ABLS/manifest.json index 9c0683a..6bb991c 100644 --- a/ABLS/manifest.json +++ b/ABLS/manifest.json @@ -14,11 +14,6 @@ "hasConfig": true }, "dependency": [ - "jimu-arcgis", - "jimu-core", - "@esri/calcite-components-react" - ], - "settingDependency": [ "jimu-arcgis" ], "translatedLocales": [ diff --git a/ABLS/package.json b/ABLS/package.json index e648960..b9cff3b 100644 --- a/ABLS/package.json +++ b/ABLS/package.json @@ -1,6 +1,6 @@ { "name": "abls", - "version": "1.0.1", + "version": "1.0.2", "description": "A Better Layer Switcher - A custom Experience Widget, to swith between sets of layers using a views navigation like interface.", "keywords": [ "exb-widget", @@ -13,14 +13,6 @@ "directories": { "test": "tests" }, - "peerDependencies": { - "@esri/calcite-components": "5.0.1" - }, - "devDependencies": { - "@types/react": "^18.0.0", - "@types/react-dom": "^18.0.0", - "typescript": "^4.0.0" - }, "repository": { "type": "git", "url": "git+https://github.com/SunshineLuke90/widgets.git", diff --git a/ABLS/src/runtime/widget.tsx b/ABLS/src/runtime/widget.tsx index b425094..636863c 100644 --- a/ABLS/src/runtime/widget.tsx +++ b/ABLS/src/runtime/widget.tsx @@ -5,12 +5,13 @@ import { JimuMapViewComponent, type JimuMapView } from "jimu-arcgis" import type { Config, ABLSView } from "../config" import { Icon } from "jimu-ui" import defaultMessages from "./translations/default" +// @ts-expect-error - No types available for this package import "./style.css" import TimeExtent from "@arcgis/core/time/TimeExtent" import { useCallback } from "react" import { CalciteButton } from "@esri/calcite-components-react" -export default function Widget(props: AllWidgetProps) { +export default function Widget (props: AllWidgetProps) { const { config, useMapWidgetIds } = props const [jimuMapView, setJimuMapView] = React.useState(null) const [activeViewId, setActiveViewId] = React.useState(null) diff --git a/ABLS/src/setting/setting.tsx b/ABLS/src/setting/setting.tsx index 52b5108..7bdebde 100644 --- a/ABLS/src/setting/setting.tsx +++ b/ABLS/src/setting/setting.tsx @@ -8,15 +8,17 @@ import { import { IconPicker } from "jimu-ui/advanced/resource-selector" import { Button, TextInput, Checkbox, Switch, NumericInput } from "jimu-ui" import { JimuMapViewComponent, type JimuMapView } from "jimu-arcgis" +import type Layer from "esri/layers/Layer" import type { IMConfig, ABLSView } from "../config" import defaultMessages from "./translations/default" import { getLayersFromJimuMapView } from "./utils" +// @ts-expect-error - No types available for this package import "./style.css" -export default function Setting(props: AllWidgetSettingProps) { +export default function Setting (props: AllWidgetSettingProps) { const { id, config, onSettingChange, useMapWidgetIds } = props const [jimuMapView, setJimuMapView] = React.useState(null) - const [layers, setLayers] = React.useState<__esri.Layer[]>(null) + const [layers, setLayers] = React.useState(null) const onMapSelected = (useMapWidgetIds: string[]) => { onSettingChange({ diff --git a/ABLS/src/setting/utils.ts b/ABLS/src/setting/utils.ts index 4ae7516..76ae563 100644 --- a/ABLS/src/setting/utils.ts +++ b/ABLS/src/setting/utils.ts @@ -1,10 +1,11 @@ import type { JimuMapView } from 'jimu-arcgis' +import type Layer from 'esri/layers/Layer' -export function getLayersFromJimuMapView(jimuMapView: JimuMapView): __esri.Layer[] { - const layers = [] - const collectLayers = (layerCollection) => { - layerCollection.forEach(layer => { +export function getLayersFromJimuMapView (jimuMapView: JimuMapView): Layer[] { + const layers: Layer[] = [] + const collectLayers = (layerCollection: { forEach: (callback: (layer: any) => void) => void }) => { + layerCollection.forEach((layer: any) => { layers.push(layer) if (layer.layers) { collectLayers(layer.layers) diff --git a/Calendar/manifest.json b/Calendar/manifest.json index 4331708..68a86ed 100644 --- a/Calendar/manifest.json +++ b/Calendar/manifest.json @@ -11,7 +11,8 @@ ], "license": "MIT", "publishMessages": [ - "DATA_RECORDS_SELECTION_CHANGE" + "DATA_RECORDS_SELECTION_CHANGE", + "DATA_SOURCE_FILTER_CHANGE" ], "translatedLocales": [ "en" diff --git a/Calendar/src/runtime/widget.tsx b/Calendar/src/runtime/widget.tsx index dbc7f60..62c4a06 100644 --- a/Calendar/src/runtime/widget.tsx +++ b/Calendar/src/runtime/widget.tsx @@ -8,9 +8,11 @@ import { DataSourceStatus, MessageManager, DataRecordsSelectionChangeMessage, + DataSourceFilterChangeMessage, type SqlQueryParams } from "jimu-core" import type { data, IMConfig } from "../config" +// @ts-expect-error - No types available for this package import "./style.css" import FullCalendar from "@fullcalendar/react" @@ -20,7 +22,7 @@ import timeGridPlugin from "@fullcalendar/timegrid" import type { ViewApi } from "@fullcalendar/core" import { cssVar } from "polished" -export default function Widget(props: AllWidgetProps) { +export default function Widget (props: AllWidgetProps) { const { config } = props const [datasources, setDatasources] = React.useState([]) // Store events keyed by datasource ID to support multiple datasources @@ -133,7 +135,7 @@ export default function Widget(props: AllWidgetProps) { } } - const handleEventClick = (clickInfo) => { + const handleEventClick = (clickInfo: any) => { const eventDs = clickInfo.event.extendedProps.dataSource as DataSource const originalId = clickInfo.event.extendedProps.originalId as string eventDs.selectRecordsByIds([originalId]) @@ -190,6 +192,11 @@ export default function Widget(props: AllWidgetProps) { ...prev, [matchedDataSource.dataSourceId]: queryParams.where })) + const message = new DataSourceFilterChangeMessage( + props.widgetId, + [matchedDataSource.dataSourceId] + ) + MessageManager.getInstance().publishMessage(message) }) } @@ -276,7 +283,7 @@ export default function Widget(props: AllWidgetProps) { return ( ) { +export default function Setting (props: AllWidgetSettingProps) { const { id, config } = props const [activeTab, setActiveTab] = React.useState( config?.dataSets?.[0]?.id @@ -62,7 +62,7 @@ export default function Setting(props: AllWidgetSettingProps) { return { ...rest, dataSourceId: legacyDataSource.dataSourceId } }) - const newConfig = (config || Immutable({})).set( + const newConfig = (config || Immutable.from({} as Config)).set( "dataSets", migratedDataSets ) @@ -85,7 +85,10 @@ export default function Setting(props: AllWidgetSettingProps) { ) if (datasetIndex === -1) return datasets[datasetIndex] = { ...datasets[datasetIndex], ...newData } - const newConfig = (config || Immutable({})).set("dataSets", datasets) + const newConfig = (config || Immutable.from({} as Config)).set( + "dataSets", + datasets + ) props.onSettingChange({ id, config: newConfig }) } @@ -97,7 +100,9 @@ export default function Setting(props: AllWidgetSettingProps) { const oldDataSourceId = dataset.dataSourceId // Remove old data source from widget-level useDataSources (if any) - let updatedWidgetDataSources = (props.useDataSources || []).filter( + let updatedWidgetDataSources: UseDataSource[] = [ + ...(props.useDataSources || []) + ].filter( (widgetDataSource) => widgetDataSource.dataSourceId !== oldDataSourceId ) @@ -119,18 +124,21 @@ export default function Setting(props: AllWidgetSettingProps) { datasets[datasetIndex] = { ...datasets[datasetIndex], dataSourceId: newDataSource?.dataSourceId, - labelField: undefined, - startDateField: undefined, - endDateField: undefined, - allDayField: undefined, - descriptionField: undefined, - colorsetField: undefined, + labelField: undefined as string | undefined, + startDateField: undefined as string | undefined, + endDateField: undefined as string | undefined, + allDayField: undefined as string | undefined, + descriptionField: undefined as string | undefined, + colorsetField: undefined as string | undefined, defaultEventColor: "#3788d8", colorsets: [] } } - const newConfig = (config || Immutable({})).set("dataSets", datasets) + const newConfig = (config || Immutable.from({} as Config)).set( + "dataSets", + datasets + ) props.onSettingChange({ id, @@ -142,7 +150,7 @@ export default function Setting(props: AllWidgetSettingProps) { } const addDataset = () => { - const newDataset = { + const newDataset: data = { id: `ds_${utils.getUUID()}`, labelField: undefined, startDateField: undefined, @@ -155,7 +163,10 @@ export default function Setting(props: AllWidgetSettingProps) { } const datasets = getDataSets() datasets.push(newDataset) - const newConfig = (config || Immutable({})).set("dataSets", datasets) + const newConfig = (config || Immutable.from({} as Config)).set( + "dataSets", + datasets + ) props.onSettingChange({ id, config: newConfig }) } @@ -164,12 +175,13 @@ export default function Setting(props: AllWidgetSettingProps) { const remainingDatasets = getDataSets().filter( (dataset: any) => dataset.id !== datasetId ) - const newConfig = (config || Immutable({})).set( + const newConfig = (config || Immutable.from({} as Config)).set( "dataSets", remainingDatasets ) - let updatedWidgetDataSources = props.useDataSources || [] + let updatedWidgetDataSources: UseDataSource[] = (props.useDataSources || + []) as UseDataSource[] if (toRemove?.dataSourceId) { const stillUsed = remainingDatasets.some( (dataset) => dataset.dataSourceId === toRemove.dataSourceId @@ -300,14 +312,14 @@ export default function Setting(props: AllWidgetSettingProps) { (dataset: ImmutableObject, datasetIndex: number) => { // Key change! const datasetUseDataSources = dataset.dataSourceId - ? Immutable( + ? Immutable.from( (props.useDataSources || []).filter( (widgetDataSource) => widgetDataSource.dataSourceId === dataset.dataSourceId ) ) - : Immutable([]) + : Immutable.from([] as UseDataSource[]) return ( ) { > ) { }} selectedFields={ dataset?.labelField - ? Immutable([dataset.labelField]) + ? Immutable.from([dataset.labelField]) : datasetUseDataSources?.[0]?.fields } /> @@ -376,7 +388,7 @@ export default function Setting(props: AllWidgetSettingProps) { }} selectedFields={ dataset?.startDateField - ? Immutable([dataset.startDateField]) + ? Immutable.from([dataset.startDateField]) : datasetUseDataSources?.[0]?.fields } /> @@ -400,7 +412,7 @@ export default function Setting(props: AllWidgetSettingProps) { }} selectedFields={ dataset?.endDateField - ? Immutable([dataset.endDateField]) + ? Immutable.from([dataset.endDateField]) : datasetUseDataSources?.[0]?.fields } /> @@ -424,7 +436,7 @@ export default function Setting(props: AllWidgetSettingProps) { }} selectedFields={ dataset?.allDayField - ? Immutable([dataset.allDayField]) + ? Immutable.from([dataset.allDayField]) : datasetUseDataSources?.[0]?.fields } /> @@ -449,7 +461,7 @@ export default function Setting(props: AllWidgetSettingProps) { }} selectedFields={ dataset?.descriptionField - ? Immutable([dataset.descriptionField]) + ? Immutable.from([dataset.descriptionField]) : datasetUseDataSources?.[0]?.fields } /> @@ -500,7 +512,9 @@ export default function Setting(props: AllWidgetSettingProps) { }} selectedFields={ dataset?.colorsetField - ? Immutable([dataset.colorsetField]) + ? Immutable.from([ + dataset.colorsetField + ]) : datasetUseDataSources?.[0]?.fields } /> diff --git a/CamViewer/src/runtime/widget.tsx b/CamViewer/src/runtime/widget.tsx index e237418..d33428e 100644 --- a/CamViewer/src/runtime/widget.tsx +++ b/CamViewer/src/runtime/widget.tsx @@ -3,6 +3,7 @@ import type { IMConfig } from '../config' import defaultMessages from './translations/default' import { JimuMapViewComponent, type JimuMapView, type JimuLayerView } from 'jimu-arcgis' import { Button, Icon } from 'jimu-ui' +// @ts-expect-error - No types available for this package import './style.css' import { useCallback, useState } from 'react' import { createPortal } from 'react-dom' @@ -11,7 +12,7 @@ import { createPortal } from 'react-dom' // Run npm install hls.js in your client directory to install. import Hls from 'hls.js' -export default function Widget(props: AllWidgetProps) { +export default function Widget (props: AllWidgetProps) { const { useDataSources, useMapWidgetIds } = props const [jimuMapView, setJimuMapView] = React.useState(null) @@ -42,11 +43,10 @@ export default function Widget(props: AllWidgetProps) { setCurrentURL(url) setShowVideo(true) } - return null } // Draggable, resizable, closable video portal - const handleMouseMove = (e) => { + const handleMouseMove = (e: MouseEvent) => { if (dragging) { setVideoPos({ x: e.clientX - dragOffset.x, y: e.clientY - dragOffset.y }) } else if (resizing) { diff --git a/CamViewer/src/setting/setting.tsx b/CamViewer/src/setting/setting.tsx index a81f63f..93d32d9 100644 --- a/CamViewer/src/setting/setting.tsx +++ b/CamViewer/src/setting/setting.tsx @@ -18,7 +18,7 @@ import { } from "jimu-ui/advanced/data-source-selector" import { IconPicker } from "jimu-ui/advanced/resource-selector" -export default function Setting(props: AllWidgetSettingProps) { +export default function Setting (props: AllWidgetSettingProps) { const onMapSelected = (useMapWidgetIds: string[]) => { props.onSettingChange({ id: props.id, @@ -47,7 +47,7 @@ export default function Setting(props: AllWidgetSettingProps) { }) } - const onIconChange = (icon) => { + const onIconChange = (icon: any) => { props.onSettingChange({ id: props.id, config: { @@ -77,7 +77,7 @@ export default function Setting(props: AllWidgetSettingProps) { ) { +export default function Widget (props: AllWidgetProps) { const { config, useMapWidgetIds } = props const [jimuMapView, setJimuMapView] = React.useState(null) const [layerVis, setLayerVis] = useState(false) @@ -20,7 +21,7 @@ export default function Widget(props: AllWidgetProps) { let toggleLayers = [] const [activeLayerIds, setActiveLayerIds] = useState([]) - let timer + let timer: any = null const isConfigured = useMapWidgetIds?.length > 0 @@ -55,10 +56,10 @@ export default function Widget(props: AllWidgetProps) { setActiveName(selectedRecords[0].getFieldValue(config.nameField)) toggleArr = selectedRecords[0].getFieldValue(config.toggleItemUrlArrayField).split(',') setNumLayer(toggleArr.length) - const layers = [] - const layerIds = [] + const layers: any = [] + const layerIds: any = [] - toggleArr.forEach((item, idx) => { + toggleArr.forEach((item: any, idx: any) => { layers.push( new FeatureLayer({ url: selectedRecords[0].getFieldValue(config.toggleBaseUrlField) + "/" + item, @@ -101,12 +102,13 @@ export default function Widget(props: AllWidgetProps) { ) } - const dataRender = (ds: DataSource, info: IMDataSourceInfo) => { + const dataRender = (ds: DataSource, info: IMDataSourceInfo): null => { const selectedRecords = ds.getSelectedRecords() if (selectedRecords.length <= 0) { return null } handleFIMChange(selectedRecords) + return null } const sliderPortal = (layerVis && activeName) ? createPortal( @@ -153,7 +155,7 @@ export default function Widget(props: AllWidgetProps) { calcite-hydrated style={{ width: '90%', marginLeft: 'auto', marginRight: 'auto', marginTop: 30 }} onCalciteSliderInput={ - (e) => { handleViewChange(activeLayerIds, ("sixseven" + e.target.value)) } + (e: any) => { handleViewChange(activeLayerIds, ("sixseven" + e.target.value)) } } /> , diff --git a/FIMLS/src/setting/setting.tsx b/FIMLS/src/setting/setting.tsx index b23ccdd..4c36b8d 100644 --- a/FIMLS/src/setting/setting.tsx +++ b/FIMLS/src/setting/setting.tsx @@ -5,9 +5,10 @@ import { DataSourceSelector, FieldSelector } from 'jimu-ui/advanced/data-source- import type { IMConfig } from '../config' import { JimuMapViewComponent, type JimuMapView } from 'jimu-arcgis' import defaultMessages from './translations/default' +// @ts-expect-error - No types available for this package import './style.css' -export default function Setting(props: AllWidgetSettingProps) { +export default function Setting (props: AllWidgetSettingProps) { const { id, config, useMapWidgetIds } = props const [jimuMapView, setJimuMapView] = React.useState(null) @@ -28,7 +29,7 @@ export default function Setting(props: AllWidgetSettingProps) { // Save field selection to widget config under separate keys so each FieldSelector is independent const onFieldChange = (key: string, fields: IMFieldSchema[]) => { const fieldName = fields?.[0]?.jimuName ?? null - const newConfig = (config || Immutable({})).set(key, fieldName) + const newConfig = (config || Immutable.from({})).set(key, fieldName) props.onSettingChange({ id, config: newConfig }) } @@ -55,7 +56,7 @@ export default function Setting(props: AllWidgetSettingProps) { ) { isMultiple={false} isDataSourceDropDownHidden={true} onChange={(fields) => { onFieldChange('toggleBaseUrlField', fields) }} - selectedFields={config?.toggleBaseUrlField ? Immutable([config.toggleBaseUrlField]) : props.useDataSources?.[0]?.fields} + selectedFields={config?.toggleBaseUrlField ? Immutable.from([config.toggleBaseUrlField]) : props.useDataSources?.[0]?.fields} /> @@ -84,7 +85,7 @@ export default function Setting(props: AllWidgetSettingProps) { isMultiple={false} isDataSourceDropDownHidden={true} onChange={(fields) => { onFieldChange('toggleItemUrlArrayField', fields) }} - selectedFields={config?.toggleItemUrlArrayField ? Immutable([config.toggleItemUrlArrayField]) : props.useDataSources?.[0]?.fields} + selectedFields={config?.toggleItemUrlArrayField ? Immutable.from([config.toggleItemUrlArrayField]) : props.useDataSources?.[0]?.fields} /> @@ -97,7 +98,7 @@ export default function Setting(props: AllWidgetSettingProps) { isMultiple={false} isDataSourceDropDownHidden={true} onChange={(fields) => { onFieldChange('constantUrlArrayField', fields) }} - selectedFields={config?.constantUrlArrayField ? Immutable([config.constantUrlArrayField]) : props.useDataSources?.[0]?.fields} + selectedFields={config?.constantUrlArrayField ? Immutable.from([config.constantUrlArrayField]) : props.useDataSources?.[0]?.fields} /> @@ -110,7 +111,7 @@ export default function Setting(props: AllWidgetSettingProps) { isMultiple={false} isDataSourceDropDownHidden={true} onChange={(fields) => { onFieldChange('nameField', fields) }} - selectedFields={config?.nameField ? Immutable([config.nameField]) : props.useDataSources?.[0]?.fields} + selectedFields={config?.nameField ? Immutable.from([config.nameField]) : props.useDataSources?.[0]?.fields} /> @@ -123,7 +124,7 @@ export default function Setting(props: AllWidgetSettingProps) { isMultiple={false} isDataSourceDropDownHidden={true} onChange={(fields) => { onFieldChange('minHeightField', fields) }} - selectedFields={config?.minHeightField ? Immutable([config.minHeightField]) : props.useDataSources?.[0]?.fields} + selectedFields={config?.minHeightField ? Immutable.from([config.minHeightField]) : props.useDataSources?.[0]?.fields} /> @@ -136,7 +137,7 @@ export default function Setting(props: AllWidgetSettingProps) { isMultiple={false} isDataSourceDropDownHidden={true} onChange={(fields) => { onFieldChange('maxHeightField', fields) }} - selectedFields={config?.maxHeightField ? Immutable([config.maxHeightField]) : props.useDataSources?.[0]?.fields} + selectedFields={config?.maxHeightField ? Immutable.from([config.maxHeightField]) : props.useDataSources?.[0]?.fields} /> diff --git a/FIMLS/src/setting/utils.ts b/FIMLS/src/setting/utils.ts index 9c6096d..ab3655f 100644 --- a/FIMLS/src/setting/utils.ts +++ b/FIMLS/src/setting/utils.ts @@ -1,22 +1,22 @@ -import type { JimuMapView } from "jimu-arcgis" +import type { JimuMapView } from 'jimu-arcgis' +import type Layer from 'esri/layers/Layer' -export function getLayersFromJimuMapView( - jimuMapView: JimuMapView -): __esri.Layer[] { - const layers = [] - const collectLayers = (layerCollection) => { - layerCollection.forEach((layer) => { - layers.push(layer) - if (layer.layers) { - collectLayers(layer.layers) - } - if (layer.sublayers) { - collectLayers(layer.sublayers) - } - }) - } - if (jimuMapView?.view?.map?.allLayers) { - collectLayers(jimuMapView.view.map.allLayers) - } - return layers -} + +export function getLayersFromJimuMapView (jimuMapView: JimuMapView): Layer[] { + const layers: Layer[] = [] + const collectLayers = (layerCollection: { forEach: (callback: (layer: any) => void) => void }) => { + layerCollection.forEach((layer: any) => { + layers.push(layer) + if (layer.layers) { + collectLayers(layer.layers) + } + if (layer.sublayers) { + collectLayers(layer.sublayers) + } + }) + } + if (jimuMapView?.view?.map?.allLayers) { + collectLayers(jimuMapView.view.map.allLayers) + } + return layers +} \ No newline at end of file diff --git a/MDPrint/src/runtime/formatUtils.ts b/MDPrint/src/runtime/formatUtils.ts index 624d329..b44e466 100644 --- a/MDPrint/src/runtime/formatUtils.ts +++ b/MDPrint/src/runtime/formatUtils.ts @@ -13,7 +13,7 @@ import FeatureLayer from "esri/layers/FeatureLayer" formatDate($feature.dateField, 'YYYY-MM-DD HH:mm:ss') => 2024-01-01 13:00:00 */ const formatDate = (date: Date, format: string) => { - const map = { + const map: { [key: string]: string | number } = { MMMMM: date.toLocaleString("default", { month: "long" }), MMM: date.toLocaleString("default", { month: "short" }), MM: ("0" + (date.getMonth() + 1)).slice(-2), @@ -35,7 +35,7 @@ const formatDate = (date: Date, format: string) => { return format.replace( /MMMMM|MMM|MM|M|DDDD|DDD|DD|D|YYYY|YY|hh|h|HH|H|mm|ss|A/g, - (matched) => map[matched] + (matched) => String(map[matched]) ) } diff --git a/MDPrint/src/runtime/widget.tsx b/MDPrint/src/runtime/widget.tsx index 91729b9..ebe2e31 100644 --- a/MDPrint/src/runtime/widget.tsx +++ b/MDPrint/src/runtime/widget.tsx @@ -26,9 +26,10 @@ import { CalciteSelect } from "calcite-components" import { handlePrint } from "./formatUtils" +// @ts-expect-error - No types available for this package import "./style.css" -export default function Widget(props: AllWidgetProps) { +export default function Widget (props: AllWidgetProps) { const { config } = props // Store datasources keyed by datasource ID to avoid duplicates const [datasources, setDatasources] = React.useState<{ @@ -340,7 +341,7 @@ export default function Widget(props: AllWidgetProps) { (t) => t.id === selectedTemplateId ) if (template) { - doPrint(Immutable(template)) + doPrint(Immutable.from(template)) } }} > @@ -350,7 +351,7 @@ export default function Widget(props: AllWidgetProps) { {uniqueUseDataSources.map((uds) => ( ) { +export default function Setting (props: AllWidgetSettingProps) { const { id, config } = props const [activeTab, setActiveTab] = React.useState( config?.PrintTemplates?.[0]?.id @@ -29,7 +29,7 @@ export default function Setting(props: AllWidgetSettingProps) { const index = arr.findIndex((template: any) => template.id === templateId) if (index === -1) return arr[index] = { ...arr[index], ...newData } - const newConfig = (config || Immutable({})).set("PrintTemplates", arr) + const newConfig = (config || Immutable.from({})).set("PrintTemplates", arr) props.onSettingChange({ id, config: newConfig }) } @@ -43,13 +43,13 @@ export default function Setting(props: AllWidgetSettingProps) { } const arr = getTemplates() arr.push(newTemplate) - const newConfig = (config || Immutable({})).set("PrintTemplates", arr) + const newConfig = (config || Immutable.from({})).set("PrintTemplates", arr) props.onSettingChange({ id, config: newConfig }) } const removePrintTemplate = (templateId: string) => { const arr = getTemplates().filter((t: any) => t.id !== templateId) - const newConfig = (config || Immutable({})).set("PrintTemplates", arr) + const newConfig = (config || Immutable.from({})).set("PrintTemplates", arr) props.onSettingChange({ id, config: newConfig }) } /* @@ -107,7 +107,7 @@ export default function Setting(props: AllWidgetSettingProps) { flow="wrap" > }` tokens in `text` with the matching entry * from `values`. Tokens without a matching key are left unchanged. */ -export function resolveExpressions( +export function resolveExpressions ( text: string | undefined | null, values: { [key: string]: string } ): string { @@ -150,7 +150,7 @@ export function resolveExpressions( * Build the string value map used in expression resolution for an indicator, * given pre-computed values and the widget config. */ -export function buildExpressionValues( +export function buildExpressionValues ( computed: ComputedValues, config: Pick< Config, @@ -215,7 +215,7 @@ export function buildExpressionValues( * Merge two WHERE clauses with AND. * "1=1" is treated as "no filter" and is omitted from the result. */ -export function mergeWhereClauses(a: string, b: string): string { +export function mergeWhereClauses (a: string, b: string): string { const cleanA = !a || a === "1=1" ? "" : a const cleanB = !b || b === "1=1" ? "" : b if (!cleanA && !cleanB) return "1=1" @@ -244,7 +244,7 @@ export interface ActiveStyles { * the value is below the reference. When `isBelow` is true, the "Below" * variant from config is used (falling back to the default if unset). */ -export function getActiveStyles( +export function getActiveStyles ( config: Pick< Config, | "topText" @@ -295,7 +295,7 @@ export function getActiveStyles( // ── Relative time ───────────────────────────────────────────────────────────── -export function relativeTime(date: Date): string { +export function relativeTime (date: Date): string { const diff = Math.floor((Date.now() - date.getTime()) / 1000) if (diff < 60) return "Updated just now" if (diff < 3600) return `Updated ${Math.floor(diff / 60)}m ago` diff --git a/indicator/src/runtime/widget.tsx b/indicator/src/runtime/widget.tsx index cbbbcee..fdd8ef6 100644 --- a/indicator/src/runtime/widget.tsx +++ b/indicator/src/runtime/widget.tsx @@ -304,7 +304,7 @@ const FeaturePager = ({ // ── Widget ──────────────────────────────────────────────────────────────────── -export default function Widget(props: AllWidgetProps) { +export default function Widget (props: AllWidgetProps) { const { config, useDataSources } = props // ── State ────────────────────────────────────────────────────────────── @@ -385,11 +385,11 @@ export default function Widget(props: AllWidgetProps) { // ── Callbacks ────────────────────────────────────────────────────────── const handleMainDsCreated = React.useCallback((ds: DataSource) => { - mainDsRef.current = ds as ArcGISQueriableDataSource + mainDsRef.current = ds as unknown as ArcGISQueriableDataSource setMainTrigger((v) => v + 1) }, []) const handleRefDsCreated = React.useCallback((ds: DataSource) => { - refDsRef.current = ds as ArcGISQueriableDataSource + refDsRef.current = ds as unknown as ArcGISQueriableDataSource setRefTrigger((v) => v + 1) }, []) const handleMainQueryRequired = React.useCallback(() => { diff --git a/indicator/src/setting/number-format-setting.tsx b/indicator/src/setting/number-format-setting.tsx index 7c23692..507d57c 100644 --- a/indicator/src/setting/number-format-setting.tsx +++ b/indicator/src/setting/number-format-setting.tsx @@ -12,7 +12,7 @@ interface NumberFormatSettingProps { intl: any } -export default function NumberFormatSetting({ +export default function NumberFormatSetting ({ prefix, config, onChange, diff --git a/indicator/src/setting/setting.tsx b/indicator/src/setting/setting.tsx index 1b15a2a..4ba7230 100644 --- a/indicator/src/setting/setting.tsx +++ b/indicator/src/setting/setting.tsx @@ -30,7 +30,7 @@ import { import TextStyleSetting from "./text-style-setting" import NumberFormatSetting from "./number-format-setting" -export default function Setting(props: AllWidgetSettingProps) { +export default function Setting (props: AllWidgetSettingProps) { const { id, config, onSettingChange } = props const [expressionvisibility, setExpressionVisibility] = React.useState(false) const [refExpressionVisibility, setRefExpressionVisibility] = @@ -276,12 +276,12 @@ export default function Setting(props: AllWidgetSettingProps) { > ) { ) { (config.indType === "Statistic" && config.mainStatisticType !== "count") || config.indType === "Feature" - ? Immutable([ + ? Immutable.from([ "NUMBER" as JimuFieldType, "DATE" as JimuFieldType, "DATE_ONLY" as JimuFieldType, @@ -567,12 +567,12 @@ export default function Setting(props: AllWidgetSettingProps) { <> ) { ) { types={ config.refStatisticType === "count" ? undefined - : Immutable([ + : Immutable.from([ "NUMBER" as JimuFieldType, "DATE" as JimuFieldType, "DATE_ONLY" as JimuFieldType, @@ -761,8 +761,8 @@ export default function Setting(props: AllWidgetSettingProps) { ) { }} selectedFields={ props.useDataSources?.[0]?.fields?.[1] - ? Immutable([props.useDataSources[0].fields[1]]) - : Immutable([]) + ? Immutable.from([props.useDataSources[0].fields[1]]) + : Immutable.from([]) } - types={Immutable([ + types={Immutable.from([ "NUMBER" as JimuFieldType, "DATE" as JimuFieldType, "DATE_ONLY" as JimuFieldType, diff --git a/indicator/src/setting/text-style-setting.tsx b/indicator/src/setting/text-style-setting.tsx index c2696f1..d524812 100644 --- a/indicator/src/setting/text-style-setting.tsx +++ b/indicator/src/setting/text-style-setting.tsx @@ -50,7 +50,7 @@ interface TextStyleSettingProps { intl: any } -export default function TextStyleSetting({ +export default function TextStyleSetting ({ prefix, suffix = "", label, diff --git a/new-radar/src/runtime/assets/sw-radar.js b/new-radar/src/runtime/assets/sw-radar.js index 8bff383..31f65b1 100644 --- a/new-radar/src/runtime/assets/sw-radar.js +++ b/new-radar/src/runtime/assets/sw-radar.js @@ -9,7 +9,7 @@ self.addEventListener('activate', (event) => { event.waitUntil(self.clients.claim()) }) -function canonicalizeWmsUrl(rawUrl) { +function canonicalizeWmsUrl (rawUrl) { try { const u = new URL(rawUrl) // keep origin + pathname, sort search params for a canonical key diff --git a/new-radar/src/runtime/radar-utils.ts b/new-radar/src/runtime/radar-utils.ts index 37ff0e7..b8b7b25 100644 --- a/new-radar/src/runtime/radar-utils.ts +++ b/new-radar/src/runtime/radar-utils.ts @@ -7,6 +7,7 @@ */ import WMSLayer from "@arcgis/core/layers/WMSLayer.js" +import type MapView from "esri/views/MapView" import { fetchWmsCapabilities, buildGetMapUrl } from "./wms-utils" import type React from "react" @@ -29,8 +30,8 @@ export const MAX_FRAMES = 30 /** * Wait until the MapView is ready with valid extent and dimensions */ -export async function waitForViewReady( - view: __esri.MapView, +export async function waitForViewReady ( + view: MapView, timeout = 15000 ): Promise { const start = Date.now() @@ -40,14 +41,14 @@ export async function waitForViewReady( (!view.extent || (view.width === 0 && view.height === 0)) && Date.now() - start < timeout ) { - await new Promise((resolve) => setTimeout(resolve, 200)) + await new Promise((resolve) => { setTimeout(resolve, 200) }) } } /** * Register service worker for caching */ -export async function registerServiceWorker(): Promise { +export async function registerServiceWorker (): Promise { if (!("serviceWorker" in navigator) || !("caches" in window)) { console.debug("ServiceWorker or Cache API not available") return @@ -65,9 +66,9 @@ export async function registerServiceWorker(): Promise { /** * Prefetch frames for the current extent */ -export async function prefetchFrames( +export async function prefetchFrames ( frameList: string[], - view: __esri.MapView, + view: MapView, wmsBase: string, layerName: string, setStatusText: (text: string) => void @@ -102,11 +103,11 @@ export async function prefetchFrames( /** * Refresh times from WMS capabilities */ -export async function refreshTimes(params: { +export async function refreshTimes (params: { framesRef: React.RefObject idxRef: React.RefObject sliderRef: React.RefObject - view: __esri.MapView + view: MapView wmsBase: string layerName: string setFrames: (frames: string[]) => void @@ -166,7 +167,7 @@ export async function refreshTimes(params: { /** * Apply a specific frame to the WMS layer */ -export function applyFrame( +export function applyFrame ( frameIndex: number, framesRef: React.RefObject, wmsRef: React.RefObject, @@ -194,7 +195,7 @@ export function applyFrame( /** * Create animation control functions */ -export function createAnimationControls( +export function createAnimationControls ( intervalRef: React.RefObject, idxRef: React.RefObject, framesRef: React.RefObject, @@ -233,8 +234,8 @@ export function createAnimationControls( /** * Add fallback WMSLayer when primary WMS fails */ -export function addFallbackLayer( - view: __esri.MapView, +export function addFallbackLayer ( + view: MapView, setStatusText: (text: string) => void ): void { try { @@ -256,7 +257,7 @@ export function addFallbackLayer( /** * Cleanup all timers and handles */ -export function cleanup( +export function cleanup ( intervalRef: React.RefObject, refreshTimerIdRef: React.RefObject, panZoomTimerRef: React.RefObject, diff --git a/new-radar/src/runtime/widget.tsx b/new-radar/src/runtime/widget.tsx index 6815b7f..7c080b1 100644 --- a/new-radar/src/runtime/widget.tsx +++ b/new-radar/src/runtime/widget.tsx @@ -7,6 +7,7 @@ import { CalciteTooltip } from "@esri/calcite-components-react" import WMSLayer from "@arcgis/core/layers/WMSLayer.js" +// @ts-expect-error - No types available for this package import "./style.css" import { JimuMapViewComponent, type JimuMapView } from "jimu-arcgis" import { @@ -27,6 +28,8 @@ import { cleanup } from "./radar-utils" import type { IMConfig } from "../config" +import * as reactiveUtils from "esri/core/reactiveUtils" +import type MapView from "esri/views/MapView" // ============================================================================= // CUSTOM HOOKS @@ -36,7 +39,7 @@ import type { IMConfig } from "../config" * Combines useState and useRef to avoid stale closure issues in intervals/callbacks * while still triggering React re-renders when needed */ -function useRefState( +function useRefState ( initialValue: T ): [T, React.RefObject, (value: T) => void] { const [state, setState] = React.useState(initialValue) @@ -54,7 +57,7 @@ function useRefState( // COMPONENT // ============================================================================= -export default function Widget(props: AllWidgetProps) { +export default function Widget (props: AllWidgetProps) { // ------------------------------------------------------------------------- // State and Refs // ------------------------------------------------------------------------- @@ -151,9 +154,9 @@ export default function Widget(props: AllWidgetProps) { React.useEffect(() => { if (!wmsBase || !layerName || !jimuMapView) return - let view: __esri.MapView - ;(async function init() { - view = (await jimuMapView.whenJimuMapViewLoaded()).view as __esri.MapView + let view: MapView + ;(async function init () { + view = (await jimuMapView.whenJimuMapViewLoaded()).view as MapView setStatusText("Status: loading...") try { // --- Fetch WMS capabilities and create layer --- @@ -252,13 +255,12 @@ export default function Widget(props: AllWidgetProps) { }, delay) } - viewWatchHandleRef.current = - view.watch?.("stationary", (isStationary) => { + viewWatchHandleRef.current = reactiveUtils.watch( + () => view.stationary, + (isStationary) => { if (isStationary) schedulePrefetch(600) - }) ?? - view.on?.("stationary", () => { - schedulePrefetch(600) - }) + } + ) // --- Initial prefetch after view is ready --- await waitForViewReady(view) @@ -375,7 +377,7 @@ export default function Widget(props: AllWidgetProps) { min={0} max={Math.max(0, frames.length - 1)} value={idx} - onCalciteSliderInput={(e) => { + onCalciteSliderInput={(e: any) => { const val = Number(e.target.value) setIdx(val) applyFrameRef.current?.(val) @@ -417,7 +419,7 @@ export default function Widget(props: AllWidgetProps) { step={1} ticks={1} snap - onCalciteSliderInput={(e) => { + onCalciteSliderInput={(e: any) => { setPlaySpeed(e.target.value as number) restartAnimationRef.current?.() }} @@ -429,7 +431,7 @@ export default function Widget(props: AllWidgetProps) { { + onCalciteSelectChange={(e: any) => { jimuMapView.view.map.remove(wmsRef.current) setPlaying(false) setLayerName(e.target.value) diff --git a/new-radar/src/runtime/wms-utils.ts b/new-radar/src/runtime/wms-utils.ts index 06ab9de..0472492 100644 --- a/new-radar/src/runtime/wms-utils.ts +++ b/new-radar/src/runtime/wms-utils.ts @@ -7,6 +7,8 @@ */ import esriRequest from "@arcgis/core/request" +import type Extent from "esri/geometry/Extent" +import type MapView from "esri/views/MapView" // WMS XML namespace (used by some servers; others omit the namespace) export const WMS_NS = "http://www.opengis.net/wms" @@ -16,7 +18,7 @@ export const WMS_NS = "http://www.opengis.net/wms" * Many WMS servers (e.g. GeoServer) include the OGC namespace, while others * (e.g. the NESDIS fire portal) emit plain XML without a namespace. */ -function getElementsByTag(parent: Element | Document, tag: string): Element[] { +function getElementsByTag (parent: Element | Document, tag: string): Element[] { // Try namespaced first let els = parent.getElementsByTagNameNS(WMS_NS, tag) if (els.length > 0) return Array.from(els) @@ -28,7 +30,7 @@ function getElementsByTag(parent: Element | Document, tag: string): Element[] { /** * Find a layer element in WMS capabilities XML by name */ -export function findLayerByName(xml: Document, layerName: string): Element | null { +export function findLayerByName (xml: Document, layerName: string): Element | null { const layers = getElementsByTag(xml, "Layer") for (const layer of layers) { // Look for a direct child element @@ -45,7 +47,7 @@ export function findLayerByName(xml: Document, layerName: string): Element | nul /** * Parse an ISO 8601 duration string (e.g. "PT5M", "PT1H", "PT30S") to milliseconds. */ -export function parseIsoDuration(iso: string): number { +export function parseIsoDuration (iso: string): number { const match = iso.match( /^P(?:(\d+)D)?T?(?:(\d+)H)?(?:(\d+)M)?(?:(\d+(?:\.\d+)?)S)?$/ ) @@ -62,7 +64,7 @@ export function parseIsoDuration(iso: string): number { * Many WMS servers (including the NESDIS fire portal) reject millisecond * precision that JavaScript's Date.toISOString() produces (.000Z). */ -function formatWmsTime(date: Date): string { +function formatWmsTime (date: Date): string { const pad = (n: number) => String(n).padStart(2, "0") return ( date.getUTCFullYear() + @@ -84,7 +86,7 @@ function formatWmsTime(date: Date): string { * Expand an ISO 8601 time interval (start/end/period) into discrete timestamps. * Only generates the last `maxFrames` timestamps to avoid creating huge arrays. */ -export function expandTimeInterval( +export function expandTimeInterval ( intervalStr: string, maxFrames: number ): string[] { @@ -112,7 +114,7 @@ export function expandTimeInterval( /** * Parse comma-separated times from a text string */ -export function parseTimesFromText(text: string): string[] { +export function parseTimesFromText (text: string): string[] { const trimmed = text.trim() // Check if it's an ISO 8601 time interval (start/end/period) @@ -131,7 +133,7 @@ export function parseTimesFromText(text: string): string[] { * Extract time dimension values from a WMS layer element. * Checks both and elements for time data. */ -export function extractTimesFromLayer(layer: Element | null): string[] { +export function extractTimesFromLayer (layer: Element | null): string[] { if (!layer) return [] // Try @@ -158,7 +160,7 @@ export function extractTimesFromLayer(layer: Element | null): string[] { /** * Fetch and parse WMS capabilities, returning times for a specific layer */ -export async function fetchWmsCapabilities( +export async function fetchWmsCapabilities ( wmsBase: string, layerName: string ): Promise<{ layer: Element | null; times: string[] }> { @@ -176,7 +178,7 @@ export async function fetchWmsCapabilities( /** * Format a timestamp for display - either as relative time or localized string */ -export function formatTimestamp(tsText: string, useRelative: boolean): string { +export function formatTimestamp (tsText: string, useRelative: boolean): string { if (tsText === "—") return tsText const dt = new Date(tsText) if (useRelative) { @@ -189,10 +191,10 @@ export function formatTimestamp(tsText: string, useRelative: boolean): string { /** * Build a WMS GetMap URL for a specific time frame */ -export function buildGetMapUrl( +export function buildGetMapUrl ( wmsBase: string, layerName: string, - extent: __esri.Extent, + extent: Extent, width: number, height: number, time: string @@ -224,7 +226,7 @@ export function buildGetMapUrl( * Get a unique key representing the current map extent and size. * Useful for detecting when the view has changed and prefetch is needed. */ -export function getExtentKey(view: __esri.MapView): string { +export function getExtentKey (view: MapView): string { try { const e = view.extent if (!e) return "" diff --git a/new-radar/src/setting/setting.tsx b/new-radar/src/setting/setting.tsx index f019216..d06a968 100644 --- a/new-radar/src/setting/setting.tsx +++ b/new-radar/src/setting/setting.tsx @@ -8,10 +8,11 @@ import { React } from "jimu-core" import type { IMConfig } from "../config" import { Option, Select } from "jimu-ui" import { JimuMapViewComponent, type JimuMapView } from "jimu-arcgis" +import type Layer from "esri/layers/Layer" -export default function Setting(props: AllWidgetSettingProps) { +export default function Setting (props: AllWidgetSettingProps) { const [jimuMapView, setJimuMapView] = React.useState(null) - const [layers, setLayers] = React.useState<__esri.Layer[]>(null) + const [layers, setLayers] = React.useState(null) const onMapSelected = (useMapWidgetIds: string[]) => { props.onSettingChange({ diff --git a/slider-filter/src/runtime/widget.tsx b/slider-filter/src/runtime/widget.tsx index 9211307..4f68107 100644 --- a/slider-filter/src/runtime/widget.tsx +++ b/slider-filter/src/runtime/widget.tsx @@ -5,25 +5,27 @@ import { type FeatureLayerQueryParams } from "jimu-core" import noUiSlider, { type API as NoUiSliderAPI, PipsMode } from "nouislider" +// @ts-expect-error - No types available for this package import "nouislider/dist/nouislider.css" import type { IMConfig } from "../config" +// @ts-expect-error - No types available for this package import "./style.css" import { Paper } from "jimu-ui" const { useState, useCallback, useRef, useMemo, useEffect } = React /** Format a number with comma separators. */ -function formatNumber(val: number): string { +function formatNumber (val: number): string { return val.toLocaleString() } /** Format a date/epoch for display. */ -function formatDate(val: number | Date): string { +function formatDate (val: number | Date): string { const d = typeof val === "number" ? new Date(val) : val return d.toLocaleDateString() } -export default function Widget(props: AllWidgetProps) { +export default function Widget (props: AllWidgetProps) { const { config, id: widgetId, useDataSources } = props const isConfigured = diff --git a/slider-filter/src/setting/setting.tsx b/slider-filter/src/setting/setting.tsx index 614d24a..5ef9168 100644 --- a/slider-filter/src/setting/setting.tsx +++ b/slider-filter/src/setting/setting.tsx @@ -24,7 +24,7 @@ import { NumericInput, Select, Switch, TextInput } from "jimu-ui" import { DatePicker } from "jimu-ui/basic/date-picker" import { ColorPicker } from "jimu-ui/basic/color-picker" -async function getFieldMinMax( +async function getFieldMinMax ( dataSource: QueriableDataSource, fieldName: string ): Promise<{ min: number; max: number } | null> { @@ -48,7 +48,7 @@ async function getFieldMinMax( return stats ? { min: stats.minValue, max: stats.maxValue } : null } -export default function Setting(props: AllWidgetSettingProps) { +export default function Setting (props: AllWidgetSettingProps) { const { id, config, onSettingChange } = props const [dataSource, setDataSource] = React.useState(null) const selectedField = props.useDataSources?.[0]?.fields?.[0] @@ -98,7 +98,7 @@ export default function Setting(props: AllWidgetSettingProps) { ) { useDataSources={props.useDataSources} useDropdown={true} isMultiple={false} - types={Immutable([ + types={Immutable.from([ "NUMBER" as JimuFieldType, "DATE" as JimuFieldType, "DATE_ONLY" as JimuFieldType, @@ -285,7 +285,7 @@ export default function Setting(props: AllWidgetSettingProps) { { value: "BOTTOM", content: "Bottom" } ]} value={config.minLabelPosition || "TOP"} - onChange={(value) => { + onChange={(value: any) => { onSettingChange({ id, config: { @@ -315,7 +315,7 @@ export default function Setting(props: AllWidgetSettingProps) { { value: "BOTTOM", content: "Bottom" } ]} value={config.maxLabelPosition || "TOP"} - onChange={(value) => { + onChange={(value: any) => { onSettingChange({ id, config: { From 2732498fede89d1afcf588b82d47be1ca2aa9697 Mon Sep 17 00:00:00 2001 From: Lucius Creamer Date: Tue, 7 Apr 2026 17:50:58 -0500 Subject: [PATCH 2/2] Updates to package.json files, to push the minor changes to npm. --- Calendar/package-lock.json | 4 ++-- Calendar/package.json | 2 +- CamViewer/package-lock.json | 12 ++++++------ CamViewer/package.json | 2 +- MDPrint/package-lock.json | 4 ++-- MDPrint/package.json | 2 +- indicator/package.json | 4 ++-- new-radar/package.json | 2 +- slider-filter/package-lock.json | 6 +++--- slider-filter/package.json | 4 ++-- 10 files changed, 21 insertions(+), 21 deletions(-) diff --git a/Calendar/package-lock.json b/Calendar/package-lock.json index 0622749..32250b7 100644 --- a/Calendar/package-lock.json +++ b/Calendar/package-lock.json @@ -1,12 +1,12 @@ { "name": "exb-calendar", - "version": "1.1.1", + "version": "1.1.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "exb-calendar", - "version": "1.1.1", + "version": "1.1.2", "license": "MIT", "dependencies": { "@fullcalendar/daygrid": "^6.1.20", diff --git a/Calendar/package.json b/Calendar/package.json index 4514f52..6ffbd63 100644 --- a/Calendar/package.json +++ b/Calendar/package.json @@ -1,6 +1,6 @@ { "name": "exb-calendar", - "version": "1.1.1", + "version": "1.1.2", "description": "A Calendar widget for Experience Builder Developer Edition", "license": "MIT", "author": "Lucius Creamer", diff --git a/CamViewer/package-lock.json b/CamViewer/package-lock.json index 9d7d4c0..69c19a9 100644 --- a/CamViewer/package-lock.json +++ b/CamViewer/package-lock.json @@ -1,13 +1,13 @@ { - "name": "camviewer", - "version": "1.0.0", + "name": "exb-camviewer", + "version": "1.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "camviewer", - "version": "1.0.0", - "license": "ISC", + "name": "exb-camviewer", + "version": "1.0.1", + "license": "MIT", "dependencies": { "hls.js": "^1.6.15" } @@ -19,4 +19,4 @@ "license": "Apache-2.0" } } -} +} \ No newline at end of file diff --git a/CamViewer/package.json b/CamViewer/package.json index f343d38..8f9f6c8 100644 --- a/CamViewer/package.json +++ b/CamViewer/package.json @@ -1,6 +1,6 @@ { "name": "exb-camviewer", - "version": "1.0.0", + "version": "1.0.1", "description": "A camera viewer, to view .m3u8 streams via a url in a feature layer.", "license": "MIT", "author": "Lucius Creamer", diff --git a/MDPrint/package-lock.json b/MDPrint/package-lock.json index 6480e0b..1713a99 100644 --- a/MDPrint/package-lock.json +++ b/MDPrint/package-lock.json @@ -1,12 +1,12 @@ { "name": "exb-mdprint", - "version": "1.0.1", + "version": "1.0.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "exb-mdprint", - "version": "1.0.1", + "version": "1.0.2", "license": "MIT", "dependencies": { "dompurify": "^3.3.1", diff --git a/MDPrint/package.json b/MDPrint/package.json index 4d5db6a..183e928 100644 --- a/MDPrint/package.json +++ b/MDPrint/package.json @@ -1,6 +1,6 @@ { "name": "exb-mdprint", - "version": "1.0.1", + "version": "1.0.2", "description": "A widget for printing a feature report client-side.", "license": "MIT", "author": "Lucius Creamer", diff --git a/indicator/package.json b/indicator/package.json index 474ed5f..6a9fe5e 100644 --- a/indicator/package.json +++ b/indicator/package.json @@ -1,6 +1,6 @@ { "name": "exb-indicator", - "version": "1.0.0", + "version": "1.0.1", "description": "A simple indicator widget for Experience Builder, based on the indicator widget from ArcGIS Dashboards.", "author": "Lucius Creamer", "license": "MIT", @@ -9,4 +9,4 @@ "experience-builder", "exb" ] -} +} \ No newline at end of file diff --git a/new-radar/package.json b/new-radar/package.json index 8fd0c16..579b3f4 100644 --- a/new-radar/package.json +++ b/new-radar/package.json @@ -1,6 +1,6 @@ { "name": "exb-new-radar", - "version": "1.0.0", + "version": "1.0.1", "description": "This is a simple widget to add a looping radar and controls to an existing map widget.", "author": "Lucius Creamer", "license": "MIT", diff --git a/slider-filter/package-lock.json b/slider-filter/package-lock.json index 98ab048..a8bbb62 100644 --- a/slider-filter/package-lock.json +++ b/slider-filter/package-lock.json @@ -1,12 +1,12 @@ { "name": "exb-slider-filter", - "version": "1.0.0", + "version": "1.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "exb-slider-filter", - "version": "1.0.0", + "version": "1.0.1", "license": "MIT", "dependencies": { "nouislider": "^15.8.1" @@ -19,4 +19,4 @@ "license": "MIT" } } -} +} \ No newline at end of file diff --git a/slider-filter/package.json b/slider-filter/package.json index e0e6f87..e3ec8e7 100644 --- a/slider-filter/package.json +++ b/slider-filter/package.json @@ -1,6 +1,6 @@ { "name": "exb-slider-filter", - "version": "1.0.0", + "version": "1.0.1", "description": "A simple slider filter widget for Experience Builder, idea from Jose Barrios.", "keywords": [ "exb-widget", @@ -21,4 +21,4 @@ "dependencies": { "nouislider": "^15.8.1" } -} +} \ No newline at end of file