@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.
Files changed (37) hide show
  1. package/dist/index.js +199 -85
  2. package/dist-tsc/CallbackPublisher.d.ts.map +1 -1
  3. package/dist-tsc/TitleInfo.js +1 -1
  4. package/dist-tsc/VitS.d.ts +2 -0
  5. package/dist-tsc/VitS.d.ts.map +1 -1
  6. package/dist-tsc/VitS.js +9 -2
  7. package/dist-tsc/VitessceGrid.d.ts +2 -0
  8. package/dist-tsc/VitessceGrid.d.ts.map +1 -1
  9. package/dist-tsc/VitessceGrid.js +3 -2
  10. package/dist-tsc/contexts.d.ts +3 -0
  11. package/dist-tsc/contexts.d.ts.map +1 -0
  12. package/dist-tsc/contexts.js +10 -0
  13. package/dist-tsc/data/AbstractLoader.d.ts.map +1 -1
  14. package/dist-tsc/data/AbstractTwoStepLoader.d.ts.map +1 -1
  15. package/dist-tsc/data/LoaderResult.d.ts.map +1 -1
  16. package/dist-tsc/data/loader-registry.d.ts.map +1 -1
  17. package/dist-tsc/data-hook-utils.d.ts.map +1 -1
  18. package/dist-tsc/data-hooks-multilevel-utils.d.ts.map +1 -1
  19. package/dist-tsc/data-hooks.d.ts.map +1 -1
  20. package/dist-tsc/data-hooks.js +5 -3
  21. package/dist-tsc/hooks.d.ts.map +1 -1
  22. package/dist-tsc/index.d.ts +1 -0
  23. package/dist-tsc/index.js +1 -0
  24. package/dist-tsc/state/hooks.d.ts.map +1 -1
  25. package/dist-tsc/state/spatial-reducers.d.ts.map +1 -1
  26. package/dist-tsc/view-config-utils.d.ts.map +1 -1
  27. package/dist-tsc/vitessce-grid-layout/VitessceGridLayout.d.ts.map +1 -1
  28. package/dist-tsc/vitessce-grid-layout/VitessceGridLayout.js +33 -11
  29. package/dist-tsc/vitessce-grid-utils.d.ts.map +1 -1
  30. package/package.json +8 -7
  31. package/src/TitleInfo.js +1 -1
  32. package/src/VitS.js +39 -20
  33. package/src/VitessceGrid.js +7 -1
  34. package/src/contexts.js +12 -0
  35. package/src/data-hooks.js +9 -3
  36. package/src/index.js +1 -0
  37. 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 = /[0-9A-HJKMNP-TV-Z]{26}/;
