@jbrowse/plugin-linear-genome-view 2.1.7 → 2.2.0

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 (109) hide show
  1. package/dist/BaseLinearDisplay/components/LinearBlocks.d.ts +2 -2
  2. package/dist/BaseLinearDisplay/components/ServerSideRenderedBlockContent.js +2 -22
  3. package/dist/BaseLinearDisplay/components/ServerSideRenderedBlockContent.js.map +1 -1
  4. package/dist/BaseLinearDisplay/models/BaseLinearDisplayModel.d.ts +146 -1
  5. package/dist/BaseLinearDisplay/models/BaseLinearDisplayModel.js +600 -464
  6. package/dist/BaseLinearDisplay/models/BaseLinearDisplayModel.js.map +1 -1
  7. package/dist/BaseLinearDisplay/models/baseLinearDisplayConfigSchema.js +19 -1
  8. package/dist/BaseLinearDisplay/models/baseLinearDisplayConfigSchema.js.map +1 -1
  9. package/dist/BasicTrack/configSchema.d.ts +3 -0
  10. package/dist/BasicTrack/configSchema.js +18 -0
  11. package/dist/BasicTrack/configSchema.js.map +1 -0
  12. package/dist/BasicTrack/index.d.ts +3 -0
  13. package/dist/BasicTrack/index.js +18 -0
  14. package/dist/BasicTrack/index.js.map +1 -0
  15. package/dist/FeatureTrack/configSchema.d.ts +3 -0
  16. package/dist/FeatureTrack/configSchema.js +21 -0
  17. package/dist/FeatureTrack/configSchema.js.map +1 -0
  18. package/dist/FeatureTrack/index.d.ts +3 -0
  19. package/dist/FeatureTrack/index.js +18 -0
  20. package/dist/FeatureTrack/index.js.map +1 -0
  21. package/dist/LinearBareDisplay/configSchema.d.ts +5 -1
  22. package/dist/LinearBareDisplay/configSchema.js +12 -1
  23. package/dist/LinearBareDisplay/configSchema.js.map +1 -1
  24. package/dist/LinearBareDisplay/model.d.ts +16 -0
  25. package/dist/LinearBareDisplay/model.js +16 -0
  26. package/dist/LinearBareDisplay/model.js.map +1 -1
  27. package/dist/LinearBasicDisplay/configSchema.d.ts +5 -1
  28. package/dist/LinearBasicDisplay/configSchema.js +16 -1
  29. package/dist/LinearBasicDisplay/configSchema.js.map +1 -1
  30. package/dist/LinearBasicDisplay/model.d.ts +77 -6
  31. package/dist/LinearBasicDisplay/model.js +167 -111
  32. package/dist/LinearBasicDisplay/model.js.map +1 -1
  33. package/dist/LinearGenomeView/components/ImportForm.js +34 -28
  34. package/dist/LinearGenomeView/components/ImportForm.js.map +1 -1
  35. package/dist/LinearGenomeView/components/LinearGenomeView.js +1 -21
  36. package/dist/LinearGenomeView/components/LinearGenomeView.js.map +1 -1
  37. package/dist/LinearGenomeView/components/LinearGenomeViewSvg.js +7 -5
  38. package/dist/LinearGenomeView/components/LinearGenomeViewSvg.js.map +1 -1
  39. package/dist/LinearGenomeView/components/OverviewScaleBar.d.ts +26 -34
  40. package/dist/LinearGenomeView/index.d.ts +189 -15
  41. package/dist/LinearGenomeView/index.js +266 -27
  42. package/dist/LinearGenomeView/index.js.map +1 -1
  43. package/dist/index.d.ts +12 -84
  44. package/dist/index.js +4 -25
  45. package/dist/index.js.map +1 -1
  46. package/esm/BaseLinearDisplay/components/LinearBlocks.d.ts +2 -2
  47. package/esm/BaseLinearDisplay/components/ServerSideRenderedBlockContent.js +2 -22
  48. package/esm/BaseLinearDisplay/components/ServerSideRenderedBlockContent.js.map +1 -1
  49. package/esm/BaseLinearDisplay/models/BaseLinearDisplayModel.d.ts +146 -1
  50. package/esm/BaseLinearDisplay/models/BaseLinearDisplayModel.js +600 -464
  51. package/esm/BaseLinearDisplay/models/BaseLinearDisplayModel.js.map +1 -1
  52. package/esm/BaseLinearDisplay/models/baseLinearDisplayConfigSchema.js +19 -1
  53. package/esm/BaseLinearDisplay/models/baseLinearDisplayConfigSchema.js.map +1 -1
  54. package/esm/BasicTrack/configSchema.d.ts +3 -0
  55. package/esm/BasicTrack/configSchema.js +16 -0
  56. package/esm/BasicTrack/configSchema.js.map +1 -0
  57. package/esm/BasicTrack/index.d.ts +3 -0
  58. package/esm/BasicTrack/index.js +13 -0
  59. package/esm/BasicTrack/index.js.map +1 -0
  60. package/esm/FeatureTrack/configSchema.d.ts +3 -0
  61. package/esm/FeatureTrack/configSchema.js +19 -0
  62. package/esm/FeatureTrack/configSchema.js.map +1 -0
  63. package/esm/FeatureTrack/index.d.ts +3 -0
  64. package/esm/FeatureTrack/index.js +13 -0
  65. package/esm/FeatureTrack/index.js.map +1 -0
  66. package/esm/LinearBareDisplay/configSchema.d.ts +5 -1
  67. package/esm/LinearBareDisplay/configSchema.js +14 -2
  68. package/esm/LinearBareDisplay/configSchema.js.map +1 -1
  69. package/esm/LinearBareDisplay/model.d.ts +16 -0
  70. package/esm/LinearBareDisplay/model.js +16 -0
  71. package/esm/LinearBareDisplay/model.js.map +1 -1
  72. package/esm/LinearBasicDisplay/configSchema.d.ts +5 -1
  73. package/esm/LinearBasicDisplay/configSchema.js +18 -2
  74. package/esm/LinearBasicDisplay/configSchema.js.map +1 -1
  75. package/esm/LinearBasicDisplay/model.d.ts +77 -6
  76. package/esm/LinearBasicDisplay/model.js +167 -111
  77. package/esm/LinearBasicDisplay/model.js.map +1 -1
  78. package/esm/LinearGenomeView/components/ImportForm.js +36 -30
  79. package/esm/LinearGenomeView/components/ImportForm.js.map +1 -1
  80. package/esm/LinearGenomeView/components/LinearGenomeView.js +2 -22
  81. package/esm/LinearGenomeView/components/LinearGenomeView.js.map +1 -1
  82. package/esm/LinearGenomeView/components/LinearGenomeViewSvg.js +7 -5
  83. package/esm/LinearGenomeView/components/LinearGenomeViewSvg.js.map +1 -1
  84. package/esm/LinearGenomeView/components/OverviewScaleBar.d.ts +26 -34
  85. package/esm/LinearGenomeView/index.d.ts +189 -15
  86. package/esm/LinearGenomeView/index.js +266 -27
  87. package/esm/LinearGenomeView/index.js.map +1 -1
  88. package/esm/index.d.ts +12 -84
  89. package/esm/index.js +4 -25
  90. package/esm/index.js.map +1 -1
  91. package/package.json +2 -2
  92. package/src/BaseLinearDisplay/components/ServerSideRenderedBlockContent.tsx +2 -24
  93. package/src/BaseLinearDisplay/models/BaseLinearDisplayModel.tsx +695 -555
  94. package/src/BaseLinearDisplay/models/baseLinearDisplayConfigSchema.ts +20 -1
  95. package/src/BasicTrack/configSchema.ts +23 -0
  96. package/src/BasicTrack/index.ts +22 -0
  97. package/src/FeatureTrack/configSchema.ts +27 -0
  98. package/src/FeatureTrack/index.ts +21 -0
  99. package/src/LinearBareDisplay/configSchema.ts +15 -2
  100. package/src/LinearBareDisplay/model.ts +16 -0
  101. package/src/LinearBasicDisplay/configSchema.ts +19 -2
  102. package/src/LinearBasicDisplay/model.ts +63 -11
  103. package/src/LinearGenomeView/components/ImportForm.tsx +79 -63
  104. package/src/LinearGenomeView/components/LinearGenomeView.tsx +2 -26
  105. package/src/LinearGenomeView/components/LinearGenomeViewSvg.tsx +21 -18
  106. package/src/LinearGenomeView/components/__snapshots__/LinearGenomeView.test.tsx.snap +204 -204
  107. package/src/LinearGenomeView/index.test.ts +33 -26
  108. package/src/LinearGenomeView/index.tsx +317 -60
  109. package/src/index.ts +6 -46
