@cubejs-client/react 0.30.60 → 0.30.64

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.
@@ -1,289 +1,197 @@
1
- import 'core-js/modules/es.reflect.construct.js';
2
- import 'core-js/modules/es.object.keys.js';
3
- import 'core-js/modules/es.symbol.js';
4
- import 'core-js/modules/es.array.filter.js';
5
- import 'core-js/modules/es.object.get-own-property-descriptor.js';
6
- import 'core-js/modules/es.array.for-each.js';
7
- import 'core-js/modules/web.dom-collections.for-each.js';
8
- import 'core-js/modules/es.object.get-own-property-descriptors.js';
9
- import 'core-js/modules/es.object.define-properties.js';
10
- import 'core-js/modules/es.object.define-property.js';
11
- import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
12
- import _defineProperty from '@babel/runtime/helpers/defineProperty';
13
- import _classCallCheck from '@babel/runtime/helpers/classCallCheck';
14
- import _createClass from '@babel/runtime/helpers/createClass';
15
- import _inherits from '@babel/runtime/helpers/inherits';
16
- import _possibleConstructorReturn from '@babel/runtime/helpers/possibleConstructorReturn';
17
- import _getPrototypeOf from '@babel/runtime/helpers/getPrototypeOf';
18
- import 'core-js/modules/es.array.iterator.js';
19
- import 'core-js/modules/es.object.to-string.js';
20
- import 'core-js/modules/es.promise.js';
21
- import 'core-js/modules/es.string.iterator.js';
22
- import 'core-js/modules/web.dom-collections.iterator.js';
23
- import 'core-js/modules/es.array.map.js';
24
- import 'core-js/modules/es.date.to-string.js';
25
- import 'core-js/modules/es.regexp.to-string.js';
26
1
  import React, { createContext, useRef, useEffect, useContext, useState } from 'react';
27
2
  import { equals, toPairs, fromPairs, uniqBy, prop, indexBy, uniq, pick, clone } from 'ramda';
28
- import { isQueryPresent, getQueryMembers, flattenFilters, moveItemInArray, movePivotItem, removeEmptyQueryFields, ResultSet, defaultOrder, validateQuery, defaultHeuristics, areQueriesEqual } from '@cubejs-client/core';
29
- import _extends from '@babel/runtime/helpers/extends';
30
- import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
31
- import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
32
- import _asyncToGenerator from '@babel/runtime/helpers/asyncToGenerator';
33
- import _assertThisInitialized from '@babel/runtime/helpers/assertThisInitialized';
34
- import _regeneratorRuntime from '@babel/runtime/regenerator';
35
- import 'core-js/modules/es.regexp.exec.js';
36
- import 'core-js/modules/es.string.replace.js';
37
- import 'core-js/modules/es.function.name.js';
38
- import 'core-js/modules/es.array.concat.js';
39
- import 'core-js/modules/es.array.splice.js';
40
- import 'core-js/modules/es.array.sort.js';
41
- import 'core-js/modules/es.array.is-array.js';
42
- import 'core-js/modules/es.object.from-entries.js';
43
- import 'core-js/modules/es.array.find.js';
44
- import 'core-js/modules/es.array.reduce.js';
45
- import _typeof from '@babel/runtime/helpers/typeof';
46
- import 'core-js/modules/es.object.entries.js';
3
+ import { isQueryPresent, getQueryMembers, flattenFilters, moveItemInArray, movePivotItem, removeEmptyQueryFields, defaultOrder, ResultSet, validateQuery, defaultHeuristics, areQueriesEqual } from '@cubejs-client/core';
47
4
 
48
5
  var CubeContext = /*#__PURE__*/createContext(null);
49
6
 
