Skip to content

Commit 36fc964

Browse files
Introduce settings to optionally disable some features (filtering/annotations etc) (#898)
* Toggle Visibility of Panels and Tabs * cleanup * use model's settingschanged * ready * lint * remove flags * don't show if all tabs are disabled * remove toolbar menu for now * disable identify command if identify is disabled in settings * refactor settings change handling to emit specific keys when settings are updated * Bring back spacer + small cleanup * Fix notebook renderer * Fix missing settings registry for notebook renderer * Linter --------- Co-authored-by: martinRenou <martin.renou@gmail.com>
1 parent 7f6b63f commit 36fc964

File tree

9 files changed

+508
-105
lines changed

9 files changed

+508
-105
lines changed

packages/base/src/commands/BaseCommandIDs.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,17 @@ export const selectCompleter = 'jupytergis:selectConsoleCompleter';
4949
export const addAnnotation = 'jupytergis:addAnnotation';
5050
export const zoomToLayer = 'jupytergis:zoomToLayer';
5151
export const downloadGeoJSON = 'jupytergis:downloadGeoJSON';
52+
53+
// Panel toggles
54+
export const toggleLeftPanel = 'jupytergis:toggleLeftPanel';
55+
export const toggleRightPanel = 'jupytergis:toggleRightPanel';
56+
57+
// Left panel tabs
58+
export const showLayersTab = 'jupytergis:showLayersTab';
59+
export const showStacBrowserTab = 'jupytergis:showStacBrowserTab';
60+
export const showFiltersTab = 'jupytergis:showFiltersTab';
61+
62+
// Right panel tabs
63+
export const showObjectPropertiesTab = 'jupytergis:showObjectPropertiesTab';
64+
export const showAnnotationsTab = 'jupytergis:showAnnotationsTab';
65+
export const showIdentifyPanelTab = 'jupytergis:showIdentifyPanelTab';

packages/base/src/commands/index.ts

Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,9 @@ export function addCommands(
171171
return isIdentifying;
172172
},
173173
isEnabled: () => {
174+
if (tracker.currentWidget?.model.jgisSettings.identifyDisabled) {
175+
return false;
176+
}
174177
const selectedLayer = getSingleSelectedLayer(tracker);
175178
if (!selectedLayer) {
176179
return false;
@@ -847,6 +850,195 @@ export function addCommands(
847850
icon: targetWithCenterIcon,
848851
});
849852

853+
// Panel visibility commands
854+
commands.addCommand(CommandIDs.toggleLeftPanel, {
855+
label: trans.__('Toggle Left Panel'),
856+
isEnabled: () => Boolean(tracker.currentWidget),
857+
isToggled: () => {
858+
const current = tracker.currentWidget;
859+
return current ? !current.model.jgisSettings.leftPanelDisabled : false;
860+
},
861+
execute: async () => {
862+
const current = tracker.currentWidget;
863+
if (!current) {
864+
return;
865+
}
866+
867+
try {
868+
const settings = await current.model.getSettings();
869+
const currentValue =
870+
settings?.composite?.leftPanelDisabled ??
871+
current.model.jgisSettings.leftPanelDisabled ??
872+
false;
873+
await settings?.set('leftPanelDisabled', !currentValue);
874+
commands.notifyCommandChanged(CommandIDs.toggleLeftPanel);
875+
} catch (err) {
876+
console.error('Failed to toggle Left Panel:', err);
877+
}
878+
},
879+
});
880+
881+
commands.addCommand(CommandIDs.toggleRightPanel, {
882+
label: trans.__('Toggle Right Panel'),
883+
isEnabled: () => Boolean(tracker.currentWidget),
884+
isToggled: () => {
885+
const current = tracker.currentWidget;
886+
return current ? !current.model.jgisSettings.rightPanelDisabled : false;
887+
},
888+
execute: async () => {
889+
const current = tracker.currentWidget;
890+
if (!current) {
891+
return;
892+
}
893+
894+
try {
895+
const settings = await current.model.getSettings();
896+
const currentValue =
897+
settings?.composite?.rightPanelDisabled ??
898+
current.model.jgisSettings.rightPanelDisabled ??
899+
false;
900+
await settings?.set('rightPanelDisabled', !currentValue);
901+
commands.notifyCommandChanged(CommandIDs.toggleRightPanel);
902+
} catch (err) {
903+
console.error('Failed to toggle Right Panel:', err);
904+
}
905+
},
906+
});
907+
908+
// Left panel tabs
909+
commands.addCommand(CommandIDs.showLayersTab, {
910+
label: trans.__('Show Layers Tab'),
911+
isEnabled: () => Boolean(tracker.currentWidget),
912+
isToggled: () =>
913+
tracker.currentWidget
914+
? !tracker.currentWidget.model.jgisSettings.layersDisabled
915+
: false,
916+
execute: async () => {
917+
const current = tracker.currentWidget;
918+
if (!current) {
919+
return;
920+
}
921+
const settings = await current.model.getSettings();
922+
const currentValue =
923+
settings?.composite?.layersDisabled ??
924+
current.model.jgisSettings.layersDisabled ??
925+
false;
926+
await settings?.set('layersDisabled', !currentValue);
927+
commands.notifyCommandChanged(CommandIDs.showLayersTab);
928+
},
929+
});
930+
931+
commands.addCommand(CommandIDs.showStacBrowserTab, {
932+
label: trans.__('Show STAC Browser Tab'),
933+
isEnabled: () => Boolean(tracker.currentWidget),
934+
isToggled: () =>
935+
tracker.currentWidget
936+
? !tracker.currentWidget.model.jgisSettings.stacBrowserDisabled
937+
: false,
938+
execute: async () => {
939+
const current = tracker.currentWidget;
940+
if (!current) {
941+
return;
942+
}
943+
const settings = await current.model.getSettings();
944+
const currentValue =
945+
settings?.composite?.stacBrowserDisabled ??
946+
current.model.jgisSettings.stacBrowserDisabled ??
947+
false;
948+
await settings?.set('stacBrowserDisabled', !currentValue);
949+
commands.notifyCommandChanged(CommandIDs.showStacBrowserTab);
950+
},
951+
});
952+
953+
commands.addCommand(CommandIDs.showFiltersTab, {
954+
label: trans.__('Show Filters Tab'),
955+
isEnabled: () => Boolean(tracker.currentWidget),
956+
isToggled: () =>
957+
tracker.currentWidget
958+
? !tracker.currentWidget.model.jgisSettings.filtersDisabled
959+
: false,
960+
execute: async () => {
961+
const current = tracker.currentWidget;
962+
if (!current) {
963+
return;
964+
}
965+
const settings = await current.model.getSettings();
966+
const currentValue =
967+
settings?.composite?.filtersDisabled ??
968+
current.model.jgisSettings.filtersDisabled ??
969+
false;
970+
await settings?.set('filtersDisabled', !currentValue);
971+
commands.notifyCommandChanged(CommandIDs.showFiltersTab);
972+
},
973+
});
974+
975+
// Right panel tabs
976+
commands.addCommand(CommandIDs.showObjectPropertiesTab, {
977+
label: trans.__('Show Object Properties Tab'),
978+
isEnabled: () => Boolean(tracker.currentWidget),
979+
isToggled: () =>
980+
tracker.currentWidget
981+
? !tracker.currentWidget.model.jgisSettings.objectPropertiesDisabled
982+
: false,
983+
execute: async () => {
984+
const current = tracker.currentWidget;
985+
if (!current) {
986+
return;
987+
}
988+
const settings = await current.model.getSettings();
989+
const currentValue =
990+
settings?.composite?.objectPropertiesDisabled ??
991+
current.model.jgisSettings.objectPropertiesDisabled ??
992+
false;
993+
await settings?.set('objectPropertiesDisabled', !currentValue);
994+
commands.notifyCommandChanged(CommandIDs.showObjectPropertiesTab);
995+
},
996+
});
997+
998+
commands.addCommand(CommandIDs.showAnnotationsTab, {
999+
label: trans.__('Show Annotations Tab'),
1000+
isEnabled: () => Boolean(tracker.currentWidget),
1001+
isToggled: () =>
1002+
tracker.currentWidget
1003+
? !tracker.currentWidget.model.jgisSettings.annotationsDisabled
1004+
: false,
1005+
execute: async () => {
1006+
const current = tracker.currentWidget;
1007+
if (!current) {
1008+
return;
1009+
}
1010+
const settings = await current.model.getSettings();
1011+
const currentValue =
1012+
settings?.composite?.annotationsDisabled ??
1013+
current.model.jgisSettings.annotationsDisabled ??
1014+
false;
1015+
await settings?.set('annotationsDisabled', !currentValue);
1016+
commands.notifyCommandChanged(CommandIDs.showAnnotationsTab);
1017+
},
1018+
});
1019+
1020+
commands.addCommand(CommandIDs.showIdentifyPanelTab, {
1021+
label: trans.__('Show Identify Panel Tab'),
1022+
isEnabled: () => Boolean(tracker.currentWidget),
1023+
isToggled: () =>
1024+
tracker.currentWidget
1025+
? !tracker.currentWidget.model.jgisSettings.identifyDisabled
1026+
: false,
1027+
execute: async () => {
1028+
const current = tracker.currentWidget;
1029+
if (!current) {
1030+
return;
1031+
}
1032+
const settings = await current.model.getSettings();
1033+
const currentValue =
1034+
settings?.composite?.identifyDisabled ??
1035+
current.model.jgisSettings.identifyDisabled ??
1036+
false;
1037+
await settings?.set('identifyDisabled', !currentValue);
1038+
commands.notifyCommandChanged(CommandIDs.showIdentifyPanelTab);
1039+
},
1040+
});
1041+
8501042
loadKeybindings(commands, keybindings);
8511043
}
8521044

packages/base/src/panelview/leftpanel.tsx

Lines changed: 66 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { IJupyterGISModel, SelectionType } from '@jupytergis/schema';
2-
import { PageConfig } from '@jupyterlab/coreutils';
32
import { IStateDB } from '@jupyterlab/statedb';
43
import { CommandRegistry } from '@lumino/commands';
54
import { MouseEvent as ReactMouseEvent } from 'react';
@@ -31,60 +30,86 @@ interface ILeftPanelProps {
3130
export const LeftPanel: React.FC<ILeftPanelProps> = (
3231
props: ILeftPanelProps,
3332
) => {
34-
const hideStacPanel = PageConfig.getOption('HIDE_STAC_PANEL') === 'true';
33+
const [settings, setSettings] = React.useState(props.model.jgisSettings);
34+
35+
React.useEffect(() => {
36+
const onSettingsChanged = () => {
37+
setSettings({ ...props.model.jgisSettings });
38+
};
39+
40+
props.model.settingsChanged.connect(onSettingsChanged);
41+
return () => {
42+
props.model.settingsChanged.disconnect(onSettingsChanged);
43+
};
44+
}, [props.model]);
45+
46+
const allLeftTabsDisabled =
47+
settings.layersDisabled &&
48+
settings.stacBrowserDisabled &&
49+
settings.filtersDisabled;
50+
51+
const leftPanelVisible = !settings.leftPanelDisabled && !allLeftTabsDisabled;
3552

3653
const tabInfo = [
37-
{ name: 'layers', title: 'Layers' },
38-
...(hideStacPanel ? [] : [{ name: 'stac', title: 'Stac Browser' }]),
39-
{ name: 'filters', title: 'Filters' },
40-
];
54+
!settings.layersDisabled ? { name: 'layers', title: 'Layers' } : false,
55+
!settings.stacBrowserDisabled
56+
? { name: 'stac', title: 'Stac Browser' }
57+
: false,
58+
!settings.filtersDisabled ? { name: 'filters', title: 'Filters' } : false,
59+
].filter(Boolean) as { name: string; title: string }[];
4160

4261
const [curTab, setCurTab] = React.useState<string | undefined>(
43-
tabInfo[0].name,
62+
tabInfo.length > 0 ? tabInfo[0].name : undefined,
4463
);
4564

4665
return (
47-
<div className="jgis-left-panel-container">
66+
<div
67+
className="jgis-left-panel-container"
68+
style={{ display: leftPanelVisible ? 'block' : 'none' }}
69+
>
4870
<PanelTabs curTab={curTab} className="jgis-panel-tabs">
4971
<TabsList>
50-
{tabInfo.map(e => {
51-
return (
52-
<TabsTrigger
53-
className="jGIS-layer-browser-category"
54-
value={e.name}
55-
onClick={() => {
56-
if (curTab !== e.name) {
57-
setCurTab(e.name);
58-
} else {
59-
setCurTab('');
60-
}
61-
}}
62-
>
63-
{e.title}
64-
</TabsTrigger>
65-
);
66-
})}
72+
{tabInfo.map(e => (
73+
<TabsTrigger
74+
className="jGIS-layer-browser-category"
75+
value={e.name}
76+
onClick={() => {
77+
if (curTab !== e.name) {
78+
setCurTab(e.name);
79+
} else {
80+
setCurTab('');
81+
}
82+
}}
83+
>
84+
{e.title}
85+
</TabsTrigger>
86+
))}
6787
</TabsList>
68-
<TabsContent
69-
value="layers"
70-
className="jgis-panel-tab-content jp-gis-layerPanel"
71-
>
72-
<LayersBodyComponent
73-
model={props.model}
74-
commands={props.commands}
75-
state={props.state}
76-
></LayersBodyComponent>
77-
</TabsContent>
7888

79-
{!hideStacPanel && (
80-
<TabsContent value="stac">
81-
<StacPanel model={props.model}></StacPanel>
89+
{!settings.layersDisabled && (
90+
<TabsContent
91+
value="layers"
92+
className="jgis-panel-tab-content jp-gis-layerPanel"
93+
>
94+
<LayersBodyComponent
95+
model={props.model}
96+
commands={props.commands}
97+
state={props.state}
98+
></LayersBodyComponent>
8299
</TabsContent>
83100
)}
84101

85-
<TabsContent value="filters" className="jgis-panel-tab-content">
86-
<FilterComponent model={props.model}></FilterComponent>,
87-
</TabsContent>
102+
{!settings.stacBrowserDisabled && (
103+
<TabsContent value="stac" className="jgis-panel-tab-content">
104+
<StacPanel model={props.model} />
105+
</TabsContent>
106+
)}
107+
108+
{!settings.filtersDisabled && (
109+
<TabsContent value="filters" className="jgis-panel-tab-content">
110+
<FilterComponent model={props.model}></FilterComponent>
111+
</TabsContent>
112+
)}
88113
</PanelTabs>
89114
</div>
90115
);

0 commit comments

Comments
 (0)