@@ -29,7 +29,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
29
29
  exports.BaseLinearDisplay = void 0;
30
30
  /* eslint-disable @typescript-eslint/no-explicit-any */
31
31
  const react_1 = __importDefault(require("react"));
32
- const TooLargeMessage_1 = __importDefault(require("./TooLargeMessage"));
33
32
  const models_1 = require("@jbrowse/core/pluggableElementTypes/models");
34
33
  const configuration_1 = require("@jbrowse/core/configuration");
35
34
  const util_1 = require("@jbrowse/core/util");
@@ -40,6 +39,8 @@ const mobx_1 = require("mobx");
40
39
  const mobx_state_tree_1 = require("mobx-state-tree");
41
40
  // icons
42
41
  const MenuOpen_1 = __importDefault(require("@mui/icons-material/MenuOpen"));
42
+ // locals
43
+ const TooLargeMessage_1 = __importDefault(require("./TooLargeMessage"));
43
44
  const BaseLinearDisplay_1 = require("../components/BaseLinearDisplay");
44
45
  const serverSideRenderedBlock_1 = __importStar(require("./serverSideRenderedBlock"));
45
46
  // stabilize clipid under test for snapshot
@@ -62,492 +63,627 @@ function getDisplayStr(totalBytes) {
62
63
  }
63
64
  const minDisplayHeight = 20;
64
65
  const defaultDisplayHeight = 100;
