@deephaven/js-plugin-plotly-express 0.15.0 → 0.16.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.
@@ -0,0 +1,36 @@
1
+ var __rest = (this && this.__rest) || function (s, e) {
2
+ var t = {};
3
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
4
+ t[p] = s[p];
5
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
6
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
7
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
8
+ t[p[i]] = s[p[i]];
9
+ }
10
+ return t;
11
+ };
12
+ import { jsx as _jsx } from "react/jsx-runtime";
13
+ import { useCallback, useState } from 'react';
14
+ import Plotly from 'plotly.js-dist-min';
15
+ import { ChartPanel } from '@deephaven/dashboard-core-plugins';
16
+ import { useApi } from '@deephaven/jsapi-bootstrap';
17
+ import PlotlyExpressChartModel from './PlotlyExpressChartModel.js';
18
+ import { useHandleSceneTicks } from './useHandleSceneTicks.js';
19
+ export function PlotlyExpressChartPanel(props) {
20
+ const dh = useApi();
21
+ const { fetch, metadata = {} } = props, rest = __rest(props, ["fetch", "metadata"]);
22
+ const [container, setContainer] = useState(null);
23
+ const [model, setModel] = useState();
24
+ const makeModel = useCallback(async () => {
25
+ const widgetData = await fetch();
26
+ const m = new PlotlyExpressChartModel(dh, widgetData, fetch);
27
+ setModel(m);
28
+ return m;
29
+ }, [dh, fetch]);
30
+ useHandleSceneTicks(model, container);
31
+ return (_jsx(ChartPanel
32
+ // eslint-disable-next-line react/jsx-props-no-spreading
33
+ , Object.assign({}, rest, { containerRef: setContainer, makeModel: makeModel, Plotly: Plotly, metadata: metadata })));
34
+ }
35
+ export default PlotlyExpressChartPanel;
36
+ //# sourceMappingURL=PlotlyExpressChartPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlotlyExpressChartPanel.js","sourceRoot":"","sources":["../src/PlotlyExpressChartPanel.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAc,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACrD,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,UAAU,EAAmB,MAAM,mCAAmC,CAAC;AAGhF,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACpD,OAAO,uBAAuB,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,MAAM,UAAU,uBAAuB,CACrC,KAAkC;IAElC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,EAAE,KAAc,KAAK,EAAd,IAAI,UAAK,KAAK,EAAzC,qBAAiC,CAAQ,CAAC;IAChD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAwB,IAAI,CAAC,CAAC;IACxE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,EAA2B,CAAC;IAE9D,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACvC,MAAM,UAAU,GAAG,MAAM,KAAK,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,IAAI,uBAAuB,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAC7D,QAAQ,CAAC,CAAC,CAAC,CAAC;QACZ,OAAO,CAAC,CAAC;IACX,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;IAEhB,mBAAmB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAEtC,OAAO,CACL,KAAC,UAAU;IACT,wDAAwD;wBACnD,IAAwB,IAC7B,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAuC,IACjD,CACH,CAAC;AACJ,CAAC;AAED,eAAe,uBAAuB,CAAC"}
@@ -0,0 +1,222 @@
1
+ import { type Data, type Delta, type LayoutAxis, type PlotlyDataLayoutConfig, type PlotNumber, type Layout } from 'plotly.js';
2
+ import type { dh as DhType } from '@deephaven/jsapi-types';
3
+ import { ChartUtils } from '@deephaven/chart';
4
+ import { Formatter } from '@deephaven/jsapi-utils';
5
+ /**
6
+ * A prefix for the number format to indicate it is in Java format and should be
7
+ * transformed to a d3 format
8
+ */
9
+ export declare const FORMAT_PREFIX = "DEEPHAVEN_JAVA_FORMAT=";
10
+ export interface PlotlyChartWidget {
11
+ getDataAsBase64: () => string;
12
+ exportedObjects: {
13
+ fetch: () => Promise<DhType.Table>;
14
+ }[];
15
+ addEventListener: (type: string, fn: (event: CustomEvent<PlotlyChartWidget>) => () => void) => void;
16
+ }
17
+ interface DeephavenCalendarBusinessPeriod {
18
+ open: string;
19
+ close: string;
20
+ }
21
+ export interface PlotlyChartDeephavenData {
22
+ calendar?: {
23
+ timeZone: string;
24
+ businessDays: Array<string>;
25
+ holidays: Array<{
26
+ date: string;
27
+ businessPeriods: Array<DeephavenCalendarBusinessPeriod>;
28
+ }>;
29
+ businessPeriods: Array<DeephavenCalendarBusinessPeriod>;
30
+ name: string;
31
+ };
32
+ mappings: Array<{
33
+ table: number;
34
+ data_columns: Record<string, string[]>;
35
+ }>;
36
+ is_user_set_template: boolean;
37
+ is_user_set_color: boolean;
38
+ }
39
+ export interface PlotlyChartWidgetData {
40
+ type: string;
41
+ figure: {
42
+ deephaven: PlotlyChartDeephavenData;
43
+ plotly: PlotlyDataLayoutConfig;
44
+ };
45
+ revision: number;
46
+ new_references: number[];
47
+ removed_references: number[];
48
+ }
49
+ /** Information that is needed to update the default value format in the data
50
+ * The index is relative to the plotly/data/ array
51
+ * The path within the trace has the valueformat to update
52
+ * The typeFrom is a path to a variable that is mapped to a column type
53
+ * The options indicate if the prefix and suffix should be set
54
+ */
55
+ export interface FormatUpdate {
56
+ index: number;
57
+ path: string;
58
+ typeFrom: string[];
59
+ options: Record<string, boolean>;
60
+ }
61
+ export declare function getWidgetData(widgetInfo: DhType.Widget): PlotlyChartWidgetData;
62
+ export declare function getDataMappings(widgetData: PlotlyChartWidgetData): Map<number, Map<string, string[]>>;
63
+ /**
64
+ * Removes the default colors from the data
65
+ * Data color is not removed if the user set the color specifically or the plot type sets it
66
+ *
67
+ * This only checks if the marker or line color is set to a color in the colorway.
68
+ * This means it is not possible to change the order of the colorway and use the same colors.
69
+ *
70
+ * @param colorway The colorway from plotly
71
+ * @param data The data to remove the colorway from. This will be mutated
72
+ */
73
+ export declare function removeColorsFromData(colorway: string[], data: Data[]): void;
74
+ /**
75
+ * Gets the path parts from a path replacement string from the widget data.
76
+ * The parts start with the plotly data array as the root.
77
+ * E.g. /plotly/data/0/x -> ['0', 'x']
78
+ * @param path The path from the widget data
79
+ * @returns The path parts within the plotly data array
80
+ */
81
+ export declare function getPathParts(path: string): string[];
82
+ /**
83
+ * Checks if a plotly series is a line series without markers
84
+ * @param data The plotly data to check
85
+ * @returns True if the data is a line series without markers
86
+ */
87
+ export declare function isLineSeries(data: Data): boolean;
88
+ /**
89
+ * Checks if a plotly axis type is automatically determined based on the data
90
+ * @param axis The plotly axis to check
91
+ * @returns True if the axis type is determined based on the data
92
+ */
93
+ export declare function isAutoAxis(axis: Partial<LayoutAxis>): boolean;
94
+ /**
95
+ * Checks if a plotly axis type is linear
96
+ * @param axis The plotly axis to check
97
+ * @returns True if the axis is a linear axis
98
+ */
99
+ export declare function isLinearAxis(axis: Partial<LayoutAxis>): boolean;
100
+ /**
101
+ * Check if 2 axis ranges are the same
102
+ * A null range indicates an auto range
103
+ * @param range1 The first axis range options
104
+ * @param range2 The second axis range options
105
+ * @returns True if the range options describe the same range
106
+ */
107
+ export declare function areSameAxisRange(range1: unknown[] | null, range2: unknown[] | null): boolean;
108
+ export interface DownsampleInfo {
109
+ type: 'linear';
110
+ /**
111
+ * The original table before downsampling.
112
+ */
113
+ originalTable: DhType.Table;
114
+ /**
115
+ * The x column to downsample.
116
+ */
117
+ xCol: string;
118
+ /**
119
+ * The y columns to downsample.
120
+ */
121
+ yCols: string[];
122
+ /**
123
+ * The width of the x-axis in pixels.
124
+ */
125
+ width: number;
126
+ /**
127
+ * The range of the x-axis. Null if set to autorange.
128
+ */
129
+ range: string[] | null;
130
+ /**
131
+ * If the range is a datae or number
132
+ */
133
+ rangeType: 'date' | 'number';
134
+ }
135
+ export declare function downsample(dh: typeof DhType, info: DownsampleInfo): Promise<DhType.Table>;
136
+ /**
137
+ * Get the indexes of the replaceable WebGL traces in the data
138
+ * A replaceable WebGL has a type that ends with 'gl' which indicates it has a SVG equivalent
139
+ * @param data The data to check
140
+ * @returns The indexes of the WebGL traces
141
+ */
142
+ export declare function getReplaceableWebGlTraceIndices(data: Data[]): Set<number>;
143
+ /**
144
+ * Check if the data contains any traces that are at least partially powered by WebGL and have no SVG equivalent.
145
+ * @param data The data to check for WebGL traces
146
+ * @returns True if the data contains any unreplaceable WebGL traces
147
+ */
148
+ export declare function hasUnreplaceableWebGlTraces(data: Data[]): boolean;
149
+ /**
150
+ * Set traces to use WebGL if WebGL is enabled and the trace was originally WebGL
151
+ * or swap out WebGL for SVG if WebGL is disabled and the trace was originally WebGL
152
+ * @param data The plotly figure data to update
153
+ * @param webgl True if WebGL is enabled
154
+ * @param webGlTraceIndices The indexes of the traces that are originally WebGL traces
155
+ */
156
+ export declare function setWebGlTraceType(data: Data[], webgl: boolean, webGlTraceIndices: Set<number>): void;
157
+ /**
158
+ * Create rangebreaks from a business calendar
159
+ * @param formatter The formatter to use for the rangebreak calculations
160
+ * @param calendar The business calendar to create the rangebreaks from
161
+ * @param layout The layout to update with the rangebreaks
162
+ * @param chartUtils The chart utils to use for the rangebreaks
163
+ * @returns The updated layout with the rangebreaks added
164
+ */
165
+ export declare function setRangebreaksFromCalendar(formatter: Formatter | null, calendar: DhType.calendar.BusinessCalendar | null, layout: Partial<Layout>, chartUtils: ChartUtils): Partial<Layout> | null;
166
+ /**
167
+ * Check if the data at the selector should be replaced with a single value instead of an array
168
+ * @param data The data to check
169
+ * @param selector The selector to check
170
+ * @returns True if the data at the selector should be replaced with a single value
171
+ */
172
+ export declare function isSingleValue(data: Data[], selector: string[]): boolean;
173
+ /**
174
+ * Set the default value formats for all traces that require it
175
+ * @param plotlyData The plotly data to update
176
+ * @param defaultValueFormatSet The set of updates to make
177
+ * @param dataTypeMap The map of path to column type to pull the correct default format from
178
+ * @param formatter The formatter to use to get the default format
179
+ */
180
+ export declare function setDefaultValueFormat(plotlyData: Data[], defaultValueFormatSet: Set<FormatUpdate>, dataTypeMap: Map<string, string>, formatter?: Formatter | null): void;
181
+ /**
182
+ * Convert the number format to a d3 number format
183
+ * @param data The data to update
184
+ * @param valueFormat The number format to convert to a d3 format
185
+ * @param options Options of what to update
186
+ */
187
+ export declare function convertToPlotlyNumberFormat(data: Partial<PlotNumber> | Partial<Delta>, valueFormat: string, options?: Record<string, boolean>): void;
188
+ /**
189
+ * Transform the number format to a d3 number format, which is used by Plotly
190
+ * @param numberFormat The number format to transform
191
+ * @returns The d3 number format
192
+ */
193
+ export declare function transformValueFormat(data: Partial<PlotNumber> | Partial<Delta>): Record<string, boolean>;
194
+ /**
195
+ * Replace the number formats in the data with a d3 number format
196
+ * @param data The data to update
197
+ */
198
+ export declare function replaceValueFormat(plotlyData: Data[]): Set<FormatUpdate>;
199
+ /**
200
+ * Get the types of variables assocated with columns in the data
201
+ * For example, if the path /plotly/data/0/value is associated with a column of type int,
202
+ * the map will have the entry '0/value' -> 'int'
203
+ * @param deephavenData The deephaven data from the widget to get path and column name from
204
+ * @param tableReferenceMap The map of table index to table reference.
205
+ * Types are pulled from the table reference
206
+ * @returns A map of path to column type
207
+ */
208
+ export declare function getDataTypeMap(deephavenData: PlotlyChartDeephavenData, tableReferenceMap: Map<number, DhType.Table>): Map<string, string>;
209
+ /**
210
+ * Check if WebGL is supported in the current environment.
211
+ * Most modern browsers do support WebGL, but it's possible to disable it and it is also not available
212
+ * in some headless environments, which can affect e2e tests.
213
+ *
214
+ * https://github.com/microsoft/playwright/issues/13146
215
+ * https://bugzilla.mozilla.org/show_bug.cgi?id=1375585
216
+ *
217
+ * @returns True if WebGL is supported, false otherwise
218
+ */
219
+ export declare function isWebGLSupported(): boolean;
220
+ export declare const IS_WEBGL_SUPPORTED: boolean;
221
+ export {};
222
+ //# sourceMappingURL=PlotlyExpressChartUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlotlyExpressChartUtils.d.ts","sourceRoot":"","sources":["../src/PlotlyExpressChartUtils.ts"],"names":[],"mappings":"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"}