Skip to content

Firefly-1469: Update DCE to support rubin needs #1742

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Apr 18, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions src/firefly/js/api/webApiCommands/LsdbCommands.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import {makeExamples} from 'firefly/api/WebApi';
import {dispatchShowDropDown, dispatchUpdateMenu} from 'firefly/core/LayoutCntlr';
import {dispatchShowDropDown} from 'firefly/core/LayoutCntlr';
import {isUndefined} from 'lodash';
import {getMenu} from '../../core/AppDataCntlr';
import {dispatchSetMenu, getMenu} from '../../core/AppDataCntlr';


const lsdbOverview= {
Expand Down Expand Up @@ -39,7 +39,7 @@ function enablePanel(cmd,inParams) {
const newMenuItems= [...menuItems];
const dlDrop= lsdbMenuItem;
newMenuItems.splice(1,0,dlDrop);
dispatchUpdateMenu({selected,showBgMonitor,menuItems:newMenuItems});
dispatchSetMenu({selected,showBgMonitor,menuItems:newMenuItems});
}
dispatchShowDropDown({view:'GatorProtocolRootPanel'});
},10);
Expand Down
1 change: 0 additions & 1 deletion src/firefly/js/metaConvert/AnalysisUtils.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ import {
} from './DataProductsType.js';
import {createGridImagesActivate} from './ImageDataProductsUtil.js';
import {doUploadAndAnalysis} from './UploadAndAnalysis.js';
import {getObsCoreDataProduct} from './vo/ObsCoreConverter';

const LOADING_MSG= 'Loading...';

