Skip to content
Merged
14 changes: 14 additions & 0 deletions packages/base/src/commands/BaseCommandIDs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,3 +49,17 @@ export const selectCompleter = 'jupytergis:selectConsoleCompleter';
export const addAnnotation = 'jupytergis:addAnnotation';
export const zoomToLayer = 'jupytergis:zoomToLayer';
export const downloadGeoJSON = 'jupytergis:downloadGeoJSON';

// Panel toggles
export const toggleLeftPanel = 'jupytergis:toggleLeftPanel';
export const toggleRightPanel = 'jupytergis:toggleRightPanel';

// Left panel tabs
export const showLayersTab = 'jupytergis:showLayersTab';
export const showStacBrowserTab = 'jupytergis:showStacBrowserTab';
export const showFiltersTab = 'jupytergis:showFiltersTab';

// Right panel tabs
export const showObjectPropertiesTab = 'jupytergis:showObjectPropertiesTab';
export const showAnnotationsTab = 'jupytergis:showAnnotationsTab';
export const showIdentifyPanelTab = 'jupytergis:showIdentifyPanelTab';
192 changes: 192 additions & 0 deletions packages/base/src/commands/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,9 @@ export function addCommands(
return isIdentifying;
},
isEnabled: () => {
if (tracker.currentWidget?.model.jgisSettings.identifyDisabled) {
return false;
}
const selectedLayer = getSingleSelectedLayer(tracker);
if (!selectedLayer) {
return false;
Expand Down Expand Up @@ -847,6 +850,195 @@ export function addCommands(
icon: targetWithCenterIcon,
});

// Panel visibility commands
commands.addCommand(CommandIDs.toggleLeftPanel, {
label: trans.__('Toggle Left Panel'),
isEnabled: () => Boolean(tracker.currentWidget),
isToggled: () => {
const current = tracker.currentWidget;
return current ? !current.model.jgisSettings.leftPanelDisabled : false;
},
execute: async () => {
const current = tracker.currentWidget;
if (!current) {
return;
}

try {
const settings = await current.model.getSettings();
const currentValue =
settings?.composite?.leftPanelDisabled ??
current.model.jgisSettings.leftPanelDisabled ??
false;
await settings?.set('leftPanelDisabled', !currentValue);
commands.notifyCommandChanged(CommandIDs.toggleLeftPanel);
} catch (err) {
console.error('Failed to toggle Left Panel:', err);
}
},
});

commands.addCommand(CommandIDs.toggleRightPanel, {
label: trans.__('Toggle Right Panel'),
isEnabled: () => Boolean(tracker.currentWidget),
isToggled: () => {
const current = tracker.currentWidget;
return current ? !current.model.jgisSettings.rightPanelDisabled : false;
},
execute: async () => {
const current = tracker.currentWidget;
if (!current) {
return;
}

try {
const settings = await current.model.getSettings();
const currentValue =
settings?.composite?.rightPanelDisabled ??
current.model.jgisSettings.rightPanelDisabled ??
false;
await settings?.set('rightPanelDisabled', !currentValue);
commands.notifyCommandChanged(CommandIDs.toggleRightPanel);
} catch (err) {
console.error('Failed to toggle Right Panel:', err);
}
},
});

// Left panel tabs
commands.addCommand(CommandIDs.showLayersTab, {
label: trans.__('Show Layers Tab'),
isEnabled: () => Boolean(tracker.currentWidget),
isToggled: () =>
tracker.currentWidget
? !tracker.currentWidget.model.jgisSettings.layersDisabled
: false,
execute: async () => {
const current = tracker.currentWidget;
if (!current) {
return;
}
const settings = await current.model.getSettings();
const currentValue =
settings?.composite?.layersDisabled ??
current.model.jgisSettings.layersDisabled ??
false;
await settings?.set('layersDisabled', !currentValue);
commands.notifyCommandChanged(CommandIDs.showLayersTab);
},
});

commands.addCommand(CommandIDs.showStacBrowserTab, {
label: trans.__('Show STAC Browser Tab'),
isEnabled: () => Boolean(tracker.currentWidget),
isToggled: () =>
tracker.currentWidget
? !tracker.currentWidget.model.jgisSettings.stacBrowserDisabled
: false,
execute: async () => {
const current = tracker.currentWidget;
if (!current) {
return;
}
const settings = await current.model.getSettings();
const currentValue =
settings?.composite?.stacBrowserDisabled ??
current.model.jgisSettings.stacBrowserDisabled ??
false;
await settings?.set('stacBrowserDisabled', !currentValue);
commands.notifyCommandChanged(CommandIDs.showStacBrowserTab);
},
});

commands.addCommand(CommandIDs.showFiltersTab, {
label: trans.__('Show Filters Tab'),
isEnabled: () => Boolean(tracker.currentWidget),
isToggled: () =>
tracker.currentWidget
? !tracker.currentWidget.model.jgisSettings.filtersDisabled
: false,
execute: async () => {
const current = tracker.currentWidget;
if (!current) {
return;
}
const settings = await current.model.getSettings();
const currentValue =
settings?.composite?.filtersDisabled ??
current.model.jgisSettings.filtersDisabled ??
false;
await settings?.set('filtersDisabled', !currentValue);
commands.notifyCommandChanged(CommandIDs.showFiltersTab);
},
});

// Right panel tabs
commands.addCommand(CommandIDs.showObjectPropertiesTab, {
label: trans.__('Show Object Properties Tab'),
isEnabled: () => Boolean(tracker.currentWidget),
isToggled: () =>
tracker.currentWidget
? !tracker.currentWidget.model.jgisSettings.objectPropertiesDisabled
: false,
execute: async () => {
const current = tracker.currentWidget;
if (!current) {
return;
}
const settings = await current.model.getSettings();
const currentValue =
settings?.composite?.objectPropertiesDisabled ??
current.model.jgisSettings.objectPropertiesDisabled ??
false;
await settings?.set('objectPropertiesDisabled', !currentValue);
commands.notifyCommandChanged(CommandIDs.showObjectPropertiesTab);
},
});

commands.addCommand(CommandIDs.showAnnotationsTab, {
label: trans.__('Show Annotations Tab'),
isEnabled: () => Boolean(tracker.currentWidget),
isToggled: () =>
tracker.currentWidget
? !tracker.currentWidget.model.jgisSettings.annotationsDisabled
: false,
execute: async () => {
const current = tracker.currentWidget;
if (!current) {
return;
}
const settings = await current.model.getSettings();
const currentValue =
settings?.composite?.annotationsDisabled ??
current.model.jgisSettings.annotationsDisabled ??
false;
await settings?.set('annotationsDisabled', !currentValue);
commands.notifyCommandChanged(CommandIDs.showAnnotationsTab);
},
});

commands.addCommand(CommandIDs.showIdentifyPanelTab, {
label: trans.__('Show Identify Panel Tab'),
isEnabled: () => Boolean(tracker.currentWidget),
isToggled: () =>
tracker.currentWidget
? !tracker.currentWidget.model.jgisSettings.identifyDisabled
: false,
execute: async () => {
const current = tracker.currentWidget;
if (!current) {
return;
}
const settings = await current.model.getSettings();
const currentValue =
settings?.composite?.identifyDisabled ??
current.model.jgisSettings.identifyDisabled ??
false;
await settings?.set('identifyDisabled', !currentValue);
commands.notifyCommandChanged(CommandIDs.showIdentifyPanelTab);
},
});

loadKeybindings(commands, keybindings);
}

