@aics/vole-app 2.15.0 → 3.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/es/aics-image-viewer/components/App/ChannelUpdater.js +21 -3
  2. package/es/aics-image-viewer/components/App/index.js +156 -199
  3. package/es/aics-image-viewer/components/CellViewerCanvasWrapper/index.js +10 -9
  4. package/es/aics-image-viewer/components/ChannelsWidget.js +35 -22
  5. package/es/aics-image-viewer/components/ChannelsWidgetRow/index.js +27 -71
  6. package/es/aics-image-viewer/components/ChannelsWidgetRow/styles.css +0 -6
  7. package/es/aics-image-viewer/components/ColorPicker.js +1 -1
  8. package/es/aics-image-viewer/components/ControlPanel/index.js +5 -4
  9. package/es/aics-image-viewer/components/CustomizeWidget.js +12 -8
  10. package/es/aics-image-viewer/components/ErrorAlert/index.js +4 -4
  11. package/es/aics-image-viewer/components/GlobalVolumeControls.js +12 -10
  12. package/es/aics-image-viewer/components/StyleProvider/index.js +4 -2
  13. package/es/aics-image-viewer/components/TfEditor/index.js +304 -154
  14. package/es/aics-image-viewer/components/TfEditor/styles.css +53 -31
  15. package/es/aics-image-viewer/components/Toolbar/DownloadButton.js +1 -1
  16. package/es/aics-image-viewer/components/Toolbar/index.js +18 -16
  17. package/es/aics-image-viewer/components/shared/SharedCheckBox.js +1 -1
  18. package/es/aics-image-viewer/components/shared/SliderRow/styles.css +1 -0
  19. package/es/aics-image-viewer/components/shared/SmarterSlider.js +1 -1
  20. package/es/aics-image-viewer/components/shared/ViewerIcon.js +1 -1
  21. package/es/aics-image-viewer/components/useVolume.js +59 -58
  22. package/es/aics-image-viewer/shared/constants.js +2 -2
  23. package/es/aics-image-viewer/shared/utils/controlPointsToLut.js +57 -24
  24. package/es/aics-image-viewer/shared/utils/sceneStore.js +5 -3
  25. package/es/aics-image-viewer/shared/utils/storage.js +238 -0
  26. package/es/aics-image-viewer/shared/utils/test/storage.test.js +264 -0
  27. package/es/aics-image-viewer/shared/utils/test/urlParsing.test.js +240 -108
  28. package/es/aics-image-viewer/shared/utils/test/viewerChannelSettings.test.js +1 -1
  29. package/es/aics-image-viewer/shared/utils/urlParsing.js +278 -153
  30. package/es/aics-image-viewer/shared/utils/viewerState.js +4 -24
  31. package/es/aics-image-viewer/state/reset.js +111 -0
  32. package/es/aics-image-viewer/state/store.js +90 -0
  33. package/es/aics-image-viewer/state/subscribers.js +153 -0
  34. package/es/aics-image-viewer/state/test/reset.test.js +247 -0
  35. package/es/aics-image-viewer/state/util.js +71 -0
  36. package/es/index.js +3 -3
  37. package/package.json +18 -11
  38. package/type-declarations/aics-image-viewer/components/App/ChannelUpdater.d.ts +2 -4
  39. package/type-declarations/aics-image-viewer/components/App/types.d.ts +3 -3
  40. package/type-declarations/aics-image-viewer/components/AxisClipSliders/index.d.ts +6 -6
  41. package/type-declarations/aics-image-viewer/components/CellViewerCanvasWrapper/index.d.ts +5 -14
  42. package/type-declarations/aics-image-viewer/components/ChannelsWidget.d.ts +3 -6
  43. package/type-declarations/aics-image-viewer/components/ChannelsWidgetRow/index.d.ts +3 -6
  44. package/type-declarations/aics-image-viewer/components/ColorPicker.d.ts +1 -1
  45. package/type-declarations/aics-image-viewer/components/ControlPanel/index.d.ts +6 -7
  46. package/type-declarations/aics-image-viewer/components/CustomizeWidget.d.ts +2 -8
  47. package/type-declarations/aics-image-viewer/components/ErrorAlert/index.d.ts +4 -0
  48. package/type-declarations/aics-image-viewer/components/GlobalVolumeControls.d.ts +2 -9
  49. package/type-declarations/aics-image-viewer/components/MetadataViewer/index.d.ts +1 -1
  50. package/type-declarations/aics-image-viewer/components/StyleProvider/index.d.ts +1 -1
  51. package/type-declarations/aics-image-viewer/components/TfEditor/index.d.ts +10 -3
  52. package/type-declarations/aics-image-viewer/components/Toolbar/index.d.ts +3 -12
  53. package/type-declarations/aics-image-viewer/components/shared/SliderRow/index.d.ts +1 -1
  54. package/type-declarations/aics-image-viewer/components/shared/SmarterSlider.d.ts +1 -1
  55. package/type-declarations/aics-image-viewer/components/shared/ViewerIcon.d.ts +1 -1
  56. package/type-declarations/aics-image-viewer/components/useVolume.d.ts +7 -4
  57. package/type-declarations/aics-image-viewer/shared/constants.d.ts +5 -5
  58. package/type-declarations/aics-image-viewer/shared/types.d.ts +1 -1
  59. package/type-declarations/aics-image-viewer/shared/utils/controlPointsToLut.d.ts +9 -5
  60. package/type-declarations/aics-image-viewer/shared/utils/firebase/index.d.ts +1 -1
  61. package/type-declarations/aics-image-viewer/shared/utils/hooks.d.ts +1 -1
  62. package/type-declarations/aics-image-viewer/shared/utils/playControls.d.ts +1 -1
  63. package/type-declarations/aics-image-viewer/shared/utils/sceneStore.d.ts +8 -4
  64. package/type-declarations/aics-image-viewer/shared/utils/storage.d.ts +15 -0
  65. package/type-declarations/aics-image-viewer/shared/utils/urlParsing.d.ts +94 -31
  66. package/type-declarations/aics-image-viewer/shared/utils/viewerChannelSettings.d.ts +39 -1
  67. package/type-declarations/aics-image-viewer/shared/utils/viewerState.d.ts +3 -6
  68. package/type-declarations/aics-image-viewer/state/reset.d.ts +29 -0
  69. package/type-declarations/aics-image-viewer/state/store.d.ts +30 -0
  70. package/type-declarations/aics-image-viewer/state/subscribers.d.ts +4 -0
  71. package/type-declarations/aics-image-viewer/state/types.d.ts +46 -0
  72. package/type-declarations/aics-image-viewer/state/util.d.ts +8 -0
  73. package/type-declarations/index.d.ts +4 -4
  74. package/es/aics-image-viewer/components/ViewerStateProvider/ResetStateProvider.js +0 -163
  75. package/es/aics-image-viewer/components/ViewerStateProvider/index.js +0 -259
  76. package/type-declarations/aics-image-viewer/components/ViewerStateProvider/ResetStateProvider.d.ts +0 -34
  77. package/type-declarations/aics-image-viewer/components/ViewerStateProvider/index.d.ts +0 -33
  78. package/type-declarations/aics-image-viewer/components/ViewerStateProvider/types.d.ts +0 -107
  79. /package/es/aics-image-viewer/{components/ViewerStateProvider → state}/types.js +0 -0
