@aics/vole-app 2.11.0
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/LICENSE +33 -0
- package/LICENSE.txt +26 -0
- package/README.md +45 -0
- package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-500.eot +0 -0
- package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-500.js +2337 -0
- package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-500.svg +604 -0
- package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-500.ttf +0 -0
- package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-500.woff +0 -0
- package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-500.woff2 +0 -0
- package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-700.eot +0 -0
- package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-700.js +2336 -0
- package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-700.svg +604 -0
- package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-700.ttf +0 -0
- package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-700.woff +0 -0
- package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-700.woff2 +0 -0
- package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-regular.eot +0 -0
- package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-regular.js +2337 -0
- package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-regular.svg +604 -0
- package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-regular.ttf +0 -0
- package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-regular.woff +0 -0
- package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-regular.woff2 +0 -0
- package/es/aics-image-viewer/assets/icons/axes.js +20 -0
- package/es/aics-image-viewer/assets/icons/boundingBox.js +18 -0
- package/es/aics-image-viewer/assets/icons/camera.js +15 -0
- package/es/aics-image-viewer/assets/icons/channels.js +15 -0
- package/es/aics-image-viewer/assets/icons/closePanel.js +18 -0
- package/es/aics-image-viewer/assets/icons/download.js +17 -0
- package/es/aics-image-viewer/assets/icons/dropdownArrow.js +15 -0
- package/es/aics-image-viewer/assets/icons/index.js +24 -0
- package/es/aics-image-viewer/assets/icons/metadata.js +15 -0
- package/es/aics-image-viewer/assets/icons/preferences.js +15 -0
- package/es/aics-image-viewer/assets/icons/resetView.js +16 -0
- package/es/aics-image-viewer/assets/icons/svg.d.js +0 -0
- package/es/aics-image-viewer/assets/icons/turnTable.js +18 -0
- package/es/aics-image-viewer/assets/styles/animatedEllipsis.css +21 -0
- package/es/aics-image-viewer/assets/styles/globals.css +35 -0
- package/es/aics-image-viewer/assets/styles/noui-slider-override.css +1 -0
- package/es/aics-image-viewer/assets/styles/variables.css +1 -0
- package/es/aics-image-viewer/components/App/ChannelUpdater.js +96 -0
- package/es/aics-image-viewer/components/App/index.js +849 -0
- package/es/aics-image-viewer/components/App/styles.css +60 -0
- package/es/aics-image-viewer/components/App/types.js +1 -0
- package/es/aics-image-viewer/components/AxisClipSliders/index.js +285 -0
- package/es/aics-image-viewer/components/AxisClipSliders/styles.css +257 -0
- package/es/aics-image-viewer/components/BottomPanel/index.js +70 -0
- package/es/aics-image-viewer/components/BottomPanel/styles.css +85 -0
- package/es/aics-image-viewer/components/CellViewerCanvasWrapper/index.js +113 -0
- package/es/aics-image-viewer/components/CellViewerCanvasWrapper/styles.css +12 -0
- package/es/aics-image-viewer/components/ChannelsWidget.js +100 -0
- package/es/aics-image-viewer/components/ChannelsWidgetRow/index.js +158 -0
- package/es/aics-image-viewer/components/ChannelsWidgetRow/styles.css +38 -0
- package/es/aics-image-viewer/components/ColorPicker.js +120 -0
- package/es/aics-image-viewer/components/ControlPanel/index.js +180 -0
- package/es/aics-image-viewer/components/ControlPanel/styles.css +169 -0
- package/es/aics-image-viewer/components/CustomizeWidget.js +46 -0
- package/es/aics-image-viewer/components/ErrorAlert/index.js +144 -0
- package/es/aics-image-viewer/components/ErrorAlert/styles.css +22 -0
- package/es/aics-image-viewer/components/GlobalVolumeControls.js +38 -0
- package/es/aics-image-viewer/components/MetadataViewer/index.js +99 -0
- package/es/aics-image-viewer/components/MetadataViewer/styles.css +81 -0
- package/es/aics-image-viewer/components/StyleProvider/index.js +210 -0
- package/es/aics-image-viewer/components/TfEditor/index.js +584 -0
- package/es/aics-image-viewer/components/TfEditor/styles.css +88 -0
- package/es/aics-image-viewer/components/Toolbar/DownloadButton.js +55 -0
- package/es/aics-image-viewer/components/Toolbar/ViewModeRadioButtons.js +22 -0
- package/es/aics-image-viewer/components/Toolbar/index.js +274 -0
- package/es/aics-image-viewer/components/Toolbar/styles.css +241 -0
- package/es/aics-image-viewer/components/ViewerStateProvider/ResetStateProvider.js +160 -0
- package/es/aics-image-viewer/components/ViewerStateProvider/index.js +261 -0
- package/es/aics-image-viewer/components/ViewerStateProvider/types.js +1 -0
- package/es/aics-image-viewer/components/shared/NumericInput/index.js +147 -0
- package/es/aics-image-viewer/components/shared/NumericInput/styles.css +64 -0
- package/es/aics-image-viewer/components/shared/SharedCheckBox.js +17 -0
- package/es/aics-image-viewer/components/shared/SliderRow/index.js +31 -0
- package/es/aics-image-viewer/components/shared/SliderRow/styles.css +19 -0
- package/es/aics-image-viewer/components/shared/SmarterSlider.js +40 -0
- package/es/aics-image-viewer/components/shared/ViewerIcon.js +22 -0
- package/es/aics-image-viewer/shared/colorPalette.js +19 -0
- package/es/aics-image-viewer/shared/constants.js +164 -0
- package/es/aics-image-viewer/shared/enums.js +18 -0
- package/es/aics-image-viewer/shared/types.js +6 -0
- package/es/aics-image-viewer/shared/utils/colorRepresentations.js +16 -0
- package/es/aics-image-viewer/shared/utils/controlPointsToLut.js +182 -0
- package/es/aics-image-viewer/shared/utils/hooks.js +51 -0
- package/es/aics-image-viewer/shared/utils/httpClient.js +57 -0
- package/es/aics-image-viewer/shared/utils/playControls.js +97 -0
- package/es/aics-image-viewer/shared/utils/sceneStore.js +140 -0
- package/es/aics-image-viewer/shared/utils/sliderValuesToImageValues.js +36 -0
- package/es/aics-image-viewer/shared/utils/test/viewerChannelSettings.test.js +132 -0
- package/es/aics-image-viewer/shared/utils/utilsService.js +54 -0
- package/es/aics-image-viewer/shared/utils/viewerChannelSettings.js +152 -0
- package/es/aics-image-viewer/shared/utils/viewerState.js +69 -0
- package/es/aics-image-viewer/shared/utils/webgl-debug.js +1103 -0
- package/es/index.js +4 -0
- package/package.json +130 -0
- package/type-declarations/aics-image-viewer/assets/icons/index.d.ts +14 -0
- package/type-declarations/aics-image-viewer/components/App/ChannelUpdater.d.ts +16 -0
- package/type-declarations/aics-image-viewer/components/App/index.d.ts +6 -0
- package/type-declarations/aics-image-viewer/components/App/types.d.ts +45 -0
- package/type-declarations/aics-image-viewer/components/AxisClipSliders/index.d.ts +24 -0
- package/type-declarations/aics-image-viewer/components/BottomPanel/index.d.ts +11 -0
- package/type-declarations/aics-image-viewer/components/CellViewerCanvasWrapper/index.d.ts +33 -0
- package/type-declarations/aics-image-viewer/components/ChannelsWidget.d.ts +19 -0
- package/type-declarations/aics-image-viewer/components/ChannelsWidgetRow/index.d.ts +17 -0
- package/type-declarations/aics-image-viewer/components/ColorPicker.d.ts +13 -0
- package/type-declarations/aics-image-viewer/components/ControlPanel/index.d.ts +20 -0
- package/type-declarations/aics-image-viewer/components/CustomizeWidget.d.ts +15 -0
- package/type-declarations/aics-image-viewer/components/ErrorAlert/index.d.ts +12 -0
- package/type-declarations/aics-image-viewer/components/GlobalVolumeControls.d.ts +21 -0
- package/type-declarations/aics-image-viewer/components/MetadataViewer/index.d.ts +7 -0
- package/type-declarations/aics-image-viewer/components/StyleProvider/index.d.ts +5 -0
- package/type-declarations/aics-image-viewer/components/TfEditor/index.d.ts +19 -0
- package/type-declarations/aics-image-viewer/components/Toolbar/DownloadButton.d.ts +8 -0
- package/type-declarations/aics-image-viewer/components/Toolbar/ViewModeRadioButtons.d.ts +8 -0
- package/type-declarations/aics-image-viewer/components/Toolbar/index.d.ts +31 -0
- package/type-declarations/aics-image-viewer/components/ViewerStateProvider/ResetStateProvider.d.ts +34 -0
- package/type-declarations/aics-image-viewer/components/ViewerStateProvider/index.d.ts +33 -0
- package/type-declarations/aics-image-viewer/components/ViewerStateProvider/types.d.ts +105 -0
- package/type-declarations/aics-image-viewer/components/shared/NumericInput/index.d.ts +19 -0
- package/type-declarations/aics-image-viewer/components/shared/SharedCheckBox.d.ts +9 -0
- package/type-declarations/aics-image-viewer/components/shared/SliderRow/index.d.ts +17 -0
- package/type-declarations/aics-image-viewer/components/shared/SmarterSlider.d.ts +5 -0
- package/type-declarations/aics-image-viewer/components/shared/ViewerIcon.d.ts +9 -0
- package/type-declarations/aics-image-viewer/shared/constants.d.ts +40 -0
- package/type-declarations/aics-image-viewer/shared/enums.d.ts +15 -0
- package/type-declarations/aics-image-viewer/shared/types.d.ts +15 -0
- package/type-declarations/aics-image-viewer/shared/utils/colorRepresentations.d.ts +10 -0
- package/type-declarations/aics-image-viewer/shared/utils/controlPointsToLut.d.ts +53 -0
- package/type-declarations/aics-image-viewer/shared/utils/hooks.d.ts +14 -0
- package/type-declarations/aics-image-viewer/shared/utils/playControls.d.ts +27 -0
- package/type-declarations/aics-image-viewer/shared/utils/sceneStore.d.ts +17 -0
- package/type-declarations/aics-image-viewer/shared/utils/sliderValuesToImageValues.d.ts +10 -0
- package/type-declarations/aics-image-viewer/shared/utils/viewerChannelSettings.d.ts +46 -0
- package/type-declarations/aics-image-viewer/shared/utils/viewerState.d.ts +10 -0
- package/type-declarations/index.d.ts +7 -0
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
|
|
2
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
3
|
+
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
|
|
4
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
5
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
6
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
7
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
8
|
+
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
|
|
9
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
10
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
|
|
11
|
+
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
12
|
+
import { Button, Collapse, Dropdown, Flex, Tooltip } from "antd";
|
|
13
|
+
import React from "react";
|
|
14
|
+
import { PRESET_COLOR_MAP } from "../../shared/constants";
|
|
15
|
+
import ChannelsWidget from "../ChannelsWidget";
|
|
16
|
+
import CustomizeWidget from "../CustomizeWidget";
|
|
17
|
+
import GlobalVolumeControls from "../GlobalVolumeControls";
|
|
18
|
+
import MetadataViewer from "../MetadataViewer";
|
|
19
|
+
import ViewerIcon from "../shared/ViewerIcon";
|
|
20
|
+
import { connectToViewerState } from "../ViewerStateProvider";
|
|
21
|
+
import "./styles.css";
|
|
22
|
+
var ControlTab = /*#__PURE__*/function (ControlTab) {
|
|
23
|
+
ControlTab[ControlTab["Channels"] = 0] = "Channels";
|
|
24
|
+
ControlTab[ControlTab["Advanced"] = 1] = "Advanced";
|
|
25
|
+
ControlTab[ControlTab["Metadata"] = 2] = "Metadata";
|
|
26
|
+
return ControlTab;
|
|
27
|
+
}(ControlTab || {});
|
|
28
|
+
var ControlTabNames = _defineProperty(_defineProperty(_defineProperty({}, ControlTab.Channels, "Channel Settings"), ControlTab.Advanced, "Advanced Settings"), ControlTab.Metadata, "Metadata");
|
|
29
|
+
function ControlPanel(props) {
|
|
30
|
+
var _React$useState = React.useState(ControlTab.Channels),
|
|
31
|
+
_React$useState2 = _slicedToArray(_React$useState, 2),
|
|
32
|
+
tab = _React$useState2[0],
|
|
33
|
+
_setTab = _React$useState2[1];
|
|
34
|
+
var setTab = function setTab(newTab) {
|
|
35
|
+
_setTab(newTab);
|
|
36
|
+
props.setCollapsed(false);
|
|
37
|
+
};
|
|
38
|
+
var controlPanelContainerRef = React.useRef(null);
|
|
39
|
+
var getDropdownContainer = controlPanelContainerRef.current ? function () {
|
|
40
|
+
return controlPanelContainerRef.current;
|
|
41
|
+
} : undefined;
|
|
42
|
+
var viewerChannelSettings = props.viewerChannelSettings,
|
|
43
|
+
visibleControls = props.visibleControls,
|
|
44
|
+
hasImage = props.hasImage;
|
|
45
|
+
|
|
46
|
+
// TODO key is a number, but MenuInfo assumes keys will always be strings
|
|
47
|
+
// if future versions of antd make this type more permissive, remove ugly double-cast
|
|
48
|
+
var makeTurnOnPresetFn = function makeTurnOnPresetFn(_ref) {
|
|
49
|
+
var key = _ref.key;
|
|
50
|
+
return props.onApplyColorPresets(PRESET_COLOR_MAP[key].colors);
|
|
51
|
+
};
|
|
52
|
+
var renderColorPresetsDropdown = function renderColorPresetsDropdown() {
|
|
53
|
+
var dropDownMenuProps = {
|
|
54
|
+
items: PRESET_COLOR_MAP.map(function (preset, index) {
|
|
55
|
+
return {
|
|
56
|
+
key: index,
|
|
57
|
+
label: preset.name
|
|
58
|
+
};
|
|
59
|
+
}),
|
|
60
|
+
onClick: makeTurnOnPresetFn
|
|
61
|
+
};
|
|
62
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
63
|
+
className: "color-presets-dropdown"
|
|
64
|
+
}, /*#__PURE__*/React.createElement(Dropdown, {
|
|
65
|
+
trigger: ["click"],
|
|
66
|
+
menu: dropDownMenuProps,
|
|
67
|
+
getPopupContainer: getDropdownContainer
|
|
68
|
+
}, /*#__PURE__*/React.createElement(Button, null, /*#__PURE__*/React.createElement("div", {
|
|
69
|
+
style: {
|
|
70
|
+
display: "flex",
|
|
71
|
+
flexDirection: "row",
|
|
72
|
+
alignItems: "center",
|
|
73
|
+
gap: "4px"
|
|
74
|
+
}
|
|
75
|
+
}, "Apply palette", /*#__PURE__*/React.createElement(ViewerIcon, {
|
|
76
|
+
type: "dropdownArrow",
|
|
77
|
+
style: {
|
|
78
|
+
fontSize: "14px"
|
|
79
|
+
}
|
|
80
|
+
})))));
|
|
81
|
+
};
|
|
82
|
+
var renderTab = function renderTab(thisTab, icon) {
|
|
83
|
+
return /*#__PURE__*/React.createElement(Tooltip, _extends({
|
|
84
|
+
title: ControlTabNames[thisTab],
|
|
85
|
+
placement: "right"
|
|
86
|
+
}, !props.collapsed && {
|
|
87
|
+
open: false
|
|
88
|
+
}), /*#__PURE__*/React.createElement(Button, {
|
|
89
|
+
className: tab === thisTab ? "ant-btn-icon-only btn-tabactive" : "ant-btn-icon-only",
|
|
90
|
+
onClick: function onClick() {
|
|
91
|
+
return setTab(thisTab);
|
|
92
|
+
},
|
|
93
|
+
icon: typeof icon === "string" ? icon : undefined
|
|
94
|
+
}, _typeof(icon) === "object" && icon));
|
|
95
|
+
};
|
|
96
|
+
var renderAdvancedSettings = function renderAdvancedSettings() {
|
|
97
|
+
var items = [{
|
|
98
|
+
key: 0,
|
|
99
|
+
label: "Rendering adjustments",
|
|
100
|
+
children: /*#__PURE__*/React.createElement(GlobalVolumeControls, {
|
|
101
|
+
imageName: props.imageName,
|
|
102
|
+
pixelSize: props.pixelSize,
|
|
103
|
+
visibleControls: visibleControls
|
|
104
|
+
})
|
|
105
|
+
}];
|
|
106
|
+
var showCustomize = visibleControls.backgroundColorPicker || visibleControls.boundingBoxColorPicker;
|
|
107
|
+
if (showCustomize) {
|
|
108
|
+
items.push({
|
|
109
|
+
key: 1,
|
|
110
|
+
label: "Customize",
|
|
111
|
+
children: /*#__PURE__*/React.createElement(CustomizeWidget, {
|
|
112
|
+
visibleControls: props.visibleControls
|
|
113
|
+
})
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
return /*#__PURE__*/React.createElement(Flex, {
|
|
117
|
+
gap: 10,
|
|
118
|
+
vertical: true
|
|
119
|
+
}, /*#__PURE__*/React.createElement(Collapse, {
|
|
120
|
+
bordered: false,
|
|
121
|
+
defaultActiveKey: showCustomize ? [0, 1] : 0,
|
|
122
|
+
items: items
|
|
123
|
+
}), /*#__PURE__*/React.createElement("div", {
|
|
124
|
+
style: {
|
|
125
|
+
margin: "0 10px",
|
|
126
|
+
width: "fit-content"
|
|
127
|
+
}
|
|
128
|
+
}, /*#__PURE__*/React.createElement(Tooltip, {
|
|
129
|
+
trigger: ["hover", "focus"],
|
|
130
|
+
placement: "right",
|
|
131
|
+
title: "Clears ALL rendering settings and channel configuration to the default viewer state. This will replace any edits to channel settings, color presets, and rendering adjustments."
|
|
132
|
+
}, /*#__PURE__*/React.createElement(Button, {
|
|
133
|
+
onClick: props.resetToDefaultViewerState
|
|
134
|
+
}, "Clear all settings"))));
|
|
135
|
+
};
|
|
136
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
137
|
+
className: "control-panel-col-container",
|
|
138
|
+
ref: controlPanelContainerRef
|
|
139
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
140
|
+
className: "control-panel-tab-col",
|
|
141
|
+
style: {
|
|
142
|
+
flex: "0 0 50px"
|
|
143
|
+
}
|
|
144
|
+
}, /*#__PURE__*/React.createElement(Button, {
|
|
145
|
+
className: "ant-btn-icon-only btn-collapse" + (props.collapsed ? " btn-collapse-collapsed" : ""),
|
|
146
|
+
onClick: function onClick() {
|
|
147
|
+
return props.setCollapsed(!props.collapsed);
|
|
148
|
+
}
|
|
149
|
+
}, /*#__PURE__*/React.createElement(ViewerIcon, {
|
|
150
|
+
type: "closePanel"
|
|
151
|
+
})), /*#__PURE__*/React.createElement("div", {
|
|
152
|
+
className: "tab-divider"
|
|
153
|
+
}), renderTab(ControlTab.Channels, /*#__PURE__*/React.createElement(ViewerIcon, {
|
|
154
|
+
type: "channels"
|
|
155
|
+
})), renderTab(ControlTab.Advanced, /*#__PURE__*/React.createElement(ViewerIcon, {
|
|
156
|
+
type: "preferences"
|
|
157
|
+
})), props.visibleControls.metadataViewer && renderTab(ControlTab.Metadata, /*#__PURE__*/React.createElement(ViewerIcon, {
|
|
158
|
+
type: "metadata"
|
|
159
|
+
}))), /*#__PURE__*/React.createElement("div", {
|
|
160
|
+
className: "control-panel-col",
|
|
161
|
+
style: {
|
|
162
|
+
flex: "0 0 450px"
|
|
163
|
+
}
|
|
164
|
+
}, /*#__PURE__*/React.createElement("h2", {
|
|
165
|
+
className: "control-panel-title"
|
|
166
|
+
}, ControlTabNames[tab]), visibleControls.colorPresetsDropdown && tab === ControlTab.Channels && renderColorPresetsDropdown(), hasImage && /*#__PURE__*/React.createElement("div", {
|
|
167
|
+
className: "channel-rows-list"
|
|
168
|
+
}, tab === ControlTab.Channels && /*#__PURE__*/React.createElement(ChannelsWidget, {
|
|
169
|
+
channelDataChannels: props.channelDataChannels,
|
|
170
|
+
channelGroupedByType: props.channelGroupedByType,
|
|
171
|
+
saveIsosurface: props.saveIsosurface,
|
|
172
|
+
onColorChangeComplete: props.onColorChangeComplete,
|
|
173
|
+
onApplyColorPresets: props.onApplyColorPresets,
|
|
174
|
+
filterFunc: props.filterFunc,
|
|
175
|
+
viewerChannelSettings: viewerChannelSettings
|
|
176
|
+
}), tab === ControlTab.Advanced && renderAdvancedSettings(), tab === ControlTab.Metadata && /*#__PURE__*/React.createElement(MetadataViewer, {
|
|
177
|
+
metadata: props.getMetadata()
|
|
178
|
+
}))));
|
|
179
|
+
}
|
|
180
|
+
export default connectToViewerState(ControlPanel, ["resetToDefaultViewerState"]);
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
.control-panel-col-container{
|
|
2
|
+
display:flex;
|
|
3
|
+
height:100%;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
.control-panel-col-container .control-panel-tab-col,
|
|
7
|
+
.control-panel-col-container .control-panel-col{
|
|
8
|
+
border-right:1px solid var(--color-controlpanel-border);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.control-panel-col-container .control-panel-tab-col{
|
|
12
|
+
text-align:center;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.control-panel-col-container .control-panel-tab-col .ant-btn{
|
|
16
|
+
margin-top:12px;
|
|
17
|
+
background-color:transparent;
|
|
18
|
+
border:1px solid transparent;
|
|
19
|
+
color:var(--color-button-tertiary-text);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.control-panel-col-container .control-panel-tab-col .ant-btn:not([disabled]).btn-tabactive{
|
|
23
|
+
color:var(--color-button-icon-activated-text);
|
|
24
|
+
background-color:var(--color-button-icon-activated-bg);
|
|
25
|
+
border-color:var(--color-button-icon-activated-outline);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.control-panel-col-container .control-panel-tab-col .ant-btn:not([disabled]):hover,
|
|
29
|
+
.control-panel-col-container .control-panel-tab-col .ant-btn:not([disabled]):focus-visible{
|
|
30
|
+
color:var(--color-button-icon-activated-text);
|
|
31
|
+
background-color:var(--color-button-primary-hover-bg);
|
|
32
|
+
border-color:var(--color-button-icon-activated-outline);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.control-panel-col-container .control-panel-tab-col .btn-collapse svg{
|
|
36
|
+
transform:rotate(180deg);
|
|
37
|
+
transition:transform 0.2s linear;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.control-panel-col-container .control-panel-tab-col .btn-collapse.btn-collapse-collapsed svg{
|
|
41
|
+
transform:rotate(0deg);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.control-panel-col-container .control-panel-tab-col .tab-divider{
|
|
45
|
+
width:70%;
|
|
46
|
+
margin:12px 15% 0;
|
|
47
|
+
border-bottom:1px solid var(--color-controlpanel-border);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.control-panel-col-container .control-panel-col{
|
|
51
|
+
flex:1 auto;
|
|
52
|
+
max-width:540px;
|
|
53
|
+
overflow-y:scroll;
|
|
54
|
+
scrollbar-width:none;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.control-panel-col-container .control-panel-col::-webkit-scrollbar{
|
|
58
|
+
display:none;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.control-panel-col-container .control-panel-col .control-panel-title{
|
|
62
|
+
margin:16px;
|
|
63
|
+
max-height:24px;
|
|
64
|
+
font-size:1.4em;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.control-panel-col-container .control-panel-col .color-presets-dropdown{
|
|
68
|
+
margin:0 16px 16px;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.control-panel-col-container .control-panel-col .channel-rows-list{
|
|
72
|
+
border-top:1px solid var(--color-controlpanel-border);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.control-panel-col-container .control-panel-col .channel-rows-list .ant-list-item-meta{
|
|
76
|
+
align-items:center;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.control-panel-col-container .control-panel-col .channel-rows-list .ant-list-item-meta .ant-list-item-meta-title{
|
|
80
|
+
margin:0;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.control-panel-col-container .control-panel-col .channel-rows-list .ant-checkbox-wrapper:hover .ant-checkbox-inner{
|
|
84
|
+
border-color:white;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.control-panel-col-container .control-panel-col .channel-rows-list .channel-visibility-controls,
|
|
88
|
+
.control-panel-col-container .control-panel-col .channel-rows-list .ant-collapse-extra{
|
|
89
|
+
width:40%;
|
|
90
|
+
display:flex;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.control-panel-col-container .control-panel-col .channel-rows-list .channel-visibility-controls .ant-checkbox-wrapper, .control-panel-col-container .control-panel-col .channel-rows-list .ant-collapse-extra .ant-checkbox-wrapper{
|
|
94
|
+
flex:4;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.control-panel-col-container .control-panel-col .channel-rows-list .ant-collapse-content-box{
|
|
98
|
+
padding:0 16px;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.control-panel-col-container .control-panel-col .ant-collapse{
|
|
102
|
+
background-color:var(--color-controlpanel-bg);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.control-panel-col-container .control-panel-col .ant-collapse .ant-collapse-header{
|
|
106
|
+
padding:13px 16px;
|
|
107
|
+
background-color:var(--color-controlpanel-section-bg);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
.control-panel-col-container .control-panel-col .noUi-horizontal .noUi-handle{
|
|
111
|
+
box-shadow:none;
|
|
112
|
+
cursor:pointer;
|
|
113
|
+
pointer-events:inherit;
|
|
114
|
+
background-color:#a0a0a0;
|
|
115
|
+
top:0px;
|
|
116
|
+
left:100%;
|
|
117
|
+
z-index:1;
|
|
118
|
+
width:8px;
|
|
119
|
+
height:8px;
|
|
120
|
+
border:none;
|
|
121
|
+
border-radius:0;
|
|
122
|
+
transform:translate(-50%, calc(-100% - 4px));
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
.control-panel-col-container .control-panel-col .noUi-handle::before{
|
|
126
|
+
display:none;
|
|
127
|
+
content:none;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
.control-panel-col-container .control-panel-col .noUi-handle::after{
|
|
131
|
+
background-color:inherit;
|
|
132
|
+
width:8px;
|
|
133
|
+
height:8px;
|
|
134
|
+
top:0;
|
|
135
|
+
left:0;
|
|
136
|
+
transform:matrix(0.5, 0.5, -0.5, 0.5, 0, 4);
|
|
137
|
+
content:"";
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
.control-panel-col-container .control-panel-col .noUi-touch-area{
|
|
141
|
+
padding:8px;
|
|
142
|
+
margin-top:-4px;
|
|
143
|
+
margin-left:-4px;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
.control-panel-col-container .control-panel-col .noUi-connect{
|
|
147
|
+
background-color:#a0a0a0;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
.control-panel-col-container .control-panel-col .noUi-target.noUi-ltr.noUi-horizontal{
|
|
151
|
+
background-color:#a0a0a0;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
.control-panel-col-container .control-panel-col .noUi-horizontal{
|
|
155
|
+
height:2px;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
.control-panel-col-container .control-panel-col .noUi-target{
|
|
159
|
+
border:none;
|
|
160
|
+
box-shadow:none;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
.control-panel-col-container .control-panel-col .noUi-tooltip{
|
|
164
|
+
border:none;
|
|
165
|
+
background-color:transparent;
|
|
166
|
+
color:inherit;
|
|
167
|
+
font-size:10px;
|
|
168
|
+
top:calc(100% + 3px);
|
|
169
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import ColorPicker from "./ColorPicker";
|
|
3
|
+
import { colorArrayToObject, colorObjectToArray } from "../shared/utils/colorRepresentations";
|
|
4
|
+
import { connectToViewerState } from "./ViewerStateProvider";
|
|
5
|
+
var ColorPickerRow = function ColorPickerRow(_ref) {
|
|
6
|
+
var color = _ref.color,
|
|
7
|
+
_onColorChange = _ref.onColorChange,
|
|
8
|
+
children = _ref.children;
|
|
9
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
10
|
+
style: STYLES.colorPickerRow
|
|
11
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
12
|
+
style: STYLES.colorPicker
|
|
13
|
+
}, /*#__PURE__*/React.createElement(ColorPicker, {
|
|
14
|
+
color: colorArrayToObject(color),
|
|
15
|
+
onColorChange: function onColorChange(color) {
|
|
16
|
+
return _onColorChange(colorObjectToArray(color));
|
|
17
|
+
},
|
|
18
|
+
width: 18,
|
|
19
|
+
disableAlpha: true
|
|
20
|
+
})), /*#__PURE__*/React.createElement("span", null, children));
|
|
21
|
+
};
|
|
22
|
+
var CustomizeWidget = function CustomizeWidget(props) {
|
|
23
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, props.visibleControls.backgroundColorPicker && /*#__PURE__*/React.createElement(ColorPickerRow, {
|
|
24
|
+
color: props.backgroundColor,
|
|
25
|
+
onColorChange: function onColorChange(color) {
|
|
26
|
+
return props.changeViewerSetting("backgroundColor", color);
|
|
27
|
+
}
|
|
28
|
+
}, "Background color"), props.visibleControls.boundingBoxColorPicker && /*#__PURE__*/React.createElement(ColorPickerRow, {
|
|
29
|
+
color: props.boundingBoxColor,
|
|
30
|
+
onColorChange: function onColorChange(color) {
|
|
31
|
+
return props.changeViewerSetting("boundingBoxColor", color);
|
|
32
|
+
}
|
|
33
|
+
}, "Bounding box color", !props.showBoundingBox && /*#__PURE__*/React.createElement("i", null, " - bounding box turned off")));
|
|
34
|
+
};
|
|
35
|
+
var STYLES = {
|
|
36
|
+
colorPickerRow: {
|
|
37
|
+
padding: "14px 0",
|
|
38
|
+
display: "flex",
|
|
39
|
+
borderBottom: "1px solid #6e6e6e",
|
|
40
|
+
color: "var(--color-controlpanel-text)"
|
|
41
|
+
},
|
|
42
|
+
colorPicker: {
|
|
43
|
+
marginRight: "16px"
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
export default connectToViewerState(CustomizeWidget, ["showBoundingBox", "backgroundColor", "boundingBoxColor", "changeViewerSetting"]);
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
2
|
+
function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
|
|
3
|
+
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
4
|
+
function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
|
|
5
|
+
function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
|
|
6
|
+
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
|
|
7
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
8
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
9
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
10
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
11
|
+
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
|
|
12
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
13
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
|
|
14
|
+
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
15
|
+
import { VolumeLoadErrorType } from "@aics/vole-core";
|
|
16
|
+
import { RightOutlined } from "@ant-design/icons";
|
|
17
|
+
import { Alert, Button } from "antd";
|
|
18
|
+
import React from "react";
|
|
19
|
+
import { useConstructor } from "../../shared/utils/hooks";
|
|
20
|
+
import "./styles.css";
|
|
21
|
+
var IssueLink = function IssueLink(_ref) {
|
|
22
|
+
var bug = _ref.bug,
|
|
23
|
+
children = _ref.children;
|
|
24
|
+
return /*#__PURE__*/React.createElement("a", {
|
|
25
|
+
href: "https://github.com/allen-cell-animated/vole-app/issues/new".concat(bug ? "?template=bug_report.md" : "/choose"),
|
|
26
|
+
target: "_blank",
|
|
27
|
+
rel: "noreferrer noopener"
|
|
28
|
+
}, children);
|
|
29
|
+
};
|
|
30
|
+
var UNKNOWN_ERROR_DESCRIPTION = /*#__PURE__*/React.createElement(React.Fragment, null, "An unknown error occurred. Check the browser console (F12) for more details. If this looks like a bug,", " ", /*#__PURE__*/React.createElement(IssueLink, {
|
|
31
|
+
bug: true
|
|
32
|
+
}, "send us a bug report here"), ".");
|
|
33
|
+
var ERROR_TYPE_DESCRIPTIONS = _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({}, VolumeLoadErrorType.UNKNOWN, /*#__PURE__*/React.createElement(React.Fragment, null, "An unknown error occurred while loading volume data. Check the browser console (F12) for more details. If this looks like a bug, ", /*#__PURE__*/React.createElement(IssueLink, {
|
|
34
|
+
bug: true
|
|
35
|
+
}, "send us a bug report here"), ".")), VolumeLoadErrorType.NOT_FOUND, /*#__PURE__*/React.createElement(React.Fragment, null, "The viewer was unable to find any volume data at the specified location. Check that the provided URL is correct and try again.")), VolumeLoadErrorType.TOO_LARGE, /*#__PURE__*/React.createElement(React.Fragment, null, "No scale level is available for this volume which fits within our maximum GPU memory footprint. This maximum is tuned to ensure compatibility with the majority of browsers. If you're trying to load your own OME-Zarr dataset, you may be able to open this volume by including a lower scale level.")), VolumeLoadErrorType.LOAD_DATA_FAILED, /*#__PURE__*/React.createElement(React.Fragment, null, "The viewer was able to find a source of volume data at the specified location, but encountered an error while trying to load it. Check that your dataset is complete and properly formatted. You can also check the browser console (F12) for more details about this error. If it looks like a problem on our end,", " ", /*#__PURE__*/React.createElement(IssueLink, {
|
|
36
|
+
bug: true
|
|
37
|
+
}, "start a bug report here"), ".")), VolumeLoadErrorType.INVALID_METADATA, /*#__PURE__*/React.createElement(React.Fragment, null, "The viewer was unable to read all necessary information from this volume's metadata. Check that your dataset's metadata is complete and properly formatted. If you believe your data is valid and should be supported by our viewer, let us know by ", /*#__PURE__*/React.createElement(IssueLink, null, "opening a GitHub issue"), ".")), VolumeLoadErrorType.INVALID_MULTI_SOURCE_ZARR, /*#__PURE__*/React.createElement(React.Fragment, null, "The viewer is currently configured to consolidate multiple OME-Zarr datasets into a single volume, but the provided datasets can't all be matched up. Ensure that all dataset URLs are correct and that at least one equivalently-sized scale level exists in all datasets."));
|
|
38
|
+
var getErrorTitle = function getErrorTitle(error) {
|
|
39
|
+
var _error$toString;
|
|
40
|
+
return error instanceof Error && ((_error$toString = error.toString) === null || _error$toString === void 0 ? void 0 : _error$toString.call(error)) || "Unknown error";
|
|
41
|
+
};
|
|
42
|
+
var getErrorDescription = function getErrorDescription(error) {
|
|
43
|
+
var _ERROR_TYPE_DESCRIPTI2;
|
|
44
|
+
var type = error.type;
|
|
45
|
+
if (!type) {
|
|
46
|
+
return UNKNOWN_ERROR_DESCRIPTION;
|
|
47
|
+
}
|
|
48
|
+
return (_ERROR_TYPE_DESCRIPTI2 = ERROR_TYPE_DESCRIPTIONS[type]) !== null && _ERROR_TYPE_DESCRIPTI2 !== void 0 ? _ERROR_TYPE_DESCRIPTI2 : UNKNOWN_ERROR_DESCRIPTION;
|
|
49
|
+
};
|
|
50
|
+
var ErrorAlert = function ErrorAlert(_ref2) {
|
|
51
|
+
var errors = _ref2.errors,
|
|
52
|
+
_ref2$firstErrorCount = _ref2.firstErrorCount,
|
|
53
|
+
firstErrorCount = _ref2$firstErrorCount === void 0 ? 0 : _ref2$firstErrorCount,
|
|
54
|
+
_afterClose = _ref2.afterClose,
|
|
55
|
+
onSkipError = _ref2.onSkipError;
|
|
56
|
+
var _React$useState = React.useState(false),
|
|
57
|
+
_React$useState2 = _slicedToArray(_React$useState, 2),
|
|
58
|
+
showDetails = _React$useState2[0],
|
|
59
|
+
setShowDetails = _React$useState2[1];
|
|
60
|
+
var _React$useState3 = React.useState(0),
|
|
61
|
+
_React$useState4 = _slicedToArray(_React$useState3, 2),
|
|
62
|
+
errorsSeenCount = _React$useState4[0],
|
|
63
|
+
setErrorsSeenCount = _React$useState4[1];
|
|
64
|
+
var error = Array.isArray(errors) ? errors[0] : errors;
|
|
65
|
+
var errorMessage = /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", null, getErrorTitle(error) + (firstErrorCount > 1 ? " (".concat(firstErrorCount, ")") : ""), " ", /*#__PURE__*/React.createElement(Button, {
|
|
66
|
+
type: "text",
|
|
67
|
+
onClick: function onClick() {
|
|
68
|
+
return setShowDetails(!showDetails);
|
|
69
|
+
}
|
|
70
|
+
}, showDetails ? "Show less info" : "Show more info")), /*#__PURE__*/React.createElement("div", {
|
|
71
|
+
style: {
|
|
72
|
+
display: showDetails ? undefined : "none"
|
|
73
|
+
}
|
|
74
|
+
}, getErrorDescription(error)));
|
|
75
|
+
var skipErrorButton = Array.isArray(errors) && errors.length > 1 && /*#__PURE__*/React.createElement(Button, {
|
|
76
|
+
type: "text",
|
|
77
|
+
onClick: function onClick() {
|
|
78
|
+
setErrorsSeenCount(function (count) {
|
|
79
|
+
return count + 1;
|
|
80
|
+
});
|
|
81
|
+
onSkipError === null || onSkipError === void 0 || onSkipError();
|
|
82
|
+
}
|
|
83
|
+
}, "Error ", errorsSeenCount + 1, " of ", errors.length + errorsSeenCount, " ", /*#__PURE__*/React.createElement(RightOutlined, null));
|
|
84
|
+
return /*#__PURE__*/React.createElement(Alert, {
|
|
85
|
+
showIcon: true,
|
|
86
|
+
type: "error",
|
|
87
|
+
className: "load-error-alert",
|
|
88
|
+
message: errorMessage,
|
|
89
|
+
closable: true,
|
|
90
|
+
afterClose: function afterClose() {
|
|
91
|
+
setErrorsSeenCount(0);
|
|
92
|
+
_afterClose === null || _afterClose === void 0 || _afterClose();
|
|
93
|
+
},
|
|
94
|
+
action: skipErrorButton
|
|
95
|
+
});
|
|
96
|
+
};
|
|
97
|
+
export var useErrorAlert = function useErrorAlert() {
|
|
98
|
+
var _React$useState5 = React.useState([]),
|
|
99
|
+
_React$useState6 = _slicedToArray(_React$useState5, 2),
|
|
100
|
+
errorList = _React$useState6[0],
|
|
101
|
+
setErrorList = _React$useState6[1];
|
|
102
|
+
// Keep track of which errors have been seen and how many times
|
|
103
|
+
var seenErrors = useConstructor(function () {
|
|
104
|
+
return new Map();
|
|
105
|
+
});
|
|
106
|
+
var _React$useState7 = React.useState([]),
|
|
107
|
+
_React$useState8 = _slicedToArray(_React$useState7, 2),
|
|
108
|
+
errorCounts = _React$useState8[0],
|
|
109
|
+
setErrorCounts = _React$useState8[1];
|
|
110
|
+
var addError = React.useCallback(function (error) {
|
|
111
|
+
var _seenErrors$get;
|
|
112
|
+
console.error(error);
|
|
113
|
+
var errorTitle = getErrorTitle(error);
|
|
114
|
+
var errorSeenCount = ((_seenErrors$get = seenErrors.get(errorTitle)) !== null && _seenErrors$get !== void 0 ? _seenErrors$get : 0) + 1;
|
|
115
|
+
setErrorList(function (prev) {
|
|
116
|
+
return [].concat(_toConsumableArray(prev), [error]);
|
|
117
|
+
});
|
|
118
|
+
setErrorCounts(function (prev) {
|
|
119
|
+
return [].concat(_toConsumableArray(prev), [errorSeenCount]);
|
|
120
|
+
});
|
|
121
|
+
seenErrors.set(errorTitle, errorSeenCount);
|
|
122
|
+
}, []);
|
|
123
|
+
var onSkipError = React.useCallback(function () {
|
|
124
|
+
setErrorList(function (prev) {
|
|
125
|
+
return prev.slice(1);
|
|
126
|
+
});
|
|
127
|
+
setErrorCounts(function (prev) {
|
|
128
|
+
return prev.slice(1);
|
|
129
|
+
});
|
|
130
|
+
}, []);
|
|
131
|
+
var afterClose = React.useCallback(function () {
|
|
132
|
+
setErrorList([]);
|
|
133
|
+
setErrorCounts([]);
|
|
134
|
+
}, []);
|
|
135
|
+
var errCount = errorCounts[0];
|
|
136
|
+
var alertComponent = errorList.length > 0 && /*#__PURE__*/React.createElement(ErrorAlert, {
|
|
137
|
+
errors: errorList,
|
|
138
|
+
firstErrorCount: errCount,
|
|
139
|
+
onSkipError: onSkipError,
|
|
140
|
+
afterClose: afterClose
|
|
141
|
+
});
|
|
142
|
+
return [alertComponent, addError];
|
|
143
|
+
};
|
|
144
|
+
export default ErrorAlert;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
.load-error-alert{
|
|
2
|
+
position:fixed;
|
|
3
|
+
bottom:30px;
|
|
4
|
+
left:30px;
|
|
5
|
+
width:40vw;
|
|
6
|
+
align-items:start;
|
|
7
|
+
z-index:5000;
|
|
8
|
+
border-color:#dc4446;
|
|
9
|
+
padding:12px 30px;
|
|
10
|
+
}
|
|
11
|
+
.load-error-alert .ant-alert-icon,
|
|
12
|
+
.load-error-alert .ant-alert-close-icon,
|
|
13
|
+
.load-error-alert .ant-alert-message div{
|
|
14
|
+
min-height:24px;
|
|
15
|
+
}
|
|
16
|
+
.load-error-alert .ant-btn-text{
|
|
17
|
+
color:var(--color-text-link);
|
|
18
|
+
}
|
|
19
|
+
.load-error-alert .ant-alert-message div:first-child{
|
|
20
|
+
color:var(--color-text-section);
|
|
21
|
+
font-weight:600;
|
|
22
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Checkbox } from "antd";
|
|
3
|
+
import SliderRow from "./shared/SliderRow";
|
|
4
|
+
import { connectToViewerState } from "./ViewerStateProvider";
|
|
5
|
+
var GlobalVolumeControls = function GlobalVolumeControls(props) {
|
|
6
|
+
var createSliderRow = function createSliderRow(label, start, max, propKey) {
|
|
7
|
+
var onUpdate = function onUpdate(_strValues, _handle, values) {
|
|
8
|
+
var selectValue = values.length === 1 ? values[0] : values;
|
|
9
|
+
props.changeViewerSetting(propKey, selectValue);
|
|
10
|
+
};
|
|
11
|
+
return /*#__PURE__*/React.createElement(SliderRow, {
|
|
12
|
+
label: label,
|
|
13
|
+
start: start,
|
|
14
|
+
max: max,
|
|
15
|
+
onUpdate: onUpdate
|
|
16
|
+
});
|
|
17
|
+
};
|
|
18
|
+
var showControls = props.visibleControls,
|
|
19
|
+
maskAlpha = props.maskAlpha,
|
|
20
|
+
brightness = props.brightness,
|
|
21
|
+
density = props.density,
|
|
22
|
+
levels = props.levels;
|
|
23
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
24
|
+
style: {
|
|
25
|
+
paddingTop: 18,
|
|
26
|
+
paddingBottom: 22
|
|
27
|
+
}
|
|
28
|
+
}, showControls.alphaMaskSlider && createSliderRow("mask cell", maskAlpha, 100, "maskAlpha"), showControls.brightnessSlider && createSliderRow("brightness", brightness, 100, "brightness"), showControls.densitySlider && createSliderRow("density", density, 100, "density"), showControls.levelsSliders && createSliderRow("levels", levels, 255, "levels"), showControls.interpolationControl && /*#__PURE__*/React.createElement(SliderRow, {
|
|
29
|
+
label: "interpolate"
|
|
30
|
+
}, /*#__PURE__*/React.createElement(Checkbox, {
|
|
31
|
+
checked: props.interpolationEnabled,
|
|
32
|
+
onChange: function onChange(_ref) {
|
|
33
|
+
var target = _ref.target;
|
|
34
|
+
return props.changeViewerSetting("interpolationEnabled", target.checked);
|
|
35
|
+
}
|
|
36
|
+
})));
|
|
37
|
+
};
|
|
38
|
+
export default connectToViewerState(GlobalVolumeControls, ["maskAlpha", "brightness", "density", "levels", "interpolationEnabled", "changeViewerSetting"]);
|