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