Expand Down
30 changes: 16 additions & 14 deletions src/firefly/js/metaConvert/vo/ServDescProducts.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import {isEmpty, isNumber} from 'lodash';
import {getComponentState} from '../../core/ComponentCntlr.js';
import {getCellValue} from '../../tables/TableUtil.js';
import {makeCircleString} from '../../ui/dynamic/DynamicUISearchPanel';
import {CONTEXT_PARAMS_STR, makeCircleString} from '../../ui/dynamic/DynamicUISearchPanel';
import {isSIAStandardID} from '../../ui/dynamic/ServiceDefTools';
import {findCutoutTarget, getCutoutErrorStr, getCutoutSize, setCutoutSize} from '../../ui/tap/Cutout';
import {PlotAttribute} from '../../visualize/PlotAttribute';
Expand Down Expand Up @@ -255,22 +255,24 @@ export function createServDescMenuRet({ descriptors, positionWP, table, row,
}

export function makeUrlFromParams(url, serDef, rowIdx, userInputParams = {}) {
const sendParams = {};
if (!url) return undefined;
const sendParams = new URLSearchParams();
serDef?.serDefParams // if it is defaulted, then set it
?.filter(({value}) => isDefined(value))
.forEach(({name, value}) => sendParams[name] = value);
.forEach(({name, value}) => sendParams.set(name, value));
serDef?.serDefParams // if it is referenced, then set it
?.filter(({ref}) => ref)
.forEach((p) => sendParams[p.name] = getCellValue(serDef.sdSourceTable, rowIdx, p.colName));
userInputParams && Object.entries(userInputParams).forEach(([k, v]) => v && (sendParams[k] = v));
const newUrl = new URL(url);
if (!newUrl) return undefined;
Object.entries(sendParams).forEach(([k, v]) => newUrl.searchParams.append(k, v));
logServiceDescriptor(newUrl, sendParams, newUrl.toString());
return newUrl.toString();
.forEach((p) => sendParams.set(p.name, getCellValue(serDef.sdSourceTable, rowIdx, p.colName)));
Object.entries(userInputParams)
.forEach(([k, v]) => v && k!==CONTEXT_PARAMS_STR && sendParams.set(k,v));

const additionalParams= new URLSearchParams(userInputParams?.[CONTEXT_PARAMS_STR]);
const params= new URLSearchParams([...sendParams, ...additionalParams]);
const newUrl= params.size ? url+'?'+params.toString() : url;
logServiceDescriptor(newUrl, params, newUrl);
return newUrl;
}
function logServiceDescriptor(baseUrl, sendParams, newUrl) {
//console.log(`service descriptor base URL: ${baseUrl}`);
//Object.entries(sendParams).forEach(([k,v]) => console.log(`param: ${k}, value: ${v}`));
//console.log(`service descriptor new URL: ${newUrl}`);
function logServiceDescriptor(baseUrl, params, newUrl) {
// console.log(`service descriptor base URL: ${baseUrl}`);
// console.log(`service descriptor new URL: ${newUrl}`);
}
33 changes: 23 additions & 10 deletions src/firefly/js/ui/Menu.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import {
Stack, Tab, TabList, Tabs, Tooltip, Typography
} from '@mui/joy';
import {tabClasses} from '@mui/joy/Tab';
import {debounce} from 'lodash';
import {debounce, isFunction} from 'lodash';
import React, {forwardRef, memo, useCallback, useContext, useEffect, useRef, useState} from 'react';
import shallowequal from 'shallowequal';
import {
Expand Down Expand Up @@ -82,7 +82,7 @@ export function Menu() {
if (!selected) return;
const selectedItem= menuItems.find(({action}) => (action===selected));
if (!selectedItem) return;
const isVisible= selectedItem.visible ?? selectedItem.primary;
const isVisible= itemVisible(selectedItem);
if (!isVisible && selected === selectedItem.action) {
const newMenuItems= menuItems.map( (mi) => mi===selectedItem ? {...mi, visible:true} : mi);
updateMenu(appTitle, {...menu, menuItems:newMenuItems, selected});
Expand Down Expand Up @@ -194,6 +194,7 @@ function MenuTabBar({menuTabItems=[], size, selected, dropDown, displayMask, set
const tabItems= [
<ResultsTab {...{key:'results-tab', size, color, variant, ref: (c) => setElement('results-tab ',c)}}/>,
...menuTabItems
.filter( isItemEnabled)
.map(({action,label,TabRenderer,title}, idx) =>
{
const tabProps = {key: idx, value:action, disableIndicator:true, color, variant,
Expand Down Expand Up @@ -237,14 +238,23 @@ function MenuTabBar({menuTabItems=[], size, selected, dropDown, displayMask, set
}

function itemVisible(menuItem) {
const {visible, primary,type} = menuItem;
const {visible, type} = menuItem;
if (type==='COMMAND') return true;
return visible ?? primary;
return Boolean(visible ?? isItemPrimary(menuItem));
}

function isItemEnabled(item={}) {
const {enabled=true}= item;
return isFunction(enabled) ? Boolean(enabled(item)) : enabled;
}

function isItemPrimary(item={}) {
const {primary=false}= item;
return isFunction(primary) ? Boolean(primary(item)) : primary;
}

function updateMenu(appTitle, menu) {
const pref= menu.menuItems
.map( (mi) => [mi.action, Boolean(mi.visible ?? mi.primary)] );
const pref= menu.menuItems.map( (mi) => [mi.action, itemVisible(mi)] );
dispatchAddPreference(MENU_PREF_ROOT+appTitle, Object.fromEntries(pref));
dispatchSetMenu(menu);
}
Expand Down Expand Up @@ -289,6 +299,7 @@ function getButtonSize(tabWidths,tabBarElement,lastButtonSize, showHelp,showUser
}



function getButtonDisplayMask(tabWidths,tabBarElement,selectedTabIdx, showHelp,showUserInfo) {
const usedWith= (showHelp?50:0) + (showUserInfo?50:0);
const tabBarRealWidth = getTabBarRealWidth(tabBarElement) - usedWith;
Expand Down Expand Up @@ -384,7 +395,7 @@ function SideBarView({menu,appTitle,closeSideBar,haveResults,selected,dropDown,
variant='outlined'
onClick={() => {
const newMI= menu.menuItems.map( (mi) => ({...mi, visible: undefined}) );
const selected= newMI.find( (m) => m.action===menu.selected && m.primary)?.action;
const selected= newMI.find( (m) => m.action===menu.selected && isItemPrimary(m))?.action;
if (!selected) dispatchHideDropDown();
updateMenu(appTitle, {...menu, selected, menuItems: newMI});
}}>
Expand Down Expand Up @@ -435,6 +446,7 @@ function SideBarView({menu,appTitle,closeSideBar,haveResults,selected,dropDown,
{/* Other no-category items, if any */}
{Boolean(noCatItems?.length) &&
menuItems
.filter( isItemEnabled)
.filter( ({category}) => !category )
.map( (item) => (<SideBarItem {...{key:item.label, item,selected,menu,closeSideBar, allowMenuHide, sx:itemLayoutSx}}/>) )
}
Expand All @@ -446,6 +458,7 @@ function SideBarView({menu,appTitle,closeSideBar,haveResults,selected,dropDown,
{Boolean(cat) && <Typography key={cat} level='title-sm'>{cat}</Typography>}
{
menuItems
.filter( isItemEnabled)
.filter( ({category}) => category===cat )
.map( (item) => (<SideBarItem {...{key:item.label, item,selected,menu,closeSideBar, allowMenuHide, sx:itemLayoutSx}}/>) )
}
Expand All @@ -460,7 +473,7 @@ function SideBarView({menu,appTitle,closeSideBar,haveResults,selected,dropDown,
function tabsUpdated(menu) {
if (!menu?.menuItems) return false;
return menu.menuItems.some( (mi) => {
return (mi.visible??mi.primary)!==mi.primary;
return (mi.visible??isItemPrimary(mi))!==isItemPrimary(mi);
});
}

Expand Down Expand Up @@ -562,12 +575,12 @@ function SideBarItem({item,selected,menu,closeSideBar,allowMenuHide,icon,sx}) {
};

if (!item) return <div>missing</div>;
const {title,action,label,visible,primary}= item;
const {title,action,label}= item;
return (
<Stack direction='row' sx={sx}>
<ToolbarButton tip={getTip(title,action)} icon={icon} text={label}
pressed={selected===action} onClick= {() => onClick(item)} />
{(allowMenuHide && (visible ?? primary)) &&
{(allowMenuHide && itemVisible(item)) &&
<Chip {...{
className: 'hideTab',
onClick:() => {
Expand Down
15 changes: 13 additions & 2 deletions src/firefly/js/ui/TargetFeedback.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -34,16 +34,27 @@ function formatExample(row, fieldKey, setFld) {
}


function stripQuotes(s) {
if (s.startsWith(`'`) && s.endsWith(`'`)) return s.substring(1, s.length-1);
if (s.startsWith('"') && s.endsWith('"')) return s.substring(1, s.length-1);
return s;
}


const ConfigExamples = ({targetPanelExampleRow1, targetPanelExampleRow2, fieldKey}) => {
const {setFld}= useContext(FieldGroupCtx);
const tpR1= !targetPanelExampleRow1 || isArray(targetPanelExampleRow1) ? targetPanelExampleRow1 : [targetPanelExampleRow1];
const tpR2= !targetPanelExampleRow2 || isArray(targetPanelExampleRow2) ? targetPanelExampleRow2 : [targetPanelExampleRow2];
const row1Op= tpR1 ?? getAppOptions()?.targetPanelExampleRow1 ?? defExampleEntries.row1;
const row2Op= tpR2 ?? getAppOptions()?.targetPanelExampleRow2 ?? defExampleEntries.row2;

const r1= row1Op.map( (s) => stripQuotes(s));
const r2= row2Op.map( (s) => stripQuotes(s));

return (
<Stack {...{lineHeight : '1.2em', fontSize:'smaller', direction:'column', spacing:1/2, alignItems:'center'}}>
{formatExample(row1Op, fieldKey, setFld)}
{formatExample(row2Op, fieldKey, setFld)}
{formatExample(r1, fieldKey, setFld)}
{formatExample(r2, fieldKey, setFld)}
</Stack>
);
};
Expand Down
46 changes: 33 additions & 13 deletions src/firefly/js/ui/dynamic/DLGenAnalyzeSearch.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,13 @@ import {MetaConst} from '../../data/MetaConst.js';
import {dispatchTableSearch} from '../../tables/TablesCntlr.js';
import {getMetaEntry} from '../../tables/TableUtil.js';
import {Logger} from '../../util/Logger.js';
import {getDataLinkData} from '../../voAnalyzer/VoDataLinkServDef.js';
import {CONE_CHOICE_KEY, POLY_CHOICE_KEY} from '../../visualize/ui/CommonUIKeys.js';
import {getDataLinkData} from '../../voAnalyzer/VoDataLinkServDef.js';
import {CIRCLE, POINT, POLYGON} from './DynamicDef.js';
import {
convertCircleToPointArea, convertPointAreaToCircle, isCircleSearch, isPointAreaSearch, isPolySearch
} from './DynamicUISearchPanel.jsx';
import {findFieldDefType, makeFieldDefs, makeServiceDescriptorSearchRequest} from './ServiceDefTools.js';


import {findFieldDefType, makeServiceDescriptorSearchRequest, sdToFieldDefAry} from './ServiceDefTools.js';


/**
Expand Down Expand Up @@ -44,8 +42,8 @@ export function analyzeQueries(tbl_id) {
}


export function makeAllSearchRequest(request, primeSd, concurrentSDAry, primaryFdAry, extraPrimaryMeta) {
const primeRequest= makeServiceDescriptorSearchRequest(request,primeSd,extraPrimaryMeta);
export function makeAllSearchRequest(request, siaConstraints, primeSd, concurrentSDAry, primaryFdAry, extraPrimaryMeta) {
const primeRequest= makeServiceDescriptorSearchRequest(request,siaConstraints, primeSd,extraPrimaryMeta);
const concurrentRequestAry= concurrentSDAry
.map( (sd) => {
const newR= convertRequestToSecondary(request, primaryFdAry?.[0], sd.serviceDef, primeSd.standardID);
Expand All @@ -59,14 +57,14 @@ export function makeAllSearchRequest(request, primeSd, concurrentSDAry, primaryF
/**
* Do all the searches defined
* @param request
* @param siaConstraints
* @param {QueryAnalysis} qAna
* @param primaryFdAry
* @param idx
* @param {object} extraMeta // additional table meta to include with the TableSearch
* @param {String} selectedConcurrent - space separated name of searches to execute
* @param docRows URLs to documentation
*/
export function handleSearch(request, qAna, primaryFdAry, idx, extraMeta={}, selectedConcurrent) {
export function handleSearch(request, siaConstraints, qAna, primaryFdAry, idx, extraMeta={}, selectedConcurrent) {
const primeSd= qAna.primarySearchDef[idx].serviceDef;
const {coverage,bandDesc}= qAna.primarySearchDef[idx];
const {cisxUI}= qAna.primarySearchDef[0].serviceDef;
Expand All @@ -81,7 +79,7 @@ export function handleSearch(request, qAna, primaryFdAry, idx, extraMeta={}, sel
extraMeta= {coverage,bandDesc, ...extraMeta};
if (preferredHips) extraMeta[MetaConst.COVERAGE_HIPS]=preferredHips;

const tableRequestAry= makeAllSearchRequest(request, primeSd,concurrentSDAry, primaryFdAry, extraMeta);
const tableRequestAry= makeAllSearchRequest(request, siaConstraints, primeSd,concurrentSDAry, primaryFdAry, extraMeta);

tableRequestAry.forEach( (dataTableReq) => {
Logger('DLGeneratedDropDown').debug(dataTableReq);
Expand All @@ -92,7 +90,7 @@ export function handleSearch(request, qAna, primaryFdAry, idx, extraMeta={}, sel
}

function convertRequestToSecondary(request, primaryFdAry, secondServDef, primStandardID) {
const sFdAry= makeFieldDefs(secondServDef.serDefParams);
const sFdAry= sdToFieldDefAry({serviceDef:secondServDef});
if (isCircleSearch(primaryFdAry) || isPointAreaSearch(sFdAry)) {
return convertCircleToPointArea(request, primaryFdAry, sFdAry, primStandardID, secondServDef.standardID);
}
Expand All @@ -103,7 +101,7 @@ function convertRequestToSecondary(request, primaryFdAry, secondServDef, primSta
}

function getServiceDefSpacialSupports(serviceDef) {
const fdAry= makeFieldDefs(serviceDef.serDefParams);
const fdAry= sdToFieldDefAry({serviceDef});
const retAry=[];
if (isCircleSearch(fdAry)) retAry.push(CIRCLE);
if (isPointAreaSearch(fdAry)) retAry.push(POINT);
Expand All @@ -116,7 +114,7 @@ export function hasSpatialTypes(serviceDef) {
}

export function isSpatialTypeSupported(serviceDef, spacialType) {
const fdAry= makeFieldDefs(serviceDef.serDefParams);
const fdAry= sdToFieldDefAry({serviceDef});
if (spacialType===CONE_CHOICE_KEY) {
return isCircleSearch(fdAry) || isPointAreaSearch(fdAry) || Boolean(findFieldDefType(fdAry,POINT));
}
Expand All @@ -135,6 +133,28 @@ export function isSpatialTypeSupported(serviceDef, spacialType) {
*/


/**
* @param {QueryAnalysis|ServiceDescriptorDef} qAnaOrSd - accept a QueryAnalysis or a ServiceDescriptorDef
* @return {CISXui|Array} ui parameters or an empty array
*/
export function getCisxUI(qAnaOrSd) {
if (!qAnaOrSd) return [];
if (qAnaOrSd.primarySearchDef) { // is QueryAnalysis
return qAnaOrSd.primarySearchDef[0]?.serviceDef?.cisxUI ?? [];
} else if (qAnaOrSd.accessURL) { // is ServiceDescriptorDef
return qAnaOrSd.cisxUI ?? [];
}
return [];
}

export function getCisxUIValue(qAnaOrSd, name) {
return getCisxUI(qAnaOrSd).find((e) => e.name === name)?.value;
}

export function getCisxUIUCD(qAnaOrSd, name) {
return getCisxUI(qAnaOrSd).find((e) => e.name === name)?.UCD;
}

/**
* @typedef {Object} SearchDefinition
* This object is a combination of a row and its service descriptor if one exist
Expand All @@ -148,4 +168,4 @@ export function isSpatialTypeSupported(serviceDef, spacialType) {
* @prop {String} semantic - from the semantic column
* @prop {ServiceDescriptorDef} serviceDef - the service descriptor
*
*/
*/
Loading