From 5af836d824a4f664b550b0dc44869b862bf64370 Mon Sep 17 00:00:00 2001 From: Jeremy Magland Date: Wed, 19 Feb 2025 14:33:38 -0500 Subject: [PATCH] organize plugins --- src/pages/NwbPage/NwbHierarchyView.tsx | 26 ++++++----- src/pages/NwbPage/NwbObjectView.tsx | 41 ++++++++--------- src/pages/NwbPage/plugins/Image/index.ts | 2 +- src/pages/NwbPage/plugins/PSTH/index.ts | 3 +- src/pages/NwbPage/plugins/Raster/index.ts | 2 +- .../NwbPage/plugins/SpatialSeries/index.ts | 2 +- .../NwbPage/plugins/SpikeDensity/index.ts | 2 +- .../plugins/TrialAlignedSeries/index.ts | 2 +- src/pages/NwbPage/plugins/pluginInterface.ts | 2 +- src/pages/NwbPage/plugins/registry.ts | 45 ++++++++++--------- 10 files changed, 65 insertions(+), 62 deletions(-) diff --git a/src/pages/NwbPage/NwbHierarchyView.tsx b/src/pages/NwbPage/NwbHierarchyView.tsx index a397cb37..b5c5cd7c 100644 --- a/src/pages/NwbPage/NwbHierarchyView.tsx +++ b/src/pages/NwbPage/NwbHierarchyView.tsx @@ -39,8 +39,8 @@ const NwbHierarchyView: FunctionComponent = ({ new Set(), ); const [ - specialPluginsWithSecondaryPaths, - setSpecialPluginsWithSecondaryPaths, + launchablePluginsWithSecondaryPaths, + setLaunchablePluginsWithSecondaryPaths, ] = useState<{ [key: string]: { plugin: NwbObjectViewPlugin; secondaryPaths: string[] }[]; }>({}); @@ -77,8 +77,8 @@ const NwbHierarchyView: FunctionComponent = ({ }, [neurodataObjects, visiblyExpanded]); useEffect(() => { - const loadSpecialPlugins = async () => { - const newSpecialPluginsWithSecondaryPaths: { + const loadLaunchablePlugins = async () => { + const newLaunchablePluginsWithSecondaryPaths: { [key: string]: { plugin: NwbObjectViewPlugin; secondaryPaths: string[]; @@ -91,12 +91,12 @@ const NwbHierarchyView: FunctionComponent = ({ obj.path, objectType, { - special: true, + launchableFromTable: true, defaultUnitsPath, }, ); if (plugins.length > 0) { - newSpecialPluginsWithSecondaryPaths[obj.path] = plugins.map( + newLaunchablePluginsWithSecondaryPaths[obj.path] = plugins.map( (plugin) => ({ plugin, secondaryPaths: plugin.requiredDefaultUnits @@ -106,9 +106,11 @@ const NwbHierarchyView: FunctionComponent = ({ ); } } - setSpecialPluginsWithSecondaryPaths(newSpecialPluginsWithSecondaryPaths); + setLaunchablePluginsWithSecondaryPaths( + newLaunchablePluginsWithSecondaryPaths, + ); }; - loadSpecialPlugins(); + loadLaunchablePlugins(); }, [nwbUrl, neurodataObjects, defaultUnitsPath]); const truncateDescription = useCallback( @@ -307,7 +309,7 @@ const NwbHierarchyView: FunctionComponent = ({ ⧉ )} - {specialPluginsWithSecondaryPaths[obj.path]?.map( + {launchablePluginsWithSecondaryPaths[obj.path]?.map( ({ plugin, secondaryPaths }) => { const pluginString = `${plugin.name}|${[obj.path, ...secondaryPaths].join("^")}`; return ( @@ -455,9 +457,9 @@ const NwbHierarchyView: FunctionComponent = ({ selection.split("|"); const [path, ...secondaryPaths] = pathWithSecondary.split("^"); - const plugin = specialPluginsWithSecondaryPaths[path]?.find( - (p) => p.plugin.name === pluginName, - )?.plugin; + const plugin = launchablePluginsWithSecondaryPaths[ + path + ]?.find((p) => p.plugin.name === pluginName)?.plugin; if (plugin) { onOpenObjectInNewTab?.(path, plugin, secondaryPaths); } diff --git a/src/pages/NwbPage/NwbObjectView.tsx b/src/pages/NwbPage/NwbObjectView.tsx index dd061892..9b93b245 100644 --- a/src/pages/NwbPage/NwbObjectView.tsx +++ b/src/pages/NwbPage/NwbObjectView.tsx @@ -46,7 +46,7 @@ const NwbObjectView: React.FC = ({ setPlugins([plugin]); } else { let suitable = await findSuitablePlugins(nwbUrl, path, objectType, { - special: false, + launchableFromTable: false, }); if (inMultiView) { // If we are in a multi-view, then we only use plugins that have showInMultiView set to true @@ -90,27 +90,24 @@ const NwbObjectView: React.FC = ({ return (
- {plugins - .slice() - .reverse() // reverse it because the most specialized plugins come last - .map((plugin) => { - const PluginComponent = plugin.component; - return ( -
- - {!inMultiView &&
} -
- ); - })} + {plugins.slice().map((plugin) => { + const PluginComponent = plugin.component; + return ( +
+ + {!inMultiView &&
} +
+ ); + })}
); }; diff --git a/src/pages/NwbPage/plugins/Image/index.ts b/src/pages/NwbPage/plugins/Image/index.ts index 3b276a6a..3653a700 100644 --- a/src/pages/NwbPage/plugins/Image/index.ts +++ b/src/pages/NwbPage/plugins/Image/index.ts @@ -24,7 +24,7 @@ export const imagePlugin: NwbObjectViewPlugin = { return false; }, component: ImagePluginView, - special: false, + launchableFromTable: false, requiresWindowDimensions: true, showInMultiView: true, }; diff --git a/src/pages/NwbPage/plugins/PSTH/index.ts b/src/pages/NwbPage/plugins/PSTH/index.ts index 2f6d1e09..dd9d4058 100644 --- a/src/pages/NwbPage/plugins/PSTH/index.ts +++ b/src/pages/NwbPage/plugins/PSTH/index.ts @@ -25,6 +25,7 @@ export const psthPlugin: NwbObjectViewPlugin = { return true; }, component: PSTHView, - special: true, + launchableFromTable: true, requiresWindowDimensions: true, + requiredDefaultUnits: true, }; diff --git a/src/pages/NwbPage/plugins/Raster/index.ts b/src/pages/NwbPage/plugins/Raster/index.ts index 661a8913..1db26444 100644 --- a/src/pages/NwbPage/plugins/Raster/index.ts +++ b/src/pages/NwbPage/plugins/Raster/index.ts @@ -20,7 +20,7 @@ export const rasterPlugin: NwbObjectViewPlugin = { return false; }, component: RasterView, - special: true, + launchableFromTable: true, requiresWindowDimensions: false, showInMultiView: false, }; diff --git a/src/pages/NwbPage/plugins/SpatialSeries/index.ts b/src/pages/NwbPage/plugins/SpatialSeries/index.ts index 56b41b53..3c2b9022 100644 --- a/src/pages/NwbPage/plugins/SpatialSeries/index.ts +++ b/src/pages/NwbPage/plugins/SpatialSeries/index.ts @@ -37,5 +37,5 @@ export const spatialSeriesPlugin: NwbObjectViewPlugin = { // We need window dimensions since we're displaying a spatial plot requiresWindowDimensions: true, showInMultiView: false, - special: true, + launchableFromTable: true, }; diff --git a/src/pages/NwbPage/plugins/SpikeDensity/index.ts b/src/pages/NwbPage/plugins/SpikeDensity/index.ts index 31bce9f6..7fa2dafd 100644 --- a/src/pages/NwbPage/plugins/SpikeDensity/index.ts +++ b/src/pages/NwbPage/plugins/SpikeDensity/index.ts @@ -20,7 +20,7 @@ export const spikeDensityPlugin: NwbObjectViewPlugin = { return false; }, component: SpikeDensityView, - special: true, + launchableFromTable: true, requiresWindowDimensions: false, showInMultiView: false, }; diff --git a/src/pages/NwbPage/plugins/TrialAlignedSeries/index.ts b/src/pages/NwbPage/plugins/TrialAlignedSeries/index.ts index 0dff5697..5eacfb0d 100644 --- a/src/pages/NwbPage/plugins/TrialAlignedSeries/index.ts +++ b/src/pages/NwbPage/plugins/TrialAlignedSeries/index.ts @@ -33,6 +33,6 @@ export const trialAlignedSeriesPlugin: NwbObjectViewPlugin = { return true; }, component: TrialAlignedPluginView, - special: true, + launchableFromTable: true, requiresWindowDimensions: true, }; diff --git a/src/pages/NwbPage/plugins/pluginInterface.ts b/src/pages/NwbPage/plugins/pluginInterface.ts index dbe9f50c..c40f82ac 100644 --- a/src/pages/NwbPage/plugins/pluginInterface.ts +++ b/src/pages/NwbPage/plugins/pluginInterface.ts @@ -19,7 +19,7 @@ export interface NwbObjectViewPlugin { height?: number; condensed?: boolean; }>; - special?: boolean; + launchableFromTable?: boolean; requiresWindowDimensions?: boolean; showInMultiView?: boolean; requiredDefaultUnits?: boolean; diff --git a/src/pages/NwbPage/plugins/registry.ts b/src/pages/NwbPage/plugins/registry.ts index a407e72a..5f0f2bff 100644 --- a/src/pages/NwbPage/plugins/registry.ts +++ b/src/pages/NwbPage/plugins/registry.ts @@ -14,49 +14,52 @@ import { trialAlignedSeriesPlugin } from "./TrialAlignedSeries"; import { pythonScriptPlugin } from "./PythonScript"; import spikeDensityPlugin from "./SpikeDensity"; -// List of plugins in priority order (last one is checked first) +// List of plugins in order they will appear in the UI when a single object is being viewed export const nwbObjectViewPlugins: NwbObjectViewPlugin[] = [ - pythonScriptPlugin, - defaultPlugin, behavioralEventsPlugin, dynamicTablePlugin, twoPhotonSeriesPlugin, spatialSeriesPlugin, simpleTimeseriesPlugin, psthPlugin, - rasterPlugin, imagePlugin, imageSegmentationPlugin, timeIntervalsPlugin, trialAlignedSeriesPlugin, + + rasterPlugin, spikeDensityPlugin, + + defaultPlugin, + pythonScriptPlugin, ]; export const findSuitablePlugins = async ( nwbUrl: string, path: string, objectType: "group" | "dataset", - o: { special?: boolean; defaultUnitsPath?: string }, + o: { launchableFromTable?: boolean; defaultUnitsPath?: string }, ): Promise => { const ret: NwbObjectViewPlugin[] = []; for (let i = 0; i < nwbObjectViewPlugins.length; i++) { const plugin = nwbObjectViewPlugins[i]; - if (!!plugin.special === !!o.special) { - if (plugin.requiredDefaultUnits && !o.defaultUnitsPath) { - continue; - } - if ( - await plugin.canHandle({ - nwbUrl, - objectType, - path, - secondaryPaths: plugin.requiredDefaultUnits - ? [o.defaultUnitsPath!] - : [], - }) - ) { - ret.push(plugin); - } + if (o.launchableFromTable && !plugin.launchableFromTable) { + continue; + } + if (plugin.requiredDefaultUnits && !o.defaultUnitsPath) { + continue; + } + if ( + await plugin.canHandle({ + nwbUrl, + objectType, + path, + secondaryPaths: plugin.requiredDefaultUnits + ? [o.defaultUnitsPath!] + : [], + }) + ) { + ret.push(plugin); } } return ret;