@aics/vole-app 3.4.4 → 3.6.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/es/aics-image-viewer/components/App/index.js +15 -5
- package/es/aics-image-viewer/components/ChannelsWidget.js +3 -1
- package/es/aics-image-viewer/components/ChannelsWidgetRow.js +29 -16
- package/es/aics-image-viewer/components/ColorPicker/index.js +9 -1
- package/es/aics-image-viewer/components/ControlPanel/CopySettingsButton.js +445 -0
- package/es/aics-image-viewer/components/ControlPanel/index.js +16 -5
- package/es/aics-image-viewer/components/ControlPanel/styles.css +29 -2
- package/es/aics-image-viewer/components/StyleProvider/index.js +17 -2
- package/es/aics-image-viewer/components/Toolbar/ViewModeRadioButtons.js +1 -1
- package/es/aics-image-viewer/components/Toolbar/index.js +1 -1
- package/es/aics-image-viewer/components/Toolbar/styles.css +0 -10
- package/es/aics-image-viewer/components/{CellViewerCanvasWrapper → ViewerCanvasWrapper}/index.js +3 -2
- package/es/aics-image-viewer/components/dimension_sliders/AxisClipSliders.js +21 -8
- package/es/aics-image-viewer/components/dimension_sliders/RotationSliders.js +6 -8
- package/es/aics-image-viewer/components/dimension_sliders/SliderRows.js +8 -6
- package/es/aics-image-viewer/components/shared/ContextualAlert.js +101 -0
- package/es/aics-image-viewer/components/shared/ControlPanelRow/index.js +4 -2
- package/es/aics-image-viewer/components/shared/ControlPanelRow/styles.css +4 -3
- package/es/aics-image-viewer/components/useVolume.js +59 -25
- package/es/aics-image-viewer/shared/constants.js +25 -1
- package/es/aics-image-viewer/shared/types.js +1 -1
- package/es/aics-image-viewer/shared/utils/controlPointsToLut.js +4 -0
- package/es/aics-image-viewer/shared/utils/parseSnapshot.js +205 -0
- package/es/aics-image-viewer/shared/utils/{urlParsing.js → parseUrl.js} +55 -191
- package/es/aics-image-viewer/shared/utils/permissions.js +46 -0
- package/es/aics-image-viewer/shared/utils/test/camera.test.js +1 -2
- package/es/aics-image-viewer/shared/utils/test/{urlParsing.test.js → parseUrl.test.js} +28 -25
- package/es/aics-image-viewer/shared/utils/test/storage.test.js +2 -2
- package/es/aics-image-viewer/shared/utils/test/viewerChannelSettings.test.js +1 -1
- package/es/aics-image-viewer/state/deserialize.js +443 -331
- package/es/aics-image-viewer/state/reset.js +1 -1
- package/es/aics-image-viewer/state/serialize.js +168 -78
- package/es/aics-image-viewer/state/subscribers.js +1 -1
- package/es/aics-image-viewer/state/test/deserialize.test.js +63 -77
- package/es/aics-image-viewer/state/test/reset.test.js +2 -2
- package/es/aics-image-viewer/state/test/serialize.test.js +42 -43
- package/es/aics-image-viewer/state/test/test_data.js +119 -1
- package/es/aics-image-viewer/state/types.js +157 -245
- package/es/aics-image-viewer/state/util.js +39 -1
- package/es/index.js +4 -2
- package/package.json +26 -44
- package/type-declarations/aics-image-viewer/components/App/types.d.ts +3 -3
- package/type-declarations/aics-image-viewer/components/ChannelsWidget.d.ts +3 -0
- package/type-declarations/aics-image-viewer/components/ChannelsWidgetRow.d.ts +3 -0
- package/type-declarations/aics-image-viewer/components/ControlPanel/CopySettingsButton.d.ts +11 -0
- package/type-declarations/aics-image-viewer/components/Toolbar/ViewModeRadioButtons.d.ts +1 -1
- package/type-declarations/aics-image-viewer/components/{CellViewerCanvasWrapper → ViewerCanvasWrapper}/index.d.ts +4 -3
- package/type-declarations/aics-image-viewer/components/dimension_sliders/AxisClipSliders.d.ts +7 -6
- package/type-declarations/aics-image-viewer/components/dimension_sliders/SliderRows.d.ts +1 -2
- package/type-declarations/aics-image-viewer/components/shared/ContextualAlert.d.ts +29 -0
- package/type-declarations/aics-image-viewer/components/shared/ControlPanelRow/index.d.ts +1 -0
- package/type-declarations/aics-image-viewer/components/useVolume.d.ts +3 -0
- package/type-declarations/aics-image-viewer/shared/constants.d.ts +2 -2
- package/type-declarations/aics-image-viewer/shared/types.d.ts +2 -2
- package/type-declarations/aics-image-viewer/shared/utils/controlPointsToLut.d.ts +1 -1
- package/type-declarations/aics-image-viewer/shared/utils/parseSnapshot.d.ts +49 -0
- package/type-declarations/aics-image-viewer/shared/utils/{urlParsing.d.ts → parseUrl.d.ts} +3 -24
- package/type-declarations/aics-image-viewer/shared/utils/permissions.d.ts +7 -0
- package/type-declarations/aics-image-viewer/shared/utils/viewerChannelSettings.d.ts +1 -1
- package/type-declarations/aics-image-viewer/state/deserialize.d.ts +70 -35
- package/type-declarations/aics-image-viewer/state/reset.d.ts +1 -1
- package/type-declarations/aics-image-viewer/state/serialize.d.ts +44 -10
- package/type-declarations/aics-image-viewer/state/types.d.ts +265 -159
- package/type-declarations/aics-image-viewer/state/util.d.ts +3 -1
- package/type-declarations/index.d.ts +5 -3
- package/es/Globals.d.js +0 -0
- package/es/aics-image-viewer/shared/enums.js +0 -18
- package/es/aics-image-viewer/shared/utils/firebase/index.js +0 -109
- package/type-declarations/aics-image-viewer/shared/enums.d.ts +0 -15
- package/type-declarations/aics-image-viewer/shared/utils/firebase/index.d.ts +0 -69
- package/type-declarations/aics-image-viewer/shared/utils/math.d.ts +0 -1
- /package/es/aics-image-viewer/components/{CellViewerCanvasWrapper → ViewerCanvasWrapper}/styles.css +0 -0
|
@@ -20,18 +20,18 @@ import { Layout } from "antd";
|
|
|
20
20
|
import { debounce, isEqual } from "lodash";
|
|
21
21
|
import React, { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
22
22
|
import { AXIS_MARGIN_DEFAULT, CLIPPING_PANEL_HEIGHT_DEFAULT, CLIPPING_PANEL_HEIGHT_TALL, CONTROL_PANEL_CLOSE_WIDTH, getDefaultViewerChannelSettings, SCALE_BAR_MARGIN_DEFAULT } from "../../shared/constants";
|
|
23
|
-
import { ImageType, ViewMode } from "../../shared/enums";
|
|
24
23
|
import { controlPointsToRamp, initializeLut } from "../../shared/utils/controlPointsToLut";
|
|
25
24
|
import { useConstructor } from "../../shared/utils/hooks";
|
|
26
25
|
import { findFirstChannelMatch } from "../../shared/utils/viewerChannelSettings";
|
|
27
26
|
import { select, useViewerState } from "../../state/store";
|
|
28
27
|
import { subscribeImageToState, subscribeViewToState } from "../../state/subscribers";
|
|
28
|
+
import { ImageType, ViewMode } from "../../state/types";
|
|
29
29
|
import useVolume, { ImageLoadStatus } from "../useVolume";
|
|
30
|
-
import CellViewerCanvasWrapper from "../CellViewerCanvasWrapper";
|
|
31
30
|
import ControlPanel from "../ControlPanel";
|
|
32
31
|
import { useErrorAlert } from "../ErrorAlert";
|
|
33
32
|
import StyleProvider from "../StyleProvider";
|
|
34
33
|
import Toolbar from "../Toolbar";
|
|
34
|
+
import CellViewerCanvasWrapper from "../ViewerCanvasWrapper";
|
|
35
35
|
import ChannelUpdater from "./ChannelUpdater";
|
|
36
36
|
import "../../assets/styles/globals.css";
|
|
37
37
|
import "./styles.css";
|
|
@@ -103,9 +103,10 @@ var setIndicatorPositions = function setIndicatorPositions(view3d, panelOpen, ha
|
|
|
103
103
|
view3d.setAxisPosition(AXIS_MARGIN_DEFAULT[0], axisY);
|
|
104
104
|
view3d.setTimestepIndicatorPosition(SCALE_BAR_MARGIN_DEFAULT[0], scaleBarY);
|
|
105
105
|
view3d.setScaleBarPosition(scaleBarX, scaleBarY);
|
|
106
|
+
view3d.setLowResIndicatorPosition(scaleBarY);
|
|
106
107
|
};
|
|
107
108
|
var App = function App(props) {
|
|
108
|
-
var _props$showError, _props$viewerChannelS, _scenes$length, _scenes2, _image$imageInfo$volu, _image$imageInfo$subr, _image$imageInfo$time, _props$transform2, _props$transform4;
|
|
109
|
+
var _props$showError, _props$viewerChannelS, _scenes$length, _scenes2, _image$imageInfo$volu, _image$imageInfo$subr, _image$imageInfo$time, _props$transform2, _props$transform4, _props$imageDownloadH, _props$parentImageDow;
|
|
109
110
|
props = _objectSpread(_objectSpread({}, defaultProps), props);
|
|
110
111
|
|
|
111
112
|
// State management /////////////////////////////////////////////////////////
|
|
@@ -338,12 +339,20 @@ var App = function App(props) {
|
|
|
338
339
|
showError(error, image);
|
|
339
340
|
onImageTitleChange === null || onImageTitleChange === void 0 || onImageTitleChange(undefined);
|
|
340
341
|
}, [showError, onImageTitleChange]);
|
|
342
|
+
var onScrub = useCallback(function (isScrubbing, image) {
|
|
343
|
+
if (isScrubbing) {
|
|
344
|
+
void view3d.enableScrubIndicator(image)["catch"](onError);
|
|
345
|
+
} else {
|
|
346
|
+
view3d.disableScrubIndicator();
|
|
347
|
+
}
|
|
348
|
+
}, [view3d, onError]);
|
|
341
349
|
var volume = useVolume(scenes, {
|
|
342
350
|
viewerChannelSettings: props.viewerChannelSettings,
|
|
343
351
|
onCreateImage: onCreateImage,
|
|
344
352
|
onChannelLoaded: onChannelLoaded,
|
|
345
353
|
onChangeScene: onChangeScene,
|
|
346
354
|
onError: onError,
|
|
355
|
+
onScrub: onScrub,
|
|
347
356
|
maskChannelName: maskChannelName
|
|
348
357
|
});
|
|
349
358
|
var image = volume.image,
|
|
@@ -582,8 +591,8 @@ var App = function App(props) {
|
|
|
582
591
|
margin: props.canvasMargin
|
|
583
592
|
}
|
|
584
593
|
}, /*#__PURE__*/React.createElement(Content, null, /*#__PURE__*/React.createElement(Toolbar, {
|
|
585
|
-
|
|
586
|
-
|
|
594
|
+
cellDownloadHref: (_props$imageDownloadH = props.imageDownloadHref) !== null && _props$imageDownloadH !== void 0 ? _props$imageDownloadH : defaultProps.imageDownloadHref,
|
|
595
|
+
fovDownloadHref: (_props$parentImageDow = props.parentImageDownloadHref) !== null && _props$parentImageDow !== void 0 ? _props$parentImageDow : defaultProps.parentImageDownloadHref,
|
|
587
596
|
hasParentImage: !!props.parentImageUrl,
|
|
588
597
|
hasCellId: !!props.cellId,
|
|
589
598
|
canPathTrace: view3d ? view3d.hasWebGL2() : false,
|
|
@@ -603,6 +612,7 @@ var App = function App(props) {
|
|
|
603
612
|
numScenes: numScenes,
|
|
604
613
|
playControls: volume.playControls,
|
|
605
614
|
playingAxis: volume.playingAxis,
|
|
615
|
+
setScrubbingAxis: volume.setScrubbingAxis,
|
|
606
616
|
appHeight: props.appHeight,
|
|
607
617
|
visibleControls: visibleControls,
|
|
608
618
|
clippingPanelOpen: clippingPanelOpen,
|
|
@@ -145,7 +145,9 @@ var ChannelsWidget = function ChannelsWidget(props) {
|
|
|
145
145
|
channelDataForChannel: channelDataChannels[channelIndex],
|
|
146
146
|
name: getDisplayName(channelName, channelIndex, viewerChannelSettings),
|
|
147
147
|
onColorChangeComplete: props.onColorChangeComplete,
|
|
148
|
-
saveIsosurface: props.saveIsosurface
|
|
148
|
+
saveIsosurface: props.saveIsosurface,
|
|
149
|
+
getDropdownContainer: props.getDropdownContainer,
|
|
150
|
+
scrollContainer: props.scrollContainer
|
|
149
151
|
});
|
|
150
152
|
};
|
|
151
153
|
var rows = channelDataChannels && Object.entries(channelGroupedByType).filter(function (_ref3) {
|
|
@@ -4,12 +4,13 @@ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r)
|
|
|
4
4
|
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; }
|
|
5
5
|
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; } }
|
|
6
6
|
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
|
|
7
|
-
import {
|
|
7
|
+
import { RightOutlined } from "@ant-design/icons";
|
|
8
|
+
import { Checkbox } from "antd";
|
|
8
9
|
import React, { useCallback, useState } from "react";
|
|
9
10
|
import { colorArrayToObject, colorObjectToArray } from "../shared/utils/colorRepresentations";
|
|
10
11
|
import { select, useViewerState } from "../state/store";
|
|
12
|
+
import CopySettingsButton from "./ControlPanel/CopySettingsButton";
|
|
11
13
|
import ControlPanelRow from "./shared/ControlPanelRow";
|
|
12
|
-
import ViewerIcon from "./shared/ViewerIcon";
|
|
13
14
|
import TfEditor from "./TfEditor";
|
|
14
15
|
var ChannelsWidgetRow = function ChannelsWidgetRow(props) {
|
|
15
16
|
var index = props.index,
|
|
@@ -28,6 +29,11 @@ var ChannelsWidgetRow = function ChannelsWidgetRow(props) {
|
|
|
28
29
|
setControlsOpen = _useState2[1];
|
|
29
30
|
// Don't show controls in single-channel mode
|
|
30
31
|
var controlsOpen = _controlsOpen && !singleChannelMode;
|
|
32
|
+
var toggleControlsOpen = useCallback(function () {
|
|
33
|
+
return setControlsOpen(function (open) {
|
|
34
|
+
return !open;
|
|
35
|
+
});
|
|
36
|
+
}, []);
|
|
31
37
|
var onClickChannel = useCallback(function () {
|
|
32
38
|
if (singleChannelMode) {
|
|
33
39
|
changeViewerSetting("singleChannelIndex", index);
|
|
@@ -70,18 +76,12 @@ var ChannelsWidgetRow = function ChannelsWidgetRow(props) {
|
|
|
70
76
|
}, "Vol"), /*#__PURE__*/React.createElement(Checkbox, {
|
|
71
77
|
checked: channelState.isosurfaceEnabled,
|
|
72
78
|
onChange: isosurfaceCheckHandler
|
|
73
|
-
}, "Surf"), /*#__PURE__*/React.createElement(
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
}),
|
|
80
|
-
onClick: function onClick() {
|
|
81
|
-
return setControlsOpen(!controlsOpen);
|
|
82
|
-
},
|
|
83
|
-
title: "Open channel settings",
|
|
84
|
-
type: "text"
|
|
79
|
+
}, "Surf"), /*#__PURE__*/React.createElement(CopySettingsButton, {
|
|
80
|
+
hide: props.controlPanelCollapsed,
|
|
81
|
+
getDropdownContainer: props.getDropdownContainer,
|
|
82
|
+
scrollContainer: props.scrollContainer,
|
|
83
|
+
hideImportExport: true,
|
|
84
|
+
channelIndex: props.index
|
|
85
85
|
}));
|
|
86
86
|
var renderControls = function renderControls() {
|
|
87
87
|
var showEditor = singleChannelMode ? singleChannelIndex === index : channelState.volumeEnabled || channelState.isosurfaceEnabled;
|
|
@@ -126,13 +126,26 @@ var ChannelsWidgetRow = function ChannelsWidgetRow(props) {
|
|
|
126
126
|
var rowClass = controlsOpen ? "" : " controls-closed";
|
|
127
127
|
return /*#__PURE__*/React.createElement(ControlPanelRow, {
|
|
128
128
|
key: index,
|
|
129
|
-
title:
|
|
129
|
+
title: /*#__PURE__*/React.createElement("span", {
|
|
130
|
+
onClick: toggleControlsOpen,
|
|
131
|
+
style: {
|
|
132
|
+
cursor: "pointer"
|
|
133
|
+
}
|
|
134
|
+
}, props.name),
|
|
130
135
|
color: colorArrayToObject(channelState.color),
|
|
131
136
|
onColorChange: onColorChange,
|
|
132
137
|
onColorChangeComplete: props.onColorChangeComplete,
|
|
133
138
|
onClick: onClickChannel,
|
|
134
139
|
className: rowClass,
|
|
135
|
-
highlight: thisChannelOnly
|
|
140
|
+
highlight: thisChannelOnly,
|
|
141
|
+
icon: /*#__PURE__*/React.createElement(RightOutlined, {
|
|
142
|
+
style: {
|
|
143
|
+
transition: "transform 0.3s",
|
|
144
|
+
transform: controlsOpen ? "rotate(90deg)" : "rotate(0deg)",
|
|
145
|
+
cursor: "pointer"
|
|
146
|
+
},
|
|
147
|
+
onClick: toggleControlsOpen
|
|
148
|
+
})
|
|
136
149
|
}, visibilityControls, controlsOpen && /*#__PURE__*/React.createElement("div", {
|
|
137
150
|
style: {
|
|
138
151
|
width: "100%"
|
|
@@ -17,6 +17,13 @@ var DEFAULT_COLOR = {
|
|
|
17
17
|
b: "19",
|
|
18
18
|
a: "1"
|
|
19
19
|
};
|
|
20
|
+
var PRESET_COLOR_HEX = ["#ffffff", "#ff0000", "#ffff00", "#00ff00", "#00ffff", "#0000ff", "#ff00ff", "#c0c0c0"];
|
|
21
|
+
var PRESET_COLORS = PRESET_COLOR_HEX.map(function (color) {
|
|
22
|
+
return {
|
|
23
|
+
color: color,
|
|
24
|
+
title: color.toUpperCase()
|
|
25
|
+
};
|
|
26
|
+
});
|
|
20
27
|
var ColorPicker = function ColorPicker(props) {
|
|
21
28
|
var _React$useState = React.useState(false),
|
|
22
29
|
_React$useState2 = _slicedToArray(_React$useState, 2),
|
|
@@ -87,7 +94,8 @@ var ColorPicker = function ColorPicker(props) {
|
|
|
87
94
|
color: currentColor,
|
|
88
95
|
onChange: handleChange,
|
|
89
96
|
onChangeComplete: handleChangeComplete,
|
|
90
|
-
disableAlpha: props.disableAlpha
|
|
97
|
+
disableAlpha: props.disableAlpha,
|
|
98
|
+
presetColors: PRESET_COLORS
|
|
91
99
|
})) : null));
|
|
92
100
|
};
|
|
93
101
|
export default ColorPicker;
|
|
@@ -0,0 +1,445 @@
|
|
|
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 _regeneratorRuntime() { "use strict"; var r = _regenerator(), e = r.m(_regeneratorRuntime), t = (Object.getPrototypeOf ? Object.getPrototypeOf(e) : e.__proto__).constructor; function n(r) { var e = "function" == typeof r && r.constructor; return !!e && (e === t || "GeneratorFunction" === (e.displayName || e.name)); } var o = { "throw": 1, "return": 2, "break": 3, "continue": 3 }; function a(r) { var e, t; return function (n) { e || (e = { stop: function stop() { return t(n.a, 2); }, "catch": function _catch() { return n.v; }, abrupt: function abrupt(r, e) { return t(n.a, o[r], e); }, delegateYield: function delegateYield(r, o, a) { return e.resultName = o, t(n.d, _regeneratorValues(r), a); }, finish: function finish(r) { return t(n.f, r); } }, t = function t(r, _t, o) { n.p = e.prev, n.n = e.next; try { return r(_t, o); } finally { e.next = n.n; } }), e.resultName && (e[e.resultName] = n.v, e.resultName = void 0), e.sent = n.v, e.next = n.n; try { return r.call(this, e); } finally { n.p = e.prev, n.n = e.next; } }; } return (_regeneratorRuntime = function _regeneratorRuntime() { return { wrap: function wrap(e, t, n, o) { return r.w(a(e), t, n, o && o.reverse()); }, isGeneratorFunction: n, mark: r.m, awrap: function awrap(r, e) { return new _OverloadYield(r, e); }, AsyncIterator: _regeneratorAsyncIterator, async: function async(r, e, t, o, u) { return (n(e) ? _regeneratorAsyncGen : _regeneratorAsync)(a(r), e, t, o, u); }, keys: _regeneratorKeys, values: _regeneratorValues }; })(); }
|
|
3
|
+
function _regeneratorValues(e) { if (null != e) { var t = e["function" == typeof Symbol && Symbol.iterator || "@@iterator"], r = 0; if (t) return t.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) return { next: function next() { return e && r >= e.length && (e = void 0), { value: e && e[r++], done: !e }; } }; } throw new TypeError(_typeof(e) + " is not iterable"); }
|
|
4
|
+
function _regeneratorKeys(e) { var n = Object(e), r = []; for (var t in n) r.unshift(t); return function e() { for (; r.length;) if ((t = r.pop()) in n) return e.value = t, e.done = !1, e; return e.done = !0, e; }; }
|
|
5
|
+
function _regeneratorAsync(n, e, r, t, o) { var a = _regeneratorAsyncGen(n, e, r, t, o); return a.next().then(function (n) { return n.done ? n.value : a.next(); }); }
|
|
6
|
+
function _regeneratorAsyncGen(r, e, t, o, n) { return new _regeneratorAsyncIterator(_regenerator().w(r, e, t, o), n || Promise); }
|
|
7
|
+
function _regeneratorAsyncIterator(t, e) { function n(r, o, i, f) { try { var c = t[r](o), u = c.value; return u instanceof _OverloadYield ? e.resolve(u.v).then(function (t) { n("next", t, i, f); }, function (t) { n("throw", t, i, f); }) : e.resolve(u).then(function (t) { c.value = t, i(c); }, function (t) { return n("throw", t, i, f); }); } catch (t) { f(t); } } var r; this.next || (_regeneratorDefine2(_regeneratorAsyncIterator.prototype), _regeneratorDefine2(_regeneratorAsyncIterator.prototype, "function" == typeof Symbol && Symbol.asyncIterator || "@asyncIterator", function () { return this; })), _regeneratorDefine2(this, "_invoke", function (t, o, i) { function f() { return new e(function (e, r) { n(t, i, e, r); }); } return r = r ? r.then(f, f) : f(); }, !0); }
|
|
8
|
+
function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
|
|
9
|
+
function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
|
|
10
|
+
function _OverloadYield(e, d) { this.v = e, this.k = d; }
|
|
11
|
+
function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
|
|
12
|
+
function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
|
|
13
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
14
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
15
|
+
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; }
|
|
16
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
|
|
17
|
+
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); }
|
|
18
|
+
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
|
|
19
|
+
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."); }
|
|
20
|
+
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; } }
|
|
21
|
+
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; }
|
|
22
|
+
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; } }
|
|
23
|
+
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
|
|
24
|
+
import { DragOutlined, EllipsisOutlined, ExclamationCircleOutlined, WarningOutlined } from "@ant-design/icons";
|
|
25
|
+
import { Alert, Button, Checkbox, Dropdown, Modal, Tooltip, Upload } from "antd";
|
|
26
|
+
import React from "react";
|
|
27
|
+
import { channelStatesToSnapshot, isStoreSnapshot, singleChannelStateToSnapshot, snapshotToChannelStates } from "../../shared/utils/parseSnapshot";
|
|
28
|
+
import { queryPasteDenied } from "../../shared/utils/permissions";
|
|
29
|
+
import { useViewerState } from "../../state/store";
|
|
30
|
+
import { cloneChannelState } from "../../state/util";
|
|
31
|
+
import { useContextualAlert } from "../shared/ContextualAlert";
|
|
32
|
+
var ImportModalState = /*#__PURE__*/function (ImportModalState) {
|
|
33
|
+
ImportModalState[ImportModalState["Closed"] = 0] = "Closed";
|
|
34
|
+
ImportModalState[ImportModalState["Import"] = 1] = "Import";
|
|
35
|
+
ImportModalState[ImportModalState["Warning"] = 2] = "Warning";
|
|
36
|
+
return ImportModalState;
|
|
37
|
+
}(ImportModalState || {});
|
|
38
|
+
var parseSnapshot = function parseSnapshot(snapshotString) {
|
|
39
|
+
var parsed;
|
|
40
|
+
try {
|
|
41
|
+
parsed = JSON.parse(snapshotString);
|
|
42
|
+
} catch (_unused) {
|
|
43
|
+
parsed = undefined;
|
|
44
|
+
}
|
|
45
|
+
if (!isStoreSnapshot(parsed)) {
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
return snapshotToChannelStates(parsed);
|
|
49
|
+
};
|
|
50
|
+
var PartialMatchMessage = function PartialMatchMessage(props) {
|
|
51
|
+
var matchedCount = props.matchedCount,
|
|
52
|
+
unmatched = props.unmatched;
|
|
53
|
+
var unmatchedCount = unmatched.length;
|
|
54
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", null, "Settings applied to ", matchedCount, " channel", matchedCount > 1 ? "s" : "", ". Could not find a match for", " ", unmatchedCount, " channel name", unmatchedCount > 1 ? "s" : "", ":"), /*#__PURE__*/React.createElement("ul", null, unmatched.map(function (channelName, index) {
|
|
55
|
+
return /*#__PURE__*/React.createElement("li", {
|
|
56
|
+
key: index
|
|
57
|
+
}, channelName);
|
|
58
|
+
})));
|
|
59
|
+
};
|
|
60
|
+
var SuccessMessage = function SuccessMessage(_ref) {
|
|
61
|
+
var channelCount = _ref.channelCount,
|
|
62
|
+
undo = _ref.undo;
|
|
63
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, "Settings applied", channelCount !== undefined && " to ".concat(channelCount, " channel").concat(channelCount > 1 ? "s" : ""), " -", " ", /*#__PURE__*/React.createElement(Button, {
|
|
64
|
+
type: "link",
|
|
65
|
+
style: {
|
|
66
|
+
padding: 0,
|
|
67
|
+
height: "unset"
|
|
68
|
+
},
|
|
69
|
+
onClick: undo
|
|
70
|
+
}, "Undo"));
|
|
71
|
+
};
|
|
72
|
+
var CopySettingsButton = function CopySettingsButton(props) {
|
|
73
|
+
var imageName = props.imageName,
|
|
74
|
+
scrollContainer = props.scrollContainer,
|
|
75
|
+
hide = props.hide,
|
|
76
|
+
getDropdownContainer = props.getDropdownContainer;
|
|
77
|
+
var buttonRef = React.useRef(null);
|
|
78
|
+
var _React$useState = React.useState(true),
|
|
79
|
+
_React$useState2 = _slicedToArray(_React$useState, 2),
|
|
80
|
+
includeColor = _React$useState2[0],
|
|
81
|
+
setIncludeColor = _React$useState2[1];
|
|
82
|
+
var _React$useState3 = React.useState(false),
|
|
83
|
+
_React$useState4 = _slicedToArray(_React$useState3, 2),
|
|
84
|
+
pasteDenied = _React$useState4[0],
|
|
85
|
+
setPasteDenied = _React$useState4[1];
|
|
86
|
+
var _React$useState5 = React.useState(false),
|
|
87
|
+
_React$useState6 = _slicedToArray(_React$useState5, 2),
|
|
88
|
+
dropdownOpen = _React$useState6[0],
|
|
89
|
+
setDropdownOpen = _React$useState6[1];
|
|
90
|
+
var _React$useState7 = React.useState(ImportModalState.Closed),
|
|
91
|
+
_React$useState8 = _slicedToArray(_React$useState7, 2),
|
|
92
|
+
importModalState = _React$useState8[0],
|
|
93
|
+
setImportModalState = _React$useState8[1];
|
|
94
|
+
var _useContextualAlert = useContextualAlert(buttonRef.current, {
|
|
95
|
+
scrollContainer: scrollContainer,
|
|
96
|
+
hide: hide,
|
|
97
|
+
timeout: 8000
|
|
98
|
+
}),
|
|
99
|
+
_useContextualAlert2 = _slicedToArray(_useContextualAlert, 2),
|
|
100
|
+
alert = _useContextualAlert2[0],
|
|
101
|
+
showContextualAlert = _useContextualAlert2[1];
|
|
102
|
+
var _React$useState9 = React.useState(undefined),
|
|
103
|
+
_React$useState0 = _slicedToArray(_React$useState9, 2),
|
|
104
|
+
modalAlert = _React$useState0[0],
|
|
105
|
+
setModalAlert = _React$useState0[1];
|
|
106
|
+
var _React$useState1 = React.useState(undefined),
|
|
107
|
+
_React$useState10 = _slicedToArray(_React$useState1, 2),
|
|
108
|
+
modalAlertType = _React$useState10[0],
|
|
109
|
+
setModalAlertType = _React$useState10[1];
|
|
110
|
+
var showModalAlert = React.useCallback(function (content, alertType) {
|
|
111
|
+
setModalAlert(content);
|
|
112
|
+
setModalAlertType(alertType);
|
|
113
|
+
}, []);
|
|
114
|
+
var undoRef = React.useRef();
|
|
115
|
+
var undo = React.useCallback(function () {
|
|
116
|
+
var _undoRef$current;
|
|
117
|
+
(_undoRef$current = undoRef.current) === null || _undoRef$current === void 0 || _undoRef$current.call(undoRef);
|
|
118
|
+
showModalAlert(undefined);
|
|
119
|
+
showContextualAlert(undefined);
|
|
120
|
+
}, [showContextualAlert, showModalAlert]);
|
|
121
|
+
|
|
122
|
+
// On first render, check if the user has disabled clipboard access
|
|
123
|
+
var firstRenderRef = React.useRef(false);
|
|
124
|
+
if (firstRenderRef.current) {
|
|
125
|
+
queryPasteDenied().then(setPasteDenied);
|
|
126
|
+
firstRenderRef.current = true;
|
|
127
|
+
}
|
|
128
|
+
var pastePrompt = pasteDenied && /*#__PURE__*/React.createElement(Tooltip, {
|
|
129
|
+
title: "You must grant access to the clipboard",
|
|
130
|
+
placement: "right"
|
|
131
|
+
}, /*#__PURE__*/React.createElement(ExclamationCircleOutlined, null));
|
|
132
|
+
var applySnapshotText = React.useCallback(function (jsonTextSnapshot, sourceName, defaultModalAlerts) {
|
|
133
|
+
var showDefaultAlert = defaultModalAlerts ? showModalAlert : showContextualAlert;
|
|
134
|
+
var sourceNameCapitalized = sourceName.charAt(0).toUpperCase() + sourceName.slice(1);
|
|
135
|
+
var parsedStates = parseSnapshot(jsonTextSnapshot);
|
|
136
|
+
var _useViewerState$getSt = useViewerState.getState(),
|
|
137
|
+
channelSettings = _useViewerState$getSt.channelSettings,
|
|
138
|
+
replaceAllChannelSettings = _useViewerState$getSt.replaceAllChannelSettings;
|
|
139
|
+
var currentStates = channelSettings.map(cloneChannelState);
|
|
140
|
+
if (parsedStates === undefined) {
|
|
141
|
+
showDefaultAlert("".concat(sourceNameCapitalized, " does not contain channel settings"), "error");
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
var channelCount = Object.keys(parsedStates).length;
|
|
145
|
+
var states = currentStates.map(function (state) {
|
|
146
|
+
var result = _objectSpread(_objectSpread({}, cloneChannelState(state)), parsedStates[state.name]);
|
|
147
|
+
delete parsedStates[state.name];
|
|
148
|
+
return result;
|
|
149
|
+
});
|
|
150
|
+
var unmatched = Object.keys(parsedStates);
|
|
151
|
+
var matchedCount = channelCount - unmatched.length;
|
|
152
|
+
var unmatchedCount = unmatched.length;
|
|
153
|
+
replaceAllChannelSettings(states);
|
|
154
|
+
undoRef.current = function () {
|
|
155
|
+
return replaceAllChannelSettings(currentStates);
|
|
156
|
+
};
|
|
157
|
+
if (unmatchedCount > 0) {
|
|
158
|
+
if (matchedCount > 0) {
|
|
159
|
+
// Some channels in the text snapshot matched, some did not
|
|
160
|
+
setImportModalState(ImportModalState.Warning);
|
|
161
|
+
showModalAlert(/*#__PURE__*/React.createElement(PartialMatchMessage, {
|
|
162
|
+
matchedCount: matchedCount,
|
|
163
|
+
unmatched: unmatched
|
|
164
|
+
}), "warning");
|
|
165
|
+
} else {
|
|
166
|
+
// No channels in the text snapshot matched channels in the current image
|
|
167
|
+
showDefaultAlert("Channel names in ".concat(sourceName, " did not match names in image"), "error");
|
|
168
|
+
}
|
|
169
|
+
} else {
|
|
170
|
+
if (matchedCount > 0) {
|
|
171
|
+
// All channels matched!
|
|
172
|
+
setImportModalState(ImportModalState.Closed);
|
|
173
|
+
showContextualAlert(/*#__PURE__*/React.createElement(SuccessMessage, {
|
|
174
|
+
channelCount: matchedCount,
|
|
175
|
+
undo: undo
|
|
176
|
+
}));
|
|
177
|
+
} else {
|
|
178
|
+
// There were no channels in the text snapshot at all!
|
|
179
|
+
showDefaultAlert("".concat(sourceNameCapitalized, " does not contain channel settings"), "error");
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return true;
|
|
183
|
+
}, [showContextualAlert, showModalAlert, undo]);
|
|
184
|
+
var applySingleChannelSnapshotText = React.useCallback(function (textSnapshot, sourceName, defaultModalAlerts, channelIndex) {
|
|
185
|
+
var showDefaultAlert = defaultModalAlerts ? showModalAlert : showContextualAlert;
|
|
186
|
+
var sourceNameCapitalized = sourceName.charAt(0).toUpperCase() + sourceName.slice(1);
|
|
187
|
+
var parsedStates = parseSnapshot(textSnapshot);
|
|
188
|
+
if (parsedStates === undefined) {
|
|
189
|
+
showDefaultAlert("".concat(sourceNameCapitalized, " does not contain a channel setting"), "error");
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
var states = Object.values(parsedStates);
|
|
193
|
+
if (states.length < 1) {
|
|
194
|
+
showDefaultAlert("".concat(sourceNameCapitalized, " does not contain a channel setting"), "error");
|
|
195
|
+
return false;
|
|
196
|
+
} else if (states.length > 1) {
|
|
197
|
+
showDefaultAlert("".concat(sourceNameCapitalized, " contains multiple channel settings and can't be applied to a single channel"), "error");
|
|
198
|
+
return false;
|
|
199
|
+
}
|
|
200
|
+
var state = states[0];
|
|
201
|
+
var _useViewerState$getSt2 = useViewerState.getState(),
|
|
202
|
+
channelSettings = _useViewerState$getSt2.channelSettings,
|
|
203
|
+
replaceAllChannelSettings = _useViewerState$getSt2.replaceAllChannelSettings;
|
|
204
|
+
var currentStates = channelSettings.map(cloneChannelState);
|
|
205
|
+
var newStates = channelSettings.map(function (currentState, index) {
|
|
206
|
+
if (index === channelIndex) {
|
|
207
|
+
return _objectSpread(_objectSpread({}, cloneChannelState(currentState)), state);
|
|
208
|
+
} else {
|
|
209
|
+
return cloneChannelState(currentState);
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
replaceAllChannelSettings(newStates);
|
|
213
|
+
undoRef.current = function () {
|
|
214
|
+
return replaceAllChannelSettings(currentStates);
|
|
215
|
+
};
|
|
216
|
+
showContextualAlert(/*#__PURE__*/React.createElement(SuccessMessage, {
|
|
217
|
+
undo: undo
|
|
218
|
+
}));
|
|
219
|
+
return true;
|
|
220
|
+
}, [showContextualAlert, showModalAlert, undo]);
|
|
221
|
+
var onClickExport = React.useCallback(function () {
|
|
222
|
+
setDropdownOpen(false);
|
|
223
|
+
var _useViewerState$getSt3 = useViewerState.getState(),
|
|
224
|
+
channelSettings = _useViewerState$getSt3.channelSettings;
|
|
225
|
+
var serialized;
|
|
226
|
+
if (props.channelIndex !== undefined) {
|
|
227
|
+
var channel = channelSettings[props.channelIndex];
|
|
228
|
+
serialized = singleChannelStateToSnapshot(channel, includeColor ? undefined : ["color"]);
|
|
229
|
+
} else {
|
|
230
|
+
serialized = channelStatesToSnapshot(channelSettings, includeColor ? undefined : ["color"]);
|
|
231
|
+
}
|
|
232
|
+
var stateText = JSON.stringify(serialized);
|
|
233
|
+
var link = document.createElement("a");
|
|
234
|
+
link.setAttribute("href", "data:text/plain;charset=utf-8," + encodeURIComponent(stateText));
|
|
235
|
+
var isoDate = new Date().toISOString().split("T")[0];
|
|
236
|
+
var imgName = imageName !== null && imageName !== void 0 ? imageName : "settings";
|
|
237
|
+
link.setAttribute("download", "".concat(isoDate, "_").concat(imgName, ".json"));
|
|
238
|
+
link.style.display = "none";
|
|
239
|
+
document.body.appendChild(link);
|
|
240
|
+
link.click();
|
|
241
|
+
document.body.removeChild(link);
|
|
242
|
+
}, [imageName, includeColor, props.channelIndex]);
|
|
243
|
+
var onClickPaste = React.useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
|
|
244
|
+
var clipboard;
|
|
245
|
+
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
246
|
+
while (1) switch (_context.prev = _context.next) {
|
|
247
|
+
case 0:
|
|
248
|
+
setDropdownOpen(false);
|
|
249
|
+
|
|
250
|
+
// Try to read the clipboard
|
|
251
|
+
clipboard = undefined;
|
|
252
|
+
_context.prev = 2;
|
|
253
|
+
_context.next = 5;
|
|
254
|
+
return navigator.clipboard.readText();
|
|
255
|
+
case 5:
|
|
256
|
+
clipboard = _context.sent;
|
|
257
|
+
_context.next = 13;
|
|
258
|
+
break;
|
|
259
|
+
case 8:
|
|
260
|
+
_context.prev = 8;
|
|
261
|
+
_context.t0 = _context["catch"](2);
|
|
262
|
+
showContextualAlert("Could not read clipboard", "error");
|
|
263
|
+
// If paste failed, check if it was because the user was asked to grant clipboard access and said no
|
|
264
|
+
queryPasteDenied().then(setPasteDenied);
|
|
265
|
+
return _context.abrupt("return");
|
|
266
|
+
case 13:
|
|
267
|
+
if (props.channelIndex !== undefined) {
|
|
268
|
+
applySingleChannelSnapshotText(clipboard, "clipboard", false, props.channelIndex);
|
|
269
|
+
} else {
|
|
270
|
+
applySnapshotText(clipboard, "clipboard", false);
|
|
271
|
+
}
|
|
272
|
+
case 14:
|
|
273
|
+
case "end":
|
|
274
|
+
return _context.stop();
|
|
275
|
+
}
|
|
276
|
+
}, _callee, null, [[2, 8]]);
|
|
277
|
+
})), [applySingleChannelSnapshotText, applySnapshotText, props.channelIndex, showContextualAlert]);
|
|
278
|
+
var onImportFile = React.useCallback(/*#__PURE__*/function () {
|
|
279
|
+
var _ref4 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(_ref3) {
|
|
280
|
+
var file, onSuccess, onError, text, result;
|
|
281
|
+
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
|
|
282
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
283
|
+
case 0:
|
|
284
|
+
file = _ref3.file, onSuccess = _ref3.onSuccess, onError = _ref3.onError;
|
|
285
|
+
_context2.next = 3;
|
|
286
|
+
return file.text();
|
|
287
|
+
case 3:
|
|
288
|
+
text = _context2.sent;
|
|
289
|
+
if (props.channelIndex !== undefined) {
|
|
290
|
+
result = applySingleChannelSnapshotText(text, "file", true, props.channelIndex);
|
|
291
|
+
} else {
|
|
292
|
+
result = applySnapshotText(text, "file", true);
|
|
293
|
+
}
|
|
294
|
+
if (result) {
|
|
295
|
+
onSuccess === null || onSuccess === void 0 || onSuccess(undefined);
|
|
296
|
+
} else {
|
|
297
|
+
onError === null || onError === void 0 || onError(new Error());
|
|
298
|
+
}
|
|
299
|
+
case 6:
|
|
300
|
+
case "end":
|
|
301
|
+
return _context2.stop();
|
|
302
|
+
}
|
|
303
|
+
}, _callee2);
|
|
304
|
+
}));
|
|
305
|
+
return function (_x) {
|
|
306
|
+
return _ref4.apply(this, arguments);
|
|
307
|
+
};
|
|
308
|
+
}(), [applySingleChannelSnapshotText, applySnapshotText, props.channelIndex]);
|
|
309
|
+
var copyItem = {
|
|
310
|
+
key: "Copy",
|
|
311
|
+
label: "Copy",
|
|
312
|
+
onClick: function onClick() {
|
|
313
|
+
setDropdownOpen(false);
|
|
314
|
+
try {
|
|
315
|
+
var _useViewerState$getSt4 = useViewerState.getState(),
|
|
316
|
+
channelSettings = _useViewerState$getSt4.channelSettings;
|
|
317
|
+
var serialized;
|
|
318
|
+
if (props.channelIndex !== undefined) {
|
|
319
|
+
var channel = channelSettings[props.channelIndex];
|
|
320
|
+
serialized = singleChannelStateToSnapshot(channel, includeColor ? undefined : ["color"]);
|
|
321
|
+
} else {
|
|
322
|
+
serialized = channelStatesToSnapshot(channelSettings, includeColor ? undefined : ["color"]);
|
|
323
|
+
}
|
|
324
|
+
navigator.clipboard.writeText(JSON.stringify(serialized));
|
|
325
|
+
showContextualAlert("Settings copied");
|
|
326
|
+
} catch (_unused3) {
|
|
327
|
+
showContextualAlert("Could not copy settings", "error");
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
};
|
|
331
|
+
var pasteItem = {
|
|
332
|
+
key: "Paste",
|
|
333
|
+
label: /*#__PURE__*/React.createElement("div", {
|
|
334
|
+
style: {
|
|
335
|
+
display: "flex",
|
|
336
|
+
justifyContent: "space-between"
|
|
337
|
+
}
|
|
338
|
+
}, /*#__PURE__*/React.createElement("span", null, "Paste"), pastePrompt),
|
|
339
|
+
disabled: pasteDenied,
|
|
340
|
+
onClick: onClickPaste
|
|
341
|
+
};
|
|
342
|
+
var includeColorItem = {
|
|
343
|
+
key: "IncludeColor",
|
|
344
|
+
className: "import-dropdown-menu-item-include-color",
|
|
345
|
+
label: /*#__PURE__*/React.createElement(Checkbox, {
|
|
346
|
+
checked: includeColor
|
|
347
|
+
}, "Include color setting"),
|
|
348
|
+
onClick: function onClick(_ref5) {
|
|
349
|
+
var domEvent = _ref5.domEvent;
|
|
350
|
+
domEvent.stopPropagation();
|
|
351
|
+
domEvent.preventDefault();
|
|
352
|
+
setIncludeColor(function (includeColor) {
|
|
353
|
+
return !includeColor;
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
};
|
|
357
|
+
var items;
|
|
358
|
+
if (props.hideImportExport) {
|
|
359
|
+
items = [copyItem, pasteItem, {
|
|
360
|
+
key: "divider",
|
|
361
|
+
type: "divider"
|
|
362
|
+
}, includeColorItem];
|
|
363
|
+
} else {
|
|
364
|
+
var exportItem = {
|
|
365
|
+
key: 1,
|
|
366
|
+
label: "Export",
|
|
367
|
+
onClick: onClickExport
|
|
368
|
+
};
|
|
369
|
+
var importItem = {
|
|
370
|
+
key: 3,
|
|
371
|
+
label: "Import",
|
|
372
|
+
onClick: function onClick() {
|
|
373
|
+
setDropdownOpen(false);
|
|
374
|
+
setImportModalState(ImportModalState.Import);
|
|
375
|
+
showModalAlert(undefined);
|
|
376
|
+
}
|
|
377
|
+
};
|
|
378
|
+
items = [copyItem, exportItem, pasteItem, importItem, {
|
|
379
|
+
key: "divider",
|
|
380
|
+
type: "divider"
|
|
381
|
+
}, includeColorItem];
|
|
382
|
+
}
|
|
383
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Dropdown, {
|
|
384
|
+
menu: {
|
|
385
|
+
items: items
|
|
386
|
+
},
|
|
387
|
+
trigger: ["click"],
|
|
388
|
+
overlayStyle: {
|
|
389
|
+
minWidth: 100
|
|
390
|
+
},
|
|
391
|
+
getPopupContainer: getDropdownContainer,
|
|
392
|
+
open: dropdownOpen,
|
|
393
|
+
onOpenChange: function onOpenChange(open, _ref6) {
|
|
394
|
+
var source = _ref6.source;
|
|
395
|
+
if (open || source === "trigger") {
|
|
396
|
+
setDropdownOpen(open);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
}, /*#__PURE__*/React.createElement(Button, {
|
|
400
|
+
type: "text",
|
|
401
|
+
size: "large",
|
|
402
|
+
ref: buttonRef
|
|
403
|
+
}, /*#__PURE__*/React.createElement(EllipsisOutlined, null))), /*#__PURE__*/React.createElement(Modal, {
|
|
404
|
+
closable: true,
|
|
405
|
+
title: importModalState === ImportModalState.Warning ? "Settings applied with exceptions" : "Import channel settings",
|
|
406
|
+
className: "modal-settings-import",
|
|
407
|
+
open: importModalState !== ImportModalState.Closed,
|
|
408
|
+
onCancel: function onCancel() {
|
|
409
|
+
return setImportModalState(ImportModalState.Closed);
|
|
410
|
+
},
|
|
411
|
+
footer: importModalState === ImportModalState.Warning && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Button, {
|
|
412
|
+
onClick: function onClick() {
|
|
413
|
+
undo();
|
|
414
|
+
setImportModalState(ImportModalState.Closed);
|
|
415
|
+
}
|
|
416
|
+
}, "Undo all"), /*#__PURE__*/React.createElement(Button, {
|
|
417
|
+
type: "primary",
|
|
418
|
+
onClick: function onClick() {
|
|
419
|
+
return setImportModalState(ImportModalState.Closed);
|
|
420
|
+
}
|
|
421
|
+
}, "Ok")),
|
|
422
|
+
getContainer: getDropdownContainer
|
|
423
|
+
}, importModalState === ImportModalState.Import && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("p", null, "Upload a saved .json settings file"), /*#__PURE__*/React.createElement(Upload.Dragger, {
|
|
424
|
+
showUploadList: false,
|
|
425
|
+
customRequest: onImportFile,
|
|
426
|
+
accept: ".json"
|
|
427
|
+
}, /*#__PURE__*/React.createElement(DragOutlined, null), " Drag and drop here or click to browse")), modalAlert !== undefined && /*#__PURE__*/React.createElement(Alert, {
|
|
428
|
+
showIcon: true,
|
|
429
|
+
style: {
|
|
430
|
+
marginTop: 15
|
|
431
|
+
},
|
|
432
|
+
message: modalAlert,
|
|
433
|
+
icon: modalAlertType === "error" ? /*#__PURE__*/React.createElement(WarningOutlined, {
|
|
434
|
+
style: {
|
|
435
|
+
fontSize: 21
|
|
436
|
+
}
|
|
437
|
+
}) : /*#__PURE__*/React.createElement(ExclamationCircleOutlined, {
|
|
438
|
+
style: {
|
|
439
|
+
fontSize: 21
|
|
440
|
+
}
|
|
441
|
+
}),
|
|
442
|
+
type: modalAlertType
|
|
443
|
+
})), alert);
|
|
444
|
+
};
|
|
445
|
+
export default CopySettingsButton;
|