@vitessce/vit-s 3.4.6 → 3.4.7
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/dist/index.js +199 -85
- package/dist-tsc/CallbackPublisher.d.ts.map +1 -1
- package/dist-tsc/TitleInfo.js +1 -1
- package/dist-tsc/VitS.d.ts +2 -0
- package/dist-tsc/VitS.d.ts.map +1 -1
- package/dist-tsc/VitS.js +9 -2
- package/dist-tsc/VitessceGrid.d.ts +2 -0
- package/dist-tsc/VitessceGrid.d.ts.map +1 -1
- package/dist-tsc/VitessceGrid.js +3 -2
- package/dist-tsc/contexts.d.ts +3 -0
- package/dist-tsc/contexts.d.ts.map +1 -0
- package/dist-tsc/contexts.js +10 -0
- package/dist-tsc/data/AbstractLoader.d.ts.map +1 -1
- package/dist-tsc/data/AbstractTwoStepLoader.d.ts.map +1 -1
- package/dist-tsc/data/LoaderResult.d.ts.map +1 -1
- package/dist-tsc/data/loader-registry.d.ts.map +1 -1
- package/dist-tsc/data-hook-utils.d.ts.map +1 -1
- package/dist-tsc/data-hooks-multilevel-utils.d.ts.map +1 -1
- package/dist-tsc/data-hooks.d.ts.map +1 -1
- package/dist-tsc/data-hooks.js +5 -3
- package/dist-tsc/hooks.d.ts.map +1 -1
- package/dist-tsc/index.d.ts +1 -0
- package/dist-tsc/index.js +1 -0
- package/dist-tsc/state/hooks.d.ts.map +1 -1
- package/dist-tsc/state/spatial-reducers.d.ts.map +1 -1
- package/dist-tsc/view-config-utils.d.ts.map +1 -1
- package/dist-tsc/vitessce-grid-layout/VitessceGridLayout.d.ts.map +1 -1
- package/dist-tsc/vitessce-grid-layout/VitessceGridLayout.js +33 -11
- package/dist-tsc/vitessce-grid-utils.d.ts.map +1 -1
- package/package.json +8 -7
- package/src/TitleInfo.js +1 -1
- package/src/VitS.js +39 -20
- package/src/VitessceGrid.js +7 -1
- package/src/contexts.js +12 -0
- package/src/data-hooks.js +9 -3
- package/src/index.js +1 -0
- package/src/vitessce-grid-layout/VitessceGridLayout.js +77 -45
package/dist/index.js
CHANGED
|
@@ -21274,7 +21274,7 @@ class ParseStatus {
|
|
|
21274
21274
|
status.dirty();
|
|
21275
21275
|
if (value.status === "dirty")
|
|
21276
21276
|
status.dirty();
|
|
21277
|
-
if (typeof value.value !== "undefined" || pair.alwaysSet) {
|
|
21277
|
+
if (key.value !== "__proto__" && (typeof value.value !== "undefined" || pair.alwaysSet)) {
|
|
21278
21278
|
finalObject[key.value] = value.value;
|
|
21279
21279
|
}
|
|
21280
21280
|
}
|
|
@@ -21377,6 +21377,7 @@ class ZodType {
|
|
|
21377
21377
|
this.catch = this.catch.bind(this);
|
|
21378
21378
|
this.describe = this.describe.bind(this);
|
|
21379
21379
|
this.pipe = this.pipe.bind(this);
|
|
21380
|
+
this.readonly = this.readonly.bind(this);
|
|
21380
21381
|
this.isNullable = this.isNullable.bind(this);
|
|
21381
21382
|
this.isOptional = this.isOptional.bind(this);
|
|
21382
21383
|
}
|
|
@@ -21584,6 +21585,9 @@ class ZodType {
|
|
|
21584
21585
|
pipe(target) {
|
|
21585
21586
|
return ZodPipeline.create(this, target);
|
|
21586
21587
|
}
|
|
21588
|
+
readonly() {
|
|
21589
|
+
return ZodReadonly.create(this);
|
|
21590
|
+
}
|
|
21587
21591
|
isOptional() {
|
|
21588
21592
|
return this.safeParse(void 0).success;
|
|
21589
21593
|
}
|
|
@@ -21593,10 +21597,11 @@ class ZodType {
|
|
|
21593
21597
|
}
|
|
21594
21598
|
const cuidRegex = /^c[^\s-]{8,}$/i;
|
|
21595
21599
|
const cuid2Regex = /^[a-z][a-z0-9]*$/;
|
|
21596
|
-
const ulidRegex =
|
|
21597
|
-
const uuidRegex = /^
|
|
21598
|
-
const emailRegex = /^(
|
|
21599
|
-
const
|
|
21600
|
+
const ulidRegex = /^[0-9A-HJKMNP-TV-Z]{26}$/;
|
|
21601
|
+
const uuidRegex = /^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i;
|
|
21602
|
+
const emailRegex = /^(?!\.)(?!.*\.\.)([A-Z0-9_+-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i;
|
|
21603
|
+
const _emojiRegex = `^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$`;
|
|
21604
|
+
let emojiRegex;
|
|
21600
21605
|
const ipv4Regex = /^(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))$/;
|
|
21601
21606
|
const ipv6Regex = /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/;
|
|
21602
21607
|
const datetimeRegex = (args) => {
|
|
@@ -21630,27 +21635,6 @@ function isValidIP(ip, version2) {
|
|
|
21630
21635
|
return false;
|
|
21631
21636
|
}
|
|
21632
21637
|
class ZodString extends ZodType {
|
|
21633
|
-
constructor() {
|
|
21634
|
-
super(...arguments);
|
|
21635
|
-
this._regex = (regex, validation, message) => this.refinement((data) => regex.test(data), {
|
|
21636
|
-
validation,
|
|
21637
|
-
code: ZodIssueCode.invalid_string,
|
|
21638
|
-
...errorUtil.errToObj(message)
|
|
21639
|
-
});
|
|
21640
|
-
this.nonempty = (message) => this.min(1, errorUtil.errToObj(message));
|
|
21641
|
-
this.trim = () => new ZodString({
|
|
21642
|
-
...this._def,
|
|
21643
|
-
checks: [...this._def.checks, { kind: "trim" }]
|
|
21644
|
-
});
|
|
21645
|
-
this.toLowerCase = () => new ZodString({
|
|
21646
|
-
...this._def,
|
|
21647
|
-
checks: [...this._def.checks, { kind: "toLowerCase" }]
|
|
21648
|
-
});
|
|
21649
|
-
this.toUpperCase = () => new ZodString({
|
|
21650
|
-
...this._def,
|
|
21651
|
-
checks: [...this._def.checks, { kind: "toUpperCase" }]
|
|
21652
|
-
});
|
|
21653
|
-
}
|
|
21654
21638
|
_parse(input) {
|
|
21655
21639
|
if (this._def.coerce) {
|
|
21656
21640
|
input.data = String(input.data);
|
|
@@ -21735,6 +21719,9 @@ class ZodString extends ZodType {
|
|
|
21735
21719
|
status.dirty();
|
|
21736
21720
|
}
|
|
21737
21721
|
} else if (check.kind === "emoji") {
|
|
21722
|
+
if (!emojiRegex) {
|
|
21723
|
+
emojiRegex = new RegExp(_emojiRegex, "u");
|
|
21724
|
+
}
|
|
21738
21725
|
if (!emojiRegex.test(input.data)) {
|
|
21739
21726
|
ctx = this._getOrReturnCtx(input, ctx);
|
|
21740
21727
|
addIssueToContext(ctx, {
|
|
@@ -21871,6 +21858,13 @@ class ZodString extends ZodType {
|
|
|
21871
21858
|
}
|
|
21872
21859
|
return { status: status.value, value: input.data };
|
|
21873
21860
|
}
|
|
21861
|
+
_regex(regex, validation, message) {
|
|
21862
|
+
return this.refinement((data) => regex.test(data), {
|
|
21863
|
+
validation,
|
|
21864
|
+
code: ZodIssueCode.invalid_string,
|
|
21865
|
+
...errorUtil.errToObj(message)
|
|
21866
|
+
});
|
|
21867
|
+
}
|
|
21874
21868
|
_addCheck(check) {
|
|
21875
21869
|
return new ZodString({
|
|
21876
21870
|
...this._def,
|
|
@@ -21968,6 +21962,31 @@ class ZodString extends ZodType {
|
|
|
21968
21962
|
...errorUtil.errToObj(message)
|
|
21969
21963
|
});
|
|
21970
21964
|
}
|
|
21965
|
+
/**
|
|
21966
|
+
* @deprecated Use z.string().min(1) instead.
|
|
21967
|
+
* @see {@link ZodString.min}
|
|
21968
|
+
*/
|
|
21969
|
+
nonempty(message) {
|
|
21970
|
+
return this.min(1, errorUtil.errToObj(message));
|
|
21971
|
+
}
|
|
21972
|
+
trim() {
|
|
21973
|
+
return new ZodString({
|
|
21974
|
+
...this._def,
|
|
21975
|
+
checks: [...this._def.checks, { kind: "trim" }]
|
|
21976
|
+
});
|
|
21977
|
+
}
|
|
21978
|
+
toLowerCase() {
|
|
21979
|
+
return new ZodString({
|
|
21980
|
+
...this._def,
|
|
21981
|
+
checks: [...this._def.checks, { kind: "toLowerCase" }]
|
|
21982
|
+
});
|
|
21983
|
+
}
|
|
21984
|
+
toUpperCase() {
|
|
21985
|
+
return new ZodString({
|
|
21986
|
+
...this._def,
|
|
21987
|
+
checks: [...this._def.checks, { kind: "toUpperCase" }]
|
|
21988
|
+
});
|
|
21989
|
+
}
|
|
21971
21990
|
get isDatetime() {
|
|
21972
21991
|
return !!this._def.checks.find((ch) => ch.kind === "datetime");
|
|
21973
21992
|
}
|
|
@@ -23559,6 +23578,12 @@ class ZodRecord extends ZodType {
|
|
|
23559
23578
|
}
|
|
23560
23579
|
}
|
|
23561
23580
|
class ZodMap extends ZodType {
|
|
23581
|
+
get keySchema() {
|
|
23582
|
+
return this._def.keyType;
|
|
23583
|
+
}
|
|
23584
|
+
get valueSchema() {
|
|
23585
|
+
return this._def.valueType;
|
|
23586
|
+
}
|
|
23562
23587
|
_parse(input) {
|
|
23563
23588
|
const { status, ctx } = this._processInputParams(input);
|
|
23564
23589
|
if (ctx.parsedType !== ZodParsedType.map) {
|
|
@@ -23753,27 +23778,29 @@ class ZodFunction extends ZodType {
|
|
|
23753
23778
|
const params = { errorMap: ctx.common.contextualErrorMap };
|
|
23754
23779
|
const fn = ctx.data;
|
|
23755
23780
|
if (this._def.returns instanceof ZodPromise) {
|
|
23756
|
-
|
|
23781
|
+
const me = this;
|
|
23782
|
+
return OK(async function(...args) {
|
|
23757
23783
|
const error = new ZodError([]);
|
|
23758
|
-
const parsedArgs = await
|
|
23784
|
+
const parsedArgs = await me._def.args.parseAsync(args, params).catch((e) => {
|
|
23759
23785
|
error.addIssue(makeArgsIssue(args, e));
|
|
23760
23786
|
throw error;
|
|
23761
23787
|
});
|
|
23762
|
-
const result = await fn
|
|
23763
|
-
const parsedReturns = await
|
|
23788
|
+
const result = await Reflect.apply(fn, this, parsedArgs);
|
|
23789
|
+
const parsedReturns = await me._def.returns._def.type.parseAsync(result, params).catch((e) => {
|
|
23764
23790
|
error.addIssue(makeReturnsIssue(result, e));
|
|
23765
23791
|
throw error;
|
|
23766
23792
|
});
|
|
23767
23793
|
return parsedReturns;
|
|
23768
23794
|
});
|
|
23769
23795
|
} else {
|
|
23770
|
-
|
|
23771
|
-
|
|
23796
|
+
const me = this;
|
|
23797
|
+
return OK(function(...args) {
|
|
23798
|
+
const parsedArgs = me._def.args.safeParse(args, params);
|
|
23772
23799
|
if (!parsedArgs.success) {
|
|
23773
23800
|
throw new ZodError([makeArgsIssue(args, parsedArgs.error)]);
|
|
23774
23801
|
}
|
|
23775
|
-
const result = fn
|
|
23776
|
-
const parsedReturns =
|
|
23802
|
+
const result = Reflect.apply(fn, this, parsedArgs.data);
|
|
23803
|
+
const parsedReturns = me._def.returns.safeParse(result, params);
|
|
23777
23804
|
if (!parsedReturns.success) {
|
|
23778
23805
|
throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]);
|
|
23779
23806
|
}
|
|
@@ -23995,8 +24022,28 @@ class ZodEffects extends ZodType {
|
|
|
23995
24022
|
_parse(input) {
|
|
23996
24023
|
const { status, ctx } = this._processInputParams(input);
|
|
23997
24024
|
const effect = this._def.effect || null;
|
|
24025
|
+
const checkCtx = {
|
|
24026
|
+
addIssue: (arg) => {
|
|
24027
|
+
addIssueToContext(ctx, arg);
|
|
24028
|
+
if (arg.fatal) {
|
|
24029
|
+
status.abort();
|
|
24030
|
+
} else {
|
|
24031
|
+
status.dirty();
|
|
24032
|
+
}
|
|
24033
|
+
},
|
|
24034
|
+
get path() {
|
|
24035
|
+
return ctx.path;
|
|
24036
|
+
}
|
|
24037
|
+
};
|
|
24038
|
+
checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx);
|
|
23998
24039
|
if (effect.type === "preprocess") {
|
|
23999
|
-
const processed = effect.transform(ctx.data);
|
|
24040
|
+
const processed = effect.transform(ctx.data, checkCtx);
|
|
24041
|
+
if (ctx.common.issues.length) {
|
|
24042
|
+
return {
|
|
24043
|
+
status: "dirty",
|
|
24044
|
+
value: ctx.data
|
|
24045
|
+
};
|
|
24046
|
+
}
|
|
24000
24047
|
if (ctx.common.async) {
|
|
24001
24048
|
return Promise.resolve(processed).then((processed2) => {
|
|
24002
24049
|
return this._def.schema._parseAsync({
|
|
@@ -24013,20 +24060,6 @@ class ZodEffects extends ZodType {
|
|
|
24013
24060
|
});
|
|
24014
24061
|
}
|
|
24015
24062
|
}
|
|
24016
|
-
const checkCtx = {
|
|
24017
|
-
addIssue: (arg) => {
|
|
24018
|
-
addIssueToContext(ctx, arg);
|
|
24019
|
-
if (arg.fatal) {
|
|
24020
|
-
status.abort();
|
|
24021
|
-
} else {
|
|
24022
|
-
status.dirty();
|
|
24023
|
-
}
|
|
24024
|
-
},
|
|
24025
|
-
get path() {
|
|
24026
|
-
return ctx.path;
|
|
24027
|
-
}
|
|
24028
|
-
};
|
|
24029
|
-
checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx);
|
|
24030
24063
|
if (effect.type === "refinement") {
|
|
24031
24064
|
const executeRefinement = (acc) => {
|
|
24032
24065
|
const result = effect.refinement(acc, checkCtx);
|
|
@@ -24310,6 +24343,22 @@ class ZodPipeline extends ZodType {
|
|
|
24310
24343
|
});
|
|
24311
24344
|
}
|
|
24312
24345
|
}
|
|
24346
|
+
class ZodReadonly extends ZodType {
|
|
24347
|
+
_parse(input) {
|
|
24348
|
+
const result = this._def.innerType._parse(input);
|
|
24349
|
+
if (isValid(result)) {
|
|
24350
|
+
result.value = Object.freeze(result.value);
|
|
24351
|
+
}
|
|
24352
|
+
return result;
|
|
24353
|
+
}
|
|
24354
|
+
}
|
|
24355
|
+
ZodReadonly.create = (type3, params) => {
|
|
24356
|
+
return new ZodReadonly({
|
|
24357
|
+
innerType: type3,
|
|
24358
|
+
typeName: ZodFirstPartyTypeKind.ZodReadonly,
|
|
24359
|
+
...processCreateParams(params)
|
|
24360
|
+
});
|
|
24361
|
+
};
|
|
24313
24362
|
const custom = (check, params = {}, fatal) => {
|
|
24314
24363
|
if (check)
|
|
24315
24364
|
return ZodAny.create().superRefine((data, ctx) => {
|
|
@@ -24363,6 +24412,7 @@ var ZodFirstPartyTypeKind;
|
|
|
24363
24412
|
ZodFirstPartyTypeKind2["ZodPromise"] = "ZodPromise";
|
|
24364
24413
|
ZodFirstPartyTypeKind2["ZodBranded"] = "ZodBranded";
|
|
24365
24414
|
ZodFirstPartyTypeKind2["ZodPipeline"] = "ZodPipeline";
|
|
24415
|
+
ZodFirstPartyTypeKind2["ZodReadonly"] = "ZodReadonly";
|
|
24366
24416
|
})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {}));
|
|
24367
24417
|
const instanceOfType = (cls, params = {
|
|
24368
24418
|
message: `Input not instance of ${cls.name}`
|
|
@@ -24477,6 +24527,7 @@ var z = /* @__PURE__ */ Object.freeze({
|
|
|
24477
24527
|
BRAND,
|
|
24478
24528
|
ZodBranded,
|
|
24479
24529
|
ZodPipeline,
|
|
24530
|
+
ZodReadonly,
|
|
24480
24531
|
custom,
|
|
24481
24532
|
Schema: ZodType,
|
|
24482
24533
|
ZodSchema: ZodType,
|
|
@@ -24791,7 +24842,7 @@ for (let i = 0; i < 256; ++i) {
|
|
|
24791
24842
|
byteToHex.push((i + 256).toString(16).slice(1));
|
|
24792
24843
|
}
|
|
24793
24844
|
function unsafeStringify(arr, offset2 = 0) {
|
|
24794
|
-
return
|
|
24845
|
+
return byteToHex[arr[offset2 + 0]] + byteToHex[arr[offset2 + 1]] + byteToHex[arr[offset2 + 2]] + byteToHex[arr[offset2 + 3]] + "-" + byteToHex[arr[offset2 + 4]] + byteToHex[arr[offset2 + 5]] + "-" + byteToHex[arr[offset2 + 6]] + byteToHex[arr[offset2 + 7]] + "-" + byteToHex[arr[offset2 + 8]] + byteToHex[arr[offset2 + 9]] + "-" + byteToHex[arr[offset2 + 10]] + byteToHex[arr[offset2 + 11]] + byteToHex[arr[offset2 + 12]] + byteToHex[arr[offset2 + 13]] + byteToHex[arr[offset2 + 14]] + byteToHex[arr[offset2 + 15]];
|
|
24795
24846
|
}
|
|
24796
24847
|
const randomUUID = typeof crypto !== "undefined" && crypto.randomUUID && crypto.randomUUID.bind(crypto);
|
|
24797
24848
|
const native = {
|
|
@@ -27829,6 +27880,7 @@ const ViewType$1 = {
|
|
|
27829
27880
|
OBS_SET_SIZES: "obsSetSizes",
|
|
27830
27881
|
OBS_SET_FEATURE_VALUE_DISTRIBUTION: "obsSetFeatureValueDistribution",
|
|
27831
27882
|
FEATURE_VALUE_HISTOGRAM: "featureValueHistogram",
|
|
27883
|
+
DOT_PLOT: "dotPlot",
|
|
27832
27884
|
FEATURE_BAR_PLOT: "featureBarPlot"
|
|
27833
27885
|
};
|
|
27834
27886
|
const DataType$1 = {
|
|
@@ -28018,6 +28070,7 @@ const CoordinationType$1 = {
|
|
|
28018
28070
|
GATING_FEATURE_SELECTION_X: "gatingFeatureSelectionX",
|
|
28019
28071
|
GATING_FEATURE_SELECTION_Y: "gatingFeatureSelectionY",
|
|
28020
28072
|
FEATURE_VALUE_TRANSFORM_COEFFICIENT: "featureValueTransformCoefficient",
|
|
28073
|
+
FEATURE_VALUE_POSITIVITY_THRESHOLD: "featureValuePositivityThreshold",
|
|
28021
28074
|
TOOLTIPS_VISIBLE: "tooltipsVisible",
|
|
28022
28075
|
FILE_UID: "fileUid",
|
|
28023
28076
|
IMAGE_LAYER: "imageLayer",
|
|
@@ -28065,7 +28118,14 @@ const CoordinationType$1 = {
|
|
|
28065
28118
|
SPATIAL_CHANNEL_LABEL_SIZE: "spatialChannelLabelSize",
|
|
28066
28119
|
// Multi-sample / comparative
|
|
28067
28120
|
SAMPLE_TYPE: "sampleType",
|
|
28068
|
-
SAMPLE_SET_SELECTION: "sampleSetSelection"
|
|
28121
|
+
SAMPLE_SET_SELECTION: "sampleSetSelection",
|
|
28122
|
+
SAMPLE_SET_COLOR: "sampleSetColor",
|
|
28123
|
+
EMBEDDING_POINTS_VISIBLE: "embeddingPointsVisible",
|
|
28124
|
+
EMBEDDING_CONTOURS_VISIBLE: "embeddingContoursVisible",
|
|
28125
|
+
EMBEDDING_CONTOURS_FILLED: "embeddingContoursFilled",
|
|
28126
|
+
EMBEDDING_CONTOUR_PERCENTILES: "embeddingContourPercentiles",
|
|
28127
|
+
CONTOUR_COLOR_ENCODING: "contourColorEncoding",
|
|
28128
|
+
CONTOUR_COLOR: "contourColor"
|
|
28069
28129
|
};
|
|
28070
28130
|
const STATUS = {
|
|
28071
28131
|
LOADING: "loading",
|
|
@@ -28134,10 +28194,10 @@ const AUTO_INDEPENDENT_COORDINATION_TYPES = [
|
|
|
28134
28194
|
CoordinationType$1.EMBEDDING_OBS_OPACITY
|
|
28135
28195
|
];
|
|
28136
28196
|
const note = "This file is autogenerated by .changeset/post-changelog.mjs.";
|
|
28137
|
-
const version = "3.4.
|
|
28138
|
-
const date = "2024-
|
|
28197
|
+
const version = "3.4.7";
|
|
28198
|
+
const date = "2024-07-25";
|
|
28139
28199
|
const branch = "changeset-release/main";
|
|
28140
|
-
const hash = "
|
|
28200
|
+
const hash = "efed9951";
|
|
28141
28201
|
const META_VERSION = {
|
|
28142
28202
|
note,
|
|
28143
28203
|
version,
|
|
@@ -28462,6 +28522,7 @@ const annDataConvenienceObsEmbeddingItem = z.object({
|
|
|
28462
28522
|
});
|
|
28463
28523
|
const annDataObsLabels = annDataObs;
|
|
28464
28524
|
const annDataFeatureLabels = annDataObs;
|
|
28525
|
+
const annDataSampleEdges = annDataObs;
|
|
28465
28526
|
const annDataObsFeatureMatrix = z.object({
|
|
28466
28527
|
path: z.string(),
|
|
28467
28528
|
featureFilterPath: z.string().optional().describe("If the feature index should be filtered, put a boolean column here (analogous to the previous geneFilter option). e.g., var/in_obsm_X_small_matrix"),
|
|
@@ -28618,7 +28679,8 @@ z.object({
|
|
|
28618
28679
|
obsEmbedding: z.union([
|
|
28619
28680
|
annDataObsEmbedding,
|
|
28620
28681
|
z.array(annDataConvenienceObsEmbeddingItem)
|
|
28621
|
-
])
|
|
28682
|
+
]),
|
|
28683
|
+
sampleEdges: annDataSampleEdges
|
|
28622
28684
|
}).partial();
|
|
28623
28685
|
z.object({
|
|
28624
28686
|
// TODO: should `image` be a special schema
|
|
@@ -36595,7 +36657,9 @@ function VitessceGridLayout(props) {
|
|
|
36595
36657
|
height: height2,
|
|
36596
36658
|
onRemoveComponent,
|
|
36597
36659
|
onLayoutChange: onLayoutChangeProp,
|
|
36598
|
-
isBounded
|
|
36660
|
+
isBounded,
|
|
36661
|
+
pageMode,
|
|
36662
|
+
children: children2
|
|
36599
36663
|
} = props;
|
|
36600
36664
|
const getComponent = useCallback((viewType) => {
|
|
36601
36665
|
if (Array.isArray(viewTypes)) {
|
|
@@ -36670,24 +36734,48 @@ function VitessceGridLayout(props) {
|
|
|
36670
36734
|
const saveCurrentLayouts = useCallback(() => {
|
|
36671
36735
|
setLastValidGridLayouts(gridLayouts);
|
|
36672
36736
|
}, [gridLayouts]);
|
|
36673
|
-
const layoutChildren = useMemo(() =>
|
|
36674
|
-
const
|
|
36675
|
-
|
|
36676
|
-
|
|
36677
|
-
|
|
36678
|
-
|
|
36679
|
-
|
|
36680
|
-
|
|
36681
|
-
|
|
36682
|
-
|
|
36683
|
-
|
|
36684
|
-
|
|
36685
|
-
|
|
36686
|
-
|
|
36687
|
-
|
|
36688
|
-
|
|
36689
|
-
|
|
36690
|
-
|
|
36737
|
+
const layoutChildren = useMemo(() => {
|
|
36738
|
+
const gridComponentsValues = Object.values(gridComponents);
|
|
36739
|
+
if (pageMode) {
|
|
36740
|
+
return children2.map((child) => {
|
|
36741
|
+
const childId = child.props.id;
|
|
36742
|
+
const v = gridComponentsValues.find((el2) => el2.uid === childId);
|
|
36743
|
+
if (!v) {
|
|
36744
|
+
return child;
|
|
36745
|
+
}
|
|
36746
|
+
const Component = getComponent(v.component);
|
|
36747
|
+
return React__default.cloneElement(child, { key: v.uid }, /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { display: "flex", flexDirection: "column", height: "100%" }, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
36748
|
+
Component,
|
|
36749
|
+
{
|
|
36750
|
+
...v.props,
|
|
36751
|
+
uuid: v.uid,
|
|
36752
|
+
coordinationScopes: v.coordinationScopes,
|
|
36753
|
+
coordinationScopesBy: v.coordinationScopesBy,
|
|
36754
|
+
theme,
|
|
36755
|
+
removeGridComponent: null
|
|
36756
|
+
}
|
|
36757
|
+
) }));
|
|
36758
|
+
});
|
|
36759
|
+
}
|
|
36760
|
+
return gridComponentsValues.map((v) => {
|
|
36761
|
+
const Component = getComponent(v.component);
|
|
36762
|
+
const removeGridComponent = () => {
|
|
36763
|
+
onRemoveComponent(v.uid);
|
|
36764
|
+
};
|
|
36765
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
36766
|
+
Component,
|
|
36767
|
+
{
|
|
36768
|
+
...v.props,
|
|
36769
|
+
uuid: v.uid,
|
|
36770
|
+
coordinationScopes: v.coordinationScopes,
|
|
36771
|
+
coordinationScopesBy: v.coordinationScopesBy,
|
|
36772
|
+
theme,
|
|
36773
|
+
removeGridComponent
|
|
36774
|
+
}
|
|
36775
|
+
) }, v.uid);
|
|
36776
|
+
});
|
|
36777
|
+
}, [gridComponents, getComponent, onRemoveComponent, theme]);
|
|
36778
|
+
return pageMode ? layoutChildren : gridLayouts && gridComponents && gridBreakpoints && gridCols && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
|
|
36691
36779
|
style,
|
|
36692
36780
|
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
36693
36781
|
ResponsiveHeightGridLayout,
|
|
@@ -37467,7 +37555,9 @@ function VitessceGrid(props) {
|
|
|
37467
37555
|
viewTypes,
|
|
37468
37556
|
fileTypes,
|
|
37469
37557
|
coordinationTypes,
|
|
37470
|
-
stores
|
|
37558
|
+
stores,
|
|
37559
|
+
pageMode,
|
|
37560
|
+
children: children2
|
|
37471
37561
|
} = props;
|
|
37472
37562
|
const [rowHeight, containerRef] = useRowHeight(config2, initialRowHeight, height2, margin, padding);
|
|
37473
37563
|
const onResize = useEmitGridResize();
|
|
@@ -37515,6 +37605,7 @@ function VitessceGrid(props) {
|
|
|
37515
37605
|
children: layout2 ? /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
37516
37606
|
VitessceGridLayout,
|
|
37517
37607
|
{
|
|
37608
|
+
pageMode,
|
|
37518
37609
|
role: "group",
|
|
37519
37610
|
layout: layout2,
|
|
37520
37611
|
height: height2,
|
|
@@ -37528,7 +37619,8 @@ function VitessceGrid(props) {
|
|
|
37528
37619
|
onLayoutChange: changeLayoutPostMount,
|
|
37529
37620
|
isBounded,
|
|
37530
37621
|
onResize,
|
|
37531
|
-
onResizeStop: onResize
|
|
37622
|
+
onResizeStop: onResize,
|
|
37623
|
+
children: children2
|
|
37532
37624
|
}
|
|
37533
37625
|
) : null
|
|
37534
37626
|
}
|
|
@@ -37836,6 +37928,14 @@ function createGenerateClassName(customPrefix) {
|
|
|
37836
37928
|
return `${seedPrefix}${ruleKey}`;
|
|
37837
37929
|
};
|
|
37838
37930
|
}
|
|
37931
|
+
const AsyncFunctionsContext = createContext$1({
|
|
37932
|
+
// This will be an object where keys are function types
|
|
37933
|
+
// (as strings) and values are the async functions.
|
|
37934
|
+
});
|
|
37935
|
+
function useAsyncFunction(functionType2) {
|
|
37936
|
+
const context = useContext(AsyncFunctionsContext);
|
|
37937
|
+
return context == null ? void 0 : context[functionType2];
|
|
37938
|
+
}
|
|
37839
37939
|
function VitS(props) {
|
|
37840
37940
|
const {
|
|
37841
37941
|
config: config2,
|
|
@@ -37855,7 +37955,10 @@ function VitS(props) {
|
|
|
37855
37955
|
fileTypes: fileTypesProp,
|
|
37856
37956
|
jointFileTypes: jointFileTypesProp,
|
|
37857
37957
|
coordinationTypes: coordinationTypesProp,
|
|
37858
|
-
|
|
37958
|
+
asyncFunctions: asyncFunctionsProp,
|
|
37959
|
+
warning: warning2,
|
|
37960
|
+
pageMode = false,
|
|
37961
|
+
children: children2
|
|
37859
37962
|
} = props;
|
|
37860
37963
|
const viewTypes = useMemo(() => viewTypesProp || [], [viewTypesProp]);
|
|
37861
37964
|
const fileTypes = useMemo(() => fileTypesProp || [], [fileTypesProp]);
|
|
@@ -37867,6 +37970,14 @@ function VitS(props) {
|
|
|
37867
37970
|
() => coordinationTypesProp || [],
|
|
37868
37971
|
[coordinationTypesProp]
|
|
37869
37972
|
);
|
|
37973
|
+
const asyncFunctions = useMemo(
|
|
37974
|
+
() => Object.fromEntries(
|
|
37975
|
+
// Convert the array of PluginAsyncFunction instances to a mapping
|
|
37976
|
+
// from function type strings to async functions.
|
|
37977
|
+
(asyncFunctionsProp == null ? void 0 : asyncFunctionsProp.map((p) => [p.functionType, p.asyncFunction])) || []
|
|
37978
|
+
),
|
|
37979
|
+
[asyncFunctionsProp]
|
|
37980
|
+
);
|
|
37870
37981
|
const generateClassName2 = useMemo(() => createGenerateClassName(uid), [uid]);
|
|
37871
37982
|
const configVersion = config2 == null ? void 0 : config2.version;
|
|
37872
37983
|
const configKey = useMemo(() => {
|
|
@@ -37960,10 +38071,11 @@ function VitS(props) {
|
|
|
37960
38071
|
{
|
|
37961
38072
|
createStore: createViewConfigStoreClosure,
|
|
37962
38073
|
...remountOnUidChange ? { key: configKey } : {},
|
|
37963
|
-
children: /* @__PURE__ */ jsxRuntimeExports.
|
|
38074
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsx(AuxiliaryProvider, { createStore: createAuxiliaryStore, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(AsyncFunctionsContext.Provider, { value: asyncFunctions, children: [
|
|
37964
38075
|
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
37965
38076
|
VitessceGrid,
|
|
37966
38077
|
{
|
|
38078
|
+
pageMode,
|
|
37967
38079
|
success,
|
|
37968
38080
|
configKey,
|
|
37969
38081
|
viewTypes,
|
|
@@ -37974,7 +38086,8 @@ function VitS(props) {
|
|
|
37974
38086
|
height: height2,
|
|
37975
38087
|
theme,
|
|
37976
38088
|
isBounded,
|
|
37977
|
-
stores
|
|
38089
|
+
stores,
|
|
38090
|
+
children: children2
|
|
37978
38091
|
}
|
|
37979
38092
|
),
|
|
37980
38093
|
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
@@ -37987,7 +38100,7 @@ function VitS(props) {
|
|
|
37987
38100
|
pluginSpecificConfigSchema
|
|
37988
38101
|
}
|
|
37989
38102
|
)
|
|
37990
|
-
] })
|
|
38103
|
+
] }) })
|
|
37991
38104
|
}
|
|
37992
38105
|
) }) }) }) : /* @__PURE__ */ jsxRuntimeExports.jsx(StylesProvider, { generateClassName: generateClassName2, children: /* @__PURE__ */ jsxRuntimeExports.jsx(ThemeProvider, { theme: muiTheme[theme], children: /* @__PURE__ */ jsxRuntimeExports.jsx(Warning, { ...configOrWarning }) }) });
|
|
37993
38106
|
}
|
|
@@ -38230,7 +38343,7 @@ function TitleInfo(props) {
|
|
|
38230
38343
|
urls
|
|
38231
38344
|
}
|
|
38232
38345
|
) : null,
|
|
38233
|
-
closeButtonVisible ? /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
38346
|
+
closeButtonVisible && removeGridComponent ? /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
38234
38347
|
ClosePaneButton,
|
|
38235
38348
|
{
|
|
38236
38349
|
removeGridComponent
|
|
@@ -38717,14 +38830,14 @@ function useFeatureSelection(loaders, dataset, isRequired, selection, matchOn) {
|
|
|
38717
38830
|
const anyError = featureQueries.some((q) => q.isError);
|
|
38718
38831
|
const dataStatus = anyLoading ? STATUS.LOADING : anyError ? STATUS.ERROR : STATUS.SUCCESS;
|
|
38719
38832
|
const isSuccess = dataStatus === STATUS.SUCCESS;
|
|
38720
|
-
const geneData = isSuccess ? featureQueries.map((q) => {
|
|
38833
|
+
const geneData = useMemo(() => isSuccess ? featureQueries.map((q) => {
|
|
38721
38834
|
var _a;
|
|
38722
38835
|
return ((_a = q.data) == null ? void 0 : _a.data) || null;
|
|
38723
|
-
}) : null;
|
|
38724
|
-
const loadedGeneName = isSuccess ? featureQueries.map((q) => {
|
|
38836
|
+
}) : null, [isSuccess, selection, dataset]);
|
|
38837
|
+
const loadedGeneName = useMemo(() => isSuccess ? featureQueries.map((q) => {
|
|
38725
38838
|
var _a;
|
|
38726
38839
|
return ((_a = q.data) == null ? void 0 : _a.dataKey) || null;
|
|
38727
|
-
}) : null;
|
|
38840
|
+
}) : null, [isSuccess, selection, dataset]);
|
|
38728
38841
|
useEffect(() => {
|
|
38729
38842
|
featureQueries.map((q) => q.error).filter((e) => Boolean(e)).forEach((error) => {
|
|
38730
38843
|
warn(error, setWarning);
|
|
@@ -39955,6 +40068,7 @@ export {
|
|
|
39955
40068
|
VitS,
|
|
39956
40069
|
logConfig,
|
|
39957
40070
|
useAddImageChannelInMetaCoordinationScopes,
|
|
40071
|
+
useAsyncFunction,
|
|
39958
40072
|
useAuxiliaryCoordination,
|
|
39959
40073
|
useClosestVitessceContainerSize,
|
|
39960
40074
|
useComplexCoordination,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CallbackPublisher.d.ts","sourceRoot":"","sources":["../src/CallbackPublisher.js"],"names":[],"mappings":"AAeA;;;;;;;;;;;GAWG;AACH;
|
|
1
|
+
{"version":3,"file":"CallbackPublisher.d.ts","sourceRoot":"","sources":["../src/CallbackPublisher.js"],"names":[],"mappings":"AAeA;;;;;;;;;;;GAWG;AACH,iDAPG;IAAwB,cAAc;IAEd,cAAc;IAEf,sBAAsB,EAArC,OAAO;CAEjB,QAkDA"}
|
package/dist-tsc/TitleInfo.js
CHANGED
|
@@ -66,7 +66,7 @@ export function TitleInfo(props) {
|
|
|
66
66
|
const classes = useTitleStyles();
|
|
67
67
|
return (
|
|
68
68
|
// d-flex without wrapping div is not always full height; I don't understand the root cause.
|
|
69
|
-
_jsxs(_Fragment, { children: [_jsxs("div", { className: classes.title, role: "banner", children: [_jsx("div", { className: classes.titleLeft, role: "heading", "aria-level": "1", children: title }), _jsx("div", { className: classes.titleInfo, title: info, role: "note", children: info }), _jsxs("div", { className: classes.titleButtons, role: "toolbar", "aria-label": "Plot options and controls", children: [_jsx(PlotOptions, { options: options }), downloadButtonVisible ? (_jsx(DownloadOptions, { urls: urls })) : null, closeButtonVisible ? (_jsx(ClosePaneButton, { removeGridComponent: removeGridComponent })) : null] })] }), _jsxs("div", { className: clsx(TOOLTIP_ANCESTOR, classes.card, {
|
|
69
|
+
_jsxs(_Fragment, { children: [_jsxs("div", { className: classes.title, role: "banner", children: [_jsx("div", { className: classes.titleLeft, role: "heading", "aria-level": "1", children: title }), _jsx("div", { className: classes.titleInfo, title: info, role: "note", children: info }), _jsxs("div", { className: classes.titleButtons, role: "toolbar", "aria-label": "Plot options and controls", children: [_jsx(PlotOptions, { options: options }), downloadButtonVisible ? (_jsx(DownloadOptions, { urls: urls })) : null, closeButtonVisible && removeGridComponent ? (_jsx(ClosePaneButton, { removeGridComponent: removeGridComponent })) : null] })] }), _jsxs("div", { className: clsx(TOOLTIP_ANCESTOR, classes.card, {
|
|
70
70
|
[classes.scrollCard]: isScroll,
|
|
71
71
|
[classes.spatialCard]: isSpatial,
|
|
72
72
|
[classes.noScrollCard]: !isScroll && !isSpatial,
|
package/dist-tsc/VitS.d.ts
CHANGED
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
* @param {array} props.jointFileTypes Plugin joint file types.
|
|
31
31
|
* @param {array} props.coordinationTypes Plugin coordination types.
|
|
32
32
|
* @param {null|object} props.warning A warning to render within the Vitessce grid,
|
|
33
|
+
* @param {boolean} props.pageMode Whether to render in page mode. By default, false.
|
|
33
34
|
* provided by the parent.
|
|
34
35
|
*/
|
|
35
36
|
export function VitS(props: {
|
|
@@ -49,5 +50,6 @@ export function VitS(props: {
|
|
|
49
50
|
jointFileTypes: array;
|
|
50
51
|
coordinationTypes: array;
|
|
51
52
|
warning: null | object;
|
|
53
|
+
pageMode: boolean;
|
|
52
54
|
}): JSX.Element;
|
|
53
55
|
//# sourceMappingURL=VitS.d.ts.map
|
package/dist-tsc/VitS.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VitS.d.ts","sourceRoot":"","sources":["../src/VitS.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"VitS.d.ts","sourceRoot":"","sources":["../src/VitS.js"],"names":[],"mappings":"AA+BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,4BAhCG;IAAsB,MAAM,EAApB,MAAM;IAGkB,SAAS,EAAjC,SAAS,GAAC,MAAM;IACF,MAAM,EAApB,MAAM;IACQ,KAAK,EAAnB,MAAM;IAEU,MAAM;IACN,cAAc;IAEd,cAAc;IAEf,cAAc,EAA7B,OAAO;IAIQ,sBAAsB,EAArC,OAAO;IAGY,GAAG,EAAtB,IAAI,GAAC,MAAM;IAGI,kBAAkB,EAAjC,OAAO;IAEM,SAAS,EAAtB,KAAK;IACQ,SAAS,EAAtB,KAAK;IACQ,cAAc,EAA3B,KAAK;IACQ,iBAAiB,EAA9B,KAAK;IACc,OAAO,EAA1B,IAAI,GAAC,MAAM;IACI,QAAQ,EAAvB,OAAO;CAEjB,eA+MA"}
|
package/dist-tsc/VitS.js
CHANGED
|
@@ -12,6 +12,7 @@ import CallbackPublisher from './CallbackPublisher.js';
|
|
|
12
12
|
import { initialize, logConfig, } from './view-config-utils.js';
|
|
13
13
|
import { createLoaders } from './vitessce-grid-utils.js';
|
|
14
14
|
import { createGenerateClassName } from './mui-utils.js';
|
|
15
|
+
import { AsyncFunctionsContext } from './contexts.js';
|
|
15
16
|
/**
|
|
16
17
|
* The Vitessce component.
|
|
17
18
|
* @param {object} props
|
|
@@ -44,14 +45,20 @@ import { createGenerateClassName } from './mui-utils.js';
|
|
|
44
45
|
* @param {array} props.jointFileTypes Plugin joint file types.
|
|
45
46
|
* @param {array} props.coordinationTypes Plugin coordination types.
|
|
46
47
|
* @param {null|object} props.warning A warning to render within the Vitessce grid,
|
|
48
|
+
* @param {boolean} props.pageMode Whether to render in page mode. By default, false.
|
|
47
49
|
* provided by the parent.
|
|
48
50
|
*/
|
|
49
51
|
export function VitS(props) {
|
|
50
|
-
const { config, stores, rowHeight, height, theme, onWarn, onConfigChange, onLoaderChange, validateConfig = true, validateOnConfigChange = false, isBounded = false, uid = null, remountOnUidChange = true, viewTypes: viewTypesProp, fileTypes: fileTypesProp, jointFileTypes: jointFileTypesProp, coordinationTypes: coordinationTypesProp, warning, } = props;
|
|
52
|
+
const { config, stores, rowHeight, height, theme, onWarn, onConfigChange, onLoaderChange, validateConfig = true, validateOnConfigChange = false, isBounded = false, uid = null, remountOnUidChange = true, viewTypes: viewTypesProp, fileTypes: fileTypesProp, jointFileTypes: jointFileTypesProp, coordinationTypes: coordinationTypesProp, asyncFunctions: asyncFunctionsProp, warning, pageMode = false, children, } = props;
|
|
51
53
|
const viewTypes = useMemo(() => (viewTypesProp || []), [viewTypesProp]);
|
|
52
54
|
const fileTypes = useMemo(() => (fileTypesProp || []), [fileTypesProp]);
|
|
53
55
|
const jointFileTypes = useMemo(() => (jointFileTypesProp || []), [jointFileTypesProp]);
|
|
54
56
|
const coordinationTypes = useMemo(() => (coordinationTypesProp || []), [coordinationTypesProp]);
|
|
57
|
+
const asyncFunctions = useMemo(() => Object.fromEntries(
|
|
58
|
+
// Convert the array of PluginAsyncFunction instances to a mapping
|
|
59
|
+
// from function type strings to async functions.
|
|
60
|
+
asyncFunctionsProp?.map(p => ([p.functionType, p.asyncFunction]))
|
|
61
|
+
|| []), [asyncFunctionsProp]);
|
|
55
62
|
const generateClassName = useMemo(() => createGenerateClassName(uid), [uid]);
|
|
56
63
|
const configVersion = config?.version;
|
|
57
64
|
// If config.uid exists, then use it for hook dependencies to detect changes
|
|
@@ -144,5 +151,5 @@ export function VitS(props) {
|
|
|
144
151
|
return createViewConfigStore(null, null);
|
|
145
152
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
146
153
|
}, [success, configKey]);
|
|
147
|
-
return success ? (_jsx(StylesProvider, { generateClassName: generateClassName, children: _jsx(ThemeProvider, { theme: muiTheme[theme], children: _jsx(QueryClientProvider, { client: queryClient, children: _jsx(ViewConfigProvider, { createStore: createViewConfigStoreClosure, ...(remountOnUidChange ? ({ key: configKey }) : {}), children:
|
|
154
|
+
return success ? (_jsx(StylesProvider, { generateClassName: generateClassName, children: _jsx(ThemeProvider, { theme: muiTheme[theme], children: _jsx(QueryClientProvider, { client: queryClient, children: _jsx(ViewConfigProvider, { createStore: createViewConfigStoreClosure, ...(remountOnUidChange ? ({ key: configKey }) : {}), children: _jsx(AuxiliaryProvider, { createStore: createAuxiliaryStore, children: _jsxs(AsyncFunctionsContext.Provider, { value: asyncFunctions, children: [_jsx(VitessceGrid, { pageMode: pageMode, success: success, configKey: configKey, viewTypes: viewTypes, fileTypes: fileTypes, coordinationTypes: coordinationTypes, config: configOrWarning, rowHeight: rowHeight, height: height, theme: theme, isBounded: isBounded, stores: stores, children: children }), _jsx(CallbackPublisher, { onWarn: onWarn, onConfigChange: onConfigChange, onLoaderChange: onLoaderChange, validateOnConfigChange: validateOnConfigChange, pluginSpecificConfigSchema: pluginSpecificConfigSchema })] }) }) }) }) }) })) : (_jsx(StylesProvider, { generateClassName: generateClassName, children: _jsx(ThemeProvider, { theme: muiTheme[theme], children: _jsx(Warning, { ...configOrWarning }) }) }));
|
|
148
155
|
}
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
* @param {PluginViewType[]} props.viewTypes
|
|
10
10
|
* @param {PluginFileType[]} props.fileTypes
|
|
11
11
|
* @param {PluginCoordinationType[]} props.coordinationTypes
|
|
12
|
+
* @param {boolean} props.pageMode
|
|
12
13
|
*/
|
|
13
14
|
export default function VitessceGrid(props: {
|
|
14
15
|
rowHeight: number;
|
|
@@ -19,5 +20,6 @@ export default function VitessceGrid(props: {
|
|
|
19
20
|
viewTypes: PluginViewType[];
|
|
20
21
|
fileTypes: PluginFileType[];
|
|
21
22
|
coordinationTypes: PluginCoordinationType[];
|
|
23
|
+
pageMode: boolean;
|
|
22
24
|
}): JSX.Element;
|
|
23
25
|
//# sourceMappingURL=VitessceGrid.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VitessceGrid.d.ts","sourceRoot":"","sources":["../src/VitessceGrid.js"],"names":[],"mappings":"AA4BA
|
|
1
|
+
{"version":3,"file":"VitessceGrid.d.ts","sourceRoot":"","sources":["../src/VitessceGrid.js"],"names":[],"mappings":"AA4BA;;;;;;;;;;;;GAYG;AACH,4CAVG;IAAsB,SAAS,EAAvB,MAAM;IACQ,MAAM,EAApB,MAAM;IACQ,KAAK,EAAnB,MAAM;IACQ,MAAM,EAApB,MAAM;IACU,MAAM;IACE,SAAS,EAAjC,cAAc,EAAE;IACQ,SAAS,EAAjC,cAAc,EAAE;IACgB,iBAAiB,EAAjD,sBAAsB,EAAE;IACT,QAAQ,EAAvB,OAAO;CACjB,eAkGA"}
|
package/dist-tsc/VitessceGrid.js
CHANGED
|
@@ -22,9 +22,10 @@ const margin = 5;
|
|
|
22
22
|
* @param {PluginViewType[]} props.viewTypes
|
|
23
23
|
* @param {PluginFileType[]} props.fileTypes
|
|
24
24
|
* @param {PluginCoordinationType[]} props.coordinationTypes
|
|
25
|
+
* @param {boolean} props.pageMode
|
|
25
26
|
*/
|
|
26
27
|
export default function VitessceGrid(props) {
|
|
27
|
-
const { success, configKey, rowHeight: initialRowHeight, config, theme, height, isBounded, viewTypes, fileTypes, coordinationTypes, stores, } = props;
|
|
28
|
+
const { success, configKey, rowHeight: initialRowHeight, config, theme, height, isBounded, viewTypes, fileTypes, coordinationTypes, stores, pageMode, children, } = props;
|
|
28
29
|
const [rowHeight, containerRef] = useRowHeight(config, initialRowHeight, height, margin, padding);
|
|
29
30
|
const onResize = useEmitGridResize();
|
|
30
31
|
const [componentWidth] = useClosestVitessceContainerSize(containerRef);
|
|
@@ -61,5 +62,5 @@ export default function VitessceGrid(props) {
|
|
|
61
62
|
setLoaders(newLoaders);
|
|
62
63
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
63
64
|
}, [success, configKey]);
|
|
64
|
-
return (_jsx("div", { ref: containerRef, className: clsx(VITESSCE_CONTAINER, classes.vitessceContainer), role: "group", "aria-label": altText, children: layout ? (_jsx(VitessceGridLayout, { role: "group", layout: layout, height: height, rowHeight: rowHeight, theme: theme, viewTypes: viewTypes, draggableHandle: titleClasses.title, margin: margin, padding: padding, onRemoveComponent: removeComponent, onLayoutChange: changeLayoutPostMount, isBounded: isBounded, onResize: onResize, onResizeStop: onResize })) : null }));
|
|
65
|
+
return (_jsx("div", { ref: containerRef, className: clsx(VITESSCE_CONTAINER, classes.vitessceContainer), role: "group", "aria-label": altText, children: layout ? (_jsx(VitessceGridLayout, { pageMode: pageMode, role: "group", layout: layout, height: height, rowHeight: rowHeight, theme: theme, viewTypes: viewTypes, draggableHandle: titleClasses.title, margin: margin, padding: padding, onRemoveComponent: removeComponent, onLayoutChange: changeLayoutPostMount, isBounded: isBounded, onResize: onResize, onResizeStop: onResize, children: children })) : null }));
|
|
65
66
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contexts.d.ts","sourceRoot":"","sources":["../src/contexts.js"],"names":[],"mappings":"AAQA,yDAGC;AARD,wCAGG"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/* eslint-disable react-refresh/only-export-components */
|
|
2
|
+
import { createContext, useContext } from 'react';
|
|
3
|
+
export const AsyncFunctionsContext = createContext({
|
|
4
|
+
// This will be an object where keys are function types
|
|
5
|
+
// (as strings) and values are the async functions.
|
|
6
|
+
});
|
|
7
|
+
export function useAsyncFunction(functionType) {
|
|
8
|
+
const context = useContext(AsyncFunctionsContext);
|
|
9
|
+
return context?.[functionType];
|
|
10
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractLoader.d.ts","sourceRoot":"","sources":["../../src/data/AbstractLoader.js"],"names":[],"mappings":"AAGA,sDAAsD;AAEtD;;;GAGG;AACH;IACE;;;OAGG;IACH,
|
|
1
|
+
{"version":3,"file":"AbstractLoader.d.ts","sourceRoot":"","sources":["../../src/data/AbstractLoader.js"],"names":[],"mappings":"AAGA,sDAAsD;AAEtD;;;GAGG;AACH;IACE;;;OAGG;IACH,gFAFW,YAAY,EAgBtB;IANC,iBAAwB;IACxB,aAAgB;IAChB,wBAAc;IACd,qCAA8B;IAC9B,aAAsB;IACtB;;kBAA4C;IAG9C;;;OAGG;IAEH,QAHa,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAOtC;CACF;yBAvCwB,mBAAmB;kCAEV,iBAAiB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractTwoStepLoader.d.ts","sourceRoot":"","sources":["../../src/data/AbstractTwoStepLoader.js"],"names":[],"mappings":"AAGA,sDAAsD;AAEtD;;GAEG;AACH,
|
|
1
|
+
{"version":3,"file":"AbstractTwoStepLoader.d.ts","sourceRoot":"","sources":["../../src/data/AbstractTwoStepLoader.js"],"names":[],"mappings":"AAGA,sDAAsD;AAEtD;;GAEG;AACH,2CAFa,cAAc;IAGzB;;;;OAIG;IACH,wBAHW,cAAc,UACd,YAAY,EAKtB;IADC,2BAA4B;CAE/B;2BAjB0B,qBAAqB;kCAEd,iBAAiB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LoaderResult.d.ts","sourceRoot":"","sources":["../../src/data/LoaderResult.js"],"names":[],"mappings":"AAEA;;GAEG;AACH,
|
|
1
|
+
{"version":3,"file":"LoaderResult.d.ts","sourceRoot":"","sources":["../../src/data/LoaderResult.js"],"names":[],"mappings":"AAEA;;GAEG;AACH,kCAFmB,cAAc;IAG/B;;;;;OAKG;IACH,kBALW,cAAc,OACd,MAAM,EAAE,GAAC,MAAM,GAAC,IAAI,uBACpB,MAAM,GAAC,IAAI,gBACX,WAAW,GAAC,IAAI,EAO1B;IAJC,qBAAgB;IAChB,8BAAc;IACd,kCAA4C;IAC5C,gCAA8B;CAEjC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader-registry.d.ts","sourceRoot":"","sources":["../../src/data/loader-registry.js"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,qDAJW,MAAM,aACN,
|
|
1
|
+
{"version":3,"file":"loader-registry.d.ts","sourceRoot":"","sources":["../../src/data/loader-registry.js"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,qDAJW,MAAM,aACN,cAAc,EAAE,GACd,KAAK,CAajB;AAED,wEAQC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-hook-utils.d.ts","sourceRoot":"","sources":["../src/data-hook-utils.js"],"names":[],"mappings":"AAiBA;;;;GAIG;AACH,4BAFW,mBAAmB,yBAS7B;AAED;;;;;;;;;;GAUG;AACH,8CATW,MAAM,WAGN,MAAM,iBAGN,MAAM,QAiBhB;AAGD,oDAuBC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,oDAhBW,MAAM,WAEN,MAAM,cAEN,OAAO,uBAEP,MAAM,6BAGN,MAAM,
|
|
1
|
+
{"version":3,"file":"data-hook-utils.d.ts","sourceRoot":"","sources":["../src/data-hook-utils.js"],"names":[],"mappings":"AAiBA;;;;GAIG;AACH,4BAFW,mBAAmB,yBAS7B;AAED;;;;;;;;;;GAUG;AACH,8CATW,MAAM,WAGN,MAAM,iBAGN,MAAM,QAiBhB;AAGD,oDAuBC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,oDAhBW,MAAM,WAEN,MAAM,cAEN,OAAO,uBAEP,MAAM,6BAGN,MAAM,iBAGJ,KAAK,CAiDjB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,yDAhBW,MAAM,WAEN,MAAM,cAEN,OAAO,uBAEP,MAAM,6BAGN,MAAM,0DAGJ,KAAK,CAsFjB;AAED,+FAGC;oCArPM,mBAAmB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-hooks-multilevel-utils.d.ts","sourceRoot":"","sources":["../src/data-hooks-multilevel-utils.js"],"names":[],"mappings":"AA+CA;;;;;;;;;;;;;GAaG;AACH,mEAPW,MAAM,cACN,MAAM,SACN,MAAM,WACN,MAAM,YACN,MAAM,wBAmBhB;AA8BD;;;;;;;;;;;;GAYG;AACH,gEANW,MAAM,SACN,MAAM,WACN,MAAM,YACN,MAAM,wBAiBhB;AA+BD;;;;;;;;;;;;GAYG;AACH,mDANW,MAAM,SACN,MAAM,WACN,MAAM,YACN,MAAM,wBAiBhB;AAuBD;;;;;;;;;;GAUG;AACH,oDALW,MAAM,EAAE,WACR,MAAM,+BAOhB;AAED;;;;;;GAMG;AACH,
|
|
1
|
+
{"version":3,"file":"data-hooks-multilevel-utils.d.ts","sourceRoot":"","sources":["../src/data-hooks-multilevel-utils.js"],"names":[],"mappings":"AA+CA;;;;;;;;;;;;;GAaG;AACH,mEAPW,MAAM,cACN,MAAM,SACN,MAAM,WACN,MAAM,YACN,MAAM,wBAmBhB;AA8BD;;;;;;;;;;;;GAYG;AACH,gEANW,MAAM,SACN,MAAM,WACN,MAAM,YACN,MAAM,wBAiBhB;AA+BD;;;;;;;;;;;;GAYG;AACH,mDANW,MAAM,SACN,MAAM,WACN,MAAM,YACN,MAAM,wBAiBhB;AAuBD;;;;;;;;;;GAUG;AACH,oDALW,MAAM,EAAE,WACR,MAAM,+BAOhB;AAED;;;;;;GAMG;AACH,sEALW,KAAK,oBACL,KAAK,MAcf;AAED;;;;;;GAMG;AACH,sDALW,KAAK,oBACL,KAAK,MAgBf;AA+DD,gJA6DC;AAuCD,sIAuDC;AAyDD,2HAQC;AAED,sHAQC;AAED,wHAQC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-hooks.d.ts","sourceRoot":"","sources":["../src/data-hooks.js"],"names":[],"mappings":"AAkBA;;;;;;;;GAQG;AACH,wCAPW,MAAM,WAEN,MAAM,
|
|
1
|
+
{"version":3,"file":"data-hooks.d.ts","sourceRoot":"","sources":["../src/data-hooks.js"],"names":[],"mappings":"AAkBA;;;;;;;;GAQG;AACH,wCAPW,MAAM,WAEN,MAAM,GAEJ,KAAK,CAoBjB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,6CAhBW,MAAM,WAEN,MAAM,cAEN,OAAO,uBAEP,MAAM,6BAGN,MAAM,iBAGJ,KAAK,CAajB;AAED,4JASC;AAED,6JASC;AAED,gKASC;AAED,6JASC;AAED,oKASC;AAED,2JASC;AAED,8JASC;AAED,+JASC;AAED,oKASC;AAED,iKASC;AAED,yJASC;AAED,mKASC;AAED,iKASC;AAED;;;;;;;;;;;;;GAaG;AACH,6CAVW,MAAM,WAEN,MAAM,cAEN,OAAO,aAEP,OAAO,iBACL,KAAK,CAiFjB;AAED;;;;;;;;;;;;;GAaG;AACH,oDARW,MAAM,WAEN,MAAM,cAEN,OAAO,iBAEL,MAAM,CA2ElB;AAED,+JAuBC;AAED,8JAuBC;AAED,2HAsBC;AAGD,iIAsBC;AAGD,4GAmBC;AAED,sKA2BC;AAED,4JAyBC"}
|
package/dist-tsc/data-hooks.js
CHANGED
|
@@ -156,10 +156,12 @@ export function useFeatureSelection(loaders, dataset, isRequired, selection, mat
|
|
|
156
156
|
const anyLoading = featureQueries.some(q => q.isFetching);
|
|
157
157
|
const anyError = featureQueries.some(q => q.isError);
|
|
158
158
|
// eslint-disable-next-line no-nested-ternary
|
|
159
|
-
const dataStatus = anyLoading
|
|
159
|
+
const dataStatus = anyLoading
|
|
160
|
+
? STATUS.LOADING
|
|
161
|
+
: (anyError ? STATUS.ERROR : STATUS.SUCCESS);
|
|
160
162
|
const isSuccess = dataStatus === STATUS.SUCCESS;
|
|
161
|
-
const geneData = isSuccess ? featureQueries.map(q => q.data?.data || null) : null;
|
|
162
|
-
const loadedGeneName = isSuccess ? featureQueries.map(q => q.data?.dataKey || null) : null;
|
|
163
|
+
const geneData = useMemo(() => (isSuccess ? featureQueries.map(q => q.data?.data || null) : null), [isSuccess, selection, dataset]);
|
|
164
|
+
const loadedGeneName = useMemo(() => (isSuccess ? featureQueries.map(q => q.data?.dataKey || null) : null), [isSuccess, selection, dataset]);
|
|
163
165
|
useEffect(() => {
|
|
164
166
|
featureQueries
|
|
165
167
|
.map(q => q.error)
|
package/dist-tsc/hooks.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.js"],"names":[],"mappings":"AAkBA,oDAOC;AAED;;;;GAIG;AACH,
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.js"],"names":[],"mappings":"AAkBA,oDAOC;AAED;;;;GAIG;AACH,uCAHa,KAAK,CAmBjB;AAED;;;;GAIG;AACH,mCAHa,KAAK,CAoCjB;AAED;;;;;GAKG;AACH,qCAJa,KAAK,CAqCjB;AAED;;;;;;GAMG;AACH,uCAHW,MAAM,EAAE,GACN,OAAO,CAOnB;AAED;;;;GAIG;AACH,8BAHW,CAAC,IAAI,GAAC,MAAM,EAAE,CAAC,EAAE,GACf,KAAK,CAYjB;AAED;;;;;;GAMG;AACH,qDAJW,GAAG,GACD,KAAK,CA0BjB;AAED;;;;;;;;;;GAUG;AACH,+DARG;IAAuB,gBAAgB,EAA/B,MAAM;CAEd,GAAU,KAAK,CAmBjB;AAED;;;;;;;;;;GAUG;AACH,yDARW,KAAK,GAAC,IAAI,GAIR,KAAK,CAmBjB;AAED;;;;QA2BC;AAED,iEAOC;AAED,kHA4BC"}
|
package/dist-tsc/index.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ export { TitleInfo } from "./TitleInfo.js";
|
|
|
3
3
|
export { PopperMenu } from "./shared-mui/components.js";
|
|
4
4
|
export { useHasLoader } from "./data-hook-utils.js";
|
|
5
5
|
export { logConfig } from "./view-config-utils.js";
|
|
6
|
+
export { useAsyncFunction } from "./contexts.js";
|
|
6
7
|
export { useReady, useUrls, useVitessceContainer, useDeckCanvasSize, useUint8ObsFeatureMatrix, useUint8FeatureSelection, useExpressionValueGetter, useGetObsMembership, useGetObsInfo, useClosestVitessceContainerSize, useWindowDimensions, useGridItemSize } from "./hooks.js";
|
|
7
8
|
export { useCoordinationScopes, useCoordinationScopesBy, useInitialCoordination, useCoordination, useComplexCoordination, useComplexCoordinationSecondary, useMultiCoordinationScopes, useMultiCoordinationScopesNonNull, useMultiCoordinationScopesSecondary, useMultiCoordinationScopesSecondaryNonNull, useMultiCoordinationValues, useMultiDatasetCoordination, useDatasetUids, useLoaders, useMergeCoordination, useMatchingLoader, useViewConfigStore, useViewConfigStoreApi, useComponentHover, useSetComponentHover, useComponentViewInfo, useSetComponentViewInfo, useWarning, useSetWarning, useAuxiliaryCoordination, useComponentLayout, useRemoveImageChannelInMetaCoordinationScopes, useAddImageChannelInMetaCoordinationScopes } from "./state/hooks.js";
|
|
8
9
|
export { useDescription, useImageData, useObsSetsData, useObsEmbeddingData, useFeatureSelection, useObsFeatureMatrixIndices, useSampleSetsData, useSampleEdgesData, useMultiObsLabels, useMultiObsSpots, useMultiObsPoints, useSpotMultiObsSets, useSpotMultiFeatureLabels, useMultiObsSegmentations, useMultiImages, useObsSpotsData, useObsPointsData, useObsLocationsData, useObsSegmentationsData, useNeighborhoodsData, useObsLabelsData, useObsFeatureMatrixData, useFeatureLabelsData, useGenomicProfilesData } from "./data-hooks.js";
|
package/dist-tsc/index.js
CHANGED
|
@@ -11,3 +11,4 @@ export { AbstractLoader, AbstractTwoStepLoader, LoaderResult, } from './data/ind
|
|
|
11
11
|
export { AbstractLoaderError, DatasetNotFoundError, LoaderNotFoundError, LoaderValidationError, DataSourceFetchError, } from './errors/index.js';
|
|
12
12
|
export { CellColorEncodingOption, OptionsContainer, OptionSelect, usePlotOptionsStyles, } from './shared-plot-options/index.js';
|
|
13
13
|
export { logConfig } from './view-config-utils.js';
|
|
14
|
+
export { useAsyncFunction } from './contexts.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/state/hooks.js"],"names":[],"mappings":"AAmCA;;;;;;GAMG;AACH,
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/state/hooks.js"],"names":[],"mappings":"AAmCA;;;;;;GAMG;AACH,8CAJW,GAAC,mBAEC,MAAM,GAAC,SAAS,CA4B5B;AAED;;;;;;;GAOG;AACH,gDALW,GAAC,wBACD,GAAC,qBAEC,MAAM,GAAC,SAAS,CA0C5B;AAED;;;;;GAKG;AACH,6CAJW,MAAM,sBACN,GAAC,GACC,MAAM,GAAC,SAAS,CAI5B;AAED;;;;;;GAMG;AACH,+CALW,MAAM,mDACN,GAAC,wBACD,GAAC,GACC,MAAM,GAAC,SAAS,CAc5B;AA4RD;;;;;;;;;GASG;AACH,mDALW,MAAM,EAAE,sBACR,MAAM,GAEJ,MAAM,CAclB;AAED;;;;;;;;;;;;;;;GAeG;AACH,4CATW,MAAM,EAAE,sBACR,MAAM,GAEJ,KAAK,CAmCjB;AAED,yFAKC;AAED,gGAqBC;AAED,0IA4BC;AAED,iJAkEC;AAED,yFAmBC;AAED;;;;GAIG;AACH,mDAHW,MAAM,GACJ,MAAM,CAIlB;AAED;;;;;;;;;;;;;GAaG;AACH,mDAXW,MAAM,EAAE,sBACR,MAAM,wBACN,MAAM,UAEN,MAAM,GAEJ,KAAK,CA2EjB;AAED;;;;;GAKG;AACH,0DAHW,MAAM,GACJ,MAAM,CAiBlB;AAED;;;;;;GAMG;AACH,4DAJW,MAAM,wBACN,MAAM,GACJ,MAAM,CAgBlB;AAED;;;;;;;GAOG;AACH,4DANW,MAAM,EAAE,iDACR,MAAM,eACN,MAAM,iBACN,MAAM,SAuEhB;AAGD;;;;;;;;;;;GAWG;AACH,wDATW,MAAM,EAAE,sBACR,MAAM,wBACN,MAAM,GAEJ,KAAK,CAUjB;AA6BD;;;;;;;;;;;;;;;GAeG;AACH,qDATW,MAAM,EAAE,sBACR,MAAM,GAEJ,KAAK,CAgCjB;AAED;;;;;GAKG;AACH,8BAHa,MAAM,CAKlB;AAGD;;;;;;;;;;;;GAYG;AACH,2CARW,MAAM,WACN,MAAM,YACN,MAAM,0BACN,MAAM,OAoBhB;AAED;;;;;;;;;;;;GAYG;AACH,2CARW,MAAM,WACN,MAAM,YACN,MAAM,0BACN,MAAM,OAShB;AAED;;;;;GAKG;AACH,6BAHa,MAAM,EAAE,CAKpB;AAED;;;;;GAKG;AACH,+CAEC;AAED;;;;;GAKG;AACH,0EAEC;AAED;;;;;GAKG;AACH,uEAEC;AAED;;;;;GAKG;AACH,4CAEC;AAED;;;;;GAKG;AACH,0CAEC;AAED;;;;;GAKG;AACH,iDAEC;AAED;;;;;GAKG;AACH,oEAIC;AAED;;;;;GAKG;AACH,qCAHa,MAAM,CAKlB;AAED;;;;;GAKG;AACH,iDAEC;AAED;;;;;GAKG;AACH,8BAHa,MAAM,CAKlB;AAED;;;;;GAKG;AACH,0CAEC;AAED;;;;;GAKG;AACH,iDAHa,MAAM,CAKlB;AAED;;;;;GAKG;AACH,6DAOC;AAED;;;;GAIG;AACH,iCAFa,MAAM,CAIlB;AAED;;;;;GAKG;AACH,8CAEC;AA5oCD;;;;+NAA0D;AAC1D,sFAA0D;AAC1D;;;;;EAAgE;AAOhE;;;;+NAAwD;AACxD,qFAAwD;AAiIjD,yFA+KJ;AAOI,0FAFM,MAAM,CAOlB;AAcM,iDAUJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spatial-reducers.d.ts","sourceRoot":"","sources":["../../src/state/spatial-reducers.js"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AACH,
|
|
1
|
+
{"version":3,"file":"spatial-reducers.d.ts","sourceRoot":"","sources":["../../src/state/spatial-reducers.js"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AACH,iDALW,GAAC,qBACD,GAAC,aACD,MAAM,GACJ,MAAM,GAAC,SAAS,CAuB5B;AAED;;;;;;;;;;GAUG;AACH,mDAPW,GAAC,qBACD,GAAC,eACD,MAAM,aACN,MAAM,WACN,MAAM,GACJ,MAAM,GAAC,SAAS,CAuB5B;AAGD,8JA4DC;AAED,wIA6JC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view-config-utils.d.ts","sourceRoot":"","sources":["../src/view-config-utils.js"],"names":[],"mappings":"AASA,wDAKC;AAED;;;;;;;;GAQG;AACH,6DALW,MAAM,oBACN,MAAM,GAEJ,MAAM,EAAE,CAMpB;AAyND;;;;;;;;;;;;;;GAcG;AACH,mCANW,MAAM,kBACN,
|
|
1
|
+
{"version":3,"file":"view-config-utils.d.ts","sourceRoot":"","sources":["../src/view-config-utils.js"],"names":[],"mappings":"AASA,wDAKC;AAED;;;;;;;;GAQG;AACH,6DALW,MAAM,oBACN,MAAM,GAEJ,MAAM,EAAE,CAMpB;AAyND;;;;;;;;;;;;;;GAcG;AACH,mCANW,MAAM,kBACN,mBAAmB,EAAE,qBACrB,sBAAsB,EAAE,aACxB,cAAc,EAAE;;;EAY1B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VitessceGridLayout.d.ts","sourceRoot":"","sources":["../../src/vitessce-grid-layout/VitessceGridLayout.js"],"names":[],"mappings":"AAeA,
|
|
1
|
+
{"version":3,"file":"VitessceGridLayout.d.ts","sourceRoot":"","sources":["../../src/vitessce-grid-layout/VitessceGridLayout.js"],"names":[],"mappings":"AAeA,oDA8LC"}
|
|
@@ -12,7 +12,7 @@ class ResponsiveHeightGridLayout extends ResponsiveGridLayout {
|
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
14
|
export function VitessceGridLayout(props) {
|
|
15
|
-
const { layout, viewTypes, padding, margin: marginProp, draggableHandle: draggableHandleClass, onResize, onResizeStop, rowHeight, theme, height, onRemoveComponent, onLayoutChange: onLayoutChangeProp, isBounded, } = props;
|
|
15
|
+
const { layout, viewTypes, padding, margin: marginProp, draggableHandle: draggableHandleClass, onResize, onResizeStop, rowHeight, theme, height, onRemoveComponent, onLayoutChange: onLayoutChangeProp, isBounded, pageMode, children, } = props;
|
|
16
16
|
const getComponent = useCallback((viewType) => {
|
|
17
17
|
if (Array.isArray(viewTypes)) {
|
|
18
18
|
const matchingViewType = viewTypes.find(v => v.name === viewType);
|
|
@@ -97,16 +97,38 @@ export function VitessceGridLayout(props) {
|
|
|
97
97
|
const saveCurrentLayouts = useCallback(() => {
|
|
98
98
|
setLastValidGridLayouts(gridLayouts);
|
|
99
99
|
}, [gridLayouts]);
|
|
100
|
-
const layoutChildren = useMemo(() =>
|
|
101
|
-
const
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
100
|
+
const layoutChildren = useMemo(() => {
|
|
101
|
+
const gridComponentsValues = Object.values(gridComponents);
|
|
102
|
+
if (pageMode) {
|
|
103
|
+
// This is pageMode, so we render based on the children.
|
|
104
|
+
return children.map((child) => {
|
|
105
|
+
const childId = child.props.id;
|
|
106
|
+
const v = gridComponentsValues.find(el => el.uid === childId);
|
|
107
|
+
if (!v) {
|
|
108
|
+
// The child did not map to any view in the config, so return as-is.
|
|
109
|
+
return child;
|
|
110
|
+
}
|
|
111
|
+
// The child mapped to a view in the config,
|
|
112
|
+
// so we want to render the corresponding component as a subchild.
|
|
113
|
+
const Component = getComponent(v.component);
|
|
114
|
+
return React.cloneElement(child, { key: v.uid }, (_jsx("div", { style: { display: 'flex', flexDirection: 'column', height: '100%' }, children: _jsx(Component, { ...v.props, uuid: v.uid, coordinationScopes: v.coordinationScopes, coordinationScopesBy: v.coordinationScopesBy, theme: theme, removeGridComponent: null }) })));
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
// Not pageMode, so no children to render.
|
|
118
|
+
// We render the grid components based on the layout information.
|
|
119
|
+
return gridComponentsValues.map((v) => {
|
|
120
|
+
const Component = getComponent(v.component);
|
|
121
|
+
const removeGridComponent = () => {
|
|
122
|
+
onRemoveComponent(v.uid);
|
|
123
|
+
};
|
|
124
|
+
return (_jsx("div", { children: _jsx(Component, { ...v.props, uuid: v.uid, coordinationScopes: v.coordinationScopes, coordinationScopesBy: v.coordinationScopesBy, theme: theme, removeGridComponent: removeGridComponent }) }, v.uid));
|
|
125
|
+
});
|
|
126
|
+
}, [gridComponents, getComponent, onRemoveComponent, theme]);
|
|
127
|
+
return (pageMode
|
|
128
|
+
? layoutChildren
|
|
129
|
+
: ((gridLayouts && gridComponents && gridBreakpoints && gridCols) && (_jsxs(_Fragment, { children: [style, _jsx(ResponsiveHeightGridLayout, { className: "layout", cols: gridCols, layouts: tempGridLayouts || gridLayouts, breakpoints: gridBreakpoints, height: height, rowHeight: rowHeight
|
|
130
|
+
|| ((window.innerHeight - 2 * padding - (maxRows - 1) * margin)
|
|
131
|
+
/ maxRows), containerPadding: containerPadding, margin: margin, draggableHandle: draggableHandle, onLayoutChange: onLayoutChange, isBounded: isBounded, onResizeStart: saveCurrentLayouts, onDragStart: saveCurrentLayouts, onResize: onResize, onResizeStop: onResizeStop, children: layoutChildren })] }))));
|
|
110
132
|
}
|
|
111
133
|
VitessceGridLayout.defaultProps = {
|
|
112
134
|
padding: 10,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vitessce-grid-utils.d.ts","sourceRoot":"","sources":["../src/vitessce-grid-utils.js"],"names":[],"mappings":"AAyCA,gHA6CC;AA4BD;;;;;;;;;;GAUG;AACH,wCATW,MAAM,EAAE,qBACR,MAAM,aAEN,
|
|
1
|
+
{"version":3,"file":"vitessce-grid-utils.d.ts","sourceRoot":"","sources":["../src/vitessce-grid-utils.js"],"names":[],"mappings":"AAyCA,gHA6CC;AA4BD;;;;;;;;;;GAUG;AACH,wCATW,MAAM,EAAE,qBACR,MAAM,aAEN,cAAc,EAAE,qBAChB,sBAAsB,EAAE,UACxB,MAAM,GACJ,MAAM,CA6DlB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vitessce/vit-s",
|
|
3
|
-
"version": "3.4.
|
|
3
|
+
"version": "3.4.7",
|
|
4
4
|
"author": "Gehlenborg Lab",
|
|
5
5
|
"homepage": "http://vitessce.io",
|
|
6
6
|
"repository": {
|
|
@@ -29,11 +29,12 @@
|
|
|
29
29
|
"uuid": "^9.0.0",
|
|
30
30
|
"zustand": "^3.5.10",
|
|
31
31
|
"react-aria": "^3.28.0",
|
|
32
|
-
"@vitessce/
|
|
33
|
-
"@vitessce/
|
|
34
|
-
"@vitessce/
|
|
35
|
-
"@vitessce/
|
|
36
|
-
"@vitessce/
|
|
32
|
+
"@vitessce/constants-internal": "3.4.7",
|
|
33
|
+
"@vitessce/plugins": "3.4.7",
|
|
34
|
+
"@vitessce/schemas": "3.4.7",
|
|
35
|
+
"@vitessce/utils": "3.4.7",
|
|
36
|
+
"@vitessce/sets-utils": "3.4.7",
|
|
37
|
+
"@vitessce/config": "3.4.7"
|
|
37
38
|
},
|
|
38
39
|
"devDependencies": {
|
|
39
40
|
"@testing-library/jest-dom": "^5.16.4",
|
|
@@ -41,7 +42,7 @@
|
|
|
41
42
|
"react": "^18.0.0",
|
|
42
43
|
"vite": "^4.3.0",
|
|
43
44
|
"vitest": "^0.32.2",
|
|
44
|
-
"@vitessce/types": "3.4.
|
|
45
|
+
"@vitessce/types": "3.4.7"
|
|
45
46
|
},
|
|
46
47
|
"peerDependencies": {
|
|
47
48
|
"react": "^16.8.0 || ^17.0.0 || ^18.0.0"
|
package/src/TitleInfo.js
CHANGED
package/src/VitS.js
CHANGED
|
@@ -26,6 +26,7 @@ import {
|
|
|
26
26
|
} from './view-config-utils.js';
|
|
27
27
|
import { createLoaders } from './vitessce-grid-utils.js';
|
|
28
28
|
import { createGenerateClassName } from './mui-utils.js';
|
|
29
|
+
import { AsyncFunctionsContext } from './contexts.js';
|
|
29
30
|
|
|
30
31
|
|
|
31
32
|
/**
|
|
@@ -60,6 +61,7 @@ import { createGenerateClassName } from './mui-utils.js';
|
|
|
60
61
|
* @param {array} props.jointFileTypes Plugin joint file types.
|
|
61
62
|
* @param {array} props.coordinationTypes Plugin coordination types.
|
|
62
63
|
* @param {null|object} props.warning A warning to render within the Vitessce grid,
|
|
64
|
+
* @param {boolean} props.pageMode Whether to render in page mode. By default, false.
|
|
63
65
|
* provided by the parent.
|
|
64
66
|
*/
|
|
65
67
|
export function VitS(props) {
|
|
@@ -81,7 +83,10 @@ export function VitS(props) {
|
|
|
81
83
|
fileTypes: fileTypesProp,
|
|
82
84
|
jointFileTypes: jointFileTypesProp,
|
|
83
85
|
coordinationTypes: coordinationTypesProp,
|
|
86
|
+
asyncFunctions: asyncFunctionsProp,
|
|
84
87
|
warning,
|
|
88
|
+
pageMode = false,
|
|
89
|
+
children,
|
|
85
90
|
} = props;
|
|
86
91
|
|
|
87
92
|
const viewTypes = useMemo(() => (viewTypesProp || []), [viewTypesProp]);
|
|
@@ -94,6 +99,15 @@ export function VitS(props) {
|
|
|
94
99
|
() => (coordinationTypesProp || []),
|
|
95
100
|
[coordinationTypesProp],
|
|
96
101
|
);
|
|
102
|
+
const asyncFunctions = useMemo(
|
|
103
|
+
() => Object.fromEntries(
|
|
104
|
+
// Convert the array of PluginAsyncFunction instances to a mapping
|
|
105
|
+
// from function type strings to async functions.
|
|
106
|
+
asyncFunctionsProp?.map(p => ([p.functionType, p.asyncFunction]))
|
|
107
|
+
|| [],
|
|
108
|
+
),
|
|
109
|
+
[asyncFunctionsProp],
|
|
110
|
+
);
|
|
97
111
|
|
|
98
112
|
const generateClassName = useMemo(() => createGenerateClassName(uid), [uid]);
|
|
99
113
|
|
|
@@ -219,26 +233,31 @@ export function VitS(props) {
|
|
|
219
233
|
{...(remountOnUidChange ? ({ key: configKey }) : {})}
|
|
220
234
|
>
|
|
221
235
|
<AuxiliaryProvider createStore={createAuxiliaryStore}>
|
|
222
|
-
<
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
236
|
+
<AsyncFunctionsContext.Provider value={asyncFunctions}>
|
|
237
|
+
<VitessceGrid
|
|
238
|
+
pageMode={pageMode}
|
|
239
|
+
success={success}
|
|
240
|
+
configKey={configKey}
|
|
241
|
+
viewTypes={viewTypes}
|
|
242
|
+
fileTypes={fileTypes}
|
|
243
|
+
coordinationTypes={coordinationTypes}
|
|
244
|
+
config={configOrWarning}
|
|
245
|
+
rowHeight={rowHeight}
|
|
246
|
+
height={height}
|
|
247
|
+
theme={theme}
|
|
248
|
+
isBounded={isBounded}
|
|
249
|
+
stores={stores}
|
|
250
|
+
>
|
|
251
|
+
{children}
|
|
252
|
+
</VitessceGrid>
|
|
253
|
+
<CallbackPublisher
|
|
254
|
+
onWarn={onWarn}
|
|
255
|
+
onConfigChange={onConfigChange}
|
|
256
|
+
onLoaderChange={onLoaderChange}
|
|
257
|
+
validateOnConfigChange={validateOnConfigChange}
|
|
258
|
+
pluginSpecificConfigSchema={pluginSpecificConfigSchema}
|
|
259
|
+
/>
|
|
260
|
+
</AsyncFunctionsContext.Provider>
|
|
242
261
|
</AuxiliaryProvider>
|
|
243
262
|
</ViewConfigProvider>
|
|
244
263
|
</QueryClientProvider>
|
package/src/VitessceGrid.js
CHANGED
|
@@ -37,6 +37,7 @@ const margin = 5;
|
|
|
37
37
|
* @param {PluginViewType[]} props.viewTypes
|
|
38
38
|
* @param {PluginFileType[]} props.fileTypes
|
|
39
39
|
* @param {PluginCoordinationType[]} props.coordinationTypes
|
|
40
|
+
* @param {boolean} props.pageMode
|
|
40
41
|
*/
|
|
41
42
|
export default function VitessceGrid(props) {
|
|
42
43
|
const {
|
|
@@ -51,6 +52,8 @@ export default function VitessceGrid(props) {
|
|
|
51
52
|
fileTypes,
|
|
52
53
|
coordinationTypes,
|
|
53
54
|
stores,
|
|
55
|
+
pageMode,
|
|
56
|
+
children,
|
|
54
57
|
} = props;
|
|
55
58
|
|
|
56
59
|
const [rowHeight, containerRef] = useRowHeight(config, initialRowHeight, height, margin, padding);
|
|
@@ -112,6 +115,7 @@ export default function VitessceGrid(props) {
|
|
|
112
115
|
>
|
|
113
116
|
{layout ? (
|
|
114
117
|
<VitessceGridLayout
|
|
118
|
+
pageMode={pageMode}
|
|
115
119
|
role="group"
|
|
116
120
|
layout={layout}
|
|
117
121
|
height={height}
|
|
@@ -126,7 +130,9 @@ export default function VitessceGrid(props) {
|
|
|
126
130
|
isBounded={isBounded}
|
|
127
131
|
onResize={onResize}
|
|
128
132
|
onResizeStop={onResize}
|
|
129
|
-
|
|
133
|
+
>
|
|
134
|
+
{children}
|
|
135
|
+
</VitessceGridLayout>
|
|
130
136
|
) : null}
|
|
131
137
|
</div>
|
|
132
138
|
);
|
package/src/contexts.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/* eslint-disable react-refresh/only-export-components */
|
|
2
|
+
import { createContext, useContext } from 'react';
|
|
3
|
+
|
|
4
|
+
export const AsyncFunctionsContext = createContext({
|
|
5
|
+
// This will be an object where keys are function types
|
|
6
|
+
// (as strings) and values are the async functions.
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
export function useAsyncFunction(functionType) {
|
|
10
|
+
const context = useContext(AsyncFunctionsContext);
|
|
11
|
+
return context?.[functionType];
|
|
12
|
+
}
|
package/src/data-hooks.js
CHANGED
|
@@ -288,10 +288,16 @@ export function useFeatureSelection(
|
|
|
288
288
|
const anyLoading = featureQueries.some(q => q.isFetching);
|
|
289
289
|
const anyError = featureQueries.some(q => q.isError);
|
|
290
290
|
// eslint-disable-next-line no-nested-ternary
|
|
291
|
-
const dataStatus = anyLoading
|
|
291
|
+
const dataStatus = anyLoading
|
|
292
|
+
? STATUS.LOADING
|
|
293
|
+
: (anyError ? STATUS.ERROR : STATUS.SUCCESS);
|
|
292
294
|
const isSuccess = dataStatus === STATUS.SUCCESS;
|
|
293
|
-
const geneData =
|
|
294
|
-
|
|
295
|
+
const geneData = useMemo(() => (
|
|
296
|
+
isSuccess ? featureQueries.map(q => q.data?.data || null) : null
|
|
297
|
+
), [isSuccess, selection, dataset]);
|
|
298
|
+
const loadedGeneName = useMemo(() => (
|
|
299
|
+
isSuccess ? featureQueries.map(q => q.data?.dataKey || null) : null
|
|
300
|
+
), [isSuccess, selection, dataset]);
|
|
295
301
|
|
|
296
302
|
useEffect(() => {
|
|
297
303
|
featureQueries
|
package/src/index.js
CHANGED
|
@@ -20,6 +20,7 @@ export function VitessceGridLayout(props) {
|
|
|
20
20
|
onResize, onResizeStop, rowHeight, theme, height,
|
|
21
21
|
onRemoveComponent, onLayoutChange: onLayoutChangeProp,
|
|
22
22
|
isBounded,
|
|
23
|
+
pageMode, children,
|
|
23
24
|
} = props;
|
|
24
25
|
|
|
25
26
|
const getComponent = useCallback((viewType) => {
|
|
@@ -121,56 +122,87 @@ export function VitessceGridLayout(props) {
|
|
|
121
122
|
setLastValidGridLayouts(gridLayouts);
|
|
122
123
|
}, [gridLayouts]);
|
|
123
124
|
|
|
124
|
-
const layoutChildren = useMemo(() =>
|
|
125
|
-
const
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
125
|
+
const layoutChildren = useMemo(() => {
|
|
126
|
+
const gridComponentsValues = Object.values(gridComponents);
|
|
127
|
+
if (pageMode) {
|
|
128
|
+
// This is pageMode, so we render based on the children.
|
|
129
|
+
return children.map((child) => {
|
|
130
|
+
const childId = child.props.id;
|
|
131
|
+
const v = gridComponentsValues.find(el => el.uid === childId);
|
|
132
|
+
if (!v) {
|
|
133
|
+
// The child did not map to any view in the config, so return as-is.
|
|
134
|
+
return child;
|
|
135
|
+
}
|
|
136
|
+
// The child mapped to a view in the config,
|
|
137
|
+
// so we want to render the corresponding component as a subchild.
|
|
138
|
+
const Component = getComponent(v.component);
|
|
139
|
+
return React.cloneElement(child, { key: v.uid }, (
|
|
140
|
+
<div style={{ display: 'flex', flexDirection: 'column', height: '100%' }}>
|
|
141
|
+
<Component
|
|
142
|
+
{... v.props}
|
|
143
|
+
uuid={v.uid}
|
|
144
|
+
coordinationScopes={v.coordinationScopes}
|
|
145
|
+
coordinationScopesBy={v.coordinationScopesBy}
|
|
146
|
+
theme={theme}
|
|
147
|
+
removeGridComponent={null}
|
|
148
|
+
/>
|
|
149
|
+
</div>
|
|
150
|
+
));
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
// Not pageMode, so no children to render.
|
|
154
|
+
// We render the grid components based on the layout information.
|
|
155
|
+
return gridComponentsValues.map((v) => {
|
|
156
|
+
const Component = getComponent(v.component);
|
|
157
|
+
const removeGridComponent = () => {
|
|
158
|
+
onRemoveComponent(v.uid);
|
|
159
|
+
};
|
|
160
|
+
return (
|
|
161
|
+
<div key={v.uid}>
|
|
162
|
+
<Component
|
|
163
|
+
{... v.props}
|
|
164
|
+
uuid={v.uid}
|
|
165
|
+
coordinationScopes={v.coordinationScopes}
|
|
166
|
+
coordinationScopesBy={v.coordinationScopesBy}
|
|
167
|
+
theme={theme}
|
|
168
|
+
removeGridComponent={removeGridComponent}
|
|
169
|
+
/>
|
|
170
|
+
</div>
|
|
171
|
+
);
|
|
172
|
+
});
|
|
173
|
+
}, [gridComponents, getComponent, onRemoveComponent, theme]);
|
|
174
|
+
|
|
175
|
+
return (pageMode
|
|
176
|
+
? layoutChildren
|
|
177
|
+
: ((gridLayouts && gridComponents && gridBreakpoints && gridCols) && (
|
|
178
|
+
<>
|
|
179
|
+
{style}
|
|
180
|
+
<ResponsiveHeightGridLayout
|
|
181
|
+
className="layout"
|
|
182
|
+
cols={gridCols}
|
|
183
|
+
layouts={tempGridLayouts || gridLayouts}
|
|
184
|
+
breakpoints={gridBreakpoints}
|
|
185
|
+
height={height}
|
|
186
|
+
rowHeight={
|
|
155
187
|
rowHeight
|
|
156
188
|
|| (
|
|
157
189
|
(window.innerHeight - 2 * padding - (maxRows - 1) * margin)
|
|
158
190
|
/ maxRows
|
|
159
191
|
)}
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
192
|
+
containerPadding={containerPadding}
|
|
193
|
+
margin={margin}
|
|
194
|
+
draggableHandle={draggableHandle}
|
|
195
|
+
onLayoutChange={onLayoutChange}
|
|
196
|
+
isBounded={isBounded}
|
|
197
|
+
onResizeStart={saveCurrentLayouts}
|
|
198
|
+
onDragStart={saveCurrentLayouts}
|
|
199
|
+
onResize={onResize}
|
|
200
|
+
onResizeStop={onResizeStop}
|
|
201
|
+
>
|
|
202
|
+
{layoutChildren}
|
|
203
|
+
</ResponsiveHeightGridLayout>
|
|
204
|
+
</>
|
|
205
|
+
)));
|
|
174
206
|
}
|
|
175
207
|
|
|
176
208
|
VitessceGridLayout.defaultProps = {
|