@aics/vole-app 2.15.0 → 3.1.2
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/ChannelUpdater.js +21 -3
- package/es/aics-image-viewer/components/App/index.js +156 -199
- package/es/aics-image-viewer/components/CellViewerCanvasWrapper/index.js +10 -9
- package/es/aics-image-viewer/components/ChannelsWidget.js +35 -22
- package/es/aics-image-viewer/components/ChannelsWidgetRow/index.js +27 -71
- package/es/aics-image-viewer/components/ChannelsWidgetRow/styles.css +0 -6
- package/es/aics-image-viewer/components/ColorPicker.js +1 -1
- package/es/aics-image-viewer/components/ControlPanel/index.js +5 -4
- package/es/aics-image-viewer/components/CustomizeWidget.js +12 -8
- package/es/aics-image-viewer/components/ErrorAlert/index.js +4 -4
- package/es/aics-image-viewer/components/GlobalVolumeControls.js +12 -10
- package/es/aics-image-viewer/components/StyleProvider/index.js +4 -2
- package/es/aics-image-viewer/components/TfEditor/index.js +304 -154
- package/es/aics-image-viewer/components/TfEditor/styles.css +53 -31
- package/es/aics-image-viewer/components/Toolbar/DownloadButton.js +1 -1
- package/es/aics-image-viewer/components/Toolbar/index.js +18 -16
- package/es/aics-image-viewer/components/shared/SharedCheckBox.js +1 -1
- package/es/aics-image-viewer/components/shared/SliderRow/styles.css +1 -0
- package/es/aics-image-viewer/components/shared/SmarterSlider.js +1 -1
- package/es/aics-image-viewer/components/shared/ViewerIcon.js +1 -1
- package/es/aics-image-viewer/components/useVolume.js +68 -59
- package/es/aics-image-viewer/shared/constants.js +2 -2
- package/es/aics-image-viewer/shared/utils/controlPointsToLut.js +57 -24
- package/es/aics-image-viewer/shared/utils/sceneStore.js +14 -4
- package/es/aics-image-viewer/shared/utils/storage.js +238 -0
- package/es/aics-image-viewer/shared/utils/test/storage.test.js +264 -0
- package/es/aics-image-viewer/shared/utils/test/urlParsing.test.js +249 -109
- package/es/aics-image-viewer/shared/utils/test/viewerChannelSettings.test.js +1 -1
- package/es/aics-image-viewer/shared/utils/urlParsing.js +287 -154
- package/es/aics-image-viewer/shared/utils/viewerState.js +4 -24
- package/es/aics-image-viewer/state/reset.js +111 -0
- package/es/aics-image-viewer/state/store.js +90 -0
- package/es/aics-image-viewer/state/subscribers.js +153 -0
- package/es/aics-image-viewer/state/test/reset.test.js +247 -0
- package/es/aics-image-viewer/state/util.js +71 -0
- package/es/index.js +3 -3
- package/package.json +18 -11
- package/type-declarations/aics-image-viewer/components/App/ChannelUpdater.d.ts +2 -4
- package/type-declarations/aics-image-viewer/components/App/types.d.ts +3 -3
- package/type-declarations/aics-image-viewer/components/AxisClipSliders/index.d.ts +6 -6
- package/type-declarations/aics-image-viewer/components/CellViewerCanvasWrapper/index.d.ts +5 -14
- package/type-declarations/aics-image-viewer/components/ChannelsWidget.d.ts +3 -6
- package/type-declarations/aics-image-viewer/components/ChannelsWidgetRow/index.d.ts +3 -6
- package/type-declarations/aics-image-viewer/components/ColorPicker.d.ts +1 -1
- package/type-declarations/aics-image-viewer/components/ControlPanel/index.d.ts +6 -7
- package/type-declarations/aics-image-viewer/components/CustomizeWidget.d.ts +2 -8
- package/type-declarations/aics-image-viewer/components/ErrorAlert/index.d.ts +4 -0
- package/type-declarations/aics-image-viewer/components/GlobalVolumeControls.d.ts +2 -9
- package/type-declarations/aics-image-viewer/components/MetadataViewer/index.d.ts +1 -1
- package/type-declarations/aics-image-viewer/components/StyleProvider/index.d.ts +1 -1
- package/type-declarations/aics-image-viewer/components/TfEditor/index.d.ts +10 -3
- package/type-declarations/aics-image-viewer/components/Toolbar/index.d.ts +3 -12
- package/type-declarations/aics-image-viewer/components/shared/SliderRow/index.d.ts +1 -1
- package/type-declarations/aics-image-viewer/components/shared/SmarterSlider.d.ts +1 -1
- package/type-declarations/aics-image-viewer/components/shared/ViewerIcon.d.ts +1 -1
- package/type-declarations/aics-image-viewer/components/useVolume.d.ts +7 -4
- package/type-declarations/aics-image-viewer/shared/constants.d.ts +5 -5
- package/type-declarations/aics-image-viewer/shared/types.d.ts +1 -1
- package/type-declarations/aics-image-viewer/shared/utils/controlPointsToLut.d.ts +9 -5
- package/type-declarations/aics-image-viewer/shared/utils/firebase/index.d.ts +1 -1
- package/type-declarations/aics-image-viewer/shared/utils/hooks.d.ts +1 -1
- package/type-declarations/aics-image-viewer/shared/utils/playControls.d.ts +1 -1
- package/type-declarations/aics-image-viewer/shared/utils/sceneStore.d.ts +8 -4
- package/type-declarations/aics-image-viewer/shared/utils/storage.d.ts +15 -0
- package/type-declarations/aics-image-viewer/shared/utils/urlParsing.d.ts +94 -31
- package/type-declarations/aics-image-viewer/shared/utils/viewerChannelSettings.d.ts +39 -1
- package/type-declarations/aics-image-viewer/shared/utils/viewerState.d.ts +3 -6
- package/type-declarations/aics-image-viewer/state/reset.d.ts +29 -0
- package/type-declarations/aics-image-viewer/state/store.d.ts +30 -0
- package/type-declarations/aics-image-viewer/state/subscribers.d.ts +4 -0
- package/type-declarations/aics-image-viewer/state/types.d.ts +46 -0
- package/type-declarations/aics-image-viewer/state/util.d.ts +8 -0
- package/type-declarations/index.d.ts +4 -4
- package/es/aics-image-viewer/components/ViewerStateProvider/ResetStateProvider.js +0 -163
- package/es/aics-image-viewer/components/ViewerStateProvider/index.js +0 -259
- package/type-declarations/aics-image-viewer/components/ViewerStateProvider/ResetStateProvider.d.ts +0 -34
- package/type-declarations/aics-image-viewer/components/ViewerStateProvider/index.d.ts +0 -33
- package/type-declarations/aics-image-viewer/components/ViewerStateProvider/types.d.ts +0 -107
- /package/es/aics-image-viewer/{components/ViewerStateProvider → state}/types.js +0 -0
|
@@ -1,10 +1,18 @@
|
|
|
1
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
|
-
var _ViewerChannelSetting, _ViewerChannelSetting2, _ViewerChannelSetting3, _ViewerChannelSetting4, _ViewerChannelSetting5, _ViewerChannelSetting6, _ViewerChannelSetting7, _ViewerChannelSetting8, _ViewerChannelSetting9, _ViewerChannelSetting10, _ViewerChannelSetting11, _ViewerStateKeys$View, _ViewerStateKeys$Mode, _ViewerStateKeys$Mask, _ViewerStateKeys$Imag, _ViewerStateKeys$Axes, _ViewerStateKeys$Boun, _ViewerStateKeys$Boun2, _ViewerStateKeys$Back, _ViewerStateKeys$Auto, _ViewerStateKeys$Brig, _ViewerStateKeys$Dens, _ViewerStateKeys$Leve, _ViewerStateKeys$Inte, _ViewerStateKeys$Regi, _ViewerStateKeys$Slic, _ViewerStateKeys$Time, _ViewerStateKeys$Scen, _ViewerStateKeys$Came;
|
|
3
|
-
function _regeneratorRuntime() { "use strict";
|
|
4
|
-
function
|
|
5
|
-
function
|
|
2
|
+
var _ViewerChannelSetting, _ViewerChannelSetting2, _ViewerChannelSetting3, _ViewerChannelSetting4, _ViewerChannelSetting5, _ViewerChannelSetting6, _ViewerChannelSetting7, _ViewerChannelSetting8, _ViewerChannelSetting9, _ViewerChannelSetting10, _ViewerChannelSetting11, _ViewerChannelSetting12, _ViewerChannelSetting13, _ViewerChannelSetting14, _ViewerStateKeys$View, _ViewerStateKeys$Mode, _ViewerStateKeys$Mask, _ViewerStateKeys$Imag, _ViewerStateKeys$Axes, _ViewerStateKeys$Boun, _ViewerStateKeys$Boun2, _ViewerStateKeys$Back, _ViewerStateKeys$Auto, _ViewerStateKeys$Brig, _ViewerStateKeys$Dens, _ViewerStateKeys$Leve, _ViewerStateKeys$Inte, _ViewerStateKeys$Regi, _ViewerStateKeys$Slic, _ViewerStateKeys$Time, _ViewerStateKeys$Scen, _ViewerStateKeys$Came;
|
|
3
|
+
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 }; })(); }
|
|
4
|
+
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"); }
|
|
5
|
+
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; }; }
|
|
6
|
+
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(); }); }
|
|
7
|
+
function _regeneratorAsyncGen(r, e, t, o, n) { return new _regeneratorAsyncIterator(_regenerator().w(r, e, t, o), n || Promise); }
|
|
8
|
+
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); }
|
|
9
|
+
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 }; })(); }
|
|
10
|
+
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); }
|
|
11
|
+
function _OverloadYield(e, d) { this.v = e, this.k = d; }
|
|
6
12
|
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); }
|
|
7
13
|
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); }); }; }
|
|
14
|
+
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; }
|
|
15
|
+
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; }
|
|
8
16
|
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
|
|
9
17
|
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."); }
|
|
10
18
|
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; } }
|
|
@@ -28,54 +36,55 @@ import { ImageType, RenderMode, ViewMode } from "../enums";
|
|
|
28
36
|
import { removeMatchingProperties, removeUndefinedProperties } from "./datatypes";
|
|
29
37
|
import FirebaseRequest from "./firebase";
|
|
30
38
|
import { clamp } from "./math";
|
|
39
|
+
import { readStoredMetadata, readStoredScenes } from "./storage";
|
|
31
40
|
export var ENCODED_COMMA_REGEX = /%2C/g;
|
|
32
41
|
export var ENCODED_COLON_REGEX = /%3A/g;
|
|
33
42
|
var DEFAULT_CONTROL_POINT_COLOR = [255, 255, 255];
|
|
34
43
|
var DEFAULT_CONTROL_POINT_COLOR_CODE = "1";
|
|
35
|
-
|
|
36
|
-
/** If the `url` query param equals this, parse image url(s) and metadata from local storage instead of params */
|
|
37
|
-
var URL_FETCH_FROM_STORAGE = "storage";
|
|
38
|
-
|
|
39
|
-
// TODO: refactor regexes to be composed of one another rather than duplicating code
|
|
40
|
-
// const COLOR_CODES: Record<string, ColorArray> = {
|
|
41
|
-
// "0": [0, 0, 0],
|
|
42
|
-
// "1": [255, 255, 255],
|
|
43
|
-
// "-1": [255, 255, 255],
|
|
44
|
-
// w: [255, 255, 255],
|
|
45
|
-
// k: [0, 0, 0],
|
|
46
|
-
// };
|
|
47
|
-
// const COLOR_CODE_REGEX = new RegExp(`(${Object.keys(COLOR_CODES).join("|")})`);
|
|
48
|
-
// const HEX_COLOR_REGEX = new RegExp(`(([0-9a-fA-F]{6})|${COLOR_CODE_REGEX.source})`);
|
|
49
|
-
|
|
44
|
+
var FLOAT_REGEX = /-?[0-9]*.?[0-9]+/;
|
|
50
45
|
var CHANNEL_STATE_KEY_REGEX = /^c[0-9]+$/;
|
|
46
|
+
|
|
51
47
|
/** Match colon-separated pairs of alphanumeric strings */
|
|
52
48
|
var LUT_REGEX = /^-?[a-z0-9.]*:[ ]*-?[a-z0-9.]*$/;
|
|
53
|
-
|
|
54
|
-
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Match colon-separated pairs of numeric strings, representing histogram bin
|
|
52
|
+
* indices or intensity values.
|
|
53
|
+
*/
|
|
54
|
+
var RAMP_REGEX = new RegExp("^".concat(FLOAT_REGEX.source, ":").concat(FLOAT_REGEX.source, "$"));
|
|
55
|
+
|
|
55
56
|
/**
|
|
56
57
|
* Match comma-separated triplet of numeric strings.
|
|
57
58
|
*/
|
|
58
|
-
var SLICE_REGEX =
|
|
59
|
+
var SLICE_REGEX = new RegExp("^".concat(FLOAT_REGEX.source, ",").concat(FLOAT_REGEX.source, ",").concat(FLOAT_REGEX.source, "$"));
|
|
60
|
+
|
|
59
61
|
/**
|
|
60
62
|
* Matches a sequence of three comma-separated min:max number pairs, representing
|
|
61
63
|
* the x, y, and z axes.
|
|
62
64
|
*/
|
|
63
|
-
var REGION_REGEX =
|
|
65
|
+
var REGION_REGEX = new RegExp("^(".concat(FLOAT_REGEX.source, ":").concat(FLOAT_REGEX.source, ")(,").concat(FLOAT_REGEX.source, ":").concat(FLOAT_REGEX.source, "){2}$"));
|
|
64
66
|
var HEX_COLOR_REGEX = new RegExp("(([0-9a-fA-F]{6})|".concat(DEFAULT_CONTROL_POINT_COLOR_CODE, ")"));
|
|
65
|
-
|
|
66
|
-
|
|
67
|
+
|
|
68
|
+
/** Represents control points specified by bin indices. */
|
|
69
|
+
var CONTROL_POINT_REGEX = new RegExp("(".concat(FLOAT_REGEX.source, ":").concat(FLOAT_REGEX.source, ":").concat(HEX_COLOR_REGEX.source, ")"));
|
|
67
70
|
var HEX_COLOR_STR_REGEX = new RegExp("^".concat(HEX_COLOR_REGEX.source, "$"));
|
|
68
71
|
|
|
69
72
|
/**
|
|
70
73
|
* LEGACY: Matches a COMMA-separated list of control points, where each control point is represented
|
|
71
74
|
* by a triplet of `{x}:{opacity}:{hex color}`.
|
|
72
|
-
* The hex color can be replaced with `
|
|
75
|
+
* The hex color can be replaced with `1` to represent white (`ffffff`).
|
|
73
76
|
*/
|
|
74
77
|
export var LEGACY_CONTROL_POINTS_REGEX = new RegExp("^".concat(CONTROL_POINT_REGEX.source, "(,").concat(CONTROL_POINT_REGEX.source, ")*$"));
|
|
78
|
+
|
|
75
79
|
/**
|
|
76
|
-
* Matches a COLON-separated list of control points, where each control point is
|
|
77
|
-
* by a triplet of `{x}:{opacity}:{hex color}`.
|
|
78
|
-
*
|
|
80
|
+
* Matches a COLON-separated list of control points, where each control point is
|
|
81
|
+
* represented by a triplet of `{x}:{opacity}:{hex color}`.
|
|
82
|
+
* - `x` is a value that will either be parsed as a histogram bin index (legacy,
|
|
83
|
+
* for `ControlPointsLegacy`) or intensity value (for `ControlPoints`),
|
|
84
|
+
* depending on on which field is being parsed.
|
|
85
|
+
* - Opacity is a float in the [0, 1] range.
|
|
86
|
+
* - The hex color is a 6-digit hex color (e.g. `ffeecc`), and can be replaced
|
|
87
|
+
* with `1` to represent white (`ffffff`).
|
|
79
88
|
*/
|
|
80
89
|
export var CONTROL_POINTS_REGEX = new RegExp("^".concat(CONTROL_POINT_REGEX.source, "(:").concat(CONTROL_POINT_REGEX.source, ")*$"));
|
|
81
90
|
|
|
@@ -122,12 +131,15 @@ export var ViewerChannelSettingKeys = /*#__PURE__*/function (ViewerChannelSettin
|
|
|
122
131
|
ViewerChannelSettingKeys["ColorizeAlpha"] = "cza";
|
|
123
132
|
ViewerChannelSettingKeys["IsosurfaceAlpha"] = "isa";
|
|
124
133
|
ViewerChannelSettingKeys["Lut"] = "lut";
|
|
125
|
-
ViewerChannelSettingKeys["
|
|
126
|
-
ViewerChannelSettingKeys["
|
|
134
|
+
ViewerChannelSettingKeys["ControlPoints"] = "cpt";
|
|
135
|
+
ViewerChannelSettingKeys["ControlPointsLegacy"] = "cps";
|
|
136
|
+
ViewerChannelSettingKeys["Ramp"] = "ram";
|
|
137
|
+
ViewerChannelSettingKeys["RampLegacy"] = "rmp";
|
|
127
138
|
ViewerChannelSettingKeys["ControlPointsEnabled"] = "cpe";
|
|
128
139
|
ViewerChannelSettingKeys["VolumeEnabled"] = "ven";
|
|
129
140
|
ViewerChannelSettingKeys["SurfaceEnabled"] = "sen";
|
|
130
141
|
ViewerChannelSettingKeys["IsosurfaceValue"] = "isv";
|
|
142
|
+
ViewerChannelSettingKeys["KeepRange"] = "pin";
|
|
131
143
|
return ViewerChannelSettingKeys;
|
|
132
144
|
}({});
|
|
133
145
|
|
|
@@ -139,12 +151,15 @@ _ViewerChannelSetting2 = ViewerChannelSettingKeys.Colorize;
|
|
|
139
151
|
_ViewerChannelSetting3 = ViewerChannelSettingKeys.ColorizeAlpha;
|
|
140
152
|
_ViewerChannelSetting4 = ViewerChannelSettingKeys.IsosurfaceAlpha;
|
|
141
153
|
_ViewerChannelSetting5 = ViewerChannelSettingKeys.Lut;
|
|
142
|
-
_ViewerChannelSetting6 = ViewerChannelSettingKeys.
|
|
143
|
-
_ViewerChannelSetting7 = ViewerChannelSettingKeys.
|
|
144
|
-
_ViewerChannelSetting8 = ViewerChannelSettingKeys.
|
|
145
|
-
_ViewerChannelSetting9 = ViewerChannelSettingKeys.
|
|
146
|
-
_ViewerChannelSetting10 = ViewerChannelSettingKeys.
|
|
147
|
-
_ViewerChannelSetting11 = ViewerChannelSettingKeys.
|
|
154
|
+
_ViewerChannelSetting6 = ViewerChannelSettingKeys.ControlPointsLegacy;
|
|
155
|
+
_ViewerChannelSetting7 = ViewerChannelSettingKeys.ControlPoints;
|
|
156
|
+
_ViewerChannelSetting8 = ViewerChannelSettingKeys.ControlPointsEnabled;
|
|
157
|
+
_ViewerChannelSetting9 = ViewerChannelSettingKeys.RampLegacy;
|
|
158
|
+
_ViewerChannelSetting10 = ViewerChannelSettingKeys.Ramp;
|
|
159
|
+
_ViewerChannelSetting11 = ViewerChannelSettingKeys.VolumeEnabled;
|
|
160
|
+
_ViewerChannelSetting12 = ViewerChannelSettingKeys.SurfaceEnabled;
|
|
161
|
+
_ViewerChannelSetting13 = ViewerChannelSettingKeys.IsosurfaceValue;
|
|
162
|
+
_ViewerChannelSetting14 = ViewerChannelSettingKeys.KeepRange;
|
|
148
163
|
export var ViewerChannelSettingParams = /*#__PURE__*/_createClass(function ViewerChannelSettingParams() {
|
|
149
164
|
_classCallCheck(this, ViewerChannelSettingParams);
|
|
150
165
|
/** Color, as a 6-digit hex color. */
|
|
@@ -183,30 +198,53 @@ export var ViewerChannelSettingParams = /*#__PURE__*/_createClass(function Viewe
|
|
|
183
198
|
*/
|
|
184
199
|
_defineProperty(this, _ViewerChannelSetting5, undefined);
|
|
185
200
|
/**
|
|
186
|
-
*
|
|
187
|
-
* `
|
|
188
|
-
* of
|
|
189
|
-
* - `x` is a
|
|
201
|
+
* Legacy specifier for control points for the transfer function as a list of
|
|
202
|
+
* `x:opacity:color` triplets, separated by colon. Uses histogram bin indices
|
|
203
|
+
* instead of intensity values.
|
|
204
|
+
* - `x` is a histogram bin index in the [0, 255] range.
|
|
190
205
|
* - `opacity` is a float in the [0, 1] range.
|
|
191
206
|
* - `color` is a 6-digit hex color, e.g. `ff0000`.
|
|
207
|
+
*
|
|
208
|
+
* Will be overridden by the ControlPoints field (`cpt`) if provided.
|
|
192
209
|
*/
|
|
193
210
|
_defineProperty(this, _ViewerChannelSetting6, undefined);
|
|
194
211
|
/**
|
|
195
|
-
*
|
|
196
|
-
*
|
|
212
|
+
* Control points for the transfer function, formatted as a list of
|
|
213
|
+
* `x:opacity:color` triplets, separated by colons.
|
|
214
|
+
* - `x` is a numeric intensity value.
|
|
215
|
+
* - `opacity` is a float in the [0, 1] range.
|
|
216
|
+
* - `color` is a 6-digit hex color, e.g. `ff0000`.
|
|
217
|
+
*
|
|
218
|
+
* If provided, overrides the `lut` field when calculating the control points.
|
|
197
219
|
*/
|
|
198
220
|
_defineProperty(this, _ViewerChannelSetting7, undefined);
|
|
199
221
|
/**
|
|
200
|
-
*
|
|
201
|
-
*
|
|
222
|
+
* Whether to show advanced mode, which will show control points instead of
|
|
223
|
+
* ramp values defined by the LUT. "1" is enabled, disabled by default.
|
|
202
224
|
*/
|
|
203
225
|
_defineProperty(this, _ViewerChannelSetting8, undefined);
|
|
204
|
-
/**
|
|
226
|
+
/**
|
|
227
|
+
* Legacy specifier for the transfer function ramp which uses histogram bin
|
|
228
|
+
* indices instead of intensity values, formatted as `min:max`. Will be
|
|
229
|
+
* overridden by the Ramp field (`ram`) if provided.
|
|
230
|
+
*/
|
|
205
231
|
_defineProperty(this, _ViewerChannelSetting9, undefined);
|
|
206
|
-
/**
|
|
232
|
+
/**
|
|
233
|
+
* Ramp min and max intensity values (`min:max`). If provided, overrides the
|
|
234
|
+
* `lut` field when calculating the ramp.
|
|
235
|
+
*/
|
|
207
236
|
_defineProperty(this, _ViewerChannelSetting10, undefined);
|
|
208
|
-
/**
|
|
237
|
+
/** Volume enabled. "1" is enabled. Disabled by default. */
|
|
209
238
|
_defineProperty(this, _ViewerChannelSetting11, undefined);
|
|
239
|
+
/** Isosurface enabled. "1" is enabled. Disabled by default. */
|
|
240
|
+
_defineProperty(this, _ViewerChannelSetting12, undefined);
|
|
241
|
+
/** Isosurface value, in the [0, 255] range. Set to `128` by default. */
|
|
242
|
+
_defineProperty(this, _ViewerChannelSetting13, undefined);
|
|
243
|
+
/**
|
|
244
|
+
* Whether to keep the current contrast settings when loading a new volume.
|
|
245
|
+
* "1" is enabled. Disabled by default.
|
|
246
|
+
*/
|
|
247
|
+
_defineProperty(this, _ViewerChannelSetting14, undefined);
|
|
210
248
|
});
|
|
211
249
|
/**
|
|
212
250
|
* Channels, matching the pattern `c0`, `c1`, etc. corresponding to the index of the channel being configured.
|
|
@@ -298,8 +336,15 @@ export var ViewerStateParams = /*#__PURE__*/_createClass(function ViewerStatePar
|
|
|
298
336
|
var DataParams = /*#__PURE__*/_createClass(function DataParams() {
|
|
299
337
|
_classCallCheck(this, DataParams);
|
|
300
338
|
/**
|
|
301
|
-
* One or more volume URLs to load.
|
|
302
|
-
*
|
|
339
|
+
* One or more volume URLs to load.
|
|
340
|
+
*
|
|
341
|
+
* This parameter may represent a single image with multiple data sources by delimiting each source URL with `,`.
|
|
342
|
+
* It may also represent multiple scenes by delimiting each scene URL (and/or each collection of multiple
|
|
343
|
+
* `,`-delimited source URLs) with `+`. E.g. `url1+url2,url3` represents a collection of two scenes, where the first
|
|
344
|
+
* scene comes from `url1` and the second is a combination of the channels from the images at `url2` and `url3`.
|
|
345
|
+
*
|
|
346
|
+
* When parsing, we do our best to account for `%`-encoding, including the possibility that each source/scene URL was
|
|
347
|
+
* encoded separately, then concatenated with the proper delimiters, then encoded again.
|
|
303
348
|
*/
|
|
304
349
|
_defineProperty(this, "url", undefined);
|
|
305
350
|
/**
|
|
@@ -310,14 +355,24 @@ var DataParams = /*#__PURE__*/_createClass(function DataParams() {
|
|
|
310
355
|
* See `ManifestJson` for the type definition.
|
|
311
356
|
*/
|
|
312
357
|
_defineProperty(this, "manifest", undefined);
|
|
313
|
-
/**
|
|
314
|
-
* The name of a dataset in the Cell Feature Explorer database. Used with `id`.
|
|
315
|
-
*/
|
|
358
|
+
/** The name of a dataset in the Cell Feature Explorer database. Used with `id`. */
|
|
316
359
|
_defineProperty(this, "dataset", undefined);
|
|
360
|
+
/** The ID of a cell within the loaded dataset. Used with `dataset`. */
|
|
361
|
+
_defineProperty(this, "id", undefined);
|
|
362
|
+
/** The key of a collection of scenes stored in local storage. Overrides `url`. */
|
|
363
|
+
_defineProperty(this, "collectionid", undefined);
|
|
317
364
|
/**
|
|
318
|
-
* The
|
|
365
|
+
* The origin of an opening window that wants to send a message to this window.
|
|
366
|
+
*
|
|
367
|
+
* The presence of this param implies that this window has just been opened by another app, and the opening app has
|
|
368
|
+
* more data to send. Until that message is received, we fall back to `url`. Once that message arrives, the scenes to
|
|
369
|
+
* open are written to local storage at a new `collectionid` and `msgorigin` is removed, allowing the window to
|
|
370
|
+
* switch to reading local storage.
|
|
371
|
+
*
|
|
372
|
+
* All this happens independently of URL parsing, so the only meaningful thing this parsing code does with this param
|
|
373
|
+
* is check whether it is present.
|
|
319
374
|
*/
|
|
320
|
-
_defineProperty(this, "
|
|
375
|
+
_defineProperty(this, "msgorigin", undefined);
|
|
321
376
|
});
|
|
322
377
|
var DeprecatedParams = /*#__PURE__*/_createClass(function DeprecatedParams() {
|
|
323
378
|
_classCallCheck(this, DeprecatedParams);
|
|
@@ -328,6 +383,10 @@ var DeprecatedParams = /*#__PURE__*/_createClass(function DeprecatedParams() {
|
|
|
328
383
|
/** Deprecated query parameter for channel colors. */
|
|
329
384
|
_defineProperty(this, "colors", undefined);
|
|
330
385
|
});
|
|
386
|
+
/**
|
|
387
|
+
* A message sent from an external application after this app was opened,
|
|
388
|
+
* containing data that was too large to pack into the URL.
|
|
389
|
+
*/
|
|
331
390
|
var allowedParamKeys = [].concat(_toConsumableArray(Object.keys(new ViewerStateParams())), _toConsumableArray(Object.keys(new DataParams())), _toConsumableArray(Object.keys(new DeprecatedParams())));
|
|
332
391
|
var isParamKey = function isParamKey(key) {
|
|
333
392
|
return allowedParamKeys.indexOf(key) !== -1;
|
|
@@ -362,39 +421,63 @@ export function getAllowedParams(searchParams) {
|
|
|
362
421
|
}
|
|
363
422
|
return result;
|
|
364
423
|
}
|
|
365
|
-
var decodeURL = function decodeURL(url) {
|
|
366
|
-
var decodedUrl = decodeURIComponent(url);
|
|
367
|
-
return decodedUrl.endsWith("/") ? decodedUrl.slice(0, -1) : decodedUrl;
|
|
368
|
-
};
|
|
369
424
|
|
|
370
|
-
/**
|
|
371
|
-
var
|
|
372
|
-
var
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
return decodeURL(u);
|
|
425
|
+
/** Tries to retrieve the given `param` from a `search` string without using `URLSearchParams`, to avoid decoding. */
|
|
426
|
+
var getSearchParamRaw = function getSearchParamRaw(search, param) {
|
|
427
|
+
var trimmedSearch = search.startsWith("?") ? search.slice(1) : search;
|
|
428
|
+
var entries = trimmedSearch.split("&");
|
|
429
|
+
var key = param + "=";
|
|
430
|
+
var foundKeyValue = entries.find(function (keyValue) {
|
|
431
|
+
return keyValue.startsWith(key);
|
|
378
432
|
});
|
|
433
|
+
return foundKeyValue === null || foundKeyValue === void 0 ? void 0 : foundKeyValue.slice(key.length);
|
|
434
|
+
};
|
|
379
435
|
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
436
|
+
/**
|
|
437
|
+
* Applies `decodeURIComponent` over and over until `url` either seems to be a valid `URL` or satisfies `condition`.
|
|
438
|
+
*/
|
|
439
|
+
var decodeURLUntilParseable = function decodeURLUntilParseable(url) {
|
|
440
|
+
var condition = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function (_url) {
|
|
441
|
+
return false;
|
|
442
|
+
};
|
|
443
|
+
var decoded = url;
|
|
444
|
+
while (!condition(decoded) && !URL.canParse(decoded)) {
|
|
445
|
+
try {
|
|
446
|
+
var nextDecoded = decodeURIComponent(decoded);
|
|
447
|
+
if (nextDecoded === decoded) {
|
|
448
|
+
return decoded;
|
|
390
449
|
}
|
|
450
|
+
decoded = nextDecoded;
|
|
451
|
+
} catch (_unused) {
|
|
452
|
+
return decoded;
|
|
391
453
|
}
|
|
392
|
-
} catch (err) {
|
|
393
|
-
_iterator2.e(err);
|
|
394
|
-
} finally {
|
|
395
|
-
_iterator2.f();
|
|
396
454
|
}
|
|
397
|
-
return
|
|
455
|
+
return decoded;
|
|
456
|
+
};
|
|
457
|
+
|
|
458
|
+
/** Parses the `url` query param into a 2D URL array: one or more scenes, with one or more sources per scene. */
|
|
459
|
+
export var parseImageURLParam = function parseImageURLParam(urlParam) {
|
|
460
|
+
// Decode until either any valid delimiters appear or `urlParam` is parseable as a single URL.
|
|
461
|
+
var decodedScenes = decodeURLUntilParseable(urlParam, function (url) {
|
|
462
|
+
return /[+ ,]/.test(url);
|
|
463
|
+
});
|
|
464
|
+
// Split into scene URLs.
|
|
465
|
+
var sceneUrls = decodedScenes.split(/[+ ]/);
|
|
466
|
+
return sceneUrls.map(function (scene) {
|
|
467
|
+
// Split each scene into multiple sources, if any.
|
|
468
|
+
var decodedSources = decodeURLUntilParseable(scene, function (url) {
|
|
469
|
+
return url.includes(",");
|
|
470
|
+
});
|
|
471
|
+
var sourceUrls = decodedSources.split(",");
|
|
472
|
+
if (sourceUrls.length === 1) {
|
|
473
|
+
return sourceUrls;
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
// Try to make sure the source URLs are decoded as well.
|
|
477
|
+
return sourceUrls.map(function (source) {
|
|
478
|
+
return decodeURLUntilParseable(source);
|
|
479
|
+
});
|
|
480
|
+
});
|
|
398
481
|
};
|
|
399
482
|
|
|
400
483
|
//// DATA PARSING //////////////////////
|
|
@@ -415,20 +498,20 @@ export function parseKeyValueList(data) {
|
|
|
415
498
|
}
|
|
416
499
|
var result = {};
|
|
417
500
|
var keyValuePairs = data.split(",");
|
|
418
|
-
var
|
|
419
|
-
|
|
501
|
+
var _iterator2 = _createForOfIteratorHelper(keyValuePairs),
|
|
502
|
+
_step2;
|
|
420
503
|
try {
|
|
421
|
-
for (
|
|
422
|
-
var pair =
|
|
504
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
505
|
+
var pair = _step2.value;
|
|
423
506
|
var splitIndex = pair.indexOf(":");
|
|
424
507
|
var key = pair.slice(0, splitIndex);
|
|
425
508
|
var value = pair.slice(splitIndex + 1);
|
|
426
509
|
result[decodeURIComponent(key).trim()] = decodeURIComponent(value).trim();
|
|
427
510
|
}
|
|
428
511
|
} catch (err) {
|
|
429
|
-
|
|
512
|
+
_iterator2.e(err);
|
|
430
513
|
} finally {
|
|
431
|
-
|
|
514
|
+
_iterator2.f();
|
|
432
515
|
}
|
|
433
516
|
return result;
|
|
434
517
|
}
|
|
@@ -723,22 +806,22 @@ function parseControlPoints(controlPoints) {
|
|
|
723
806
|
}
|
|
724
807
|
|
|
725
808
|
// Parse raw control point data from the string into an array of [x, opacity, color] triplets.
|
|
726
|
-
var
|
|
809
|
+
var controlPointStrings;
|
|
727
810
|
if (LEGACY_CONTROL_POINTS_REGEX.test(controlPoints)) {
|
|
728
811
|
// Legacy format uses commas to separate control points.
|
|
729
|
-
|
|
812
|
+
controlPointStrings = controlPoints.split(",").map(function (cp) {
|
|
730
813
|
return cp.split(":");
|
|
731
814
|
});
|
|
732
815
|
} else {
|
|
733
816
|
// New format is all colon-separated, where every three elements represent a control point.
|
|
734
|
-
|
|
817
|
+
controlPointStrings = controlPoints.split(":").reduce(function (acc, _val, i, array) {
|
|
735
818
|
if ((i + 1) % 3 === 0) {
|
|
736
819
|
acc.push([array[i - 2], array[i - 1], array[i]]);
|
|
737
820
|
}
|
|
738
821
|
return acc;
|
|
739
822
|
}, []);
|
|
740
823
|
}
|
|
741
|
-
var newControlPoints =
|
|
824
|
+
var newControlPoints = controlPointStrings.map(function (cp) {
|
|
742
825
|
var _parseStringFloat, _parseStringFloat2, _parseHexColorAsColor;
|
|
743
826
|
var _cp = _slicedToArray(cp, 3),
|
|
744
827
|
x = _cp[0],
|
|
@@ -770,7 +853,8 @@ export function deserializeViewerChannelSetting(channelIndex, jsonState) {
|
|
|
770
853
|
match: channelIndex,
|
|
771
854
|
enabled: parseStringBoolean(jsonState[ViewerChannelSettingKeys.VolumeEnabled]),
|
|
772
855
|
surfaceEnabled: parseStringBoolean(jsonState[ViewerChannelSettingKeys.SurfaceEnabled]),
|
|
773
|
-
isovalue: parseStringFloat(jsonState[ViewerChannelSettingKeys.IsosurfaceValue],
|
|
856
|
+
isovalue: parseStringFloat(jsonState[ViewerChannelSettingKeys.IsosurfaceValue], -Infinity, Infinity),
|
|
857
|
+
keepIntensityRange: parseStringBoolean(jsonState[ViewerChannelSettingKeys.KeepRange]),
|
|
774
858
|
surfaceOpacity: parseStringFloat(jsonState[ViewerChannelSettingKeys.IsosurfaceAlpha], 0, 1),
|
|
775
859
|
colorizeEnabled: parseStringBoolean(jsonState[ViewerChannelSettingKeys.Colorize]),
|
|
776
860
|
colorizeAlpha: parseStringFloat(jsonState[ViewerChannelSettingKeys.ColorizeAlpha], 0, 1),
|
|
@@ -784,17 +868,41 @@ export function deserializeViewerChannelSetting(channelIndex, jsonState) {
|
|
|
784
868
|
_jsonState$ViewerChan2 = _slicedToArray(_jsonState$ViewerChan, 2),
|
|
785
869
|
min = _jsonState$ViewerChan2[0],
|
|
786
870
|
max = _jsonState$ViewerChan2[1];
|
|
787
|
-
result.
|
|
871
|
+
result.intensity = _objectSpread(_objectSpread({}, result.intensity), {}, {
|
|
872
|
+
lut: [min.trim(), max.trim()]
|
|
873
|
+
});
|
|
788
874
|
}
|
|
789
|
-
if (jsonState[ViewerChannelSettingKeys.Ramp]
|
|
790
|
-
|
|
791
|
-
_jsonState$
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
875
|
+
if (jsonState[ViewerChannelSettingKeys.Ramp]) {
|
|
876
|
+
if (RAMP_REGEX.test(jsonState[ViewerChannelSettingKeys.Ramp])) {
|
|
877
|
+
var _jsonState$ViewerChan3 = jsonState[ViewerChannelSettingKeys.Ramp].split(":"),
|
|
878
|
+
_jsonState$ViewerChan4 = _slicedToArray(_jsonState$ViewerChan3, 2),
|
|
879
|
+
_min = _jsonState$ViewerChan4[0],
|
|
880
|
+
_max = _jsonState$ViewerChan4[1];
|
|
881
|
+
result.intensity = _objectSpread(_objectSpread({}, result.intensity), {}, {
|
|
882
|
+
ramp: [Number.parseFloat(_min), Number.parseFloat(_max)]
|
|
883
|
+
});
|
|
884
|
+
}
|
|
885
|
+
} else if (jsonState[ViewerChannelSettingKeys.RampLegacy]) {
|
|
886
|
+
if (RAMP_REGEX.test(jsonState[ViewerChannelSettingKeys.RampLegacy])) {
|
|
887
|
+
var _jsonState$ViewerChan5 = jsonState[ViewerChannelSettingKeys.RampLegacy].split(":"),
|
|
888
|
+
_jsonState$ViewerChan6 = _slicedToArray(_jsonState$ViewerChan5, 2),
|
|
889
|
+
_min2 = _jsonState$ViewerChan6[0],
|
|
890
|
+
_max2 = _jsonState$ViewerChan6[1];
|
|
891
|
+
result.ramp = [Number.parseFloat(_min2), Number.parseFloat(_max2)];
|
|
892
|
+
}
|
|
795
893
|
}
|
|
796
894
|
if (jsonState[ViewerChannelSettingKeys.ControlPoints]) {
|
|
797
|
-
|
|
895
|
+
var parsedResult = parseControlPoints(jsonState[ViewerChannelSettingKeys.ControlPoints]);
|
|
896
|
+
if (parsedResult) {
|
|
897
|
+
result.intensity = _objectSpread(_objectSpread({}, result.intensity), {}, {
|
|
898
|
+
controlPoints: parsedResult
|
|
899
|
+
});
|
|
900
|
+
}
|
|
901
|
+
} else if (jsonState[ViewerChannelSettingKeys.ControlPointsLegacy]) {
|
|
902
|
+
var _parsedResult = parseControlPoints(jsonState[ViewerChannelSettingKeys.ControlPointsLegacy]);
|
|
903
|
+
if (_parsedResult) {
|
|
904
|
+
result.controlPoints = _parsedResult;
|
|
905
|
+
}
|
|
798
906
|
}
|
|
799
907
|
return result;
|
|
800
908
|
}
|
|
@@ -807,13 +915,11 @@ export function deserializeViewerChannelSetting(channelIndex, jsonState) {
|
|
|
807
915
|
* @returns A `ViewerChannelSettingParams` object with the serialized parameters. Undefined values are removed.
|
|
808
916
|
*/
|
|
809
917
|
export function serializeViewerChannelSetting(channelSetting, removeDefaults) {
|
|
810
|
-
var _channelSetting$isova, _channelSetting$opaci, _channelSetting$color, _channelSetting$ramp;
|
|
918
|
+
var _channelSetting$isova, _channelSetting$opaci, _channelSetting$color, _channelSetting$ramp, _removeUndefinedPrope;
|
|
811
919
|
if (removeDefaults) {
|
|
812
920
|
channelSetting = removeMatchingProperties(channelSetting, getDefaultChannelState());
|
|
813
921
|
}
|
|
814
|
-
return removeUndefinedProperties(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(
|
|
815
|
-
return formatFloat(value);
|
|
816
|
-
}).join(":")));
|
|
922
|
+
return removeUndefinedProperties((_removeUndefinedPrope = {}, _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_removeUndefinedPrope, ViewerChannelSettingKeys.VolumeEnabled, serializeBoolean(channelSetting.volumeEnabled)), ViewerChannelSettingKeys.SurfaceEnabled, serializeBoolean(channelSetting.isosurfaceEnabled)), ViewerChannelSettingKeys.IsosurfaceValue, (_channelSetting$isova = channelSetting.isovalue) === null || _channelSetting$isova === void 0 ? void 0 : _channelSetting$isova.toString()), ViewerChannelSettingKeys.IsosurfaceAlpha, (_channelSetting$opaci = channelSetting.opacity) === null || _channelSetting$opaci === void 0 ? void 0 : _channelSetting$opaci.toString()), ViewerChannelSettingKeys.Colorize, serializeBoolean(channelSetting.colorizeEnabled)), ViewerChannelSettingKeys.ColorizeAlpha, (_channelSetting$color = channelSetting.colorizeAlpha) === null || _channelSetting$color === void 0 ? void 0 : _channelSetting$color.toString()), ViewerChannelSettingKeys.Color, channelSetting.color && colorArrayToHex(channelSetting.color)), ViewerChannelSettingKeys.ControlPoints, channelSetting.controlPoints && serializeControlPoints(channelSetting.controlPoints)), ViewerChannelSettingKeys.ControlPointsEnabled, serializeBoolean(channelSetting.useControlPoints)), ViewerChannelSettingKeys.Ramp, (_channelSetting$ramp = channelSetting.ramp) === null || _channelSetting$ramp === void 0 ? void 0 : _channelSetting$ramp.join(":")), _defineProperty(_removeUndefinedPrope, ViewerChannelSettingKeys.KeepRange, serializeBoolean(channelSetting.keepIntensityRange))));
|
|
817
923
|
}
|
|
818
924
|
export function deserializeViewerState(params) {
|
|
819
925
|
var result = {
|
|
@@ -957,7 +1063,7 @@ function loadDataset(_x, _x2, _x3) {
|
|
|
957
1063
|
}
|
|
958
1064
|
function _loadDataset() {
|
|
959
1065
|
_loadDataset = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(firestore, dataset, id) {
|
|
960
|
-
var db, args, datasets, datasetMeta,
|
|
1066
|
+
var db, args, datasets, datasetMeta, _iterator3, _step3, d, innerDatasets, names, matchingName, datasetData, baseUrl, fileInfo;
|
|
961
1067
|
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
962
1068
|
while (1) switch (_context.prev = _context.next) {
|
|
963
1069
|
case 0:
|
|
@@ -968,15 +1074,15 @@ function _loadDataset() {
|
|
|
968
1074
|
case 4:
|
|
969
1075
|
datasets = _context.sent;
|
|
970
1076
|
datasetMeta = undefined;
|
|
971
|
-
|
|
1077
|
+
_iterator3 = _createForOfIteratorHelper(datasets);
|
|
972
1078
|
_context.prev = 7;
|
|
973
|
-
|
|
1079
|
+
_iterator3.s();
|
|
974
1080
|
case 9:
|
|
975
|
-
if ((
|
|
1081
|
+
if ((_step3 = _iterator3.n()).done) {
|
|
976
1082
|
_context.next = 19;
|
|
977
1083
|
break;
|
|
978
1084
|
}
|
|
979
|
-
d =
|
|
1085
|
+
d = _step3.value;
|
|
980
1086
|
innerDatasets = d.datasets;
|
|
981
1087
|
names = Object.keys(innerDatasets);
|
|
982
1088
|
matchingName = names.find(function (name) {
|
|
@@ -997,10 +1103,10 @@ function _loadDataset() {
|
|
|
997
1103
|
case 21:
|
|
998
1104
|
_context.prev = 21;
|
|
999
1105
|
_context.t0 = _context["catch"](7);
|
|
1000
|
-
|
|
1106
|
+
_iterator3.e(_context.t0);
|
|
1001
1107
|
case 24:
|
|
1002
1108
|
_context.prev = 24;
|
|
1003
|
-
|
|
1109
|
+
_iterator3.f();
|
|
1004
1110
|
return _context.finish(24);
|
|
1005
1111
|
case 27:
|
|
1006
1112
|
if (!(datasetMeta === undefined)) {
|
|
@@ -1048,16 +1154,14 @@ export function loadFromManifest(_x4) {
|
|
|
1048
1154
|
|
|
1049
1155
|
/**
|
|
1050
1156
|
* Parses a set of URL search parameters into props for the viewer.
|
|
1051
|
-
* @param
|
|
1052
|
-
* @param firestore Optional Firestore instance. If provided, the function can
|
|
1053
|
-
*
|
|
1054
|
-
* provided.
|
|
1157
|
+
* @param search The query string to parse, which must be valid in the `URLSearchParams constructor
|
|
1158
|
+
* @param firestore Optional Firestore instance. If provided, the function can load data from a
|
|
1159
|
+
* Firestore dataset if the `dataset` and `id` parameters are provided.
|
|
1055
1160
|
* @returns An object containing:
|
|
1056
1161
|
* - `args`: Partial AppProps object.
|
|
1057
1162
|
* - `viewerSettings`: Partial ViewerState object.
|
|
1058
1163
|
*
|
|
1059
|
-
* `args` can be passed as props to the `ImageViewerApp`, and `viewerSettings`
|
|
1060
|
-
* can be passed to `ViewerStateProvider`.
|
|
1164
|
+
* `args` can be passed as props to the `ImageViewerApp`, and `viewerSettings` can be passed to `ViewerStateProvider`.
|
|
1061
1165
|
*/
|
|
1062
1166
|
function _loadFromManifest() {
|
|
1063
1167
|
_loadFromManifest = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(manifestUrl) {
|
|
@@ -1134,19 +1238,15 @@ export function parseViewerUrlParams(_x5, _x6) {
|
|
|
1134
1238
|
return _parseViewerUrlParams.apply(this, arguments);
|
|
1135
1239
|
}
|
|
1136
1240
|
|
|
1137
|
-
/**
|
|
1138
|
-
* Serializes the ViewerState and ChannelState of a ViewerStateContext into a URLSearchParams object.
|
|
1139
|
-
* @param state ViewerStateContext to serialize.
|
|
1140
|
-
* @param removeDefaults If true, shortens parameters by removing any properties that match the default state.
|
|
1141
|
-
* This includes the output of GET_DEFAULT_VIEWER_STATE and GET_DEFAULT_CHANNEL_STATE.
|
|
1142
|
-
*/
|
|
1241
|
+
/** Adds the data in a newly-arrived `ViewerMessage` to an existing stored `AppProps` instance. */
|
|
1143
1242
|
function _parseViewerUrlParams() {
|
|
1144
|
-
_parseViewerUrlParams = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee3(
|
|
1145
|
-
var params, args, viewerSettings, deprecatedChannelSettings, channelSettings, scenes, _yield$loadFromManife, manifestScenes, manifestMetadata,
|
|
1243
|
+
_parseViewerUrlParams = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee3(search, firestore) {
|
|
1244
|
+
var searchParams, params, args, viewerSettings, deprecatedChannelSettings, channelSettings, scenes, _yield$loadFromManife, manifestScenes, manifestMetadata, collectionid, msgorigin, getFromStorage, urlParamFromStorage, urlParam, firstScene, firstUrl, imageUrls, datasetArgs;
|
|
1146
1245
|
return _regeneratorRuntime().wrap(function _callee3$(_context3) {
|
|
1147
1246
|
while (1) switch (_context3.prev = _context3.next) {
|
|
1148
1247
|
case 0:
|
|
1149
|
-
|
|
1248
|
+
searchParams = new URLSearchParams(search);
|
|
1249
|
+
params = getAllowedParams(searchParams);
|
|
1150
1250
|
args = {}; // Parse viewer state
|
|
1151
1251
|
viewerSettings = deserializeViewerState(params); // Parse channel settings. If per-channel settings are provided, they will override
|
|
1152
1252
|
// the old `ch` query parameter.
|
|
@@ -1155,38 +1255,33 @@ function _parseViewerUrlParams() {
|
|
|
1155
1255
|
args.viewerChannelSettings = channelSettings !== null && channelSettings !== void 0 ? channelSettings : deprecatedChannelSettings;
|
|
1156
1256
|
|
|
1157
1257
|
// Parse data sources (URL or dataset/id pair)
|
|
1158
|
-
if (!(params.manifest !== undefined || params.url !== undefined)) {
|
|
1159
|
-
_context3.next =
|
|
1258
|
+
if (!(params.manifest !== undefined || params.url !== undefined || params.collectionid !== undefined)) {
|
|
1259
|
+
_context3.next = 35;
|
|
1160
1260
|
break;
|
|
1161
1261
|
}
|
|
1162
1262
|
if (!params.manifest) {
|
|
1163
|
-
_context3.next =
|
|
1263
|
+
_context3.next = 18;
|
|
1164
1264
|
break;
|
|
1165
1265
|
}
|
|
1166
|
-
_context3.next =
|
|
1266
|
+
_context3.next = 11;
|
|
1167
1267
|
return loadFromManifest(params.manifest);
|
|
1168
|
-
case
|
|
1268
|
+
case 11:
|
|
1169
1269
|
_yield$loadFromManife = _context3.sent;
|
|
1170
1270
|
manifestScenes = _yield$loadFromManife.scenes;
|
|
1171
1271
|
manifestMetadata = _yield$loadFromManife.metadata;
|
|
1172
1272
|
scenes = manifestScenes;
|
|
1173
1273
|
args.metadata = manifestMetadata !== null && manifestMetadata !== void 0 ? manifestMetadata : undefined;
|
|
1174
|
-
_context3.next =
|
|
1274
|
+
_context3.next = 24;
|
|
1175
1275
|
break;
|
|
1176
|
-
case
|
|
1177
|
-
// Load from URL
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
if (getFromStorage) {
|
|
1186
|
-
metadataJson = localStorage.getItem("meta");
|
|
1187
|
-
args.metadata = metadataJson !== null ? JSON.parse(metadataJson) : undefined;
|
|
1188
|
-
}
|
|
1189
|
-
case 22:
|
|
1276
|
+
case 18:
|
|
1277
|
+
// Load from URL or storage
|
|
1278
|
+
collectionid = params.collectionid, msgorigin = params.msgorigin;
|
|
1279
|
+
getFromStorage = collectionid !== undefined && msgorigin === undefined;
|
|
1280
|
+
urlParamFromStorage = getFromStorage ? readStoredScenes(collectionid) : undefined;
|
|
1281
|
+
urlParam = urlParamFromStorage !== null && urlParamFromStorage !== void 0 ? urlParamFromStorage : getSearchParamRaw(search, "url");
|
|
1282
|
+
scenes = parseImageURLParam(urlParam);
|
|
1283
|
+
args.metadata = readStoredMetadata(scenes);
|
|
1284
|
+
case 24:
|
|
1190
1285
|
firstScene = scenes[0]; // Get the very first URL for the download button
|
|
1191
1286
|
firstUrl = Array.isArray(firstScene) ? firstScene[0] : firstScene; // If there's only one url, just pass that
|
|
1192
1287
|
imageUrls = scenes.length > 1 || firstScene.length > 1 ? {
|
|
@@ -1217,24 +1312,24 @@ function _parseViewerUrlParams() {
|
|
|
1217
1312
|
}]
|
|
1218
1313
|
};
|
|
1219
1314
|
}
|
|
1220
|
-
_context3.next =
|
|
1315
|
+
_context3.next = 40;
|
|
1221
1316
|
break;
|
|
1222
|
-
case
|
|
1317
|
+
case 35:
|
|
1223
1318
|
if (!(params.dataset && params.id && firestore)) {
|
|
1224
|
-
_context3.next =
|
|
1319
|
+
_context3.next = 40;
|
|
1225
1320
|
break;
|
|
1226
1321
|
}
|
|
1227
|
-
_context3.next =
|
|
1322
|
+
_context3.next = 38;
|
|
1228
1323
|
return loadDataset(firestore, params.dataset, params.id);
|
|
1229
|
-
case
|
|
1324
|
+
case 38:
|
|
1230
1325
|
datasetArgs = _context3.sent;
|
|
1231
1326
|
args = _objectSpread(_objectSpread({}, args), datasetArgs);
|
|
1232
|
-
case
|
|
1327
|
+
case 40:
|
|
1233
1328
|
return _context3.abrupt("return", {
|
|
1234
1329
|
args: removeUndefinedProperties(args),
|
|
1235
1330
|
viewerSettings: removeUndefinedProperties(viewerSettings)
|
|
1236
1331
|
});
|
|
1237
|
-
case
|
|
1332
|
+
case 41:
|
|
1238
1333
|
case "end":
|
|
1239
1334
|
return _context3.stop();
|
|
1240
1335
|
}
|
|
@@ -1242,6 +1337,44 @@ function _parseViewerUrlParams() {
|
|
|
1242
1337
|
}));
|
|
1243
1338
|
return _parseViewerUrlParams.apply(this, arguments);
|
|
1244
1339
|
}
|
|
1340
|
+
export function addViewerParamsFromMessage(args, message) {
|
|
1341
|
+
var _message$scenes;
|
|
1342
|
+
// get scenes
|
|
1343
|
+
var imageUrl = args.imageUrl;
|
|
1344
|
+
var scenes = (_message$scenes = message.scenes) !== null && _message$scenes !== void 0 ? _message$scenes : typeof imageUrl === "string" ? [imageUrl] : imageUrl.scenes;
|
|
1345
|
+
var firstScene = scenes[0];
|
|
1346
|
+
var newImageUrl = scenes.length === 1 && typeof firstScene === "string" ? firstScene : {
|
|
1347
|
+
scenes: scenes
|
|
1348
|
+
};
|
|
1349
|
+
|
|
1350
|
+
// get metadata
|
|
1351
|
+
var meta = message.meta;
|
|
1352
|
+
var messageMeta = meta && scenes.map(function (scene) {
|
|
1353
|
+
if (Array.isArray(scene)) {
|
|
1354
|
+
// can't handle multi-source scenes (yet)
|
|
1355
|
+
return undefined;
|
|
1356
|
+
}
|
|
1357
|
+
return meta[scene];
|
|
1358
|
+
});
|
|
1359
|
+
var newMetadata = messageMeta !== null && messageMeta !== void 0 ? messageMeta : args.metadata;
|
|
1360
|
+
if (newMetadata === undefined) {
|
|
1361
|
+
return _objectSpread(_objectSpread({}, args), {}, {
|
|
1362
|
+
imageUrl: newImageUrl
|
|
1363
|
+
});
|
|
1364
|
+
} else {
|
|
1365
|
+
return _objectSpread(_objectSpread({}, args), {}, {
|
|
1366
|
+
imageUrl: newImageUrl,
|
|
1367
|
+
metadata: newMetadata
|
|
1368
|
+
});
|
|
1369
|
+
}
|
|
1370
|
+
}
|
|
1371
|
+
|
|
1372
|
+
/**
|
|
1373
|
+
* Serializes the ViewerState and ChannelState of a ViewerStateContext into a URLSearchParams object.
|
|
1374
|
+
* @param state ViewerStateContext to serialize.
|
|
1375
|
+
* @param removeDefaults If true, shortens parameters by removing any properties that match the default state.
|
|
1376
|
+
* This includes the output of GET_DEFAULT_VIEWER_STATE and GET_DEFAULT_CHANNEL_STATE.
|
|
1377
|
+
*/
|
|
1245
1378
|
export function serializeViewerUrlParams(state) {
|
|
1246
1379
|
var _state$channelSetting;
|
|
1247
1380
|
var removeDefaults = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|