Expand Down
107 changes: 66 additions & 41 deletions packages/base/src/panelview/leftpanel.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { IJupyterGISModel, SelectionType } from '@jupytergis/schema';
import { PageConfig } from '@jupyterlab/coreutils';
import { IStateDB } from '@jupyterlab/statedb';
import { CommandRegistry } from '@lumino/commands';
import { MouseEvent as ReactMouseEvent } from 'react';
Expand Down Expand Up @@ -31,60 +30,86 @@ interface ILeftPanelProps {
export const LeftPanel: React.FC<ILeftPanelProps> = (
props: ILeftPanelProps,
) => {
const hideStacPanel = PageConfig.getOption('HIDE_STAC_PANEL') === 'true';
const [settings, setSettings] = React.useState(props.model.jgisSettings);

React.useEffect(() => {
const onSettingsChanged = () => {
setSettings({ ...props.model.jgisSettings });
};

props.model.settingsChanged.connect(onSettingsChanged);
return () => {
props.model.settingsChanged.disconnect(onSettingsChanged);
};
}, [props.model]);

const allLeftTabsDisabled =
settings.layersDisabled &&
settings.stacBrowserDisabled &&
settings.filtersDisabled;

const leftPanelVisible = !settings.leftPanelDisabled && !allLeftTabsDisabled;

const tabInfo = [
{ name: 'layers', title: 'Layers' },
...(hideStacPanel ? [] : [{ name: 'stac', title: 'Stac Browser' }]),
{ name: 'filters', title: 'Filters' },
];
!settings.layersDisabled ? { name: 'layers', title: 'Layers' } : false,
!settings.stacBrowserDisabled
? { name: 'stac', title: 'Stac Browser' }
: false,
!settings.filtersDisabled ? { name: 'filters', title: 'Filters' } : false,
].filter(Boolean) as { name: string; title: string }[];

const [curTab, setCurTab] = React.useState<string | undefined>(
tabInfo[0].name,
tabInfo.length > 0 ? tabInfo[0].name : undefined,
);

return (
<div className="jgis-left-panel-container">
<div
className="jgis-left-panel-container"
style={{ display: leftPanelVisible ? 'block' : 'none' }}
>
<PanelTabs curTab={curTab} className="jgis-panel-tabs">
<TabsList>
{tabInfo.map(e => {
return (
<TabsTrigger
className="jGIS-layer-browser-category"
value={e.name}
onClick={() => {
if (curTab !== e.name) {
setCurTab(e.name);
} else {
setCurTab('');
}
}}
>
{e.title}
</TabsTrigger>
);
})}
{tabInfo.map(e => (
<TabsTrigger
className="jGIS-layer-browser-category"
value={e.name}
onClick={() => {
if (curTab !== e.name) {
setCurTab(e.name);
} else {
setCurTab('');
}
}}
>
{e.title}
</TabsTrigger>
))}
</TabsList>
<TabsContent
value="layers"
className="jgis-panel-tab-content jp-gis-layerPanel"
>
<LayersBodyComponent
model={props.model}
commands={props.commands}
state={props.state}
></LayersBodyComponent>
</TabsContent>

{!hideStacPanel && (
<TabsContent value="stac">
<StacPanel model={props.model}></StacPanel>
{!settings.layersDisabled && (
<TabsContent
value="layers"
className="jgis-panel-tab-content jp-gis-layerPanel"
>
<LayersBodyComponent
model={props.model}
commands={props.commands}
state={props.state}
></LayersBodyComponent>
</TabsContent>
)}

<TabsContent value="filters" className="jgis-panel-tab-content">
<FilterComponent model={props.model}></FilterComponent>,
</TabsContent>
{!settings.stacBrowserDisabled && (
<TabsContent value="stac" className="jgis-panel-tab-content">
<StacPanel model={props.model} />
</TabsContent>
)}

{!settings.filtersDisabled && (
<TabsContent value="filters" className="jgis-panel-tab-content">
<FilterComponent model={props.model}></FilterComponent>
</TabsContent>
)}
</PanelTabs>
</div>
);
Expand Down
Loading
Loading