@jupytergis/base 0.14.0 → 0.14.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/commands/BaseCommandIDs.d.ts +0 -1
- package/lib/commands/BaseCommandIDs.js +0 -1
- package/lib/commands/index.js +0 -25
- package/lib/dialogs/symbology/vector_layer/VectorRendering.js +6 -5
- package/lib/dialogs/symbology/vector_layer/components/ValueSelect.js +3 -1
- package/lib/panelview/filter-panel/Filter.d.ts +3 -0
- package/lib/panelview/filter-panel/Filter.js +9 -9
- package/lib/panelview/leftpanel.js +0 -7
- package/lib/panelview/story-maps/SpectaPanel.js +2 -2
- package/lib/panelview/story-maps/StoryViewerPanel.d.ts +1 -2
- package/lib/panelview/story-maps/StoryViewerPanel.js +1 -1
- package/lib/panelview/story-maps/components/SpectaDesktopView.d.ts +2 -1
- package/lib/panelview/story-maps/components/SpectaDesktopView.js +4 -4
- package/lib/panelview/story-maps/hooks/useStoryMap.d.ts +1 -0
- package/lib/panelview/story-maps/hooks/useStoryMap.js +3 -0
- package/lib/stacBrowser/components/filter-extension/QueryableComboBox.js +1 -3
- package/lib/types.d.ts +1 -1
- package/package.json +2 -2
- package/style/shared/button.css +2 -5
- package/style/shared/input.css +2 -2
- package/style/storyPanel.css +5 -0
|
@@ -33,7 +33,6 @@ export declare const toggleLeftPanel = "jupytergis:toggleLeftPanel";
|
|
|
33
33
|
export declare const toggleRightPanel = "jupytergis:toggleRightPanel";
|
|
34
34
|
export declare const showLayersTab = "jupytergis:showLayersTab";
|
|
35
35
|
export declare const showStacBrowserTab = "jupytergis:showStacBrowserTab";
|
|
36
|
-
export declare const showFiltersTab = "jupytergis:showFiltersTab";
|
|
37
36
|
export declare const showObjectPropertiesTab = "jupytergis:showObjectPropertiesTab";
|
|
38
37
|
export declare const showAnnotationsTab = "jupytergis:showAnnotationsTab";
|
|
39
38
|
export declare const showIdentifyPanelTab = "jupytergis:showIdentifyPanelTab";
|
|
@@ -46,7 +46,6 @@ export const toggleRightPanel = 'jupytergis:toggleRightPanel';
|
|
|
46
46
|
// Left panel tabs
|
|
47
47
|
export const showLayersTab = 'jupytergis:showLayersTab';
|
|
48
48
|
export const showStacBrowserTab = 'jupytergis:showStacBrowserTab';
|
|
49
|
-
export const showFiltersTab = 'jupytergis:showFiltersTab';
|
|
50
49
|
// Right panel tabs
|
|
51
50
|
export const showObjectPropertiesTab = 'jupytergis:showObjectPropertiesTab';
|
|
52
51
|
export const showAnnotationsTab = 'jupytergis:showAnnotationsTab';
|
package/lib/commands/index.js
CHANGED
|
@@ -1047,31 +1047,6 @@ export function addCommands(app, tracker, translator, formSchemaRegistry, layerB
|
|
|
1047
1047
|
commands.notifyCommandChanged(CommandIDs.showStacBrowserTab);
|
|
1048
1048
|
},
|
|
1049
1049
|
});
|
|
1050
|
-
commands.addCommand(CommandIDs.showFiltersTab, {
|
|
1051
|
-
label: trans.__('Show Filters Tab'),
|
|
1052
|
-
caption: 'Show the filters tab in the current JupyterGIS document.',
|
|
1053
|
-
describedBy: {
|
|
1054
|
-
args: {
|
|
1055
|
-
type: 'object',
|
|
1056
|
-
properties: {},
|
|
1057
|
-
},
|
|
1058
|
-
},
|
|
1059
|
-
isEnabled: () => Boolean(tracker.currentWidget),
|
|
1060
|
-
isToggled: () => tracker.currentWidget
|
|
1061
|
-
? !tracker.currentWidget.model.jgisSettings.filtersDisabled
|
|
1062
|
-
: false,
|
|
1063
|
-
execute: async () => {
|
|
1064
|
-
var _a, _b, _c;
|
|
1065
|
-
const current = tracker.currentWidget;
|
|
1066
|
-
if (!current) {
|
|
1067
|
-
return;
|
|
1068
|
-
}
|
|
1069
|
-
const settings = await current.model.getSettings();
|
|
1070
|
-
const currentValue = (_c = (_b = (_a = settings === null || settings === void 0 ? void 0 : settings.composite) === null || _a === void 0 ? void 0 : _a.filtersDisabled) !== null && _b !== void 0 ? _b : current.model.jgisSettings.filtersDisabled) !== null && _c !== void 0 ? _c : false;
|
|
1071
|
-
await (settings === null || settings === void 0 ? void 0 : settings.set('filtersDisabled', !currentValue));
|
|
1072
|
-
commands.notifyCommandChanged(CommandIDs.showFiltersTab);
|
|
1073
|
-
},
|
|
1074
|
-
});
|
|
1075
1050
|
// Right panel tabs
|
|
1076
1051
|
commands.addCommand(CommandIDs.showObjectPropertiesTab, {
|
|
1077
1052
|
label: trans.__('Show Object Properties Tab'),
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React, { useEffect, useState } from 'react';
|
|
2
2
|
import { useGetProperties } from "../hooks/useGetProperties";
|
|
3
|
+
import FilterComponent from "../../../panelview/filter-panel/Filter";
|
|
3
4
|
import { getColorCodeFeatureAttributes, getFeatureAttributes, getNumericFeatureAttributes, objectEntries, } from "../../../tools";
|
|
4
5
|
import Canonical from './types/Canonical';
|
|
5
6
|
import Categorized from './types/Categorized';
|
|
@@ -92,8 +93,8 @@ const VectorRendering = ({ model, okSignalPromise, layerId, isStorySegmentOverri
|
|
|
92
93
|
const selectableRenderTypes = getSelectableRenderTypes(featureProperties, layer.type);
|
|
93
94
|
const selectedRenderTypeProps = selectableRenderTypes[selectedRenderType];
|
|
94
95
|
return (React.createElement(React.Fragment, null,
|
|
95
|
-
selectedRenderTypeProps.isTabbed && (React.createElement("div", { className: "jp-gis-symbology-tabs" }, ['color', 'radius'].map(tab => (React.createElement("button", { key: tab, className: `jp-gis-tab ${symbologyTab === tab ? 'active' : ''}`, onClick: () => setSymbologyTab(tab) }, tab.charAt(0).toUpperCase() + tab.slice(1)))))),
|
|
96
|
-
React.createElement("div", { className: "jp-gis-symbology-row" },
|
|
96
|
+
selectedRenderTypeProps.isTabbed && (React.createElement("div", { className: "jp-gis-symbology-tabs" }, ['color', 'radius', 'filters'].map(tab => (React.createElement("button", { key: tab, className: `jp-gis-tab ${symbologyTab === tab ? 'active' : ''}`, onClick: () => setSymbologyTab(tab) }, tab.charAt(0).toUpperCase() + tab.slice(1)))))),
|
|
97
|
+
symbologyTab !== 'filters' && (React.createElement("div", { className: "jp-gis-symbology-row" },
|
|
97
98
|
React.createElement("label", { htmlFor: "render-type-select" }, "Render Type:"),
|
|
98
99
|
React.createElement("div", { className: "jp-select-wrapper" },
|
|
99
100
|
React.createElement("select", { name: "render-type-select", id: "render-type-select", className: "jp-mod-styled", value: selectedRenderType, onChange: event => {
|
|
@@ -101,11 +102,11 @@ const VectorRendering = ({ model, okSignalPromise, layerId, isStorySegmentOverri
|
|
|
101
102
|
} }, objectEntries(selectableRenderTypes)
|
|
102
103
|
.filter(([renderType, renderTypeProps]) => renderTypeProps.layerTypeSupported &&
|
|
103
104
|
!(renderType === 'Heatmap' && symbologyTab === 'radius'))
|
|
104
|
-
.map(([renderType, _]) => (React.createElement("option", { key: renderType, value: renderType }, renderType)))))),
|
|
105
|
-
React.createElement(selectedRenderTypeProps.component, Object.assign({ model: model, okSignalPromise: okSignalPromise, layerId: layerId, isStorySegmentOverride: isStorySegmentOverride, segmentId: segmentId }, (selectedRenderTypeProps.isTabbed ? { symbologyTab } : {}), (selectedRenderTypeProps.selectableAttributesAndValues
|
|
105
|
+
.map(([renderType, _]) => (React.createElement("option", { key: renderType, value: renderType }, renderType))))))),
|
|
106
|
+
symbologyTab === 'filters' ? (React.createElement(FilterComponent, { model: model, okSignalPromise: okSignalPromise })) : (React.createElement(selectedRenderTypeProps.component, Object.assign({ model: model, okSignalPromise: okSignalPromise, layerId: layerId, isStorySegmentOverride: isStorySegmentOverride, segmentId: segmentId }, (selectedRenderTypeProps.isTabbed ? { symbologyTab } : {}), (selectedRenderTypeProps.selectableAttributesAndValues
|
|
106
107
|
? {
|
|
107
108
|
selectableAttributesAndValues: selectedRenderTypeProps.selectableAttributesAndValues,
|
|
108
109
|
}
|
|
109
|
-
: {})))));
|
|
110
|
+
: {}))))));
|
|
110
111
|
};
|
|
111
112
|
export default VectorRendering;
|
|
@@ -2,6 +2,8 @@ import React from 'react';
|
|
|
2
2
|
const ValueSelect = ({ featureProperties, selectedValue, setSelectedValue, }) => {
|
|
3
3
|
return (React.createElement("div", { className: "jp-gis-symbology-row" },
|
|
4
4
|
React.createElement("label", { htmlFor: 'vector-value-select' }, "Value:"),
|
|
5
|
-
React.createElement("select", { name: 'vector-value-select', onChange: event => setSelectedValue(event.target.value), className: "jp-mod-styled" }, Object.keys(featureProperties)
|
|
5
|
+
React.createElement("select", { name: 'vector-value-select', onChange: event => setSelectedValue(event.target.value), className: "jp-mod-styled" }, Object.keys(featureProperties)
|
|
6
|
+
.sort((a, b) => a.localeCompare(b))
|
|
7
|
+
.map((feature, index) => (React.createElement("option", { key: index, value: feature, selected: feature === selectedValue, className: "jp-mod-styled" }, feature))))));
|
|
6
8
|
};
|
|
7
9
|
export default ValueSelect;
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { IJupyterGISModel } from '@jupytergis/schema';
|
|
2
|
+
import { PromiseDelegate } from '@lumino/coreutils';
|
|
3
|
+
import { Signal } from '@lumino/signaling';
|
|
2
4
|
import React from 'react';
|
|
3
5
|
interface IFilterComponentProps {
|
|
4
6
|
model: IJupyterGISModel;
|
|
7
|
+
okSignalPromise: PromiseDelegate<Signal<any, null>>;
|
|
5
8
|
}
|
|
6
9
|
declare const FilterComponent: React.FC<IFilterComponentProps>;
|
|
7
10
|
export default FilterComponent;
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { Button } from '@jupyterlab/ui-components';
|
|
2
2
|
import { cloneDeep } from 'lodash';
|
|
3
3
|
import React, { useEffect, useRef, useState } from 'react';
|
|
4
|
+
import { useOkSignal } from "../../dialogs/symbology/hooks/useOkSignal";
|
|
4
5
|
import { debounce, loadFile } from "../../tools";
|
|
5
6
|
import FilterRow from './FilterRow';
|
|
6
|
-
const FilterComponent = ({ model }) => {
|
|
7
|
+
const FilterComponent = ({ model, okSignalPromise, }) => {
|
|
7
8
|
const featuresInLayerRef = useRef({});
|
|
8
9
|
const [logicalOp, setLogicalOp] = useState('all');
|
|
9
10
|
const [selectedLayer, setSelectedLayer] = useState('');
|
|
@@ -48,6 +49,9 @@ const FilterComponent = ({ model }) => {
|
|
|
48
49
|
model === null || model === void 0 ? void 0 : model.sharedOptionsChanged.disconnect(handleSharedOptionsChanged);
|
|
49
50
|
};
|
|
50
51
|
}, [model]);
|
|
52
|
+
useOkSignal(okSignalPromise, () => {
|
|
53
|
+
updateLayerFilters(filterRows, logicalOp);
|
|
54
|
+
});
|
|
51
55
|
useEffect(() => {
|
|
52
56
|
var _a, _b, _c, _d;
|
|
53
57
|
// Reset filter stuff for new layer
|
|
@@ -141,9 +145,6 @@ const FilterComponent = ({ model }) => {
|
|
|
141
145
|
updateLayerFilters([]);
|
|
142
146
|
setFilterRows([]);
|
|
143
147
|
};
|
|
144
|
-
const submitFilter = () => {
|
|
145
|
-
updateLayerFilters(filterRows);
|
|
146
|
-
};
|
|
147
148
|
const updateLayerFilters = (filters, op) => {
|
|
148
149
|
const layer = model === null || model === void 0 ? void 0 : model.getLayer(selectedLayer);
|
|
149
150
|
if (!layer) {
|
|
@@ -158,17 +159,16 @@ const FilterComponent = ({ model }) => {
|
|
|
158
159
|
return (React.createElement(React.Fragment, null,
|
|
159
160
|
shouldDisplay && (React.createElement("div", { className: "jp-gis-filter-main" },
|
|
160
161
|
React.createElement("div", { id: "filter-container", className: "jp-gis-filter-select-container" },
|
|
161
|
-
React.createElement("select", { className: "jp-mod-styled rjsf jp-gis-logical-select", onChange: handleLogicalOpChange },
|
|
162
|
-
React.createElement("option", {
|
|
163
|
-
React.createElement("option", {
|
|
162
|
+
React.createElement("select", { className: "jp-mod-styled rjsf jp-gis-logical-select", value: logicalOp, onChange: handleLogicalOpChange },
|
|
163
|
+
React.createElement("option", { value: "all" }, "All"),
|
|
164
|
+
React.createElement("option", { value: "any" }, "Any")),
|
|
164
165
|
filterRows.map((row, index) => (React.createElement(FilterRow, { key: index, index: index, features: featuresInLayer, filterRows: filterRows, setFilterRows: setFilterRows, deleteRow: () => deleteRow(index) })))),
|
|
165
166
|
React.createElement("div", { className: "jp-gis-filter-button-container" },
|
|
166
167
|
React.createElement("div", { style: {
|
|
167
168
|
justifyContent: 'flex-start',
|
|
168
169
|
} },
|
|
169
170
|
React.createElement(Button, { className: "jp-Dialog-button jp-mod-accept jp-mod-styled", onClick: addFilterRow, "data-testid": "add-filter-button" }, "Add"),
|
|
170
|
-
React.createElement(Button, { className: "jp-Dialog-button jp-mod-reject jp-mod-styled", onClick: clearFilters }, "Clear")),
|
|
171
|
-
React.createElement(Button, { className: "jp-Dialog-button jp-mod-accept jp-mod-styled", onClick: submitFilter }, "Submit")))),
|
|
171
|
+
React.createElement(Button, { className: "jp-Dialog-button jp-mod-reject jp-mod-styled", onClick: clearFilters }, "Clear"))))),
|
|
172
172
|
!shouldDisplay && (React.createElement("div", { style: { textAlign: 'center' } }, "No layer selected"))));
|
|
173
173
|
};
|
|
174
174
|
export default FilterComponent;
|
|
@@ -2,7 +2,6 @@ import * as React from 'react';
|
|
|
2
2
|
import Draggable from 'react-draggable';
|
|
3
3
|
import { CommandIDs } from '../constants';
|
|
4
4
|
import { LayersBodyComponent } from './components/layers';
|
|
5
|
-
import FilterComponent from './filter-panel/Filter';
|
|
6
5
|
import { PanelTabs, TabsContent, TabsList, TabsTrigger, } from '../shared/components/Tabs';
|
|
7
6
|
import StacPanel from '../stacBrowser/components/StacPanel';
|
|
8
7
|
export const LeftPanel = (props) => {
|
|
@@ -18,9 +17,6 @@ export const LeftPanel = (props) => {
|
|
|
18
17
|
!props.settings.stacBrowserDisabled && !storyMapPresentationMode
|
|
19
18
|
? { name: 'stac', title: 'Stac Browser' }
|
|
20
19
|
: false,
|
|
21
|
-
!props.settings.filtersDisabled && !storyMapPresentationMode
|
|
22
|
-
? { name: 'filters', title: 'Filters' }
|
|
23
|
-
: false,
|
|
24
20
|
!props.settings.storyMapsDisabled
|
|
25
21
|
? { name: 'segments', title: 'Segments' }
|
|
26
22
|
: false,
|
|
@@ -121,7 +117,6 @@ export const LeftPanel = (props) => {
|
|
|
121
117
|
}, [storySegmentLayerTree]);
|
|
122
118
|
const allLeftTabsDisabled = props.settings.layersDisabled &&
|
|
123
119
|
props.settings.stacBrowserDisabled &&
|
|
124
|
-
props.settings.filtersDisabled &&
|
|
125
120
|
props.settings.storyMapsDisabled;
|
|
126
121
|
const leftPanelVisible = !props.settings.leftPanelDisabled && !allLeftTabsDisabled;
|
|
127
122
|
return (React.createElement(Draggable, { handle: ".jgis-tabs-list", cancel: ".jgis-tabs-trigger", bounds: ".jGIS-Mainview-Container" },
|
|
@@ -139,8 +134,6 @@ export const LeftPanel = (props) => {
|
|
|
139
134
|
React.createElement(LayersBodyComponent, { model: props.model, commands: props.commands, state: props.state, layerTree: filteredLayerTree }))),
|
|
140
135
|
!props.settings.stacBrowserDisabled && (React.createElement(TabsContent, { value: "stac", className: "jgis-panel-tab-content jgis-panel-tab-content-stac-panel" },
|
|
141
136
|
React.createElement(StacPanel, { model: props.model }))),
|
|
142
|
-
!props.settings.filtersDisabled && (React.createElement(TabsContent, { value: "filters", className: "jgis-panel-tab-content" },
|
|
143
|
-
React.createElement(FilterComponent, { model: props.model }))),
|
|
144
137
|
!props.settings.storyMapsDisabled && (React.createElement(TabsContent, { value: "segments", className: "jgis-panel-tab-content" },
|
|
145
138
|
React.createElement(LayersBodyComponent, { model: props.model, commands: props.commands, state: props.state, layerTree: storySegmentLayerTree })))))));
|
|
146
139
|
};
|
|
@@ -5,7 +5,7 @@ import { useStoryMap } from './hooks/useStoryMap';
|
|
|
5
5
|
export function SpectaPanel({ model, isSpecta, isMobile, onSegmentTransitionEnd, containerRef, storyViewerPanelRef, addLayer, removeLayer, }) {
|
|
6
6
|
const overrideLayerEntriesRef = useRef([]);
|
|
7
7
|
const segmentContainerRef = useRef(null);
|
|
8
|
-
const { storyData, currentIndex, setIndex, handlePrev, handleNext, hasPrev, hasNext, activeSlide, layerName, } = useStoryMap({
|
|
8
|
+
const { storyData, currentIndex, setIndex, handlePrev, handleNext, hasPrev, hasNext, activeSlide, layerName, showGradient, } = useStoryMap({
|
|
9
9
|
model,
|
|
10
10
|
overrideLayerEntriesRef,
|
|
11
11
|
removeLayer,
|
|
@@ -31,5 +31,5 @@ export function SpectaPanel({ model, isSpecta, isMobile, onSegmentTransitionEnd,
|
|
|
31
31
|
if (isMobile) {
|
|
32
32
|
return (React.createElement(SpectaMobileView, { model: model, segmentContainerRef: segmentContainerRef, storyData: storyData, currentIndex: currentIndex, activeSlide: activeSlide, layerName: layerName, handlePrev: handlePrev, handleNext: handleNext, hasPrev: hasPrev, hasNext: hasNext, setIndex: setIndex }));
|
|
33
33
|
}
|
|
34
|
-
return (React.createElement(SpectaDesktopView, { model: model, isSpecta: isSpecta, containerRef: containerRef, storyViewerPanelRef: storyViewerPanelRef, segmentContainerRef: segmentContainerRef, storyData: storyData, currentIndex: currentIndex, activeSlide: activeSlide, layerName: layerName, handlePrev: handlePrev, handleNext: handleNext, hasPrev: hasPrev, hasNext: hasNext, setIndex: setIndex }));
|
|
34
|
+
return (React.createElement(SpectaDesktopView, { model: model, isSpecta: isSpecta, containerRef: containerRef, storyViewerPanelRef: storyViewerPanelRef, segmentContainerRef: segmentContainerRef, storyData: storyData, currentIndex: currentIndex, activeSlide: activeSlide, layerName: layerName, handlePrev: handlePrev, handleNext: handleNext, hasPrev: hasPrev, hasNext: hasNext, showGradient: showGradient, setIndex: setIndex }));
|
|
35
35
|
}
|
|
@@ -5,7 +5,6 @@ interface IStoryViewerPanelProps {
|
|
|
5
5
|
model: IJupyterGISModel;
|
|
6
6
|
isSpecta: boolean;
|
|
7
7
|
isMobile?: boolean;
|
|
8
|
-
className?: string;
|
|
9
8
|
/** Ref for the segment container (SpectaPanel uses it for animationend). */
|
|
10
9
|
segmentContainerRef?: RefObject<HTMLDivElement>;
|
|
11
10
|
storyData: IJGISStoryMap | null;
|
|
@@ -41,7 +40,7 @@ export type StoryNavPlacement = 'below-title' | 'over-image' | 'subtitle-specta'
|
|
|
41
40
|
* Story viewer (presentational). Receives story state and callbacks from parent.
|
|
42
41
|
* Desktop scroll/sentinel/imperative handle live in SpectaDesktopView.
|
|
43
42
|
*/
|
|
44
|
-
declare function StoryViewerPanel({ model, isSpecta, isMobile,
|
|
43
|
+
declare function StoryViewerPanel({ model, isSpecta, isMobile, segmentContainerRef, storyData, currentIndex, activeSlide, layerName, handlePrev, handleNext, hasPrev, hasNext, setIndex, }: IStoryViewerPanelProps): React.JSX.Element;
|
|
45
44
|
declare namespace StoryViewerPanel {
|
|
46
45
|
var displayName: string;
|
|
47
46
|
}
|
|
@@ -20,7 +20,7 @@ function getStoryNavPlacement(isSpecta, hasImage, storyType, isMobile) {
|
|
|
20
20
|
* Story viewer (presentational). Receives story state and callbacks from parent.
|
|
21
21
|
* Desktop scroll/sentinel/imperative handle live in SpectaDesktopView.
|
|
22
22
|
*/
|
|
23
|
-
function StoryViewerPanel({ model, isSpecta, isMobile = false,
|
|
23
|
+
function StoryViewerPanel({ model, isSpecta, isMobile = false, segmentContainerRef, storyData, currentIndex, activeSlide, layerName, handlePrev, handleNext, hasPrev, hasNext, setIndex, }) {
|
|
24
24
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
|
|
25
25
|
const [imageLoaded, setImageLoaded] = useState(false);
|
|
26
26
|
// Prefetch image when slide changes
|
|
@@ -15,7 +15,8 @@ interface ISpectaDesktopViewProps {
|
|
|
15
15
|
handleNext: () => void;
|
|
16
16
|
hasPrev: boolean;
|
|
17
17
|
hasNext: boolean;
|
|
18
|
+
showGradient: boolean;
|
|
18
19
|
setIndex: (index: number) => void;
|
|
19
20
|
}
|
|
20
|
-
export declare function SpectaDesktopView({ model, isSpecta, containerRef, storyViewerPanelRef, segmentContainerRef, storyData, currentIndex, activeSlide, layerName, handlePrev, handleNext, hasPrev, hasNext, setIndex, }: ISpectaDesktopViewProps): JSX.Element;
|
|
21
|
+
export declare function SpectaDesktopView({ model, isSpecta, containerRef, storyViewerPanelRef, segmentContainerRef, storyData, currentIndex, activeSlide, layerName, handlePrev, handleNext, hasPrev, hasNext, showGradient, setIndex, }: ISpectaDesktopViewProps): JSX.Element;
|
|
21
22
|
export {};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React, { useEffect, useImperativeHandle, useRef, } from 'react';
|
|
2
2
|
import StoryViewerPanel from "../StoryViewerPanel";
|
|
3
3
|
import SpectaPresentationProgressBar from "../../../statusbar/SpectaPresentationProgressBar";
|
|
4
|
-
export function SpectaDesktopView({ model, isSpecta, containerRef, storyViewerPanelRef, segmentContainerRef, storyData, currentIndex, activeSlide, layerName, handlePrev, handleNext, hasPrev, hasNext, setIndex, }) {
|
|
4
|
+
export function SpectaDesktopView({ model, isSpecta, containerRef, storyViewerPanelRef, segmentContainerRef, storyData, currentIndex, activeSlide, layerName, handlePrev, handleNext, hasPrev, hasNext, showGradient, setIndex, }) {
|
|
5
5
|
const scrollContainerRef = useRef(null);
|
|
6
6
|
const topSentinelRef = useRef(null);
|
|
7
7
|
const bottomSentinelRef = useRef(null);
|
|
@@ -39,11 +39,11 @@ export function SpectaDesktopView({ model, isSpecta, containerRef, storyViewerPa
|
|
|
39
39
|
getScrollContainer: () => scrollContainerRef.current,
|
|
40
40
|
}), [handlePrev, handleNext, isSpecta, hasPrev, hasNext]);
|
|
41
41
|
return (React.createElement(React.Fragment, null,
|
|
42
|
-
React.createElement("div", { className: "jgis-specta-right-panel-container-mod jgis-right-panel-container" },
|
|
42
|
+
React.createElement("div", { className: "jgis-specta-right-panel-container-mod jgis-right-panel-container", style: showGradient ? undefined : { width: '25%', borderRadius: 0 } },
|
|
43
43
|
React.createElement("div", { ref: containerRef, className: "jgis-specta-story-panel-container" },
|
|
44
|
-
React.createElement("div", { ref: scrollContainerRef, className: "jgis-story-viewer-panel-specta-mod", id: "jgis-story-segment-panel" },
|
|
44
|
+
React.createElement("div", { ref: scrollContainerRef, className: "jgis-story-viewer-panel-specta-mod", id: "jgis-story-segment-panel", style: showGradient ? undefined : { width: 'unset' } },
|
|
45
45
|
React.createElement("div", { ref: topSentinelRef, "aria-hidden": true, "data-story-scroll-sentinel": "top", style: { height: 1, minHeight: 1, pointerEvents: 'none' } }),
|
|
46
|
-
React.createElement(StoryViewerPanel, { model: model, isSpecta: isSpecta,
|
|
46
|
+
React.createElement(StoryViewerPanel, { model: model, isSpecta: isSpecta, segmentContainerRef: segmentContainerRef, storyData: storyData, currentIndex: currentIndex, activeSlide: activeSlide, layerName: layerName, handlePrev: handlePrev, handleNext: handleNext, hasPrev: hasPrev, hasNext: hasNext, setIndex: setIndex }),
|
|
47
47
|
React.createElement("div", { ref: bottomSentinelRef, "aria-hidden": true, "data-story-scroll-sentinel": "bottom", style: { height: 1, minHeight: 1, pointerEvents: 'none' } })))),
|
|
48
48
|
React.createElement(SpectaPresentationProgressBar, { model: model })));
|
|
49
49
|
}
|
|
@@ -22,6 +22,7 @@ export declare function useStoryMap({ model, overrideLayerEntriesRef, removeLaye
|
|
|
22
22
|
storyData: IJGISStoryMap | null;
|
|
23
23
|
storySegments: IJGISLayer[];
|
|
24
24
|
currentIndex: number;
|
|
25
|
+
showGradient: boolean;
|
|
25
26
|
clearOverrideLayers: () => void;
|
|
26
27
|
setIndex: (index: number) => void;
|
|
27
28
|
handlePrev: () => void;
|
|
@@ -16,6 +16,7 @@ export function getSpectaPresentationStyle(story) {
|
|
|
16
16
|
return style;
|
|
17
17
|
}
|
|
18
18
|
export function useStoryMap({ model, overrideLayerEntriesRef, removeLayer, addLayer, panelRef, isSpecta, }) {
|
|
19
|
+
var _a;
|
|
19
20
|
const [currentIndex, setCurrentIndex] = useState(() => { var _a; return (_a = model.getCurrentSegmentIndex()) !== null && _a !== void 0 ? _a : 0; });
|
|
20
21
|
const [storyData, setStoryData] = useState(() => { var _a; return (_a = model.getSelectedStory().story) !== null && _a !== void 0 ? _a : null; });
|
|
21
22
|
const storySegments = useMemo(() => {
|
|
@@ -32,6 +33,7 @@ export function useStoryMap({ model, overrideLayerEntriesRef, removeLayer, addLa
|
|
|
32
33
|
const activeSlide = useMemo(() => currentStorySegment === null || currentStorySegment === void 0 ? void 0 : currentStorySegment.parameters, [currentStorySegment]);
|
|
33
34
|
const layerName = useMemo(() => { var _a; return (_a = currentStorySegment === null || currentStorySegment === void 0 ? void 0 : currentStorySegment.name) !== null && _a !== void 0 ? _a : ''; }, [currentStorySegment]);
|
|
34
35
|
const currentStorySegmentId = useMemo(() => storySegmentIds === null || storySegmentIds === void 0 ? void 0 : storySegmentIds[currentIndex], [storySegmentIds, currentIndex]);
|
|
36
|
+
const showGradient = (_a = storyData === null || storyData === void 0 ? void 0 : storyData.showGradient) !== null && _a !== void 0 ? _a : true;
|
|
35
37
|
const hasPrev = currentIndex > 0;
|
|
36
38
|
const hasNext = currentIndex < segmentCount - 1;
|
|
37
39
|
const clearOverrideLayers = useCallback(() => {
|
|
@@ -236,6 +238,7 @@ export function useStoryMap({ model, overrideLayerEntriesRef, removeLayer, addLa
|
|
|
236
238
|
storyData,
|
|
237
239
|
storySegments,
|
|
238
240
|
currentIndex,
|
|
241
|
+
showGradient,
|
|
239
242
|
clearOverrideLayers,
|
|
240
243
|
setIndex,
|
|
241
244
|
handlePrev,
|
|
@@ -105,9 +105,7 @@ export function QueryableComboBox({ queryables, selectedQueryables, updateSelect
|
|
|
105
105
|
};
|
|
106
106
|
return (React.createElement(SingleDatePicker, { date: parseDate(currentValue), onDateChange: handleDateChange, dateFormat: "P", showIcon: true, placeholder: "Select date", className: "jgis-queryable-combo-input jgis-queryable-combo-input-date-picker" }));
|
|
107
107
|
}
|
|
108
|
-
return (React.createElement(Input, { type: "text",
|
|
109
|
-
// style={{borderRadius: 0}}
|
|
110
|
-
value: currentValue || '', onChange: e => onChange(e.target.value) }));
|
|
108
|
+
return (React.createElement(Input, { type: "text", value: currentValue || '', onChange: e => onChange(e.target.value) }));
|
|
111
109
|
case 'number':
|
|
112
110
|
case 'integer':
|
|
113
111
|
if (val.enum) {
|
package/lib/types.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ import { Map } from 'ol';
|
|
|
6
6
|
export { IDict };
|
|
7
7
|
export type ValueOf<T> = T[keyof T];
|
|
8
8
|
export type JupyterGISTracker = WidgetTracker<IJupyterGISWidget>;
|
|
9
|
-
export type SymbologyTab = 'color' | 'radius';
|
|
9
|
+
export type SymbologyTab = 'color' | 'radius' | 'filters';
|
|
10
10
|
type RgbColorValue = [number, number, number] | [number, number, number, number];
|
|
11
11
|
type HexColorValue = string;
|
|
12
12
|
type InternalRgbArray = number[];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jupytergis/base",
|
|
3
|
-
"version": "0.14.
|
|
3
|
+
"version": "0.14.1",
|
|
4
4
|
"description": "A JupyterLab extension for 3D modelling.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"jupyter",
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
"@jupyter/collaboration": "^4",
|
|
45
45
|
"@jupyter/react-components": "^0.16.6",
|
|
46
46
|
"@jupyter/ydoc": "^2.0.0 || ^3.0.0",
|
|
47
|
-
"@jupytergis/schema": "^0.14.
|
|
47
|
+
"@jupytergis/schema": "^0.14.1",
|
|
48
48
|
"@jupyterlab/application": "^4.3.0",
|
|
49
49
|
"@jupyterlab/apputils": "^4.3.0",
|
|
50
50
|
"@jupyterlab/completer": "^4.3.0",
|
package/style/shared/button.css
CHANGED
|
@@ -13,11 +13,8 @@
|
|
|
13
13
|
border: 0.0375rem solid
|
|
14
14
|
color-mix(in srgb, var(--jp-border-color1), transparent 20%);
|
|
15
15
|
transition: background-color 0.2s ease;
|
|
16
|
-
height:
|
|
17
|
-
padding
|
|
18
|
-
padding-right: 1rem;
|
|
19
|
-
padding-top: 0.5rem;
|
|
20
|
-
padding-bottom: 0.5rem;
|
|
16
|
+
height: 1.5rem;
|
|
17
|
+
padding: 1rem 0.5rem;
|
|
21
18
|
max-width: 20rem;
|
|
22
19
|
gap: 0.25rem;
|
|
23
20
|
}
|
package/style/shared/input.css
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
[data-slot='input'] {
|
|
2
2
|
box-sizing: border-box;
|
|
3
|
-
height:
|
|
3
|
+
height: 2.25rem;
|
|
4
4
|
width: auto;
|
|
5
5
|
min-width: 0;
|
|
6
6
|
border-radius: var(--jp-border-radius, 0.375rem);
|
|
7
7
|
border: 1px solid var(--jp-border-color1);
|
|
8
8
|
background-color: transparent;
|
|
9
|
-
padding: 0.25rem 0.
|
|
9
|
+
padding: 0.25rem 0.5rem;
|
|
10
10
|
font-size: 1rem;
|
|
11
11
|
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
|
|
12
12
|
transition:
|
package/style/storyPanel.css
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
.jgis-story-viewer-panel {
|
|
2
2
|
padding: 1rem;
|
|
3
|
+
padding-right: 0;
|
|
3
4
|
overflow: auto;
|
|
4
5
|
position: relative;
|
|
5
6
|
}
|
|
@@ -187,10 +188,14 @@
|
|
|
187
188
|
}
|
|
188
189
|
|
|
189
190
|
.jgis-story-viewer-panel-specta-mod {
|
|
191
|
+
display: flex;
|
|
192
|
+
height: 100%;
|
|
190
193
|
width: 45%;
|
|
194
|
+
align-items: center;
|
|
191
195
|
font-size: var(--jp-ui-font-size3);
|
|
192
196
|
padding-right: 1.7rem;
|
|
193
197
|
color: var(--jgis-specta-text-color, var(--jp-ui-font-color1));
|
|
198
|
+
background-color: var(--jgis-specta-bg-color, var(--jp-layout-color0));
|
|
194
199
|
overflow-y: auto;
|
|
195
200
|
max-height: 100%;
|
|
196
201
|
}
|