@aics/vole-app 2.14.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.
- package/es/Globals.d.js +0 -0
- package/es/aics-image-viewer/components/App/ChannelUpdater.js +21 -3
- package/es/aics-image-viewer/components/App/index.js +184 -198
- 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 +26 -52
- 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 +15 -12
- 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/index.js +8 -3
- package/es/aics-image-viewer/components/shared/SliderRow/styles.css +7 -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 +59 -58
- 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 +5 -3
- 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 +240 -108
- package/es/aics-image-viewer/shared/utils/test/viewerChannelSettings.test.js +1 -1
- package/es/aics-image-viewer/shared/utils/urlParsing.js +278 -153
- 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 +2 -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,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
|
-
|
|
245
|
-
|
|
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
|
-
|
|
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
|
-
|
|
388
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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 =
|
|
738
|
+
_context.next = 12;
|
|
694
739
|
break;
|
|
695
740
|
}
|
|
696
741
|
_channelParamToSettin2 = _slicedToArray(_channelParamToSettin[_i7], 3), queryString = _channelParamToSettin2[0], expected = _channelParamToSettin2[2];
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
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
|
|
749
|
+
case 9:
|
|
706
750
|
_i7++;
|
|
707
751
|
_context.next = 1;
|
|
708
752
|
break;
|
|
709
|
-
case
|
|
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,
|
|
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 =
|
|
767
|
+
_context2.next = 12;
|
|
724
768
|
break;
|
|
725
769
|
}
|
|
726
770
|
_channelParamToSettin4 = _slicedToArray(_channelParamToSettin3[_i8], 3), queryString = _channelParamToSettin4[1], expected = _channelParamToSettin4[2];
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
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
|
|
778
|
+
case 9:
|
|
736
779
|
_i8++;
|
|
737
780
|
_context2.next = 1;
|
|
738
781
|
break;
|
|
739
|
-
case
|
|
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,
|
|
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 =
|
|
796
|
+
_context3.next = 14;
|
|
754
797
|
break;
|
|
755
798
|
}
|
|
756
799
|
queryString = channelParamToSetting[0][i] + "&" + channelParamToSetting[1][i] + "&" + channelParamToSetting[2][i];
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
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
|
|
809
|
+
case 11:
|
|
768
810
|
i++;
|
|
769
811
|
_context3.next = 1;
|
|
770
812
|
break;
|
|
771
|
-
case
|
|
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,
|
|
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
|
-
|
|
785
|
-
|
|
786
|
-
|
|
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
|
|
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,
|
|
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
|
-
|
|
810
|
-
|
|
811
|
-
|
|
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
|
|
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,
|
|
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
|
-
|
|
838
|
-
|
|
839
|
-
|
|
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
|
|
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,
|
|
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
|
-
|
|
865
|
-
|
|
866
|
-
|
|
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
|
|
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,
|
|
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
|
-
|
|
896
|
-
|
|
897
|
-
|
|
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
|
|
958
|
+
case 20:
|
|
922
959
|
case "end":
|
|
923
960
|
return _context8.stop();
|
|
924
961
|
}
|
|
925
962
|
}, _callee8);
|
|
926
963
|
})));
|
|
927
|
-
it("
|
|
928
|
-
var
|
|
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
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
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
|
-
|
|
939
|
-
expect(
|
|
940
|
-
|
|
941
|
-
|
|
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("
|
|
948
|
-
var queryString,
|
|
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
|
-
|
|
954
|
-
|
|
955
|
-
|
|
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
|
|
1092
|
+
case 10:
|
|
965
1093
|
case "end":
|
|
966
|
-
return
|
|
1094
|
+
return _context11.stop();
|
|
967
1095
|
}
|
|
968
|
-
},
|
|
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
|
-
|
|
1047
|
-
|
|
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
|
-
|
|
1059
|
-
|
|
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);
|