@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.
Files changed (72) hide show
  1. package/es/aics-image-viewer/components/App/index.js +15 -5
  2. package/es/aics-image-viewer/components/ChannelsWidget.js +3 -1
  3. package/es/aics-image-viewer/components/ChannelsWidgetRow.js +29 -16
  4. package/es/aics-image-viewer/components/ColorPicker/index.js +9 -1
  5. package/es/aics-image-viewer/components/ControlPanel/CopySettingsButton.js +445 -0
  6. package/es/aics-image-viewer/components/ControlPanel/index.js +16 -5
  7. package/es/aics-image-viewer/components/ControlPanel/styles.css +29 -2
  8. package/es/aics-image-viewer/components/StyleProvider/index.js +17 -2
  9. package/es/aics-image-viewer/components/Toolbar/ViewModeRadioButtons.js +1 -1
  10. package/es/aics-image-viewer/components/Toolbar/index.js +1 -1
  11. package/es/aics-image-viewer/components/Toolbar/styles.css +0 -10
  12. package/es/aics-image-viewer/components/{CellViewerCanvasWrapper → ViewerCanvasWrapper}/index.js +3 -2
  13. package/es/aics-image-viewer/components/dimension_sliders/AxisClipSliders.js +21 -8
  14. package/es/aics-image-viewer/components/dimension_sliders/RotationSliders.js +6 -8
  15. package/es/aics-image-viewer/components/dimension_sliders/SliderRows.js +8 -6
  16. package/es/aics-image-viewer/components/shared/ContextualAlert.js +101 -0
  17. package/es/aics-image-viewer/components/shared/ControlPanelRow/index.js +4 -2
  18. package/es/aics-image-viewer/components/shared/ControlPanelRow/styles.css +4 -3
  19. package/es/aics-image-viewer/components/useVolume.js +59 -25
  20. package/es/aics-image-viewer/shared/constants.js +25 -1
  21. package/es/aics-image-viewer/shared/types.js +1 -1
  22. package/es/aics-image-viewer/shared/utils/controlPointsToLut.js +4 -0
  23. package/es/aics-image-viewer/shared/utils/parseSnapshot.js +205 -0
  24. package/es/aics-image-viewer/shared/utils/{urlParsing.js → parseUrl.js} +55 -191
  25. package/es/aics-image-viewer/shared/utils/permissions.js +46 -0
  26. package/es/aics-image-viewer/shared/utils/test/camera.test.js +1 -2
  27. package/es/aics-image-viewer/shared/utils/test/{urlParsing.test.js → parseUrl.test.js} +28 -25
  28. package/es/aics-image-viewer/shared/utils/test/storage.test.js +2 -2
  29. package/es/aics-image-viewer/shared/utils/test/viewerChannelSettings.test.js +1 -1
  30. package/es/aics-image-viewer/state/deserialize.js +443 -331
  31. package/es/aics-image-viewer/state/reset.js +1 -1
  32. package/es/aics-image-viewer/state/serialize.js +168 -78
  33. package/es/aics-image-viewer/state/subscribers.js +1 -1
  34. package/es/aics-image-viewer/state/test/deserialize.test.js +63 -77
  35. package/es/aics-image-viewer/state/test/reset.test.js +2 -2
  36. package/es/aics-image-viewer/state/test/serialize.test.js +42 -43
  37. package/es/aics-image-viewer/state/test/test_data.js +119 -1
  38. package/es/aics-image-viewer/state/types.js +157 -245
  39. package/es/aics-image-viewer/state/util.js +39 -1
  40. package/es/index.js +4 -2
  41. package/package.json +26 -44
  42. package/type-declarations/aics-image-viewer/components/App/types.d.ts +3 -3
  43. package/type-declarations/aics-image-viewer/components/ChannelsWidget.d.ts +3 -0
  44. package/type-declarations/aics-image-viewer/components/ChannelsWidgetRow.d.ts +3 -0
  45. package/type-declarations/aics-image-viewer/components/ControlPanel/CopySettingsButton.d.ts +11 -0
  46. package/type-declarations/aics-image-viewer/components/Toolbar/ViewModeRadioButtons.d.ts +1 -1
  47. package/type-declarations/aics-image-viewer/components/{CellViewerCanvasWrapper → ViewerCanvasWrapper}/index.d.ts +4 -3
  48. package/type-declarations/aics-image-viewer/components/dimension_sliders/AxisClipSliders.d.ts +7 -6
  49. package/type-declarations/aics-image-viewer/components/dimension_sliders/SliderRows.d.ts +1 -2
  50. package/type-declarations/aics-image-viewer/components/shared/ContextualAlert.d.ts +29 -0
  51. package/type-declarations/aics-image-viewer/components/shared/ControlPanelRow/index.d.ts +1 -0
  52. package/type-declarations/aics-image-viewer/components/useVolume.d.ts +3 -0
  53. package/type-declarations/aics-image-viewer/shared/constants.d.ts +2 -2
  54. package/type-declarations/aics-image-viewer/shared/types.d.ts +2 -2
  55. package/type-declarations/aics-image-viewer/shared/utils/controlPointsToLut.d.ts +1 -1
  56. package/type-declarations/aics-image-viewer/shared/utils/parseSnapshot.d.ts +49 -0
  57. package/type-declarations/aics-image-viewer/shared/utils/{urlParsing.d.ts → parseUrl.d.ts} +3 -24
  58. package/type-declarations/aics-image-viewer/shared/utils/permissions.d.ts +7 -0
  59. package/type-declarations/aics-image-viewer/shared/utils/viewerChannelSettings.d.ts +1 -1
  60. package/type-declarations/aics-image-viewer/state/deserialize.d.ts +70 -35
  61. package/type-declarations/aics-image-viewer/state/reset.d.ts +1 -1
  62. package/type-declarations/aics-image-viewer/state/serialize.d.ts +44 -10
  63. package/type-declarations/aics-image-viewer/state/types.d.ts +265 -159
  64. package/type-declarations/aics-image-viewer/state/util.d.ts +3 -1
  65. package/type-declarations/index.d.ts +5 -3
  66. package/es/Globals.d.js +0 -0
  67. package/es/aics-image-viewer/shared/enums.js +0 -18
  68. package/es/aics-image-viewer/shared/utils/firebase/index.js +0 -109
  69. package/type-declarations/aics-image-viewer/shared/enums.d.ts +0 -15
  70. package/type-declarations/aics-image-viewer/shared/utils/firebase/index.d.ts +0 -69
  71. package/type-declarations/aics-image-viewer/shared/utils/math.d.ts +0 -1
  72. /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
- fovDownloadHref: props.parentImageDownloadHref,
586
- cellDownloadHref: props.imageDownloadHref,
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 { Button, Checkbox } from "antd";
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(Button, {
74
- icon: /*#__PURE__*/React.createElement(ViewerIcon, {
75
- type: "preferences",
76
- style: {
77
- fontSize: "16px"
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: props.name,
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;