@vizzly/dashboard 0.14.4-dev-853fa16da5e049a03a787a1aedebe8e5ce756e21 → 0.14.4-dev-ccfbdccebc45fb0361ebf39ecb0ab567ca7a1067
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.
- package/dist/dashboard/src/types.d.ts +1 -0
- package/dist/dashboard.cjs.development.js +1027 -1055
- package/dist/dashboard.cjs.production.min.js +1 -1
- package/dist/dashboard.esm.js +1027 -1055
- package/dist/services/src/index.d.ts +3 -2
- package/dist/shared-logic/src/CustomView/types.d.ts +2 -5
- package/dist/shared-logic/src/DataSet/DataSet.d.ts +1 -3
- package/dist/shared-logic/src/Query/Query.d.ts +1 -15
- package/dist/shared-logic/src/Result/Result.d.ts +0 -3
- package/dist/shared-logic/src/api/queryEngine/getRunQueriesCallback.d.ts +1 -1
- package/package.json +2 -2
- package/dist/shared-logic/src/Query/validate.d.ts +0 -13
- package/dist/shared-logic/src/Result/ValidationLogic.d.ts +0 -7
package/dist/dashboard.esm.js
CHANGED
|
@@ -2,10 +2,9 @@ import React__default, { Fragment, useEffect, useState, useContext, createContex
|
|
|
2
2
|
import isEmpty$3 from 'lodash-es/isEmpty';
|
|
3
3
|
import _, { isArray, capitalize, isEmpty as isEmpty$2, isFunction, replace, isObject, isNumber, every, some, mergeWith, remove as remove$2, cloneDeep, findIndex, reduce, merge, sumBy, mapValues, zipObject, isDate, omit as omit$1, maxBy, reject, defaultsDeep, isString, flatMap, filter, uniq, uniqBy, debounce as debounce$1, orderBy, minBy, throttle, get as get$1, min, max, groupBy, intersection, isEqual } from 'lodash-es';
|
|
4
4
|
import { QueryEngineConfig } from '@vizzly/semantic-layer-public';
|
|
5
|
-
import { v4 } from 'uuid';
|
|
6
5
|
import Joi from '@vizzly/joi';
|
|
7
6
|
import moment from 'moment-timezone';
|
|
8
|
-
import {
|
|
7
|
+
import { v4 } from 'uuid';
|
|
9
8
|
import { Global, css as css$2, CacheProvider, createElement as createElement$1 } from '@emotion/react';
|
|
10
9
|
import { jsx, jsxs, Fragment as Fragment$1 } from '@emotion/react/jsx-runtime';
|
|
11
10
|
import chroma from 'chroma-js';
|
|
@@ -64,6 +63,7 @@ import cx from 'classnames';
|
|
|
64
63
|
import VisibilitySensor from 'react-visibility-sensor';
|
|
65
64
|
import ExcelJS from 'exceljs';
|
|
66
65
|
import { saveAs } from 'file-saver';
|
|
66
|
+
import { DATE_MATHS_OPERATORS } from '@vizzly/sqlbuilder-public';
|
|
67
67
|
import { Authentication, VizzlyQueryEngineApi, VizzlyApi, VizzlyAppApi, Vizzly as Vizzly$2, PersistViaQueryEngine, PersistDirectToVizzlyApi, Errors, VizzlyApiClientLogger } from '@vizzly/api-client';
|
|
68
68
|
import throttle$1 from 'lodash-es/throttle';
|
|
69
69
|
|
|
@@ -1080,6 +1080,34 @@ var checkForNullValue = function checkForNullValue(dataSetId, dimensions, timeDi
|
|
|
1080
1080
|
return textOverride ? textOverride(textOverrideKey ? textOverrideKey : 'no_value', NULL_REPLACEMENT) : undefined;
|
|
1081
1081
|
};
|
|
1082
1082
|
|
|
1083
|
+
var ValidationError = /*#__PURE__*/function (_Error) {
|
|
1084
|
+
function ValidationError(message) {
|
|
1085
|
+
var _this;
|
|
1086
|
+
_this = _Error.call(this, message) || this; // (1)
|
|
1087
|
+
_this.name = 'ValidationError'; // (2)
|
|
1088
|
+
return _this;
|
|
1089
|
+
}
|
|
1090
|
+
_inheritsLoose(ValidationError, _Error);
|
|
1091
|
+
return ValidationError;
|
|
1092
|
+
}( /*#__PURE__*/_wrapNativeSuper(Error));
|
|
1093
|
+
|
|
1094
|
+
var FieldNotFoundInDataSet = /*#__PURE__*/function (_ValidationError) {
|
|
1095
|
+
function FieldNotFoundInDataSet(dataSet, missingFieldId) {
|
|
1096
|
+
var _this;
|
|
1097
|
+
_this = _ValidationError.call(this, "\n An expected field is missing from a dataSet.\n\n Missing '" + missingFieldId + "'. Got;\n " + JSON.stringify(dataSet) + "\n ") || this;
|
|
1098
|
+
_this.missingFieldId = void 0;
|
|
1099
|
+
_this.name = 'FieldNotFoundInDataSet';
|
|
1100
|
+
_this.missingFieldId = missingFieldId;
|
|
1101
|
+
return _this;
|
|
1102
|
+
}
|
|
1103
|
+
_inheritsLoose(FieldNotFoundInDataSet, _ValidationError);
|
|
1104
|
+
var _proto = FieldNotFoundInDataSet.prototype;
|
|
1105
|
+
_proto.getMissingFieldId = function getMissingFieldId() {
|
|
1106
|
+
return this.missingFieldId;
|
|
1107
|
+
};
|
|
1108
|
+
return FieldNotFoundInDataSet;
|
|
1109
|
+
}(ValidationError);
|
|
1110
|
+
|
|
1083
1111
|
var timeDimensionsConstants = QueryEngineConfig.Constants.timeDimensionsConstants;
|
|
1084
1112
|
|
|
1085
1113
|
// All the aggregates Vizzly supports somewhere...
|
|
@@ -1107,6 +1135,300 @@ var isSupportedTimeTruncFunction = function isSupportedTimeTruncFunction(support
|
|
|
1107
1135
|
return [].concat(Object.keys(supportedTimeFunctions), ['none']).includes(proposedFunction);
|
|
1108
1136
|
};
|
|
1109
1137
|
|
|
1138
|
+
var filterIsDate = function filterIsDate(filter) {
|
|
1139
|
+
var isoDateRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/;
|
|
1140
|
+
if (!isoDateRegex.test(filter.value)) {
|
|
1141
|
+
return false;
|
|
1142
|
+
}
|
|
1143
|
+
var date = new Date(filter.value);
|
|
1144
|
+
if (isNaN(date.getTime())) {
|
|
1145
|
+
return false;
|
|
1146
|
+
}
|
|
1147
|
+
|
|
1148
|
+
// Additional check to verify that the date parts match exactly
|
|
1149
|
+
var _filter$value$split$ = filter.value.split('T')[0].split('-').map(Number),
|
|
1150
|
+
year = _filter$value$split$[0],
|
|
1151
|
+
month = _filter$value$split$[1],
|
|
1152
|
+
day = _filter$value$split$[2];
|
|
1153
|
+
if (date.getUTCFullYear() !== year || date.getUTCMonth() + 1 !== month || date.getUTCDate() !== day) {
|
|
1154
|
+
return false;
|
|
1155
|
+
}
|
|
1156
|
+
return true;
|
|
1157
|
+
};
|
|
1158
|
+
|
|
1159
|
+
var _Joi$string, _Joi$string2;
|
|
1160
|
+
var defaultDurationOptions = function defaultDurationOptions(textOverride) {
|
|
1161
|
+
return {
|
|
1162
|
+
minutes: {
|
|
1163
|
+
description: textOverride ? textOverride('duration_option.minutes', 'Minutes') : 'Minutes',
|
|
1164
|
+
formatter: function formatter(currentDate, value) {
|
|
1165
|
+
currentDate.setMinutes(currentDate.getMinutes() + value);
|
|
1166
|
+
}
|
|
1167
|
+
},
|
|
1168
|
+
hours: {
|
|
1169
|
+
description: textOverride ? textOverride('duration_option.minutes', 'Hours') : 'Hours',
|
|
1170
|
+
formatter: function formatter(currentDate, value) {
|
|
1171
|
+
currentDate.setHours(currentDate.getHours() + value);
|
|
1172
|
+
}
|
|
1173
|
+
},
|
|
1174
|
+
days: {
|
|
1175
|
+
description: textOverride ? textOverride('duration_option.minutes', 'Days') : 'Days',
|
|
1176
|
+
formatter: function formatter(currentDate, value) {
|
|
1177
|
+
currentDate.setDate(currentDate.getDate() + value);
|
|
1178
|
+
}
|
|
1179
|
+
},
|
|
1180
|
+
weeks: {
|
|
1181
|
+
description: textOverride ? textOverride('duration_option.minutes', 'Weeks') : 'Weeks',
|
|
1182
|
+
formatter: function formatter(currentDate, value) {
|
|
1183
|
+
currentDate.setDate(currentDate.getDate() + value * 7); // 1 week = 7 days
|
|
1184
|
+
}
|
|
1185
|
+
},
|
|
1186
|
+
months: {
|
|
1187
|
+
description: textOverride ? textOverride('duration_option.minutes', 'Months') : 'Months',
|
|
1188
|
+
formatter: function formatter(currentDate, value) {
|
|
1189
|
+
currentDate.setMonth(currentDate.getMonth() + value);
|
|
1190
|
+
}
|
|
1191
|
+
},
|
|
1192
|
+
years: {
|
|
1193
|
+
description: textOverride ? textOverride('duration_option.minutes', 'Years') : 'Years',
|
|
1194
|
+
formatter: function formatter(currentDate, value) {
|
|
1195
|
+
currentDate.setFullYear(currentDate.getFullYear() + value);
|
|
1196
|
+
}
|
|
1197
|
+
}
|
|
1198
|
+
};
|
|
1199
|
+
};
|
|
1200
|
+
var defaultTimeframeOptions = function defaultTimeframeOptions(textOverride) {
|
|
1201
|
+
return {
|
|
1202
|
+
future: {
|
|
1203
|
+
description: textOverride ? textOverride('timeframe_option.minutes', 'Future') : 'Future'
|
|
1204
|
+
},
|
|
1205
|
+
past: {
|
|
1206
|
+
description: textOverride ? textOverride('timeframe_option.past', 'Past') : 'Past'
|
|
1207
|
+
}
|
|
1208
|
+
};
|
|
1209
|
+
};
|
|
1210
|
+
var getDurationKeys = function getDurationKeys() {
|
|
1211
|
+
var options = defaultDurationOptions();
|
|
1212
|
+
return Object.keys(options);
|
|
1213
|
+
};
|
|
1214
|
+
var getTimeframeKeys = function getTimeframeKeys() {
|
|
1215
|
+
var options = defaultTimeframeOptions();
|
|
1216
|
+
return Object.keys(options);
|
|
1217
|
+
};
|
|
1218
|
+
var relativeSchema = /*#__PURE__*/Joi.object({
|
|
1219
|
+
unit: /*#__PURE__*/(_Joi$string = Joi.string()).valid.apply(_Joi$string, getDurationKeys()).required(),
|
|
1220
|
+
value: /*#__PURE__*/Joi.number().integer().required(),
|
|
1221
|
+
timeFrame: /*#__PURE__*/(_Joi$string2 = Joi.string()).valid.apply(_Joi$string2, getTimeframeKeys()).required()
|
|
1222
|
+
});
|
|
1223
|
+
function isRelative(value) {
|
|
1224
|
+
return value && typeof value === 'object' && 'unit' in value && 'value' in value && 'timeFrame' in value;
|
|
1225
|
+
}
|
|
1226
|
+
function isRelativeDateDefined(value) {
|
|
1227
|
+
var _relativeSchema$valid = relativeSchema.validate(value),
|
|
1228
|
+
error = _relativeSchema$valid.error;
|
|
1229
|
+
return !error;
|
|
1230
|
+
}
|
|
1231
|
+
var init = function init() {
|
|
1232
|
+
return {
|
|
1233
|
+
value: null,
|
|
1234
|
+
unit: null,
|
|
1235
|
+
timeFrame: 'future'
|
|
1236
|
+
};
|
|
1237
|
+
};
|
|
1238
|
+
var calculateRelativeDate = function calculateRelativeDate(relativeDate, startDate) {
|
|
1239
|
+
var currentDate = startDate ? new Date(startDate) : new Date();
|
|
1240
|
+
if (!relativeDate.value || relativeDate.unit === null) {
|
|
1241
|
+
throw new Error("Unrecognized value: " + relativeDate.value);
|
|
1242
|
+
}
|
|
1243
|
+
var newDate = relativeDate.timeFrame === 'future' ? relativeDate.value : -relativeDate.value;
|
|
1244
|
+
defaultDurationOptions()[relativeDate.unit].formatter(currentDate, newDate);
|
|
1245
|
+
return currentDate;
|
|
1246
|
+
};
|
|
1247
|
+
var buildRelativeRange = function buildRelativeRange(relativeFilters, dataSet, appliesToFields) {
|
|
1248
|
+
if (!appliesToFields) {
|
|
1249
|
+
throw new Error('appliesToFields is required');
|
|
1250
|
+
}
|
|
1251
|
+
return relativeFilters.map(function (group) {
|
|
1252
|
+
var templates = group.map(function (condition) {
|
|
1253
|
+
return {
|
|
1254
|
+
op: condition.op,
|
|
1255
|
+
value: _extends({}, condition.value)
|
|
1256
|
+
};
|
|
1257
|
+
});
|
|
1258
|
+
var newGroup = [];
|
|
1259
|
+
appliesToFields.forEach(function (field) {
|
|
1260
|
+
if (field.dataSetId != dataSet.id) return;
|
|
1261
|
+
templates.forEach(function (template) {
|
|
1262
|
+
newGroup.push(_extends({}, template, {
|
|
1263
|
+
field: field.fieldId
|
|
1264
|
+
}));
|
|
1265
|
+
});
|
|
1266
|
+
});
|
|
1267
|
+
return newGroup;
|
|
1268
|
+
});
|
|
1269
|
+
};
|
|
1270
|
+
|
|
1271
|
+
var getUTCDate = function getUTCDate(date) {
|
|
1272
|
+
if (date !== null) {
|
|
1273
|
+
var momentDate = moment(new Date(date));
|
|
1274
|
+
return momentDate.tz(Intl.DateTimeFormat().resolvedOptions().timeZone)._d;
|
|
1275
|
+
}
|
|
1276
|
+
return date;
|
|
1277
|
+
};
|
|
1278
|
+
|
|
1279
|
+
var VariableNotFoundForVariables = /*#__PURE__*/function (_ValidationError) {
|
|
1280
|
+
function VariableNotFoundForVariables(variableList, missingVariableId) {
|
|
1281
|
+
var _this;
|
|
1282
|
+
_this = _ValidationError.call(this, "\n An expected variable is missing from the defined Variables.\n\n Missing '" + missingVariableId + "'. Got;\n " + JSON.stringify(variableList) + "\n ") || this;
|
|
1283
|
+
_this.missingVariableId = void 0;
|
|
1284
|
+
_this.name = 'VariableNotFoundForVariables';
|
|
1285
|
+
_this.missingVariableId = missingVariableId;
|
|
1286
|
+
return _this;
|
|
1287
|
+
}
|
|
1288
|
+
_inheritsLoose(VariableNotFoundForVariables, _ValidationError);
|
|
1289
|
+
var _proto = VariableNotFoundForVariables.prototype;
|
|
1290
|
+
_proto.getMissingFieldId = function getMissingFieldId() {
|
|
1291
|
+
return this.missingVariableId;
|
|
1292
|
+
};
|
|
1293
|
+
return VariableNotFoundForVariables;
|
|
1294
|
+
}(ValidationError);
|
|
1295
|
+
|
|
1296
|
+
var detect = function detect(input) {
|
|
1297
|
+
var regex = /\{\{\s*([^\s{}][^{}]*?)\s*\}\}/g;
|
|
1298
|
+
var matches = [];
|
|
1299
|
+
var match;
|
|
1300
|
+
while ((match = regex.exec(input)) !== null) {
|
|
1301
|
+
matches.push(match[1].trim());
|
|
1302
|
+
}
|
|
1303
|
+
return matches.length > 0 ? matches : undefined;
|
|
1304
|
+
};
|
|
1305
|
+
var build$1 = function build(variables) {
|
|
1306
|
+
if (variables) {
|
|
1307
|
+
var dashboardDefinedVariables = variables();
|
|
1308
|
+
logInfo('Detected variables', dashboardDefinedVariables);
|
|
1309
|
+
return dashboardDefinedVariables;
|
|
1310
|
+
}
|
|
1311
|
+
return {};
|
|
1312
|
+
};
|
|
1313
|
+
var findVariable = function findVariable(value, detect, variableList) {
|
|
1314
|
+
if (!variableList) return undefined;
|
|
1315
|
+
|
|
1316
|
+
// Use the detect function to check if the value is a variable
|
|
1317
|
+
var variables = detect(value);
|
|
1318
|
+
|
|
1319
|
+
// If no variables are detected, return early
|
|
1320
|
+
if (!variables || variables.length === 0) {
|
|
1321
|
+
return undefined; // Early return if the value is not a variable
|
|
1322
|
+
}
|
|
1323
|
+
var matchedVariables = [];
|
|
1324
|
+
|
|
1325
|
+
// Check for matching variables in the variable list
|
|
1326
|
+
for (var _iterator = _createForOfIteratorHelperLoose(variables), _step; !(_step = _iterator()).done;) {
|
|
1327
|
+
var variable = _step.value;
|
|
1328
|
+
var variableEntry = variableList[variable];
|
|
1329
|
+
if (variableEntry) {
|
|
1330
|
+
// If the variable is found but its value is undefined or empty, throw an error
|
|
1331
|
+
if (variableEntry.value === undefined || variableEntry.value === '') {
|
|
1332
|
+
throw new Error("Variable '" + variable + "' is defined in the list but has no value.");
|
|
1333
|
+
}
|
|
1334
|
+
|
|
1335
|
+
// Add the variable to the matched variables list
|
|
1336
|
+
matchedVariables.push(variable);
|
|
1337
|
+
}
|
|
1338
|
+
}
|
|
1339
|
+
|
|
1340
|
+
// If no matches are found, throw an error
|
|
1341
|
+
if (matchedVariables.length === 0 && value) {
|
|
1342
|
+
throw new VariableNotFoundForVariables(variableList, value);
|
|
1343
|
+
}
|
|
1344
|
+
return matchedVariables.length > 0 ? matchedVariables : undefined;
|
|
1345
|
+
};
|
|
1346
|
+
var useValue = function useValue(value, variables) {
|
|
1347
|
+
if (typeof value === 'string') {
|
|
1348
|
+
var valueHasVariables = detect(value);
|
|
1349
|
+
if (valueHasVariables && variables) {
|
|
1350
|
+
for (var _iterator2 = _createForOfIteratorHelperLoose(valueHasVariables), _step2; !(_step2 = _iterator2()).done;) {
|
|
1351
|
+
var key = _step2.value;
|
|
1352
|
+
if (key in variables) {
|
|
1353
|
+
return extractValue(variables, key);
|
|
1354
|
+
}
|
|
1355
|
+
}
|
|
1356
|
+
}
|
|
1357
|
+
}
|
|
1358
|
+
return value;
|
|
1359
|
+
};
|
|
1360
|
+
var validate = function validate(value, variables) {
|
|
1361
|
+
try {
|
|
1362
|
+
findVariable(value, detect, variables);
|
|
1363
|
+
return true;
|
|
1364
|
+
} catch (e) {
|
|
1365
|
+
return false;
|
|
1366
|
+
}
|
|
1367
|
+
};
|
|
1368
|
+
function extractValue(variables, key) {
|
|
1369
|
+
return variables[key].value;
|
|
1370
|
+
}
|
|
1371
|
+
|
|
1372
|
+
var addAndFilters = function addAndFilters(filter, filterToAddToAll) {
|
|
1373
|
+
if (!filter || isEmpty$2(filter)) filter = [[]];
|
|
1374
|
+
return [].concat(filter).map(function (andFilter) {
|
|
1375
|
+
return [].concat(andFilter, filterToAddToAll);
|
|
1376
|
+
});
|
|
1377
|
+
};
|
|
1378
|
+
var filterAttributeToQueryFilter = function filterAttributeToQueryFilter(filters, queryEngineConfig, dataSet, params) {
|
|
1379
|
+
return filters.map(function (andFilters) {
|
|
1380
|
+
return [].concat(andFilters).flatMap(function (andFilter) {
|
|
1381
|
+
var _andFilter$function;
|
|
1382
|
+
// Stop unsupported time functions being used.
|
|
1383
|
+
if (andFilter["function"] && !isSupportedTimeTruncFunction(queryEngineConfig.supportedTimeTruncFunctions, andFilter["function"])) {
|
|
1384
|
+
throw "Query engine does not support the query function " + andFilter["function"] + ".";
|
|
1385
|
+
}
|
|
1386
|
+
var dataSetField = findField(dataSet, andFilter.field);
|
|
1387
|
+
var field = {
|
|
1388
|
+
type: 'field',
|
|
1389
|
+
value: andFilter.field,
|
|
1390
|
+
"function": (_andFilter$function = andFilter["function"]) != null ? _andFilter$function : 'none'
|
|
1391
|
+
};
|
|
1392
|
+
if (isCustomField(dataSetField)) {
|
|
1393
|
+
var _andFilter$function2;
|
|
1394
|
+
field = toQueryMeasure({
|
|
1395
|
+
field: dataSetField.id,
|
|
1396
|
+
"function": (_andFilter$function2 = andFilter["function"]) != null ? _andFilter$function2 : 'none'
|
|
1397
|
+
}, dataSetField, queryEngineConfig, dataSet, false, params);
|
|
1398
|
+
}
|
|
1399
|
+
// If `array_contains` operation has multiple. Then split these out into individual
|
|
1400
|
+
// checks.
|
|
1401
|
+
if ((andFilter.op == 'array_contains' || andFilter.op == 'array_does_not_contain') && Array.isArray(andFilter.value)) {
|
|
1402
|
+
return [].concat(andFilter.value).map(function (value) {
|
|
1403
|
+
return {
|
|
1404
|
+
field: field,
|
|
1405
|
+
op: andFilter.op,
|
|
1406
|
+
value: value
|
|
1407
|
+
};
|
|
1408
|
+
});
|
|
1409
|
+
}
|
|
1410
|
+
var value = useValue(andFilter.value, params.variables);
|
|
1411
|
+
if (isRelativeDateDefined(andFilter.value)) {
|
|
1412
|
+
value = calculateRelativeDate(andFilter.value);
|
|
1413
|
+
}
|
|
1414
|
+
if (filterIsDate(andFilter)) {
|
|
1415
|
+
value = getUTCDate(andFilter.value);
|
|
1416
|
+
}
|
|
1417
|
+
return [{
|
|
1418
|
+
field: field,
|
|
1419
|
+
op: andFilter.op,
|
|
1420
|
+
value: value
|
|
1421
|
+
}];
|
|
1422
|
+
});
|
|
1423
|
+
});
|
|
1424
|
+
};
|
|
1425
|
+
var isAvailable = function isAvailable(filter) {
|
|
1426
|
+
return filter && isArray(filter) && isArray(filter[0]);
|
|
1427
|
+
};
|
|
1428
|
+
var isAdditionalFilter = function isAdditionalFilter(value) {
|
|
1429
|
+
return value && isArray(value) && isArray(value[0]) && 'field' in value[0][0] && 'op' in value[0][0] && 'value' in value[0][0];
|
|
1430
|
+
};
|
|
1431
|
+
|
|
1110
1432
|
var combineFilters = function combineFilters(array1, array2) {
|
|
1111
1433
|
var validArray1 = array1.length > 0 && array1[0] ? array1 : [[]];
|
|
1112
1434
|
var validArray2 = array2.length > 0 && array2[0] ? array2 : [[]];
|
|
@@ -1195,126 +1517,6 @@ var MULTI_SELECT_FILTER = 'multiSelectFilter';
|
|
|
1195
1517
|
var NUMERIC_FILTER = 'numericFilter';
|
|
1196
1518
|
var ADVANCED_FILTER = 'advancedFilter';
|
|
1197
1519
|
|
|
1198
|
-
var _Joi$string, _Joi$string2;
|
|
1199
|
-
var defaultDurationOptions = function defaultDurationOptions(textOverride) {
|
|
1200
|
-
return {
|
|
1201
|
-
minutes: {
|
|
1202
|
-
description: textOverride ? textOverride('duration_option.minutes', 'Minutes') : 'Minutes',
|
|
1203
|
-
formatter: function formatter(currentDate, value) {
|
|
1204
|
-
currentDate.setMinutes(currentDate.getMinutes() + value);
|
|
1205
|
-
}
|
|
1206
|
-
},
|
|
1207
|
-
hours: {
|
|
1208
|
-
description: textOverride ? textOverride('duration_option.minutes', 'Hours') : 'Hours',
|
|
1209
|
-
formatter: function formatter(currentDate, value) {
|
|
1210
|
-
currentDate.setHours(currentDate.getHours() + value);
|
|
1211
|
-
}
|
|
1212
|
-
},
|
|
1213
|
-
days: {
|
|
1214
|
-
description: textOverride ? textOverride('duration_option.minutes', 'Days') : 'Days',
|
|
1215
|
-
formatter: function formatter(currentDate, value) {
|
|
1216
|
-
currentDate.setDate(currentDate.getDate() + value);
|
|
1217
|
-
}
|
|
1218
|
-
},
|
|
1219
|
-
weeks: {
|
|
1220
|
-
description: textOverride ? textOverride('duration_option.minutes', 'Weeks') : 'Weeks',
|
|
1221
|
-
formatter: function formatter(currentDate, value) {
|
|
1222
|
-
currentDate.setDate(currentDate.getDate() + value * 7); // 1 week = 7 days
|
|
1223
|
-
}
|
|
1224
|
-
},
|
|
1225
|
-
months: {
|
|
1226
|
-
description: textOverride ? textOverride('duration_option.minutes', 'Months') : 'Months',
|
|
1227
|
-
formatter: function formatter(currentDate, value) {
|
|
1228
|
-
currentDate.setMonth(currentDate.getMonth() + value);
|
|
1229
|
-
}
|
|
1230
|
-
},
|
|
1231
|
-
years: {
|
|
1232
|
-
description: textOverride ? textOverride('duration_option.minutes', 'Years') : 'Years',
|
|
1233
|
-
formatter: function formatter(currentDate, value) {
|
|
1234
|
-
currentDate.setFullYear(currentDate.getFullYear() + value);
|
|
1235
|
-
}
|
|
1236
|
-
}
|
|
1237
|
-
};
|
|
1238
|
-
};
|
|
1239
|
-
var defaultTimeframeOptions = function defaultTimeframeOptions(textOverride) {
|
|
1240
|
-
return {
|
|
1241
|
-
future: {
|
|
1242
|
-
description: textOverride ? textOverride('timeframe_option.minutes', 'Future') : 'Future'
|
|
1243
|
-
},
|
|
1244
|
-
past: {
|
|
1245
|
-
description: textOverride ? textOverride('timeframe_option.past', 'Past') : 'Past'
|
|
1246
|
-
}
|
|
1247
|
-
};
|
|
1248
|
-
};
|
|
1249
|
-
var getDurationKeys = function getDurationKeys() {
|
|
1250
|
-
var options = defaultDurationOptions();
|
|
1251
|
-
return Object.keys(options);
|
|
1252
|
-
};
|
|
1253
|
-
var getTimeframeKeys = function getTimeframeKeys() {
|
|
1254
|
-
var options = defaultTimeframeOptions();
|
|
1255
|
-
return Object.keys(options);
|
|
1256
|
-
};
|
|
1257
|
-
var relativeSchema = /*#__PURE__*/Joi.object({
|
|
1258
|
-
unit: /*#__PURE__*/(_Joi$string = Joi.string()).valid.apply(_Joi$string, getDurationKeys()).required(),
|
|
1259
|
-
value: /*#__PURE__*/Joi.number().integer().required(),
|
|
1260
|
-
timeFrame: /*#__PURE__*/(_Joi$string2 = Joi.string()).valid.apply(_Joi$string2, getTimeframeKeys()).required()
|
|
1261
|
-
});
|
|
1262
|
-
function isRelative(value) {
|
|
1263
|
-
return value && typeof value === 'object' && 'unit' in value && 'value' in value && 'timeFrame' in value;
|
|
1264
|
-
}
|
|
1265
|
-
function isRelativeDateDefined(value) {
|
|
1266
|
-
var _relativeSchema$valid = relativeSchema.validate(value),
|
|
1267
|
-
error = _relativeSchema$valid.error;
|
|
1268
|
-
return !error;
|
|
1269
|
-
}
|
|
1270
|
-
var init = function init() {
|
|
1271
|
-
return {
|
|
1272
|
-
value: null,
|
|
1273
|
-
unit: null,
|
|
1274
|
-
timeFrame: 'future'
|
|
1275
|
-
};
|
|
1276
|
-
};
|
|
1277
|
-
var calculateRelativeDate = function calculateRelativeDate(relativeDate, startDate) {
|
|
1278
|
-
var currentDate = startDate ? new Date(startDate) : new Date();
|
|
1279
|
-
if (!relativeDate.value || relativeDate.unit === null) {
|
|
1280
|
-
throw new Error("Unrecognized value: " + relativeDate.value);
|
|
1281
|
-
}
|
|
1282
|
-
var newDate = relativeDate.timeFrame === 'future' ? relativeDate.value : -relativeDate.value;
|
|
1283
|
-
defaultDurationOptions()[relativeDate.unit].formatter(currentDate, newDate);
|
|
1284
|
-
return currentDate;
|
|
1285
|
-
};
|
|
1286
|
-
var buildRelativeRange = function buildRelativeRange(relativeFilters, dataSet, appliesToFields) {
|
|
1287
|
-
if (!appliesToFields) {
|
|
1288
|
-
throw new Error('appliesToFields is required');
|
|
1289
|
-
}
|
|
1290
|
-
return relativeFilters.map(function (group) {
|
|
1291
|
-
var templates = group.map(function (condition) {
|
|
1292
|
-
return {
|
|
1293
|
-
op: condition.op,
|
|
1294
|
-
value: _extends({}, condition.value)
|
|
1295
|
-
};
|
|
1296
|
-
});
|
|
1297
|
-
var newGroup = [];
|
|
1298
|
-
appliesToFields.forEach(function (field) {
|
|
1299
|
-
if (field.dataSetId != dataSet.id) return;
|
|
1300
|
-
templates.forEach(function (template) {
|
|
1301
|
-
newGroup.push(_extends({}, template, {
|
|
1302
|
-
field: field.fieldId
|
|
1303
|
-
}));
|
|
1304
|
-
});
|
|
1305
|
-
});
|
|
1306
|
-
return newGroup;
|
|
1307
|
-
});
|
|
1308
|
-
};
|
|
1309
|
-
|
|
1310
|
-
var getUTCDate = function getUTCDate(date) {
|
|
1311
|
-
if (date !== null) {
|
|
1312
|
-
var momentDate = moment(new Date(date));
|
|
1313
|
-
return momentDate.tz(Intl.DateTimeFormat().resolvedOptions().timeZone)._d;
|
|
1314
|
-
}
|
|
1315
|
-
return date;
|
|
1316
|
-
};
|
|
1317
|
-
|
|
1318
1520
|
var toQueryAttributesFilter = function toQueryAttributesFilter(dataSet, filter, customTimeRangeFuncs) {
|
|
1319
1521
|
return filter.appliesToFields.flatMap(function (field) {
|
|
1320
1522
|
var _filter$value, _filter$value2, _filter$value3;
|
|
@@ -1716,7 +1918,7 @@ var init$1 = function init(publicName, denominatorFieldId, denominatorAggregate,
|
|
|
1716
1918
|
}, queryEngineConfig)
|
|
1717
1919
|
};
|
|
1718
1920
|
};
|
|
1719
|
-
var build$
|
|
1921
|
+
var build$2 = function build(customField, queryEngineConfig, dataSet, _queryHasDimension, params) {
|
|
1720
1922
|
var _params$filterConfig$, _params$filterConfig, _customField$numerato, _customField$numerato2, _customField$denomina, _customField$denomina2;
|
|
1721
1923
|
var localAndDashboardFilters = fromFilterConfig(params.filterConfig, dataSet, params.timeRangeOptions);
|
|
1722
1924
|
var _buildPercentageFilte = buildPercentageFilters(addAndFilters((_params$filterConfig$ = params == null || (_params$filterConfig = params.filterConfig) == null ? void 0 : _params$filterConfig.advancedFilter) != null ? _params$filterConfig$ : [], localAndDashboardFilters), customField),
|
|
@@ -1814,110 +2016,6 @@ function buildPercentageFilters(filters, customField) {
|
|
|
1814
2016
|
};
|
|
1815
2017
|
}
|
|
1816
2018
|
|
|
1817
|
-
var ValidationError = /*#__PURE__*/function (_Error) {
|
|
1818
|
-
function ValidationError(message) {
|
|
1819
|
-
var _this;
|
|
1820
|
-
_this = _Error.call(this, message) || this; // (1)
|
|
1821
|
-
_this.name = 'ValidationError'; // (2)
|
|
1822
|
-
return _this;
|
|
1823
|
-
}
|
|
1824
|
-
_inheritsLoose(ValidationError, _Error);
|
|
1825
|
-
return ValidationError;
|
|
1826
|
-
}( /*#__PURE__*/_wrapNativeSuper(Error));
|
|
1827
|
-
|
|
1828
|
-
var VariableNotFoundForVariables = /*#__PURE__*/function (_ValidationError) {
|
|
1829
|
-
function VariableNotFoundForVariables(variableList, missingVariableId) {
|
|
1830
|
-
var _this;
|
|
1831
|
-
_this = _ValidationError.call(this, "\n An expected variable is missing from the defined Variables.\n\n Missing '" + missingVariableId + "'. Got;\n " + JSON.stringify(variableList) + "\n ") || this;
|
|
1832
|
-
_this.missingVariableId = void 0;
|
|
1833
|
-
_this.name = 'VariableNotFoundForVariables';
|
|
1834
|
-
_this.missingVariableId = missingVariableId;
|
|
1835
|
-
return _this;
|
|
1836
|
-
}
|
|
1837
|
-
_inheritsLoose(VariableNotFoundForVariables, _ValidationError);
|
|
1838
|
-
var _proto = VariableNotFoundForVariables.prototype;
|
|
1839
|
-
_proto.getMissingFieldId = function getMissingFieldId() {
|
|
1840
|
-
return this.missingVariableId;
|
|
1841
|
-
};
|
|
1842
|
-
return VariableNotFoundForVariables;
|
|
1843
|
-
}(ValidationError);
|
|
1844
|
-
|
|
1845
|
-
var detect = function detect(input) {
|
|
1846
|
-
var regex = /\{\{\s*([^\s{}][^{}]*?)\s*\}\}/g;
|
|
1847
|
-
var matches = [];
|
|
1848
|
-
var match;
|
|
1849
|
-
while ((match = regex.exec(input)) !== null) {
|
|
1850
|
-
matches.push(match[1].trim());
|
|
1851
|
-
}
|
|
1852
|
-
return matches.length > 0 ? matches : undefined;
|
|
1853
|
-
};
|
|
1854
|
-
var build$2 = function build(variables) {
|
|
1855
|
-
if (variables) {
|
|
1856
|
-
var dashboardDefinedVariables = variables();
|
|
1857
|
-
logInfo('Detected variables', dashboardDefinedVariables);
|
|
1858
|
-
return dashboardDefinedVariables;
|
|
1859
|
-
}
|
|
1860
|
-
return {};
|
|
1861
|
-
};
|
|
1862
|
-
var findVariable = function findVariable(value, detect, variableList) {
|
|
1863
|
-
if (!variableList) return undefined;
|
|
1864
|
-
|
|
1865
|
-
// Use the detect function to check if the value is a variable
|
|
1866
|
-
var variables = detect(value);
|
|
1867
|
-
|
|
1868
|
-
// If no variables are detected, return early
|
|
1869
|
-
if (!variables || variables.length === 0) {
|
|
1870
|
-
return undefined; // Early return if the value is not a variable
|
|
1871
|
-
}
|
|
1872
|
-
var matchedVariables = [];
|
|
1873
|
-
|
|
1874
|
-
// Check for matching variables in the variable list
|
|
1875
|
-
for (var _iterator = _createForOfIteratorHelperLoose(variables), _step; !(_step = _iterator()).done;) {
|
|
1876
|
-
var variable = _step.value;
|
|
1877
|
-
var variableEntry = variableList[variable];
|
|
1878
|
-
if (variableEntry) {
|
|
1879
|
-
// If the variable is found but its value is undefined or empty, throw an error
|
|
1880
|
-
if (variableEntry.value === undefined || variableEntry.value === '') {
|
|
1881
|
-
throw new Error("Variable '" + variable + "' is defined in the list but has no value.");
|
|
1882
|
-
}
|
|
1883
|
-
|
|
1884
|
-
// Add the variable to the matched variables list
|
|
1885
|
-
matchedVariables.push(variable);
|
|
1886
|
-
}
|
|
1887
|
-
}
|
|
1888
|
-
|
|
1889
|
-
// If no matches are found, throw an error
|
|
1890
|
-
if (matchedVariables.length === 0 && value) {
|
|
1891
|
-
throw new VariableNotFoundForVariables(variableList, value);
|
|
1892
|
-
}
|
|
1893
|
-
return matchedVariables.length > 0 ? matchedVariables : undefined;
|
|
1894
|
-
};
|
|
1895
|
-
var useValue = function useValue(value, variables) {
|
|
1896
|
-
if (typeof value === 'string') {
|
|
1897
|
-
var valueHasVariables = detect(value);
|
|
1898
|
-
if (valueHasVariables && variables) {
|
|
1899
|
-
for (var _iterator2 = _createForOfIteratorHelperLoose(valueHasVariables), _step2; !(_step2 = _iterator2()).done;) {
|
|
1900
|
-
var key = _step2.value;
|
|
1901
|
-
if (key in variables) {
|
|
1902
|
-
return extractValue(variables, key);
|
|
1903
|
-
}
|
|
1904
|
-
}
|
|
1905
|
-
}
|
|
1906
|
-
}
|
|
1907
|
-
return value;
|
|
1908
|
-
};
|
|
1909
|
-
var validate = function validate(value, variables) {
|
|
1910
|
-
try {
|
|
1911
|
-
findVariable(value, detect, variables);
|
|
1912
|
-
return true;
|
|
1913
|
-
} catch (e) {
|
|
1914
|
-
return false;
|
|
1915
|
-
}
|
|
1916
|
-
};
|
|
1917
|
-
function extractValue(variables, key) {
|
|
1918
|
-
return variables[key].value;
|
|
1919
|
-
}
|
|
1920
|
-
|
|
1921
2019
|
var init$2 = function init(publicName, leftFieldId, operator, rightFieldId, queryEngineConfig) {
|
|
1922
2020
|
return {
|
|
1923
2021
|
id: generateId(),
|
|
@@ -2466,7 +2564,7 @@ var isCustomField = function isCustomField(field) {
|
|
|
2466
2564
|
*/
|
|
2467
2565
|
var toQueryMeasure = function toQueryMeasure(measureAttribute, customField, queryEngineConfig, dataSet, queryHasDimension, params) {
|
|
2468
2566
|
if (isPercentageField(customField)) {
|
|
2469
|
-
return build$
|
|
2567
|
+
return build$2(customField, queryEngineConfig, dataSet, queryHasDimension, params);
|
|
2470
2568
|
}
|
|
2471
2569
|
if (isRules(customField)) {
|
|
2472
2570
|
return build$6(measureAttribute, customField, queryEngineConfig, dataSet, params);
|
|
@@ -2533,790 +2631,6 @@ var upcast = function upcast(maybeOldCustomField) {
|
|
|
2533
2631
|
return maybeOldCustomField;
|
|
2534
2632
|
};
|
|
2535
2633
|
|
|
2536
|
-
var filterIsDate = function filterIsDate(filter) {
|
|
2537
|
-
var isoDateRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/;
|
|
2538
|
-
if (!isoDateRegex.test(filter.value)) {
|
|
2539
|
-
return false;
|
|
2540
|
-
}
|
|
2541
|
-
var date = new Date(filter.value);
|
|
2542
|
-
if (isNaN(date.getTime())) {
|
|
2543
|
-
return false;
|
|
2544
|
-
}
|
|
2545
|
-
|
|
2546
|
-
// Additional check to verify that the date parts match exactly
|
|
2547
|
-
var _filter$value$split$ = filter.value.split('T')[0].split('-').map(Number),
|
|
2548
|
-
year = _filter$value$split$[0],
|
|
2549
|
-
month = _filter$value$split$[1],
|
|
2550
|
-
day = _filter$value$split$[2];
|
|
2551
|
-
if (date.getUTCFullYear() !== year || date.getUTCMonth() + 1 !== month || date.getUTCDate() !== day) {
|
|
2552
|
-
return false;
|
|
2553
|
-
}
|
|
2554
|
-
return true;
|
|
2555
|
-
};
|
|
2556
|
-
|
|
2557
|
-
var addAndFilters = function addAndFilters(filter, filterToAddToAll) {
|
|
2558
|
-
if (!filter || isEmpty$2(filter)) filter = [[]];
|
|
2559
|
-
return [].concat(filter).map(function (andFilter) {
|
|
2560
|
-
return [].concat(andFilter, filterToAddToAll);
|
|
2561
|
-
});
|
|
2562
|
-
};
|
|
2563
|
-
var filterAttributeToQueryFilter = function filterAttributeToQueryFilter(filters, queryEngineConfig, dataSet, params) {
|
|
2564
|
-
return filters.map(function (andFilters) {
|
|
2565
|
-
return [].concat(andFilters).flatMap(function (andFilter) {
|
|
2566
|
-
var _andFilter$function;
|
|
2567
|
-
// Stop unsupported time functions being used.
|
|
2568
|
-
if (andFilter["function"] && !isSupportedTimeTruncFunction(queryEngineConfig.supportedTimeTruncFunctions, andFilter["function"])) {
|
|
2569
|
-
throw "Query engine does not support the query function " + andFilter["function"] + ".";
|
|
2570
|
-
}
|
|
2571
|
-
var dataSetField = findField(dataSet, andFilter.field);
|
|
2572
|
-
var field = {
|
|
2573
|
-
type: 'field',
|
|
2574
|
-
value: andFilter.field,
|
|
2575
|
-
"function": (_andFilter$function = andFilter["function"]) != null ? _andFilter$function : 'none'
|
|
2576
|
-
};
|
|
2577
|
-
if (isCustomField(dataSetField)) {
|
|
2578
|
-
var _andFilter$function2;
|
|
2579
|
-
field = toQueryMeasure({
|
|
2580
|
-
field: dataSetField.id,
|
|
2581
|
-
"function": (_andFilter$function2 = andFilter["function"]) != null ? _andFilter$function2 : 'none'
|
|
2582
|
-
}, dataSetField, queryEngineConfig, dataSet, false, params);
|
|
2583
|
-
}
|
|
2584
|
-
// If `array_contains` operation has multiple. Then split these out into individual
|
|
2585
|
-
// checks.
|
|
2586
|
-
if ((andFilter.op == 'array_contains' || andFilter.op == 'array_does_not_contain') && Array.isArray(andFilter.value)) {
|
|
2587
|
-
return [].concat(andFilter.value).map(function (value) {
|
|
2588
|
-
return {
|
|
2589
|
-
field: field,
|
|
2590
|
-
op: andFilter.op,
|
|
2591
|
-
value: value
|
|
2592
|
-
};
|
|
2593
|
-
});
|
|
2594
|
-
}
|
|
2595
|
-
var value = useValue(andFilter.value, params.variables);
|
|
2596
|
-
if (isRelativeDateDefined(andFilter.value)) {
|
|
2597
|
-
value = calculateRelativeDate(andFilter.value);
|
|
2598
|
-
}
|
|
2599
|
-
if (filterIsDate(andFilter)) {
|
|
2600
|
-
value = getUTCDate(andFilter.value);
|
|
2601
|
-
}
|
|
2602
|
-
return [{
|
|
2603
|
-
field: field,
|
|
2604
|
-
op: andFilter.op,
|
|
2605
|
-
value: value
|
|
2606
|
-
}];
|
|
2607
|
-
});
|
|
2608
|
-
});
|
|
2609
|
-
};
|
|
2610
|
-
var isAvailable = function isAvailable(filter) {
|
|
2611
|
-
return filter && isArray(filter) && isArray(filter[0]);
|
|
2612
|
-
};
|
|
2613
|
-
var isAdditionalFilter = function isAdditionalFilter(value) {
|
|
2614
|
-
return value && isArray(value) && isArray(value[0]) && 'field' in value[0][0] && 'op' in value[0][0] && 'value' in value[0][0];
|
|
2615
|
-
};
|
|
2616
|
-
|
|
2617
|
-
var groupFilters = function groupFilters(dataSets) {
|
|
2618
|
-
var groups = {};
|
|
2619
|
-
dataSets.forEach(function (dataSet) {
|
|
2620
|
-
if (dataSet && dataSet.fields) {
|
|
2621
|
-
dataSet.fields.forEach(function (dataSetField) {
|
|
2622
|
-
(dataSetField.dashboardRequiredFilterGroups || []).forEach(function (filterGroup) {
|
|
2623
|
-
var key = filterGroup.publicName + " - " + dataSetField.dataType;
|
|
2624
|
-
groups[key] = [].concat(groups[key] || [], [{
|
|
2625
|
-
publicName: filterGroup.publicName,
|
|
2626
|
-
dataSetField: dataSetField,
|
|
2627
|
-
dataSetId: dataSet.id
|
|
2628
|
-
}]);
|
|
2629
|
-
});
|
|
2630
|
-
});
|
|
2631
|
-
} else {
|
|
2632
|
-
logError('DataSet is undefined or does not have fields', dataSet);
|
|
2633
|
-
}
|
|
2634
|
-
});
|
|
2635
|
-
return Object.values(groups);
|
|
2636
|
-
};
|
|
2637
|
-
var fromDashboardRequiredFilterGroups = function fromDashboardRequiredFilterGroups(dataSets) {
|
|
2638
|
-
var groupedFilters = groupFilters(dataSets);
|
|
2639
|
-
return groupedFilters.map(function (group) {
|
|
2640
|
-
return {
|
|
2641
|
-
type: group[0].dataSetField.dataType == 'date_time' ? DATE_FILTER : SINGLE_SELECT_FILTER,
|
|
2642
|
-
managedByConfiguration: true,
|
|
2643
|
-
requiresValue: true,
|
|
2644
|
-
title: group[0].publicName,
|
|
2645
|
-
appliesToFields: group.map(function (g) {
|
|
2646
|
-
return {
|
|
2647
|
-
dataSetId: g.dataSetId,
|
|
2648
|
-
fieldId: g.dataSetField.id
|
|
2649
|
-
};
|
|
2650
|
-
}),
|
|
2651
|
-
value: null
|
|
2652
|
-
};
|
|
2653
|
-
});
|
|
2654
|
-
};
|
|
2655
|
-
|
|
2656
|
-
var tagSchema = function tagSchema() {
|
|
2657
|
-
return Joi.object({
|
|
2658
|
-
key: Joi.string().required()
|
|
2659
|
-
});
|
|
2660
|
-
};
|
|
2661
|
-
var tagsSchema = function tagsSchema() {
|
|
2662
|
-
return Joi.array().items(tagSchema()).min(0);
|
|
2663
|
-
};
|
|
2664
|
-
|
|
2665
|
-
var measureSchema = function measureSchema(supportedAggregates, attributeSchemaOptions) {
|
|
2666
|
-
var buildMeasureJoi = function buildMeasureJoi(fieldJoi, functionJoi) {
|
|
2667
|
-
return Joi.object({
|
|
2668
|
-
field: fieldJoi.required(),
|
|
2669
|
-
"function": functionJoi.required().description('Which if any, aggregate function should be applied to the field?')
|
|
2670
|
-
});
|
|
2671
|
-
};
|
|
2672
|
-
|
|
2673
|
-
// Return an enum using the restriction fields
|
|
2674
|
-
if (attributeSchemaOptions != null && attributeSchemaOptions.restrictFields) {
|
|
2675
|
-
return Joi.alternatives.apply(Joi, attributeSchemaOptions.restrictFields.filter(function (f) {
|
|
2676
|
-
return f.canBeMeasure;
|
|
2677
|
-
}).map(function (restrictedField) {
|
|
2678
|
-
var _Joi$string;
|
|
2679
|
-
var supportedFunctionsForField = listValidFunctionsForDataType(restrictedField, supportedAggregates);
|
|
2680
|
-
return buildMeasureJoi(Joi.string().valid(restrictedField.id).description(restrictedField.publicName + ", " + (restrictedField.description || '') + "."), (_Joi$string = Joi.string()).valid.apply(_Joi$string, supportedFunctionsForField.concat(['none'])));
|
|
2681
|
-
}));
|
|
2682
|
-
}
|
|
2683
|
-
return buildMeasureJoi(Joi.string().description('The ID of the field from the data set to reference.'), Joi.valid.apply(Joi, Object.keys(supportedAggregates).concat(['none'])));
|
|
2684
|
-
};
|
|
2685
|
-
var orderSchema = function orderSchema(queryEngineConfig) {
|
|
2686
|
-
var _Joi$string2;
|
|
2687
|
-
return Joi.object({
|
|
2688
|
-
field: Joi.string().required().description('The ID of the field from the data set to reference.'),
|
|
2689
|
-
direction: Joi.string().valid('asc', 'desc').required().description('In which direction should the results be ordered?'),
|
|
2690
|
-
"function": (_Joi$string2 = Joi.string()).valid.apply(_Joi$string2, Object.keys(queryEngineConfig.supportedAggregates).concat(Object.keys(queryEngineConfig.supportedTimeTruncFunctions), ['none'])).description('Which if any, function should be applied to the field?')
|
|
2691
|
-
});
|
|
2692
|
-
};
|
|
2693
|
-
var timeDimensionSchema = function timeDimensionSchema(supportedTimeTruncFunctions) {
|
|
2694
|
-
return Joi.object({
|
|
2695
|
-
field: Joi.string().required().description('The ID of the field from the data set to reference.'),
|
|
2696
|
-
truncate: Joi.valid.apply(Joi, Object.keys(supportedTimeTruncFunctions).concat(['none'])),
|
|
2697
|
-
bucketFill: Joi["boolean"]()
|
|
2698
|
-
});
|
|
2699
|
-
};
|
|
2700
|
-
var dimensionSchema = function dimensionSchema(supportedTimeTruncFunctions, attributeSchemaOptions) {
|
|
2701
|
-
var buildDimensionJoi = function buildDimensionJoi(fieldJoi, isDate) {
|
|
2702
|
-
return Joi.object({
|
|
2703
|
-
field: fieldJoi.required(),
|
|
2704
|
-
pivot: Joi.string().valid('x', 'y').optional(),
|
|
2705
|
-
"function": isDate ? Joi.valid.apply(Joi, Object.keys(supportedTimeTruncFunctions).concat(['none'])).required() : Joi.valid('none').required()
|
|
2706
|
-
});
|
|
2707
|
-
};
|
|
2708
|
-
|
|
2709
|
-
// Return an enum using the restriction fields
|
|
2710
|
-
if (attributeSchemaOptions != null && attributeSchemaOptions.restrictFields) {
|
|
2711
|
-
return Joi.array().items(Joi.alternatives.apply(Joi, attributeSchemaOptions.restrictFields.filter(function (f) {
|
|
2712
|
-
return f.canBeDimension;
|
|
2713
|
-
}).map(function (restrictedField) {
|
|
2714
|
-
return buildDimensionJoi(Joi.string().valid(restrictedField.id).description(restrictedField.publicName + ", " + (restrictedField.description || '') + "."), restrictedField.dataType === 'date_time');
|
|
2715
|
-
}))).description('Fields to group the data by');
|
|
2716
|
-
}
|
|
2717
|
-
return Joi.array().items(buildDimensionJoi(Joi.string().description('The ID of the field from the data set to reference.'), true)).description('Fields to group the data by');
|
|
2718
|
-
};
|
|
2719
|
-
var filterSchema = function filterSchema(queryEngineConfig) {
|
|
2720
|
-
var _Joi$string3, _Joi$string4;
|
|
2721
|
-
return Joi.object({
|
|
2722
|
-
field: Joi.string().required().description('The ID of the field from the data set to reference.'),
|
|
2723
|
-
op: (_Joi$string3 = Joi.string()).valid.apply(_Joi$string3, Object.keys(queryEngineConfig.supportedOperators)).required(),
|
|
2724
|
-
value: Joi.alternatives()["try"](joiDate, Joi.string().allow(null), Joi.number(), Joi["boolean"](), Joi.array().items(Joi.string(), Joi.number(), Joi.allow(null)), relativeSchema).required(),
|
|
2725
|
-
"function": (_Joi$string4 = Joi.string()).valid.apply(_Joi$string4, Object.keys(queryEngineConfig.supportedAggregates).concat(Object.keys(queryEngineConfig.supportedTimeTruncFunctions), ['none'])).description('Which function should be applied to the field?')
|
|
2726
|
-
});
|
|
2727
|
-
};
|
|
2728
|
-
var queryAttributesFilter = function queryAttributesFilter(queryEngineConfig) {
|
|
2729
|
-
return Joi.array().items(Joi.array().items(filterSchema(queryEngineConfig)));
|
|
2730
|
-
};
|
|
2731
|
-
var queryAttributesLimit = function queryAttributesLimit() {
|
|
2732
|
-
return Joi.number().description('Limit the number of results returned after the query has been ran.');
|
|
2733
|
-
};
|
|
2734
|
-
var baseAttributesSchema = function baseAttributesSchema(attributeSchemaOptions) {
|
|
2735
|
-
var _Joi$string5;
|
|
2736
|
-
var dataSetIdSchema = attributeSchemaOptions != null && attributeSchemaOptions.restrictDataSetIds ? (_Joi$string5 = Joi.string()).valid.apply(_Joi$string5, attributeSchemaOptions.restrictDataSetIds) : Joi.string();
|
|
2737
|
-
return {
|
|
2738
|
-
viewId: Joi.string().allow('').optional().description('__vizzly_hide_from_docs'),
|
|
2739
|
-
displayTitle: Joi.string().allow('').description('A title that explains what is being displayed.'),
|
|
2740
|
-
displaySubject: Joi.string().allow('').description('A chance to add a more detailed description of what is being shown.'),
|
|
2741
|
-
dataSetId: dataSetIdSchema.description('The ID of the data set that is being used by the view.'),
|
|
2742
|
-
protectedByOrganisation: Joi["boolean"]().optional().description('Has the view been created by your organisation, and therefore cannot be modified by your users?')
|
|
2743
|
-
};
|
|
2744
|
-
};
|
|
2745
|
-
var approxAxisLabelCountSchema = /*#__PURE__*/Joi.valid('auto', 2, 0).description('Determine how many axis labels should be shown on the axis');
|
|
2746
|
-
var querySchema = function querySchema(queryEngineConfig, attributeSchemaOptions) {
|
|
2747
|
-
return {
|
|
2748
|
-
measure: Joi.array().items(measureSchema(queryEngineConfig.supportedAggregates, attributeSchemaOptions)).required().description('A list of metrics that are to be shown. For example the `count` of a specific field in your data set.'),
|
|
2749
|
-
dimension: dimensionSchema(queryEngineConfig.supportedTimeTruncFunctions, attributeSchemaOptions).required(),
|
|
2750
|
-
order: Joi.array().items(orderSchema(queryEngineConfig)),
|
|
2751
|
-
limit: queryAttributesLimit(),
|
|
2752
|
-
offset: Joi.number().min(0).description('Paginate results by using this property with limit.')
|
|
2753
|
-
};
|
|
2754
|
-
};
|
|
2755
|
-
var timeDimensionQuerySchema = function timeDimensionQuerySchema(queryEngineConfig, attributeSchemaOptions) {
|
|
2756
|
-
return _extends({}, querySchema(queryEngineConfig, attributeSchemaOptions), {
|
|
2757
|
-
filter: Joi.array().items(Joi.array().items(filterSchema(queryEngineConfig))),
|
|
2758
|
-
timeDimension: Joi.alternatives(timeDimensionSchema(queryEngineConfig.supportedTimeTruncFunctions), Joi.valid(null)).required(),
|
|
2759
|
-
drilldown: Joi.alternatives(dimensionSchema(queryEngineConfig.supportedTimeTruncFunctions, attributeSchemaOptions).required(), Joi.string()),
|
|
2760
|
-
xAxisPrefix: Joi.string().allow('').description('Add a prefix to the X Axis'),
|
|
2761
|
-
yAxisPrefix: Joi.string().allow('').description('Add a prefix to the Y Axis'),
|
|
2762
|
-
xAxisPostfix: Joi.string().allow('').description('Add a postfix to the X Axis'),
|
|
2763
|
-
yAxisPostfix: Joi.string().allow('').description('Add a postfix to the Y Axis'),
|
|
2764
|
-
yAxisFormat: Joi.alternatives(Joi.string(), Joi.valid(null)).description('ID of the formatting function to apply to the Y Axis values'),
|
|
2765
|
-
xAxisFormat: Joi.alternatives(Joi.string(), Joi.valid(null)).description('ID of the formatting function to apply to the X Axis values'),
|
|
2766
|
-
approxYAxisLabelCount: approxAxisLabelCountSchema,
|
|
2767
|
-
approxXAxisLabelCount: approxAxisLabelCountSchema
|
|
2768
|
-
});
|
|
2769
|
-
};
|
|
2770
|
-
var lineCurveSchema = /*#__PURE__*/Joi.string().valid('natural', 'straight', 'step', 'stepBefore', 'stepAfter', 'dotted');
|
|
2771
|
-
var areaCurveSchema = /*#__PURE__*/Joi.string().valid('natural', 'straight', 'step');
|
|
2772
|
-
var protectedFieldsMeasure = function protectedFieldsMeasure(queryEngineConfig) {
|
|
2773
|
-
var _Joi$string6;
|
|
2774
|
-
return Joi.array().items(Joi.object({
|
|
2775
|
-
"function": (_Joi$string6 = Joi.string()).valid.apply(_Joi$string6, Object.keys(queryEngineConfig.supportedAggregates).concat(Object.keys(queryEngineConfig.supportedTimeTruncFunctions), ['none'])),
|
|
2776
|
-
field: Joi.string().required().description('The ID of the field from the data set to reference.')
|
|
2777
|
-
}));
|
|
2778
|
-
};
|
|
2779
|
-
var protectedFieldsDimension = function protectedFieldsDimension(queryEngineConfig) {
|
|
2780
|
-
var _Joi$string7;
|
|
2781
|
-
return Joi.array().items(Joi.object({
|
|
2782
|
-
"function": (_Joi$string7 = Joi.string()).valid.apply(_Joi$string7, Object.keys(queryEngineConfig.supportedAggregates).concat(Object.keys(queryEngineConfig.supportedTimeTruncFunctions), ['none'])),
|
|
2783
|
-
truncate: Joi.string(),
|
|
2784
|
-
field: Joi.string().required().description('The ID of the field from the data set to reference.'),
|
|
2785
|
-
bucketFill: Joi["boolean"]().optional(),
|
|
2786
|
-
pivot: Joi.string().valid('x', 'y').optional()
|
|
2787
|
-
}));
|
|
2788
|
-
};
|
|
2789
|
-
var parameterGroupSchema = function parameterGroupSchema(queryEngineConfig, attributeSchemaOptions) {
|
|
2790
|
-
return Joi.object().pattern(Joi.string(), Joi.alternatives()["try"](Joi.array().items(timeDimensionSchema(queryEngineConfig.supportedTimeTruncFunctions)).min(1), dimensionSchema(queryEngineConfig.supportedTimeTruncFunctions, attributeSchemaOptions))).unknown(true);
|
|
2791
|
-
};
|
|
2792
|
-
var parameterMeasureSchema = function parameterMeasureSchema(queryEngineConfig, attributeSchemaOptions) {
|
|
2793
|
-
return Joi.object().pattern(Joi.string(), Joi.array().items(measureSchema(queryEngineConfig.supportedAggregates, attributeSchemaOptions)).min(1)).unknown(true);
|
|
2794
|
-
};
|
|
2795
|
-
var parametersSchema = function parametersSchema(queryEngineConfig, attributeSchemaOptions) {
|
|
2796
|
-
return Joi.object({
|
|
2797
|
-
measure: parameterMeasureSchema(queryEngineConfig, attributeSchemaOptions),
|
|
2798
|
-
group: parameterGroupSchema(queryEngineConfig, attributeSchemaOptions)
|
|
2799
|
-
});
|
|
2800
|
-
};
|
|
2801
|
-
var goalLineValueSchema = /*#__PURE__*/Joi.alternatives()["try"]( /*#__PURE__*/Joi.number().required(), /*#__PURE__*/Joi.string().pattern(/^\{\{.*\}\}$/).required());
|
|
2802
|
-
var goalLineSchema = function goalLineSchema() {
|
|
2803
|
-
return Joi.object({
|
|
2804
|
-
color: Joi.string().required(),
|
|
2805
|
-
value: goalLineValueSchema,
|
|
2806
|
-
strokeWidth: Joi.number().required(),
|
|
2807
|
-
strokeStyle: Joi.string().valid('dashed', 'solid').required(),
|
|
2808
|
-
label: Joi["boolean"]().optional()
|
|
2809
|
-
});
|
|
2810
|
-
};
|
|
2811
|
-
var goalLinesSchema = function goalLinesSchema() {
|
|
2812
|
-
return Joi.array().items(goalLineSchema());
|
|
2813
|
-
};
|
|
2814
|
-
var headlineSchema = function headlineSchema() {
|
|
2815
|
-
return Joi.object({
|
|
2816
|
-
func: Joi.string().valid('mean', 'sum', 'current').allow(null).optional()
|
|
2817
|
-
});
|
|
2818
|
-
};
|
|
2819
|
-
var axisTitleSchema = function axisTitleSchema() {
|
|
2820
|
-
return Joi.object({
|
|
2821
|
-
x: Joi.string().allow(''),
|
|
2822
|
-
y: Joi.string().allow('')
|
|
2823
|
-
});
|
|
2824
|
-
};
|
|
2825
|
-
var sizingSchema = /*#__PURE__*/Joi.object().pattern( /*#__PURE__*/Joi.string(), /*#__PURE__*/Joi.object({
|
|
2826
|
-
width: /*#__PURE__*/Joi.number().min(0),
|
|
2827
|
-
height: /*#__PURE__*/Joi.number().min(0)
|
|
2828
|
-
}));
|
|
2829
|
-
var joiDate = /*#__PURE__*/Joi.custom(function (value, helpers) {
|
|
2830
|
-
if (Object.prototype.toString.call(value) === '[object Date]') {
|
|
2831
|
-
return value;
|
|
2832
|
-
}
|
|
2833
|
-
return helpers.error('any.invalid');
|
|
2834
|
-
}, 'Date object validation');
|
|
2835
|
-
|
|
2836
|
-
var fieldSchema = /*#__PURE__*/Joi.object({
|
|
2837
|
-
fieldId: /*#__PURE__*/Joi.string().required(),
|
|
2838
|
-
dataSetId: /*#__PURE__*/Joi.string().required()
|
|
2839
|
-
});
|
|
2840
|
-
var optionsFiltersSchema = function optionsFiltersSchema(queryEngineConfig) {
|
|
2841
|
-
return Joi.object().pattern(Joi.string(),
|
|
2842
|
-
// keys of the object
|
|
2843
|
-
Joi.array().items(filterSchema(queryEngineConfig)).optional());
|
|
2844
|
-
};
|
|
2845
|
-
var sharedAdditionalFilterSchema = function sharedAdditionalFilterSchema(queryEngineConfig) {
|
|
2846
|
-
return {
|
|
2847
|
-
title: Joi.string().allow(''),
|
|
2848
|
-
managedByConfiguration: Joi["boolean"]().optional(),
|
|
2849
|
-
requiresValue: Joi["boolean"]().optional(),
|
|
2850
|
-
optionsFilters: optionsFiltersSchema(queryEngineConfig).optional(),
|
|
2851
|
-
appliesToFields: Joi.array().items(fieldSchema).required(),
|
|
2852
|
-
optionsPulledFrom: Joi.array().items(fieldSchema).optional(),
|
|
2853
|
-
hidden: Joi["boolean"](),
|
|
2854
|
-
options: Joi.array().items(Joi.object({
|
|
2855
|
-
value: Joi.allow(Joi.number(), Joi.string()),
|
|
2856
|
-
label: Joi.string()
|
|
2857
|
-
})).optional()
|
|
2858
|
-
};
|
|
2859
|
-
};
|
|
2860
|
-
var selectFilterSchema = function selectFilterSchema(queryEngineConfig, shouldAlwaysHaveValue) {
|
|
2861
|
-
return Joi.object(_extends({}, sharedAdditionalFilterSchema(queryEngineConfig), {
|
|
2862
|
-
type: Joi.valid(SINGLE_SELECT_FILTER).required(),
|
|
2863
|
-
value: Joi.alternatives(Joi.string(), Joi.number(), Joi["boolean"](), Joi.valid.apply(Joi, shouldAlwaysHaveValue ? [] : [null]))
|
|
2864
|
-
}));
|
|
2865
|
-
};
|
|
2866
|
-
var multiSelectFilterSchema = function multiSelectFilterSchema(queryEngineConfig, shouldAlwaysHaveValue) {
|
|
2867
|
-
return Joi.object(_extends({}, sharedAdditionalFilterSchema(queryEngineConfig), {
|
|
2868
|
-
type: Joi.valid(MULTI_SELECT_FILTER).required(),
|
|
2869
|
-
value: Joi.alternatives(Joi.array().items(Joi.string(), Joi.number()).single(), Joi.valid.apply(Joi, shouldAlwaysHaveValue ? [] : [null]), Joi.array().items(Joi.array().items(filterSchema(queryEngineConfig))))
|
|
2870
|
-
}));
|
|
2871
|
-
};
|
|
2872
|
-
var advancedFilterSchema = function advancedFilterSchema(queryEngineConfig, shouldAlwaysHaveValue) {
|
|
2873
|
-
return Joi.object(_extends({}, sharedAdditionalFilterSchema(queryEngineConfig), {
|
|
2874
|
-
type: Joi.valid(ADVANCED_FILTER).required(),
|
|
2875
|
-
value: advancedFilterValueSchema(queryEngineConfig, shouldAlwaysHaveValue)
|
|
2876
|
-
}));
|
|
2877
|
-
};
|
|
2878
|
-
var advancedFilterValueSchema = function advancedFilterValueSchema(queryEngineConfig, shouldAlwaysHaveValue) {
|
|
2879
|
-
return Joi.alternatives(Joi.valid.apply(Joi, shouldAlwaysHaveValue ? [] : [null]), Joi.array().items(Joi.array().items(filterSchema(queryEngineConfig))));
|
|
2880
|
-
};
|
|
2881
|
-
var dateTimeFilterSchema = function dateTimeFilterSchema(queryEngineConfig, shouldAlwaysHaveValue, type) {
|
|
2882
|
-
return Joi.object(_extends({}, sharedAdditionalFilterSchema(queryEngineConfig), {
|
|
2883
|
-
type: Joi.valid(type).required(),
|
|
2884
|
-
inclusiveDate: Joi["boolean"]().optional(),
|
|
2885
|
-
allowTimeSelection: Joi["boolean"]().optional(),
|
|
2886
|
-
value: Joi.alternatives(Joi.valid.apply(Joi, shouldAlwaysHaveValue ? [] : [null]), Joi.object({
|
|
2887
|
-
type: Joi.valid('fixedRange'),
|
|
2888
|
-
before: Joi.alternatives(Joi.date()).required(),
|
|
2889
|
-
after: Joi.alternatives(Joi.date()).required()
|
|
2890
|
-
}), Joi.object({
|
|
2891
|
-
type: Joi.valid('relative'),
|
|
2892
|
-
value: Joi.string()
|
|
2893
|
-
}), Joi.object({
|
|
2894
|
-
type: Joi.valid('relativeRange'),
|
|
2895
|
-
filters: Joi.array()
|
|
2896
|
-
}))
|
|
2897
|
-
}));
|
|
2898
|
-
};
|
|
2899
|
-
var numberFilterSchema = function numberFilterSchema(queryEngineConfig, shouldAlwaysHaveValue) {
|
|
2900
|
-
return Joi.object(_extends({}, sharedAdditionalFilterSchema(queryEngineConfig), {
|
|
2901
|
-
type: Joi.valid(NUMERIC_FILTER).required(),
|
|
2902
|
-
value: Joi.alternatives(Joi.object({
|
|
2903
|
-
op: Joi.allow('=', '<', '>', '<=', '>='),
|
|
2904
|
-
value: Joi.number().allow(null, 0)
|
|
2905
|
-
}), Joi.array().items(Joi.array().items(filterSchema(queryEngineConfig))), Joi.valid.apply(Joi, shouldAlwaysHaveValue ? [] : [null]))
|
|
2906
|
-
}));
|
|
2907
|
-
};
|
|
2908
|
-
var additionalFilterSchema = function additionalFilterSchema(queryEngineConfig, shouldAlwaysHaveValue) {
|
|
2909
|
-
return Joi.alternatives().conditional('.type', {
|
|
2910
|
-
is: SINGLE_SELECT_FILTER,
|
|
2911
|
-
then: selectFilterSchema(queryEngineConfig, shouldAlwaysHaveValue)
|
|
2912
|
-
}).conditional('.type', {
|
|
2913
|
-
is: DATE_FILTER,
|
|
2914
|
-
then: dateTimeFilterSchema(queryEngineConfig, shouldAlwaysHaveValue, DATE_FILTER)
|
|
2915
|
-
}).conditional('.type', {
|
|
2916
|
-
is: DATE_AND_TIME_FILTER,
|
|
2917
|
-
then: dateTimeFilterSchema(queryEngineConfig, shouldAlwaysHaveValue, DATE_AND_TIME_FILTER)
|
|
2918
|
-
}).conditional('.type', {
|
|
2919
|
-
is: MULTI_SELECT_FILTER,
|
|
2920
|
-
then: multiSelectFilterSchema(queryEngineConfig, shouldAlwaysHaveValue)
|
|
2921
|
-
}).conditional('.type', {
|
|
2922
|
-
is: NUMERIC_FILTER,
|
|
2923
|
-
then: numberFilterSchema(queryEngineConfig, shouldAlwaysHaveValue)
|
|
2924
|
-
}).conditional('.type', {
|
|
2925
|
-
is: ADVANCED_FILTER,
|
|
2926
|
-
then: advancedFilterSchema(queryEngineConfig, shouldAlwaysHaveValue)
|
|
2927
|
-
});
|
|
2928
|
-
};
|
|
2929
|
-
function globalFilterSchema(queryEngineConfig) {
|
|
2930
|
-
return Joi.array().items(Joi.custom(function (value, helpers) {
|
|
2931
|
-
if (!queryEngineConfig) {
|
|
2932
|
-
return helpers.error('any.invalid');
|
|
2933
|
-
}
|
|
2934
|
-
var schema = additionalFilterSchema(queryEngineConfig, !!value.requiresValue);
|
|
2935
|
-
var _schema$validate = schema.validate(value),
|
|
2936
|
-
error = _schema$validate.error;
|
|
2937
|
-
if (error) {
|
|
2938
|
-
return helpers.error('any.invalid', {
|
|
2939
|
-
message: error.message
|
|
2940
|
-
});
|
|
2941
|
-
}
|
|
2942
|
-
return value;
|
|
2943
|
-
})).required();
|
|
2944
|
-
}
|
|
2945
|
-
|
|
2946
|
-
var Clause = /*#__PURE__*/function (Clause) {
|
|
2947
|
-
Clause["AND_WHERE"] = "andWhere";
|
|
2948
|
-
Clause["OR_WHERE"] = "orWhere";
|
|
2949
|
-
Clause["WHERE"] = "where";
|
|
2950
|
-
return Clause;
|
|
2951
|
-
}({});
|
|
2952
|
-
|
|
2953
|
-
// export type WhereClause = SqlAST.MultiWhereToken<any>;
|
|
2954
|
-
|
|
2955
|
-
var filterConfigToWhere = function filterConfigToWhere(dataSet, queryEngineConfig, params) {
|
|
2956
|
-
if (!params) return undefined;
|
|
2957
|
-
var filterConfig = params.filterConfig;
|
|
2958
|
-
if (!params || !filterConfig || (!filterConfig.globalFilters || filterConfig.globalFilters.length === 0) && (!filterConfig.localFilters || filterConfig.localFilters.length === 0) && (!filterConfig.advancedFilter || filterConfig.advancedFilter.length === 0 || filterConfig.advancedFilter.every(function (arr) {
|
|
2959
|
-
return arr.length === 0;
|
|
2960
|
-
}))) {
|
|
2961
|
-
return undefined;
|
|
2962
|
-
}
|
|
2963
|
-
var dash = buildAndWhere(dataSet, queryEngineConfig, params, filterConfig.globalFilters);
|
|
2964
|
-
var local = buildAndWhere(dataSet, queryEngineConfig, params, filterConfig.localFilters);
|
|
2965
|
-
var advancedFilters = buildFromFiltersArray(dataSet, queryEngineConfig, params, filterConfig.advancedFilter);
|
|
2966
|
-
var combinedAndWhere = [dash, local, advancedFilters].filter(Boolean).filter(function (whereClause) {
|
|
2967
|
-
return whereClause && whereClause.value.length > 0;
|
|
2968
|
-
});
|
|
2969
|
-
if (combinedAndWhere.length === 0) return undefined;
|
|
2970
|
-
return {
|
|
2971
|
-
type: Clause.AND_WHERE,
|
|
2972
|
-
value: combinedAndWhere
|
|
2973
|
-
};
|
|
2974
|
-
};
|
|
2975
|
-
var buildAndWhere = function buildAndWhere(dataSet, queryEngineConfig, params, additionalFilters) {
|
|
2976
|
-
if (!additionalFilters || additionalFilters.length === 0) return undefined;
|
|
2977
|
-
var whereClauses = [];
|
|
2978
|
-
additionalFilters.forEach(function (additionalFilter) {
|
|
2979
|
-
if (additionalFilter.type === DATE_AND_TIME_FILTER || additionalFilter.type === DATE_FILTER) {
|
|
2980
|
-
toRelativeQueryAttributesFilters(additionalFilter, dataSet).forEach(function (f) {
|
|
2981
|
-
whereClauses.push(buildWhereFromSingleFilter(dataSet, f, queryEngineConfig, params));
|
|
2982
|
-
});
|
|
2983
|
-
}
|
|
2984
|
-
if (Array.isArray(additionalFilter.value) && additionalFilter.value.length > 1 && isAdditionalFilter(additionalFilter.value)) {
|
|
2985
|
-
additionalFilter.appliesToFields.flatMap(function (field) {
|
|
2986
|
-
if (field.dataSetId != dataSet.id) return [];
|
|
2987
|
-
var convertedToWhere = buildFromFiltersArray(dataSet, queryEngineConfig, params, additionalFilter.value);
|
|
2988
|
-
if (convertedToWhere) {
|
|
2989
|
-
whereClauses.push(convertedToWhere);
|
|
2990
|
-
}
|
|
2991
|
-
return;
|
|
2992
|
-
});
|
|
2993
|
-
} else {
|
|
2994
|
-
toQueryAttributesFilter(dataSet, additionalFilter, params.timeRangeOptions).forEach(function (f) {
|
|
2995
|
-
whereClauses.push(buildWhereFromSingleFilter(dataSet, f, queryEngineConfig, params));
|
|
2996
|
-
});
|
|
2997
|
-
}
|
|
2998
|
-
});
|
|
2999
|
-
return {
|
|
3000
|
-
type: Clause.AND_WHERE,
|
|
3001
|
-
value: whereClauses
|
|
3002
|
-
};
|
|
3003
|
-
};
|
|
3004
|
-
var buildWhereFromSingleFilter = function buildWhereFromSingleFilter(dataSet, f, queryEngineConfig, params) {
|
|
3005
|
-
var field;
|
|
3006
|
-
if (f["function"] && !isSupportedTimeTruncFunction(queryEngineConfig.supportedTimeTruncFunctions, f["function"])) {
|
|
3007
|
-
throw "Query engine does not support the query function " + f["function"] + ".";
|
|
3008
|
-
}
|
|
3009
|
-
var dataSetField = findField(dataSet, f.field);
|
|
3010
|
-
if (isCustomField(dataSetField)) {
|
|
3011
|
-
var _f$function;
|
|
3012
|
-
field = toQueryMeasure({
|
|
3013
|
-
field: dataSetField.id,
|
|
3014
|
-
"function": (_f$function = f["function"]) != null ? _f$function : 'none'
|
|
3015
|
-
}, dataSetField, queryEngineConfig, dataSet, false, params);
|
|
3016
|
-
} else {
|
|
3017
|
-
var _decodedField$functio;
|
|
3018
|
-
var decodedField = decodeId(f.field, queryEngineConfig);
|
|
3019
|
-
field = {
|
|
3020
|
-
type: 'field',
|
|
3021
|
-
value: decodedField.field,
|
|
3022
|
-
"function": (_decodedField$functio = decodedField["function"]) != null ? _decodedField$functio : 'none'
|
|
3023
|
-
};
|
|
3024
|
-
}
|
|
3025
|
-
if ((f.op == 'array_contains' || f.op == 'array_does_not_contain') && Array.isArray(f.value)) {
|
|
3026
|
-
return arrayContainsFilters(f, dataSet, queryEngineConfig, params);
|
|
3027
|
-
}
|
|
3028
|
-
var value = useValue(f.value, params.variables);
|
|
3029
|
-
if (isRelativeDateDefined(f.value)) {
|
|
3030
|
-
value = calculateRelativeDate(f.value);
|
|
3031
|
-
}
|
|
3032
|
-
if (filterIsDate(f)) {
|
|
3033
|
-
value = getUTCDate(f.value);
|
|
3034
|
-
}
|
|
3035
|
-
return {
|
|
3036
|
-
type: Clause.WHERE,
|
|
3037
|
-
value: {
|
|
3038
|
-
op: f.op,
|
|
3039
|
-
value: value,
|
|
3040
|
-
field: field
|
|
3041
|
-
}
|
|
3042
|
-
};
|
|
3043
|
-
};
|
|
3044
|
-
var buildFromFiltersArray = function buildFromFiltersArray(dataSet, queryEngineConfig, params, filters) {
|
|
3045
|
-
if (!filters || filters.length === 0 || filters.every(function (arr) {
|
|
3046
|
-
return arr.length === 0;
|
|
3047
|
-
})) {
|
|
3048
|
-
return undefined;
|
|
3049
|
-
}
|
|
3050
|
-
if (filters.length === 1) return buildFromFilters(filters[0], dataSet, queryEngineConfig, params);
|
|
3051
|
-
return {
|
|
3052
|
-
type: Clause.OR_WHERE,
|
|
3053
|
-
value: filters.map(function (filter) {
|
|
3054
|
-
return buildFromFilters(filter, dataSet, queryEngineConfig, params);
|
|
3055
|
-
})
|
|
3056
|
-
};
|
|
3057
|
-
};
|
|
3058
|
-
var buildFromFilters = function buildFromFilters(filter, dataSet, queryEngineConfig, params) {
|
|
3059
|
-
return {
|
|
3060
|
-
type: Clause.AND_WHERE,
|
|
3061
|
-
value: filter.map(function (filter) {
|
|
3062
|
-
if ((filter.op == 'array_contains' || filter.op == 'array_does_not_contain') && Array.isArray(filter.value)) {
|
|
3063
|
-
return arrayContainsFilters(filter, dataSet, queryEngineConfig, params);
|
|
3064
|
-
}
|
|
3065
|
-
return buildWhereFromSingleFilter(dataSet, filter, queryEngineConfig, params);
|
|
3066
|
-
})
|
|
3067
|
-
};
|
|
3068
|
-
};
|
|
3069
|
-
var arrayContainsFilters = function arrayContainsFilters(filter, dataSet, queryEngineConfig, params) {
|
|
3070
|
-
return {
|
|
3071
|
-
type: Clause.AND_WHERE,
|
|
3072
|
-
value: [].concat(filter.value).map(function (value) {
|
|
3073
|
-
return buildWhereFromSingleFilter(dataSet, _extends({}, filter, {
|
|
3074
|
-
value: value
|
|
3075
|
-
}), queryEngineConfig, params);
|
|
3076
|
-
})
|
|
3077
|
-
};
|
|
3078
|
-
};
|
|
3079
|
-
|
|
3080
|
-
var addMeasure = function addMeasure(current, toAdd) {
|
|
3081
|
-
return [[].concat(current, [toAdd]), current.length];
|
|
3082
|
-
};
|
|
3083
|
-
var buildFromQueryAttributes = function buildFromQueryAttributes(dataSet, measureAttr, orderAttr, dimensionAttr, timeDimensionAttr, limitAttr, offsetAttr, queryEngineConfig, params, prebuiltFilters) {
|
|
3084
|
-
var measureDescription = [];
|
|
3085
|
-
var measure = [];
|
|
3086
|
-
var group = [];
|
|
3087
|
-
var order = [];
|
|
3088
|
-
var filters = buildFilters(dataSet, queryEngineConfig, params, prebuiltFilters);
|
|
3089
|
-
if (timeDimensionAttr) {
|
|
3090
|
-
// Add the measure for the time field.
|
|
3091
|
-
var addedAt = undefined;
|
|
3092
|
-
|
|
3093
|
-
// Stop unsupported time trunc functions being used.
|
|
3094
|
-
if (!isSupportedTimeTruncFunction(queryEngineConfig.supportedTimeTruncFunctions, timeDimensionAttr.truncate)) {
|
|
3095
|
-
throw "Query engine does not support the time trunc function " + timeDimensionAttr.truncate + ".";
|
|
3096
|
-
}
|
|
3097
|
-
var _addMeasure = addMeasure(measure, {
|
|
3098
|
-
type: 'field',
|
|
3099
|
-
value: timeDimensionAttr.field,
|
|
3100
|
-
"function": timeDimensionAttr.truncate
|
|
3101
|
-
});
|
|
3102
|
-
measure = _addMeasure[0];
|
|
3103
|
-
addedAt = _addMeasure[1];
|
|
3104
|
-
measureDescription = [].concat(measureDescription, [{
|
|
3105
|
-
functionId: timeDimensionAttr.truncate,
|
|
3106
|
-
field: findField(dataSet, timeDimensionAttr.field)
|
|
3107
|
-
}]);
|
|
3108
|
-
group = [].concat(group, [{
|
|
3109
|
-
index: addedAt
|
|
3110
|
-
}]);
|
|
3111
|
-
}
|
|
3112
|
-
dimensionAttr.forEach(function (dimension) {
|
|
3113
|
-
// Add the measure for the time field.
|
|
3114
|
-
var addedAt = undefined;
|
|
3115
|
-
var _addMeasure2 = addMeasure(measure, {
|
|
3116
|
-
type: 'field',
|
|
3117
|
-
value: dimension == null ? void 0 : dimension.field,
|
|
3118
|
-
"function": dimension["function"]
|
|
3119
|
-
});
|
|
3120
|
-
measure = _addMeasure2[0];
|
|
3121
|
-
addedAt = _addMeasure2[1];
|
|
3122
|
-
measureDescription = [].concat(measureDescription, [{
|
|
3123
|
-
functionId: dimension["function"],
|
|
3124
|
-
field: findField(dataSet, dimension.field)
|
|
3125
|
-
}]);
|
|
3126
|
-
group = [].concat(group, [{
|
|
3127
|
-
index: addedAt
|
|
3128
|
-
}]);
|
|
3129
|
-
});
|
|
3130
|
-
measureAttr.forEach(function (individualMeasure) {
|
|
3131
|
-
// Stop unsupported aggregate functions being used.
|
|
3132
|
-
if (!isSupportedAggregateFunction(queryEngineConfig.supportedAggregates, individualMeasure["function"])) {
|
|
3133
|
-
throw "Query engine does not support the query function " + individualMeasure["function"] + ".";
|
|
3134
|
-
}
|
|
3135
|
-
var _addMeasure3 = addMeasure(measure, {
|
|
3136
|
-
type: 'field',
|
|
3137
|
-
value: individualMeasure.field,
|
|
3138
|
-
"function": individualMeasure["function"]
|
|
3139
|
-
});
|
|
3140
|
-
measure = _addMeasure3[0];
|
|
3141
|
-
measureDescription = [].concat(measureDescription, [{
|
|
3142
|
-
functionId: individualMeasure["function"],
|
|
3143
|
-
field: findField(dataSet, individualMeasure.field)
|
|
3144
|
-
}]);
|
|
3145
|
-
});
|
|
3146
|
-
orderAttr.forEach(function (apiQueryOrderItem) {
|
|
3147
|
-
var index = measure.findIndex(function (individualMeasure) {
|
|
3148
|
-
if (individualMeasure.type == 'field') {
|
|
3149
|
-
var sameFunction = individualMeasure["function"] == apiQueryOrderItem["function"];
|
|
3150
|
-
// const isTimeFunc = Object.keys(queryEngineConfig.supportedTimeTruncFunctions).includes(
|
|
3151
|
-
// individualMeasure.function
|
|
3152
|
-
// );
|
|
3153
|
-
var sameField = individualMeasure.value == apiQueryOrderItem.field;
|
|
3154
|
-
return sameField && sameFunction;
|
|
3155
|
-
|
|
3156
|
-
// return found;
|
|
3157
|
-
}
|
|
3158
|
-
return false;
|
|
3159
|
-
});
|
|
3160
|
-
if (index >= 0) {
|
|
3161
|
-
order = [].concat(order, [{
|
|
3162
|
-
index: index,
|
|
3163
|
-
direction: apiQueryOrderItem.direction
|
|
3164
|
-
}]);
|
|
3165
|
-
}
|
|
3166
|
-
});
|
|
3167
|
-
measure = measure.map(function (measure) {
|
|
3168
|
-
if (measure.type == 'field' && typeof measure.value == 'string') {
|
|
3169
|
-
var dataSetField = findField(dataSet, measure.value);
|
|
3170
|
-
if (isCustomField(dataSetField)) {
|
|
3171
|
-
var customMeasure = toQueryMeasure({
|
|
3172
|
-
"function": measure["function"],
|
|
3173
|
-
field: measure.value
|
|
3174
|
-
}, dataSetField, queryEngineConfig, dataSet, hasDimensions({
|
|
3175
|
-
group: group
|
|
3176
|
-
}), params);
|
|
3177
|
-
return customMeasure;
|
|
3178
|
-
}
|
|
3179
|
-
}
|
|
3180
|
-
return measure;
|
|
3181
|
-
});
|
|
3182
|
-
return {
|
|
3183
|
-
query: {
|
|
3184
|
-
type: 'query',
|
|
3185
|
-
dataSetId: dataSet.id,
|
|
3186
|
-
measure: measure,
|
|
3187
|
-
group: group,
|
|
3188
|
-
// TODO: Fix this type
|
|
3189
|
-
filter: filters,
|
|
3190
|
-
order: order,
|
|
3191
|
-
limit: limitAttr,
|
|
3192
|
-
offset: offsetAttr
|
|
3193
|
-
},
|
|
3194
|
-
measureDescription: measureDescription
|
|
3195
|
-
};
|
|
3196
|
-
};
|
|
3197
|
-
var buildFilters = function buildFilters(dataSet, queryEngineConfig, params, prebuiltFilters) {
|
|
3198
|
-
if (prebuiltFilters && prebuiltFilters.length > 0) {
|
|
3199
|
-
var filter = [];
|
|
3200
|
-
prebuiltFilters.forEach(function (andFilters) {
|
|
3201
|
-
var newAndFilters = filterAttributeToQueryFilter([andFilters], queryEngineConfig, dataSet, params);
|
|
3202
|
-
filter = [].concat(filter, [newAndFilters[0]]);
|
|
3203
|
-
});
|
|
3204
|
-
return filter;
|
|
3205
|
-
}
|
|
3206
|
-
var whereClause = filterConfigToWhere(dataSet, queryEngineConfig, params);
|
|
3207
|
-
if (whereClause) return whereClause;
|
|
3208
|
-
return [];
|
|
3209
|
-
};
|
|
3210
|
-
|
|
3211
|
-
var build$a = buildFromQueryAttributes;
|
|
3212
|
-
var hasDimensions = function hasDimensions(query) {
|
|
3213
|
-
return query.group.length > 0;
|
|
3214
|
-
};
|
|
3215
|
-
var buildPreAggregatedPreparedQuery = function buildPreAggregatedPreparedQuery(query, dataSet) {
|
|
3216
|
-
return {
|
|
3217
|
-
query: query,
|
|
3218
|
-
resultFields: dataSet.fields.map(function (field) {
|
|
3219
|
-
return {
|
|
3220
|
-
id: field.id,
|
|
3221
|
-
publicName: field.publicName,
|
|
3222
|
-
dataType: field.dataType,
|
|
3223
|
-
fieldId: field.id,
|
|
3224
|
-
"function": 'none',
|
|
3225
|
-
outputDataType: field.dataType
|
|
3226
|
-
};
|
|
3227
|
-
})
|
|
3228
|
-
};
|
|
3229
|
-
};
|
|
3230
|
-
var buildUniqueArrayValuesPreparedQuery = function buildUniqueArrayValuesPreparedQuery(dataSetId, dataSetField, optionsFilters) {
|
|
3231
|
-
return {
|
|
3232
|
-
query: {
|
|
3233
|
-
type: 'preparedQuery',
|
|
3234
|
-
preparedQueryType: 'uniqueArrayValues',
|
|
3235
|
-
dataSetId: dataSetId,
|
|
3236
|
-
fieldId: dataSetField.id,
|
|
3237
|
-
filter: optionsFilters || []
|
|
3238
|
-
},
|
|
3239
|
-
resultFields: [{
|
|
3240
|
-
id: dataSetField.id,
|
|
3241
|
-
publicName: dataSetField.publicName,
|
|
3242
|
-
dataType: dataSetField.dataType,
|
|
3243
|
-
fieldId: dataSetField.id,
|
|
3244
|
-
"function": 'none',
|
|
3245
|
-
outputDataType: 'string'
|
|
3246
|
-
}]
|
|
3247
|
-
};
|
|
3248
|
-
};
|
|
3249
|
-
var buildFilterQuery = function buildFilterQuery(dataSet, fieldId, optionsFilters, optionsOrders) {
|
|
3250
|
-
var measure = [{
|
|
3251
|
-
field: fieldId,
|
|
3252
|
-
"function": 'count'
|
|
3253
|
-
}];
|
|
3254
|
-
var order = optionsOrders != null ? optionsOrders : [];
|
|
3255
|
-
var filter = optionsFilters ? [optionsFilters] : [];
|
|
3256
|
-
var dimension = [{
|
|
3257
|
-
field: fieldId,
|
|
3258
|
-
"function": 'none'
|
|
3259
|
-
}];
|
|
3260
|
-
var timeDimension = null;
|
|
3261
|
-
var limit = 5000;
|
|
3262
|
-
return {
|
|
3263
|
-
dataSetId: dataSet.id,
|
|
3264
|
-
measure: measure,
|
|
3265
|
-
order: order,
|
|
3266
|
-
filter: filter,
|
|
3267
|
-
dimension: dimension,
|
|
3268
|
-
timeDimension: timeDimension,
|
|
3269
|
-
limit: limit,
|
|
3270
|
-
offset: 0
|
|
3271
|
-
};
|
|
3272
|
-
};
|
|
3273
|
-
var supportsFeature = function supportsFeature(queryEngineConfig, feature) {
|
|
3274
|
-
return queryEngineConfig.supportedFeatures.includes(feature);
|
|
3275
|
-
};
|
|
3276
|
-
var toDataSetDashboardFilters = function toDataSetDashboardFilters(dataSets, additionalFilters, dateFilterOptions) {
|
|
3277
|
-
var dashboardFilters = {};
|
|
3278
|
-
dataSets.forEach(function (dataSet) {
|
|
3279
|
-
var filtered = additionalFilters.filter(function (filter) {
|
|
3280
|
-
return filter.appliesToFields.find(function (field) {
|
|
3281
|
-
return field.dataSetId === dataSet.id;
|
|
3282
|
-
});
|
|
3283
|
-
}).map(function (filter) {
|
|
3284
|
-
return toQueryAttributesFilter(dataSet, filter, dateFilterOptions);
|
|
3285
|
-
});
|
|
3286
|
-
dashboardFilters[dataSet.id] = filtered;
|
|
3287
|
-
});
|
|
3288
|
-
return dashboardFilters;
|
|
3289
|
-
};
|
|
3290
|
-
function addGlobalFiltersToQueries(queries, dashboardFilters) {
|
|
3291
|
-
var enhancedQueries = queries;
|
|
3292
|
-
if (dashboardFilters) {
|
|
3293
|
-
enhancedQueries.map(function (query) {
|
|
3294
|
-
var flattenedFilters = dashboardFilters[query.dataSetId].flat();
|
|
3295
|
-
if (flattenedFilters.length === 0) return;
|
|
3296
|
-
query.filter.push(flattenedFilters);
|
|
3297
|
-
return;
|
|
3298
|
-
});
|
|
3299
|
-
}
|
|
3300
|
-
return enhancedQueries;
|
|
3301
|
-
}
|
|
3302
|
-
|
|
3303
|
-
var FieldNotFoundInDataSet = /*#__PURE__*/function (_ValidationError) {
|
|
3304
|
-
function FieldNotFoundInDataSet(dataSet, missingFieldId) {
|
|
3305
|
-
var _this;
|
|
3306
|
-
_this = _ValidationError.call(this, "\n An expected field is missing from a dataSet.\n\n Missing '" + missingFieldId + "'. Got;\n " + JSON.stringify(dataSet) + "\n ") || this;
|
|
3307
|
-
_this.missingFieldId = void 0;
|
|
3308
|
-
_this.name = 'FieldNotFoundInDataSet';
|
|
3309
|
-
_this.missingFieldId = missingFieldId;
|
|
3310
|
-
return _this;
|
|
3311
|
-
}
|
|
3312
|
-
_inheritsLoose(FieldNotFoundInDataSet, _ValidationError);
|
|
3313
|
-
var _proto = FieldNotFoundInDataSet.prototype;
|
|
3314
|
-
_proto.getMissingFieldId = function getMissingFieldId() {
|
|
3315
|
-
return this.missingFieldId;
|
|
3316
|
-
};
|
|
3317
|
-
return FieldNotFoundInDataSet;
|
|
3318
|
-
}(ValidationError);
|
|
3319
|
-
|
|
3320
2634
|
var _doMerge = function doMerge(a, b) {
|
|
3321
2635
|
return mergeWith({}, a, b, function (objValue, srcValue) {
|
|
3322
2636
|
if (isArray(srcValue)) return srcValue;
|
|
@@ -3493,6 +2807,186 @@ var setAttributes = function setAttributes(attributes, partialAttributes, schema
|
|
|
3493
2807
|
return validAttributes;
|
|
3494
2808
|
};
|
|
3495
2809
|
|
|
2810
|
+
var tagSchema = function tagSchema() {
|
|
2811
|
+
return Joi.object({
|
|
2812
|
+
key: Joi.string().required()
|
|
2813
|
+
});
|
|
2814
|
+
};
|
|
2815
|
+
var tagsSchema = function tagsSchema() {
|
|
2816
|
+
return Joi.array().items(tagSchema()).min(0);
|
|
2817
|
+
};
|
|
2818
|
+
|
|
2819
|
+
var measureSchema = function measureSchema(supportedAggregates, attributeSchemaOptions) {
|
|
2820
|
+
var buildMeasureJoi = function buildMeasureJoi(fieldJoi, functionJoi) {
|
|
2821
|
+
return Joi.object({
|
|
2822
|
+
field: fieldJoi.required(),
|
|
2823
|
+
"function": functionJoi.required().description('Which if any, aggregate function should be applied to the field?')
|
|
2824
|
+
});
|
|
2825
|
+
};
|
|
2826
|
+
|
|
2827
|
+
// Return an enum using the restriction fields
|
|
2828
|
+
if (attributeSchemaOptions != null && attributeSchemaOptions.restrictFields) {
|
|
2829
|
+
return Joi.alternatives.apply(Joi, attributeSchemaOptions.restrictFields.filter(function (f) {
|
|
2830
|
+
return f.canBeMeasure;
|
|
2831
|
+
}).map(function (restrictedField) {
|
|
2832
|
+
var _Joi$string;
|
|
2833
|
+
var supportedFunctionsForField = listValidFunctionsForDataType(restrictedField, supportedAggregates);
|
|
2834
|
+
return buildMeasureJoi(Joi.string().valid(restrictedField.id).description(restrictedField.publicName + ", " + (restrictedField.description || '') + "."), (_Joi$string = Joi.string()).valid.apply(_Joi$string, supportedFunctionsForField.concat(['none'])));
|
|
2835
|
+
}));
|
|
2836
|
+
}
|
|
2837
|
+
return buildMeasureJoi(Joi.string().description('The ID of the field from the data set to reference.'), Joi.valid.apply(Joi, Object.keys(supportedAggregates).concat(['none'])));
|
|
2838
|
+
};
|
|
2839
|
+
var orderSchema = function orderSchema(queryEngineConfig) {
|
|
2840
|
+
var _Joi$string2;
|
|
2841
|
+
return Joi.object({
|
|
2842
|
+
field: Joi.string().required().description('The ID of the field from the data set to reference.'),
|
|
2843
|
+
direction: Joi.string().valid('asc', 'desc').required().description('In which direction should the results be ordered?'),
|
|
2844
|
+
"function": (_Joi$string2 = Joi.string()).valid.apply(_Joi$string2, Object.keys(queryEngineConfig.supportedAggregates).concat(Object.keys(queryEngineConfig.supportedTimeTruncFunctions), ['none'])).description('Which if any, function should be applied to the field?')
|
|
2845
|
+
});
|
|
2846
|
+
};
|
|
2847
|
+
var timeDimensionSchema = function timeDimensionSchema(supportedTimeTruncFunctions) {
|
|
2848
|
+
return Joi.object({
|
|
2849
|
+
field: Joi.string().required().description('The ID of the field from the data set to reference.'),
|
|
2850
|
+
truncate: Joi.valid.apply(Joi, Object.keys(supportedTimeTruncFunctions).concat(['none'])),
|
|
2851
|
+
bucketFill: Joi["boolean"]()
|
|
2852
|
+
});
|
|
2853
|
+
};
|
|
2854
|
+
var dimensionSchema = function dimensionSchema(supportedTimeTruncFunctions, attributeSchemaOptions) {
|
|
2855
|
+
var buildDimensionJoi = function buildDimensionJoi(fieldJoi, isDate) {
|
|
2856
|
+
return Joi.object({
|
|
2857
|
+
field: fieldJoi.required(),
|
|
2858
|
+
pivot: Joi.string().valid('x', 'y').optional(),
|
|
2859
|
+
"function": isDate ? Joi.valid.apply(Joi, Object.keys(supportedTimeTruncFunctions).concat(['none'])).required() : Joi.valid('none').required()
|
|
2860
|
+
});
|
|
2861
|
+
};
|
|
2862
|
+
|
|
2863
|
+
// Return an enum using the restriction fields
|
|
2864
|
+
if (attributeSchemaOptions != null && attributeSchemaOptions.restrictFields) {
|
|
2865
|
+
return Joi.array().items(Joi.alternatives.apply(Joi, attributeSchemaOptions.restrictFields.filter(function (f) {
|
|
2866
|
+
return f.canBeDimension;
|
|
2867
|
+
}).map(function (restrictedField) {
|
|
2868
|
+
return buildDimensionJoi(Joi.string().valid(restrictedField.id).description(restrictedField.publicName + ", " + (restrictedField.description || '') + "."), restrictedField.dataType === 'date_time');
|
|
2869
|
+
}))).description('Fields to group the data by');
|
|
2870
|
+
}
|
|
2871
|
+
return Joi.array().items(buildDimensionJoi(Joi.string().description('The ID of the field from the data set to reference.'), true)).description('Fields to group the data by');
|
|
2872
|
+
};
|
|
2873
|
+
var filterSchema = function filterSchema(queryEngineConfig) {
|
|
2874
|
+
var _Joi$string3, _Joi$string4;
|
|
2875
|
+
return Joi.object({
|
|
2876
|
+
field: Joi.string().required().description('The ID of the field from the data set to reference.'),
|
|
2877
|
+
op: (_Joi$string3 = Joi.string()).valid.apply(_Joi$string3, Object.keys(queryEngineConfig.supportedOperators)).required(),
|
|
2878
|
+
value: Joi.alternatives()["try"](joiDate, Joi.string().allow(null), Joi.number(), Joi["boolean"](), Joi.array().items(Joi.string(), Joi.number(), Joi.allow(null)), relativeSchema).required(),
|
|
2879
|
+
"function": (_Joi$string4 = Joi.string()).valid.apply(_Joi$string4, Object.keys(queryEngineConfig.supportedAggregates).concat(Object.keys(queryEngineConfig.supportedTimeTruncFunctions), ['none'])).description('Which function should be applied to the field?')
|
|
2880
|
+
});
|
|
2881
|
+
};
|
|
2882
|
+
var queryAttributesFilter = function queryAttributesFilter(queryEngineConfig) {
|
|
2883
|
+
return Joi.array().items(Joi.array().items(filterSchema(queryEngineConfig)));
|
|
2884
|
+
};
|
|
2885
|
+
var queryAttributesLimit = function queryAttributesLimit() {
|
|
2886
|
+
return Joi.number().description('Limit the number of results returned after the query has been ran.');
|
|
2887
|
+
};
|
|
2888
|
+
var baseAttributesSchema = function baseAttributesSchema(attributeSchemaOptions) {
|
|
2889
|
+
var _Joi$string5;
|
|
2890
|
+
var dataSetIdSchema = attributeSchemaOptions != null && attributeSchemaOptions.restrictDataSetIds ? (_Joi$string5 = Joi.string()).valid.apply(_Joi$string5, attributeSchemaOptions.restrictDataSetIds) : Joi.string();
|
|
2891
|
+
return {
|
|
2892
|
+
viewId: Joi.string().allow('').optional().description('__vizzly_hide_from_docs'),
|
|
2893
|
+
displayTitle: Joi.string().allow('').description('A title that explains what is being displayed.'),
|
|
2894
|
+
displaySubject: Joi.string().allow('').description('A chance to add a more detailed description of what is being shown.'),
|
|
2895
|
+
dataSetId: dataSetIdSchema.description('The ID of the data set that is being used by the view.'),
|
|
2896
|
+
protectedByOrganisation: Joi["boolean"]().optional().description('Has the view been created by your organisation, and therefore cannot be modified by your users?')
|
|
2897
|
+
};
|
|
2898
|
+
};
|
|
2899
|
+
var approxAxisLabelCountSchema = /*#__PURE__*/Joi.valid('auto', 2, 0).description('Determine how many axis labels should be shown on the axis');
|
|
2900
|
+
var querySchema = function querySchema(queryEngineConfig, attributeSchemaOptions) {
|
|
2901
|
+
return {
|
|
2902
|
+
measure: Joi.array().items(measureSchema(queryEngineConfig.supportedAggregates, attributeSchemaOptions)).required().description('A list of metrics that are to be shown. For example the `count` of a specific field in your data set.'),
|
|
2903
|
+
dimension: dimensionSchema(queryEngineConfig.supportedTimeTruncFunctions, attributeSchemaOptions).required(),
|
|
2904
|
+
order: Joi.array().items(orderSchema(queryEngineConfig)),
|
|
2905
|
+
limit: queryAttributesLimit(),
|
|
2906
|
+
offset: Joi.number().min(0).description('Paginate results by using this property with limit.')
|
|
2907
|
+
};
|
|
2908
|
+
};
|
|
2909
|
+
var timeDimensionQuerySchema = function timeDimensionQuerySchema(queryEngineConfig, attributeSchemaOptions) {
|
|
2910
|
+
return _extends({}, querySchema(queryEngineConfig, attributeSchemaOptions), {
|
|
2911
|
+
filter: Joi.array().items(Joi.array().items(filterSchema(queryEngineConfig))),
|
|
2912
|
+
timeDimension: Joi.alternatives(timeDimensionSchema(queryEngineConfig.supportedTimeTruncFunctions), Joi.valid(null)).required(),
|
|
2913
|
+
drilldown: Joi.alternatives(dimensionSchema(queryEngineConfig.supportedTimeTruncFunctions, attributeSchemaOptions).required(), Joi.string()),
|
|
2914
|
+
xAxisPrefix: Joi.string().allow('').description('Add a prefix to the X Axis'),
|
|
2915
|
+
yAxisPrefix: Joi.string().allow('').description('Add a prefix to the Y Axis'),
|
|
2916
|
+
xAxisPostfix: Joi.string().allow('').description('Add a postfix to the X Axis'),
|
|
2917
|
+
yAxisPostfix: Joi.string().allow('').description('Add a postfix to the Y Axis'),
|
|
2918
|
+
yAxisFormat: Joi.alternatives(Joi.string(), Joi.valid(null)).description('ID of the formatting function to apply to the Y Axis values'),
|
|
2919
|
+
xAxisFormat: Joi.alternatives(Joi.string(), Joi.valid(null)).description('ID of the formatting function to apply to the X Axis values'),
|
|
2920
|
+
approxYAxisLabelCount: approxAxisLabelCountSchema,
|
|
2921
|
+
approxXAxisLabelCount: approxAxisLabelCountSchema
|
|
2922
|
+
});
|
|
2923
|
+
};
|
|
2924
|
+
var lineCurveSchema = /*#__PURE__*/Joi.string().valid('natural', 'straight', 'step', 'stepBefore', 'stepAfter', 'dotted');
|
|
2925
|
+
var areaCurveSchema = /*#__PURE__*/Joi.string().valid('natural', 'straight', 'step');
|
|
2926
|
+
var protectedFieldsMeasure = function protectedFieldsMeasure(queryEngineConfig) {
|
|
2927
|
+
var _Joi$string6;
|
|
2928
|
+
return Joi.array().items(Joi.object({
|
|
2929
|
+
"function": (_Joi$string6 = Joi.string()).valid.apply(_Joi$string6, Object.keys(queryEngineConfig.supportedAggregates).concat(Object.keys(queryEngineConfig.supportedTimeTruncFunctions), ['none'])),
|
|
2930
|
+
field: Joi.string().required().description('The ID of the field from the data set to reference.')
|
|
2931
|
+
}));
|
|
2932
|
+
};
|
|
2933
|
+
var protectedFieldsDimension = function protectedFieldsDimension(queryEngineConfig) {
|
|
2934
|
+
var _Joi$string7;
|
|
2935
|
+
return Joi.array().items(Joi.object({
|
|
2936
|
+
"function": (_Joi$string7 = Joi.string()).valid.apply(_Joi$string7, Object.keys(queryEngineConfig.supportedAggregates).concat(Object.keys(queryEngineConfig.supportedTimeTruncFunctions), ['none'])),
|
|
2937
|
+
truncate: Joi.string(),
|
|
2938
|
+
field: Joi.string().required().description('The ID of the field from the data set to reference.'),
|
|
2939
|
+
bucketFill: Joi["boolean"]().optional(),
|
|
2940
|
+
pivot: Joi.string().valid('x', 'y').optional()
|
|
2941
|
+
}));
|
|
2942
|
+
};
|
|
2943
|
+
var parameterGroupSchema = function parameterGroupSchema(queryEngineConfig, attributeSchemaOptions) {
|
|
2944
|
+
return Joi.object().pattern(Joi.string(), Joi.alternatives()["try"](Joi.array().items(timeDimensionSchema(queryEngineConfig.supportedTimeTruncFunctions)).min(1), dimensionSchema(queryEngineConfig.supportedTimeTruncFunctions, attributeSchemaOptions))).unknown(true);
|
|
2945
|
+
};
|
|
2946
|
+
var parameterMeasureSchema = function parameterMeasureSchema(queryEngineConfig, attributeSchemaOptions) {
|
|
2947
|
+
return Joi.object().pattern(Joi.string(), Joi.array().items(measureSchema(queryEngineConfig.supportedAggregates, attributeSchemaOptions)).min(1)).unknown(true);
|
|
2948
|
+
};
|
|
2949
|
+
var parametersSchema = function parametersSchema(queryEngineConfig, attributeSchemaOptions) {
|
|
2950
|
+
return Joi.object({
|
|
2951
|
+
measure: parameterMeasureSchema(queryEngineConfig, attributeSchemaOptions),
|
|
2952
|
+
group: parameterGroupSchema(queryEngineConfig, attributeSchemaOptions)
|
|
2953
|
+
});
|
|
2954
|
+
};
|
|
2955
|
+
var goalLineValueSchema = /*#__PURE__*/Joi.alternatives()["try"]( /*#__PURE__*/Joi.number().required(), /*#__PURE__*/Joi.string().pattern(/^\{\{.*\}\}$/).required());
|
|
2956
|
+
var goalLineSchema = function goalLineSchema() {
|
|
2957
|
+
return Joi.object({
|
|
2958
|
+
color: Joi.string().required(),
|
|
2959
|
+
value: goalLineValueSchema,
|
|
2960
|
+
strokeWidth: Joi.number().required(),
|
|
2961
|
+
strokeStyle: Joi.string().valid('dashed', 'solid').required(),
|
|
2962
|
+
label: Joi["boolean"]().optional()
|
|
2963
|
+
});
|
|
2964
|
+
};
|
|
2965
|
+
var goalLinesSchema = function goalLinesSchema() {
|
|
2966
|
+
return Joi.array().items(goalLineSchema());
|
|
2967
|
+
};
|
|
2968
|
+
var headlineSchema = function headlineSchema() {
|
|
2969
|
+
return Joi.object({
|
|
2970
|
+
func: Joi.string().valid('mean', 'sum', 'current').allow(null).optional()
|
|
2971
|
+
});
|
|
2972
|
+
};
|
|
2973
|
+
var axisTitleSchema = function axisTitleSchema() {
|
|
2974
|
+
return Joi.object({
|
|
2975
|
+
x: Joi.string().allow(''),
|
|
2976
|
+
y: Joi.string().allow('')
|
|
2977
|
+
});
|
|
2978
|
+
};
|
|
2979
|
+
var sizingSchema = /*#__PURE__*/Joi.object().pattern( /*#__PURE__*/Joi.string(), /*#__PURE__*/Joi.object({
|
|
2980
|
+
width: /*#__PURE__*/Joi.number().min(0),
|
|
2981
|
+
height: /*#__PURE__*/Joi.number().min(0)
|
|
2982
|
+
}));
|
|
2983
|
+
var joiDate = /*#__PURE__*/Joi.custom(function (value, helpers) {
|
|
2984
|
+
if (Object.prototype.toString.call(value) === '[object Date]') {
|
|
2985
|
+
return value;
|
|
2986
|
+
}
|
|
2987
|
+
return helpers.error('any.invalid');
|
|
2988
|
+
}, 'Date object validation');
|
|
2989
|
+
|
|
3496
2990
|
var conditionalFormattingRuleSchema = function conditionalFormattingRuleSchema(queryEngineConfig) {
|
|
3497
2991
|
return Joi.object({
|
|
3498
2992
|
filters: Joi.array().items(Joi.array().items(filterSchema(queryEngineConfig)).required().max(1)).required().max(1),
|
|
@@ -14879,7 +14373,7 @@ var Code = function Code(_ref12) {
|
|
|
14879
14373
|
}));
|
|
14880
14374
|
};
|
|
14881
14375
|
|
|
14882
|
-
var supportsFeature
|
|
14376
|
+
var supportsFeature = function supportsFeature(queryEngineConfig, feature) {
|
|
14883
14377
|
return [].concat(queryEngineConfig.supportedFeatures).includes(feature);
|
|
14884
14378
|
};
|
|
14885
14379
|
|
|
@@ -14959,7 +14453,7 @@ var END_USER_DEFAULT_FEATURE_TOGGLES = {
|
|
|
14959
14453
|
showSavingIndicator: true,
|
|
14960
14454
|
disablePersistingGlobalFiltersLocally: false
|
|
14961
14455
|
};
|
|
14962
|
-
var build$
|
|
14456
|
+
var build$a = function build(partialFeatureToggles, queryEngineConfig, mode, scope) {
|
|
14963
14457
|
var featureToggles = {};
|
|
14964
14458
|
featureToggles = _extends({}, END_USER_DEFAULT_FEATURE_TOGGLES, featureToggles, partialFeatureToggles);
|
|
14965
14459
|
if (mode == 'admin') {
|
|
@@ -14983,22 +14477,22 @@ var build$b = function build(partialFeatureToggles, queryEngineConfig, mode, sco
|
|
|
14983
14477
|
featureToggles.showSavingIndicator = false;
|
|
14984
14478
|
featureToggles.disablePersistingGlobalFiltersLocally = (_featureToggles$disab = featureToggles.disablePersistingGlobalFiltersLocally) != null ? _featureToggles$disab : false;
|
|
14985
14479
|
}
|
|
14986
|
-
if (!supportsFeature
|
|
14480
|
+
if (!supportsFeature(queryEngineConfig, 'simpleMaths')) {
|
|
14987
14481
|
featureToggles.allowSimpleMathsCustomField = false;
|
|
14988
14482
|
}
|
|
14989
|
-
if (!supportsFeature
|
|
14483
|
+
if (!supportsFeature(queryEngineConfig, 'aggregateMaths')) {
|
|
14990
14484
|
featureToggles.allowAggregateMathsCustomField = false;
|
|
14991
14485
|
}
|
|
14992
|
-
if (!supportsFeature
|
|
14486
|
+
if (!supportsFeature(queryEngineConfig, 'subquery')) {
|
|
14993
14487
|
featureToggles.allowPercentagesCustomField = false;
|
|
14994
14488
|
}
|
|
14995
|
-
if (!supportsFeature
|
|
14489
|
+
if (!supportsFeature(queryEngineConfig, 'switchField')) {
|
|
14996
14490
|
featureToggles.allowRulesCustomField = false;
|
|
14997
14491
|
}
|
|
14998
|
-
if (!supportsFeature
|
|
14492
|
+
if (!supportsFeature(queryEngineConfig, 'roundedNumbers')) {
|
|
14999
14493
|
featureToggles.allowRoundedNumberCustomField = false;
|
|
15000
14494
|
}
|
|
15001
|
-
if (!supportsFeature
|
|
14495
|
+
if (!supportsFeature(queryEngineConfig, 'dateMaths')) {
|
|
15002
14496
|
featureToggles.allowDateCalculationsCustomField = false;
|
|
15003
14497
|
}
|
|
15004
14498
|
if (featureToggles.forceMobile) {
|
|
@@ -15053,6 +14547,155 @@ var removeField$3 = function removeField(component, fieldId) {
|
|
|
15053
14547
|
return newComponent;
|
|
15054
14548
|
};
|
|
15055
14549
|
|
|
14550
|
+
var groupFilters = function groupFilters(dataSets) {
|
|
14551
|
+
var groups = {};
|
|
14552
|
+
dataSets.forEach(function (dataSet) {
|
|
14553
|
+
if (dataSet && dataSet.fields) {
|
|
14554
|
+
dataSet.fields.forEach(function (dataSetField) {
|
|
14555
|
+
(dataSetField.dashboardRequiredFilterGroups || []).forEach(function (filterGroup) {
|
|
14556
|
+
var key = filterGroup.publicName + " - " + dataSetField.dataType;
|
|
14557
|
+
groups[key] = [].concat(groups[key] || [], [{
|
|
14558
|
+
publicName: filterGroup.publicName,
|
|
14559
|
+
dataSetField: dataSetField,
|
|
14560
|
+
dataSetId: dataSet.id
|
|
14561
|
+
}]);
|
|
14562
|
+
});
|
|
14563
|
+
});
|
|
14564
|
+
} else {
|
|
14565
|
+
logError('DataSet is undefined or does not have fields', dataSet);
|
|
14566
|
+
}
|
|
14567
|
+
});
|
|
14568
|
+
return Object.values(groups);
|
|
14569
|
+
};
|
|
14570
|
+
var fromDashboardRequiredFilterGroups = function fromDashboardRequiredFilterGroups(dataSets) {
|
|
14571
|
+
var groupedFilters = groupFilters(dataSets);
|
|
14572
|
+
return groupedFilters.map(function (group) {
|
|
14573
|
+
return {
|
|
14574
|
+
type: group[0].dataSetField.dataType == 'date_time' ? DATE_FILTER : SINGLE_SELECT_FILTER,
|
|
14575
|
+
managedByConfiguration: true,
|
|
14576
|
+
requiresValue: true,
|
|
14577
|
+
title: group[0].publicName,
|
|
14578
|
+
appliesToFields: group.map(function (g) {
|
|
14579
|
+
return {
|
|
14580
|
+
dataSetId: g.dataSetId,
|
|
14581
|
+
fieldId: g.dataSetField.id
|
|
14582
|
+
};
|
|
14583
|
+
}),
|
|
14584
|
+
value: null
|
|
14585
|
+
};
|
|
14586
|
+
});
|
|
14587
|
+
};
|
|
14588
|
+
|
|
14589
|
+
var fieldSchema = /*#__PURE__*/Joi.object({
|
|
14590
|
+
fieldId: /*#__PURE__*/Joi.string().required(),
|
|
14591
|
+
dataSetId: /*#__PURE__*/Joi.string().required()
|
|
14592
|
+
});
|
|
14593
|
+
var optionsFiltersSchema = function optionsFiltersSchema(queryEngineConfig) {
|
|
14594
|
+
return Joi.object().pattern(Joi.string(),
|
|
14595
|
+
// keys of the object
|
|
14596
|
+
Joi.array().items(filterSchema(queryEngineConfig)).optional());
|
|
14597
|
+
};
|
|
14598
|
+
var sharedAdditionalFilterSchema = function sharedAdditionalFilterSchema(queryEngineConfig) {
|
|
14599
|
+
return {
|
|
14600
|
+
title: Joi.string().allow(''),
|
|
14601
|
+
managedByConfiguration: Joi["boolean"]().optional(),
|
|
14602
|
+
requiresValue: Joi["boolean"]().optional(),
|
|
14603
|
+
optionsFilters: optionsFiltersSchema(queryEngineConfig).optional(),
|
|
14604
|
+
appliesToFields: Joi.array().items(fieldSchema).required(),
|
|
14605
|
+
optionsPulledFrom: Joi.array().items(fieldSchema).optional(),
|
|
14606
|
+
hidden: Joi["boolean"](),
|
|
14607
|
+
options: Joi.array().items(Joi.object({
|
|
14608
|
+
value: Joi.allow(Joi.number(), Joi.string()),
|
|
14609
|
+
label: Joi.string()
|
|
14610
|
+
})).optional()
|
|
14611
|
+
};
|
|
14612
|
+
};
|
|
14613
|
+
var selectFilterSchema = function selectFilterSchema(queryEngineConfig, shouldAlwaysHaveValue) {
|
|
14614
|
+
return Joi.object(_extends({}, sharedAdditionalFilterSchema(queryEngineConfig), {
|
|
14615
|
+
type: Joi.valid(SINGLE_SELECT_FILTER).required(),
|
|
14616
|
+
value: Joi.alternatives(Joi.string(), Joi.number(), Joi["boolean"](), Joi.valid.apply(Joi, shouldAlwaysHaveValue ? [] : [null]))
|
|
14617
|
+
}));
|
|
14618
|
+
};
|
|
14619
|
+
var multiSelectFilterSchema = function multiSelectFilterSchema(queryEngineConfig, shouldAlwaysHaveValue) {
|
|
14620
|
+
return Joi.object(_extends({}, sharedAdditionalFilterSchema(queryEngineConfig), {
|
|
14621
|
+
type: Joi.valid(MULTI_SELECT_FILTER).required(),
|
|
14622
|
+
value: Joi.alternatives(Joi.array().items(Joi.string(), Joi.number()).single(), Joi.valid.apply(Joi, shouldAlwaysHaveValue ? [] : [null]), Joi.array().items(Joi.array().items(filterSchema(queryEngineConfig))))
|
|
14623
|
+
}));
|
|
14624
|
+
};
|
|
14625
|
+
var advancedFilterSchema = function advancedFilterSchema(queryEngineConfig, shouldAlwaysHaveValue) {
|
|
14626
|
+
return Joi.object(_extends({}, sharedAdditionalFilterSchema(queryEngineConfig), {
|
|
14627
|
+
type: Joi.valid(ADVANCED_FILTER).required(),
|
|
14628
|
+
value: advancedFilterValueSchema(queryEngineConfig, shouldAlwaysHaveValue)
|
|
14629
|
+
}));
|
|
14630
|
+
};
|
|
14631
|
+
var advancedFilterValueSchema = function advancedFilterValueSchema(queryEngineConfig, shouldAlwaysHaveValue) {
|
|
14632
|
+
return Joi.alternatives(Joi.valid.apply(Joi, shouldAlwaysHaveValue ? [] : [null]), Joi.array().items(Joi.array().items(filterSchema(queryEngineConfig))));
|
|
14633
|
+
};
|
|
14634
|
+
var dateTimeFilterSchema = function dateTimeFilterSchema(queryEngineConfig, shouldAlwaysHaveValue, type) {
|
|
14635
|
+
return Joi.object(_extends({}, sharedAdditionalFilterSchema(queryEngineConfig), {
|
|
14636
|
+
type: Joi.valid(type).required(),
|
|
14637
|
+
inclusiveDate: Joi["boolean"]().optional(),
|
|
14638
|
+
allowTimeSelection: Joi["boolean"]().optional(),
|
|
14639
|
+
value: Joi.alternatives(Joi.valid.apply(Joi, shouldAlwaysHaveValue ? [] : [null]), Joi.object({
|
|
14640
|
+
type: Joi.valid('fixedRange'),
|
|
14641
|
+
before: Joi.alternatives(Joi.date()).required(),
|
|
14642
|
+
after: Joi.alternatives(Joi.date()).required()
|
|
14643
|
+
}), Joi.object({
|
|
14644
|
+
type: Joi.valid('relative'),
|
|
14645
|
+
value: Joi.string()
|
|
14646
|
+
}), Joi.object({
|
|
14647
|
+
type: Joi.valid('relativeRange'),
|
|
14648
|
+
filters: Joi.array()
|
|
14649
|
+
}))
|
|
14650
|
+
}));
|
|
14651
|
+
};
|
|
14652
|
+
var numberFilterSchema = function numberFilterSchema(queryEngineConfig, shouldAlwaysHaveValue) {
|
|
14653
|
+
return Joi.object(_extends({}, sharedAdditionalFilterSchema(queryEngineConfig), {
|
|
14654
|
+
type: Joi.valid(NUMERIC_FILTER).required(),
|
|
14655
|
+
value: Joi.alternatives(Joi.object({
|
|
14656
|
+
op: Joi.allow('=', '<', '>', '<=', '>='),
|
|
14657
|
+
value: Joi.number().allow(null, 0)
|
|
14658
|
+
}), Joi.array().items(Joi.array().items(filterSchema(queryEngineConfig))), Joi.valid.apply(Joi, shouldAlwaysHaveValue ? [] : [null]))
|
|
14659
|
+
}));
|
|
14660
|
+
};
|
|
14661
|
+
var additionalFilterSchema = function additionalFilterSchema(queryEngineConfig, shouldAlwaysHaveValue) {
|
|
14662
|
+
return Joi.alternatives().conditional('.type', {
|
|
14663
|
+
is: SINGLE_SELECT_FILTER,
|
|
14664
|
+
then: selectFilterSchema(queryEngineConfig, shouldAlwaysHaveValue)
|
|
14665
|
+
}).conditional('.type', {
|
|
14666
|
+
is: DATE_FILTER,
|
|
14667
|
+
then: dateTimeFilterSchema(queryEngineConfig, shouldAlwaysHaveValue, DATE_FILTER)
|
|
14668
|
+
}).conditional('.type', {
|
|
14669
|
+
is: DATE_AND_TIME_FILTER,
|
|
14670
|
+
then: dateTimeFilterSchema(queryEngineConfig, shouldAlwaysHaveValue, DATE_AND_TIME_FILTER)
|
|
14671
|
+
}).conditional('.type', {
|
|
14672
|
+
is: MULTI_SELECT_FILTER,
|
|
14673
|
+
then: multiSelectFilterSchema(queryEngineConfig, shouldAlwaysHaveValue)
|
|
14674
|
+
}).conditional('.type', {
|
|
14675
|
+
is: NUMERIC_FILTER,
|
|
14676
|
+
then: numberFilterSchema(queryEngineConfig, shouldAlwaysHaveValue)
|
|
14677
|
+
}).conditional('.type', {
|
|
14678
|
+
is: ADVANCED_FILTER,
|
|
14679
|
+
then: advancedFilterSchema(queryEngineConfig, shouldAlwaysHaveValue)
|
|
14680
|
+
});
|
|
14681
|
+
};
|
|
14682
|
+
function globalFilterSchema(queryEngineConfig) {
|
|
14683
|
+
return Joi.array().items(Joi.custom(function (value, helpers) {
|
|
14684
|
+
if (!queryEngineConfig) {
|
|
14685
|
+
return helpers.error('any.invalid');
|
|
14686
|
+
}
|
|
14687
|
+
var schema = additionalFilterSchema(queryEngineConfig, !!value.requiresValue);
|
|
14688
|
+
var _schema$validate = schema.validate(value),
|
|
14689
|
+
error = _schema$validate.error;
|
|
14690
|
+
if (error) {
|
|
14691
|
+
return helpers.error('any.invalid', {
|
|
14692
|
+
message: error.message
|
|
14693
|
+
});
|
|
14694
|
+
}
|
|
14695
|
+
return value;
|
|
14696
|
+
})).required();
|
|
14697
|
+
}
|
|
14698
|
+
|
|
15056
14699
|
var init$a = function init(displayTitle) {
|
|
15057
14700
|
return {
|
|
15058
14701
|
displayTitle: displayTitle,
|
|
@@ -15540,7 +15183,7 @@ var defaultDateFilterOptions = function defaultDateFilterOptions() {
|
|
|
15540
15183
|
}
|
|
15541
15184
|
return defaultDateFilterOptions;
|
|
15542
15185
|
};
|
|
15543
|
-
var build$
|
|
15186
|
+
var build$b = function build(textOverride, overrides) {
|
|
15544
15187
|
var timeRangeMapping = defaultTimeRangeMapping(textOverride);
|
|
15545
15188
|
var orderedKeys = Object.keys(DEFAULT_DATETIME_FILTER_OPTIONS).map(function (key) {
|
|
15546
15189
|
return key in timeRangeMapping ? "_vizzly_" + key : key;
|
|
@@ -15874,7 +15517,7 @@ var init$b = function init(overrides, includeComponentTypes, excludeComponentTyp
|
|
|
15874
15517
|
return _extends({}, defaultFormatMapping, overrides.defaultFormats ? overrides.defaultFormats() : {});
|
|
15875
15518
|
},
|
|
15876
15519
|
onEditorUpdate: overrides.onEditorUpdate ? overrides.onEditorUpdate : base.onEditorUpdate,
|
|
15877
|
-
dateFilterOptions: build$
|
|
15520
|
+
dateFilterOptions: build$b(textOverride, overrides.dateFilterOptions),
|
|
15878
15521
|
onSave: overrides.onSave ? overrides.onSave : base.onSave,
|
|
15879
15522
|
onScheduledReportChange: overrides.onScheduledReportChange || base.onScheduledReportChange,
|
|
15880
15523
|
dashboardFilters: overrides.dashboardFilters ? overrides.dashboardFilters : base.dashboardFilters,
|
|
@@ -15928,7 +15571,7 @@ function useSubscription(callback, idOverride, deps) {
|
|
|
15928
15571
|
var useFeatureTogglesSetup = function useFeatureTogglesSetup(mode, overrideFeatureToggles, queryEngineConfig, scope, id) {
|
|
15929
15572
|
var base$1 = base;
|
|
15930
15573
|
var buildInitialFeatureToggles = function () {
|
|
15931
|
-
var updatedFeatureToggles = build$
|
|
15574
|
+
var updatedFeatureToggles = build$a(_.merge({}, base$1.featureToggles, overrideFeatureToggles), queryEngineConfig != null ? queryEngineConfig : base$1.queryEngineConfig, mode || base$1.mode, scope || base$1.scope);
|
|
15932
15575
|
return updatedFeatureToggles;
|
|
15933
15576
|
}();
|
|
15934
15577
|
var _useState = useState(buildInitialFeatureToggles),
|
|
@@ -26272,6 +25915,334 @@ var filterStyles = /*#__PURE__*/Object.assign(function () {
|
|
|
26272
25915
|
complete: complete
|
|
26273
25916
|
});
|
|
26274
25917
|
|
|
25918
|
+
var Clause = /*#__PURE__*/function (Clause) {
|
|
25919
|
+
Clause["AND_WHERE"] = "andWhere";
|
|
25920
|
+
Clause["OR_WHERE"] = "orWhere";
|
|
25921
|
+
Clause["WHERE"] = "where";
|
|
25922
|
+
return Clause;
|
|
25923
|
+
}({});
|
|
25924
|
+
|
|
25925
|
+
// export type WhereClause = SqlAST.MultiWhereToken<any>;
|
|
25926
|
+
|
|
25927
|
+
var filterConfigToWhere = function filterConfigToWhere(dataSet, queryEngineConfig, params) {
|
|
25928
|
+
if (!params) return undefined;
|
|
25929
|
+
var filterConfig = params.filterConfig;
|
|
25930
|
+
if (!params || !filterConfig || (!filterConfig.globalFilters || filterConfig.globalFilters.length === 0) && (!filterConfig.localFilters || filterConfig.localFilters.length === 0) && (!filterConfig.advancedFilter || filterConfig.advancedFilter.length === 0 || filterConfig.advancedFilter.every(function (arr) {
|
|
25931
|
+
return arr.length === 0;
|
|
25932
|
+
}))) {
|
|
25933
|
+
return undefined;
|
|
25934
|
+
}
|
|
25935
|
+
var dash = buildAndWhere(dataSet, queryEngineConfig, params, filterConfig.globalFilters);
|
|
25936
|
+
var local = buildAndWhere(dataSet, queryEngineConfig, params, filterConfig.localFilters);
|
|
25937
|
+
var advancedFilters = buildFromFiltersArray(dataSet, queryEngineConfig, params, filterConfig.advancedFilter);
|
|
25938
|
+
var combinedAndWhere = [dash, local, advancedFilters].filter(Boolean).filter(function (whereClause) {
|
|
25939
|
+
return whereClause && whereClause.value.length > 0;
|
|
25940
|
+
});
|
|
25941
|
+
if (combinedAndWhere.length === 0) return undefined;
|
|
25942
|
+
return {
|
|
25943
|
+
type: Clause.AND_WHERE,
|
|
25944
|
+
value: combinedAndWhere
|
|
25945
|
+
};
|
|
25946
|
+
};
|
|
25947
|
+
var buildAndWhere = function buildAndWhere(dataSet, queryEngineConfig, params, additionalFilters) {
|
|
25948
|
+
if (!additionalFilters || additionalFilters.length === 0) return undefined;
|
|
25949
|
+
var whereClauses = [];
|
|
25950
|
+
additionalFilters.forEach(function (additionalFilter) {
|
|
25951
|
+
if (additionalFilter.type === DATE_AND_TIME_FILTER || additionalFilter.type === DATE_FILTER) {
|
|
25952
|
+
toRelativeQueryAttributesFilters(additionalFilter, dataSet).forEach(function (f) {
|
|
25953
|
+
whereClauses.push(buildWhereFromSingleFilter(dataSet, f, queryEngineConfig, params));
|
|
25954
|
+
});
|
|
25955
|
+
}
|
|
25956
|
+
if (Array.isArray(additionalFilter.value) && additionalFilter.value.length > 1 && isAdditionalFilter(additionalFilter.value)) {
|
|
25957
|
+
additionalFilter.appliesToFields.flatMap(function (field) {
|
|
25958
|
+
if (field.dataSetId != dataSet.id) return [];
|
|
25959
|
+
var convertedToWhere = buildFromFiltersArray(dataSet, queryEngineConfig, params, additionalFilter.value);
|
|
25960
|
+
if (convertedToWhere) {
|
|
25961
|
+
whereClauses.push(convertedToWhere);
|
|
25962
|
+
}
|
|
25963
|
+
return;
|
|
25964
|
+
});
|
|
25965
|
+
} else {
|
|
25966
|
+
toQueryAttributesFilter(dataSet, additionalFilter, params.timeRangeOptions).forEach(function (f) {
|
|
25967
|
+
whereClauses.push(buildWhereFromSingleFilter(dataSet, f, queryEngineConfig, params));
|
|
25968
|
+
});
|
|
25969
|
+
}
|
|
25970
|
+
});
|
|
25971
|
+
return {
|
|
25972
|
+
type: Clause.AND_WHERE,
|
|
25973
|
+
value: whereClauses
|
|
25974
|
+
};
|
|
25975
|
+
};
|
|
25976
|
+
var buildWhereFromSingleFilter = function buildWhereFromSingleFilter(dataSet, f, queryEngineConfig, params) {
|
|
25977
|
+
var field;
|
|
25978
|
+
if (f["function"] && !isSupportedTimeTruncFunction(queryEngineConfig.supportedTimeTruncFunctions, f["function"])) {
|
|
25979
|
+
throw "Query engine does not support the query function " + f["function"] + ".";
|
|
25980
|
+
}
|
|
25981
|
+
var dataSetField = findField(dataSet, f.field);
|
|
25982
|
+
if (isCustomField(dataSetField)) {
|
|
25983
|
+
var _f$function;
|
|
25984
|
+
field = toQueryMeasure({
|
|
25985
|
+
field: dataSetField.id,
|
|
25986
|
+
"function": (_f$function = f["function"]) != null ? _f$function : 'none'
|
|
25987
|
+
}, dataSetField, queryEngineConfig, dataSet, false, params);
|
|
25988
|
+
} else {
|
|
25989
|
+
var _decodedField$functio;
|
|
25990
|
+
var decodedField = decodeId(f.field, queryEngineConfig);
|
|
25991
|
+
field = {
|
|
25992
|
+
type: 'field',
|
|
25993
|
+
value: decodedField.field,
|
|
25994
|
+
"function": (_decodedField$functio = decodedField["function"]) != null ? _decodedField$functio : 'none'
|
|
25995
|
+
};
|
|
25996
|
+
}
|
|
25997
|
+
if ((f.op == 'array_contains' || f.op == 'array_does_not_contain') && Array.isArray(f.value)) {
|
|
25998
|
+
return arrayContainsFilters(f, dataSet, queryEngineConfig, params);
|
|
25999
|
+
}
|
|
26000
|
+
var value = useValue(f.value, params.variables);
|
|
26001
|
+
if (isRelativeDateDefined(f.value)) {
|
|
26002
|
+
value = calculateRelativeDate(f.value);
|
|
26003
|
+
}
|
|
26004
|
+
if (filterIsDate(f)) {
|
|
26005
|
+
value = getUTCDate(f.value);
|
|
26006
|
+
}
|
|
26007
|
+
return {
|
|
26008
|
+
type: Clause.WHERE,
|
|
26009
|
+
value: {
|
|
26010
|
+
op: f.op,
|
|
26011
|
+
value: value,
|
|
26012
|
+
field: field
|
|
26013
|
+
}
|
|
26014
|
+
};
|
|
26015
|
+
};
|
|
26016
|
+
var buildFromFiltersArray = function buildFromFiltersArray(dataSet, queryEngineConfig, params, filters) {
|
|
26017
|
+
if (!filters || filters.length === 0 || filters.every(function (arr) {
|
|
26018
|
+
return arr.length === 0;
|
|
26019
|
+
})) {
|
|
26020
|
+
return undefined;
|
|
26021
|
+
}
|
|
26022
|
+
if (filters.length === 1) return buildFromFilters(filters[0], dataSet, queryEngineConfig, params);
|
|
26023
|
+
return {
|
|
26024
|
+
type: Clause.OR_WHERE,
|
|
26025
|
+
value: filters.map(function (filter) {
|
|
26026
|
+
return buildFromFilters(filter, dataSet, queryEngineConfig, params);
|
|
26027
|
+
})
|
|
26028
|
+
};
|
|
26029
|
+
};
|
|
26030
|
+
var buildFromFilters = function buildFromFilters(filter, dataSet, queryEngineConfig, params) {
|
|
26031
|
+
return {
|
|
26032
|
+
type: Clause.AND_WHERE,
|
|
26033
|
+
value: filter.map(function (filter) {
|
|
26034
|
+
if ((filter.op == 'array_contains' || filter.op == 'array_does_not_contain') && Array.isArray(filter.value)) {
|
|
26035
|
+
return arrayContainsFilters(filter, dataSet, queryEngineConfig, params);
|
|
26036
|
+
}
|
|
26037
|
+
return buildWhereFromSingleFilter(dataSet, filter, queryEngineConfig, params);
|
|
26038
|
+
})
|
|
26039
|
+
};
|
|
26040
|
+
};
|
|
26041
|
+
var arrayContainsFilters = function arrayContainsFilters(filter, dataSet, queryEngineConfig, params) {
|
|
26042
|
+
return {
|
|
26043
|
+
type: Clause.AND_WHERE,
|
|
26044
|
+
value: [].concat(filter.value).map(function (value) {
|
|
26045
|
+
return buildWhereFromSingleFilter(dataSet, _extends({}, filter, {
|
|
26046
|
+
value: value
|
|
26047
|
+
}), queryEngineConfig, params);
|
|
26048
|
+
})
|
|
26049
|
+
};
|
|
26050
|
+
};
|
|
26051
|
+
|
|
26052
|
+
var addMeasure = function addMeasure(current, toAdd) {
|
|
26053
|
+
return [[].concat(current, [toAdd]), current.length];
|
|
26054
|
+
};
|
|
26055
|
+
var buildFromQueryAttributes = function buildFromQueryAttributes(dataSet, measureAttr, orderAttr, dimensionAttr, timeDimensionAttr, limitAttr, offsetAttr, queryEngineConfig, params, prebuiltFilters) {
|
|
26056
|
+
var measureDescription = [];
|
|
26057
|
+
var measure = [];
|
|
26058
|
+
var group = [];
|
|
26059
|
+
var order = [];
|
|
26060
|
+
var filters = buildFilters(dataSet, queryEngineConfig, params, prebuiltFilters);
|
|
26061
|
+
if (timeDimensionAttr) {
|
|
26062
|
+
// Add the measure for the time field.
|
|
26063
|
+
var addedAt = undefined;
|
|
26064
|
+
|
|
26065
|
+
// Stop unsupported time trunc functions being used.
|
|
26066
|
+
if (!isSupportedTimeTruncFunction(queryEngineConfig.supportedTimeTruncFunctions, timeDimensionAttr.truncate)) {
|
|
26067
|
+
throw "Query engine does not support the time trunc function " + timeDimensionAttr.truncate + ".";
|
|
26068
|
+
}
|
|
26069
|
+
var _addMeasure = addMeasure(measure, {
|
|
26070
|
+
type: 'field',
|
|
26071
|
+
value: timeDimensionAttr.field,
|
|
26072
|
+
"function": timeDimensionAttr.truncate
|
|
26073
|
+
});
|
|
26074
|
+
measure = _addMeasure[0];
|
|
26075
|
+
addedAt = _addMeasure[1];
|
|
26076
|
+
measureDescription = [].concat(measureDescription, [{
|
|
26077
|
+
functionId: timeDimensionAttr.truncate,
|
|
26078
|
+
field: findField(dataSet, timeDimensionAttr.field)
|
|
26079
|
+
}]);
|
|
26080
|
+
group = [].concat(group, [{
|
|
26081
|
+
index: addedAt
|
|
26082
|
+
}]);
|
|
26083
|
+
}
|
|
26084
|
+
dimensionAttr.forEach(function (dimension) {
|
|
26085
|
+
// Add the measure for the time field.
|
|
26086
|
+
var addedAt = undefined;
|
|
26087
|
+
var _addMeasure2 = addMeasure(measure, {
|
|
26088
|
+
type: 'field',
|
|
26089
|
+
value: dimension == null ? void 0 : dimension.field,
|
|
26090
|
+
"function": dimension["function"]
|
|
26091
|
+
});
|
|
26092
|
+
measure = _addMeasure2[0];
|
|
26093
|
+
addedAt = _addMeasure2[1];
|
|
26094
|
+
measureDescription = [].concat(measureDescription, [{
|
|
26095
|
+
functionId: dimension["function"],
|
|
26096
|
+
field: findField(dataSet, dimension.field)
|
|
26097
|
+
}]);
|
|
26098
|
+
group = [].concat(group, [{
|
|
26099
|
+
index: addedAt
|
|
26100
|
+
}]);
|
|
26101
|
+
});
|
|
26102
|
+
measureAttr.forEach(function (individualMeasure) {
|
|
26103
|
+
// Stop unsupported aggregate functions being used.
|
|
26104
|
+
if (!isSupportedAggregateFunction(queryEngineConfig.supportedAggregates, individualMeasure["function"])) {
|
|
26105
|
+
throw "Query engine does not support the query function " + individualMeasure["function"] + ".";
|
|
26106
|
+
}
|
|
26107
|
+
var _addMeasure3 = addMeasure(measure, {
|
|
26108
|
+
type: 'field',
|
|
26109
|
+
value: individualMeasure.field,
|
|
26110
|
+
"function": individualMeasure["function"]
|
|
26111
|
+
});
|
|
26112
|
+
measure = _addMeasure3[0];
|
|
26113
|
+
measureDescription = [].concat(measureDescription, [{
|
|
26114
|
+
functionId: individualMeasure["function"],
|
|
26115
|
+
field: findField(dataSet, individualMeasure.field)
|
|
26116
|
+
}]);
|
|
26117
|
+
});
|
|
26118
|
+
orderAttr.forEach(function (apiQueryOrderItem) {
|
|
26119
|
+
var index = measure.findIndex(function (individualMeasure) {
|
|
26120
|
+
if (individualMeasure.type == 'field') {
|
|
26121
|
+
var sameFunction = individualMeasure["function"] == apiQueryOrderItem["function"];
|
|
26122
|
+
// const isTimeFunc = Object.keys(queryEngineConfig.supportedTimeTruncFunctions).includes(
|
|
26123
|
+
// individualMeasure.function
|
|
26124
|
+
// );
|
|
26125
|
+
var sameField = individualMeasure.value == apiQueryOrderItem.field;
|
|
26126
|
+
return sameField && sameFunction;
|
|
26127
|
+
|
|
26128
|
+
// return found;
|
|
26129
|
+
}
|
|
26130
|
+
return false;
|
|
26131
|
+
});
|
|
26132
|
+
if (index >= 0) {
|
|
26133
|
+
order = [].concat(order, [{
|
|
26134
|
+
index: index,
|
|
26135
|
+
direction: apiQueryOrderItem.direction
|
|
26136
|
+
}]);
|
|
26137
|
+
}
|
|
26138
|
+
});
|
|
26139
|
+
measure = measure.map(function (measure) {
|
|
26140
|
+
if (measure.type == 'field' && typeof measure.value == 'string') {
|
|
26141
|
+
var dataSetField = findField(dataSet, measure.value);
|
|
26142
|
+
if (isCustomField(dataSetField)) {
|
|
26143
|
+
var customMeasure = toQueryMeasure({
|
|
26144
|
+
"function": measure["function"],
|
|
26145
|
+
field: measure.value
|
|
26146
|
+
}, dataSetField, queryEngineConfig, dataSet, hasDimensions({
|
|
26147
|
+
group: group
|
|
26148
|
+
}), params);
|
|
26149
|
+
return customMeasure;
|
|
26150
|
+
}
|
|
26151
|
+
}
|
|
26152
|
+
return measure;
|
|
26153
|
+
});
|
|
26154
|
+
return {
|
|
26155
|
+
query: {
|
|
26156
|
+
type: 'query',
|
|
26157
|
+
dataSetId: dataSet.id,
|
|
26158
|
+
measure: measure,
|
|
26159
|
+
group: group,
|
|
26160
|
+
// TODO: Fix this type
|
|
26161
|
+
filter: filters,
|
|
26162
|
+
order: order,
|
|
26163
|
+
limit: limitAttr,
|
|
26164
|
+
offset: offsetAttr
|
|
26165
|
+
},
|
|
26166
|
+
measureDescription: measureDescription
|
|
26167
|
+
};
|
|
26168
|
+
};
|
|
26169
|
+
var buildFilters = function buildFilters(dataSet, queryEngineConfig, params, prebuiltFilters) {
|
|
26170
|
+
if (prebuiltFilters && prebuiltFilters.length > 0) {
|
|
26171
|
+
var filter = [];
|
|
26172
|
+
prebuiltFilters.forEach(function (andFilters) {
|
|
26173
|
+
var newAndFilters = filterAttributeToQueryFilter([andFilters], queryEngineConfig, dataSet, params);
|
|
26174
|
+
filter = [].concat(filter, [newAndFilters[0]]);
|
|
26175
|
+
});
|
|
26176
|
+
return filter;
|
|
26177
|
+
}
|
|
26178
|
+
var whereClause = filterConfigToWhere(dataSet, queryEngineConfig, params);
|
|
26179
|
+
if (whereClause) return whereClause;
|
|
26180
|
+
return [];
|
|
26181
|
+
};
|
|
26182
|
+
|
|
26183
|
+
var build$c = buildFromQueryAttributes;
|
|
26184
|
+
var hasDimensions = function hasDimensions(query) {
|
|
26185
|
+
return query.group.length > 0;
|
|
26186
|
+
};
|
|
26187
|
+
var buildPreAggregatedPreparedQuery = function buildPreAggregatedPreparedQuery(query, dataSet) {
|
|
26188
|
+
return {
|
|
26189
|
+
query: query,
|
|
26190
|
+
resultFields: dataSet.fields.map(function (field) {
|
|
26191
|
+
return {
|
|
26192
|
+
id: field.id,
|
|
26193
|
+
publicName: field.publicName,
|
|
26194
|
+
dataType: field.dataType,
|
|
26195
|
+
fieldId: field.id,
|
|
26196
|
+
"function": 'none',
|
|
26197
|
+
outputDataType: field.dataType
|
|
26198
|
+
};
|
|
26199
|
+
})
|
|
26200
|
+
};
|
|
26201
|
+
};
|
|
26202
|
+
var buildUniqueArrayValuesPreparedQuery = function buildUniqueArrayValuesPreparedQuery(dataSetId, dataSetField, optionsFilters) {
|
|
26203
|
+
return {
|
|
26204
|
+
query: {
|
|
26205
|
+
type: 'preparedQuery',
|
|
26206
|
+
preparedQueryType: 'uniqueArrayValues',
|
|
26207
|
+
dataSetId: dataSetId,
|
|
26208
|
+
fieldId: dataSetField.id,
|
|
26209
|
+
filter: optionsFilters || []
|
|
26210
|
+
},
|
|
26211
|
+
resultFields: [{
|
|
26212
|
+
id: dataSetField.id,
|
|
26213
|
+
publicName: dataSetField.publicName,
|
|
26214
|
+
dataType: dataSetField.dataType,
|
|
26215
|
+
fieldId: dataSetField.id,
|
|
26216
|
+
"function": 'none',
|
|
26217
|
+
outputDataType: 'string'
|
|
26218
|
+
}]
|
|
26219
|
+
};
|
|
26220
|
+
};
|
|
26221
|
+
var buildFilterQuery = function buildFilterQuery(dataSet, fieldId, optionsFilters, optionsOrders) {
|
|
26222
|
+
var measure = [{
|
|
26223
|
+
field: fieldId,
|
|
26224
|
+
"function": 'count'
|
|
26225
|
+
}];
|
|
26226
|
+
var order = optionsOrders != null ? optionsOrders : [];
|
|
26227
|
+
var filter = optionsFilters ? [optionsFilters] : [];
|
|
26228
|
+
var dimension = [{
|
|
26229
|
+
field: fieldId,
|
|
26230
|
+
"function": 'none'
|
|
26231
|
+
}];
|
|
26232
|
+
var timeDimension = null;
|
|
26233
|
+
var limit = 5000;
|
|
26234
|
+
return {
|
|
26235
|
+
dataSetId: dataSet.id,
|
|
26236
|
+
measure: measure,
|
|
26237
|
+
order: order,
|
|
26238
|
+
filter: filter,
|
|
26239
|
+
dimension: dimension,
|
|
26240
|
+
timeDimension: timeDimension,
|
|
26241
|
+
limit: limit,
|
|
26242
|
+
offset: 0
|
|
26243
|
+
};
|
|
26244
|
+
};
|
|
26245
|
+
|
|
26275
26246
|
/** Returns a key to be used in an useEffect dependency, that changes if there's any change to a field in a data set. */
|
|
26276
26247
|
var watchDataSetFieldChanges = function watchDataSetFieldChanges(dataSet, queryable) {
|
|
26277
26248
|
if ('dataSetId' in queryable) {
|
|
@@ -26376,12 +26347,12 @@ var useVariables = function useVariables(variables, dashboardId) {
|
|
|
26376
26347
|
subscriptionChanges = _useState2[0],
|
|
26377
26348
|
setSubscriptionChanges = _useState2[1];
|
|
26378
26349
|
useEffect(function () {
|
|
26379
|
-
var staticVariables = build$
|
|
26350
|
+
var staticVariables = build$1(variables);
|
|
26380
26351
|
setVariablesState(staticVariables);
|
|
26381
26352
|
}, [JSON.stringify(variables)]);
|
|
26382
26353
|
useSubscription(function (data) {
|
|
26383
26354
|
if (data.variables) {
|
|
26384
|
-
var staticVariables = build$
|
|
26355
|
+
var staticVariables = build$1(variables);
|
|
26385
26356
|
var updatedVariables = _extends({}, staticVariables, data.variables);
|
|
26386
26357
|
logDebug('Updated variables', updatedVariables);
|
|
26387
26358
|
setSubscriptionChanges(data.variables);
|
|
@@ -34825,8 +34796,6 @@ var showLegend = function showLegend(legend, verbose) {
|
|
|
34825
34796
|
return false;
|
|
34826
34797
|
};
|
|
34827
34798
|
|
|
34828
|
-
// import { hasMeasure } from '../../../shared-logic/src/Query';
|
|
34829
|
-
|
|
34830
34799
|
var EMPTY_METRICS = 'The Data settings are missing a Metric. Select from the list of Metrics to display the Chart.';
|
|
34831
34800
|
var EMPTY_PARAMETER = 'The Data settings are missing a parameter. Select from the list of parameters to display the Chart.';
|
|
34832
34801
|
function noMetricMessage(query) {
|
|
@@ -41599,7 +41568,7 @@ var AdminTools = function AdminTools(props) {
|
|
|
41599
41568
|
onOpenConfigManagerUi = _useDashboardBehaviou.onOpenConfigManagerUi,
|
|
41600
41569
|
disableToolbar = _useDashboardBehaviou.disableToolbar;
|
|
41601
41570
|
var saveableDashboard = toSaveableDefinition(dashboard);
|
|
41602
|
-
var supportsConfigManagerUi = supportsFeature
|
|
41571
|
+
var supportsConfigManagerUi = supportsFeature(queryEngineConfig, 'configManagerUi') && onOpenConfigManagerUi;
|
|
41603
41572
|
useEffect(function () {
|
|
41604
41573
|
var abortController = new AbortController();
|
|
41605
41574
|
var trySave = /*#__PURE__*/function () {
|
|
@@ -47122,8 +47091,7 @@ var CustomView = function CustomView(_ref) {
|
|
|
47122
47091
|
var component = _ref.component;
|
|
47123
47092
|
var attributes = component.attributes;
|
|
47124
47093
|
var _useDashboardBehaviou = useDashboardBehaviourContext(),
|
|
47125
|
-
customViews = _useDashboardBehaviou.customViews
|
|
47126
|
-
dateFilterOptions = _useDashboardBehaviou.dateFilterOptions;
|
|
47094
|
+
customViews = _useDashboardBehaviou.customViews;
|
|
47127
47095
|
var _useDashboardContext = useDashboardContext(),
|
|
47128
47096
|
dashboard = _useDashboardContext.dashboard;
|
|
47129
47097
|
var FoundComponent = null;
|
|
@@ -47136,7 +47104,9 @@ var CustomView = function CustomView(_ref) {
|
|
|
47136
47104
|
if (!FoundComponent) return null;
|
|
47137
47105
|
var result = FoundComponent.Component({
|
|
47138
47106
|
attributes: attributes,
|
|
47139
|
-
|
|
47107
|
+
filterConfig: {
|
|
47108
|
+
globalFilters: dashboard.globalFilters
|
|
47109
|
+
}
|
|
47140
47110
|
});
|
|
47141
47111
|
if (typeof result === 'string') {
|
|
47142
47112
|
return jsx("div", {
|
|
@@ -60073,12 +60043,13 @@ var StaticCustomView = function StaticCustomView(_ref) {
|
|
|
60073
60043
|
component = _ref.component;
|
|
60074
60044
|
var _useDashboardContext = useDashboardContext(),
|
|
60075
60045
|
dashboard = _useDashboardContext.dashboard;
|
|
60076
|
-
var _useDashboardBehaviou = useDashboardBehaviourContext()
|
|
60077
|
-
dateFilterOptions = _useDashboardBehaviou.dateFilterOptions;
|
|
60046
|
+
var _useDashboardBehaviou = useDashboardBehaviourContext();
|
|
60078
60047
|
var renderComponent = function renderComponent() {
|
|
60079
60048
|
var result = customView.Component({
|
|
60080
60049
|
attributes: component.attributes,
|
|
60081
|
-
|
|
60050
|
+
filterConfig: {
|
|
60051
|
+
globalFilters: dashboard.globalFilters
|
|
60052
|
+
}
|
|
60082
60053
|
});
|
|
60083
60054
|
if (typeof result === 'string') {
|
|
60084
60055
|
return jsx("div", {
|
|
@@ -71818,7 +71789,7 @@ function getOptionsOrders(dataSetField) {
|
|
|
71818
71789
|
}
|
|
71819
71790
|
|
|
71820
71791
|
var commonToQueries = function commonToQueries(attributes, dataSet, queryEngineConfig, params) {
|
|
71821
|
-
var _Query$build = build$
|
|
71792
|
+
var _Query$build = build$c(dataSet, attributes.measure, attributes.order, attributes.dimension,
|
|
71822
71793
|
// @ts-ignore
|
|
71823
71794
|
attributes.timeDimension || null, attributes.limit, attributes.offset, queryEngineConfig, params),
|
|
71824
71795
|
query = _Query$build.query,
|
|
@@ -71843,8 +71814,8 @@ var toQueries$6 = commonToQueries;
|
|
|
71843
71814
|
var toQueries$7 = commonToQueries;
|
|
71844
71815
|
|
|
71845
71816
|
var buildMainQueries = function buildMainQueries(attributes, dataSet, queryEngineConfig, params) {
|
|
71846
|
-
var line = build$
|
|
71847
|
-
var bar = build$
|
|
71817
|
+
var line = build$c(dataSet, attributes.lineMeasure, attributes.order, attributes.lineDimension, attributes.timeDimension, attributes.limit, attributes.offset, queryEngineConfig, params);
|
|
71818
|
+
var bar = build$c(dataSet, attributes.barMeasure, attributes.order, attributes.barDimension, attributes.timeDimension, attributes.limit, attributes.offset, queryEngineConfig, params);
|
|
71848
71819
|
return {
|
|
71849
71820
|
bar: bar,
|
|
71850
71821
|
line: line
|
|
@@ -71871,8 +71842,8 @@ var toQueries$b = commonToQueries;
|
|
|
71871
71842
|
var toQueries$c = commonToQueries;
|
|
71872
71843
|
|
|
71873
71844
|
var buildMainQueries$1 = function buildMainQueries(attributes, dataSet, queryEngineConfig, params) {
|
|
71874
|
-
var line = build$
|
|
71875
|
-
var bar = build$
|
|
71845
|
+
var line = build$c(dataSet, attributes.lineMeasure, attributes.order, attributes.lineDimension, attributes.timeDimension, attributes.limit, attributes.offset, queryEngineConfig, params);
|
|
71846
|
+
var bar = build$c(dataSet, attributes.barMeasure, attributes.order, attributes.barDimension, attributes.timeDimension, attributes.limit, attributes.offset, queryEngineConfig, params);
|
|
71876
71847
|
return {
|
|
71877
71848
|
bar: bar,
|
|
71878
71849
|
line: line
|
|
@@ -71891,7 +71862,7 @@ var toQueries$d = function toQueries(attributes, dataSet, queryEngineConfig, par
|
|
|
71891
71862
|
};
|
|
71892
71863
|
|
|
71893
71864
|
var buildMainQuery = function buildMainQuery(attributes, dataSet, queryEngineConfig, params) {
|
|
71894
|
-
var _Query$build = build$
|
|
71865
|
+
var _Query$build = build$c(dataSet, attributes.measure, [], [], null, 1, attributes.offset, queryEngineConfig, params),
|
|
71895
71866
|
query = _Query$build.query,
|
|
71896
71867
|
measureDescription = _Query$build.measureDescription;
|
|
71897
71868
|
|
|
@@ -71919,7 +71890,7 @@ var buildMainQuery = function buildMainQuery(attributes, dataSet, queryEngineCon
|
|
|
71919
71890
|
};
|
|
71920
71891
|
var buildDeltaQuery = function buildDeltaQuery(dataSet, attributes, queryEngineConfig, params) {
|
|
71921
71892
|
if (!attributes.deltaTimeDimension) return null;
|
|
71922
|
-
return build$
|
|
71893
|
+
return build$c(dataSet, attributes.measure, [{
|
|
71923
71894
|
field: attributes.deltaTimeDimension.field,
|
|
71924
71895
|
direction: 'asc',
|
|
71925
71896
|
"function": attributes.deltaTimeDimension.truncate
|
|
@@ -71951,7 +71922,7 @@ var toQueries$f = function toQueries(attributes, dataSet, queryEngineConfig, par
|
|
|
71951
71922
|
var measures = [];
|
|
71952
71923
|
attributes.xMeasure && measures.push(attributes.xMeasure);
|
|
71953
71924
|
attributes.yMeasure && measures.push(attributes.yMeasure);
|
|
71954
|
-
var _Query$build = build$
|
|
71925
|
+
var _Query$build = build$c(dataSet, measures, attributes.order, attributes.dimension, attributes.timeDimension, attributes.limit, attributes.offset, queryEngineConfig, params),
|
|
71955
71926
|
query = _Query$build.query,
|
|
71956
71927
|
measureDescription = _Query$build.measureDescription;
|
|
71957
71928
|
var resultFields = toResultFields([measureDescription], queryEngineConfig);
|
|
@@ -71965,7 +71936,7 @@ var toQueries$g = function toQueries(attributes, dataSet, queryEngineConfig, par
|
|
|
71965
71936
|
var measures = [];
|
|
71966
71937
|
attributes.xMeasure && measures.push(attributes.xMeasure);
|
|
71967
71938
|
attributes.yMeasure && measures.push(attributes.yMeasure);
|
|
71968
|
-
var _Query$build = build$
|
|
71939
|
+
var _Query$build = build$c(dataSet, measures, attributes.order, attributes.dimension, attributes.timeDimension, attributes.limit, attributes.offset, queryEngineConfig, params),
|
|
71969
71940
|
query = _Query$build.query,
|
|
71970
71941
|
measureDescription = _Query$build.measureDescription;
|
|
71971
71942
|
var resultFields = toResultFields([measureDescription], queryEngineConfig);
|
|
@@ -71977,7 +71948,7 @@ var toQueries$g = function toQueries(attributes, dataSet, queryEngineConfig, par
|
|
|
71977
71948
|
|
|
71978
71949
|
var toQueries$h = function toQueries(attributes, dataSet, queryEngineConfig, params) {
|
|
71979
71950
|
var measures = [].concat(attributes.measure || [], attributes.xMeasure || [], attributes.zMeasure || []);
|
|
71980
|
-
var _Query$build = build$
|
|
71951
|
+
var _Query$build = build$c(dataSet, measures, attributes.order, attributes.dimension, attributes.timeDimension, attributes.limit, attributes.offset, queryEngineConfig, params),
|
|
71981
71952
|
query = _Query$build.query,
|
|
71982
71953
|
measureDescription = _Query$build.measureDescription;
|
|
71983
71954
|
var resultFields = toResultFields([measureDescription], queryEngineConfig);
|
|
@@ -72093,6 +72064,7 @@ var buildVizzlyQuery = function buildVizzlyQuery(thing, queryEngineConfig, param
|
|
|
72093
72064
|
var dataSet = find(params.dataSets, queryAttributes.dataSetId);
|
|
72094
72065
|
if (!dataSet) throw 'Data set not found for query-attributes query';
|
|
72095
72066
|
return _extends({}, queryAttributes, {
|
|
72067
|
+
// TODO; this means that services queries that povide a query, cannot work... GTDEV-6947
|
|
72096
72068
|
filter: [],
|
|
72097
72069
|
whereClause: filterConfigToWhere(dataSet, queryEngineConfig, _extends({}, params, {
|
|
72098
72070
|
filterConfig: _extends({}, params.filterConfig, {
|
|
@@ -73329,7 +73301,7 @@ var VizzlyServices = /*#__PURE__*/function () {
|
|
|
73329
73301
|
_proto.query = /*#__PURE__*/function () {
|
|
73330
73302
|
var _query = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee11(queries, params) {
|
|
73331
73303
|
var _this2 = this;
|
|
73332
|
-
var instanceId, service,
|
|
73304
|
+
var instanceId, service, queryEngineEndpoint, runQueriesCallback, fetch;
|
|
73333
73305
|
return _regeneratorRuntime().wrap(function _callee11$(_context11) {
|
|
73334
73306
|
while (1) switch (_context11.prev = _context11.next) {
|
|
73335
73307
|
case 0:
|
|
@@ -73339,8 +73311,7 @@ var VizzlyServices = /*#__PURE__*/function () {
|
|
|
73339
73311
|
instanceId = params.instanceId;
|
|
73340
73312
|
}
|
|
73341
73313
|
service = VizzlyServices._instanceStore[instanceId];
|
|
73342
|
-
|
|
73343
|
-
validateQuery(enhancedQueries, service.queryEngineConfig);
|
|
73314
|
+
validateQuery(queries, service.queryEngineConfig);
|
|
73344
73315
|
queryEngineEndpoint = function () {
|
|
73345
73316
|
if (params != null && params.queryEngineEndpoint) {
|
|
73346
73317
|
return params.queryEngineEndpoint;
|
|
@@ -73355,7 +73326,7 @@ var VizzlyServices = /*#__PURE__*/function () {
|
|
|
73355
73326
|
}
|
|
73356
73327
|
return undefined;
|
|
73357
73328
|
}();
|
|
73358
|
-
runQueriesCallback = getRunQueriesCallback(service.identityConfig, service.queryEngineConfig, build$
|
|
73329
|
+
runQueriesCallback = getRunQueriesCallback(service.identityConfig, service.queryEngineConfig, build$b(defaultText, params == null ? void 0 : params.dateFilterOptions), (params == null ? void 0 : params.variables) || {}, params == null ? void 0 : params.runQueries, params == null ? void 0 : params.data, queryEngineEndpoint);
|
|
73359
73330
|
fetch = /*#__PURE__*/function () {
|
|
73360
73331
|
var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee10() {
|
|
73361
73332
|
var _params$abortControll;
|
|
@@ -73364,9 +73335,10 @@ var VizzlyServices = /*#__PURE__*/function () {
|
|
|
73364
73335
|
case 0:
|
|
73365
73336
|
_context10.prev = 0;
|
|
73366
73337
|
_context10.next = 3;
|
|
73367
|
-
return runQueriesCallback(
|
|
73338
|
+
return runQueriesCallback(queries, {
|
|
73368
73339
|
abortSignal: params == null || (_params$abortControll = params.abortController) == null ? void 0 : _params$abortControll.signal,
|
|
73369
|
-
dataSets: _this2.dataSets
|
|
73340
|
+
dataSets: _this2.dataSets,
|
|
73341
|
+
filterConfig: params == null ? void 0 : params.filterConfig
|
|
73370
73342
|
});
|
|
73371
73343
|
case 3:
|
|
73372
73344
|
return _context10.abrupt("return", _context10.sent);
|
|
@@ -73385,14 +73357,14 @@ var VizzlyServices = /*#__PURE__*/function () {
|
|
|
73385
73357
|
return _ref.apply(this, arguments);
|
|
73386
73358
|
};
|
|
73387
73359
|
}();
|
|
73388
|
-
_context11.next =
|
|
73360
|
+
_context11.next = 10;
|
|
73389
73361
|
return fetch();
|
|
73390
|
-
case
|
|
73362
|
+
case 10:
|
|
73391
73363
|
_context11.t0 = _context11.sent;
|
|
73392
73364
|
return _context11.abrupt("return", {
|
|
73393
73365
|
results: _context11.t0
|
|
73394
73366
|
});
|
|
73395
|
-
case
|
|
73367
|
+
case 12:
|
|
73396
73368
|
case "end":
|
|
73397
73369
|
return _context11.stop();
|
|
73398
73370
|
}
|
|
@@ -76323,7 +76295,7 @@ var GlobalProviderContents = function GlobalProviderContents(props) {
|
|
|
76323
76295
|
}
|
|
76324
76296
|
};
|
|
76325
76297
|
var resolvedDateFilterOptions = (_props$dateFilterOpti = props.dateFilterOptions) != null ? _props$dateFilterOpti : props.dateTimeFilterOptions;
|
|
76326
|
-
var runQueriesCallback = getRunQueriesCallback(session.identityConfig, session.queryEngineConfig, build$
|
|
76298
|
+
var runQueriesCallback = getRunQueriesCallback(session.identityConfig, session.queryEngineConfig, build$b(textOverride, resolvedDateFilterOptions), variables.variables, props.runQueries, props.data, props.queryEngineEndpoint, props.timeZone);
|
|
76327
76299
|
var aiOnAction = /*#__PURE__*/function () {
|
|
76328
76300
|
var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(conversationId, messageId, actionOptions) {
|
|
76329
76301
|
return _regeneratorRuntime().wrap(function _callee3$(_context3) {
|
|
@@ -76540,7 +76512,7 @@ var index = {
|
|
|
76540
76512
|
displayPositions: displayPositions,
|
|
76541
76513
|
DataSetField: DataSetField
|
|
76542
76514
|
};
|
|
76543
|
-
var VIRDIS_COLOR_PALETTE = [
|
|
76515
|
+
var VIRDIS_COLOR_PALETTE = ['#440154FF', '#414487FF', '#2A788EFF', '#22A884FF', '#7AD151FF', '#FDE725FF'];
|
|
76544
76516
|
|
|
76545
76517
|
export default index;
|
|
76546
76518
|
export { Dashboard$2 as Dashboard, DataSetField, Editor$1 as Editor, NewVizzlyImplementation, VIRDIS_COLOR_PALETTE, VizzlyState, VizzlyTheming, displayPositions, useVizzly, vizzlyState };
|