50
- function ownKeys$6(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
51
-
52
- function _objectSpread$6(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$6(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$6(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
53
-
54
- function _createSuper$1(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$1(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
7
+ class QueryRenderer extends React.Component {
8
+ // @deprected use `isQueryPresent` from `@cubejs-client/core`
9
+ static isQueryPresent(query) {
10
+ return isQueryPresent(query);
11
+ }
55
12
 
56
- function _isNativeReflectConstruct$1() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
13
+ constructor(props) {
14
+ super(props);
15
+ this.state = {};
16
+ this.mutexObj = {};
17
+ }
57
18
 
58
- var QueryRenderer = /*#__PURE__*/function (_React$Component) {
59
- _inherits(QueryRenderer, _React$Component);
19
+ componentDidMount() {
20
+ const {
21
+ query,
22
+ queries
23
+ } = this.props;
60
24
 
61
- var _super = _createSuper$1(QueryRenderer);
25
+ if (query) {
26
+ this.load(query);
27
+ }
62
28
 
63
- function QueryRenderer(props) {
64
- var _this;
29
+ if (queries) {
30
+ this.loadQueries(queries);
31
+ }
32
+ }
65
33
 
66
- _classCallCheck(this, QueryRenderer);
34
+ shouldComponentUpdate(nextProps, nextState) {
35
+ const {
36
+ query,
37
+ queries,
38
+ render,
39
+ cubejsApi,
40
+ loadSql,
41
+ updateOnlyOnStateChange
42
+ } = this.props;
43
+
44
+ if (!updateOnlyOnStateChange) {
45
+ return true;
46
+ }
67
47
 
68
- _this = _super.call(this, props);
69
- _this.state = {};
70
- _this.mutexObj = {};
71
- return _this;
48
+ return !equals(nextProps.query, query) || !equals(nextProps.queries, queries) || (nextProps.render == null || render == null) && nextProps.render !== render || nextProps.cubejsApi !== cubejsApi || nextProps.loadSql !== loadSql || !equals(nextState, this.state) || nextProps.updateOnlyOnStateChange !== updateOnlyOnStateChange;
72
49
  }
73
50
 
74
- _createClass(QueryRenderer, [{
75
- key: "componentDidMount",
76
- value: function componentDidMount() {
77
- var _this$props = this.props,
78
- query = _this$props.query,
79
- queries = _this$props.queries;
51
+ componentDidUpdate(prevProps) {
52
+ const {
53
+ query,
54
+ queries
55
+ } = this.props;
80
56
 
81
- if (query) {
82
- this.load(query);
83
- }
84
-
85
- if (queries) {
86
- this.loadQueries(queries);
87
- }
57
+ if (!equals(prevProps.query, query)) {
58
+ this.load(query);
88
59
  }
89
- }, {
90
- key: "shouldComponentUpdate",
91
- value: function shouldComponentUpdate(nextProps, nextState) {
92
- var _this$props2 = this.props,
93
- query = _this$props2.query,
94
- queries = _this$props2.queries,
95
- render = _this$props2.render,
96
- cubejsApi = _this$props2.cubejsApi,
97
- loadSql = _this$props2.loadSql,
98
- updateOnlyOnStateChange = _this$props2.updateOnlyOnStateChange;
99
-
100
- if (!updateOnlyOnStateChange) {
101
- return true;
102
- }
103
60
 
104
- return !equals(nextProps.query, query) || !equals(nextProps.queries, queries) || (nextProps.render == null || render == null) && nextProps.render !== render || nextProps.cubejsApi !== cubejsApi || nextProps.loadSql !== loadSql || !equals(nextState, this.state) || nextProps.updateOnlyOnStateChange !== updateOnlyOnStateChange;
61
+ if (!equals(prevProps.queries, queries)) {
62
+ this.loadQueries(queries);
105
63
  }
106
- }, {
107
- key: "componentDidUpdate",
108
- value: function componentDidUpdate(prevProps) {
109
- var _this$props3 = this.props,
110
- query = _this$props3.query,
111
- queries = _this$props3.queries;
112
-
113
- if (!equals(prevProps.query, query)) {
114
- this.load(query);
115
- }
64
+ }
116
65
 
117
- if (!equals(prevProps.queries, queries)) {
118
- this.loadQueries(queries);
119
- }
120
- }
121
- }, {
122
- key: "cubejsApi",
123
- value: function cubejsApi() {
124
- // eslint-disable-next-line react/destructuring-assignment
125
- return this.props.cubejsApi || this.context && this.context.cubejsApi;
126
- }
127
- }, {
128
- key: "load",
129
- value: function load(query) {
130
- var _this2 = this;
66
+ cubejsApi() {
67
+ // eslint-disable-next-line react/destructuring-assignment
68
+ return this.props.cubejsApi || this.context && this.context.cubejsApi;
69
+ }
131
70
 
132
- var resetResultSetOnChange = this.props.resetResultSetOnChange;
133
- this.setState(_objectSpread$6({
134
- isLoading: true,
135
- error: null,
136
- sqlQuery: null
137
- }, resetResultSetOnChange ? {
71
+ load(query) {
72
+ const {
73
+ resetResultSetOnChange
74
+ } = this.props;
75
+ this.setState({
76
+ isLoading: true,
77
+ error: null,
78
+ sqlQuery: null,
79
+ ...(resetResultSetOnChange ? {
138
80
  resultSet: null
139
- } : {}));
140
- var loadSql = this.props.loadSql;
141
- var cubejsApi = this.cubejsApi();
142
-
143
- if (query && isQueryPresent(query)) {
144
- if (loadSql === 'only') {
145
- cubejsApi.sql(query, {
146
- mutexObj: this.mutexObj,
147
- mutexKey: 'sql'
148
- }).then(function (sqlQuery) {
149
- return _this2.setState({
150
- sqlQuery: sqlQuery,
151
- error: null,
152
- isLoading: false
153
- });
154
- })["catch"](function (error) {
155
- return _this2.setState(_objectSpread$6(_objectSpread$6({}, resetResultSetOnChange ? {
156
- resultSet: null
157
- } : {}), {}, {
158
- error: error,
159
- isLoading: false
160
- }));
161
- });
162
- } else if (loadSql) {
163
- Promise.all([cubejsApi.sql(query, {
164
- mutexObj: this.mutexObj,
165
- mutexKey: 'sql'
166
- }), cubejsApi.load(query, {
167
- mutexObj: this.mutexObj,
168
- mutexKey: 'query'
169
- })]).then(function (_ref) {
170
- var _ref2 = _slicedToArray(_ref, 2),
171
- sqlQuery = _ref2[0],
172
- resultSet = _ref2[1];
173
-
174
- return _this2.setState({
175
- sqlQuery: sqlQuery,
176
- resultSet: resultSet,
177
- error: null,
178
- isLoading: false
179
- });
180
- })["catch"](function (error) {
181
- return _this2.setState(_objectSpread$6(_objectSpread$6({}, resetResultSetOnChange ? {
182
- resultSet: null
183
- } : {}), {}, {
184
- error: error,
185
- isLoading: false
186
- }));
187
- });
188
- } else {
189
- cubejsApi.load(query, {
190
- mutexObj: this.mutexObj,
191
- mutexKey: 'query'
192
- }).then(function (resultSet) {
193
- return _this2.setState({
194
- resultSet: resultSet,
195
- error: null,
196
- isLoading: false
197
- });
198
- })["catch"](function (error) {
199
- return _this2.setState(_objectSpread$6(_objectSpread$6({}, resetResultSetOnChange ? {
200
- resultSet: null
201
- } : {}), {}, {
202
- error: error,
203
- isLoading: false
204
- }));
205
- });
206
- }
207
- }
208
- }
209
- }, {
210
- key: "loadQueries",
211
- value: function loadQueries(queries) {
212
- var _this3 = this;
213
-
214
- var cubejsApi = this.cubejsApi();
215
- var resetResultSetOnChange = this.props.resetResultSetOnChange;
216
- this.setState(_objectSpread$6(_objectSpread$6({
217
- isLoading: true
218
- }, resetResultSetOnChange ? {
219
- resultSet: null
220
- } : {}), {}, {
221
- error: null
222
- }));
223
- var resultPromises = Promise.all(toPairs(queries).map(function (_ref3) {
224
- var _ref4 = _slicedToArray(_ref3, 2),
225
- name = _ref4[0],
226
- query = _ref4[1];
227
-
228
- return cubejsApi.load(query, {
229
- mutexObj: _this3.mutexObj,
230
- mutexKey: name
231
- }).then(function (r) {
232
- return [name, r];
233
- });
234
- }));
235
- resultPromises.then(function (resultSet) {
236
- return _this3.setState({
237
- resultSet: fromPairs(resultSet),
81
+ } : {})
82
+ });
83
+ const {
84
+ loadSql
85
+ } = this.props;
86
+ const cubejsApi = this.cubejsApi();
87
+
88
+ if (query && isQueryPresent(query)) {
89
+ if (loadSql === 'only') {
90
+ cubejsApi.sql(query, {
91
+ mutexObj: this.mutexObj,
92
+ mutexKey: 'sql'
93
+ }).then(sqlQuery => this.setState({
94
+ sqlQuery,
238
95
  error: null,
239
96
  isLoading: false
240
- });
241
- })["catch"](function (error) {
242
- return _this3.setState(_objectSpread$6(_objectSpread$6({}, resetResultSetOnChange ? {
243
- resultSet: null
244
- } : {}), {}, {
245
- error: error,
97
+ })).catch(error => this.setState({ ...(resetResultSetOnChange ? {
98
+ resultSet: null
99
+ } : {}),
100
+ error,
246
101
  isLoading: false
247
102
  }));
248
- });
103
+ } else if (loadSql) {
104
+ Promise.all([cubejsApi.sql(query, {
105
+ mutexObj: this.mutexObj,
106
+ mutexKey: 'sql'
107
+ }), cubejsApi.load(query, {
108
+ mutexObj: this.mutexObj,
109
+ mutexKey: 'query'
110
+ })]).then(([sqlQuery, resultSet]) => this.setState({
111
+ sqlQuery,
112
+ resultSet,
113
+ error: null,
114
+ isLoading: false
115
+ })).catch(error => this.setState({ ...(resetResultSetOnChange ? {
116
+ resultSet: null
117
+ } : {}),
118
+ error,
119
+ isLoading: false
120
+ }));
121
+ } else {
122
+ cubejsApi.load(query, {
123
+ mutexObj: this.mutexObj,
124
+ mutexKey: 'query'
125
+ }).then(resultSet => this.setState({
126
+ resultSet,
127
+ error: null,
128
+ isLoading: false
129
+ })).catch(error => this.setState({ ...(resetResultSetOnChange ? {
130
+ resultSet: null
131
+ } : {}),
132
+ error,
133
+ isLoading: false
134
+ }));
135
+ }
249
136
  }
250
- }, {
251
- key: "render",
252
- value: function render() {
253
- var _error$response;
254
-
255
- var _this$state = this.state,
256
- error = _this$state.error,
257
- queries = _this$state.queries,
258
- resultSet = _this$state.resultSet,
259
- isLoading = _this$state.isLoading,
260
- sqlQuery = _this$state.sqlQuery;
261
- var render = this.props.render;
262
- var loadState = {
263
- error: error ? new Error(((_error$response = error.response) === null || _error$response === void 0 ? void 0 : _error$response.plainError) || error.message || error.toString()) : null,
264
- resultSet: queries ? resultSet || {} : resultSet,
265
- loadingState: {
266
- isLoading: isLoading
267
- },
268
- sqlQuery: sqlQuery
269
- };
137
+ }
270
138
 
271
- if (render) {
272
- return render(loadState);
273
- }
139
+ loadQueries(queries) {
140
+ const cubejsApi = this.cubejsApi();
141
+ const {
142
+ resetResultSetOnChange
143
+ } = this.props;
144
+ this.setState({
145
+ isLoading: true,
146
+ ...(resetResultSetOnChange ? {
147
+ resultSet: null
148
+ } : {}),
149
+ error: null
150
+ });
151
+ const resultPromises = Promise.all(toPairs(queries).map(([name, query]) => cubejsApi.load(query, {
152
+ mutexObj: this.mutexObj,
153
+ mutexKey: name
154
+ }).then(r => [name, r])));
155
+ resultPromises.then(resultSet => this.setState({
156
+ resultSet: fromPairs(resultSet),
157
+ error: null,
158
+ isLoading: false
159
+ })).catch(error => this.setState({ ...(resetResultSetOnChange ? {
160
+ resultSet: null
161
+ } : {}),
162
+ error,
163
+ isLoading: false
164
+ }));
165
+ }
274
166
 
275
- return null;
276
- }
277
- }], [{
278
- key: "isQueryPresent",
279
- value: // @deprected use `isQueryPresent` from `@cubejs-client/core`
280
- function isQueryPresent$1(query) {
281
- return isQueryPresent(query);
167
+ render() {
168
+ const {
169
+ error,
170
+ queries,
171
+ resultSet,
172
+ isLoading,
173
+ sqlQuery
174
+ } = this.state;
175
+ const {
176
+ render
177
+ } = this.props;
178
+ const loadState = {
179
+ error: error ? new Error(error.response?.plainError || error.message || error.toString()) : null,
180
+ resultSet: queries ? resultSet || {} : resultSet,
181
+ loadingState: {
182
+ isLoading
183
+ },
184
+ sqlQuery
185
+ };
186
+
187
+ if (render) {
188
+ return render(loadState);
282
189
  }
283
- }]);
284
190
 
285
- return QueryRenderer;
286
- }(React.Component);
191
+ return null;
192
+ }
193
+
194
+ }
287
195
  QueryRenderer.contextType = CubeContext;
288
196
  QueryRenderer.defaultProps = {
289
197
  cubejsApi: null,
@@ -295,30 +203,38 @@ QueryRenderer.defaultProps = {
295
203
  resetResultSetOnChange: true
296
204
  };
297
205
 
298
- var _excluded$1 = ["query"];
206
+ function _extends() {
207
+ _extends = Object.assign || function (target) {
208
+ for (var i = 1; i < arguments.length; i++) {
209
+ var source = arguments[i];
299
210
 
300
- function ownKeys$5(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
211
+ for (var key in source) {
212
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
213
+ target[key] = source[key];
214
+ }
215
+ }
216
+ }
301
217
 
302
- function _objectSpread$5(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$5(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$5(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
218
+ return target;
219
+ };
303
220
 
304
- var QueryRendererWithTotals = function QueryRendererWithTotals(_ref) {
305
- var query = _ref.query,
306
- restProps = _objectWithoutProperties(_ref, _excluded$1);
221
+ return _extends.apply(this, arguments);
222
+ }
307
223
 
308
- return /*#__PURE__*/React.createElement(QueryRenderer, _extends({
309
- queries: {
310
- totals: _objectSpread$5(_objectSpread$5({}, query), {}, {
311
- dimensions: [],
312
- timeDimensions: query.timeDimensions ? query.timeDimensions.map(function (td) {
313
- return _objectSpread$5(_objectSpread$5({}, td), {}, {
314
- granularity: null
315
- });
316
- }) : undefined
317
- }),
318
- main: query
319
- }
320
- }, restProps));
321
- };
224
+ const QueryRendererWithTotals = ({
225
+ query,
226
+ ...restProps
227
+ }) => /*#__PURE__*/React.createElement(QueryRenderer, _extends({
228
+ queries: {
229
+ totals: { ...query,
230
+ dimensions: [],
231
+ timeDimensions: query.timeDimensions ? query.timeDimensions.map(td => ({ ...td,
232
+ granularity: null
233
+ })) : undefined
234
+ },
235
+ main: query
236
+ }
237
+ }, restProps));
322
238
 
323
239
  QueryRendererWithTotals.defaultProps = {
324
240
  query: null,
@@ -328,36 +244,20 @@ QueryRendererWithTotals.defaultProps = {
328
244
  };
329
245
 
330
246
  function removeEmpty(obj) {
331
- if (_typeof(obj) !== 'object') {
247
+ if (typeof obj !== 'object') {
332
248
  return obj;
333
249
  }
334
250
 
335
- return Object.fromEntries(Object.entries(obj).filter(function (_ref) {
336
- var _ref2 = _slicedToArray(_ref, 2),
337
- v = _ref2[1];
338
-
339
- return v != null;
340
- }).map(function (_ref3) {
341
- var _ref4 = _slicedToArray(_ref3, 2),
342
- k = _ref4[0],
343
- v = _ref4[1];
344
-
251
+ return Object.fromEntries(Object.entries(obj).filter(([, v]) => v != null).map(([k, v]) => {
345
252
  if (Array.isArray(v)) {
346
253
  return [k, v.map(removeEmpty)];
347
254
  }
348
255
 
349
- return [k, _typeof(v) === 'object' ? removeEmpty(v) : v];
256
+ return [k, typeof v === 'object' ? removeEmpty(v) : v];
350
257
  }));
351
258
  }
352
259
 
353
- function ownKeys$4(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
354
-
355
- function _objectSpread$4(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$4(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$4(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
356
-
357
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
358
-
359
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
360
- var granularities = [{
260
+ const granularities = [{
361
261
  name: undefined,
362
262
  title: 'w/o grouping'
363
263
  }, {
@@ -385,80 +285,63 @@ var granularities = [{
385
285
  name: 'year',
386
286
  title: 'Year'
387
287
  }];
288
+ class QueryBuilder extends React.Component {
289
+ static contextType = CubeContext; // This is an anti-pattern, only kept for backward compatibility
290
+ // https://reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html#anti-pattern-unconditionally-copying-props-to-state
291
+
292
+ static getDerivedStateFromProps(props, state) {
293
+ if (props.query || props.vizState) {
294
+ const nextState = { ...state,
295
+ ...(props.vizState || {})
296
+ };
388
297
 
389
- var QueryBuilder = /*#__PURE__*/function (_React$Component) {
390
- _inherits(QueryBuilder, _React$Component);
391
-
392
- var _super = _createSuper(QueryBuilder);
298
+ if (Array.isArray(props.query)) {
299
+ throw new Error('Array of queries is not supported.');
300
+ }
393
301
 
394
- function QueryBuilder(props) {
395
- var _this;
302
+ return { ...nextState,
303
+ query: { ...nextState.query,
304
+ ...(props.query || {})
305
+ }
306
+ };
307
+ }
396
308
 
397
- _classCallCheck(this, QueryBuilder);
309
+ return null;
310
+ }
398
311
 
399
- _this = _super.call(this, props);
312
+ static resolveMember(type, {
313
+ meta,
314
+ query
315
+ }) {
316
+ if (!meta) {
317
+ return [];
318
+ }
400
319
 
401
- _defineProperty(_assertThisInitialized(_this), "fetchMeta", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
402
- var meta, metaError, richMetaError, metaErrorStack, _error$response, _error$response2, _error$response2$stac;
320
+ if (Array.isArray(query)) {
321
+ return query.reduce((memo, currentQuery) => memo.concat(QueryBuilder.resolveMember(type, {
322
+ meta,
323
+ query: currentQuery
324
+ })), []);
325
+ }
403
326
 
404
- return _regeneratorRuntime.wrap(function _callee$(_context) {
405
- while (1) {
406
- switch (_context.prev = _context.next) {
407
- case 0:
408
- if (_this.cubejsApi()) {
409
- _context.next = 2;
410
- break;
411
- }
327
+ if (type === 'timeDimensions') {
328
+ return (query.timeDimensions || []).map((m, index) => ({ ...m,
329
+ dimension: { ...meta.resolveMember(m.dimension, 'dimensions'),
330
+ granularities
331
+ },
332
+ index
333
+ }));
334
+ }
412
335
 
413
- return _context.abrupt("return");
414
-
415
- case 2:
416
- metaError = null;
417
- richMetaError = null;
418
- metaErrorStack = null;
419
- _context.prev = 5;
420
-
421
- _this.setState({
422
- isFetchingMeta: true
423
- });
424
-
425
- _context.next = 9;
426
- return _this.cubejsApi().meta();
427
-
428
- case 9:
429
- meta = _context.sent;
430
- _context.next = 17;
431
- break;
432
-
433
- case 12:
434
- _context.prev = 12;
435
- _context.t0 = _context["catch"](5);
436
- metaError = ((_error$response = _context.t0.response) === null || _error$response === void 0 ? void 0 : _error$response.plainError) || _context.t0;
437
- richMetaError = _context.t0;
438
- metaErrorStack = ((_error$response2 = _context.t0.response) === null || _error$response2 === void 0 ? void 0 : (_error$response2$stac = _error$response2.stack) === null || _error$response2$stac === void 0 ? void 0 : _error$response2$stac.replace(_context.t0.message || '', '')) || '';
439
-
440
- case 17:
441
- _this.setState({
442
- meta: meta,
443
- metaError: metaError ? new Error(metaError.message || metaError.toString()) : null,
444
- richMetaError: richMetaError,
445
- metaErrorStack: metaErrorStack,
446
- isFetchingMeta: false
447
- }, function () {
448
- // Run update query to force viz state update
449
- // This will catch any new missing members, and also validate the query against the new meta
450
- _this.updateQuery({});
451
- });
452
-
453
- case 18:
454
- case "end":
455
- return _context.stop();
456
- }
457
- }
458
- }, _callee, null, [[5, 12]]);
459
- })));
336
+ return (query[type] || []).map((m, index) => ({
337
+ index,
338
+ ...meta.resolveMember(m, type)
339
+ }));
340
+ }
460
341
 
461
- _this.state = _objectSpread$4(_objectSpread$4({
342
+ constructor(props) {
343
+ super(props);
344
+ this.state = {
462
345
  query: props.defaultQuery || props.query,
463
346
  chartType: props.defaultChartType,
464
347
  validatedQuery: props.query,
@@ -466,679 +349,526 @@ var QueryBuilder = /*#__PURE__*/function (_React$Component) {
466
349
  missingMembers: [],
467
350
  // todo: rename to `isMetaReady`
468
351
  isFetchingMeta: true,
469
- dryRunResponse: null
470
- }, props.vizState), props.initialVizState);
471
- _this.mutexObj = {};
472
- _this.orderMembersOrderKeys = [];
473
- return _this;
352
+ dryRunResponse: null,
353
+ ...props.vizState,
354
+ // deprecated
355
+ ...props.initialVizState
356
+ };
357
+ this.mutexObj = {};
358
+ this.orderMembersOrderKeys = [];
474
359
  }
475
360
 
476
- _createClass(QueryBuilder, [{
477
- key: "componentDidMount",
478
- value: function () {
479
- var _componentDidMount = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
480
- return _regeneratorRuntime.wrap(function _callee2$(_context2) {
481
- while (1) {
482
- switch (_context2.prev = _context2.next) {
483
- case 0:
484
- this.prevContext = this.context;
485
- _context2.next = 3;
486
- return this.fetchMeta();
487
-
488
- case 3:
489
- case "end":
490
- return _context2.stop();
491
- }
492
- }
493
- }, _callee2, this);
494
- }));
495
-
496
- function componentDidMount() {
497
- return _componentDidMount.apply(this, arguments);
498
- }
499
-
500
- return componentDidMount;
501
- }()
502
- }, {
503
- key: "componentDidUpdate",
504
- value: function () {
505
- var _componentDidUpdate = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4(prevProps) {
506
- var _this$prevContext,
507
- _this$context,
508
- _this2 = this;
509
-
510
- var _this$props, schemaVersion, onSchemaChange, meta, newMeta;
511
-
512
- return _regeneratorRuntime.wrap(function _callee4$(_context4) {
513
- while (1) {
514
- switch (_context4.prev = _context4.next) {
515
- case 0:
516
- _this$props = this.props, schemaVersion = _this$props.schemaVersion, onSchemaChange = _this$props.onSchemaChange;
517
- meta = this.state.meta;
518
-
519
- if (!(((_this$prevContext = this.prevContext) === null || _this$prevContext === void 0 ? void 0 : _this$prevContext.cubejsApi) !== ((_this$context = this.context) === null || _this$context === void 0 ? void 0 : _this$context.cubejsApi))) {
520
- _context4.next = 6;
521
- break;
522
- }
523
-
524
- this.prevContext = this.context;
525
- _context4.next = 6;
526
- return this.fetchMeta();
527
-
528
- case 6:
529
- if (!(prevProps.schemaVersion !== schemaVersion)) {
530
- _context4.next = 17;
531
- break;
532
- }
533
-
534
- _context4.prev = 7;
535
- _context4.next = 10;
536
- return this.cubejsApi().meta();
537
-
538
- case 10:
539
- newMeta = _context4.sent;
540
-
541
- if (!equals(newMeta, meta) && typeof onSchemaChange === 'function') {
542
- onSchemaChange({
543
- schemaVersion: schemaVersion,
544
- refresh: function () {
545
- var _refresh = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
546
- return _regeneratorRuntime.wrap(function _callee3$(_context3) {
547
- while (1) {
548
- switch (_context3.prev = _context3.next) {
549
- case 0:
550
- _context3.next = 2;
551
- return _this2.fetchMeta();
552
-
553
- case 2:
554
- case "end":
555
- return _context3.stop();
556
- }
557
- }
558
- }, _callee3);
559
- }));
560
-
561
- function refresh() {
562
- return _refresh.apply(this, arguments);
563
- }
564
-
565
- return refresh;
566
- }()
567
- });
568
- }
361
+ async componentDidMount() {
362
+ this.prevContext = this.context;
363
+ await this.fetchMeta();
364
+ }
569
365
 
570
- _context4.next = 17;
571
- break;
366
+ async componentDidUpdate(prevProps) {
367
+ const {
368
+ schemaVersion,
369
+ onSchemaChange
370
+ } = this.props;
371
+ const {
372
+ meta
373
+ } = this.state;
374
+
375
+ if (this.prevContext?.cubejsApi !== this.context?.cubejsApi) {
376
+ this.prevContext = this.context;
377
+ await this.fetchMeta();
378
+ }
572
379
 
573
- case 14:
574
- _context4.prev = 14;
575
- _context4.t0 = _context4["catch"](7);
576
- // eslint-disable-next-line
577
- this.setState({
578
- metaError: _context4.t0
579
- });
380
+ if (prevProps.schemaVersion !== schemaVersion) {
381
+ try {
382
+ const newMeta = await this.cubejsApi().meta();
580
383
 
581
- case 17:
582
- case "end":
583
- return _context4.stop();
384
+ if (!equals(newMeta, meta) && typeof onSchemaChange === 'function') {
385
+ onSchemaChange({
386
+ schemaVersion,
387
+ refresh: async () => {
388
+ await this.fetchMeta();
584
389
  }
585
- }
586
- }, _callee4, this, [[7, 14]]);
587
- }));
588
-
589
- function componentDidUpdate(_x) {
590
- return _componentDidUpdate.apply(this, arguments);
390
+ });
391
+ }
392
+ } catch (error) {
393
+ // eslint-disable-next-line
394
+ this.setState({
395
+ metaError: error
396
+ });
591
397
  }
398
+ }
399
+ }
592
400
 
593
- return componentDidUpdate;
594
- }()
595
- }, {
596
- key: "cubejsApi",
597
- value: function cubejsApi() {
598
- var cubejsApi = this.props.cubejsApi; // eslint-disable-next-line react/destructuring-assignment
401
+ fetchMeta = async () => {
402
+ if (!this.cubejsApi()) {
403
+ return;
404
+ }
599
405
 
600
- return cubejsApi || this.context && this.context.cubejsApi;
406
+ let meta;
407
+ let metaError = null;
408
+ let richMetaError = null;
409
+ let metaErrorStack = null;
410
+
411
+ try {
412
+ this.setState({
413
+ isFetchingMeta: true
414
+ });
415
+ meta = await this.cubejsApi().meta();
416
+ } catch (error) {
417
+ metaError = error.response?.plainError || error;
418
+ richMetaError = error;
419
+ metaErrorStack = error.response?.stack?.replace(error.message || '', '') || '';
601
420
  }
602
- }, {
603
- key: "getMissingMembers",
604
- value: function getMissingMembers(query, meta) {
605
- if (!meta) {
606
- return [];
607
- }
608
421
 
609
- return getQueryMembers(query).map(function (member) {
610
- var resolvedMember = meta.resolveMember(member, ['measures', 'dimensions', 'segments']);
422
+ this.setState({
423
+ meta,
424
+ metaError: metaError ? new Error(metaError.message || metaError.toString()) : null,
425
+ richMetaError,
426
+ metaErrorStack,
427
+ isFetchingMeta: false
428
+ }, () => {
429
+ // Run update query to force viz state update
430
+ // This will catch any new missing members, and also validate the query against the new meta
431
+ this.updateQuery({});
432
+ });
433
+ };
611
434
 
612
- if (resolvedMember.error) {
613
- return member;
614
- }
435
+ cubejsApi() {
436
+ const {
437
+ cubejsApi
438
+ } = this.props; // eslint-disable-next-line react/destructuring-assignment
615
439
 
616
- return false;
617
- }).filter(Boolean);
618
- }
619
- }, {
620
- key: "isQueryPresent",
621
- value: function isQueryPresent() {
622
- var query = this.state.query;
623
- return QueryRenderer.isQueryPresent(query);
440
+ return cubejsApi || this.context && this.context.cubejsApi;
441
+ }
442
+
443
+ getMissingMembers(query, meta) {
444
+ if (!meta) {
445
+ return [];
624
446
  }
625
- }, {
626
- key: "prepareRenderProps",
627
- value: function prepareRenderProps(queryRendererProps) {
628
- var _this3 = this;
629
447
 
630
- var getName = function getName(member) {
631
- return member.name;
632
- };
448
+ return getQueryMembers(query).map(member => {
449
+ const resolvedMember = meta.resolveMember(member, ['measures', 'dimensions', 'segments']);
633
450
 
634
- var toTimeDimension = function toTimeDimension(member) {
635
- var rangeSelection = member.compareDateRange ? {
636
- compareDateRange: member.compareDateRange
637
- } : {
638
- dateRange: member.dateRange
639
- };
640
- return removeEmpty(_objectSpread$4({
641
- dimension: member.dimension.name,
642
- granularity: member.granularity
643
- }, rangeSelection));
644
- };
451
+ if (resolvedMember.error) {
452
+ return member;
453
+ }
645
454
 
646
- var toFilter = function toFilter(member) {
647
- var _member$member, _member$dimension;
455
+ return false;
456
+ }).filter(Boolean);
457
+ }
648
458
 
649
- return {
650
- member: ((_member$member = member.member) === null || _member$member === void 0 ? void 0 : _member$member.name) || ((_member$dimension = member.dimension) === null || _member$dimension === void 0 ? void 0 : _member$dimension.name),
651
- operator: member.operator,
652
- values: member.values
653
- };
654
- };
459
+ isQueryPresent() {
460
+ const {
461
+ query
462
+ } = this.state;
463
+ return QueryRenderer.isQueryPresent(query);
464
+ }
655
465
 
656
- var updateMethods = function updateMethods(memberType) {
657
- var toQuery = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getName;
658
- return {
659
- add: function add(member) {
660
- var query = _this3.state.query;
661
-
662
- _this3.updateQuery(_defineProperty({}, memberType, (query[memberType] || []).concat(toQuery(member))));
663
- },
664
- remove: function remove(member) {
665
- var query = _this3.state.query;
666
- return _this3.updateQuery(_defineProperty({}, memberType, (query[memberType] || []).filter(function (_, index) {
667
- return index !== member.index;
668
- })));
669
- },
670
- update: function update(member, updateWith) {
671
- var query = _this3.state.query;
672
- var members = (query[memberType] || []).concat([]);
673
- members.splice(member.index, 1, toQuery(updateWith));
674
- return _this3.updateQuery(_defineProperty({}, memberType, members));
675
- }
676
- };
466
+ prepareRenderProps(queryRendererProps) {
467
+ const getName = member => member.name;
468
+
469
+ const toTimeDimension = member => {
470
+ const rangeSelection = member.compareDateRange ? {
471
+ compareDateRange: member.compareDateRange
472
+ } : {
473
+ dateRange: member.dateRange
677
474
  };
475
+ return removeEmpty({
476
+ dimension: member.dimension.name,
477
+ granularity: member.granularity,
478
+ ...rangeSelection
479
+ });
480
+ };
678
481
 
679
- var _this$state = this.state,
680
- meta = _this$state.meta,
681
- metaError = _this$state.metaError,
682
- richMetaError = _this$state.richMetaError,
683
- query = _this$state.query,
684
- queryError = _this$state.queryError,
685
- chartType = _this$state.chartType,
686
- pivotConfig = _this$state.pivotConfig,
687
- validatedQuery = _this$state.validatedQuery,
688
- missingMembers = _this$state.missingMembers,
689
- isFetchingMeta = _this$state.isFetchingMeta,
690
- dryRunResponse = _this$state.dryRunResponse,
691
- metaErrorStack = _this$state.metaErrorStack;
692
- var flatFilters = uniqBy(function (filter) {
693
- return "".concat(prop('member', filter)).concat(prop('operator', filter));
694
- }, flattenFilters(meta && query.filters || []).map(function (filter) {
695
- return _objectSpread$4(_objectSpread$4({}, filter), {}, {
696
- member: filter.member || filter.dimension
482
+ const toFilter = member => ({
483
+ member: member.member?.name || member.dimension?.name,
484
+ operator: member.operator,
485
+ values: member.values
486
+ });
487
+
488
+ const updateMethods = (memberType, toQuery = getName) => ({
489
+ add: member => {
490
+ const {
491
+ query
492
+ } = this.state;
493
+ this.updateQuery({
494
+ [memberType]: (query[memberType] || []).concat(toQuery(member))
697
495
  });
698
- }));
699
- var filters = flatFilters.map(function (m, i) {
700
- return _objectSpread$4(_objectSpread$4({}, m), {}, {
701
- dimension: meta.resolveMember(m.member || m.dimension, ['dimensions', 'measures']),
702
- operators: meta.filterOperatorsForMember(m.member || m.dimension, ['dimensions', 'measures']),
703
- index: i
496
+ },
497
+ remove: member => {
498
+ const {
499
+ query
500
+ } = this.state;
501
+ return this.updateQuery({
502
+ [memberType]: (query[memberType] || []).filter((_, index) => index !== member.index)
704
503
  });
705
- });
706
- var measures = QueryBuilder.resolveMember('measures', this.state);
707
- var dimensions = QueryBuilder.resolveMember('dimensions', this.state);
708
- var timeDimensions = QueryBuilder.resolveMember('timeDimensions', this.state);
709
- var segments = (meta && query.segments || []).map(function (m, i) {
710
- return _objectSpread$4({
711
- index: i
712
- }, meta.resolveMember(m, 'segments'));
713
- });
714
- var availableMeasures = [];
715
- var availableDimensions = [];
716
- var availableSegments = [];
717
- var availableFilterMembers = [];
718
- var availableMembers = (meta === null || meta === void 0 ? void 0 : meta.membersGroupedByCube()) || {
719
- measures: [],
720
- dimensions: [],
721
- segments: [],
722
- timeDimensions: []
723
- };
724
-
725
- if (meta) {
726
- availableMeasures = meta.membersForQuery(query, 'measures');
727
- availableDimensions = meta.membersForQuery(query, 'dimensions');
728
- availableSegments = meta.membersForQuery(query, 'segments');
729
- var indexedMeasures = indexBy(prop('cubeName'), availableMembers.measures);
730
- var indexedDimensions = indexBy(prop('cubeName'), availableMembers.dimensions);
731
- var cubeNames = uniq([].concat(_toConsumableArray(Object.keys(indexedMeasures)), _toConsumableArray(Object.keys(indexedDimensions)))).sort();
732
- availableFilterMembers = cubeNames.map(function (name) {
733
- var _indexedMeasures$name, _indexedDimensions$na;
734
-
735
- var cube = indexedMeasures[name] || indexedDimensions[name];
736
- return _objectSpread$4(_objectSpread$4({}, cube), {}, {
737
- members: [].concat(_toConsumableArray((_indexedMeasures$name = indexedMeasures[name]) === null || _indexedMeasures$name === void 0 ? void 0 : _indexedMeasures$name.members), _toConsumableArray((_indexedDimensions$na = indexedDimensions[name]) === null || _indexedDimensions$na === void 0 ? void 0 : _indexedDimensions$na.members)).sort(function (a, b) {
738
- return a.shortTitle > b.shortTitle ? 1 : -1;
739
- })
740
- });
504
+ },
505
+ update: (member, updateWith) => {
506
+ const {
507
+ query
508
+ } = this.state;
509
+ const members = (query[memberType] || []).concat([]);
510
+ members.splice(member.index, 1, toQuery(updateWith));
511
+ return this.updateQuery({
512
+ [memberType]: members
741
513
  });
742
514
  }
515
+ });
516
+
517
+ const {
518
+ meta,
519
+ metaError,
520
+ richMetaError,
521
+ query,
522
+ queryError,
523
+ chartType,
524
+ pivotConfig,
525
+ validatedQuery,
526
+ missingMembers,
527
+ isFetchingMeta,
528
+ dryRunResponse,
529
+ metaErrorStack
530
+ } = this.state;
531
+ const flatFilters = uniqBy(filter => `${prop('member', filter)}${prop('operator', filter)}`, flattenFilters(meta && query.filters || []).map(filter => ({ ...filter,
532
+ member: filter.member || filter.dimension
533
+ })));
534
+ const filters = flatFilters.map((m, i) => ({ ...m,
535
+ dimension: meta.resolveMember(m.member || m.dimension, ['dimensions', 'measures']),
536
+ operators: meta.filterOperatorsForMember(m.member || m.dimension, ['dimensions', 'measures']),
537
+ index: i
538
+ }));
539
+ const measures = QueryBuilder.resolveMember('measures', this.state);
540
+ const dimensions = QueryBuilder.resolveMember('dimensions', this.state);
541
+ const timeDimensions = QueryBuilder.resolveMember('timeDimensions', this.state);
542
+ const segments = (meta && query.segments || []).map((m, i) => ({
543
+ index: i,
544
+ ...meta.resolveMember(m, 'segments')
545
+ }));
546
+ let availableMeasures = [];
547
+ let availableDimensions = [];
548
+ let availableSegments = [];
549
+ let availableFilterMembers = [];
550
+ const availableMembers = meta?.membersGroupedByCube() || {
551
+ measures: [],
552
+ dimensions: [],
553
+ segments: [],
554
+ timeDimensions: []
555
+ };
743
556
 
744
- var activeOrder = Array.isArray(query.order) ? Object.fromEntries(query.order) : query.order;
745
- var members = [].concat(_toConsumableArray(measures), _toConsumableArray(dimensions), _toConsumableArray(timeDimensions.map(function (_ref2) {
746
- var dimension = _ref2.dimension;
747
- return dimension;
748
- })));
749
- var orderMembers = uniqBy(prop('id'), _toConsumableArray(members.map(function (_ref3) {
750
- var name = _ref3.name,
751
- title = _ref3.title;
752
- return {
753
- id: name,
754
- title: title,
755
- order: (activeOrder === null || activeOrder === void 0 ? void 0 : activeOrder[name]) || 'none'
557
+ if (meta) {
558
+ availableMeasures = meta.membersForQuery(query, 'measures');
559
+ availableDimensions = meta.membersForQuery(query, 'dimensions');
560
+ availableSegments = meta.membersForQuery(query, 'segments');
561
+ const indexedMeasures = indexBy(prop('cubeName'), availableMembers.measures);
562
+ const indexedDimensions = indexBy(prop('cubeName'), availableMembers.dimensions);
563
+ const cubeNames = uniq([...Object.keys(indexedMeasures), ...Object.keys(indexedDimensions)]).sort();
564
+ availableFilterMembers = cubeNames.map(name => {
565
+ const cube = indexedMeasures[name] || indexedDimensions[name];
566
+ return { ...cube,
567
+ members: [...indexedMeasures[name]?.members, ...indexedDimensions[name]?.members].sort((a, b) => a.shortTitle > b.shortTitle ? 1 : -1)
756
568
  };
757
- })));
569
+ });
570
+ }
758
571
 
759
- if (this.orderMembersOrderKeys.length !== orderMembers.length) {
760
- this.orderMembersOrderKeys = orderMembers.map(function (_ref4) {
761
- var id = _ref4.id;
762
- return id;
763
- });
764
- }
572
+ const activeOrder = Array.isArray(query.order) ? Object.fromEntries(query.order) : query.order;
573
+ const members = [...measures, ...dimensions, ...timeDimensions.map(({
574
+ dimension
575
+ }) => dimension)];
576
+ let orderMembers = uniqBy(prop('id'), [// uniqBy prefers first, so these will only be added if not already in the query
577
+ ...members.map(({
578
+ name,
579
+ title
580
+ }) => ({
581
+ id: name,
582
+ title,
583
+ order: activeOrder?.[name] || 'none'
584
+ }))]);
585
+
586
+ if (this.orderMembersOrderKeys.length !== orderMembers.length) {
587
+ this.orderMembersOrderKeys = orderMembers.map(({
588
+ id
589
+ }) => id);
590
+ }
765
591
 
766
- if (this.orderMembersOrderKeys.length) {
767
- // Preserve order until the members change or manually re-ordered
768
- // This is needed so that when an order member becomes active, it doesn't jump to the top of the list
769
- orderMembers = (this.orderMembersOrderKeys || []).map(function (id) {
770
- return orderMembers.find(function (member) {
771
- return member.id === id;
772
- });
773
- });
774
- }
592
+ if (this.orderMembersOrderKeys.length) {
593
+ // Preserve order until the members change or manually re-ordered
594
+ // This is needed so that when an order member becomes active, it doesn't jump to the top of the list
595
+ orderMembers = (this.orderMembersOrderKeys || []).map(id => orderMembers.find(member => member.id === id));
596
+ }
775
597
 
776
- return _objectSpread$4({
777
- meta: meta,
778
- metaError: metaError,
779
- richMetaError: richMetaError,
780
- metaErrorStack: metaErrorStack,
781
- query: query,
782
- error: queryError,
783
- // Match same name as QueryRenderer prop
784
- validatedQuery: validatedQuery,
785
- isQueryPresent: this.isQueryPresent(),
786
- chartType: chartType,
787
- measures: measures,
788
- dimensions: dimensions,
789
- timeDimensions: timeDimensions,
790
- segments: segments,
791
- filters: filters,
792
- orderMembers: orderMembers,
793
- availableMeasures: availableMeasures,
794
- availableDimensions: availableDimensions,
795
- availableTimeDimensions: availableDimensions.filter(function (m) {
796
- return m.type === 'time';
797
- }),
798
- availableSegments: availableSegments,
799
- availableMembers: availableMembers,
800
- availableFilterMembers: availableFilterMembers,
801
- updateQuery: function updateQuery(queryUpdate) {
802
- return _this3.updateQuery(queryUpdate);
598
+ return {
599
+ meta,
600
+ metaError,
601
+ richMetaError,
602
+ metaErrorStack,
603
+ query,
604
+ error: queryError,
605
+ // Match same name as QueryRenderer prop
606
+ validatedQuery,
607
+ isQueryPresent: this.isQueryPresent(),
608
+ chartType,
609
+ measures,
610
+ dimensions,
611
+ timeDimensions,
612
+ segments,
613
+ filters,
614
+ orderMembers,
615
+ availableMeasures,
616
+ availableDimensions,
617
+ availableTimeDimensions: availableDimensions.filter(m => m.type === 'time'),
618
+ availableSegments,
619
+ availableMembers,
620
+ availableFilterMembers,
621
+ updateQuery: queryUpdate => this.updateQuery(queryUpdate),
622
+ updateMeasures: updateMethods('measures'),
623
+ updateDimensions: updateMethods('dimensions'),
624
+ updateSegments: updateMethods('segments'),
625
+ updateTimeDimensions: updateMethods('timeDimensions', toTimeDimension),
626
+ updateFilters: updateMethods('filters', toFilter),
627
+ updateChartType: newChartType => this.updateVizState({
628
+ chartType: newChartType
629
+ }),
630
+ updateOrder: {
631
+ set: (memberId, newOrder = 'asc') => {
632
+ this.updateQuery({
633
+ order: orderMembers.map(orderMember => ({ ...orderMember,
634
+ order: orderMember.id === memberId ? newOrder : orderMember.order
635
+ })).reduce((acc, {
636
+ id,
637
+ order
638
+ }) => order !== 'none' ? [...acc, [id, order]] : acc, [])
639
+ });
803
640
  },
804
- updateMeasures: updateMethods('measures'),
805
- updateDimensions: updateMethods('dimensions'),
806
- updateSegments: updateMethods('segments'),
807
- updateTimeDimensions: updateMethods('timeDimensions', toTimeDimension),
808
- updateFilters: updateMethods('filters', toFilter),
809
- updateChartType: function updateChartType(newChartType) {
810
- return _this3.updateVizState({
811
- chartType: newChartType
641
+ update: order => {
642
+ this.updateQuery({
643
+ order
812
644
  });
813
645
  },
814
- updateOrder: {
815
- set: function set(memberId) {
816
- var newOrder = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'asc';
817
-
818
- _this3.updateQuery({
819
- order: orderMembers.map(function (orderMember) {
820
- return _objectSpread$4(_objectSpread$4({}, orderMember), {}, {
821
- order: orderMember.id === memberId ? newOrder : orderMember.order
822
- });
823
- }).reduce(function (acc, _ref5) {
824
- var id = _ref5.id,
825
- order = _ref5.order;
826
- return order !== 'none' ? [].concat(_toConsumableArray(acc), [[id, order]]) : acc;
827
- }, [])
828
- });
829
- },
830
- update: function update(order) {
831
- _this3.updateQuery({
832
- order: order
833
- });
834
- },
835
- reorder: function reorder(sourceIndex, destinationIndex) {
836
- if (sourceIndex == null || destinationIndex == null) {
837
- return;
838
- }
839
-
840
- var nextArray = moveItemInArray(orderMembers, sourceIndex, destinationIndex);
841
- _this3.orderMembersOrderKeys = nextArray.map(function (_ref6) {
842
- var id = _ref6.id;
843
- return id;
844
- });
845
-
846
- _this3.updateQuery({
847
- order: nextArray.reduce(function (acc, _ref7) {
848
- var id = _ref7.id,
849
- order = _ref7.order;
850
- return order !== 'none' ? [].concat(_toConsumableArray(acc), [[id, order]]) : acc;
851
- }, [])
852
- });
853
- }
854
- },
855
- pivotConfig: pivotConfig,
856
- updatePivotConfig: {
857
- moveItem: function moveItem(_ref8) {
858
- var sourceIndex = _ref8.sourceIndex,
859
- destinationIndex = _ref8.destinationIndex,
860
- sourceAxis = _ref8.sourceAxis,
861
- destinationAxis = _ref8.destinationAxis;
862
-
863
- _this3.updateVizState({
864
- pivotConfig: movePivotItem(pivotConfig, sourceIndex, destinationIndex, sourceAxis, destinationAxis)
865
- });
866
- },
867
- update: function update(config) {
868
- var limit = config.limit;
869
-
870
- _this3.updateVizState(_objectSpread$4({
871
- pivotConfig: _objectSpread$4(_objectSpread$4({}, pivotConfig), config)
872
- }, limit ? {
873
- query: _objectSpread$4(_objectSpread$4({}, query), {}, {
874
- limit: limit
875
- })
876
- } : null));
646
+ reorder: (sourceIndex, destinationIndex) => {
647
+ if (sourceIndex == null || destinationIndex == null) {
648
+ return;
877
649
  }
650
+
651
+ const nextArray = moveItemInArray(orderMembers, sourceIndex, destinationIndex);
652
+ this.orderMembersOrderKeys = nextArray.map(({
653
+ id
654
+ }) => id);
655
+ this.updateQuery({
656
+ order: nextArray.reduce((acc, {
657
+ id,
658
+ order
659
+ }) => order !== 'none' ? [...acc, [id, order]] : acc, [])
660
+ });
661
+ }
662
+ },
663
+ pivotConfig,
664
+ updatePivotConfig: {
665
+ moveItem: ({
666
+ sourceIndex,
667
+ destinationIndex,
668
+ sourceAxis,
669
+ destinationAxis
670
+ }) => {
671
+ this.updateVizState({
672
+ pivotConfig: movePivotItem(pivotConfig, sourceIndex, destinationIndex, sourceAxis, destinationAxis)
673
+ });
878
674
  },
879
- missingMembers: missingMembers,
880
- refresh: this.fetchMeta,
881
- isFetchingMeta: isFetchingMeta,
882
- dryRunResponse: dryRunResponse
883
- }, queryRendererProps);
884
- }
885
- }, {
886
- key: "updateQuery",
887
- value: function updateQuery(queryUpdate) {
888
- var query = this.state.query;
889
- this.updateVizState({
890
- query: removeEmptyQueryFields(_objectSpread$4(_objectSpread$4({}, query), queryUpdate))
891
- });
892
- }
893
- }, {
894
- key: "updateVizState",
895
- value: function () {
896
- var _updateVizState = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee5(state) {
897
- var _this4 = this;
898
-
899
- var _this$props2, setQuery, setVizState, _this$state2, stateQuery, statePivotConfig, chartType, meta, finalState, vizStateSent, handleVizStateChange, runSetters, shouldFetchDryRun, response, _error$response3;
900
-
901
- return _regeneratorRuntime.wrap(function _callee5$(_context5) {
902
- while (1) {
903
- switch (_context5.prev = _context5.next) {
904
- case 0:
905
- _this$props2 = this.props, setQuery = _this$props2.setQuery, setVizState = _this$props2.setVizState;
906
- _this$state2 = this.state, stateQuery = _this$state2.query, statePivotConfig = _this$state2.pivotConfig, chartType = _this$state2.chartType, meta = _this$state2.meta;
907
- finalState = this.applyStateChangeHeuristics(state);
908
-
909
- if (!finalState.query) {
910
- finalState.query = _objectSpread$4({}, stateQuery);
911
- }
675
+ update: config => {
676
+ const {
677
+ limit
678
+ } = config;
679
+ this.updateVizState({
680
+ pivotConfig: { ...pivotConfig,
681
+ ...config
682
+ },
683
+ ...(limit ? {
684
+ query: { ...query,
685
+ limit
686
+ }
687
+ } : null)
688
+ });
689
+ }
690
+ },
691
+ missingMembers,
692
+ refresh: this.fetchMeta,
693
+ isFetchingMeta,
694
+ dryRunResponse,
695
+ ...queryRendererProps
696
+ };
697
+ }
912
698
 
913
- vizStateSent = null;
699
+ updateQuery(queryUpdate) {
700
+ const {
701
+ query
702
+ } = this.state;
703
+ this.updateVizState({
704
+ query: removeEmptyQueryFields({ ...query,
705
+ ...queryUpdate
706
+ })
707
+ });
708
+ }
914
709
 
915
- handleVizStateChange = function handleVizStateChange(currentState) {
916
- var onVizStateChanged = _this4.props.onVizStateChanged;
710
+ async updateVizState(state) {
711
+ const {
712
+ setQuery,
713
+ setVizState
714
+ } = this.props;
715
+ const {
716
+ query: stateQuery,
717
+ pivotConfig: statePivotConfig,
718
+ chartType,
719
+ meta
720
+ } = this.state;
721
+ const finalState = this.applyStateChangeHeuristics(state);
722
+
723
+ if (!finalState.query) {
724
+ finalState.query = { ...stateQuery
725
+ };
726
+ }
917
727
 
918
- if (onVizStateChanged) {
919
- var newVizState = pick(['chartType', 'pivotConfig', 'query'], currentState); // Don't run callbacks more than once unless the viz state has changed since last time
728
+ let vizStateSent = null;
920
729
 
921
- if (!vizStateSent || !equals(vizStateSent, newVizState)) {
922
- onVizStateChanged(newVizState); // use clone to make sure we don't save object references
730
+ const handleVizStateChange = currentState => {
731
+ const {
732
+ onVizStateChanged
733
+ } = this.props;
923
734
 
924
- vizStateSent = clone(newVizState);
925
- }
926
- }
927
- }; // deprecated, setters replaced by onVizStateChanged
735
+ if (onVizStateChanged) {
736
+ const newVizState = pick(['chartType', 'pivotConfig', 'query'], currentState); // Don't run callbacks more than once unless the viz state has changed since last time
928
737
 
738
+ if (!vizStateSent || !equals(vizStateSent, newVizState)) {
739
+ onVizStateChanged(newVizState); // use clone to make sure we don't save object references
929
740
 
930
- runSetters = function runSetters(currentState) {
931
- if (setVizState) {
932
- setVizState(pick(['chartType', 'pivotConfig', 'query'], currentState));
933
- }
741
+ vizStateSent = clone(newVizState);
742
+ }
743
+ }
744
+ }; // deprecated, setters replaced by onVizStateChanged
934
745
 
935
- if (currentState.query && setQuery) {
936
- setQuery(currentState.query);
937
- }
938
- };
939
746
 
940
- if (finalState.shouldApplyHeuristicOrder) {
941
- finalState.query.order = defaultOrder(finalState.query);
942
- }
747
+ const runSetters = currentState => {
748
+ if (setVizState) {
749
+ setVizState(pick(['chartType', 'pivotConfig', 'query'], currentState));
750
+ }
943
751
 
944
- finalState.pivotConfig = ResultSet.getNormalizedPivotConfig(finalState.query, finalState.pivotConfig !== undefined ? finalState.pivotConfig : statePivotConfig);
945
- finalState.missingMembers = this.getMissingMembers(finalState.query, meta);
946
- finalState.chartType = finalState.chartType || state.chartType || chartType; // deprecated
752
+ if (currentState.query && setQuery) {
753
+ setQuery(currentState.query);
754
+ }
755
+ };
947
756
 
948
- runSetters(_objectSpread$4(_objectSpread$4({}, state), {}, {
949
- query: finalState.query
950
- })); // Update optimistically so that UI does not stutter
757
+ if (finalState.shouldApplyHeuristicOrder) {
758
+ finalState.query.order = defaultOrder(finalState.query);
759
+ }
951
760
 
952
- this.setState(_objectSpread$4(_objectSpread$4({}, finalState), {}, {
953
- queryError: null
954
- }));
955
- handleVizStateChange(finalState);
956
- shouldFetchDryRun = !equals(pick(['measures', 'dimensions', 'timeDimensions'], stateQuery), pick(['measures', 'dimensions', 'timeDimensions'], finalState.query));
761
+ finalState.pivotConfig = ResultSet.getNormalizedPivotConfig(finalState.query, finalState.pivotConfig !== undefined ? finalState.pivotConfig : statePivotConfig);
762
+ finalState.missingMembers = this.getMissingMembers(finalState.query, meta);
763
+ finalState.chartType = finalState.chartType || state.chartType || chartType; // deprecated
957
764
 
958
- if (!(shouldFetchDryRun && isQueryPresent(finalState.query) && finalState.missingMembers.length === 0)) {
959
- _context5.next = 30;
960
- break;
961
- }
765
+ runSetters({ ...state,
766
+ query: finalState.query
767
+ }); // Update optimistically so that UI does not stutter
962
768
 
963
- _context5.prev = 16;
964
- _context5.next = 19;
965
- return this.cubejsApi().dryRun(finalState.query, {
966
- mutexObj: this.mutexObj
967
- });
769
+ this.setState({ ...finalState,
770
+ queryError: null
771
+ });
772
+ handleVizStateChange(finalState);
773
+ const shouldFetchDryRun = !equals(pick(['measures', 'dimensions', 'timeDimensions'], stateQuery), pick(['measures', 'dimensions', 'timeDimensions'], finalState.query));
968
774
 
969
- case 19:
970
- response = _context5.sent;
775
+ if (shouldFetchDryRun && isQueryPresent(finalState.query) && finalState.missingMembers.length === 0) {
776
+ try {
777
+ const response = await this.cubejsApi().dryRun(finalState.query, {
778
+ mutexObj: this.mutexObj
779
+ });
971
780
 
972
- if (finalState.shouldApplyHeuristicOrder) {
973
- finalState.query.order = (response.queryOrder || []).reduce(function (memo, current) {
974
- return _objectSpread$4(_objectSpread$4({}, memo), current);
975
- }, {});
976
- }
781
+ if (finalState.shouldApplyHeuristicOrder) {
782
+ finalState.query.order = (response.queryOrder || []).reduce((memo, current) => ({ ...memo,
783
+ ...current
784
+ }), {});
785
+ }
977
786
 
978
- finalState.pivotConfig = ResultSet.getNormalizedPivotConfig(response.pivotQuery, finalState.pivotConfig);
979
- finalState.validatedQuery = this.validatedQuery(finalState);
980
- finalState.dryRunResponse = response; // deprecated
787
+ finalState.pivotConfig = ResultSet.getNormalizedPivotConfig(response.pivotQuery, finalState.pivotConfig);
788
+ finalState.validatedQuery = this.validatedQuery(finalState);
789
+ finalState.dryRunResponse = response; // deprecated
981
790
 
982
- if (isQueryPresent(stateQuery)) {
983
- runSetters(_objectSpread$4(_objectSpread$4({}, this.state), finalState));
984
- }
791
+ if (isQueryPresent(stateQuery)) {
792
+ runSetters({ ...this.state,
793
+ ...finalState
794
+ });
795
+ }
796
+ } catch (error) {
797
+ this.setState({
798
+ queryError: new Error(error.response?.plainError || error.message),
799
+ richQueryError: new Error(error.message || error.toString())
800
+ });
801
+ }
802
+ }
985
803
 
986
- _context5.next = 30;
987
- break;
988
-
989
- case 27:
990
- _context5.prev = 27;
991
- _context5.t0 = _context5["catch"](16);
992
- this.setState({
993
- queryError: new Error(((_error$response3 = _context5.t0.response) === null || _error$response3 === void 0 ? void 0 : _error$response3.plainError) || _context5.t0.message),
994
- richQueryError: new Error(_context5.t0.message || _context5.t0.toString())
995
- });
996
-
997
- case 30:
998
- this.setState(finalState, function () {
999
- return handleVizStateChange(_this4.state);
1000
- });
1001
-
1002
- case 31:
1003
- case "end":
1004
- return _context5.stop();
1005
- }
1006
- }
1007
- }, _callee5, this, [[16, 27]]);
1008
- }));
804
+ this.setState(finalState, () => handleVizStateChange(this.state));
805
+ }
1009
806
 
1010
- function updateVizState(_x2) {
1011
- return _updateVizState.apply(this, arguments);
1012
- }
807
+ validatedQuery(state) {
808
+ const {
809
+ query
810
+ } = state || this.state;
811
+ return validateQuery(query);
812
+ }
1013
813
 
1014
- return updateVizState;
1015
- }()
1016
- }, {
1017
- key: "validatedQuery",
1018
- value: function validatedQuery(state) {
1019
- var _ref9 = state || this.state,
1020
- query = _ref9.query;
814
+ defaultHeuristics(newState) {
815
+ const {
816
+ query,
817
+ sessionGranularity,
818
+ meta
819
+ } = this.state;
820
+ return defaultHeuristics(newState, query, {
821
+ meta,
822
+ sessionGranularity: sessionGranularity || 'day'
823
+ });
824
+ }
1021
825
 
1022
- return validateQuery(query);
1023
- }
1024
- }, {
1025
- key: "defaultHeuristics",
1026
- value: function defaultHeuristics$1(newState) {
1027
- var _this$state3 = this.state,
1028
- query = _this$state3.query,
1029
- sessionGranularity = _this$state3.sessionGranularity,
1030
- meta = _this$state3.meta;
1031
- return defaultHeuristics(newState, query, {
1032
- meta: meta,
1033
- sessionGranularity: sessionGranularity || 'day'
1034
- });
1035
- }
1036
- }, {
1037
- key: "applyStateChangeHeuristics",
1038
- value: function applyStateChangeHeuristics(newState) {
1039
- var _this$props3 = this.props,
1040
- stateChangeHeuristics = _this$props3.stateChangeHeuristics,
1041
- disableHeuristics = _this$props3.disableHeuristics;
1042
-
1043
- if (disableHeuristics) {
1044
- return newState;
1045
- }
826
+ applyStateChangeHeuristics(newState) {
827
+ const {
828
+ stateChangeHeuristics,
829
+ disableHeuristics
830
+ } = this.props;
1046
831
 
1047
- return stateChangeHeuristics && stateChangeHeuristics(this.state, newState) || this.defaultHeuristics(newState);
832
+ if (disableHeuristics) {
833
+ return newState;
1048
834
  }
1049
- }, {
1050
- key: "render",
1051
- value: function render() {
1052
- var _this5 = this;
1053
-
1054
- var query = this.state.query;
1055
- var _this$props4 = this.props,
1056
- cubejsApi = _this$props4.cubejsApi,
1057
- _render = _this$props4.render,
1058
- wrapWithQueryRenderer = _this$props4.wrapWithQueryRenderer;
1059
-
1060
- if (wrapWithQueryRenderer) {
1061
- return /*#__PURE__*/React.createElement(QueryRenderer, {
1062
- query: query,
1063
- cubejsApi: cubejsApi,
1064
- resetResultSetOnChange: false,
1065
- render: function render(queryRendererProps) {
1066
- if (_render) {
1067
- return _render(_this5.prepareRenderProps(queryRendererProps));
1068
- }
1069
835
 
1070
- return null;
836
+ return stateChangeHeuristics && stateChangeHeuristics(this.state, newState) || this.defaultHeuristics(newState);
837
+ }
838
+
839
+ render() {
840
+ const {
841
+ query
842
+ } = this.state;
843
+ const {
844
+ cubejsApi,
845
+ render,
846
+ wrapWithQueryRenderer
847
+ } = this.props;
848
+
849
+ if (wrapWithQueryRenderer) {
850
+ return /*#__PURE__*/React.createElement(QueryRenderer, {
851
+ query: query,
852
+ cubejsApi: cubejsApi,
853
+ resetResultSetOnChange: false,
854
+ render: queryRendererProps => {
855
+ if (render) {
856
+ return render(this.prepareRenderProps(queryRendererProps));
1071
857
  }
1072
- });
1073
- } else {
1074
- if (_render) {
1075
- return _render(this.prepareRenderProps());
1076
- }
1077
858
 
1078
- return null;
1079
- }
1080
- }
1081
- }], [{
1082
- key: "getDerivedStateFromProps",
1083
- value: // This is an anti-pattern, only kept for backward compatibility
1084
- // https://reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html#anti-pattern-unconditionally-copying-props-to-state
1085
- function getDerivedStateFromProps(props, state) {
1086
- if (props.query || props.vizState) {
1087
- var nextState = _objectSpread$4(_objectSpread$4({}, state), props.vizState || {});
1088
-
1089
- if (Array.isArray(props.query)) {
1090
- throw new Error('Array of queries is not supported.');
859
+ return null;
1091
860
  }
1092
-
1093
- return _objectSpread$4(_objectSpread$4({}, nextState), {}, {
1094
- query: _objectSpread$4(_objectSpread$4({}, nextState.query), props.query || {})
1095
- });
861
+ });
862
+ } else {
863
+ if (render) {
864
+ return render(this.prepareRenderProps());
1096
865
  }
1097
866
 
1098
867
  return null;
1099
868
  }
1100
- }, {
1101
- key: "resolveMember",
1102
- value: function resolveMember(type, _ref10) {
1103
- var meta = _ref10.meta,
1104
- query = _ref10.query;
1105
-
1106
- if (!meta) {
1107
- return [];
1108
- }
1109
-
1110
- if (Array.isArray(query)) {
1111
- return query.reduce(function (memo, currentQuery) {
1112
- return memo.concat(QueryBuilder.resolveMember(type, {
1113
- meta: meta,
1114
- query: currentQuery
1115
- }));
1116
- }, []);
1117
- }
1118
-
1119
- if (type === 'timeDimensions') {
1120
- return (query.timeDimensions || []).map(function (m, index) {
1121
- return _objectSpread$4(_objectSpread$4({}, m), {}, {
1122
- dimension: _objectSpread$4(_objectSpread$4({}, meta.resolveMember(m.dimension, 'dimensions')), {}, {
1123
- granularities: granularities
1124
- }),
1125
- index: index
1126
- });
1127
- });
1128
- }
1129
-
1130
- return (query[type] || []).map(function (m, index) {
1131
- return _objectSpread$4({
1132
- index: index
1133
- }, meta.resolveMember(m, type));
1134
- });
1135
- }
1136
- }]);
1137
-
1138
- return QueryBuilder;
1139
- }(React.Component);
869
+ }
1140
870
 
1141
- _defineProperty(QueryBuilder, "contextType", CubeContext);
871
+ }
1142
872
  QueryBuilder.defaultProps = {
1143
873
  cubejsApi: null,
1144
874
  stateChangeHeuristics: null,
@@ -1156,18 +886,19 @@ QueryBuilder.defaultProps = {
1156
886
  setVizState: null
1157
887
  };
1158
888
 
1159
- function CubeProvider(_ref) {
1160
- var cubejsApi = _ref.cubejsApi,
1161
- children = _ref.children;
889
+ function CubeProvider({
890
+ cubejsApi,
891
+ children
892
+ }) {
1162
893
  return /*#__PURE__*/React.createElement(CubeContext.Provider, {
1163
894
  value: {
1164
- cubejsApi: cubejsApi
895
+ cubejsApi
1165
896
  }
1166
897
  }, children);
1167
898
  }
1168
899
 
1169
900
  function useDeepCompareMemoize(value) {
1170
- var ref = useRef([]);
901
+ const ref = useRef([]);
1171
902
 
1172
903
  if (!equals(value, ref.current)) {
1173
904
  ref.current = value;
@@ -1177,388 +908,218 @@ function useDeepCompareMemoize(value) {
1177
908
  }
1178
909
 
1179
910
  function useIsMounted() {
1180
- var isMounted = useRef(false);
1181
- useEffect(function () {
911
+ const isMounted = useRef(false);
912
+ useEffect(() => {
1182
913
  isMounted.current = true;
1183
- return function () {
914
+ return () => {
1184
915
  isMounted.current = false;
1185
916
  };
1186
917
  }, []);
1187
- return function () {
1188
- return isMounted.current;
1189
- };
918
+ return () => isMounted.current;
1190
919
  }
1191
920
 
1192
- function ownKeys$3(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
1193
-
1194
- function _objectSpread$3(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$3(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$3(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
1195
- function useCubeFetch(method) {
1196
- var _options$query;
1197
-
1198
- var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1199
- var isMounted = useIsMounted();
1200
- var context = useContext(CubeContext);
1201
- var mutexRef = useRef({});
1202
-
1203
- var _useState = useState({
921
+ function useCubeFetch(method, options = {}) {
922
+ const isMounted = useIsMounted();
923
+ const context = useContext(CubeContext);
924
+ const mutexRef = useRef({});
925
+ const [response, setResponse] = useState({
1204
926
  isLoading: false,
1205
927
  response: null
1206
- }),
1207
- _useState2 = _slicedToArray(_useState, 2),
1208
- response = _useState2[0],
1209
- setResponse = _useState2[1];
1210
-
1211
- var _useState3 = useState(null),
1212
- _useState4 = _slicedToArray(_useState3, 2),
1213
- error = _useState4[0],
1214
- setError = _useState4[1];
1215
-
1216
- var _options$skip = options.skip,
1217
- skip = _options$skip === void 0 ? false : _options$skip;
1218
-
1219
- function load() {
1220
- return _load.apply(this, arguments);
1221
- }
1222
-
1223
- function _load() {
1224
- _load = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
1225
- var loadOptions,
1226
- ignoreSkip,
1227
- cubejsApi,
1228
- query,
1229
- queryCondition,
1230
- coreOptions,
1231
- args,
1232
- _response,
1233
- _args = arguments;
1234
-
1235
- return _regeneratorRuntime.wrap(function _callee$(_context) {
1236
- while (1) {
1237
- switch (_context.prev = _context.next) {
1238
- case 0:
1239
- loadOptions = _args.length > 0 && _args[0] !== undefined ? _args[0] : {};
1240
- ignoreSkip = _args.length > 1 && _args[1] !== undefined ? _args[1] : false;
1241
- cubejsApi = options.cubejsApi || (context === null || context === void 0 ? void 0 : context.cubejsApi);
1242
- query = loadOptions.query || options.query;
1243
- queryCondition = method === 'meta' ? true : query && isQueryPresent(query);
1244
-
1245
- if (!(cubejsApi && (ignoreSkip || !skip) && queryCondition)) {
1246
- _context.next = 20;
1247
- break;
1248
- }
1249
-
1250
- setError(null);
1251
- setResponse({
1252
- isLoading: true,
1253
- response: null
1254
- });
1255
- coreOptions = {
1256
- mutexObj: mutexRef.current,
1257
- mutexKey: method
1258
- };
1259
- args = method === 'meta' ? [coreOptions] : [query, coreOptions];
1260
- _context.prev = 10;
1261
- _context.next = 13;
1262
- return cubejsApi[method].apply(cubejsApi, args);
1263
-
1264
- case 13:
1265
- _response = _context.sent;
1266
-
1267
- if (isMounted()) {
1268
- setResponse({
1269
- response: _response,
1270
- isLoading: false
1271
- });
1272
- }
1273
-
1274
- _context.next = 20;
1275
- break;
1276
-
1277
- case 17:
1278
- _context.prev = 17;
1279
- _context.t0 = _context["catch"](10);
928
+ });
929
+ const [error, setError] = useState(null);
930
+ const {
931
+ skip = false
932
+ } = options;
933
+
934
+ async function load(loadOptions = {}, ignoreSkip = false) {
935
+ const cubejsApi = options.cubejsApi || context?.cubejsApi;
936
+ const query = loadOptions.query || options.query;
937
+ const queryCondition = method === 'meta' ? true : query && isQueryPresent(query);
938
+
939
+ if (cubejsApi && (ignoreSkip || !skip) && queryCondition) {
940
+ setError(null);
941
+ setResponse({
942
+ isLoading: true,
943
+ response: null
944
+ });
945
+ const coreOptions = {
946
+ mutexObj: mutexRef.current,
947
+ mutexKey: method
948
+ };
949
+ const args = method === 'meta' ? [coreOptions] : [query, coreOptions];
1280
950
 
1281
- if (isMounted()) {
1282
- setError(_context.t0);
1283
- setResponse({
1284
- isLoading: false,
1285
- response: null
1286
- });
1287
- }
951
+ try {
952
+ const response = await cubejsApi[method](...args);
1288
953
 
1289
- case 20:
1290
- case "end":
1291
- return _context.stop();
1292
- }
954
+ if (isMounted()) {
955
+ setResponse({
956
+ response,
957
+ isLoading: false
958
+ });
1293
959
  }
1294
- }, _callee, null, [[10, 17]]);
1295
- }));
1296
- return _load.apply(this, arguments);
960
+ } catch (error) {
961
+ if (isMounted()) {
962
+ setError(error);
963
+ setResponse({
964
+ isLoading: false,
965
+ response: null
966
+ });
967
+ }
968
+ }
969
+ }
1297
970
  }
1298
971
 
1299
- useEffect(function () {
972
+ useEffect(() => {
1300
973
  load();
1301
- }, useDeepCompareMemoize([Object.keys(((_options$query = options.query) === null || _options$query === void 0 ? void 0 : _options$query.order) || {}), options, context]));
1302
- return _objectSpread$3(_objectSpread$3({}, response), {}, {
1303
- error: error,
1304
- refetch: function refetch(options) {
1305
- return load(options, true);
1306
- }
1307
- });
974
+ }, useDeepCompareMemoize([Object.keys(options.query?.order || {}), options, context]));
975
+ return { ...response,
976
+ error,
977
+ refetch: options => load(options, true)
978
+ };
1308
979
  }
1309
980
 
1310
- function ownKeys$2(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
1311
-
1312
- function _objectSpread$2(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$2(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$2(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
1313
- function useCubeSql(query) {
1314
- var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1315
- return useCubeFetch('sql', _objectSpread$2(_objectSpread$2({}, options), {}, {
1316
- query: query
1317
- }));
981
+ function useCubeSql(query, options = {}) {
982
+ return useCubeFetch('sql', { ...options,
983
+ query
984
+ });
1318
985
  }
1319
986
 
1320
- function ownKeys$1(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
1321
-
1322
- function _objectSpread$1(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$1(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$1(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
1323
- function useDryRun(query) {
1324
- var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1325
- return useCubeFetch('dryRun', _objectSpread$1(_objectSpread$1({}, options), {}, {
1326
- query: query
1327
- }));
987
+ function useDryRun(query, options = {}) {
988
+ return useCubeFetch('dryRun', { ...options,
989
+ query
990
+ });
1328
991
  }
1329
992
 
1330
- var _excluded = ["refetch"];
1331
-
1332
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
1333
-
1334
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
1335
- function useLazyDryRun(query) {
1336
- var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1337
-
1338
- var _useCubeFetch = useCubeFetch('dryRun', _objectSpread(_objectSpread({}, options), {}, {
1339
- query: query,
993
+ function useLazyDryRun(query, options = {}) {
994
+ const {
995
+ refetch,
996
+ ...result
997
+ } = useCubeFetch('dryRun', { ...options,
998
+ query,
1340
999
  skip: true
1341
- })),
1342
- refetch = _useCubeFetch.refetch,
1343
- result = _objectWithoutProperties(_useCubeFetch, _excluded);
1344
-
1000
+ });
1345
1001
  return [refetch, result];
1346
1002
  }
1347
1003
 
1348
- function useCubeQuery(query) {
1349
- var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1350
- var mutexRef = useRef({});
1351
- var isMounted = useIsMounted();
1352
-
1353
- var _useState = useState(null),
1354
- _useState2 = _slicedToArray(_useState, 2),
1355
- currentQuery = _useState2[0],
1356
- setCurrentQuery = _useState2[1];
1357
-
1358
- var _useState3 = useState(false),
1359
- _useState4 = _slicedToArray(_useState3, 2),
1360
- isLoading = _useState4[0],
1361
- setLoading = _useState4[1];
1362
-
1363
- var _useState5 = useState(null),
1364
- _useState6 = _slicedToArray(_useState5, 2),
1365
- resultSet = _useState6[0],
1366
- setResultSet = _useState6[1];
1367
-
1368
- var _useState7 = useState(null),
1369
- _useState8 = _slicedToArray(_useState7, 2),
1370
- progress = _useState8[0],
1371
- setProgress = _useState8[1];
1372
-
1373
- var _useState9 = useState(null),
1374
- _useState10 = _slicedToArray(_useState9, 2),
1375
- error = _useState10[0],
1376
- setError = _useState10[1];
1377
-
1378
- var context = useContext(CubeContext);
1379
- var subscribeRequest = null;
1380
-
1381
- var progressCallback = function progressCallback(_ref) {
1382
- var progressResponse = _ref.progressResponse;
1383
- return setProgress(progressResponse);
1384
- };
1004
+ function useCubeQuery(query, options = {}) {
1005
+ const mutexRef = useRef({});
1006
+ const isMounted = useIsMounted();
1007
+ const [currentQuery, setCurrentQuery] = useState(null);
1008
+ const [isLoading, setLoading] = useState(false);
1009
+ const [resultSet, setResultSet] = useState(null);
1010
+ const [progress, setProgress] = useState(null);
1011
+ const [error, setError] = useState(null);
1012
+ const context = useContext(CubeContext);
1013
+ let subscribeRequest = null;
1014
+
1015
+ const progressCallback = ({
1016
+ progressResponse
1017
+ }) => setProgress(progressResponse);
1018
+
1019
+ async function fetch() {
1020
+ const {
1021
+ resetResultSetOnChange
1022
+ } = options;
1023
+ const cubejsApi = options.cubejsApi || context?.cubejsApi;
1385
1024
 
1386
- function fetch() {
1387
- return _fetch.apply(this, arguments);
1388
- }
1389
-
1390
- function _fetch() {
1391
- _fetch = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
1392
- var resetResultSetOnChange, cubejsApi, response;
1393
- return _regeneratorRuntime.wrap(function _callee2$(_context2) {
1394
- while (1) {
1395
- switch (_context2.prev = _context2.next) {
1396
- case 0:
1397
- resetResultSetOnChange = options.resetResultSetOnChange;
1398
- cubejsApi = options.cubejsApi || (context === null || context === void 0 ? void 0 : context.cubejsApi);
1399
-
1400
- if (cubejsApi) {
1401
- _context2.next = 4;
1402
- break;
1403
- }
1404
-
1405
- throw new Error('Cube.js API client is not provided');
1406
-
1407
- case 4:
1408
- if (resetResultSetOnChange) {
1409
- setResultSet(null);
1410
- }
1411
-
1412
- setError(null);
1413
- setLoading(true);
1414
- _context2.prev = 7;
1415
- _context2.next = 10;
1416
- return cubejsApi.load(query, {
1417
- mutexObj: mutexRef.current,
1418
- mutexKey: 'query',
1419
- progressCallback: progressCallback
1420
- });
1421
-
1422
- case 10:
1423
- response = _context2.sent;
1424
-
1425
- if (isMounted()) {
1426
- setResultSet(response);
1427
- setProgress(null);
1428
- }
1025
+ if (!cubejsApi) {
1026
+ throw new Error('Cube.js API client is not provided');
1027
+ }
1429
1028
 
1430
- _context2.next = 17;
1431
- break;
1029
+ if (resetResultSetOnChange) {
1030
+ setResultSet(null);
1031
+ }
1432
1032
 
1433
- case 14:
1434
- _context2.prev = 14;
1435
- _context2.t0 = _context2["catch"](7);
1033
+ setError(null);
1034
+ setLoading(true);
1436
1035
 
1437
- if (isMounted()) {
1438
- setError(_context2.t0);
1439
- setResultSet(null);
1440
- setProgress(null);
1441
- }
1036
+ try {
1037
+ const response = await cubejsApi.load(query, {
1038
+ mutexObj: mutexRef.current,
1039
+ mutexKey: 'query',
1040
+ progressCallback
1041
+ });
1442
1042
 
1443
- case 17:
1444
- if (isMounted()) {
1445
- setLoading(false);
1446
- }
1043
+ if (isMounted()) {
1044
+ setResultSet(response);
1045
+ setProgress(null);
1046
+ }
1047
+ } catch (error) {
1048
+ if (isMounted()) {
1049
+ setError(error);
1050
+ setResultSet(null);
1051
+ setProgress(null);
1052
+ }
1053
+ }
1447
1054
 
1448
- case 18:
1449
- case "end":
1450
- return _context2.stop();
1451
- }
1452
- }
1453
- }, _callee2, null, [[7, 14]]);
1454
- }));
1455
- return _fetch.apply(this, arguments);
1055
+ if (isMounted()) {
1056
+ setLoading(false);
1057
+ }
1456
1058
  }
1457
1059
 
1458
- useEffect(function () {
1459
- var _options$skip = options.skip,
1460
- skip = _options$skip === void 0 ? false : _options$skip,
1461
- resetResultSetOnChange = options.resetResultSetOnChange;
1462
- var cubejsApi = options.cubejsApi || (context === null || context === void 0 ? void 0 : context.cubejsApi);
1060
+ useEffect(() => {
1061
+ const {
1062
+ skip = false,
1063
+ resetResultSetOnChange
1064
+ } = options;
1065
+ const cubejsApi = options.cubejsApi || context?.cubejsApi;
1463
1066
 
1464
1067
  if (!cubejsApi) {
1465
1068
  throw new Error('Cube.js API client is not provided');
1466
1069
  }
1467
1070
 
1468
- function loadQuery() {
1469
- return _loadQuery.apply(this, arguments);
1470
- }
1471
-
1472
- function _loadQuery() {
1473
- _loadQuery = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
1474
- return _regeneratorRuntime.wrap(function _callee$(_context) {
1475
- while (1) {
1476
- switch (_context.prev = _context.next) {
1477
- case 0:
1478
- if (!(!skip && isQueryPresent(query))) {
1479
- _context.next = 20;
1480
- break;
1481
- }
1482
-
1483
- if (!areQueriesEqual(currentQuery, query)) {
1484
- if (resetResultSetOnChange == null || resetResultSetOnChange) {
1485
- setResultSet(null);
1486
- }
1487
-
1488
- setCurrentQuery(query);
1489
- }
1490
-
1491
- setError(null);
1492
- setLoading(true);
1493
- _context.prev = 4;
1494
-
1495
- if (!subscribeRequest) {
1496
- _context.next = 9;
1497
- break;
1498
- }
1071
+ async function loadQuery() {
1072
+ if (!skip && isQueryPresent(query)) {
1073
+ if (!areQueriesEqual(currentQuery, query)) {
1074
+ if (resetResultSetOnChange == null || resetResultSetOnChange) {
1075
+ setResultSet(null);
1076
+ }
1499
1077
 
1500
- _context.next = 8;
1501
- return subscribeRequest.unsubscribe();
1078
+ setCurrentQuery(query);
1079
+ }
1502
1080
 
1503
- case 8:
1504
- subscribeRequest = null;
1081
+ setError(null);
1082
+ setLoading(true);
1505
1083
 
1506
- case 9:
1507
- if (!options.subscribe) {
1508
- _context.next = 13;
1509
- break;
1510
- }
1084
+ try {
1085
+ if (subscribeRequest) {
1086
+ await subscribeRequest.unsubscribe();
1087
+ subscribeRequest = null;
1088
+ }
1511
1089
 
1512
- subscribeRequest = cubejsApi.subscribe(query, {
1513
- mutexObj: mutexRef.current,
1514
- mutexKey: 'query',
1515
- progressCallback: progressCallback
1516
- }, function (e, result) {
1517
- if (isMounted()) {
1518
- if (e) {
1519
- setError(e);
1520
- } else {
1521
- setResultSet(result);
1522
- }
1523
-
1524
- setLoading(false);
1525
- setProgress(null);
1526
- }
1527
- });
1528
- _context.next = 15;
1529
- break;
1530
-
1531
- case 13:
1532
- _context.next = 15;
1533
- return fetch();
1534
-
1535
- case 15:
1536
- _context.next = 20;
1537
- break;
1538
-
1539
- case 17:
1540
- _context.prev = 17;
1541
- _context.t0 = _context["catch"](4);
1542
-
1543
- if (isMounted()) {
1544
- setError(_context.t0);
1545
- setResultSet(null);
1546
- setLoading(false);
1547
- setProgress(null);
1090
+ if (options.subscribe) {
1091
+ subscribeRequest = cubejsApi.subscribe(query, {
1092
+ mutexObj: mutexRef.current,
1093
+ mutexKey: 'query',
1094
+ progressCallback
1095
+ }, (e, result) => {
1096
+ if (isMounted()) {
1097
+ if (e) {
1098
+ setError(e);
1099
+ } else {
1100
+ setResultSet(result);
1548
1101
  }
1549
1102
 
1550
- case 20:
1551
- case "end":
1552
- return _context.stop();
1553
- }
1103
+ setLoading(false);
1104
+ setProgress(null);
1105
+ }
1106
+ });
1107
+ } else {
1108
+ await fetch();
1554
1109
  }
1555
- }, _callee, null, [[4, 17]]);
1556
- }));
1557
- return _loadQuery.apply(this, arguments);
1110
+ } catch (e) {
1111
+ if (isMounted()) {
1112
+ setError(e);
1113
+ setResultSet(null);
1114
+ setLoading(false);
1115
+ setProgress(null);
1116
+ }
1117
+ }
1118
+ }
1558
1119
  }
1559
1120
 
1560
1121
  loadQuery();
1561
- return function () {
1122
+ return () => {
1562
1123
  if (subscribeRequest) {
1563
1124
  subscribeRequest.unsubscribe();
1564
1125
  subscribeRequest = null;
@@ -1566,17 +1127,16 @@ function useCubeQuery(query) {
1566
1127
  };
1567
1128
  }, useDeepCompareMemoize([query, Object.keys(query && query.order || {}), options, context]));
1568
1129
  return {
1569
- isLoading: isLoading,
1570
- resultSet: resultSet,
1571
- error: error,
1572
- progress: progress,
1130
+ isLoading,
1131
+ resultSet,
1132
+ error,
1133
+ progress,
1573
1134
  previousQuery: currentQuery,
1574
1135
  refetch: fetch
1575
1136
  };
1576
1137
  }
1577
1138
 
1578
- function useCubeMeta() {
1579
- var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
1139
+ function useCubeMeta(options = {}) {
1580
1140
  return useCubeFetch('meta', options);
1581
1141
  }
1582
1142