@@ -1,4 +1,5 @@
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
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
2
3
  function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, "catch": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
3
4
  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); }
4
5
  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); }); }; }
@@ -230,7 +231,8 @@ describe("Channel state serialization", function () {
230
231
  }],
231
232
  ramp: [0, 255],
232
233
  plotMin: 0,
233
- plotMax: 255
234
+ plotMax: 255,
235
+ keepIntensityRange: false
234
236
  };
235
237
  var DEFAULT_SERIALIZED_CHANNEL_STATE = {
236
238
  col: "ff0000",
@@ -241,8 +243,9 @@ describe("Channel state serialization", function () {
241
243
  clz: "1",
242
244
  cza: "0.5",
243
245
  cpe: "0",
244
- cps: "0:0.5:1:255:1:1",
245
- rmp: "0:255"
246
+ cpt: "0:0.5:1:255:1:1",
247
+ ram: "0:255",
248
+ pin: "0"
246
249
  };
247
250
 
248
251
  // Note that the serialization + deserialization are NOT direct inverses.
@@ -291,13 +294,16 @@ describe("Channel state serialization", function () {
291
294
  surfaceOpacity: 0.75,
292
295
  colorizeEnabled: true,
293
296
  colorizeAlpha: 0.5,
294
- lut: ["0", "255"]
297
+ intensity: {
298
+ lut: ["0", "255"]
299
+ }
295
300
  });
296
301
  });