65
- exports.BaseLinearDisplay = mobx_state_tree_1.types
66
- .compose('BaseLinearDisplay', models_1.BaseDisplay, mobx_state_tree_1.types.model({
67
- height: mobx_state_tree_1.types.optional(mobx_state_tree_1.types.refinement('displayHeight', mobx_state_tree_1.types.number, n => n >= minDisplayHeight), defaultDisplayHeight),
68
- blockState: mobx_state_tree_1.types.map(serverSideRenderedBlock_1.default),
69
- userBpPerPxLimit: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.number),
70
- userByteSizeLimit: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.number),
71
- }))
72
- .volatile(() => ({
73
- currBpPerPx: 0,
74
- message: '',
75
- featureIdUnderMouse: undefined,
76
- contextMenuFeature: undefined,
77
- scrollTop: 0,
78
- estimatedRegionStatsP: undefined,
79
- estimatedRegionStats: undefined,
80
- }))
81
- .views(self => ({
82
- get blockType() {
83
- return 'staticBlocks';
84
- },
85
- get blockDefinitions() {
86
- const { blockType } = this;
87
- const view = (0, util_1.getContainingView)(self);
88
- if (!view.initialized) {
89
- throw new Error('view not initialized yet');
90
- }
91
- return view[blockType];
92
- },
93
- }))
94
- .views(self => ({
95
- /**
96
- * how many milliseconds to wait for the display to
97
- * "settle" before re-rendering a block
98
- */
99
- get renderDelay() {
100
- return 50;
101
- },
102
- get TooltipComponent() {
103
- return BaseLinearDisplay_1.Tooltip;
104
- },
105
- /**
106
- * returns a string feature ID if the globally-selected object
107
- * is probably a feature
108
- */
109
- get selectedFeatureId() {
110
- if ((0, mobx_state_tree_1.isAlive)(self)) {
111
- const { selection } = (0, util_1.getSession)(self);
112
- // does it quack like a feature?
113
- if ((0, simpleFeature_1.isFeature)(selection)) {
114
- return selection.id();
66
+ /**
67
+ * #stateModel BaseLinearDisplay
68
+ * extends `BaseDisplay`
69
+ */
70
+ function stateModelFactory() {
71
+ return mobx_state_tree_1.types
72
+ .compose('BaseLinearDisplay', models_1.BaseDisplay, mobx_state_tree_1.types.model({
73
+ /**
74
+ * #property
75
+ */
76
+ height: mobx_state_tree_1.types.optional(mobx_state_tree_1.types.refinement('displayHeight', mobx_state_tree_1.types.number, n => n >= minDisplayHeight), defaultDisplayHeight),
77
+ /**
78
+ * #property
79
+ * updated via autorun
80
+ */
81
+ blockState: mobx_state_tree_1.types.map(serverSideRenderedBlock_1.default),
82
+ /**
83
+ * #property
84
+ */
85
+ userBpPerPxLimit: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.number),
86
+ /**
87
+ * #property
88
+ */
89
+ userByteSizeLimit: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.number),
90
+ }))
91
+ .volatile(() => ({
92
+ currBpPerPx: 0,
93
+ message: '',
94
+ featureIdUnderMouse: undefined,
95
+ contextMenuFeature: undefined,
96
+ scrollTop: 0,
97
+ estimatedRegionStatsP: undefined,
98
+ estimatedRegionStats: undefined,
99
+ }))
100
+ .views(self => ({
101
+ /**
102
+ * #getter
103
+ */
104
+ get blockType() {
105
+ return 'staticBlocks';
106
+ },
107
+ /**
108
+ * #getter
109
+ */
110
+ get blockDefinitions() {
111
+ const { blockType } = this;
112
+ const view = (0, util_1.getContainingView)(self);
113
+ if (!view.initialized) {
114
+ throw new Error('view not initialized yet');
115
115
  }
116
- }
117
- return undefined;
118
- },
119
- /**
120
- * if a display-level message should be displayed instead of the blocks,
121
- * make this return a react component
122
- */
123
- get DisplayMessageComponent() {
124
- return undefined;
125
- },
126
- }))
127
- .views(self => ({
128
- /**
129
- * a CompositeMap of `featureId -> feature obj` that
130
- * just looks in all the block data for that feature
131
- */
132
- get features() {
133
- const featureMaps = [];
134
- for (const block of self.blockState.values()) {
135
- if (block && block.features) {
136
- featureMaps.push(block.features);
116
+ return view[blockType];
117
+ },
118
+ }))
119
+ .views(self => ({
120
+ /**
121
+ * #getter
122
+ * how many milliseconds to wait for the display to
123
+ * "settle" before re-rendering a block
124
+ */
125
+ get renderDelay() {
126
+ return 50;
127
+ },
128
+ /**
129
+ * #getter
130
+ */
131
+ get TooltipComponent() {
132
+ return BaseLinearDisplay_1.Tooltip;
133
+ },
134
+ /**
135
+ * #getter
136
+ * returns a string feature ID if the globally-selected object
137
+ * is probably a feature
138
+ */
139
+ get selectedFeatureId() {
140
+ if ((0, mobx_state_tree_1.isAlive)(self)) {
141
+ const { selection } = (0, util_1.getSession)(self);
142
+ // does it quack like a feature?
143
+ if ((0, simpleFeature_1.isFeature)(selection)) {
144
+ return selection.id();
145
+ }
137
146
  }
138
- }
139
- return new compositeMap_1.default(featureMaps);
140
- },
141
- get featureUnderMouse() {
142
- const feat = self.featureIdUnderMouse;
143
- return feat ? this.features.get(feat) : undefined;
144
- },
145
- getFeatureOverlapping(blockKey, x, y) {
146
- var _a, _b;
147
- return (_b = (_a = self.blockState.get(blockKey)) === null || _a === void 0 ? void 0 : _a.layout) === null || _b === void 0 ? void 0 : _b.getByCoord(x, y);
148
- },
149
- getFeatureByID(blockKey, id) {
150
- var _a, _b;
151
- return (_b = (_a = self.blockState.get(blockKey)) === null || _a === void 0 ? void 0 : _a.layout) === null || _b === void 0 ? void 0 : _b.getByID(id);
152
- },
153
- // if block key is not supplied, can look at all blocks
154
- searchFeatureByID(id) {
155
- let ret;
156
- self.blockState.forEach(block => {
157
- var _a;
158
- const val = (_a = block === null || block === void 0 ? void 0 : block.layout) === null || _a === void 0 ? void 0 : _a.getByID(id);
159
- if (val) {
160
- ret = val;
147
+ return undefined;
148
+ },
149
+ /**
150
+ * #getter
151
+ * if a display-level message should be displayed instead of the blocks,
152
+ * make this return a react component
153
+ */
154
+ get DisplayMessageComponent() {
155
+ return undefined;
156
+ },
157
+ }))
158
+ .views(self => ({
159
+ /**
160
+ * #getter
161
+ * a CompositeMap of `featureId -> feature obj` that
162
+ * just looks in all the block data for that feature
163
+ */
164
+ get features() {
165
+ const featureMaps = [];
166
+ for (const block of self.blockState.values()) {
167
+ if (block && block.features) {
168
+ featureMaps.push(block.features);
169
+ }
161
170
  }
162
- });
163
- return ret;
164
- },
165
- get currentBytesRequested() {
166
- var _a;
167
- return ((_a = self.estimatedRegionStats) === null || _a === void 0 ? void 0 : _a.bytes) || 0;
168
- },
169
- get currentFeatureScreenDensity() {
170
- var _a;
171
- const view = (0, util_1.getContainingView)(self);
172
- return (((_a = self.estimatedRegionStats) === null || _a === void 0 ? void 0 : _a.featureDensity) || 0) * view.bpPerPx;
173
- },
174
- get maxFeatureScreenDensity() {
175
- return (0, configuration_1.getConf)(self, 'maxFeatureScreenDensity');
176
- },
177
- get estimatedStatsReady() {
178
- return !!self.estimatedRegionStats;
179
- },
180
- get maxAllowableBytes() {
181
- var _a;
182
- return (self.userByteSizeLimit ||
183
- ((_a = self.estimatedRegionStats) === null || _a === void 0 ? void 0 : _a.fetchSizeLimit) ||
184
- (0, configuration_1.getConf)(self, 'fetchSizeLimit'));
185
- },
186
- }))
187
- .actions(self => ({
188
- // base display reload does nothing, see specialized displays for details
189
- setMessage(message) {
190
- self.message = message;
191
- },
192
- afterAttach() {
193
- // watch the parent's blocks to update our block state when they change,
194
- // then we recreate the blocks on our own model (creating and deleting to
195
- // match the parent blocks)
196
- const blockWatchDisposer = (0, mobx_1.autorun)(() => {
197
- const blocksPresent = {};
171
+ return new compositeMap_1.default(featureMaps);
172
+ },
173
+ /**
174
+ * #getter
175
+ */
176
+ get featureUnderMouse() {
177
+ const feat = self.featureIdUnderMouse;
178
+ return feat ? this.features.get(feat) : undefined;
179
+ },
180
+ /**
181
+ * #getter
182
+ */
183
+ getFeatureOverlapping(blockKey, x, y) {
184
+ var _a, _b;
185
+ return (_b = (_a = self.blockState.get(blockKey)) === null || _a === void 0 ? void 0 : _a.layout) === null || _b === void 0 ? void 0 : _b.getByCoord(x, y);
186
+ },
187
+ /**
188
+ * #getter
189
+ */
190
+ getFeatureByID(blockKey, id) {
191
+ var _a, _b;
192
+ return (_b = (_a = self.blockState.get(blockKey)) === null || _a === void 0 ? void 0 : _a.layout) === null || _b === void 0 ? void 0 : _b.getByID(id);
193
+ },
194
+ /**
195
+ * #getter
196
+ */
197
+ searchFeatureByID(id) {
198
+ let ret;
199
+ self.blockState.forEach(block => {
200
+ var _a;
201
+ const val = (_a = block === null || block === void 0 ? void 0 : block.layout) === null || _a === void 0 ? void 0 : _a.getByID(id);
202
+ if (val) {
203
+ ret = val;
204
+ }
205
+ });
206
+ return ret;
207
+ },
208
+ /**
209
+ * #getter
210
+ */
211
+ get currentBytesRequested() {
212
+ var _a;
213
+ return ((_a = self.estimatedRegionStats) === null || _a === void 0 ? void 0 : _a.bytes) || 0;
214
+ },
215
+ /**
216
+ * #getter
217
+ */
218
+ get currentFeatureScreenDensity() {
219
+ var _a;
198
220
  const view = (0, util_1.getContainingView)(self);
199
- if (view.initialized) {
200
- self.blockDefinitions.contentBlocks.forEach(block => {
201
- blocksPresent[block.key] = true;
202
- if (!self.blockState.has(block.key)) {
203
- this.addBlock(block.key, block);
204
- }
205
- });
206
- self.blockState.forEach((_, key) => {
207
- if (!blocksPresent[key]) {
208
- this.deleteBlock(key);
209
- }
210
- });
211
- }
212
- });
213
- (0, mobx_state_tree_1.addDisposer)(self, blockWatchDisposer);
214
- },
215
- estimateRegionsStats(regions, opts) {
216
- if (self.estimatedRegionStatsP) {
217
- return self.estimatedRegionStatsP;
218
- }
219
- const { rpcManager } = (0, util_1.getSession)(self);
220
- const { adapterConfig } = self;
221
- if (!adapterConfig) {
222
- // A track extending the base track might not have an adapter config
223
- // e.g. Apollo tracks don't use adapters
224
- return Promise.resolve({});
225
- }
226
- const sessionId = (0, tracks_1.getRpcSessionId)(self);
227
- const params = {
228
- sessionId,
229
- regions,
230
- adapterConfig,
231
- statusCallback: (message) => {
232
- if ((0, mobx_state_tree_1.isAlive)(self)) {
233
- this.setMessage(message);
221
+ return (((_a = self.estimatedRegionStats) === null || _a === void 0 ? void 0 : _a.featureDensity) || 0) * view.bpPerPx;
222
+ },
223
+ /**
224
+ * #getter
225
+ */
226
+ get maxFeatureScreenDensity() {
227
+ return (0, configuration_1.getConf)(self, 'maxFeatureScreenDensity');
228
+ },
229
+ /**
230
+ * #getter
231
+ */
232
+ get estimatedStatsReady() {
233
+ return !!self.estimatedRegionStats;
234
+ },
235
+ /**
236
+ * #getter
237
+ */
238
+ get maxAllowableBytes() {
239
+ var _a;
240
+ return (self.userByteSizeLimit ||
241
+ ((_a = self.estimatedRegionStats) === null || _a === void 0 ? void 0 : _a.fetchSizeLimit) ||
242
+ (0, configuration_1.getConf)(self, 'fetchSizeLimit'));
243
+ },
244
+ }))
245
+ .actions(self => ({
246
+ /**
247
+ * #action
248
+ */
249
+ setMessage(message) {
250
+ self.message = message;
251
+ },
252
+ afterAttach() {
253
+ // watch the parent's blocks to update our block state when they change,
254
+ // then we recreate the blocks on our own model (creating and deleting to
255
+ // match the parent blocks)
256
+ const blockWatchDisposer = (0, mobx_1.autorun)(() => {
257
+ const blocksPresent = {};
258
+ const view = (0, util_1.getContainingView)(self);
259
+ if (view.initialized) {
260
+ self.blockDefinitions.contentBlocks.forEach(block => {
261
+ blocksPresent[block.key] = true;
262
+ if (!self.blockState.has(block.key)) {
263
+ this.addBlock(block.key, block);
264
+ }
265
+ });
266
+ self.blockState.forEach((_, key) => {
267
+ if (!blocksPresent[key]) {
268
+ this.deleteBlock(key);
269
+ }
270
+ });
234
271
  }
235
- },
236
- ...opts,
237
- };
238
- self.estimatedRegionStatsP = rpcManager
239
- .call(sessionId, 'CoreEstimateRegionStats', params)
240
- .catch(e => {
241
- this.setRegionStatsP(undefined);
242
- throw e;
243
- });
244
- return self.estimatedRegionStatsP;
245
- },
246
- setRegionStatsP(p) {
247
- self.estimatedRegionStatsP = p;
248
- },
249
- setRegionStats(estimatedRegionStats) {
250
- self.estimatedRegionStats = estimatedRegionStats;
251
- },
252
- clearRegionStats() {
253
- self.estimatedRegionStatsP = undefined;
254
- self.estimatedRegionStats = undefined;
255
- },
256
- setHeight(displayHeight) {
257
- if (displayHeight > minDisplayHeight) {
258
- self.height = displayHeight;
259
- }
260
- else {
261
- self.height = minDisplayHeight;
262
- }
263
- return self.height;
264
- },
265
- resizeHeight(distance) {
266
- const oldHeight = self.height;
267
- const newHeight = this.setHeight(self.height + distance);
268
- return newHeight - oldHeight;
269
- },
270
- setScrollTop(scrollTop) {
271
- self.scrollTop = scrollTop;
272
- },
273
- updateStatsLimit(stats) {
274
- const view = (0, util_1.getContainingView)(self);
275
- if (stats.bytes) {
276
- self.userByteSizeLimit = stats.bytes;
277
- }
278
- else {
279
- self.userBpPerPxLimit = view.bpPerPx;
280
- }
281
- },
282
- addBlock(key, block) {
283
- self.blockState.set(key, serverSideRenderedBlock_1.default.create({
284
- key,
285
- region: block.toRegion(),
286
- }));
287
- },
288
- setCurrBpPerPx(n) {
289
- self.currBpPerPx = n;
290
- },
291
- deleteBlock(key) {
292
- self.blockState.delete(key);
293
- },
294
- selectFeature(feature) {
295
- const session = (0, util_1.getSession)(self);
296
- if ((0, util_1.isSessionModelWithWidgets)(session)) {
297
- const featureWidget = session.addWidget('BaseFeatureWidget', 'baseFeature', {
298
- view: (0, util_1.getContainingView)(self),
299
- track: (0, util_1.getContainingTrack)(self),
300
- featureData: feature.toJSON(),
301
272
  });
302
- session.showWidget(featureWidget);
303
- }
304
- if ((0, util_1.isSelectionContainer)(session)) {
305
- session.setSelection(feature);
306
- }
307
- },
308
- clearFeatureSelection() {
309
- const session = (0, util_1.getSession)(self);
310
- session.clearSelection();
311
- },
312
- setFeatureIdUnderMouse(feature) {
313
- self.featureIdUnderMouse = feature;
314
- },
315
- reload() {
316
- ;
317
- [...self.blockState.values()].map(val => val.doReload());
318
- },
319
- setContextMenuFeature(feature) {
320
- self.contextMenuFeature = feature;
321
- },
322
- }))
323
- .views(self => ({
324
- // region is too large if:
325
- // - stats are ready
326
- // - region is greater than 20kb (don't warn when zoomed in less than that)
327
- // - and bytes > max allowed bytes || curr density>max density
328
- get regionTooLarge() {
329
- const view = (0, util_1.getContainingView)(self);
330
- if (!self.estimatedStatsReady || view.dynamicBlocks.totalBp < 20000) {
331
- return false;
332
- }
333
- const bpLimitOrDensity = self.userBpPerPxLimit
334
- ? view.bpPerPx > self.userBpPerPxLimit
335
- : self.currentFeatureScreenDensity > self.maxFeatureScreenDensity;
336
- return (self.currentBytesRequested > self.maxAllowableBytes || bpLimitOrDensity);
337
- },
338
- // only shows a message of bytes requested is defined, the feature density
339
- // based stats don't produce any helpful message besides to zoom in
340
- get regionTooLargeReason() {
341
- const req = self.currentBytesRequested;
342
- const max = self.maxAllowableBytes;
343
- return req && req > max
344
- ? `Requested too much data (${getDisplayStr(req)})`
345
- : '';
346
- },
347
- }))
348
- .actions(self => {
349
- const { reload: superReload } = self;
350
- return {
351
- async reload() {
352
- self.setError();
353
- const aborter = new AbortController();
273
+ (0, mobx_state_tree_1.addDisposer)(self, blockWatchDisposer);
274
+ },
275
+ /**
276
+ * #action
277
+ */
278
+ estimateRegionsStats(regions, opts) {
279
+ if (self.estimatedRegionStatsP) {
280
+ return self.estimatedRegionStatsP;
281
+ }
282
+ const { rpcManager } = (0, util_1.getSession)(self);
283
+ const { adapterConfig } = self;
284
+ if (!adapterConfig) {
285
+ // A track extending the base track might not have an adapter config
286
+ // e.g. Apollo tracks don't use adapters
287
+ return Promise.resolve({});
288
+ }
289
+ const sessionId = (0, tracks_1.getRpcSessionId)(self);
290
+ const params = {
291
+ sessionId,
292
+ regions,
293
+ adapterConfig,
294
+ statusCallback: (message) => {
295
+ if ((0, mobx_state_tree_1.isAlive)(self)) {
296
+ this.setMessage(message);
297
+ }
298
+ },
299
+ ...opts,
300
+ };
301
+ self.estimatedRegionStatsP = rpcManager
302
+ .call(sessionId, 'CoreEstimateRegionStats', params)
303
+ .catch(e => {
304
+ this.setRegionStatsP(undefined);
305
+ throw e;
306
+ });
307
+ return self.estimatedRegionStatsP;
308
+ },
309
+ /**
310
+ * #action
311
+ */
312
+ setRegionStatsP(p) {
313
+ self.estimatedRegionStatsP = p;
314
+ },
315
+ /**
316
+ * #action
317
+ */
318
+ setRegionStats(estimatedRegionStats) {
319
+ self.estimatedRegionStats = estimatedRegionStats;
320
+ },
321
+ /**
322
+ * #action
323
+ */
324
+ clearRegionStats() {
325
+ self.estimatedRegionStatsP = undefined;
326
+ self.estimatedRegionStats = undefined;
327
+ },
328
+ /**
329
+ * #action
330
+ */
331
+ setHeight(displayHeight) {
332
+ if (displayHeight > minDisplayHeight) {
333
+ self.height = displayHeight;
334
+ }
335
+ else {
336
+ self.height = minDisplayHeight;
337
+ }
338
+ return self.height;
339
+ },
340
+ /**
341
+ * #action
342
+ */
343
+ resizeHeight(distance) {
344
+ const oldHeight = self.height;
345
+ const newHeight = this.setHeight(self.height + distance);
346
+ return newHeight - oldHeight;
347
+ },
348
+ /**
349
+ * #action
350
+ */
351
+ setScrollTop(scrollTop) {
352
+ self.scrollTop = scrollTop;
353
+ },
354
+ /**
355
+ * #action
356
+ */
357
+ updateStatsLimit(stats) {
354
358
  const view = (0, util_1.getContainingView)(self);
355
- // extra check for contentBlocks.length
356
- // https://github.com/GMOD/jbrowse-components/issues/2694
357
- if (!view.initialized || !view.staticBlocks.contentBlocks.length) {
358
- return;
359
+ if (stats.bytes) {
360
+ self.userByteSizeLimit = stats.bytes;
359
361
  }
360
- try {
361
- self.estimatedRegionStatsP = self.estimateRegionsStats(view.staticBlocks.contentBlocks, { signal: aborter.signal });
362
- const estimatedRegionStats = await self.estimatedRegionStatsP;
363
- if ((0, mobx_state_tree_1.isAlive)(self)) {
364
- self.setRegionStats(estimatedRegionStats);
365
- superReload();
366
- }
367
- else {
368
- return;
369
- }
362
+ else {
363
+ self.userBpPerPxLimit = view.bpPerPx;
364
+ }
365
+ },
366
+ /**
367
+ * #action
368
+ */
369
+ addBlock(key, block) {
370
+ self.blockState.set(key, serverSideRenderedBlock_1.default.create({
371
+ key,
372
+ region: block.toRegion(),
373
+ }));
374
+ },
375
+ /**
376
+ * #action
377
+ */
378
+ setCurrBpPerPx(n) {
379
+ self.currBpPerPx = n;
380
+ },
381
+ /**
382
+ * #action
383
+ */
384
+ deleteBlock(key) {
385
+ self.blockState.delete(key);
386
+ },
387
+ /**
388
+ * #action
389
+ */
390
+ selectFeature(feature) {
391
+ const session = (0, util_1.getSession)(self);
392
+ if ((0, util_1.isSessionModelWithWidgets)(session)) {
393
+ const featureWidget = session.addWidget('BaseFeatureWidget', 'baseFeature', {
394
+ view: (0, util_1.getContainingView)(self),
395
+ track: (0, util_1.getContainingTrack)(self),
396
+ featureData: feature.toJSON(),
397
+ });
398
+ session.showWidget(featureWidget);
370
399
  }
371
- catch (e) {
372
- console.error(e);
373
- self.setError(e);
400
+ if ((0, util_1.isSelectionContainer)(session)) {
401
+ session.setSelection(feature);
374
402
  }
375
403
  },
376
- afterAttach() {
377
- // this autorun performs stats estimation
378
- //
379
- // the chain of events calls estimateRegionsStats against the data
380
- // adapter which by default uses featureDensity, but can also respond
381
- // with a byte size estimate and fetch size limit (data adapter can
382
- // define what is too much data)
383
- (0, mobx_state_tree_1.addDisposer)(self, (0, mobx_1.autorun)(async () => {
384
- var _a;
404
+ /**
405
+ * #action
406
+ */
407
+ clearFeatureSelection() {
408
+ const session = (0, util_1.getSession)(self);
409
+ session.clearSelection();
410
+ },
411
+ /**
412
+ * #action
413
+ */
414
+ setFeatureIdUnderMouse(feature) {
415
+ self.featureIdUnderMouse = feature;
416
+ },
417
+ /**
418
+ * #action
419
+ */
420
+ reload() {
421
+ ;
422
+ [...self.blockState.values()].map(val => val.doReload());
423
+ },
424
+ /**
425
+ * #action
426
+ */
427
+ setContextMenuFeature(feature) {
428
+ self.contextMenuFeature = feature;
429
+ },
430
+ }))
431
+ .views(self => ({
432
+ /**
433
+ * #getter
434
+ * region is too large if:
435
+ * - stats are ready
436
+ * - region is greater than 20kb (don't warn when zoomed in less than that)
437
+ * - and bytes is greater than max allowed bytes or density greater than max density
438
+ */
439
+ get regionTooLarge() {
440
+ const view = (0, util_1.getContainingView)(self);
441
+ if (!self.estimatedStatsReady || view.dynamicBlocks.totalBp < 20000) {
442
+ return false;
443
+ }
444
+ const bpLimitOrDensity = self.userBpPerPxLimit
445
+ ? view.bpPerPx > self.userBpPerPxLimit
446
+ : self.currentFeatureScreenDensity > self.maxFeatureScreenDensity;
447
+ return (self.currentBytesRequested > self.maxAllowableBytes ||
448
+ bpLimitOrDensity);
449
+ },
450
+ /**
451
+ * #getter
452
+ * only shows a message of bytes requested is defined, the feature density
453
+ * based stats don't produce any helpful message besides to zoom in
454
+ */
455
+ get regionTooLargeReason() {
456
+ const req = self.currentBytesRequested;
457
+ const max = self.maxAllowableBytes;
458
+ return req && req > max
459
+ ? `Requested too much data (${getDisplayStr(req)})`
460
+ : '';
461
+ },
462
+ }))
463
+ .actions(self => {
464
+ const { reload: superReload } = self;
465
+ return {
466
+ /**
467
+ * #action
468
+ */
469
+ async reload() {
470
+ self.setError();
471
+ const aborter = new AbortController();
472
+ const view = (0, util_1.getContainingView)(self);
473
+ // extra check for contentBlocks.length
474
+ // https://github.com/GMOD/jbrowse-components/issues/2694
475
+ if (!view.initialized || !view.staticBlocks.contentBlocks.length) {
476
+ return;
477
+ }
385
478
  try {
386
- const aborter = new AbortController();
387
- const view = (0, util_1.getContainingView)(self);
388
- // extra check for contentBlocks.length
389
- // https://github.com/GMOD/jbrowse-components/issues/2694
390
- if (!view.initialized ||
391
- !view.staticBlocks.contentBlocks.length) {
392
- return;
393
- }
394
- // don't re-estimate featureDensity even if zoom level changes,
395
- // jbrowse1-style assume it's sort of representative
396
- if (((_a = self.estimatedRegionStats) === null || _a === void 0 ? void 0 : _a.featureDensity) !== undefined) {
397
- self.setCurrBpPerPx(view.bpPerPx);
398
- return;
399
- }
400
- // we estimate stats once at a given zoom level
401
- if (view.bpPerPx === self.currBpPerPx) {
402
- return;
403
- }
404
- self.clearRegionStats();
405
- self.setCurrBpPerPx(view.bpPerPx);
406
- const statsP = self.estimateRegionsStats(view.staticBlocks.contentBlocks, { signal: aborter.signal });
407
- self.setRegionStatsP(statsP);
408
- const estimatedRegionStats = await statsP;
479
+ self.estimatedRegionStatsP = self.estimateRegionsStats(view.staticBlocks.contentBlocks, { signal: aborter.signal });
480
+ const estimatedRegionStats = await self.estimatedRegionStatsP;
409
481
  if ((0, mobx_state_tree_1.isAlive)(self)) {
410
482
  self.setRegionStats(estimatedRegionStats);
483
+ superReload();
484
+ }
485
+ else {
486
+ return;
411
487
  }
412
488
  }
413
489
  catch (e) {
414
- if (!(0, util_1.isAbortException)(e) && (0, mobx_state_tree_1.isAlive)(self)) {
415
- console.error(e);
416
- self.setError(e);
417
- }
490
+ console.error(e);
491
+ self.setError(e);
418
492
  }
419
- }, { delay: 500 }));
420
- },
421
- };
422
- })
423
- .views(self => ({
424
- regionCannotBeRenderedText(_region) {
425
- return self.regionTooLarge ? 'Force load to see features' : '';
426
- },
427
- /**
428
- * @param region -
429
- * @returns falsy if the region is fine to try rendering. Otherwise,
430
- * return a react node + string of text.
431
- * string of text describes why it cannot be rendered
432
- * react node allows user to force load at current setting
433
- */
434
- regionCannotBeRendered(_region) {
435
- const { regionTooLarge } = self;
436
- return regionTooLarge ? react_1.default.createElement(TooLargeMessage_1.default, { model: self }) : null;
437
- },
438
- trackMenuItems() {
439
- return [];
440
- },
441
- contextMenuItems() {
442
- return self.contextMenuFeature
443
- ? [
444
- {
445
- label: 'Open feature details',
446
- icon: MenuOpen_1.default,
447
- onClick: () => {
448
- if (self.contextMenuFeature) {
449
- self.selectFeature(self.contextMenuFeature);
493
+ },
494
+ afterAttach() {
495
+ // this autorun performs stats estimation
496
+ //
497
+ // the chain of events calls estimateRegionsStats against the data
498
+ // adapter which by default uses featureDensity, but can also respond
499
+ // with a byte size estimate and fetch size limit (data adapter can
500
+ // define what is too much data)
501
+ (0, mobx_state_tree_1.addDisposer)(self, (0, mobx_1.autorun)(async () => {
502
+ var _a;
503
+ try {
504
+ const aborter = new AbortController();
505
+ const view = (0, util_1.getContainingView)(self);
506
+ // extra check for contentBlocks.length
507
+ // https://github.com/GMOD/jbrowse-components/issues/2694
508
+ if (!view.initialized ||
509
+ !view.staticBlocks.contentBlocks.length) {
510
+ return;
511
+ }
512
+ // don't re-estimate featureDensity even if zoom level changes,
513
+ // jbrowse1-style assume it's sort of representative
514
+ if (((_a = self.estimatedRegionStats) === null || _a === void 0 ? void 0 : _a.featureDensity) !== undefined) {
515
+ self.setCurrBpPerPx(view.bpPerPx);
516
+ return;
450
517
  }
518
+ // we estimate stats once at a given zoom level
519
+ if (view.bpPerPx === self.currBpPerPx) {
520
+ return;
521
+ }
522
+ self.clearRegionStats();
523
+ self.setCurrBpPerPx(view.bpPerPx);
524
+ const statsP = self.estimateRegionsStats(view.staticBlocks.contentBlocks, { signal: aborter.signal });
525
+ self.setRegionStatsP(statsP);
526
+ const estimatedRegionStats = await statsP;
527
+ if ((0, mobx_state_tree_1.isAlive)(self)) {
528
+ self.setRegionStats(estimatedRegionStats);
529
+ }
530
+ }
531
+ catch (e) {
532
+ if (!(0, util_1.isAbortException)(e) && (0, mobx_state_tree_1.isAlive)(self)) {
533
+ console.error(e);
534
+ self.setError(e);
535
+ }
536
+ }
537
+ }, { delay: 500 }));
538
+ },
539
+ };
540
+ })
541
+ .views(self => ({
542
+ /**
543
+ * #method
544
+ */
545
+ regionCannotBeRenderedText(_region) {
546
+ return self.regionTooLarge ? 'Force load to see features' : '';
547
+ },
548
+ /**
549
+ * #method
550
+ * @param region -
551
+ * @returns falsy if the region is fine to try rendering. Otherwise,
552
+ * return a react node + string of text.
553
+ * string of text describes why it cannot be rendered
554
+ * react node allows user to force load at current setting
555
+ */
556
+ regionCannotBeRendered(_region) {
557
+ const { regionTooLarge } = self;
558
+ return regionTooLarge ? react_1.default.createElement(TooLargeMessage_1.default, { model: self }) : null;
559
+ },
560
+ /**
561
+ * #method
562
+ */
563
+ trackMenuItems() {
564
+ return [];
565
+ },
566
+ /**
567
+ * #method
568
+ */
569
+ contextMenuItems() {
570
+ return self.contextMenuFeature
571
+ ? [
572
+ {
573
+ label: 'Open feature details',
574
+ icon: MenuOpen_1.default,
575
+ onClick: () => {
576
+ if (self.contextMenuFeature) {
577
+ self.selectFeature(self.contextMenuFeature);
578
+ }
579
+ },
451
580
  },
581
+ ]
582
+ : [];
583
+ },
584
+ /**
585
+ * #method
586
+ */
587
+ renderProps() {
588
+ const view = (0, util_1.getContainingView)(self);
589
+ return {
590
+ ...(0, tracks_1.getParentRenderProps)(self),
591
+ notReady: self.currBpPerPx !== view.bpPerPx || !self.estimatedRegionStats,
592
+ rpcDriverName: self.rpcDriverName,
593
+ displayModel: self,
594
+ onFeatureClick(_, featureId) {
595
+ const f = featureId || self.featureIdUnderMouse;
596
+ if (!f) {
597
+ self.clearFeatureSelection();
598
+ }
599
+ else {
600
+ const feature = self.features.get(f);
601
+ if (feature) {
602
+ self.selectFeature(feature);
603
+ }
604
+ }
452
605
  },
453
- ]
454
- : [];
455
- },
456
- renderProps() {
457
- const view = (0, util_1.getContainingView)(self);
458
- return {
459
- ...(0, tracks_1.getParentRenderProps)(self),
460
- notReady: self.currBpPerPx !== view.bpPerPx || !self.estimatedRegionStats,
461
- rpcDriverName: self.rpcDriverName,
462
- displayModel: self,
463
- onFeatureClick(_, featureId) {
464
- const f = featureId || self.featureIdUnderMouse;
465
- if (!f) {
606
+ onClick() {
466
607
  self.clearFeatureSelection();
467
- }
468
- else {
469
- const feature = self.features.get(f);
470
- if (feature) {
471
- self.selectFeature(feature);
608
+ },
609
+ // similar to click but opens a menu with further options
610
+ onFeatureContextMenu(_, featureId) {
611
+ const f = featureId || self.featureIdUnderMouse;
612
+ if (!f) {
613
+ self.clearFeatureSelection();
472
614
  }
473
- }
474
- },
475
- onClick() {
476
- self.clearFeatureSelection();
477
- },
478
- // similar to click but opens a menu with further options
479
- onFeatureContextMenu(_, featureId) {
480
- const f = featureId || self.featureIdUnderMouse;
481
- if (!f) {
615
+ else {
616
+ // feature id under mouse passed to context menu
617
+ self.setContextMenuFeature(self.features.get(f));
618
+ }
619
+ },
620
+ onMouseMove(_, featureId) {
621
+ self.setFeatureIdUnderMouse(featureId);
622
+ },
623
+ onMouseLeave(_) {
624
+ self.setFeatureIdUnderMouse(undefined);
625
+ },
626
+ onContextMenu() {
627
+ self.setContextMenuFeature(undefined);
482
628
  self.clearFeatureSelection();
629
+ },
630
+ };
631
+ },
632
+ }))
633
+ .actions(self => ({
634
+ /**
635
+ * #method
636
+ */
637
+ async renderSvg(opts) {
638
+ const { height, id } = self;
639
+ const { overrideHeight } = opts;
640
+ const view = (0, util_1.getContainingView)(self);
641
+ const { offsetPx: viewOffsetPx, roundedDynamicBlocks, width } = view;
642
+ const renderings = await Promise.all(roundedDynamicBlocks.map(block => {
643
+ const blockState = serverSideRenderedBlock_1.default.create({
644
+ key: block.key,
645
+ region: block,
646
+ });
647
+ // regionCannotBeRendered can return jsx so look for plaintext
648
+ // version, or just get the default if none available
649
+ const cannotBeRenderedReason = self.regionCannotBeRenderedText(block) ||
650
+ self.regionCannotBeRendered(block);
651
+ if (cannotBeRenderedReason) {
652
+ return {
653
+ reactElement: (react_1.default.createElement(react_1.default.Fragment, null,
654
+ react_1.default.createElement("rect", { x: 0, y: 0, width: width, height: 20, fill: "#aaa" }),
655
+ react_1.default.createElement("text", { x: 0, y: 15 }, cannotBeRenderedReason))),
656
+ };
483
657
  }
484
- else {
485
- // feature id under mouse passed to context menu
486
- self.setContextMenuFeature(self.features.get(f));
487
- }
488
- },
489
- onMouseMove(_, featureId) {
490
- self.setFeatureIdUnderMouse(featureId);
491
- },
492
- onMouseLeave(_) {
493
- self.setFeatureIdUnderMouse(undefined);
494
- },
495
- onContextMenu() {
496
- self.setContextMenuFeature(undefined);
497
- self.clearFeatureSelection();
498
- },
499
- };
500
- },
501
- }))
502
- .actions(self => ({
503
- async renderSvg(opts) {
504
- const { height, id } = self;
505
- const { overrideHeight } = opts;
506
- const view = (0, util_1.getContainingView)(self);
507
- const { offsetPx: viewOffsetPx, roundedDynamicBlocks, width } = view;
508
- const renderings = await Promise.all(roundedDynamicBlocks.map(block => {
509
- const blockState = serverSideRenderedBlock_1.default.create({
510
- key: block.key,
511
- region: block,
512
- });
513
- // regionCannotBeRendered can return jsx so look for plaintext
514
- // version, or just get the default if none available
515
- const cannotBeRenderedReason = self.regionCannotBeRenderedText(block) ||
516
- self.regionCannotBeRendered(block);
517
- if (cannotBeRenderedReason) {
518
- return {
519
- reactElement: (react_1.default.createElement(react_1.default.Fragment, null,
520
- react_1.default.createElement("rect", { x: 0, y: 0, width: width, height: 20, fill: "#aaa" }),
521
- react_1.default.createElement("text", { x: 0, y: 15 }, cannotBeRenderedReason))),
522
- };
523
- }
524
- const { rpcManager, renderArgs, renderProps, rendererType } = (0, serverSideRenderedBlock_1.renderBlockData)(blockState, self);
525
- return rendererType.renderInClient(rpcManager, {
526
- ...renderArgs,
527
- ...renderProps,
528
- viewParams: (0, util_1.getViewParams)(self, true),
529
- exportSVG: opts,
530
- });
531
- }));
532
- return (react_1.default.createElement(react_1.default.Fragment, null, renderings.map((rendering, index) => {
533
- const { offsetPx } = roundedDynamicBlocks[index];
534
- const offset = offsetPx - viewOffsetPx;
535
- const clipid = getId(id, index);
536
- return (react_1.default.createElement(react_1.default.Fragment, { key: `frag-${index}` },
537
- react_1.default.createElement("defs", null,
538
- react_1.default.createElement("clipPath", { id: clipid },
539
- react_1.default.createElement("rect", { x: 0, y: 0, width: width, height: overrideHeight || height }))),
540
- react_1.default.createElement("g", { transform: `translate(${offset} 0)` },
541
- react_1.default.createElement("g", { clipPath: `url(#${clipid})` }, react_1.default.isValidElement(rendering.reactElement) ? (rendering.reactElement) : (
542
- // eslint-disable-next-line react/no-danger
543
- react_1.default.createElement("g", { dangerouslySetInnerHTML: { __html: rendering.html } }))))));
544
- })));
545
- },
546
- }))
547
- .postProcessSnapshot(self => {
548
- // xref https://github.com/mobxjs/mobx-state-tree/issues/1524 for Omit
549
- const r = self;
550
- const { blockState, ...rest } = r;
551
- return rest;
552
- });
658
+ const { rpcManager, renderArgs, renderProps, rendererType } = (0, serverSideRenderedBlock_1.renderBlockData)(blockState, self);
659
+ return rendererType.renderInClient(rpcManager, {
660
+ ...renderArgs,
661
+ ...renderProps,
662
+ viewParams: (0, util_1.getViewParams)(self, true),
663
+ exportSVG: opts,
664
+ });
665
+ }));
666
+ return (react_1.default.createElement(react_1.default.Fragment, null, renderings.map((rendering, index) => {
667
+ const { offsetPx } = roundedDynamicBlocks[index];
668
+ const offset = offsetPx - viewOffsetPx;
669
+ const clipid = getId(id, index);
670
+ return (react_1.default.createElement(react_1.default.Fragment, { key: `frag-${index}` },
671
+ react_1.default.createElement("defs", null,
672
+ react_1.default.createElement("clipPath", { id: clipid },
673
+ react_1.default.createElement("rect", { x: 0, y: 0, width: width, height: overrideHeight || height }))),
674
+ react_1.default.createElement("g", { transform: `translate(${offset} 0)` },
675
+ react_1.default.createElement("g", { clipPath: `url(#${clipid})` }, react_1.default.isValidElement(rendering.reactElement) ? (rendering.reactElement) : (react_1.default.createElement("g", {
676
+ /* eslint-disable-next-line react/no-danger */
677
+ dangerouslySetInnerHTML: { __html: rendering.html } }))))));
678
+ })));
679
+ },
680
+ }))
681
+ .postProcessSnapshot(self => {
682
+ // xref https://github.com/mobxjs/mobx-state-tree/issues/1524 for Omit
683
+ const r = self;
684
+ const { blockState, ...rest } = r;
685
+ return rest;
686
+ });
687
+ }
688
+ exports.BaseLinearDisplay = stateModelFactory();
553
689
  //# sourceMappingURL=BaseLinearDisplayModel.js.map