@complat/react-spectra-editor 1.7.0 → 1.8.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 (111) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/LICENSE +21 -662
  3. package/README.md +5 -0
  4. package/dist/__tests__/fixtures/lc_ms_jcamp.js +2329 -0
  5. package/dist/__tests__/fixtures/lc_ms_jcamp_2.js +2874 -0
  6. package/dist/__tests__/fixtures/lc_ms_jcamp_mz_chemstation.js +3242 -0
  7. package/dist/__tests__/fixtures/lc_ms_jcamp_tic_chemstation.js +854 -0
  8. package/dist/__tests__/fixtures/lc_ms_jcamp_tic_neg.js +1233 -0
  9. package/dist/__tests__/fixtures/lc_ms_jcamp_tic_pos.js +1233 -0
  10. package/dist/__tests__/fixtures/lc_ms_jcamp_uvvis.js +48908 -0
  11. package/dist/__tests__/fixtures/lc_ms_jcamp_uvvis_chemstation.js +15424 -0
  12. package/dist/__tests__/units/components/cmd_bar/r05_submit_btn.test.js +158 -3
  13. package/dist/__tests__/units/components/d3_line_rect.test.js +85 -0
  14. package/dist/__tests__/units/components/d3_multi/multi_focus.test.js +43 -0
  15. package/dist/__tests__/units/components/hplc_viewer.test.js +123 -0
  16. package/dist/__tests__/units/components/panel/info.test.js +55 -15
  17. package/dist/__tests__/units/features/lc-ms/parsing/lcmsCategory.test.js +73 -0
  18. package/dist/__tests__/units/features/lc-ms/submit/peaks.test.js +310 -0
  19. package/dist/actions/curve.js +5 -2
  20. package/dist/actions/hplc_ms.js +66 -0
  21. package/dist/actions/integration.js +17 -2
  22. package/dist/actions/ui.js +39 -11
  23. package/dist/app.js +21 -8
  24. package/dist/components/cmd_bar/01_viewer.js +15 -11
  25. package/dist/components/cmd_bar/03_peak.js +25 -16
  26. package/dist/components/cmd_bar/04_integration.js +116 -17
  27. package/dist/components/cmd_bar/08_peak_group.js +83 -0
  28. package/dist/components/cmd_bar/collapsible_toolbar_group.js +101 -0
  29. package/dist/components/cmd_bar/common.js +4 -3
  30. package/dist/components/cmd_bar/index.js +76 -18
  31. package/dist/components/cmd_bar/r01_layout.js +6 -0
  32. package/dist/components/cmd_bar/r02_scan.js +15 -11
  33. package/dist/components/cmd_bar/r03_threshold.js +19 -3
  34. package/dist/components/cmd_bar/r04_submit.js +61 -6
  35. package/dist/components/cmd_bar/r05_submit_btn.js +60 -13
  36. package/dist/components/cmd_bar/r06_predict_btn.js +4 -4
  37. package/dist/components/cmd_bar/r07_wavelength_btn.js +10 -9
  38. package/dist/components/cmd_bar/r09_detector.js +2 -2
  39. package/dist/components/cmd_bar/tri_btn.js +4 -1
  40. package/dist/components/common/draw.js +6 -5
  41. package/dist/components/d3_line/index.js +70 -15
  42. package/dist/components/d3_line/line_focus.js +104 -67
  43. package/dist/components/d3_line_rect/index.js +836 -0
  44. package/dist/components/d3_line_rect/line_focus.js +526 -0
  45. package/dist/components/d3_line_rect/multi_focus.js +433 -0
  46. package/dist/components/d3_line_rect/rect_focus.js +247 -0
  47. package/dist/components/d3_multi/index.js +154 -163
  48. package/dist/components/d3_multi/multi_focus.js +117 -68
  49. package/dist/components/d3_rect/index.js +6 -0
  50. package/dist/components/d3_rect/rect_focus.js +17 -5
  51. package/dist/components/hplc_viewer.js +169 -0
  52. package/dist/components/lc_ms_uv_tools_bar.js +175 -0
  53. package/dist/components/multi_jcamps_viewer.js +17 -5
  54. package/dist/components/panel/compare.js +84 -62
  55. package/dist/components/panel/cyclic_voltamery_data.js +15 -14
  56. package/dist/components/panel/graph_selection.js +32 -30
  57. package/dist/components/panel/index.js +28 -22
  58. package/dist/components/panel/info.js +90 -31
  59. package/dist/constants/action_type.js +23 -2
  60. package/dist/constants/list_graph.js +16 -0
  61. package/dist/constants/list_layout.js +2 -1
  62. package/dist/constants/list_ui.js +5 -2
  63. package/dist/features/lc-ms/entities/extractEntityLCMS.js +187 -0
  64. package/dist/features/lc-ms/parsing/chemstation.js +108 -0
  65. package/dist/features/lc-ms/parsing/index.js +46 -0
  66. package/dist/features/lc-ms/parsing/lcmsCategory.js +44 -0
  67. package/dist/features/lc-ms/parsing/lcmsJcampInfo.js +18 -0
  68. package/dist/features/lc-ms/parsing/lcmsMsPage.js +241 -0
  69. package/dist/features/lc-ms/parsing/pageValue.js +27 -0
  70. package/dist/features/lc-ms/submit/index.js +24 -0
  71. package/dist/features/lc-ms/submit/peaks.js +66 -0
  72. package/dist/features/lc-ms/ui/wavelengthSelect.js +54 -0
  73. package/dist/fn.js +4 -1
  74. package/dist/helpers/brush.js +74 -19
  75. package/dist/helpers/calc.js +4 -2
  76. package/dist/helpers/cfg.js +5 -4
  77. package/dist/helpers/chem.js +449 -71
  78. package/dist/helpers/compass.js +181 -17
  79. package/dist/helpers/extractEntityLCMS.js +24 -0
  80. package/dist/helpers/extractParams.js +118 -33
  81. package/dist/helpers/extractPeaksEdit.js +29 -9
  82. package/dist/helpers/format.js +189 -4
  83. package/dist/helpers/init.js +25 -5
  84. package/dist/helpers/integration.js +130 -17
  85. package/dist/helpers/integration_draft.js +43 -0
  86. package/dist/helpers/integration_focus.js +155 -0
  87. package/dist/helpers/integration_jcamp.js +68 -0
  88. package/dist/helpers/integration_split.js +202 -0
  89. package/dist/helpers/mount.js +8 -1
  90. package/dist/helpers/sweep.js +39 -0
  91. package/dist/index.js +284 -26
  92. package/dist/layer_content.js +17 -3
  93. package/dist/layer_init.js +124 -14
  94. package/dist/layer_prism.js +31 -5
  95. package/dist/reducers/index.js +3 -1
  96. package/dist/reducers/reducer_curve.js +54 -36
  97. package/dist/reducers/reducer_hplc_ms/hydrate.js +289 -0
  98. package/dist/reducers/reducer_hplc_ms/index.js +122 -0
  99. package/dist/reducers/reducer_hplc_ms/persistence.js +74 -0
  100. package/dist/reducers/reducer_hplc_ms/tic.js +70 -0
  101. package/dist/reducers/reducer_hplc_ms/utils.js +70 -0
  102. package/dist/reducers/reducer_hplc_ms/uvvis.js +377 -0
  103. package/dist/reducers/reducer_integration.js +265 -7
  104. package/dist/reducers/reducer_layout.js +1 -1
  105. package/dist/reducers/reducer_submit.js +2 -1
  106. package/dist/reducers/reducer_ui.js +149 -13
  107. package/dist/reducers/undo_redo_config.js +2 -2
  108. package/dist/sagas/saga_lcms_ui.js +85 -0
  109. package/dist/sagas/saga_ui.js +177 -74
  110. package/dist/setupTests.js +5 -5
  111. package/package.json +10 -7
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.serializeObservedIntegrals = exports.serializeObservedIntegralGroups = exports.serializeIntegrationRecords = exports.formatNumber = void 0;
8
+ var _format = _interopRequireDefault(require("./format"));
9
+ /**
10
+ * Serializes integration state into JCAMP-DX records for .jdx persistence.
11
+ *
12
+ * Records produced:
13
+ * - $OBSERVEDINTEGRALS: one row per stack item (xL, xU, area, absoluteArea)
14
+ * - $OBSERVEDINTEGRALSGROUPS: optional index/groupId pairs for HPLC visual splits
15
+ * - $CSITAREA / $CSITFACTOR: reference scaling metadata
16
+ */
17
+
18
+ const formatNumber = value => {
19
+ const num = Number(value);
20
+ return Number.isFinite(num) ? String(num) : '0';
21
+ };
22
+ exports.formatNumber = formatNumber;
23
+ const serializeObservedIntegrals = (stack, refArea, layout) => {
24
+ const safeRefArea = Number.isFinite(refArea) && refArea !== 0 ? refArea : 1;
25
+ const includeAbsoluteArea = _format.default.isHplcUvVisLayout(layout);
26
+ const lines = stack.map(item => {
27
+ const xL = formatNumber(item.xL);
28
+ const xU = formatNumber(item.xU);
29
+ const area = formatNumber(item.area / safeRefArea);
30
+ if (includeAbsoluteArea) {
31
+ return `${xL}, ${xU}, ${area}, ${formatNumber(item.absoluteArea)}`;
32
+ }
33
+ return `${xL}, ${xU}, ${area}`;
34
+ });
35
+ return `(X Y Z)\n${lines.join('\n')}`;
36
+ };
37
+ exports.serializeObservedIntegrals = serializeObservedIntegrals;
38
+ const serializeObservedIntegralGroups = stack => {
39
+ const rows = stack.reduce((acc, item, idx) => {
40
+ const groupId = item && item.visualSplitGroupId;
41
+ if (groupId) acc.push(`${idx}, ${groupId}`);
42
+ return acc;
43
+ }, []);
44
+ if (rows.length === 0) return null;
45
+ return `(X Y)\n${rows.join('\n')}`;
46
+ };
47
+ exports.serializeObservedIntegralGroups = serializeObservedIntegralGroups;
48
+ const serializeIntegrationRecords = (integration, layout) => {
49
+ if (!integration || !Array.isArray(integration.stack) || integration.stack.length === 0) {
50
+ return {};
51
+ }
52
+ const {
53
+ stack,
54
+ refArea = 1,
55
+ refFactor = 1
56
+ } = integration;
57
+ const records = {
58
+ $OBSERVEDINTEGRALS: serializeObservedIntegrals(stack, refArea, layout),
59
+ $CSITAREA: formatNumber(refArea),
60
+ $CSITFACTOR: formatNumber(refFactor)
61
+ };
62
+ if (_format.default.isHplcUvVisLayout(layout)) {
63
+ const groups = serializeObservedIntegralGroups(stack);
64
+ if (groups) records.$OBSERVEDINTEGRALSGROUPS = groups;
65
+ }
66
+ return records;
67
+ };
68
+ exports.serializeIntegrationRecords = serializeIntegrationRecords;
@@ -0,0 +1,202 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.resolveSplitTarget = exports.resolveSplitPreviewExtent = exports.isMergedVisualSplitGroup = exports.isAlreadyVisuallySplit = exports.interpolateY = exports.getVisualSplitLines = exports.getVisualSplitLineAtX = exports.getSplitXFromEvent = exports.getIntegrationSplitTargetFromEvent = exports.getIntegrationSplitTarget = exports.getIntegrationBounds = exports.drawIntegrationVisualSplitLines = exports.drawIntegrationSplitPreview = exports.clearIntegrationSplitPreview = exports.NMR_SPLIT_PREVIEW_EXTENT = exports.FIXED_SPLIT_PREVIEW_EXTENT = void 0;
7
+ var _integration = require("./integration");
8
+ const d3 = require('d3');
9
+ const SPLIT_PREVIEW_CLASS = 'integration-split-preview-line';
10
+ const VISUAL_SPLIT_CLASS = 'integration-visual-split-line';
11
+ const VISUAL_SPLIT_STROKE = 'red';
12
+ const VISUAL_SPLIT_HOVER_STROKE = 'blue';
13
+ const VISUAL_SPLIT_HIT_TOLERANCE_PX = 6;
14
+ const FIXED_SPLIT_PREVIEW_EXTENT = exports.FIXED_SPLIT_PREVIEW_EXTENT = {
15
+ y1: 38,
16
+ y2: 55
17
+ };
18
+ const getIntegrationBounds = (target, shift = 0) => [target.xL - shift, target.xU - shift].sort((a, b) => a - b);
19
+ exports.getIntegrationBounds = getIntegrationBounds;
20
+ const getSplitXFromEvent = (event, focus) => {
21
+ const rawMouseX = d3.pointer(event, focus.root.node())[0];
22
+ return focus.scales.x.invert(rawMouseX);
23
+ };
24
+ exports.getSplitXFromEvent = getSplitXFromEvent;
25
+ const clearIntegrationSplitPreview = focus => {
26
+ if (!focus || !focus.root) return;
27
+ focus.root.select(`.${SPLIT_PREVIEW_CLASS}`).remove();
28
+ };
29
+ exports.clearIntegrationSplitPreview = clearIntegrationSplitPreview;
30
+ const isAlreadyVisuallySplit = target => {
31
+ if (!target) return false;
32
+ return !!target.visualSplitGroupId || target.isMerged === true;
33
+ };
34
+ exports.isAlreadyVisuallySplit = isAlreadyVisuallySplit;
35
+ const isMergedVisualSplitGroup = target => !!(target && target.isMerged === true);
36
+ exports.isMergedVisualSplitGroup = isMergedVisualSplitGroup;
37
+ const resolveBaselineContextBounds = (focus, target, shift) => {
38
+ if (target && target.isMerged === true) {
39
+ return getIntegrationBounds(target, shift);
40
+ }
41
+ const groupId = target && target.visualSplitGroupId;
42
+ const stack = focus && focus.integrationSplitTargets && focus.integrationSplitTargets.stack;
43
+ if (groupId && Array.isArray(stack)) {
44
+ const siblings = stack.filter(item => item && item.visualSplitGroupId === groupId);
45
+ if (siblings.length > 1) {
46
+ const lower = Math.min(...siblings.map(item => item.xL)) - shift;
47
+ const upper = Math.max(...siblings.map(item => item.xU)) - shift;
48
+ return [lower, upper].sort((a, b) => a - b);
49
+ }
50
+ }
51
+ return getIntegrationBounds(target, shift);
52
+ };
53
+ const getIntegrationSplitTarget = (focus, splitX) => {
54
+ const splitTargets = focus && focus.integrationSplitTargets;
55
+ if (!splitTargets || !Number.isFinite(splitX)) return null;
56
+ const {
57
+ stack = [],
58
+ shift = 0
59
+ } = splitTargets;
60
+ return stack.find(target => {
61
+ const [xL, xU] = getIntegrationBounds(target, shift);
62
+ return splitX > xL && splitX < xU;
63
+ });
64
+ };
65
+ exports.getIntegrationSplitTarget = getIntegrationSplitTarget;
66
+ const getIntegrationSplitTargetFromEvent = (event, focus) => {
67
+ const splitX = getSplitXFromEvent(event, focus);
68
+ const target = getIntegrationSplitTarget(focus, splitX);
69
+ return {
70
+ splitX,
71
+ target
72
+ };
73
+ };
74
+ exports.getIntegrationSplitTargetFromEvent = getIntegrationSplitTargetFromEvent;
75
+ const getVisualSplitLines = (stack = [], shift = 0) => {
76
+ if (!Array.isArray(stack)) return [];
77
+ return (0, _integration.getVisualSplitGroups)(stack).filter(group => group.isMerged).reduce((acc, group) => {
78
+ (0, _integration.getVisualSplitGroupBoundaries)(group).forEach(boundary => {
79
+ const value = boundary - shift;
80
+ if (Number.isFinite(value)) acc.push(value);
81
+ });
82
+ return acc;
83
+ }, []);
84
+ };
85
+ exports.getVisualSplitLines = getVisualSplitLines;
86
+ const getVisualSplitLineAtX = (focus, stack, splitX, shift = 0, pixelTolerance = VISUAL_SPLIT_HIT_TOLERANCE_PX) => {
87
+ if (!focus || !focus.scales || !focus.scales.x || !Number.isFinite(splitX)) return null;
88
+ const xt = focus.scales.x;
89
+ const splitXPx = xt(splitX);
90
+ const nearest = getVisualSplitLines(stack, shift).reduce((acc, lineX) => {
91
+ const distance = Math.abs(xt(lineX) - splitXPx);
92
+ if (!acc || distance < acc.distance) {
93
+ return {
94
+ splitX: lineX,
95
+ distance
96
+ };
97
+ }
98
+ return acc;
99
+ }, null);
100
+ return nearest && nearest.distance <= pixelTolerance ? nearest.splitX : null;
101
+ };
102
+ exports.getVisualSplitLineAtX = getVisualSplitLineAtX;
103
+ const interpolateY = (points, x) => {
104
+ if (!points || points.length === 0) return null;
105
+ const sortedPoints = [...points].sort((a, b) => a.x - b.x);
106
+ const upperIndex = sortedPoints.findIndex(point => point.x >= x);
107
+ if (upperIndex < 0) return sortedPoints[sortedPoints.length - 1].y;
108
+ if (upperIndex === 0) return sortedPoints[0].y;
109
+ const lowerPoint = sortedPoints[upperIndex - 1];
110
+ const upperPoint = sortedPoints[upperIndex];
111
+ const xDelta = upperPoint.x - lowerPoint.x;
112
+ if (xDelta === 0) return lowerPoint.y;
113
+ const ratio = (x - lowerPoint.x) / xDelta;
114
+ return lowerPoint.y + ratio * (upperPoint.y - lowerPoint.y);
115
+ };
116
+ exports.interpolateY = interpolateY;
117
+ const resolveSplitPreviewExtent = (focus, target, splitX, shift, ignoreRef) => {
118
+ if (!focus || !target || !focus.scales || !focus.scales.y) return null;
119
+ const yt = focus.scales.y;
120
+ const [xL, xU] = getIntegrationBounds(target, shift);
121
+ if (!Number.isFinite(splitX) || splitX <= xL || splitX >= xU) return null;
122
+ if (!ignoreRef) {
123
+ return FIXED_SPLIT_PREVIEW_EXTENT;
124
+ }
125
+ const [contextXL, contextXU] = resolveBaselineContextBounds(focus, target, shift);
126
+ const points = (0, _integration.getIntegrationPoints)(contextXL, contextXU, focus.data);
127
+ if (points.length < 2) return null;
128
+ const baselineY = (0, _integration.getLinearBaseline)(points);
129
+ const curveY = interpolateY(points, splitX);
130
+ const baseY = baselineY({
131
+ x: splitX
132
+ });
133
+ if (!Number.isFinite(curveY) || !Number.isFinite(baseY)) return null;
134
+ return {
135
+ y1: yt(baseY),
136
+ y2: yt(curveY)
137
+ };
138
+ };
139
+ exports.resolveSplitPreviewExtent = resolveSplitPreviewExtent;
140
+ const drawIntegrationSplitPreview = (focus, target, splitX, shift, ignoreRef) => {
141
+ const extent = resolveSplitPreviewExtent(focus, target, splitX, shift, ignoreRef);
142
+ if (!extent) {
143
+ clearIntegrationSplitPreview(focus);
144
+ return;
145
+ }
146
+ const xt = focus.scales.x;
147
+ const x = xt(splitX);
148
+ const preview = focus.root.select('.integration-preview');
149
+ preview.raise();
150
+ const line = preview.selectAll(`.${SPLIT_PREVIEW_CLASS}`).data([extent]);
151
+ line.enter().append('line').attr('class', SPLIT_PREVIEW_CLASS).attr('stroke', 'red').attr('stroke-width', 2).attr('stroke-dasharray', '4,3').style('pointer-events', 'none').merge(line).attr('x1', x).attr('x2', x).attr('y1', d => d.y1).attr('y2', d => d.y2);
152
+ };
153
+ exports.drawIntegrationSplitPreview = drawIntegrationSplitPreview;
154
+ const drawIntegrationVisualSplitLines = (focus, stack = [], shift = 0, ignoreRef = false, isInteractive = false, onClickLine = null) => {
155
+ if (!focus || !focus.tags || !focus.tags.visualSplitPath) return;
156
+ const groups = (0, _integration.getVisualSplitGroups)(stack).filter(group => group.isMerged);
157
+ const splitLines = groups.reduce((acc, group) => {
158
+ const groupTarget = {
159
+ xL: group.xL,
160
+ xU: group.xU
161
+ };
162
+ (0, _integration.getVisualSplitGroupBoundaries)(group).forEach(boundary => {
163
+ const splitX = boundary - shift;
164
+ const extent = resolveSplitPreviewExtent(focus, groupTarget, splitX, shift, ignoreRef);
165
+ if (extent) {
166
+ acc.push({
167
+ splitX,
168
+ key: `${group.groupId || `${group.xL}-${group.xU}`}-${splitX}`,
169
+ ...extent
170
+ });
171
+ }
172
+ });
173
+ return acc;
174
+ }, []);
175
+ const xt = focus.scales.x;
176
+ const lines = focus.tags.visualSplitPath.selectAll(`line.${VISUAL_SPLIT_CLASS}`).data(splitLines, d => d.key);
177
+ lines.exit().attr('class', 'exit').remove();
178
+ const merged = lines.enter().append('line').attr('class', VISUAL_SPLIT_CLASS).merge(lines);
179
+ merged.attr('stroke', VISUAL_SPLIT_STROKE).attr('stroke-width', 2).attr('x1', d => xt(d.splitX)).attr('x2', d => xt(d.splitX)).attr('y1', d => d.y1).attr('y2', d => d.y2).style('pointer-events', isInteractive ? 'stroke' : 'none').style('cursor', isInteractive ? 'pointer' : null);
180
+ if (isInteractive && onClickLine) {
181
+ merged.on('click', (event, d) => onClickLine(event, d.splitX)).on('mouseover', function onVisualSplitLineOver() {
182
+ d3.select(this).attr('stroke', VISUAL_SPLIT_HOVER_STROKE);
183
+ }).on('mouseout', function onVisualSplitLineOut() {
184
+ d3.select(this).attr('stroke', VISUAL_SPLIT_STROKE);
185
+ });
186
+ } else {
187
+ merged.on('click', null).on('mouseover', null).on('mouseout', null);
188
+ }
189
+ };
190
+ exports.drawIntegrationVisualSplitLines = drawIntegrationVisualSplitLines;
191
+ const resolveSplitTarget = (focus, data, splitX) => {
192
+ if (!data) return null;
193
+ if (Number.isFinite(splitX)) {
194
+ const stackTarget = getIntegrationSplitTarget(focus, splitX);
195
+ if (stackTarget) return stackTarget;
196
+ }
197
+ if (data.target) return data.target;
198
+ if (data.isMerged) return null;
199
+ return data;
200
+ };
201
+ exports.resolveSplitTarget = resolveSplitTarget;
202
+ const NMR_SPLIT_PREVIEW_EXTENT = exports.NMR_SPLIT_PREVIEW_EXTENT = FIXED_SPLIT_PREVIEW_EXTENT;
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.MountThresLine = exports.MountTags = exports.MountRef = exports.MountPath = exports.MountMarker = exports.MountMainFrame = exports.MountGrid = exports.MountComparePath = exports.MountClip = exports.MountBars = exports.MountAxisLabelY = exports.MountAxisLabelX = exports.MountAxis = void 0;
6
+ exports.MountThresLine = exports.MountTags = exports.MountRef = exports.MountPath = exports.MountMarker = exports.MountMainFrame = exports.MountGrid = exports.MountGraphLabel = exports.MountComparePath = exports.MountClip = exports.MountBars = exports.MountAxisLabelY = exports.MountAxisLabelX = exports.MountAxis = void 0;
7
7
  var _compass = require("./compass");