297
302
  it("handles expected lut formatting", function () {
298
303
  var luts = [["autoij:0", ["autoij", "0"]], ["0:autoij", ["0", "autoij"]], [":autoij", ["", "autoij"]], ["autoij:", ["autoij", ""]], ["0:255", ["0", "255"]], ["0.5:1.0", ["0.5", "1.0"]], ["0.50:1.00", ["0.50", "1.00"]], ["m99:m100", ["m99", "m100"]], ["p10:p90", ["p10", "p90"]], ["p10: p90", ["p10", "p90"]] // handle spaces
299
304
  ];
300
305
  for (var _i = 0, _luts = luts; _i < _luts.length; _i++) {
306
+ var _result$intensity;
301
307
  var _luts$_i = _slicedToArray(_luts[_i], 2),
302
308
  encodedLut = _luts$_i[0],
303
309
  decodedLut = _luts$_i[1];
@@ -305,7 +311,7 @@ describe("Channel state serialization", function () {
305
311
  lut: encodedLut
306
312
  };
307
313
  var result = deserializeViewerChannelSetting(0, data);
308
- expect(result.lut).toEqual(decodedLut);
314
+ expect((_result$intensity = result.intensity) === null || _result$intensity === void 0 ? void 0 : _result$intensity.lut).toEqual(decodedLut);
309
315
  }
310
316
  });
311
317
  it("ignores unexpected lut formats", function () {
@@ -373,7 +379,8 @@ describe("Channel state serialization", function () {
373
379
  ramp: [0, 255],
374
380
  // TODO: the settings below are not serialized. should they be? (see #384)
375
381
  plotMin: 0,
376
- plotMax: 255
382
+ plotMax: 255,
383
+ keepIntensityRange: false
377
384
  };
378
385
  var serializedCustomChannelState = {
379
386
  col: "03ff9d",
@@ -384,8 +391,9 @@ describe("Channel state serialization", function () {
384
391
  clz: "0",
385
392
  cza: "1",
386
393
  cpe: "0",
387
- cps: "",
388
- rmp: "0:255"
394
+ cpt: "",
395
+ ram: "0:255",
396
+ pin: "0"
389
397
  };
390
398
  expect(serializeViewerChannelSetting(customChannelState, false)).toEqual(serializedCustomChannelState);
391
399
  });
@@ -616,23 +624,54 @@ describe("Channel state deserialization", function () {
616
624
  opacity: 1,
617
625
  color: [0, 255, 180]
618
626
  }];
627
+ describe("legacy control points", function () {
628
+ it("parses comma-separated control points", function () {
629
+ var result = deserializeViewerChannelSetting(0, {
630
+ cps: "-10:0:000000,50:0:000000,100:0.3:0010ff,140:0.8:00ffff,260:1:00ffb4"
631
+ });
632
+ expect(result.controlPoints).toEqual(DEFAULT_CONTROL_POINTS);
633
+ });
634
+ it("parses colon-separated control points", function () {
635
+ var result = deserializeViewerChannelSetting(0, {
636
+ cps: "-10:0:000000:50:0:000000:100:0.3:0010ff:140:0.8:00ffff:260:1:00ffb4"
637
+ });
638
+ expect(result.controlPoints).toEqual(DEFAULT_CONTROL_POINTS);
639
+ });
640
+ it("replaces '1' color strings with default color #ffffff", function () {
641
+ var result = deserializeViewerChannelSetting(0, {
642
+ cps: "0:0:1:50:1:1"
643
+ });
644
+ expect(result.controlPoints).toEqual([{
645
+ x: 0,
646
+ opacity: 0,
647
+ color: [255, 255, 255]
648
+ }, {
649
+ x: 50,
650
+ opacity: 1,
651
+ color: [255, 255, 255]
652
+ }]);
653
+ });
654
+ });
619
655
  it("parses comma-separated control points", function () {
656
+ var _result$intensity2;
620
657
  var result = deserializeViewerChannelSetting(0, {
621
- cps: "-10:0:000000,50:0:000000,100:0.3:0010ff,140:0.8:00ffff,260:1:00ffb4"
658
+ cpt: "-10:0:000000,50:0:000000,100:0.3:0010ff,140:0.8:00ffff,260:1:00ffb4"
622
659
  });
623
- expect(result.controlPoints).toEqual(DEFAULT_CONTROL_POINTS);
660
+ expect((_result$intensity2 = result.intensity) === null || _result$intensity2 === void 0 ? void 0 : _result$intensity2.controlPoints).toEqual(DEFAULT_CONTROL_POINTS);
624
661
  });
625
662
  it("parses colon-separated control points", function () {
663
+ var _result$intensity3;
626
664
  var result = deserializeViewerChannelSetting(0, {
627
- cps: "-10:0:000000:50:0:000000:100:0.3:0010ff:140:0.8:00ffff:260:1:00ffb4"
665
+ cpt: "-10:0:000000:50:0:000000:100:0.3:0010ff:140:0.8:00ffff:260:1:00ffb4"
628
666
  });
629
- expect(result.controlPoints).toEqual(DEFAULT_CONTROL_POINTS);
667
+ expect((_result$intensity3 = result.intensity) === null || _result$intensity3 === void 0 ? void 0 : _result$intensity3.controlPoints).toEqual(DEFAULT_CONTROL_POINTS);
630
668
  });
631
669
  it("replaces '1' color strings with default color #ffffff", function () {
670
+ var _result$intensity4;
632
671
  var result = deserializeViewerChannelSetting(0, {
633
- cps: "0:0:1:50:1:1"
672
+ cpt: "0:0:1:50:1:1"
634
673
  });
635
- expect(result.controlPoints).toEqual([{
674
+ expect((_result$intensity4 = result.intensity) === null || _result$intensity4 === void 0 ? void 0 : _result$intensity4.controlPoints).toEqual([{
636
675
  x: 0,
637
676
  opacity: 0,
638
677
  color: [255, 255, 255]
@@ -658,7 +697,9 @@ describe("parseViewerUrlParams", function () {
658
697
  colorizeEnabled: false,
659
698
  colorizeAlpha: 0.9,
660
699
  isovalue: 129,
661
- lut: ["p50", "p99"]
700
+ intensity: {
701
+ lut: ["p50", "p99"]
702
+ }
662
703
  }], ["c1=ven:0,col:ff0000,clz:1,cza:0.5,isa:0.75,lut:0:255,sen:0,isv:0", "c1=ven%3A0%2Ccol%3Aff0000%2Cclz%3A1%2Ccza%3A0.5%2Cisa%3A0.75%2Clut%3A0%3A255%2Csen%3A0%2Cisv%3A0", {
663
704
  color: "ff0000",
664
705
  name: undefined,
@@ -669,7 +710,9 @@ describe("parseViewerUrlParams", function () {
669
710
  surfaceEnabled: false,
670
711
  enabled: false,
671
712
  isovalue: 0,
672
- lut: ["0", "255"]
713
+ intensity: {
714
+ lut: ["0", "255"]
715
+ }
673
716
  }], ["c5=ven:0,col:00ff00,clz:0,cza:0,isa:1,lut:autoij:,sen:1,isv:100", "c5=ven%3A0%2Ccol%3A00ff00%2Cclz%3A0%2Ccza%3A0%2Cisa%3A1%2Clut%3Aautoij%3A%2Csen%3A1%2Cisv%3A100", {
674
717
  color: "00ff00",
675
718
  name: undefined,
@@ -680,111 +723,109 @@ describe("parseViewerUrlParams", function () {
680
723
  surfaceEnabled: true,
681
724
  enabled: false,
682
725
  isovalue: 100,
683
- lut: ["autoij", ""]
726
+ intensity: {
727
+ lut: ["autoij", ""]
728
+ }
684
729
  }]];
685
730
  it("parses unencoded per-channel setting", /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
686
- var _i7, _channelParamToSettin, _args$viewerChannelSe, _channelParamToSettin2, queryString, expected, params, _yield$parseViewerUrl, args, channelSetting;
731
+ var _i7, _channelParamToSettin, _args$viewerChannelSe, _channelParamToSettin2, queryString, expected, _yield$parseViewerUrl, args, channelSetting;
687
732
  return _regeneratorRuntime().wrap(function _callee$(_context) {
688
733
  while (1) switch (_context.prev = _context.next) {
689
734
  case 0:
690
735
  _i7 = 0, _channelParamToSettin = channelParamToSetting;
691
736
  case 1:
692
737
  if (!(_i7 < _channelParamToSettin.length)) {
693
- _context.next = 13;
738
+ _context.next = 12;
694
739
  break;
695
740
  }
696
741
  _channelParamToSettin2 = _slicedToArray(_channelParamToSettin[_i7], 3), queryString = _channelParamToSettin2[0], expected = _channelParamToSettin2[2];
697
- params = new URLSearchParams(queryString);
698
- _context.next = 6;
699
- return parseViewerUrlParams(params);
700
- case 6:
742
+ _context.next = 5;
743
+ return parseViewerUrlParams(queryString);
744
+ case 5:
701
745
  _yield$parseViewerUrl = _context.sent;
702
746
  args = _yield$parseViewerUrl.args;
703
747
  channelSetting = (_args$viewerChannelSe = args.viewerChannelSettings) === null || _args$viewerChannelSe === void 0 ? void 0 : _args$viewerChannelSe.groups[0].channels[0];
704
748
  expect(channelSetting).toEqual(expected);
705
- case 10:
749
+ case 9:
706
750
  _i7++;
707
751
  _context.next = 1;
708
752
  break;
709
- case 13:
753
+ case 12:
710
754
  case "end":
711
755
  return _context.stop();
712
756
  }
713
757
  }, _callee);
714
758
  })));
715
759
  it("parses encoded per-channel settings", /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
716
- var _i8, _channelParamToSettin3, _args$viewerChannelSe2, _channelParamToSettin4, queryString, expected, params, _yield$parseViewerUrl2, args, channelSetting;
760
+ var _i8, _channelParamToSettin3, _args$viewerChannelSe2, _channelParamToSettin4, queryString, expected, _yield$parseViewerUrl2, args, channelSetting;
717
761
  return _regeneratorRuntime().wrap(function _callee2$(_context2) {
718
762
  while (1) switch (_context2.prev = _context2.next) {
719
763
  case 0:
720
764
  _i8 = 0, _channelParamToSettin3 = channelParamToSetting;
721
765
  case 1:
722
766
  if (!(_i8 < _channelParamToSettin3.length)) {
723
- _context2.next = 13;
767
+ _context2.next = 12;
724
768
  break;
725
769
  }
726
770
  _channelParamToSettin4 = _slicedToArray(_channelParamToSettin3[_i8], 3), queryString = _channelParamToSettin4[1], expected = _channelParamToSettin4[2];
727
- params = new URLSearchParams(queryString);
728
- _context2.next = 6;
729
- return parseViewerUrlParams(params);
730
- case 6:
771
+ _context2.next = 5;
772
+ return parseViewerUrlParams(queryString);
773
+ case 5:
731
774
  _yield$parseViewerUrl2 = _context2.sent;
732
775
  args = _yield$parseViewerUrl2.args;
733
776
  channelSetting = (_args$viewerChannelSe2 = args.viewerChannelSettings) === null || _args$viewerChannelSe2 === void 0 ? void 0 : _args$viewerChannelSe2.groups[0].channels[0];
734
777
  expect(channelSetting).toEqual(expected);
735
- case 10:
778
+ case 9:
736
779
  _i8++;
737
780
  _context2.next = 1;
738
781
  break;
739
- case 13:
782
+ case 12:
740
783
  case "end":
741
784
  return _context2.stop();
742
785
  }
743
786
  }, _callee2);
744
787
  })));
745
788
  it("parses multiple per-channel settings", /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {
746
- var i, _args$viewerChannelSe3, queryString, params, _yield$parseViewerUrl3, args, channelSettings;
789
+ var i, _args$viewerChannelSe3, queryString, _yield$parseViewerUrl3, args, channelSettings;
747
790
  return _regeneratorRuntime().wrap(function _callee3$(_context3) {
748
791
  while (1) switch (_context3.prev = _context3.next) {
749
792
  case 0:
750
793
  i = 0;
751
794
  case 1:
752
795
  if (!(i < 2)) {
753
- _context3.next = 15;
796
+ _context3.next = 14;
754
797
  break;
755
798
  }
756
799
  queryString = channelParamToSetting[0][i] + "&" + channelParamToSetting[1][i] + "&" + channelParamToSetting[2][i];
757
- params = new URLSearchParams(queryString);
758
- _context3.next = 6;
759
- return parseViewerUrlParams(params);
760
- case 6:
800
+ _context3.next = 5;
801
+ return parseViewerUrlParams(queryString);
802
+ case 5:
761
803
  _yield$parseViewerUrl3 = _context3.sent;
762
804
  args = _yield$parseViewerUrl3.args;
763
805
  channelSettings = (_args$viewerChannelSe3 = args.viewerChannelSettings) === null || _args$viewerChannelSe3 === void 0 ? void 0 : _args$viewerChannelSe3.groups[0].channels; // Order is not guaranteed, so check if any of the expected settings are present
764
806
  expect(channelSettings).toContainEqual(channelParamToSetting[0][2]);
765
807
  expect(channelSettings).toContainEqual(channelParamToSetting[1][2]);
766
808
  expect(channelSettings).toContainEqual(channelParamToSetting[2][2]);
767
- case 12:
809
+ case 11:
768
810
  i++;
769
811
  _context3.next = 1;
770
812
  break;
771
- case 15:
813
+ case 14:
772
814
  case "end":
773
815
  return _context3.stop();
774
816
  }
775
817
  }, _callee3);
776
818
  })));
777
819
  it("overrides ch settings when per-channel settings are included", /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee4() {
778
- var _args$viewerChannelSe4;
779
- var queryString, params, _yield$parseViewerUrl4, args, groups, channelSetting;
820
+ var _args$viewerChannelSe4, _channelSetting$inten;
821
+ var queryString, _yield$parseViewerUrl4, args, groups, channelSetting;
780
822
  return _regeneratorRuntime().wrap(function _callee4$(_context4) {
781
823
  while (1) switch (_context4.prev = _context4.next) {
782
824
  case 0:
783
825
  queryString = "?ch=0&lut=1,2&c1=ven:1,lut:4:5";
784
- params = new URLSearchParams(queryString);
785
- _context4.next = 4;
786
- return parseViewerUrlParams(params);
787
- case 4:
826
+ _context4.next = 3;
827
+ return parseViewerUrlParams(queryString);
828
+ case 3:
788
829
  _yield$parseViewerUrl4 = _context4.sent;
789
830
  args = _yield$parseViewerUrl4.args;
790
831
  groups = (_args$viewerChannelSe4 = args.viewerChannelSettings) === null || _args$viewerChannelSe4 === void 0 ? void 0 : _args$viewerChannelSe4.groups[0];
@@ -792,24 +833,23 @@ describe("parseViewerUrlParams", function () {
792
833
  channelSetting = groups.channels[0];
793
834
  expect(channelSetting.match).toEqual(1);
794
835
  expect(channelSetting.enabled).toEqual(true);
795
- expect(channelSetting.lut).toEqual(["4", "5"]);
796
- case 12:
836
+ expect((_channelSetting$inten = channelSetting.intensity) === null || _channelSetting$inten === void 0 ? void 0 : _channelSetting$inten.lut).toEqual(["4", "5"]);
837
+ case 11:
797
838
  case "end":
798
839
  return _context4.stop();
799
840
  }
800
841
  }, _callee4);
801
842
  })));
802
843
  it("skips missing channel indices", /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee5() {
803
- var _args$viewerChannelSe5;
804
- var queryString, params, _yield$parseViewerUrl5, args, groups, channelSetting1, channelSetting2;
844
+ var _args$viewerChannelSe5, _channelSetting2$inte;
845
+ var queryString, _yield$parseViewerUrl5, args, groups, channelSetting1, channelSetting2;
805
846
  return _regeneratorRuntime().wrap(function _callee5$(_context5) {
806
847
  while (1) switch (_context5.prev = _context5.next) {
807
848
  case 0:
808
849
  queryString = "?c0=ven:1&c15=ven:1,lut:4:5";
809
- params = new URLSearchParams(queryString);
810
- _context5.next = 4;
811
- return parseViewerUrlParams(params);
812
- case 4:
850
+ _context5.next = 3;
851
+ return parseViewerUrlParams(queryString);
852
+ case 3:
813
853
  _yield$parseViewerUrl5 = _context5.sent;
814
854
  args = _yield$parseViewerUrl5.args;
815
855
  groups = (_args$viewerChannelSe5 = args.viewerChannelSettings) === null || _args$viewerChannelSe5 === void 0 ? void 0 : _args$viewerChannelSe5.groups[0];
@@ -820,8 +860,8 @@ describe("parseViewerUrlParams", function () {
820
860
  expect(channelSetting1.enabled).toEqual(true);
821
861
  expect(channelSetting2.match).toEqual(15);
822
862
  expect(channelSetting2.enabled).toEqual(true);
823
- expect(channelSetting2.lut).toEqual(["4", "5"]);
824
- case 15:
863
+ expect((_channelSetting2$inte = channelSetting2.intensity) === null || _channelSetting2$inte === void 0 ? void 0 : _channelSetting2$inte.lut).toEqual(["4", "5"]);
864
+ case 14:
825
865
  case "end":
826
866
  return _context5.stop();
827
867
  }
@@ -829,15 +869,14 @@ describe("parseViewerUrlParams", function () {
829
869
  })));
830
870
  it("creates empty default data for bad per-channel setting formats", /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee6() {
831
871
  var _args$viewerChannelSe6;
832
- var queryString, params, _yield$parseViewerUrl6, args, channelSettings, i, channelSetting;
872
+ var queryString, _yield$parseViewerUrl6, args, channelSettings, i, channelSetting;
833
873
  return _regeneratorRuntime().wrap(function _callee6$(_context6) {
834
874
  while (1) switch (_context6.prev = _context6.next) {
835
875
  case 0:
836
876
  queryString = "c1=bad&c0=ultrabad:bad&c2=,,,,,,";
837
- params = new URLSearchParams(queryString);
838
- _context6.next = 4;
839
- return parseViewerUrlParams(params);
840
- case 4:
877
+ _context6.next = 3;
878
+ return parseViewerUrlParams(queryString);
879
+ case 3:
841
880
  _yield$parseViewerUrl6 = _context6.sent;
842
881
  args = _yield$parseViewerUrl6.args;
843
882
  channelSettings = (_args$viewerChannelSe6 = args.viewerChannelSettings) === null || _args$viewerChannelSe6 === void 0 ? void 0 : _args$viewerChannelSe6.groups[0].channels;
@@ -848,7 +887,7 @@ describe("parseViewerUrlParams", function () {
848
887
  match: channelSetting.match
849
888
  }));
850
889
  }
851
- case 9:
890
+ case 8:
852
891
  case "end":
853
892
  return _context6.stop();
854
893
  }
@@ -856,15 +895,14 @@ describe("parseViewerUrlParams", function () {
856
895
  })));
857
896
  it("enables first three channels by default if no channel settings are provided", /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee7() {
858
897
  var _args$viewerChannelSe7;
859
- var queryString, params, _yield$parseViewerUrl7, args, channelSettingsGroups, channelSettings;
898
+ var queryString, _yield$parseViewerUrl7, args, channelSettingsGroups, channelSettings;
860
899
  return _regeneratorRuntime().wrap(function _callee7$(_context7) {
861
900
  while (1) switch (_context7.prev = _context7.next) {
862
901
  case 0:
863
902
  queryString = "url=https://example.com/image.tiff";
864
- params = new URLSearchParams(queryString);
865
- _context7.next = 4;
866
- return parseViewerUrlParams(params);
867
- case 4:
903
+ _context7.next = 3;
904
+ return parseViewerUrlParams(queryString);
905
+ case 3:
868
906
  _yield$parseViewerUrl7 = _context7.sent;
869
907
  args = _yield$parseViewerUrl7.args;
870
908
  // Should have one group
@@ -879,23 +917,22 @@ describe("parseViewerUrlParams", function () {
879
917
  match: "(.+)",
880
918
  enabled: false
881
919
  });
882
- case 11:
920
+ case 10:
883
921
  case "end":
884
922
  return _context7.stop();
885
923
  }
886
924
  }, _callee7);
887
925
  })));
888
926
  it("parses default nucmorph settings", /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee8() {
889
- var _args$viewerChannelSe8;
890
- var queryString, params, _yield$parseViewerUrl8, args, viewerSettings, channelSettings;
927
+ var _args$viewerChannelSe8, _channelSettings$chan;
928
+ var queryString, _yield$parseViewerUrl8, args, viewerSettings, channelSettings;
891
929
  return _regeneratorRuntime().wrap(function _callee8$(_context8) {
892
930
  while (1) switch (_context8.prev = _context8.next) {
893
931
  case 0:
894
932
  queryString = "url=https://example.com/image1.ome.zarr,https://example.com/image2.ome.zarr&c0=ven:0&c1=ven:1,lut:autoij:&c2=ven:1,clz:1&view=Z";
895
- params = new URLSearchParams(queryString);
896
- _context8.next = 4;
897
- return parseViewerUrlParams(params);
898
- case 4:
933
+ _context8.next = 3;
934
+ return parseViewerUrlParams(queryString);
935
+ case 3:
899
936
  _yield$parseViewerUrl8 = _context8.sent;
900
937
  args = _yield$parseViewerUrl8.args;
901
938
  viewerSettings = _yield$parseViewerUrl8.viewerSettings;
@@ -914,58 +951,149 @@ describe("parseViewerUrlParams", function () {
914
951
  expect(channelSettings.channels[0].enabled).toEqual(false);
915
952
  expect(channelSettings.channels[1].match).toEqual(1);
916
953
  expect(channelSettings.channels[1].enabled).toEqual(true);
917
- expect(channelSettings.channels[1].lut).toEqual(["autoij", ""]);
954
+ expect((_channelSettings$chan = channelSettings.channels[1].intensity) === null || _channelSettings$chan === void 0 ? void 0 : _channelSettings$chan.lut).toEqual(["autoij", ""]);
918
955
  expect(channelSettings.channels[2].match).toEqual(2);
919
956
  expect(channelSettings.channels[2].enabled).toEqual(true);
920
957
  expect(channelSettings.channels[2].colorizeEnabled).toEqual(true);
921
- case 21:
958
+ case 20:
922
959
  case "end":
923
960
  return _context8.stop();
924
961
  }
925
962
  }, _callee8);
926
963
  })));
927
- it("parses viewer settings", /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee9() {
928
- var queryString, params, _yield$parseViewerUrl9, viewerSettings;
964
+ it("can handle arbitrary levels of URL encoding", /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee9() {
965
+ var scenes, _allEncodingCombinations, encodings, _iterator3, _step3, encoding, _yield$parseViewerUrl9, args;
929
966
  return _regeneratorRuntime().wrap(function _callee9$(_context9) {
930
967
  while (1) switch (_context9.prev = _context9.next) {
931
968
  case 0:
932
- queryString = "mask=30&view=X";
933
- params = new URLSearchParams(queryString);
934
- _context9.next = 4;
935
- return parseViewerUrlParams(params);
936
- case 4:
969
+ // GOAL: no matter how, where, or how many times URL encoding is applied when concatenating
970
+ // these scene URLs into one param, they should decode back to the same URLs.
971
+ scenes = [["https://example.com/image1.ome.zarr"], ["https://example.com/image2.ome.zarr", "https://example.com/image3.ome.zarr?foo=1%2C2%2C3"]]; // Recursively generate combinations of encoded and unencoded URLs
972
+ _allEncodingCombinations = function allEncodingCombinations(urls, delims) {
973
+ // BASE CASE: generate an unencoded and encoded variant of a single URL
974
+ if (typeof urls === "string") {
975
+ return [urls, encodeURIComponent(urls)];
976
+ }
977
+
978
+ // Recursively generate combinations for all array elements
979
+ var nextDelims = delims.slice(1);
980
+ var encoded = urls.map(function (url) {
981
+ return _allEncodingCombinations(url, nextDelims);
982
+ });
983
+
984
+ // Concatenate those together in all possible combinations
985
+ var combined = encoded.reduce(function (accum, next) {
986
+ var result = [];
987
+ var _iterator = _createForOfIteratorHelper(accum),
988
+ _step;
989
+ try {
990
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
991
+ var a = _step.value;
992
+ var _iterator2 = _createForOfIteratorHelper(next),
993
+ _step2;
994
+ try {
995
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
996
+ var n = _step2.value;
997
+ result.push(a + delims[0] + n);
998
+ }
999
+ } catch (err) {
1000
+ _iterator2.e(err);
1001
+ } finally {
1002
+ _iterator2.f();
1003
+ }
1004
+ }
1005
+ } catch (err) {
1006
+ _iterator.e(err);
1007
+ } finally {
1008
+ _iterator.f();
1009
+ }
1010
+ return result;
1011
+ });
1012
+
1013
+ // Generate unencoded, encoded, and double-encoded variants of all those concatenated strings
1014
+ return combined.flatMap(function (url) {
1015
+ var encodedOnce = encodeURIComponent(url);
1016
+ return [url, encodedOnce, encodeURIComponent(encodedOnce)];
1017
+ });
1018
+ };
1019
+ encodings = _allEncodingCombinations(scenes, ["+", ","]);
1020
+ _iterator3 = _createForOfIteratorHelper(encodings);
1021
+ _context9.prev = 4;
1022
+ _iterator3.s();
1023
+ case 6:
1024
+ if ((_step3 = _iterator3.n()).done) {
1025
+ _context9.next = 15;
1026
+ break;
1027
+ }
1028
+ encoding = _step3.value;
1029
+ _context9.next = 10;
1030
+ return parseViewerUrlParams("url=".concat(encoding));
1031
+ case 10:
937
1032
  _yield$parseViewerUrl9 = _context9.sent;
938
- viewerSettings = _yield$parseViewerUrl9.viewerSettings;
939
- expect(viewerSettings.viewMode).toEqual(ViewMode.yz);
940
- expect(viewerSettings.maskAlpha).toEqual(30);
941
- case 8:
1033
+ args = _yield$parseViewerUrl9.args;
1034
+ expect(args.imageUrl).toEqual({
1035
+ scenes: scenes
1036
+ });
1037
+ case 13:
1038
+ _context9.next = 6;
1039
+ break;
1040
+ case 15:
1041
+ _context9.next = 20;
1042
+ break;
1043
+ case 17:
1044
+ _context9.prev = 17;
1045
+ _context9.t0 = _context9["catch"](4);
1046
+ _iterator3.e(_context9.t0);
1047
+ case 20:
1048
+ _context9.prev = 20;
1049
+ _iterator3.f();
1050
+ return _context9.finish(20);
1051
+ case 23:
942
1052
  case "end":
943
1053
  return _context9.stop();
944
1054
  }
945
- }, _callee9);
1055
+ }, _callee9, null, [[4, 17, 20, 23]]);
946
1056
  })));
947
- it("returns an empty object when no params are passed in", /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee10() {
948
- var queryString, params, _yield$parseViewerUrl10, args, viewerSettings;
1057
+ it("parses viewer settings", /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee10() {
1058
+ var queryString, _yield$parseViewerUrl10, viewerSettings;
949
1059
  return _regeneratorRuntime().wrap(function _callee10$(_context10) {
950
1060
  while (1) switch (_context10.prev = _context10.next) {
951
1061
  case 0:
952
- queryString = "";
953
- params = new URLSearchParams(queryString);
954
- _context10.next = 4;
955
- return parseViewerUrlParams(params);
956
- case 4:
1062
+ queryString = "mask=30&view=X";
1063
+ _context10.next = 3;
1064
+ return parseViewerUrlParams(queryString);
1065
+ case 3:
957
1066
  _yield$parseViewerUrl10 = _context10.sent;
958
- args = _yield$parseViewerUrl10.args;
959
1067
  viewerSettings = _yield$parseViewerUrl10.viewerSettings;
1068
+ expect(viewerSettings.viewMode).toEqual(ViewMode.yz);
1069
+ expect(viewerSettings.maskAlpha).toEqual(30);
1070
+ case 7:
1071
+ case "end":
1072
+ return _context10.stop();
1073
+ }
1074
+ }, _callee10);
1075
+ })));
1076
+ it("returns an empty object when no params are passed in", /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee11() {
1077
+ var queryString, _yield$parseViewerUrl11, args, viewerSettings;
1078
+ return _regeneratorRuntime().wrap(function _callee11$(_context11) {
1079
+ while (1) switch (_context11.prev = _context11.next) {
1080
+ case 0:
1081
+ queryString = "";
1082
+ _context11.next = 3;
1083
+ return parseViewerUrlParams(queryString);
1084
+ case 3:
1085
+ _yield$parseViewerUrl11 = _context11.sent;
1086
+ args = _yield$parseViewerUrl11.args;
1087
+ viewerSettings = _yield$parseViewerUrl11.viewerSettings;
960
1088
  expect(Object.keys(args).length === 0);
961
1089
  expect(args).toEqual({});
962
1090
  expect(Object.keys(viewerSettings).length === 0);
963
1091
  expect(viewerSettings).toEqual({});
964
- case 11:
1092
+ case 10:
965
1093
  case "end":
966
- return _context10.stop();
1094
+ return _context11.stop();
967
1095
  }
968
- }, _callee10);
1096
+ }, _callee11);
969
1097
  })));
970
1098
  });