21597
- const uuidRegex = /^([a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}|00000000-0000-0000-0000-000000000000)$/i;
21598
- const emailRegex = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[(((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}))\])|(\[IPv6:(([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})))\])|([A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])*(\.[A-Za-z]{2,})+))$/;
21599
- const emojiRegex = /^(\p{Extended_Pictographic}|\p{Emoji_Component})+$/u;
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
- return OK(async (...args) => {
23781
+ const me = this;
23782
+ return OK(async function(...args) {
23757
23783
  const error = new ZodError([]);
23758
- const parsedArgs = await this._def.args.parseAsync(args, params).catch((e) => {
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(...parsedArgs);
23763
- const parsedReturns = await this._def.returns._def.type.parseAsync(result, params).catch((e) => {
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
- return OK((...args) => {
23771
- const parsedArgs = this._def.args.safeParse(args, params);
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(...parsedArgs.data);
23776
- const parsedReturns = this._def.returns.safeParse(result, params);
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 (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]]).toLowerCase();
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.6";
28138
- const date = "2024-05-24";
28197
+ const version = "3.4.7";
28198
+ const date = "2024-07-25";
28139
28199
  const branch = "changeset-release/main";
28140
- const hash = "fa783284";
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(() => Object.values(gridComponents).map((v) => {
36674
- const Component = getComponent(v.component);
36675
- const removeGridComponent = () => {
36676
- onRemoveComponent(v.uid);
36677
- };
36678
- return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: /* @__PURE__ */ jsxRuntimeExports.jsx(
36679
- Component,
36680
- {
36681
- ...v.props,
36682
- uuid: v.uid,
36683
- coordinationScopes: v.coordinationScopes,
36684
- coordinationScopesBy: v.coordinationScopesBy,
36685
- theme,
36686
- removeGridComponent
36687
- }
36688
- ) }, v.uid);
36689
- }), [gridComponents, getComponent, onRemoveComponent, theme]);
36690
- return gridLayouts && gridComponents && gridBreakpoints && gridCols && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
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
- warning: warning2
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.jsxs(AuxiliaryProvider, { createStore: createAuxiliaryStore, children: [
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;IAP2B,cAAc;IAEd,cAAc;IAEf,sBAAsB,EAArC,OAAO;SAoDjB"}
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"}
@@ -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,
@@ -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
@@ -1 +1 @@
1
- {"version":3,"file":"VitS.d.ts","sourceRoot":"","sources":["../src/VitS.js"],"names":[],"mappings":"AA8BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH;IA/ByB,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;IACT,SAAS;IACT,cAAc;IACd,iBAAiB;IACX,OAAO,EAA1B,IAAI,GAAC,MAAM;gBAgMrB"}
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: _jsxs(AuxiliaryProvider, { createStore: createAuxiliaryStore, children: [_jsx(VitessceGrid, { success: success, configKey: configKey, viewTypes: viewTypes, fileTypes: fileTypes, coordinationTypes: coordinationTypes, config: configOrWarning, rowHeight: rowHeight, height: height, theme: theme, isBounded: isBounded, stores: stores }), _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 }) }) }));
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;;;;;;;;;;;GAWG;AACH;IATyB,SAAS,EAAvB,MAAM;IACQ,MAAM,EAApB,MAAM;IACQ,KAAK,EAAnB,MAAM;IACQ,MAAM,EAApB,MAAM;IACU,MAAM;IACE,SAAS,EAAjC,gBAAgB;IACQ,SAAS,EAAjC,gBAAgB;IACgB,iBAAiB,EAAjD,wBAAwB;gBA8FlC"}
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"}
@@ -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,3 @@
1
+ export function useAsyncFunction(functionType: any): any;
2
+ export const AsyncFunctionsContext: any;
3
+ //# sourceMappingURL=contexts.d.ts.map
@@ -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,8FAcC;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
+ {"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,2CAGa,cAAc;IAFzB;;;;OAIG;IACH,wBAHW,cAAc,wBAMxB;IADC,2BAA4B;CAE/B;2BAjB0B,qBAAqB;kCAEd,iBAAiB"}
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,kCAEa,cAAc;IADzB;;;;;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
+ {"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,gBAAgB,SAc1B;AAED,wEAQC"}
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,uBAoDhB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,yDAhBW,MAAM,WAEN,MAAM,cAEN,OAAO,uBAEP,MAAM,6BAGN,MAAM,gEAyFhB;AAED,+FAGC;oCArPM,mBAAmB"}
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,0GAUC;AAED;;;;;;GAMG;AACH,0FAYC;AA+DD,gJA6DC;AAuCD,sIAuDC;AAyDD,2HAQC;AAED,sHAQC;AAED,wHAQC"}
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,SAsBhB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,6CAhBW,MAAM,WAEN,MAAM,cAEN,OAAO,uBAEP,MAAM,6BAGN,MAAM,uBAgBhB;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,uBA4EjB;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"}
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"}
@@ -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 ? STATUS.LOADING : (anyError ? STATUS.ERROR : STATUS.SUCCESS);
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)
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.js"],"names":[],"mappings":"AAkBA,oDAOC;AAED;;;;GAIG;AACH,6CAgBC;AAED;;;;GAIG;AACH,yCAiCC;AAED;;;;;GAKG;AACH,2CAiCC;AAED;;;;;;GAMG;AACH,uCAHW,MAAM,EAAE,GACN,OAAO,CAOnB;AAED;;;;GAIG;AACH,8BAHW,CAAC,IAAI,GAAC,MAAM,EAAE,CAAC,EAAE,SAa3B;AAED;;;;;;GAMG;AACH,iEAuBC;AAED;;;;;;;;;;GAUG;AACH;IAR0B,gBAAgB,EAA/B,MAAM;UAqBhB;AAED;;;;;;;;;;GAUG;AACH,yDARW,QAAM,IAAI,SAuBpB;AAED;;;;QA2BC;AAED,iEAOC;AAED,kHA4BC"}
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"}
@@ -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,oEAFa,MAAM,GAAC,SAAS,CA4B5B;AAED;;;;;;;GAOG;AACH,mGAFa,MAAM,GAAC,SAAS,CA0C5B;AAED;;;;;GAKG;AACH,6CAJW,MAAM,4BAEJ,MAAM,GAAC,SAAS,CAI5B;AAED;;;;;;GAMG;AACH,+CALW,MAAM,oFAGJ,MAAM,GAAC,SAAS,CAc5B;AA4RD;;;;;;;;;GASG;AACH,mDALW,MAAM,EAAE,sBACR,MAAM,GAEJ,MAAM,CAclB;AAED;;;;;;;;;;;;;;;GAeG;AACH,4CATW,MAAM,EAAE,sBACR,MAAM,SAqChB;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,SA6EhB;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,SAYhB;AA6BD;;;;;;;;;;;;;;;GAeG;AACH,qDATW,MAAM,EAAE,sBACR,MAAM,SAkChB;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
+ {"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,yFAHW,MAAM,GACJ,MAAM,GAAC,SAAS,CAuB5B;AAED;;;;;;;;;;GAUG;AACH,6FALW,MAAM,aACN,MAAM,WACN,MAAM,GACJ,MAAM,GAAC,SAAS,CAuB5B;AAGD,8JA4DC;AAED,wIA6JC"}
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,qBAAqB,qBACrB,wBAAwB,aACxB,gBAAgB;;;EAY1B"}
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,oDA8JC"}
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(() => Object.values(gridComponents).map((v) => {
101
- const Component = getComponent(v.component);
102
- const removeGridComponent = () => {
103
- onRemoveComponent(v.uid);
104
- };
105
- return (_jsx("div", { children: _jsx(Component, { ...v.props, uuid: v.uid, coordinationScopes: v.coordinationScopes, coordinationScopesBy: v.coordinationScopesBy, theme: theme, removeGridComponent: removeGridComponent }) }, v.uid));
106
- }), [gridComponents, getComponent, onRemoveComponent, theme]);
107
- return (gridLayouts && gridComponents && gridBreakpoints && gridCols) && (_jsxs(_Fragment, { children: [style, _jsx(ResponsiveHeightGridLayout, { className: "layout", cols: gridCols, layouts: tempGridLayouts || gridLayouts, breakpoints: gridBreakpoints, height: height, rowHeight: rowHeight
108
- || ((window.innerHeight - 2 * padding - (maxRows - 1) * margin)
109
- / maxRows), containerPadding: containerPadding, margin: margin, draggableHandle: draggableHandle, onLayoutChange: onLayoutChange, isBounded: isBounded, onResizeStart: saveCurrentLayouts, onDragStart: saveCurrentLayouts, onResize: onResize, onResizeStop: onResizeStop, children: layoutChildren })] }));
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,gBAAgB,qBAChB,wBAAwB,UACxB,MAAM,GACJ,MAAM,CA6DlB"}
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.6",
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/plugins": "3.4.6",
33
- "@vitessce/schemas": "3.4.6",
34
- "@vitessce/utils": "3.4.6",
35
- "@vitessce/constants-internal": "3.4.6",
36
- "@vitessce/config": "3.4.6"
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.6"
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
@@ -150,7 +150,7 @@ export function TitleInfo(props) {
150
150
  urls={urls}
151
151
  />
152
152
  ) : null}
153
- {closeButtonVisible ? (
153
+ {closeButtonVisible && removeGridComponent ? (
154
154
  <ClosePaneButton
155
155
  removeGridComponent={removeGridComponent}
156
156
  />
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
- <VitessceGrid
223
- success={success}
224
- configKey={configKey}
225
- viewTypes={viewTypes}
226
- fileTypes={fileTypes}
227
- coordinationTypes={coordinationTypes}
228
- config={configOrWarning}
229
- rowHeight={rowHeight}
230
- height={height}
231
- theme={theme}
232
- isBounded={isBounded}
233
- stores={stores}
234
- />
235
- <CallbackPublisher
236
- onWarn={onWarn}
237
- onConfigChange={onConfigChange}
238
- onLoaderChange={onLoaderChange}
239
- validateOnConfigChange={validateOnConfigChange}
240
- pluginSpecificConfigSchema={pluginSpecificConfigSchema}
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>
@@ -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
  );
@@ -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 ? STATUS.LOADING : (anyError ? STATUS.ERROR : STATUS.SUCCESS);
291
+ const dataStatus = anyLoading
292
+ ? STATUS.LOADING
293
+ : (anyError ? STATUS.ERROR : STATUS.SUCCESS);
292
294
  const isSuccess = dataStatus === STATUS.SUCCESS;
293
- const geneData = isSuccess ? featureQueries.map(q => q.data?.data || null) : null;
294
- const loadedGeneName = isSuccess ? featureQueries.map(q => q.data?.dataKey || null) : null;
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
@@ -105,3 +105,4 @@ export {
105
105
  usePlotOptionsStyles,
106
106
  } from './shared-plot-options/index.js';
107
107
  export { logConfig } from './view-config-utils.js';
108
+ export { useAsyncFunction } from './contexts.js';
@@ -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(() => Object.values(gridComponents).map((v) => {
125
- const Component = getComponent(v.component);
126
-
127
- const removeGridComponent = () => {
128
- onRemoveComponent(v.uid);
129
- };
130
-
131
- return (
132
- <div key={v.uid}>
133
- <Component
134
- {... v.props}
135
- uuid={v.uid}
136
- coordinationScopes={v.coordinationScopes}
137
- coordinationScopesBy={v.coordinationScopesBy}
138
- theme={theme}
139
- removeGridComponent={removeGridComponent}
140
- />
141
- </div>
142
- );
143
- }), [gridComponents, getComponent, onRemoveComponent, theme]);
144
-
145
- return (gridLayouts && gridComponents && gridBreakpoints && gridCols) && (
146
- <>
147
- {style}
148
- <ResponsiveHeightGridLayout
149
- className="layout"
150
- cols={gridCols}
151
- layouts={tempGridLayouts || gridLayouts}
152
- breakpoints={gridBreakpoints}
153
- height={height}
154
- rowHeight={
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
- containerPadding={containerPadding}
161
- margin={margin}
162
- draggableHandle={draggableHandle}
163
- onLayoutChange={onLayoutChange}
164
- isBounded={isBounded}
165
- onResizeStart={saveCurrentLayouts}
166
- onDragStart={saveCurrentLayouts}
167
- onResize={onResize}
168
- onResizeStop={onResizeStop}
169
- >
170
- {layoutChildren}
171
- </ResponsiveHeightGridLayout>
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 = {