8
8
  const MountTags = target => {
9
9
  const igbPath = target.root.append('g').attr('class', 'igbPath-clip').attr('clip-path', 'url(#clip)');
@@ -17,6 +17,7 @@ const MountTags = target => {
17
17
  const mpyt2Path = target.root.append('g').attr('class', 'mpyt2Path-clip').attr('clip-path', 'url(#clip)');
18
18
  const mpypPath = target.root.append('g').attr('class', 'mpypPath-clip').attr('clip-path', 'url(#clip)');
19
19
  const aucPath = target.root.append('g').attr('class', 'aucPath-clip').attr('clip-path', 'url(#clip)');
20
+ const visualSplitPath = target.root.append('g').attr('class', 'integration-visual-splits').attr('clip-path', 'url(#clip)');
20
21
  const peckerPath = target.root.append('g').attr('class', 'peckerPath-clip').attr('clip-path', 'url(#clip)');
21
22
  return {
22
23
  pPath,
@@ -30,6 +31,7 @@ const MountTags = target => {
30
31
  mpyt2Path,
31
32
  mpypPath,
32
33
  aucPath,
34
+ visualSplitPath,
33
35
  peckerPath // eslint-disable-line
34
36
  };
35
37
  };
@@ -91,6 +93,11 @@ const MountAxisLabelY = target => {
91
93
  target.root.append('text').attr('text-anchor', 'middle').attr('transform', yTrans).attr('class', 'yLabel').attr('font-family', 'Helvetica').style('font-size', '12px');
92
94
  };
93
95
  exports.MountAxisLabelY = MountAxisLabelY;
96
+ const MountGraphLabel = target => {
97
+ const xTrans = `translate(${target.w / 2}, ${20})`;
98
+ target.root.append('text').attr('text-anchor', 'middle').attr('transform', xTrans).attr('class', 'mark-text').attr('font-family', 'Helvetica').style('font-size', '12px');
99
+ };
100
+ exports.MountGraphLabel = MountGraphLabel;
94
101
  const MountMarker = (target, color) => {
95
102
  const tTrans = `translate(${target.w - 80}, -10)`;
96
103
  const lTrans = `translate(${target.w - 200}, -18)`;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.resolveVisibleYExtent = exports.buildSweepPayloadFromXBounds = void 0;
7
+ const resolveVisibleYExtent = focus => {
8
+ const {
9
+ currentExtent,
10
+ h,
11
+ scales
12
+ } = focus;
13
+ if (currentExtent && currentExtent.yExtent) {
14
+ return currentExtent.yExtent;
15
+ }
16
+ const yes = [h, 0].map(scales.y.invert).sort((a, b) => a - b);
17
+ return {
18
+ yL: yes[0],
19
+ yU: yes[1]
20
+ };
21
+ };
22
+ exports.resolveVisibleYExtent = resolveVisibleYExtent;
23
+ const buildSweepPayloadFromXBounds = (focus, xA, xB) => {
24
+ const {
25
+ data,
26
+ dataPks
27
+ } = focus;
28
+ const xes = [xA, xB].map(x => Number(x)).sort((a, b) => a - b);
29
+ return {
30
+ xExtent: {
31
+ xL: xes[0],
32
+ xU: xes[1]
33
+ },
34
+ yExtent: resolveVisibleYExtent(focus),
35
+ data,
36
+ dataPks
37
+ };
38
+ };
39
+ exports.buildSweepPayloadFromXBounds = buildSweepPayloadFromXBounds;