diff --git a/buildScript/webpack.config.js b/buildScript/webpack.config.js index 58ae3b6ea7..45b9da7281 100644 --- a/buildScript/webpack.config.js +++ b/buildScript/webpack.config.js @@ -36,7 +36,7 @@ export default function makeWebpackConfig(config) { const MIN_CHROME_VERSION= '130'; const MIN_FIREFOX_VERSION= '134'; const MIN_EDGE_VERSION= '130'; - const useReactCompiler = false; + const useReactCompiler = true; if (!process.env.NODE_ENV) { process.env.NODE_ENV = ['local', 'dev'].includes(BUILD_ENV) ? 'development' : 'production'; diff --git a/src/firefly/js/ui/tap/Constraints.js b/src/firefly/js/ui/tap/Constraints.js index 2914986439..4631c3bb71 100644 --- a/src/firefly/js/ui/tap/Constraints.js +++ b/src/firefly/js/ui/tap/Constraints.js @@ -3,10 +3,23 @@ import React from 'react'; export const ConstraintContext = React.createContext({}); +export function hasAdqlConstraint(constraintObj) { + return Boolean( + constraintObj?.adqlConstraint || + constraintObj?.adqlConstraintsAry?.length + ); +} + +function getAdqlConstraintsList(constraintObj) { + if (constraintObj?.adqlConstraintsAry?.length) return constraintObj.adqlConstraintsAry; + if (constraintObj?.adqlConstraint) return [constraintObj.adqlConstraint]; + return []; +} + export function isTapUpload(tapBrowserState) { const {constraintFragments}= tapBrowserState; return [...constraintFragments.values()] - .some( (c) => Boolean(c.uploadFile && c.TAP_UPLOAD && c.adqlConstraint)); + .some((c) => Boolean(c.uploadFile && c.TAP_UPLOAD && hasAdqlConstraint(c))); } /** @@ -16,7 +29,8 @@ export function isTapUpload(tapBrowserState) { */ export function getUploadConstraint(tapBrowserState) { const {constraintFragments}= tapBrowserState; - return [...constraintFragments.values()].find( (c) => Boolean(c.uploadFile && c.TAP_UPLOAD && c.adqlConstraint)); + return [...constraintFragments.values()] + .find((c) => Boolean(c.uploadFile && c.TAP_UPLOAD && hasAdqlConstraint(c))); } export function getTapUploadSchemaEntry(tapBrowserState) { @@ -38,26 +52,17 @@ export function getHelperConstraints(tapBrowserState) { const {constraintFragments}= tapBrowserState; const adqlConstraints = []; const adqlConstraintErrorsArray = []; - const siaConstraints = []; - // adqlComponents can apparently be modified during iteration in the forEach... + Array.from(constraintFragments.values()).forEach((constraintObj) => { - if (!constraintObj.adqlConstraintErrors?.length) { - if (constraintObj.adqlConstraint) { - adqlConstraints.push(constraintObj.adqlConstraint); - } + if (!constraintObj?.constraintErrors?.length) { + adqlConstraints.push(...getAdqlConstraintsList(constraintObj)); } else { - adqlConstraintErrorsArray.push(constraintObj.constraintErrors); - } - if (!constraintObj.constraintErrors?.length) { - if (constraintObj.siaConstraints?.length > 0) { - siaConstraints.push(...constraintObj.siaConstraints); - } - } else { - adqlConstraintErrorsArray.push(constraintObj.constraintErrors); + adqlConstraintErrorsArray.push(...constraintObj.constraintErrors); } }); + return { - valid: adqlConstraintErrorsArray?.length === 0, + valid: adqlConstraintErrorsArray.length === 0, messages: adqlConstraintErrorsArray, where: adqlConstraints.join('\n AND ') }; diff --git a/src/firefly/js/ui/tap/SpatialSearch.jsx b/src/firefly/js/ui/tap/SpatialSearch.jsx index 6d4586e02e..d94f3a266e 100644 --- a/src/firefly/js/ui/tap/SpatialSearch.jsx +++ b/src/firefly/js/ui/tap/SpatialSearch.jsx @@ -28,12 +28,7 @@ import {DEF_TARGET_PANEL_KEY} from '../TargetPanel.jsx'; import {ConstraintContext} from './Constraints.js'; import {ROW_POSITION, SEARCH_POSITION} from './Cutout'; import {getDataServiceOption} from './DataServicesOptions'; -import { - DebugObsCore, - getPanelPrefix, - makeCollapsibleCheckHeader, - makeFieldErrorList, - makePanelStatusUpdater, +import {DebugObsCore, getPanelPrefix, makeCollapsibleCheckHeader, makeFieldErrorList, } from './TableSearchHelpers.jsx'; import {showUploadTableChooser} from '../UploadTableChooser.js'; import { @@ -134,7 +129,6 @@ export function SpatialSearch({sx, cols, serviceUrl, serviceLabel, serviceId, co const {setConstraintFragment}= useContext(ConstraintContext); const {setVal,getVal,makeFldObj}= useContext(FieldGroupCtx); - const [constraintResult, setConstraintResult] = useState({}); const [getUploadInfo, setUploadInfo]= useFieldGroupValue('uploadInfo'); const [posDefaultOpenMsg, setPosDefaultOpenMsg]= useState(true); @@ -142,8 +136,6 @@ export function SpatialSearch({sx, cols, serviceUrl, serviceLabel, serviceId, co const uploadInfo= getUploadInfo() || undefined; - const updatePanelStatus= makePanelStatusUpdater(checkHeaderCtl.isPanelActive(), Spatial); - useEffect(() => { if (!canUpload) setVal(SPATIAL_TYPE,SINGLE); }, [serviceUrl,canUpload]); @@ -236,15 +228,52 @@ export function SpatialSearch({sx, cols, serviceUrl, serviceLabel, serviceId, co useFieldGroupWatch([cornerCalcType], () => onChangeToPolygonMethod()); - useEffect(() => { - const constraints= makeSpatialConstraints(columnsModel, obsCoreEnabled, makeFldObj(fldListAry), uploadInfo, tableName, canUpload,useSIAv2); - updatePanelStatus(constraints, constraintResult, setConstraintResult,useSIAv2); - }); - + const targetWp = getVal(ServerParams.USER_TARGET_WORLD_PT); + const spatialRegOp = getVal(SpatialRegOp); + const spatialType = getVal(SPATIAL_TYPE); + const spatialMethodVal = getVal(SpatialMethod); + const radiusVal = getVal(RadiusSize); + const polygonCornersVal = getVal(PolygonCorners); + const centerLonVal = getVal(CenterLonColumns); + const centerLatVal = getVal(CenterLatColumns); + const uploadCenterLonVal = getVal(UploadCenterLonColumns); + const uploadCenterLatVal = getVal(UploadCenterLatColumns); + const cornerCalcTypeVal = getVal(cornerCalcType); + const closestVal = getVal(Closest); + + const isSpatialPanelActive = checkHeaderCtl?.isPanelActive(); + + const constraintResult = React.useMemo(() => { + + //when spatial panel is inactive, it should not contribute constraints or errors + if (!isSpatialPanelActive) { + return { + adqlConstraintsAry: [], + constraintErrors: [], + simpleError: '', + }; + } + + const constraints = makeSpatialConstraints( + columnsModel, obsCoreEnabled, makeFldObj(fldListAry), + uploadInfo, tableName, canUpload, useSIAv2 + ); + + return { + ...constraints, + constraintErrors: [...(constraints.errAry ?? [])], + simpleError: constraints.errAry?.[0] ?? '', + }; + }, [isSpatialPanelActive, columnsModel, obsCoreEnabled, uploadInfo, tableName, canUpload, + useSIAv2, targetWp, spatialRegOp, spatialType, spatialMethodVal, + radiusVal, polygonCornersVal, centerLonVal, centerLatVal, + uploadCenterLonVal, uploadCenterLatVal, cornerCalcTypeVal, closestVal, + ]); + useEffect(() => { setConstraintFragment(panelPrefix, constraintResult); return () => setConstraintFragment(panelPrefix, ''); - }, [constraintResult]); + }, [panelPrefix, setConstraintFragment, constraintResult]); if (disablePanel) { return ( @@ -321,13 +350,11 @@ function getSpacialLayoutMode(spacialType, obsCoreEnabled, canUpload) { const SpatialSearchLayout = ({initArgs, obsCoreEnabled, uploadInfo, setUploadInfo, serviceLabel, serviceId, hipsUrl, centerWP, fovDeg, capabilities, embeddedInHiPS, slotProps}) => { - const {getVal}= useContext(FieldGroupCtx); - - const spacialType= getVal(SPATIAL_TYPE) ?? SINGLE; - const spatialMethod= getVal(SpatialMethod)??CONE_CHOICE_KEY; - const closest= getVal(Closest)??''; - const cornerCalcTypeValue= getVal(cornerCalcType)??'image'; - const spatialRegOpValue= getVal(SpatialRegOp) ?? SpatialRegOpType.CONTAINS_POINT; + const spacialType = useFieldGroupValue(SPATIAL_TYPE)[0]() ?? SINGLE; + const spatialMethod = useFieldGroupValue(SpatialMethod)[0]() ?? CONE_CHOICE_KEY; + const closest = useFieldGroupValue(Closest)[0]() ?? ''; + const cornerCalcTypeValue = useFieldGroupValue(cornerCalcType)[0]() ?? 'image'; + const spatialRegOpValue = useFieldGroupValue(SpatialRegOp)[0]() ?? SpatialRegOpType.CONTAINS_POINT; const layoutMode= getSpacialLayoutMode(spacialType,obsCoreEnabled,capabilities?.canUpload); const isCone= spatialMethod === CONE_CHOICE_KEY; const containsPoint= spatialRegOpValue === SpatialRegOpType.CONTAINS_POINT; diff --git a/src/firefly/js/ui/tap/TapSearchSubmit.js b/src/firefly/js/ui/tap/TapSearchSubmit.js index 9c7248bfed..6c922af8b0 100644 --- a/src/firefly/js/ui/tap/TapSearchSubmit.js +++ b/src/firefly/js/ui/tap/TapSearchSubmit.js @@ -9,7 +9,7 @@ import { getHelperConstraints, getTapUploadSchemaEntry, getUploadServerFile, - getUploadTableName, + getUploadTableName, hasAdqlConstraint, isTapUpload } from 'firefly/ui/tap/Constraints'; import {makeTblRequest, setNoCache} from 'firefly/tables/TableRequestUtil'; @@ -105,9 +105,9 @@ export function onTapSearchSubmit({request, serviceUrl, tapBrowserState, additio function getCutoutType(tapBrowserState) { const spatial= tapBrowserState?.constraintFragments?.get('spatial'); - if (spatial?.adqlConstraint?.length) return spatial.cutoutType; + if (hasAdqlConstraint(spatial)) return spatial.cutoutType; const location= tapBrowserState?.constraintFragments?.get('location'); - if (location?.adqlConstraint?.length) return location.cutoutType; + if (hasAdqlConstraint(location)) return location.cutoutType; return ROW_POSITION; } @@ -129,7 +129,7 @@ export function getAdqlQuery(tapBrowserState, additionalClauses, allowColumnCons if (isUpload) { //check for more than one upload file (in Spatial and in ObjectID col) - should this be a utility function in constraints.js? const { constraintFragments } = tapBrowserState; const entries = [...constraintFragments.values()]; - const matchingEntries = entries.filter((c) => Boolean(c.uploadFile && c.TAP_UPLOAD && c.adqlConstraint)); + const matchingEntries = entries.filter((c) => Boolean(c.uploadFile && c.TAP_UPLOAD && hasAdqlConstraint(c))); if (matchingEntries.length > 1) { if (showErrors) showInfoPopup('We currently do not support searches with more than one uploaded table.', 'Error'); return;