Skip to content

Commit e1a0f00

Browse files
committed
Use story mode setting and option to update UI
1 parent 80f7f74 commit e1a0f00

File tree

5 files changed

+130
-44
lines changed

5 files changed

+130
-44
lines changed

packages/base/src/commands/index.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1057,9 +1057,14 @@ export function addCommands(
10571057
commands.addCommand(CommandIDs.addStorySegment, {
10581058
label: trans.__('Add Story Segment'),
10591059
isEnabled: () => {
1060-
return tracker.currentWidget
1061-
? tracker.currentWidget.model.sharedModel.editable
1062-
: false;
1060+
const current = tracker.currentWidget;
1061+
if (!current) {
1062+
return false;
1063+
}
1064+
return (
1065+
current.model.sharedModel.editable &&
1066+
!current.model.jgisSettings.storyMapsDisabled
1067+
);
10631068
},
10641069
execute: args => {
10651070
const current = tracker.currentWidget;

packages/base/src/panelview/leftpanel.tsx

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ export const LeftPanel: React.FC<ILeftPanelProps> = (
3535
props: ILeftPanelProps,
3636
) => {
3737
const [settings, setSettings] = React.useState(props.model.jgisSettings);
38+
const [options, setOptions] = React.useState(props.model.getOptions());
39+
const storyMapPresentationMode = options.storyMapPresentationMode ?? false;
3840
const [layerTree, setLayerTree] = React.useState<IJGISLayerTree>(
3941
props.model.getLayerTree(),
4042
);
@@ -43,17 +45,22 @@ export const LeftPanel: React.FC<ILeftPanelProps> = (
4345
const onSettingsChanged = () => {
4446
setSettings({ ...props.model.jgisSettings });
4547
};
48+
const onOptionsChanged = () => {
49+
setOptions({ ...props.model.getOptions() });
50+
};
4651
const updateLayerTree = () => {
4752
setLayerTree(props.model.getLayerTree() || []);
4853
};
4954

5055
props.model.settingsChanged.connect(onSettingsChanged);
56+
props.model.sharedOptionsChanged.connect(onOptionsChanged);
5157
props.model.sharedModel.layersChanged.connect(updateLayerTree);
5258
props.model.sharedModel.layerTreeChanged.connect(updateLayerTree);
5359

5460
updateLayerTree();
5561
return () => {
5662
props.model.settingsChanged.disconnect(onSettingsChanged);
63+
props.model.sharedOptionsChanged.disconnect(onOptionsChanged);
5764
props.model.sharedModel.layersChanged.disconnect(updateLayerTree);
5865
props.model.sharedModel.layerTreeChanged.disconnect(updateLayerTree);
5966
};
@@ -141,19 +148,22 @@ export const LeftPanel: React.FC<ILeftPanelProps> = (
141148
const allLeftTabsDisabled =
142149
settings.layersDisabled &&
143150
settings.stacBrowserDisabled &&
144-
settings.filtersDisabled;
151+
settings.filtersDisabled &&
152+
settings.storyMapsDisabled;
145153

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

148156
const tabInfo = [
149157
!settings.layersDisabled ? { name: 'layers', title: 'Layers' } : false,
150-
!settings.stacBrowserDisabled && settings.storyMapPresentationDisabled
158+
!settings.stacBrowserDisabled && !storyMapPresentationMode
151159
? { name: 'stac', title: 'Stac Browser' }
152160
: false,
153-
!settings.filtersDisabled && settings.storyMapPresentationDisabled
161+
!settings.filtersDisabled && !storyMapPresentationMode
154162
? { name: 'filters', title: 'Filters' }
155163
: false,
156-
{ name: 'segments', title: 'Segments' },
164+
!settings.storyMapsDisabled
165+
? { name: 'segments', title: 'Segments' }
166+
: false,
157167
].filter(Boolean) as { name: string; title: string }[];
158168

159169
const [curTab, setCurTab] = React.useState<string | undefined>(
@@ -211,14 +221,16 @@ export const LeftPanel: React.FC<ILeftPanelProps> = (
211221
</TabsContent>
212222
)}
213223

214-
<TabsContent value="segments" className="jgis-panel-tab-content">
215-
<LayersBodyComponent
216-
model={props.model}
217-
commands={props.commands}
218-
state={props.state}
219-
layerTree={storySegmentLayerTree}
220-
></LayersBodyComponent>
221-
</TabsContent>
224+
{!settings.storyMapsDisabled && (
225+
<TabsContent value="segments" className="jgis-panel-tab-content">
226+
<LayersBodyComponent
227+
model={props.model}
228+
commands={props.commands}
229+
state={props.state}
230+
layerTree={storySegmentLayerTree}
231+
></LayersBodyComponent>
232+
</TabsContent>
233+
)}
222234
</PanelTabs>
223235
</div>
224236
);

packages/base/src/panelview/rightpanel.tsx

Lines changed: 38 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,19 @@ interface IRightPanelProps {
2828
export const RightPanel: React.FC<IRightPanelProps> = props => {
2929
const [displayEditor, setDisplayEditor] = React.useState(true);
3030
const [settings, setSettings] = React.useState(props.model.jgisSettings);
31+
const [options, setOptions] = React.useState(props.model.getOptions());
32+
33+
const storyMapPresentationMode = options.storyMapPresentationMode ?? false;
3134
const tabInfo = [
32-
!settings.objectPropertiesDisabled && settings.storyMapPresentationDisabled
35+
!settings.objectPropertiesDisabled && !storyMapPresentationMode
3336
? { name: 'objectProperties', title: 'Object Properties' }
3437
: false,
35-
{
36-
name: 'storyPanel',
37-
title: displayEditor ? 'Story Editor' : 'Story Map',
38-
},
38+
!settings.storyMapsDisabled
39+
? {
40+
name: 'storyPanel',
41+
title: displayEditor ? 'Story Editor' : 'Story Map',
42+
}
43+
: false,
3944
!settings.annotationsDisabled
4045
? { name: 'annotations', title: 'Annotations' }
4146
: false,
@@ -45,7 +50,7 @@ export const RightPanel: React.FC<IRightPanelProps> = props => {
4550
].filter(Boolean) as { name: string; title: string }[];
4651

4752
const [curTab, setCurTab] = React.useState<string>(() => {
48-
if (!settings.storyMapPresentationDisabled) {
53+
if (!settings.storyMapsDisabled) {
4954
return 'storyPanel';
5055
}
5156
return tabInfo.length > 0 ? tabInfo[0].name : '';
@@ -55,6 +60,9 @@ export const RightPanel: React.FC<IRightPanelProps> = props => {
5560
const onSettingsChanged = () => {
5661
setSettings({ ...props.model.jgisSettings });
5762
};
63+
const onOptionsChanged = () => {
64+
setOptions({ ...props.model.getOptions() });
65+
};
5866
let currentlyIdentifiedFeatures: any = undefined;
5967
const onAwerenessChanged = (
6068
_: IJupyterGISModel,
@@ -74,10 +82,12 @@ export const RightPanel: React.FC<IRightPanelProps> = props => {
7482
};
7583

7684
props.model.settingsChanged.connect(onSettingsChanged);
85+
props.model.sharedOptionsChanged.connect(onOptionsChanged);
7786
props.model.clientStateChanged.connect(onAwerenessChanged);
7887

7988
return () => {
8089
props.model.settingsChanged.disconnect(onSettingsChanged);
90+
props.model.sharedOptionsChanged.disconnect(onOptionsChanged);
8191
props.model.clientStateChanged.disconnect(onAwerenessChanged);
8292
};
8393
}, [props.model]);
@@ -136,25 +146,28 @@ export const RightPanel: React.FC<IRightPanelProps> = props => {
136146
</TabsContent>
137147
)}
138148

139-
<TabsContent
140-
value="storyPanel"
141-
className="jgis-panel-tab-content"
142-
style={{ paddingTop: 0 }}
143-
>
144-
<div style={{ padding: '0 0.5rem 0.5rem 0.5rem' }}>
145-
{settings.storyMapPresentationDisabled && (
146-
<PreviewModeSwitch
147-
checked={!displayEditor}
148-
onCheckedChange={toggleEditor}
149-
/>
150-
)}
151-
{!settings.storyMapPresentationDisabled || !displayEditor ? (
152-
<StoryViewerPanel model={props.model} />
153-
) : (
154-
<StoryEditorPanel model={props.model} />
155-
)}
156-
</div>
157-
</TabsContent>
149+
{!settings.storyMapsDisabled && (
150+
<TabsContent
151+
value="storyPanel"
152+
className="jgis-panel-tab-content"
153+
style={{ paddingTop: 0 }}
154+
>
155+
<div style={{ padding: '0 0.5rem 0.5rem 0.5rem' }}>
156+
{/* Don't want to see the toggle switch in presentation mode */}
157+
{!storyMapPresentationMode && (
158+
<PreviewModeSwitch
159+
checked={!displayEditor}
160+
onCheckedChange={toggleEditor}
161+
/>
162+
)}
163+
{storyMapPresentationMode || !displayEditor ? (
164+
<StoryViewerPanel model={props.model} />
165+
) : (
166+
<StoryEditorPanel model={props.model} />
167+
)}
168+
</div>
169+
</TabsContent>
170+
)}
158171

159172
{!settings.annotationsDisabled && (
160173
<TabsContent value="annotations" className="jgis-panel-tab-content">

packages/base/src/toolbar/widget.tsx

Lines changed: 59 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ function createUserIconRenderer(model: JupyterGISModel) {
6464

6565
export class ToolbarWidget extends ReactiveToolbar {
6666
private _model: JupyterGISModel;
67+
private _newSubMenu: MenuSvg | null = null;
6768

6869
constructor(options: ToolbarWidget.IOptions) {
6970
super();
@@ -83,6 +84,7 @@ export class ToolbarWidget extends ReactiveToolbar {
8384

8485
const NewSubMenu = new MenuSvg({ commands: options.commands });
8586
NewSubMenu.title.label = 'Add Layer';
87+
this._newSubMenu = NewSubMenu;
8688

8789
NewSubMenu.addItem({
8890
type: 'submenu',
@@ -92,9 +94,11 @@ export class ToolbarWidget extends ReactiveToolbar {
9294
type: 'submenu',
9395
submenu: vectorSubMenu(options.commands),
9496
});
95-
NewSubMenu.addItem({
96-
command: CommandIDs.addStorySegment,
97-
});
97+
98+
this._updateStorySegmentMenuItem();
99+
100+
// Listen for settings changes
101+
this._model.settingsChanged.connect(this._onSettingsChanged, this);
98102

99103
const NewEntryButton = new ToolbarButton({
100104
icon: addIcon,
@@ -175,6 +179,58 @@ export class ToolbarWidget extends ReactiveToolbar {
175179
);
176180
}
177181
}
182+
183+
/**
184+
* Updates the story segment menu item based on settings
185+
*/
186+
private _updateStorySegmentMenuItem(): void {
187+
if (!this._newSubMenu) {
188+
return;
189+
}
190+
191+
const shouldShow = !this._model.jgisSettings.storyMapsDisabled;
192+
193+
// Find if the item already exists by checking menu items
194+
let itemIndex: number | null = null;
195+
for (let i = 0; i < this._newSubMenu.items.length; i++) {
196+
const item = this._newSubMenu.items[i];
197+
if (
198+
item.type === 'command' &&
199+
item.command === CommandIDs.addStorySegment
200+
) {
201+
itemIndex = i;
202+
break;
203+
}
204+
}
205+
206+
const isCurrentlyAdded = itemIndex !== null;
207+
208+
if (shouldShow && !isCurrentlyAdded) {
209+
this._newSubMenu.addItem({
210+
command: CommandIDs.addStorySegment,
211+
});
212+
} else if (!shouldShow && isCurrentlyAdded) {
213+
if (itemIndex !== null) {
214+
this._newSubMenu.removeItemAt(itemIndex);
215+
}
216+
}
217+
}
218+
219+
/**
220+
* Handles settings changes
221+
*/
222+
private _onSettingsChanged = (sender: JupyterGISModel, key: string): void => {
223+
if (key === 'storyMapsDisabled') {
224+
this._updateStorySegmentMenuItem();
225+
}
226+
};
227+
228+
dispose(): void {
229+
if (this._model) {
230+
this._model.settingsChanged.disconnect(this._onSettingsChanged, this);
231+
}
232+
super.dispose();
233+
}
178234
}
179235

180236
export namespace ToolbarWidget {

packages/schema/src/model.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ const DEFAULT_SETTINGS: IJupyterGISSettings = {
5454
objectPropertiesDisabled: false,
5555
annotationsDisabled: false,
5656
identifyDisabled: false,
57-
storyMapsDisabled: true,
57+
storyMapsDisabled: false,
5858
};
5959

6060
export class JupyterGISModel implements IJupyterGISModel {

0 commit comments

Comments
 (0)