971
1099
  describe("serializeViewerUrlParams", function () {
@@ -992,7 +1120,8 @@ describe("serializeViewerUrlParams", function () {
992
1120
  }],
993
1121
  ramp: [-10, 260.1],
994
1122
  plotMin: 0,
995
- plotMax: 255
1123
+ plotMax: 255,
1124
+ keepIntensityRange: true
996
1125
  }, {
997
1126
  name: "channel1",
998
1127
  displayName: "channel1",
@@ -1027,7 +1156,8 @@ describe("serializeViewerUrlParams", function () {
1027
1156
  }],
1028
1157
  ramp: [50, 140],
1029
1158
  plotMin: 0,
1030
- plotMax: 255
1159
+ plotMax: 255,
1160
+ keepIntensityRange: false
1031
1161
  }];
1032
1162
  var serialized = serializeViewerUrlParams({
1033
1163
  channelSettings: channelStates
@@ -1043,9 +1173,10 @@ describe("serializeViewerUrlParams", function () {
1043
1173
  isa: "0.75",
1044
1174
  sen: "1",
1045
1175
  isv: "128",
1046
- rmp: "-10:260.1",
1047
- cps: "0:0:808080:1:1:ff0000",
1048
- cpe: "0"
1176
+ ram: "-10:260.1",
1177
+ cpt: "0:0:808080:1:1:ff0000",
1178
+ cpe: "0",
1179
+ pin: "1"
1049
1180
  };
1050
1181
  var expectedChannel1 = {
1051
1182
  ven: "0",
@@ -1055,9 +1186,10 @@ describe("serializeViewerUrlParams", function () {
1055
1186
  isa: "0",
1056
1187
  sen: "0",
1057
1188
  isv: "57",
1058
- rmp: "50:140",
1059
- cps: "-10:0:000000:50:0:000000:100:0.3:0010ff:140:0.8:00ffff:260:1:00ffb4",
1060
- cpe: "1"
1189
+ ram: "50:140",
1190
+ cpt: "-10:0:000000:50:0:000000:100:0.3:0010ff:140:0.8:00ffff:260:1:00ffb4",
1191
+ cpe: "1",
1192
+ pin: "0"
1061
1193
  };
1062
1194
  expect(serialized["c0"]).toBeDefined();
1063
1195
  expect(parseKeyValueList(serialized["c0"])).toEqual(expectedChannel0);