@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.
@@ -10,10 +10,9 @@ var isEmpty$2 = _interopDefault(require('lodash/isEmpty'));
10
10
  var _ = require('lodash');
11
11
  var ___default = _interopDefault(_);
12
12
  var semanticLayerPublic = require('@vizzly/semantic-layer-public');
13
- var uuid = require('uuid');
14
13
  var Joi = _interopDefault(require('@vizzly/joi'));
15
14
  var moment = _interopDefault(require('moment-timezone'));
16
- var sqlbuilderPublic = require('@vizzly/sqlbuilder-public');
15
+ var uuid = require('uuid');
17
16
  var react = require('@emotion/react');
18
17
  var jsxRuntime = require('@emotion/react/jsx-runtime');
19
18
  var chroma = _interopDefault(require('chroma-js'));
@@ -73,6 +72,7 @@ var cx = _interopDefault(require('classnames'));
73
72
  var VisibilitySensor = _interopDefault(require('react-visibility-sensor'));
74
73
  var ExcelJS = _interopDefault(require('exceljs'));
75
74
  var fileSaver = require('file-saver');
75
+ var sqlbuilderPublic = require('@vizzly/sqlbuilder-public');
76
76
  var apiClient = require('@vizzly/api-client');
77
77
  var throttle = _interopDefault(require('lodash/throttle'));
78
78
 
@@ -1089,6 +1089,34 @@ var checkForNullValue = function checkForNullValue(dataSetId, dimensions, timeDi
1089
1089
  return textOverride ? textOverride(textOverrideKey ? textOverrideKey : 'no_value', NULL_REPLACEMENT) : undefined;
1090
1090
  };
1091
1091
 
1092
+ var ValidationError = /*#__PURE__*/function (_Error) {
1093
+ function ValidationError(message) {
1094
+ var _this;
1095
+ _this = _Error.call(this, message) || this; // (1)
1096
+ _this.name = 'ValidationError'; // (2)
1097
+ return _this;
1098
+ }
1099
+ _inheritsLoose(ValidationError, _Error);
1100
+ return ValidationError;
1101
+ }( /*#__PURE__*/_wrapNativeSuper(Error));
1102
+
1103
+ var FieldNotFoundInDataSet = /*#__PURE__*/function (_ValidationError) {
1104
+ function FieldNotFoundInDataSet(dataSet, missingFieldId) {
1105
+ var _this;
1106
+ _this = _ValidationError.call(this, "\n An expected field is missing from a dataSet.\n\n Missing '" + missingFieldId + "'. Got;\n " + JSON.stringify(dataSet) + "\n ") || this;
1107
+ _this.missingFieldId = void 0;
1108
+ _this.name = 'FieldNotFoundInDataSet';
1109
+ _this.missingFieldId = missingFieldId;
1110
+ return _this;
1111
+ }
1112
+ _inheritsLoose(FieldNotFoundInDataSet, _ValidationError);
1113
+ var _proto = FieldNotFoundInDataSet.prototype;
1114
+ _proto.getMissingFieldId = function getMissingFieldId() {
1115
+ return this.missingFieldId;
1116
+ };
1117
+ return FieldNotFoundInDataSet;
1118
+ }(ValidationError);
1119
+
1092
1120
  var timeDimensionsConstants = semanticLayerPublic.QueryEngineConfig.Constants.timeDimensionsConstants;
1093
1121
 
1094
1122
  // All the aggregates Vizzly supports somewhere...
@@ -1116,6 +1144,300 @@ var isSupportedTimeTruncFunction = function isSupportedTimeTruncFunction(support
1116
1144
  return [].concat(Object.keys(supportedTimeFunctions), ['none']).includes(proposedFunction);
1117
1145
  };
1118
1146
 
1147
+ var filterIsDate = function filterIsDate(filter) {
1148
+ var isoDateRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/;
1149
+ if (!isoDateRegex.test(filter.value)) {
1150
+ return false;
1151
+ }
1152
+ var date = new Date(filter.value);
1153
+ if (isNaN(date.getTime())) {
1154
+ return false;
1155
+ }
1156
+
1157
+ // Additional check to verify that the date parts match exactly
1158
+ var _filter$value$split$ = filter.value.split('T')[0].split('-').map(Number),
1159
+ year = _filter$value$split$[0],
1160
+ month = _filter$value$split$[1],
1161
+ day = _filter$value$split$[2];
1162
+ if (date.getUTCFullYear() !== year || date.getUTCMonth() + 1 !== month || date.getUTCDate() !== day) {
1163
+ return false;
1164
+ }
1165
+ return true;
1166
+ };
1167
+
1168
+ var _Joi$string, _Joi$string2;
1169
+ var defaultDurationOptions = function defaultDurationOptions(textOverride) {
1170
+ return {
1171
+ minutes: {
1172
+ description: textOverride ? textOverride('duration_option.minutes', 'Minutes') : 'Minutes',
1173
+ formatter: function formatter(currentDate, value) {
1174
+ currentDate.setMinutes(currentDate.getMinutes() + value);
1175
+ }
1176
+ },
1177
+ hours: {
1178
+ description: textOverride ? textOverride('duration_option.minutes', 'Hours') : 'Hours',
1179
+ formatter: function formatter(currentDate, value) {
1180
+ currentDate.setHours(currentDate.getHours() + value);
1181
+ }
1182
+ },
1183
+ days: {
1184
+ description: textOverride ? textOverride('duration_option.minutes', 'Days') : 'Days',
1185
+ formatter: function formatter(currentDate, value) {
1186
+ currentDate.setDate(currentDate.getDate() + value);
1187
+ }
1188
+ },
1189
+ weeks: {
1190
+ description: textOverride ? textOverride('duration_option.minutes', 'Weeks') : 'Weeks',
1191
+ formatter: function formatter(currentDate, value) {
1192
+ currentDate.setDate(currentDate.getDate() + value * 7); // 1 week = 7 days
1193
+ }
1194
+ },
1195
+ months: {
1196
+ description: textOverride ? textOverride('duration_option.minutes', 'Months') : 'Months',
1197
+ formatter: function formatter(currentDate, value) {
1198
+ currentDate.setMonth(currentDate.getMonth() + value);
1199
+ }
1200
+ },
1201
+ years: {
1202
+ description: textOverride ? textOverride('duration_option.minutes', 'Years') : 'Years',
1203
+ formatter: function formatter(currentDate, value) {
1204
+ currentDate.setFullYear(currentDate.getFullYear() + value);
1205
+ }
1206
+ }
1207
+ };
1208
+ };
1209
+ var defaultTimeframeOptions = function defaultTimeframeOptions(textOverride) {
1210
+ return {
1211
+ future: {
1212
+ description: textOverride ? textOverride('timeframe_option.minutes', 'Future') : 'Future'
1213
+ },
1214
+ past: {
1215
+ description: textOverride ? textOverride('timeframe_option.past', 'Past') : 'Past'
1216
+ }
1217
+ };
1218
+ };
1219
+ var getDurationKeys = function getDurationKeys() {
1220
+ var options = defaultDurationOptions();
1221
+ return Object.keys(options);
1222
+ };
1223
+ var getTimeframeKeys = function getTimeframeKeys() {
1224
+ var options = defaultTimeframeOptions();
1225
+ return Object.keys(options);
1226
+ };
1227
+ var relativeSchema = /*#__PURE__*/Joi.object({
1228
+ unit: /*#__PURE__*/(_Joi$string = Joi.string()).valid.apply(_Joi$string, getDurationKeys()).required(),
1229
+ value: /*#__PURE__*/Joi.number().integer().required(),
1230
+ timeFrame: /*#__PURE__*/(_Joi$string2 = Joi.string()).valid.apply(_Joi$string2, getTimeframeKeys()).required()
1231
+ });
1232
+ function isRelative(value) {
1233
+ return value && typeof value === 'object' && 'unit' in value && 'value' in value && 'timeFrame' in value;
1234
+ }
1235
+ function isRelativeDateDefined(value) {
1236
+ var _relativeSchema$valid = relativeSchema.validate(value),
1237
+ error = _relativeSchema$valid.error;
1238
+ return !error;
1239
+ }
1240
+ var init = function init() {
1241
+ return {
1242
+ value: null,
1243
+ unit: null,
1244
+ timeFrame: 'future'
1245
+ };
1246
+ };
1247
+ var calculateRelativeDate = function calculateRelativeDate(relativeDate, startDate) {
1248
+ var currentDate = startDate ? new Date(startDate) : new Date();
1249
+ if (!relativeDate.value || relativeDate.unit === null) {
1250
+ throw new Error("Unrecognized value: " + relativeDate.value);
1251
+ }
1252
+ var newDate = relativeDate.timeFrame === 'future' ? relativeDate.value : -relativeDate.value;
1253
+ defaultDurationOptions()[relativeDate.unit].formatter(currentDate, newDate);
1254
+ return currentDate;
1255
+ };
1256
+ var buildRelativeRange = function buildRelativeRange(relativeFilters, dataSet, appliesToFields) {
1257
+ if (!appliesToFields) {
1258
+ throw new Error('appliesToFields is required');
1259
+ }
1260
+ return relativeFilters.map(function (group) {
1261
+ var templates = group.map(function (condition) {
1262
+ return {
1263
+ op: condition.op,
1264
+ value: _extends({}, condition.value)
1265
+ };
1266
+ });
1267
+ var newGroup = [];
1268
+ appliesToFields.forEach(function (field) {
1269
+ if (field.dataSetId != dataSet.id) return;
1270
+ templates.forEach(function (template) {
1271
+ newGroup.push(_extends({}, template, {
1272
+ field: field.fieldId
1273
+ }));
1274
+ });
1275
+ });
1276
+ return newGroup;
1277
+ });
1278
+ };
1279
+
1280
+ var getUTCDate = function getUTCDate(date) {
1281
+ if (date !== null) {
1282
+ var momentDate = moment(new Date(date));
1283
+ return momentDate.tz(Intl.DateTimeFormat().resolvedOptions().timeZone)._d;
1284
+ }
1285
+ return date;
1286
+ };
1287
+
1288
+ var VariableNotFoundForVariables = /*#__PURE__*/function (_ValidationError) {
1289
+ function VariableNotFoundForVariables(variableList, missingVariableId) {
1290
+ var _this;
1291
+ _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;
1292
+ _this.missingVariableId = void 0;
1293
+ _this.name = 'VariableNotFoundForVariables';
1294
+ _this.missingVariableId = missingVariableId;
1295
+ return _this;
1296
+ }
1297
+ _inheritsLoose(VariableNotFoundForVariables, _ValidationError);
1298
+ var _proto = VariableNotFoundForVariables.prototype;
1299
+ _proto.getMissingFieldId = function getMissingFieldId() {
1300
+ return this.missingVariableId;
1301
+ };
1302
+ return VariableNotFoundForVariables;
1303
+ }(ValidationError);
1304
+
1305
+ var detect = function detect(input) {
1306
+ var regex = /\{\{\s*([^\s{}][^{}]*?)\s*\}\}/g;
1307
+ var matches = [];
1308
+ var match;
1309
+ while ((match = regex.exec(input)) !== null) {
1310
+ matches.push(match[1].trim());
1311
+ }
1312
+ return matches.length > 0 ? matches : undefined;
1313
+ };
1314
+ var build$1 = function build(variables) {
1315
+ if (variables) {
1316
+ var dashboardDefinedVariables = variables();
1317
+ logInfo('Detected variables', dashboardDefinedVariables);
1318
+ return dashboardDefinedVariables;
1319
+ }
1320
+ return {};
1321
+ };
1322
+ var findVariable = function findVariable(value, detect, variableList) {
1323
+ if (!variableList) return undefined;
1324
+
1325
+ // Use the detect function to check if the value is a variable
1326
+ var variables = detect(value);
1327
+
1328
+ // If no variables are detected, return early
1329
+ if (!variables || variables.length === 0) {
1330
+ return undefined; // Early return if the value is not a variable
1331
+ }
1332
+ var matchedVariables = [];
1333
+
1334
+ // Check for matching variables in the variable list
1335
+ for (var _iterator = _createForOfIteratorHelperLoose(variables), _step; !(_step = _iterator()).done;) {
1336
+ var variable = _step.value;
1337
+ var variableEntry = variableList[variable];
1338
+ if (variableEntry) {
1339
+ // If the variable is found but its value is undefined or empty, throw an error
1340
+ if (variableEntry.value === undefined || variableEntry.value === '') {
1341
+ throw new Error("Variable '" + variable + "' is defined in the list but has no value.");
1342
+ }
1343
+
1344
+ // Add the variable to the matched variables list
1345
+ matchedVariables.push(variable);
1346
+ }
1347
+ }
1348
+
1349
+ // If no matches are found, throw an error
1350
+ if (matchedVariables.length === 0 && value) {
1351
+ throw new VariableNotFoundForVariables(variableList, value);
1352
+ }
1353
+ return matchedVariables.length > 0 ? matchedVariables : undefined;
1354
+ };
1355
+ var useValue = function useValue(value, variables) {
1356
+ if (typeof value === 'string') {
1357
+ var valueHasVariables = detect(value);
1358
+ if (valueHasVariables && variables) {
1359
+ for (var _iterator2 = _createForOfIteratorHelperLoose(valueHasVariables), _step2; !(_step2 = _iterator2()).done;) {
1360
+ var key = _step2.value;
1361
+ if (key in variables) {
1362
+ return extractValue(variables, key);
1363
+ }
1364
+ }
1365
+ }
1366
+ }
1367
+ return value;
1368
+ };
1369
+ var validate = function validate(value, variables) {
1370
+ try {
1371
+ findVariable(value, detect, variables);
1372
+ return true;
1373
+ } catch (e) {
1374
+ return false;
1375
+ }
1376
+ };
1377
+ function extractValue(variables, key) {
1378
+ return variables[key].value;
1379
+ }
1380
+
1381
+ var addAndFilters = function addAndFilters(filter, filterToAddToAll) {
1382
+ if (!filter || _.isEmpty(filter)) filter = [[]];
1383
+ return [].concat(filter).map(function (andFilter) {
1384
+ return [].concat(andFilter, filterToAddToAll);
1385
+ });
1386
+ };
1387
+ var filterAttributeToQueryFilter = function filterAttributeToQueryFilter(filters, queryEngineConfig, dataSet, params) {
1388
+ return filters.map(function (andFilters) {
1389
+ return [].concat(andFilters).flatMap(function (andFilter) {
1390
+ var _andFilter$function;
1391
+ // Stop unsupported time functions being used.
1392
+ if (andFilter["function"] && !isSupportedTimeTruncFunction(queryEngineConfig.supportedTimeTruncFunctions, andFilter["function"])) {
1393
+ throw "Query engine does not support the query function " + andFilter["function"] + ".";
1394
+ }
1395
+ var dataSetField = findField(dataSet, andFilter.field);
1396
+ var field = {
1397
+ type: 'field',
1398
+ value: andFilter.field,
1399
+ "function": (_andFilter$function = andFilter["function"]) != null ? _andFilter$function : 'none'
1400
+ };
1401
+ if (isCustomField(dataSetField)) {
1402
+ var _andFilter$function2;
1403
+ field = toQueryMeasure({
1404
+ field: dataSetField.id,
1405
+ "function": (_andFilter$function2 = andFilter["function"]) != null ? _andFilter$function2 : 'none'
1406
+ }, dataSetField, queryEngineConfig, dataSet, false, params);
1407
+ }
1408
+ // If `array_contains` operation has multiple. Then split these out into individual
1409
+ // checks.
1410
+ if ((andFilter.op == 'array_contains' || andFilter.op == 'array_does_not_contain') && Array.isArray(andFilter.value)) {
1411
+ return [].concat(andFilter.value).map(function (value) {
1412
+ return {
1413
+ field: field,
1414
+ op: andFilter.op,
1415
+ value: value
1416
+ };
1417
+ });
1418
+ }
1419
+ var value = useValue(andFilter.value, params.variables);
1420
+ if (isRelativeDateDefined(andFilter.value)) {
1421
+ value = calculateRelativeDate(andFilter.value);
1422
+ }
1423
+ if (filterIsDate(andFilter)) {
1424
+ value = getUTCDate(andFilter.value);
1425
+ }
1426
+ return [{
1427
+ field: field,
1428
+ op: andFilter.op,
1429
+ value: value
1430
+ }];
1431
+ });
1432
+ });
1433
+ };
1434
+ var isAvailable = function isAvailable(filter) {
1435
+ return filter && _.isArray(filter) && _.isArray(filter[0]);
1436
+ };
1437
+ var isAdditionalFilter = function isAdditionalFilter(value) {
1438
+ return value && _.isArray(value) && _.isArray(value[0]) && 'field' in value[0][0] && 'op' in value[0][0] && 'value' in value[0][0];
1439
+ };
1440
+
1119
1441
  var combineFilters = function combineFilters(array1, array2) {
1120
1442
  var validArray1 = array1.length > 0 && array1[0] ? array1 : [[]];
1121
1443
  var validArray2 = array2.length > 0 && array2[0] ? array2 : [[]];
@@ -1204,126 +1526,6 @@ var MULTI_SELECT_FILTER = 'multiSelectFilter';
1204
1526
  var NUMERIC_FILTER = 'numericFilter';
1205
1527
  var ADVANCED_FILTER = 'advancedFilter';
1206
1528
 
1207
- var _Joi$string, _Joi$string2;
1208
- var defaultDurationOptions = function defaultDurationOptions(textOverride) {
1209
- return {
1210
- minutes: {
1211
- description: textOverride ? textOverride('duration_option.minutes', 'Minutes') : 'Minutes',
1212
- formatter: function formatter(currentDate, value) {
1213
- currentDate.setMinutes(currentDate.getMinutes() + value);
1214
- }
1215
- },
1216
- hours: {
1217
- description: textOverride ? textOverride('duration_option.minutes', 'Hours') : 'Hours',
1218
- formatter: function formatter(currentDate, value) {
1219
- currentDate.setHours(currentDate.getHours() + value);
1220
- }
1221
- },
1222
- days: {
1223
- description: textOverride ? textOverride('duration_option.minutes', 'Days') : 'Days',
1224
- formatter: function formatter(currentDate, value) {
1225
- currentDate.setDate(currentDate.getDate() + value);
1226
- }
1227
- },
1228
- weeks: {
1229
- description: textOverride ? textOverride('duration_option.minutes', 'Weeks') : 'Weeks',
1230
- formatter: function formatter(currentDate, value) {
1231
- currentDate.setDate(currentDate.getDate() + value * 7); // 1 week = 7 days
1232
- }
1233
- },
1234
- months: {
1235
- description: textOverride ? textOverride('duration_option.minutes', 'Months') : 'Months',
1236
- formatter: function formatter(currentDate, value) {
1237
- currentDate.setMonth(currentDate.getMonth() + value);
1238
- }
1239
- },
1240
- years: {
1241
- description: textOverride ? textOverride('duration_option.minutes', 'Years') : 'Years',
1242
- formatter: function formatter(currentDate, value) {
1243
- currentDate.setFullYear(currentDate.getFullYear() + value);
1244
- }
1245
- }
1246
- };
1247
- };
1248
- var defaultTimeframeOptions = function defaultTimeframeOptions(textOverride) {
1249
- return {
1250
- future: {
1251
- description: textOverride ? textOverride('timeframe_option.minutes', 'Future') : 'Future'
1252
- },
1253
- past: {
1254
- description: textOverride ? textOverride('timeframe_option.past', 'Past') : 'Past'
1255
- }
1256
- };
1257
- };
1258
- var getDurationKeys = function getDurationKeys() {
1259
- var options = defaultDurationOptions();
1260
- return Object.keys(options);
1261
- };
1262
- var getTimeframeKeys = function getTimeframeKeys() {
1263
- var options = defaultTimeframeOptions();
1264
- return Object.keys(options);
1265
- };
1266
- var relativeSchema = /*#__PURE__*/Joi.object({
1267
- unit: /*#__PURE__*/(_Joi$string = Joi.string()).valid.apply(_Joi$string, getDurationKeys()).required(),
1268
- value: /*#__PURE__*/Joi.number().integer().required(),
1269
- timeFrame: /*#__PURE__*/(_Joi$string2 = Joi.string()).valid.apply(_Joi$string2, getTimeframeKeys()).required()
1270
- });
1271
- function isRelative(value) {
1272
- return value && typeof value === 'object' && 'unit' in value && 'value' in value && 'timeFrame' in value;
1273
- }
1274
- function isRelativeDateDefined(value) {
1275
- var _relativeSchema$valid = relativeSchema.validate(value),
1276
- error = _relativeSchema$valid.error;
1277
- return !error;
1278
- }
1279
- var init = function init() {
1280
- return {
1281
- value: null,
1282
- unit: null,
1283
- timeFrame: 'future'
1284
- };
1285
- };
1286
- var calculateRelativeDate = function calculateRelativeDate(relativeDate, startDate) {
1287
- var currentDate = startDate ? new Date(startDate) : new Date();
1288
- if (!relativeDate.value || relativeDate.unit === null) {
1289
- throw new Error("Unrecognized value: " + relativeDate.value);
1290
- }
1291
- var newDate = relativeDate.timeFrame === 'future' ? relativeDate.value : -relativeDate.value;
1292
- defaultDurationOptions()[relativeDate.unit].formatter(currentDate, newDate);
1293
- return currentDate;
1294
- };
1295
- var buildRelativeRange = function buildRelativeRange(relativeFilters, dataSet, appliesToFields) {
1296
- if (!appliesToFields) {
1297
- throw new Error('appliesToFields is required');
1298
- }
1299
- return relativeFilters.map(function (group) {
1300
- var templates = group.map(function (condition) {
1301
- return {
1302
- op: condition.op,
1303
- value: _extends({}, condition.value)
1304
- };
1305
- });
1306
- var newGroup = [];
1307
- appliesToFields.forEach(function (field) {
1308
- if (field.dataSetId != dataSet.id) return;
1309
- templates.forEach(function (template) {
1310
- newGroup.push(_extends({}, template, {
1311
- field: field.fieldId
1312
- }));
1313
- });
1314
- });
1315
- return newGroup;
1316
- });
1317
- };
1318
-
1319
- var getUTCDate = function getUTCDate(date) {
1320
- if (date !== null) {
1321
- var momentDate = moment(new Date(date));
1322
- return momentDate.tz(Intl.DateTimeFormat().resolvedOptions().timeZone)._d;
1323
- }
1324
- return date;
1325
- };
1326
-
1327
1529
  var toQueryAttributesFilter = function toQueryAttributesFilter(dataSet, filter, customTimeRangeFuncs) {
1328
1530
  return filter.appliesToFields.flatMap(function (field) {
1329
1531
  var _filter$value, _filter$value2, _filter$value3;
@@ -1725,7 +1927,7 @@ var init$1 = function init(publicName, denominatorFieldId, denominatorAggregate,
1725
1927
  }, queryEngineConfig)
1726
1928
  };
1727
1929
  };
1728
- var build$1 = function build(customField, queryEngineConfig, dataSet, _queryHasDimension, params) {
1930
+ var build$2 = function build(customField, queryEngineConfig, dataSet, _queryHasDimension, params) {
1729
1931
  var _params$filterConfig$, _params$filterConfig, _customField$numerato, _customField$numerato2, _customField$denomina, _customField$denomina2;
1730
1932
  var localAndDashboardFilters = fromFilterConfig(params.filterConfig, dataSet, params.timeRangeOptions);
1731
1933
  var _buildPercentageFilte = buildPercentageFilters(addAndFilters((_params$filterConfig$ = params == null || (_params$filterConfig = params.filterConfig) == null ? void 0 : _params$filterConfig.advancedFilter) != null ? _params$filterConfig$ : [], localAndDashboardFilters), customField),
@@ -1823,110 +2025,6 @@ function buildPercentageFilters(filters, customField) {
1823
2025
  };
1824
2026
  }
1825
2027
 
1826
- var ValidationError = /*#__PURE__*/function (_Error) {
1827
- function ValidationError(message) {
1828
- var _this;
1829
- _this = _Error.call(this, message) || this; // (1)
1830
- _this.name = 'ValidationError'; // (2)
1831
- return _this;
1832
- }
1833
- _inheritsLoose(ValidationError, _Error);
1834
- return ValidationError;
1835
- }( /*#__PURE__*/_wrapNativeSuper(Error));
1836
-
1837
- var VariableNotFoundForVariables = /*#__PURE__*/function (_ValidationError) {
1838
- function VariableNotFoundForVariables(variableList, missingVariableId) {
1839
- var _this;
1840
- _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;
1841
- _this.missingVariableId = void 0;
1842
- _this.name = 'VariableNotFoundForVariables';
1843
- _this.missingVariableId = missingVariableId;
1844
- return _this;
1845
- }
1846
- _inheritsLoose(VariableNotFoundForVariables, _ValidationError);
1847
- var _proto = VariableNotFoundForVariables.prototype;
1848
- _proto.getMissingFieldId = function getMissingFieldId() {
1849
- return this.missingVariableId;
1850
- };
1851
- return VariableNotFoundForVariables;
1852
- }(ValidationError);
1853
-
1854
- var detect = function detect(input) {
1855
- var regex = /\{\{\s*([^\s{}][^{}]*?)\s*\}\}/g;
1856
- var matches = [];
1857
- var match;
1858
- while ((match = regex.exec(input)) !== null) {
1859
- matches.push(match[1].trim());
1860
- }
1861
- return matches.length > 0 ? matches : undefined;
1862
- };
1863
- var build$2 = function build(variables) {
1864
- if (variables) {
1865
- var dashboardDefinedVariables = variables();
1866
- logInfo('Detected variables', dashboardDefinedVariables);
1867
- return dashboardDefinedVariables;
1868
- }
1869
- return {};
1870
- };
1871
- var findVariable = function findVariable(value, detect, variableList) {
1872
- if (!variableList) return undefined;
1873
-
1874
- // Use the detect function to check if the value is a variable
1875
- var variables = detect(value);
1876
-
1877
- // If no variables are detected, return early
1878
- if (!variables || variables.length === 0) {
1879
- return undefined; // Early return if the value is not a variable
1880
- }
1881
- var matchedVariables = [];
1882
-
1883
- // Check for matching variables in the variable list
1884
- for (var _iterator = _createForOfIteratorHelperLoose(variables), _step; !(_step = _iterator()).done;) {
1885
- var variable = _step.value;
1886
- var variableEntry = variableList[variable];
1887
- if (variableEntry) {
1888
- // If the variable is found but its value is undefined or empty, throw an error
1889
- if (variableEntry.value === undefined || variableEntry.value === '') {
1890
- throw new Error("Variable '" + variable + "' is defined in the list but has no value.");
1891
- }
1892
-
1893
- // Add the variable to the matched variables list
1894
- matchedVariables.push(variable);
1895
- }
1896
- }
1897
-
1898
- // If no matches are found, throw an error
1899
- if (matchedVariables.length === 0 && value) {
1900
- throw new VariableNotFoundForVariables(variableList, value);
1901
- }
1902
- return matchedVariables.length > 0 ? matchedVariables : undefined;
1903
- };
1904
- var useValue = function useValue(value, variables) {
1905
- if (typeof value === 'string') {
1906
- var valueHasVariables = detect(value);
1907
- if (valueHasVariables && variables) {
1908
- for (var _iterator2 = _createForOfIteratorHelperLoose(valueHasVariables), _step2; !(_step2 = _iterator2()).done;) {
1909
- var key = _step2.value;
1910
- if (key in variables) {
1911
- return extractValue(variables, key);
1912
- }
1913
- }
1914
- }
1915
- }
1916
- return value;
1917
- };
1918
- var validate = function validate(value, variables) {
1919
- try {
1920
- findVariable(value, detect, variables);
1921
- return true;
1922
- } catch (e) {
1923
- return false;
1924
- }
1925
- };
1926
- function extractValue(variables, key) {
1927
- return variables[key].value;
1928
- }
1929
-
1930
2028
  var init$2 = function init(publicName, leftFieldId, operator, rightFieldId, queryEngineConfig) {
1931
2029
  return {
1932
2030
  id: generateId(),
@@ -2475,7 +2573,7 @@ var isCustomField = function isCustomField(field) {
2475
2573
  */
2476
2574
  var toQueryMeasure = function toQueryMeasure(measureAttribute, customField, queryEngineConfig, dataSet, queryHasDimension, params) {
2477
2575
  if (isPercentageField(customField)) {
2478
- return build$1(customField, queryEngineConfig, dataSet, queryHasDimension, params);
2576
+ return build$2(customField, queryEngineConfig, dataSet, queryHasDimension, params);
2479
2577
  }
2480
2578
  if (isRules(customField)) {
2481
2579
  return build$6(measureAttribute, customField, queryEngineConfig, dataSet, params);
@@ -2542,790 +2640,6 @@ var upcast = function upcast(maybeOldCustomField) {
2542
2640
  return maybeOldCustomField;
2543
2641
  };
2544
2642
 
2545
- var filterIsDate = function filterIsDate(filter) {
2546
- var isoDateRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/;
2547
- if (!isoDateRegex.test(filter.value)) {
2548
- return false;
2549
- }
2550
- var date = new Date(filter.value);
2551
- if (isNaN(date.getTime())) {
2552
- return false;
2553
- }
2554
-
2555
- // Additional check to verify that the date parts match exactly
2556
- var _filter$value$split$ = filter.value.split('T')[0].split('-').map(Number),
2557
- year = _filter$value$split$[0],
2558
- month = _filter$value$split$[1],
2559
- day = _filter$value$split$[2];
2560
- if (date.getUTCFullYear() !== year || date.getUTCMonth() + 1 !== month || date.getUTCDate() !== day) {
2561
- return false;
2562
- }
2563
- return true;
2564
- };
2565
-
2566
- var addAndFilters = function addAndFilters(filter, filterToAddToAll) {
2567
- if (!filter || _.isEmpty(filter)) filter = [[]];
2568
- return [].concat(filter).map(function (andFilter) {
2569
- return [].concat(andFilter, filterToAddToAll);
2570
- });
2571
- };
2572
- var filterAttributeToQueryFilter = function filterAttributeToQueryFilter(filters, queryEngineConfig, dataSet, params) {
2573
- return filters.map(function (andFilters) {
2574
- return [].concat(andFilters).flatMap(function (andFilter) {
2575
- var _andFilter$function;
2576
- // Stop unsupported time functions being used.
2577
- if (andFilter["function"] && !isSupportedTimeTruncFunction(queryEngineConfig.supportedTimeTruncFunctions, andFilter["function"])) {
2578
- throw "Query engine does not support the query function " + andFilter["function"] + ".";
2579
- }
2580
- var dataSetField = findField(dataSet, andFilter.field);
2581
- var field = {
2582
- type: 'field',
2583
- value: andFilter.field,
2584
- "function": (_andFilter$function = andFilter["function"]) != null ? _andFilter$function : 'none'
2585
- };
2586
- if (isCustomField(dataSetField)) {
2587
- var _andFilter$function2;
2588
- field = toQueryMeasure({
2589
- field: dataSetField.id,
2590
- "function": (_andFilter$function2 = andFilter["function"]) != null ? _andFilter$function2 : 'none'
2591
- }, dataSetField, queryEngineConfig, dataSet, false, params);
2592
- }
2593
- // If `array_contains` operation has multiple. Then split these out into individual
2594
- // checks.
2595
- if ((andFilter.op == 'array_contains' || andFilter.op == 'array_does_not_contain') && Array.isArray(andFilter.value)) {
2596
- return [].concat(andFilter.value).map(function (value) {
2597
- return {
2598
- field: field,
2599
- op: andFilter.op,
2600
- value: value
2601
- };
2602
- });
2603
- }
2604
- var value = useValue(andFilter.value, params.variables);
2605
- if (isRelativeDateDefined(andFilter.value)) {
2606
- value = calculateRelativeDate(andFilter.value);
2607
- }
2608
- if (filterIsDate(andFilter)) {
2609
- value = getUTCDate(andFilter.value);
2610
- }
2611
- return [{
2612
- field: field,
2613
- op: andFilter.op,
2614
- value: value
2615
- }];
2616
- });
2617
- });
2618
- };
2619
- var isAvailable = function isAvailable(filter) {
2620
- return filter && _.isArray(filter) && _.isArray(filter[0]);
2621
- };
2622
- var isAdditionalFilter = function isAdditionalFilter(value) {
2623
- return value && _.isArray(value) && _.isArray(value[0]) && 'field' in value[0][0] && 'op' in value[0][0] && 'value' in value[0][0];
2624
- };
2625
-
2626
- var groupFilters = function groupFilters(dataSets) {
2627
- var groups = {};
2628
- dataSets.forEach(function (dataSet) {
2629
- if (dataSet && dataSet.fields) {
2630
- dataSet.fields.forEach(function (dataSetField) {
2631
- (dataSetField.dashboardRequiredFilterGroups || []).forEach(function (filterGroup) {
2632
- var key = filterGroup.publicName + " - " + dataSetField.dataType;
2633
- groups[key] = [].concat(groups[key] || [], [{
2634
- publicName: filterGroup.publicName,
2635
- dataSetField: dataSetField,
2636
- dataSetId: dataSet.id
2637
- }]);
2638
- });
2639
- });
2640
- } else {
2641
- logError('DataSet is undefined or does not have fields', dataSet);
2642
- }
2643
- });
2644
- return Object.values(groups);
2645
- };
2646
- var fromDashboardRequiredFilterGroups = function fromDashboardRequiredFilterGroups(dataSets) {
2647
- var groupedFilters = groupFilters(dataSets);
2648
- return groupedFilters.map(function (group) {
2649
- return {
2650
- type: group[0].dataSetField.dataType == 'date_time' ? DATE_FILTER : SINGLE_SELECT_FILTER,
2651
- managedByConfiguration: true,
2652
- requiresValue: true,
2653
- title: group[0].publicName,
2654
- appliesToFields: group.map(function (g) {
2655
- return {
2656
- dataSetId: g.dataSetId,
2657
- fieldId: g.dataSetField.id
2658
- };
2659
- }),
2660
- value: null
2661
- };
2662
- });
2663
- };
2664
-
2665
- var tagSchema = function tagSchema() {
2666
- return Joi.object({
2667
- key: Joi.string().required()
2668
- });
2669
- };
2670
- var tagsSchema = function tagsSchema() {
2671
- return Joi.array().items(tagSchema()).min(0);
2672
- };
2673
-
2674
- var measureSchema = function measureSchema(supportedAggregates, attributeSchemaOptions) {
2675
- var buildMeasureJoi = function buildMeasureJoi(fieldJoi, functionJoi) {
2676
- return Joi.object({
2677
- field: fieldJoi.required(),
2678
- "function": functionJoi.required().description('Which if any, aggregate function should be applied to the field?')
2679
- });
2680
- };
2681
-
2682
- // Return an enum using the restriction fields
2683
- if (attributeSchemaOptions != null && attributeSchemaOptions.restrictFields) {
2684
- return Joi.alternatives.apply(Joi, attributeSchemaOptions.restrictFields.filter(function (f) {
2685
- return f.canBeMeasure;
2686
- }).map(function (restrictedField) {
2687
- var _Joi$string;
2688
- var supportedFunctionsForField = listValidFunctionsForDataType(restrictedField, supportedAggregates);
2689
- return buildMeasureJoi(Joi.string().valid(restrictedField.id).description(restrictedField.publicName + ", " + (restrictedField.description || '') + "."), (_Joi$string = Joi.string()).valid.apply(_Joi$string, supportedFunctionsForField.concat(['none'])));
2690
- }));
2691
- }
2692
- 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'])));
2693
- };
2694
- var orderSchema = function orderSchema(queryEngineConfig) {
2695
- var _Joi$string2;
2696
- return Joi.object({
2697
- field: Joi.string().required().description('The ID of the field from the data set to reference.'),
2698
- direction: Joi.string().valid('asc', 'desc').required().description('In which direction should the results be ordered?'),
2699
- "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?')
2700
- });
2701
- };
2702
- var timeDimensionSchema = function timeDimensionSchema(supportedTimeTruncFunctions) {
2703
- return Joi.object({
2704
- field: Joi.string().required().description('The ID of the field from the data set to reference.'),
2705
- truncate: Joi.valid.apply(Joi, Object.keys(supportedTimeTruncFunctions).concat(['none'])),
2706
- bucketFill: Joi["boolean"]()
2707
- });
2708
- };
2709
- var dimensionSchema = function dimensionSchema(supportedTimeTruncFunctions, attributeSchemaOptions) {
2710
- var buildDimensionJoi = function buildDimensionJoi(fieldJoi, isDate) {
2711
- return Joi.object({
2712
- field: fieldJoi.required(),
2713
- pivot: Joi.string().valid('x', 'y').optional(),
2714
- "function": isDate ? Joi.valid.apply(Joi, Object.keys(supportedTimeTruncFunctions).concat(['none'])).required() : Joi.valid('none').required()
2715
- });
2716
- };
2717
-
2718
- // Return an enum using the restriction fields
2719
- if (attributeSchemaOptions != null && attributeSchemaOptions.restrictFields) {
2720
- return Joi.array().items(Joi.alternatives.apply(Joi, attributeSchemaOptions.restrictFields.filter(function (f) {
2721
- return f.canBeDimension;
2722
- }).map(function (restrictedField) {
2723
- return buildDimensionJoi(Joi.string().valid(restrictedField.id).description(restrictedField.publicName + ", " + (restrictedField.description || '') + "."), restrictedField.dataType === 'date_time');
2724
- }))).description('Fields to group the data by');
2725
- }
2726
- 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');
2727
- };
2728
- var filterSchema = function filterSchema(queryEngineConfig) {
2729
- var _Joi$string3, _Joi$string4;
2730
- return Joi.object({
2731
- field: Joi.string().required().description('The ID of the field from the data set to reference.'),
2732
- op: (_Joi$string3 = Joi.string()).valid.apply(_Joi$string3, Object.keys(queryEngineConfig.supportedOperators)).required(),
2733
- 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(),
2734
- "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?')
2735
- });
2736
- };
2737
- var queryAttributesFilter = function queryAttributesFilter(queryEngineConfig) {
2738
- return Joi.array().items(Joi.array().items(filterSchema(queryEngineConfig)));
2739
- };
2740
- var queryAttributesLimit = function queryAttributesLimit() {
2741
- return Joi.number().description('Limit the number of results returned after the query has been ran.');
2742
- };
2743
- var baseAttributesSchema = function baseAttributesSchema(attributeSchemaOptions) {
2744
- var _Joi$string5;
2745
- var dataSetIdSchema = attributeSchemaOptions != null && attributeSchemaOptions.restrictDataSetIds ? (_Joi$string5 = Joi.string()).valid.apply(_Joi$string5, attributeSchemaOptions.restrictDataSetIds) : Joi.string();
2746
- return {
2747
- viewId: Joi.string().allow('').optional().description('__vizzly_hide_from_docs'),
2748
- displayTitle: Joi.string().allow('').description('A title that explains what is being displayed.'),
2749
- displaySubject: Joi.string().allow('').description('A chance to add a more detailed description of what is being shown.'),
2750
- dataSetId: dataSetIdSchema.description('The ID of the data set that is being used by the view.'),
2751
- protectedByOrganisation: Joi["boolean"]().optional().description('Has the view been created by your organisation, and therefore cannot be modified by your users?')
2752
- };
2753
- };
2754
- var approxAxisLabelCountSchema = /*#__PURE__*/Joi.valid('auto', 2, 0).description('Determine how many axis labels should be shown on the axis');
2755
- var querySchema = function querySchema(queryEngineConfig, attributeSchemaOptions) {
2756
- return {
2757
- 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.'),
2758
- dimension: dimensionSchema(queryEngineConfig.supportedTimeTruncFunctions, attributeSchemaOptions).required(),
2759
- order: Joi.array().items(orderSchema(queryEngineConfig)),
2760
- limit: queryAttributesLimit(),
2761
- offset: Joi.number().min(0).description('Paginate results by using this property with limit.')
2762
- };
2763
- };
2764
- var timeDimensionQuerySchema = function timeDimensionQuerySchema(queryEngineConfig, attributeSchemaOptions) {
2765
- return _extends({}, querySchema(queryEngineConfig, attributeSchemaOptions), {
2766
- filter: Joi.array().items(Joi.array().items(filterSchema(queryEngineConfig))),
2767
- timeDimension: Joi.alternatives(timeDimensionSchema(queryEngineConfig.supportedTimeTruncFunctions), Joi.valid(null)).required(),
2768
- drilldown: Joi.alternatives(dimensionSchema(queryEngineConfig.supportedTimeTruncFunctions, attributeSchemaOptions).required(), Joi.string()),
2769
- xAxisPrefix: Joi.string().allow('').description('Add a prefix to the X Axis'),
2770
- yAxisPrefix: Joi.string().allow('').description('Add a prefix to the Y Axis'),
2771
- xAxisPostfix: Joi.string().allow('').description('Add a postfix to the X Axis'),
2772
- yAxisPostfix: Joi.string().allow('').description('Add a postfix to the Y Axis'),
2773
- yAxisFormat: Joi.alternatives(Joi.string(), Joi.valid(null)).description('ID of the formatting function to apply to the Y Axis values'),
2774
- xAxisFormat: Joi.alternatives(Joi.string(), Joi.valid(null)).description('ID of the formatting function to apply to the X Axis values'),
2775
- approxYAxisLabelCount: approxAxisLabelCountSchema,
2776
- approxXAxisLabelCount: approxAxisLabelCountSchema
2777
- });
2778
- };
2779
- var lineCurveSchema = /*#__PURE__*/Joi.string().valid('natural', 'straight', 'step', 'stepBefore', 'stepAfter', 'dotted');
2780
- var areaCurveSchema = /*#__PURE__*/Joi.string().valid('natural', 'straight', 'step');
2781
- var protectedFieldsMeasure = function protectedFieldsMeasure(queryEngineConfig) {
2782
- var _Joi$string6;
2783
- return Joi.array().items(Joi.object({
2784
- "function": (_Joi$string6 = Joi.string()).valid.apply(_Joi$string6, Object.keys(queryEngineConfig.supportedAggregates).concat(Object.keys(queryEngineConfig.supportedTimeTruncFunctions), ['none'])),
2785
- field: Joi.string().required().description('The ID of the field from the data set to reference.')
2786
- }));
2787
- };
2788
- var protectedFieldsDimension = function protectedFieldsDimension(queryEngineConfig) {
2789
- var _Joi$string7;
2790
- return Joi.array().items(Joi.object({
2791
- "function": (_Joi$string7 = Joi.string()).valid.apply(_Joi$string7, Object.keys(queryEngineConfig.supportedAggregates).concat(Object.keys(queryEngineConfig.supportedTimeTruncFunctions), ['none'])),
2792
- truncate: Joi.string(),
2793
- field: Joi.string().required().description('The ID of the field from the data set to reference.'),
2794
- bucketFill: Joi["boolean"]().optional(),
2795
- pivot: Joi.string().valid('x', 'y').optional()
2796
- }));
2797
- };
2798
- var parameterGroupSchema = function parameterGroupSchema(queryEngineConfig, attributeSchemaOptions) {
2799
- return Joi.object().pattern(Joi.string(), Joi.alternatives()["try"](Joi.array().items(timeDimensionSchema(queryEngineConfig.supportedTimeTruncFunctions)).min(1), dimensionSchema(queryEngineConfig.supportedTimeTruncFunctions, attributeSchemaOptions))).unknown(true);
2800
- };
2801
- var parameterMeasureSchema = function parameterMeasureSchema(queryEngineConfig, attributeSchemaOptions) {
2802
- return Joi.object().pattern(Joi.string(), Joi.array().items(measureSchema(queryEngineConfig.supportedAggregates, attributeSchemaOptions)).min(1)).unknown(true);
2803
- };
2804
- var parametersSchema = function parametersSchema(queryEngineConfig, attributeSchemaOptions) {
2805
- return Joi.object({
2806
- measure: parameterMeasureSchema(queryEngineConfig, attributeSchemaOptions),
2807
- group: parameterGroupSchema(queryEngineConfig, attributeSchemaOptions)
2808
- });
2809
- };
2810
- var goalLineValueSchema = /*#__PURE__*/Joi.alternatives()["try"]( /*#__PURE__*/Joi.number().required(), /*#__PURE__*/Joi.string().pattern(/^\{\{.*\}\}$/).required());
2811
- var goalLineSchema = function goalLineSchema() {
2812
- return Joi.object({
2813
- color: Joi.string().required(),
2814
- value: goalLineValueSchema,
2815
- strokeWidth: Joi.number().required(),
2816
- strokeStyle: Joi.string().valid('dashed', 'solid').required(),
2817
- label: Joi["boolean"]().optional()
2818
- });
2819
- };
2820
- var goalLinesSchema = function goalLinesSchema() {
2821
- return Joi.array().items(goalLineSchema());
2822
- };
2823
- var headlineSchema = function headlineSchema() {
2824
- return Joi.object({
2825
- func: Joi.string().valid('mean', 'sum', 'current').allow(null).optional()
2826
- });
2827
- };
2828
- var axisTitleSchema = function axisTitleSchema() {
2829
- return Joi.object({
2830
- x: Joi.string().allow(''),
2831
- y: Joi.string().allow('')
2832
- });
2833
- };
2834
- var sizingSchema = /*#__PURE__*/Joi.object().pattern( /*#__PURE__*/Joi.string(), /*#__PURE__*/Joi.object({
2835
- width: /*#__PURE__*/Joi.number().min(0),
2836
- height: /*#__PURE__*/Joi.number().min(0)
2837
- }));
2838
- var joiDate = /*#__PURE__*/Joi.custom(function (value, helpers) {
2839
- if (Object.prototype.toString.call(value) === '[object Date]') {
2840
- return value;
2841
- }
2842
- return helpers.error('any.invalid');
2843
- }, 'Date object validation');
2844
-
2845
- var fieldSchema = /*#__PURE__*/Joi.object({
2846
- fieldId: /*#__PURE__*/Joi.string().required(),
2847
- dataSetId: /*#__PURE__*/Joi.string().required()
2848
- });
2849
- var optionsFiltersSchema = function optionsFiltersSchema(queryEngineConfig) {
2850
- return Joi.object().pattern(Joi.string(),
2851
- // keys of the object
2852
- Joi.array().items(filterSchema(queryEngineConfig)).optional());
2853
- };
2854
- var sharedAdditionalFilterSchema = function sharedAdditionalFilterSchema(queryEngineConfig) {
2855
- return {
2856
- title: Joi.string().allow(''),
2857
- managedByConfiguration: Joi["boolean"]().optional(),
2858
- requiresValue: Joi["boolean"]().optional(),
2859
- optionsFilters: optionsFiltersSchema(queryEngineConfig).optional(),
2860
- appliesToFields: Joi.array().items(fieldSchema).required(),
2861
- optionsPulledFrom: Joi.array().items(fieldSchema).optional(),
2862
- hidden: Joi["boolean"](),
2863
- options: Joi.array().items(Joi.object({
2864
- value: Joi.allow(Joi.number(), Joi.string()),
2865
- label: Joi.string()
2866
- })).optional()
2867
- };
2868
- };
2869
- var selectFilterSchema = function selectFilterSchema(queryEngineConfig, shouldAlwaysHaveValue) {
2870
- return Joi.object(_extends({}, sharedAdditionalFilterSchema(queryEngineConfig), {
2871
- type: Joi.valid(SINGLE_SELECT_FILTER).required(),
2872
- value: Joi.alternatives(Joi.string(), Joi.number(), Joi["boolean"](), Joi.valid.apply(Joi, shouldAlwaysHaveValue ? [] : [null]))
2873
- }));
2874
- };
2875
- var multiSelectFilterSchema = function multiSelectFilterSchema(queryEngineConfig, shouldAlwaysHaveValue) {
2876
- return Joi.object(_extends({}, sharedAdditionalFilterSchema(queryEngineConfig), {
2877
- type: Joi.valid(MULTI_SELECT_FILTER).required(),
2878
- 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))))
2879
- }));
2880
- };
2881
- var advancedFilterSchema = function advancedFilterSchema(queryEngineConfig, shouldAlwaysHaveValue) {
2882
- return Joi.object(_extends({}, sharedAdditionalFilterSchema(queryEngineConfig), {
2883
- type: Joi.valid(ADVANCED_FILTER).required(),
2884
- value: advancedFilterValueSchema(queryEngineConfig, shouldAlwaysHaveValue)
2885
- }));
2886
- };
2887
- var advancedFilterValueSchema = function advancedFilterValueSchema(queryEngineConfig, shouldAlwaysHaveValue) {
2888
- return Joi.alternatives(Joi.valid.apply(Joi, shouldAlwaysHaveValue ? [] : [null]), Joi.array().items(Joi.array().items(filterSchema(queryEngineConfig))));
2889
- };
2890
- var dateTimeFilterSchema = function dateTimeFilterSchema(queryEngineConfig, shouldAlwaysHaveValue, type) {
2891
- return Joi.object(_extends({}, sharedAdditionalFilterSchema(queryEngineConfig), {
2892
- type: Joi.valid(type).required(),
2893
- inclusiveDate: Joi["boolean"]().optional(),
2894
- allowTimeSelection: Joi["boolean"]().optional(),
2895
- value: Joi.alternatives(Joi.valid.apply(Joi, shouldAlwaysHaveValue ? [] : [null]), Joi.object({
2896
- type: Joi.valid('fixedRange'),
2897
- before: Joi.alternatives(Joi.date()).required(),
2898
- after: Joi.alternatives(Joi.date()).required()
2899
- }), Joi.object({
2900
- type: Joi.valid('relative'),
2901
- value: Joi.string()
2902
- }), Joi.object({
2903
- type: Joi.valid('relativeRange'),
2904
- filters: Joi.array()
2905
- }))
2906
- }));
2907
- };
2908
- var numberFilterSchema = function numberFilterSchema(queryEngineConfig, shouldAlwaysHaveValue) {
2909
- return Joi.object(_extends({}, sharedAdditionalFilterSchema(queryEngineConfig), {
2910
- type: Joi.valid(NUMERIC_FILTER).required(),
2911
- value: Joi.alternatives(Joi.object({
2912
- op: Joi.allow('=', '<', '>', '<=', '>='),
2913
- value: Joi.number().allow(null, 0)
2914
- }), Joi.array().items(Joi.array().items(filterSchema(queryEngineConfig))), Joi.valid.apply(Joi, shouldAlwaysHaveValue ? [] : [null]))
2915
- }));
2916
- };
2917
- var additionalFilterSchema = function additionalFilterSchema(queryEngineConfig, shouldAlwaysHaveValue) {
2918
- return Joi.alternatives().conditional('.type', {
2919
- is: SINGLE_SELECT_FILTER,
2920
- then: selectFilterSchema(queryEngineConfig, shouldAlwaysHaveValue)
2921
- }).conditional('.type', {
2922
- is: DATE_FILTER,
2923
- then: dateTimeFilterSchema(queryEngineConfig, shouldAlwaysHaveValue, DATE_FILTER)
2924
- }).conditional('.type', {
2925
- is: DATE_AND_TIME_FILTER,
2926
- then: dateTimeFilterSchema(queryEngineConfig, shouldAlwaysHaveValue, DATE_AND_TIME_FILTER)
2927
- }).conditional('.type', {
2928
- is: MULTI_SELECT_FILTER,
2929
- then: multiSelectFilterSchema(queryEngineConfig, shouldAlwaysHaveValue)
2930
- }).conditional('.type', {
2931
- is: NUMERIC_FILTER,
2932
- then: numberFilterSchema(queryEngineConfig, shouldAlwaysHaveValue)
2933
- }).conditional('.type', {
2934
- is: ADVANCED_FILTER,
2935
- then: advancedFilterSchema(queryEngineConfig, shouldAlwaysHaveValue)
2936
- });
2937
- };
2938
- function globalFilterSchema(queryEngineConfig) {
2939
- return Joi.array().items(Joi.custom(function (value, helpers) {
2940
- if (!queryEngineConfig) {
2941
- return helpers.error('any.invalid');
2942
- }
2943
- var schema = additionalFilterSchema(queryEngineConfig, !!value.requiresValue);
2944
- var _schema$validate = schema.validate(value),
2945
- error = _schema$validate.error;
2946
- if (error) {
2947
- return helpers.error('any.invalid', {
2948
- message: error.message
2949
- });
2950
- }
2951
- return value;
2952
- })).required();
2953
- }
2954
-
2955
- var Clause = /*#__PURE__*/function (Clause) {
2956
- Clause["AND_WHERE"] = "andWhere";
2957
- Clause["OR_WHERE"] = "orWhere";
2958
- Clause["WHERE"] = "where";
2959
- return Clause;
2960
- }({});
2961
-
2962
- // export type WhereClause = SqlAST.MultiWhereToken<any>;
2963
-
2964
- var filterConfigToWhere = function filterConfigToWhere(dataSet, queryEngineConfig, params) {
2965
- if (!params) return undefined;
2966
- var filterConfig = params.filterConfig;
2967
- 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) {
2968
- return arr.length === 0;
2969
- }))) {
2970
- return undefined;
2971
- }
2972
- var dash = buildAndWhere(dataSet, queryEngineConfig, params, filterConfig.globalFilters);
2973
- var local = buildAndWhere(dataSet, queryEngineConfig, params, filterConfig.localFilters);
2974
- var advancedFilters = buildFromFiltersArray(dataSet, queryEngineConfig, params, filterConfig.advancedFilter);
2975
- var combinedAndWhere = [dash, local, advancedFilters].filter(Boolean).filter(function (whereClause) {
2976
- return whereClause && whereClause.value.length > 0;
2977
- });
2978
- if (combinedAndWhere.length === 0) return undefined;
2979
- return {
2980
- type: Clause.AND_WHERE,
2981
- value: combinedAndWhere
2982
- };
2983
- };
2984
- var buildAndWhere = function buildAndWhere(dataSet, queryEngineConfig, params, additionalFilters) {
2985
- if (!additionalFilters || additionalFilters.length === 0) return undefined;
2986
- var whereClauses = [];
2987
- additionalFilters.forEach(function (additionalFilter) {
2988
- if (additionalFilter.type === DATE_AND_TIME_FILTER || additionalFilter.type === DATE_FILTER) {
2989
- toRelativeQueryAttributesFilters(additionalFilter, dataSet).forEach(function (f) {
2990
- whereClauses.push(buildWhereFromSingleFilter(dataSet, f, queryEngineConfig, params));
2991
- });
2992
- }
2993
- if (Array.isArray(additionalFilter.value) && additionalFilter.value.length > 1 && isAdditionalFilter(additionalFilter.value)) {
2994
- additionalFilter.appliesToFields.flatMap(function (field) {
2995
- if (field.dataSetId != dataSet.id) return [];
2996
- var convertedToWhere = buildFromFiltersArray(dataSet, queryEngineConfig, params, additionalFilter.value);
2997
- if (convertedToWhere) {
2998
- whereClauses.push(convertedToWhere);
2999
- }
3000
- return;
3001
- });
3002
- } else {
3003
- toQueryAttributesFilter(dataSet, additionalFilter, params.timeRangeOptions).forEach(function (f) {
3004
- whereClauses.push(buildWhereFromSingleFilter(dataSet, f, queryEngineConfig, params));
3005
- });
3006
- }
3007
- });
3008
- return {
3009
- type: Clause.AND_WHERE,
3010
- value: whereClauses
3011
- };
3012
- };
3013
- var buildWhereFromSingleFilter = function buildWhereFromSingleFilter(dataSet, f, queryEngineConfig, params) {
3014
- var field;
3015
- if (f["function"] && !isSupportedTimeTruncFunction(queryEngineConfig.supportedTimeTruncFunctions, f["function"])) {
3016
- throw "Query engine does not support the query function " + f["function"] + ".";
3017
- }
3018
- var dataSetField = findField(dataSet, f.field);
3019
- if (isCustomField(dataSetField)) {
3020
- var _f$function;
3021
- field = toQueryMeasure({
3022
- field: dataSetField.id,
3023
- "function": (_f$function = f["function"]) != null ? _f$function : 'none'
3024
- }, dataSetField, queryEngineConfig, dataSet, false, params);
3025
- } else {
3026
- var _decodedField$functio;
3027
- var decodedField = decodeId(f.field, queryEngineConfig);
3028
- field = {
3029
- type: 'field',
3030
- value: decodedField.field,
3031
- "function": (_decodedField$functio = decodedField["function"]) != null ? _decodedField$functio : 'none'
3032
- };
3033
- }
3034
- if ((f.op == 'array_contains' || f.op == 'array_does_not_contain') && Array.isArray(f.value)) {
3035
- return arrayContainsFilters(f, dataSet, queryEngineConfig, params);
3036
- }
3037
- var value = useValue(f.value, params.variables);
3038
- if (isRelativeDateDefined(f.value)) {
3039
- value = calculateRelativeDate(f.value);
3040
- }
3041
- if (filterIsDate(f)) {
3042
- value = getUTCDate(f.value);
3043
- }
3044
- return {
3045
- type: Clause.WHERE,
3046
- value: {
3047
- op: f.op,
3048
- value: value,
3049
- field: field
3050
- }
3051
- };
3052
- };
3053
- var buildFromFiltersArray = function buildFromFiltersArray(dataSet, queryEngineConfig, params, filters) {
3054
- if (!filters || filters.length === 0 || filters.every(function (arr) {
3055
- return arr.length === 0;
3056
- })) {
3057
- return undefined;
3058
- }
3059
- if (filters.length === 1) return buildFromFilters(filters[0], dataSet, queryEngineConfig, params);
3060
- return {
3061
- type: Clause.OR_WHERE,
3062
- value: filters.map(function (filter) {
3063
- return buildFromFilters(filter, dataSet, queryEngineConfig, params);
3064
- })
3065
- };
3066
- };
3067
- var buildFromFilters = function buildFromFilters(filter, dataSet, queryEngineConfig, params) {
3068
- return {
3069
- type: Clause.AND_WHERE,
3070
- value: filter.map(function (filter) {
3071
- if ((filter.op == 'array_contains' || filter.op == 'array_does_not_contain') && Array.isArray(filter.value)) {
3072
- return arrayContainsFilters(filter, dataSet, queryEngineConfig, params);
3073
- }
3074
- return buildWhereFromSingleFilter(dataSet, filter, queryEngineConfig, params);
3075
- })
3076
- };
3077
- };
3078
- var arrayContainsFilters = function arrayContainsFilters(filter, dataSet, queryEngineConfig, params) {
3079
- return {
3080
- type: Clause.AND_WHERE,
3081
- value: [].concat(filter.value).map(function (value) {
3082
- return buildWhereFromSingleFilter(dataSet, _extends({}, filter, {
3083
- value: value
3084
- }), queryEngineConfig, params);
3085
- })
3086
- };
3087
- };
3088
-
3089
- var addMeasure = function addMeasure(current, toAdd) {
3090
- return [[].concat(current, [toAdd]), current.length];
3091
- };
3092
- var buildFromQueryAttributes = function buildFromQueryAttributes(dataSet, measureAttr, orderAttr, dimensionAttr, timeDimensionAttr, limitAttr, offsetAttr, queryEngineConfig, params, prebuiltFilters) {
3093
- var measureDescription = [];
3094
- var measure = [];
3095
- var group = [];
3096
- var order = [];
3097
- var filters = buildFilters(dataSet, queryEngineConfig, params, prebuiltFilters);
3098
- if (timeDimensionAttr) {
3099
- // Add the measure for the time field.
3100
- var addedAt = undefined;
3101
-
3102
- // Stop unsupported time trunc functions being used.
3103
- if (!isSupportedTimeTruncFunction(queryEngineConfig.supportedTimeTruncFunctions, timeDimensionAttr.truncate)) {
3104
- throw "Query engine does not support the time trunc function " + timeDimensionAttr.truncate + ".";
3105
- }
3106
- var _addMeasure = addMeasure(measure, {
3107
- type: 'field',
3108
- value: timeDimensionAttr.field,
3109
- "function": timeDimensionAttr.truncate
3110
- });
3111
- measure = _addMeasure[0];
3112
- addedAt = _addMeasure[1];
3113
- measureDescription = [].concat(measureDescription, [{
3114
- functionId: timeDimensionAttr.truncate,
3115
- field: findField(dataSet, timeDimensionAttr.field)
3116
- }]);
3117
- group = [].concat(group, [{
3118
- index: addedAt
3119
- }]);
3120
- }
3121
- dimensionAttr.forEach(function (dimension) {
3122
- // Add the measure for the time field.
3123
- var addedAt = undefined;
3124
- var _addMeasure2 = addMeasure(measure, {
3125
- type: 'field',
3126
- value: dimension == null ? void 0 : dimension.field,
3127
- "function": dimension["function"]
3128
- });
3129
- measure = _addMeasure2[0];
3130
- addedAt = _addMeasure2[1];
3131
- measureDescription = [].concat(measureDescription, [{
3132
- functionId: dimension["function"],
3133
- field: findField(dataSet, dimension.field)
3134
- }]);
3135
- group = [].concat(group, [{
3136
- index: addedAt
3137
- }]);
3138
- });
3139
- measureAttr.forEach(function (individualMeasure) {
3140
- // Stop unsupported aggregate functions being used.
3141
- if (!isSupportedAggregateFunction(queryEngineConfig.supportedAggregates, individualMeasure["function"])) {
3142
- throw "Query engine does not support the query function " + individualMeasure["function"] + ".";
3143
- }
3144
- var _addMeasure3 = addMeasure(measure, {
3145
- type: 'field',
3146
- value: individualMeasure.field,
3147
- "function": individualMeasure["function"]
3148
- });
3149
- measure = _addMeasure3[0];
3150
- measureDescription = [].concat(measureDescription, [{
3151
- functionId: individualMeasure["function"],
3152
- field: findField(dataSet, individualMeasure.field)
3153
- }]);
3154
- });
3155
- orderAttr.forEach(function (apiQueryOrderItem) {
3156
- var index = measure.findIndex(function (individualMeasure) {
3157
- if (individualMeasure.type == 'field') {
3158
- var sameFunction = individualMeasure["function"] == apiQueryOrderItem["function"];
3159
- // const isTimeFunc = Object.keys(queryEngineConfig.supportedTimeTruncFunctions).includes(
3160
- // individualMeasure.function
3161
- // );
3162
- var sameField = individualMeasure.value == apiQueryOrderItem.field;
3163
- return sameField && sameFunction;
3164
-
3165
- // return found;
3166
- }
3167
- return false;
3168
- });
3169
- if (index >= 0) {
3170
- order = [].concat(order, [{
3171
- index: index,
3172
- direction: apiQueryOrderItem.direction
3173
- }]);
3174
- }
3175
- });
3176
- measure = measure.map(function (measure) {
3177
- if (measure.type == 'field' && typeof measure.value == 'string') {
3178
- var dataSetField = findField(dataSet, measure.value);
3179
- if (isCustomField(dataSetField)) {
3180
- var customMeasure = toQueryMeasure({
3181
- "function": measure["function"],
3182
- field: measure.value
3183
- }, dataSetField, queryEngineConfig, dataSet, hasDimensions({
3184
- group: group
3185
- }), params);
3186
- return customMeasure;
3187
- }
3188
- }
3189
- return measure;
3190
- });
3191
- return {
3192
- query: {
3193
- type: 'query',
3194
- dataSetId: dataSet.id,
3195
- measure: measure,
3196
- group: group,
3197
- // TODO: Fix this type
3198
- filter: filters,
3199
- order: order,
3200
- limit: limitAttr,
3201
- offset: offsetAttr
3202
- },
3203
- measureDescription: measureDescription
3204
- };
3205
- };
3206
- var buildFilters = function buildFilters(dataSet, queryEngineConfig, params, prebuiltFilters) {
3207
- if (prebuiltFilters && prebuiltFilters.length > 0) {
3208
- var filter = [];
3209
- prebuiltFilters.forEach(function (andFilters) {
3210
- var newAndFilters = filterAttributeToQueryFilter([andFilters], queryEngineConfig, dataSet, params);
3211
- filter = [].concat(filter, [newAndFilters[0]]);
3212
- });
3213
- return filter;
3214
- }
3215
- var whereClause = filterConfigToWhere(dataSet, queryEngineConfig, params);
3216
- if (whereClause) return whereClause;
3217
- return [];
3218
- };
3219
-
3220
- var build$a = buildFromQueryAttributes;
3221
- var hasDimensions = function hasDimensions(query) {
3222
- return query.group.length > 0;
3223
- };
3224
- var buildPreAggregatedPreparedQuery = function buildPreAggregatedPreparedQuery(query, dataSet) {
3225
- return {
3226
- query: query,
3227
- resultFields: dataSet.fields.map(function (field) {
3228
- return {
3229
- id: field.id,
3230
- publicName: field.publicName,
3231
- dataType: field.dataType,
3232
- fieldId: field.id,
3233
- "function": 'none',
3234
- outputDataType: field.dataType
3235
- };
3236
- })
3237
- };
3238
- };
3239
- var buildUniqueArrayValuesPreparedQuery = function buildUniqueArrayValuesPreparedQuery(dataSetId, dataSetField, optionsFilters) {
3240
- return {
3241
- query: {
3242
- type: 'preparedQuery',
3243
- preparedQueryType: 'uniqueArrayValues',
3244
- dataSetId: dataSetId,
3245
- fieldId: dataSetField.id,
3246
- filter: optionsFilters || []
3247
- },
3248
- resultFields: [{
3249
- id: dataSetField.id,
3250
- publicName: dataSetField.publicName,
3251
- dataType: dataSetField.dataType,
3252
- fieldId: dataSetField.id,
3253
- "function": 'none',
3254
- outputDataType: 'string'
3255
- }]
3256
- };
3257
- };
3258
- var buildFilterQuery = function buildFilterQuery(dataSet, fieldId, optionsFilters, optionsOrders) {
3259
- var measure = [{
3260
- field: fieldId,
3261
- "function": 'count'
3262
- }];
3263
- var order = optionsOrders != null ? optionsOrders : [];
3264
- var filter = optionsFilters ? [optionsFilters] : [];
3265
- var dimension = [{
3266
- field: fieldId,
3267
- "function": 'none'
3268
- }];
3269
- var timeDimension = null;
3270
- var limit = 5000;
3271
- return {
3272
- dataSetId: dataSet.id,
3273
- measure: measure,
3274
- order: order,
3275
- filter: filter,
3276
- dimension: dimension,
3277
- timeDimension: timeDimension,
3278
- limit: limit,
3279
- offset: 0
3280
- };
3281
- };
3282
- var supportsFeature = function supportsFeature(queryEngineConfig, feature) {
3283
- return queryEngineConfig.supportedFeatures.includes(feature);
3284
- };
3285
- var toDataSetDashboardFilters = function toDataSetDashboardFilters(dataSets, additionalFilters, dateFilterOptions) {
3286
- var dashboardFilters = {};
3287
- dataSets.forEach(function (dataSet) {
3288
- var filtered = additionalFilters.filter(function (filter) {
3289
- return filter.appliesToFields.find(function (field) {
3290
- return field.dataSetId === dataSet.id;
3291
- });
3292
- }).map(function (filter) {
3293
- return toQueryAttributesFilter(dataSet, filter, dateFilterOptions);
3294
- });
3295
- dashboardFilters[dataSet.id] = filtered;
3296
- });
3297
- return dashboardFilters;
3298
- };
3299
- function addGlobalFiltersToQueries(queries, dashboardFilters) {
3300
- var enhancedQueries = queries;
3301
- if (dashboardFilters) {
3302
- enhancedQueries.map(function (query) {
3303
- var flattenedFilters = dashboardFilters[query.dataSetId].flat();
3304
- if (flattenedFilters.length === 0) return;
3305
- query.filter.push(flattenedFilters);
3306
- return;
3307
- });
3308
- }
3309
- return enhancedQueries;
3310
- }
3311
-
3312
- var FieldNotFoundInDataSet = /*#__PURE__*/function (_ValidationError) {
3313
- function FieldNotFoundInDataSet(dataSet, missingFieldId) {
3314
- var _this;
3315
- _this = _ValidationError.call(this, "\n An expected field is missing from a dataSet.\n\n Missing '" + missingFieldId + "'. Got;\n " + JSON.stringify(dataSet) + "\n ") || this;
3316
- _this.missingFieldId = void 0;
3317
- _this.name = 'FieldNotFoundInDataSet';
3318
- _this.missingFieldId = missingFieldId;
3319
- return _this;
3320
- }
3321
- _inheritsLoose(FieldNotFoundInDataSet, _ValidationError);
3322
- var _proto = FieldNotFoundInDataSet.prototype;
3323
- _proto.getMissingFieldId = function getMissingFieldId() {
3324
- return this.missingFieldId;
3325
- };
3326
- return FieldNotFoundInDataSet;
3327
- }(ValidationError);
3328
-
3329
2643
  var _doMerge = function doMerge(a, b) {
3330
2644
  return _.mergeWith({}, a, b, function (objValue, srcValue) {
3331
2645
  if (_.isArray(srcValue)) return srcValue;
@@ -3502,6 +2816,186 @@ var setAttributes = function setAttributes(attributes, partialAttributes, schema
3502
2816
  return validAttributes;
3503
2817
  };
3504
2818
 
2819
+ var tagSchema = function tagSchema() {
2820
+ return Joi.object({
2821
+ key: Joi.string().required()
2822
+ });
2823
+ };
2824
+ var tagsSchema = function tagsSchema() {
2825
+ return Joi.array().items(tagSchema()).min(0);
2826
+ };
2827
+
2828
+ var measureSchema = function measureSchema(supportedAggregates, attributeSchemaOptions) {
2829
+ var buildMeasureJoi = function buildMeasureJoi(fieldJoi, functionJoi) {
2830
+ return Joi.object({
2831
+ field: fieldJoi.required(),
2832
+ "function": functionJoi.required().description('Which if any, aggregate function should be applied to the field?')
2833
+ });
2834
+ };
2835
+
2836
+ // Return an enum using the restriction fields
2837
+ if (attributeSchemaOptions != null && attributeSchemaOptions.restrictFields) {
2838
+ return Joi.alternatives.apply(Joi, attributeSchemaOptions.restrictFields.filter(function (f) {
2839
+ return f.canBeMeasure;
2840
+ }).map(function (restrictedField) {
2841
+ var _Joi$string;
2842
+ var supportedFunctionsForField = listValidFunctionsForDataType(restrictedField, supportedAggregates);
2843
+ return buildMeasureJoi(Joi.string().valid(restrictedField.id).description(restrictedField.publicName + ", " + (restrictedField.description || '') + "."), (_Joi$string = Joi.string()).valid.apply(_Joi$string, supportedFunctionsForField.concat(['none'])));
2844
+ }));
2845
+ }
2846
+ 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'])));
2847
+ };
2848
+ var orderSchema = function orderSchema(queryEngineConfig) {
2849
+ var _Joi$string2;
2850
+ return Joi.object({
2851
+ field: Joi.string().required().description('The ID of the field from the data set to reference.'),
2852
+ direction: Joi.string().valid('asc', 'desc').required().description('In which direction should the results be ordered?'),
2853
+ "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?')
2854
+ });
2855
+ };
2856
+ var timeDimensionSchema = function timeDimensionSchema(supportedTimeTruncFunctions) {
2857
+ return Joi.object({
2858
+ field: Joi.string().required().description('The ID of the field from the data set to reference.'),
2859
+ truncate: Joi.valid.apply(Joi, Object.keys(supportedTimeTruncFunctions).concat(['none'])),
2860
+ bucketFill: Joi["boolean"]()
2861
+ });
2862
+ };
2863
+ var dimensionSchema = function dimensionSchema(supportedTimeTruncFunctions, attributeSchemaOptions) {
2864
+ var buildDimensionJoi = function buildDimensionJoi(fieldJoi, isDate) {
2865
+ return Joi.object({
2866
+ field: fieldJoi.required(),
2867
+ pivot: Joi.string().valid('x', 'y').optional(),
2868
+ "function": isDate ? Joi.valid.apply(Joi, Object.keys(supportedTimeTruncFunctions).concat(['none'])).required() : Joi.valid('none').required()
2869
+ });
2870
+ };
2871
+
2872
+ // Return an enum using the restriction fields
2873
+ if (attributeSchemaOptions != null && attributeSchemaOptions.restrictFields) {
2874
+ return Joi.array().items(Joi.alternatives.apply(Joi, attributeSchemaOptions.restrictFields.filter(function (f) {
2875
+ return f.canBeDimension;
2876
+ }).map(function (restrictedField) {
2877
+ return buildDimensionJoi(Joi.string().valid(restrictedField.id).description(restrictedField.publicName + ", " + (restrictedField.description || '') + "."), restrictedField.dataType === 'date_time');
2878
+ }))).description('Fields to group the data by');
2879
+ }
2880
+ 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');
2881
+ };
2882
+ var filterSchema = function filterSchema(queryEngineConfig) {
2883
+ var _Joi$string3, _Joi$string4;
2884
+ return Joi.object({
2885
+ field: Joi.string().required().description('The ID of the field from the data set to reference.'),
2886
+ op: (_Joi$string3 = Joi.string()).valid.apply(_Joi$string3, Object.keys(queryEngineConfig.supportedOperators)).required(),
2887
+ 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(),
2888
+ "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?')
2889
+ });
2890
+ };
2891
+ var queryAttributesFilter = function queryAttributesFilter(queryEngineConfig) {
2892
+ return Joi.array().items(Joi.array().items(filterSchema(queryEngineConfig)));
2893
+ };
2894
+ var queryAttributesLimit = function queryAttributesLimit() {
2895
+ return Joi.number().description('Limit the number of results returned after the query has been ran.');
2896
+ };
2897
+ var baseAttributesSchema = function baseAttributesSchema(attributeSchemaOptions) {
2898
+ var _Joi$string5;
2899
+ var dataSetIdSchema = attributeSchemaOptions != null && attributeSchemaOptions.restrictDataSetIds ? (_Joi$string5 = Joi.string()).valid.apply(_Joi$string5, attributeSchemaOptions.restrictDataSetIds) : Joi.string();
2900
+ return {
2901
+ viewId: Joi.string().allow('').optional().description('__vizzly_hide_from_docs'),
2902
+ displayTitle: Joi.string().allow('').description('A title that explains what is being displayed.'),
2903
+ displaySubject: Joi.string().allow('').description('A chance to add a more detailed description of what is being shown.'),
2904
+ dataSetId: dataSetIdSchema.description('The ID of the data set that is being used by the view.'),
2905
+ protectedByOrganisation: Joi["boolean"]().optional().description('Has the view been created by your organisation, and therefore cannot be modified by your users?')
2906
+ };
2907
+ };
2908
+ var approxAxisLabelCountSchema = /*#__PURE__*/Joi.valid('auto', 2, 0).description('Determine how many axis labels should be shown on the axis');
2909
+ var querySchema = function querySchema(queryEngineConfig, attributeSchemaOptions) {
2910
+ return {
2911
+ 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.'),
2912
+ dimension: dimensionSchema(queryEngineConfig.supportedTimeTruncFunctions, attributeSchemaOptions).required(),
2913
+ order: Joi.array().items(orderSchema(queryEngineConfig)),
2914
+ limit: queryAttributesLimit(),
2915
+ offset: Joi.number().min(0).description('Paginate results by using this property with limit.')
2916
+ };
2917
+ };
2918
+ var timeDimensionQuerySchema = function timeDimensionQuerySchema(queryEngineConfig, attributeSchemaOptions) {
2919
+ return _extends({}, querySchema(queryEngineConfig, attributeSchemaOptions), {
2920
+ filter: Joi.array().items(Joi.array().items(filterSchema(queryEngineConfig))),
2921
+ timeDimension: Joi.alternatives(timeDimensionSchema(queryEngineConfig.supportedTimeTruncFunctions), Joi.valid(null)).required(),
2922
+ drilldown: Joi.alternatives(dimensionSchema(queryEngineConfig.supportedTimeTruncFunctions, attributeSchemaOptions).required(), Joi.string()),
2923
+ xAxisPrefix: Joi.string().allow('').description('Add a prefix to the X Axis'),
2924
+ yAxisPrefix: Joi.string().allow('').description('Add a prefix to the Y Axis'),
2925
+ xAxisPostfix: Joi.string().allow('').description('Add a postfix to the X Axis'),
2926
+ yAxisPostfix: Joi.string().allow('').description('Add a postfix to the Y Axis'),
2927
+ yAxisFormat: Joi.alternatives(Joi.string(), Joi.valid(null)).description('ID of the formatting function to apply to the Y Axis values'),
2928
+ xAxisFormat: Joi.alternatives(Joi.string(), Joi.valid(null)).description('ID of the formatting function to apply to the X Axis values'),
2929
+ approxYAxisLabelCount: approxAxisLabelCountSchema,
2930
+ approxXAxisLabelCount: approxAxisLabelCountSchema
2931
+ });
2932
+ };
2933
+ var lineCurveSchema = /*#__PURE__*/Joi.string().valid('natural', 'straight', 'step', 'stepBefore', 'stepAfter', 'dotted');
2934
+ var areaCurveSchema = /*#__PURE__*/Joi.string().valid('natural', 'straight', 'step');
2935
+ var protectedFieldsMeasure = function protectedFieldsMeasure(queryEngineConfig) {
2936
+ var _Joi$string6;
2937
+ return Joi.array().items(Joi.object({
2938
+ "function": (_Joi$string6 = Joi.string()).valid.apply(_Joi$string6, Object.keys(queryEngineConfig.supportedAggregates).concat(Object.keys(queryEngineConfig.supportedTimeTruncFunctions), ['none'])),
2939
+ field: Joi.string().required().description('The ID of the field from the data set to reference.')
2940
+ }));
2941
+ };
2942
+ var protectedFieldsDimension = function protectedFieldsDimension(queryEngineConfig) {
2943
+ var _Joi$string7;
2944
+ return Joi.array().items(Joi.object({
2945
+ "function": (_Joi$string7 = Joi.string()).valid.apply(_Joi$string7, Object.keys(queryEngineConfig.supportedAggregates).concat(Object.keys(queryEngineConfig.supportedTimeTruncFunctions), ['none'])),
2946
+ truncate: Joi.string(),
2947
+ field: Joi.string().required().description('The ID of the field from the data set to reference.'),
2948
+ bucketFill: Joi["boolean"]().optional(),
2949
+ pivot: Joi.string().valid('x', 'y').optional()
2950
+ }));
2951
+ };
2952
+ var parameterGroupSchema = function parameterGroupSchema(queryEngineConfig, attributeSchemaOptions) {
2953
+ return Joi.object().pattern(Joi.string(), Joi.alternatives()["try"](Joi.array().items(timeDimensionSchema(queryEngineConfig.supportedTimeTruncFunctions)).min(1), dimensionSchema(queryEngineConfig.supportedTimeTruncFunctions, attributeSchemaOptions))).unknown(true);
2954
+ };
2955
+ var parameterMeasureSchema = function parameterMeasureSchema(queryEngineConfig, attributeSchemaOptions) {
2956
+ return Joi.object().pattern(Joi.string(), Joi.array().items(measureSchema(queryEngineConfig.supportedAggregates, attributeSchemaOptions)).min(1)).unknown(true);
2957
+ };
2958
+ var parametersSchema = function parametersSchema(queryEngineConfig, attributeSchemaOptions) {
2959
+ return Joi.object({
2960
+ measure: parameterMeasureSchema(queryEngineConfig, attributeSchemaOptions),
2961
+ group: parameterGroupSchema(queryEngineConfig, attributeSchemaOptions)
2962
+ });
2963
+ };
2964
+ var goalLineValueSchema = /*#__PURE__*/Joi.alternatives()["try"]( /*#__PURE__*/Joi.number().required(), /*#__PURE__*/Joi.string().pattern(/^\{\{.*\}\}$/).required());
2965
+ var goalLineSchema = function goalLineSchema() {
2966
+ return Joi.object({
2967
+ color: Joi.string().required(),
2968
+ value: goalLineValueSchema,
2969
+ strokeWidth: Joi.number().required(),
2970
+ strokeStyle: Joi.string().valid('dashed', 'solid').required(),
2971
+ label: Joi["boolean"]().optional()
2972
+ });
2973
+ };
2974
+ var goalLinesSchema = function goalLinesSchema() {
2975
+ return Joi.array().items(goalLineSchema());
2976
+ };
2977
+ var headlineSchema = function headlineSchema() {
2978
+ return Joi.object({
2979
+ func: Joi.string().valid('mean', 'sum', 'current').allow(null).optional()
2980
+ });
2981
+ };
2982
+ var axisTitleSchema = function axisTitleSchema() {
2983
+ return Joi.object({
2984
+ x: Joi.string().allow(''),
2985
+ y: Joi.string().allow('')
2986
+ });
2987
+ };
2988
+ var sizingSchema = /*#__PURE__*/Joi.object().pattern( /*#__PURE__*/Joi.string(), /*#__PURE__*/Joi.object({
2989
+ width: /*#__PURE__*/Joi.number().min(0),
2990
+ height: /*#__PURE__*/Joi.number().min(0)
2991
+ }));
2992
+ var joiDate = /*#__PURE__*/Joi.custom(function (value, helpers) {
2993
+ if (Object.prototype.toString.call(value) === '[object Date]') {
2994
+ return value;
2995
+ }
2996
+ return helpers.error('any.invalid');
2997
+ }, 'Date object validation');
2998
+
3505
2999
  var conditionalFormattingRuleSchema = function conditionalFormattingRuleSchema(queryEngineConfig) {
3506
3000
  return Joi.object({
3507
3001
  filters: Joi.array().items(Joi.array().items(filterSchema(queryEngineConfig)).required().max(1)).required().max(1),
@@ -14884,7 +14378,7 @@ var Code = function Code(_ref12) {
14884
14378
  }));
14885
14379
  };
14886
14380
 
14887
- var supportsFeature$1 = function supportsFeature(queryEngineConfig, feature) {
14381
+ var supportsFeature = function supportsFeature(queryEngineConfig, feature) {
14888
14382
  return [].concat(queryEngineConfig.supportedFeatures).includes(feature);
14889
14383
  };
14890
14384
 
@@ -14964,7 +14458,7 @@ var END_USER_DEFAULT_FEATURE_TOGGLES = {
14964
14458
  showSavingIndicator: true,
14965
14459
  disablePersistingGlobalFiltersLocally: false
14966
14460
  };
14967
- var build$b = function build(partialFeatureToggles, queryEngineConfig, mode, scope) {
14461
+ var build$a = function build(partialFeatureToggles, queryEngineConfig, mode, scope) {
14968
14462
  var featureToggles = {};
14969
14463
  featureToggles = _extends({}, END_USER_DEFAULT_FEATURE_TOGGLES, featureToggles, partialFeatureToggles);
14970
14464
  if (mode == 'admin') {
@@ -14988,22 +14482,22 @@ var build$b = function build(partialFeatureToggles, queryEngineConfig, mode, sco
14988
14482
  featureToggles.showSavingIndicator = false;
14989
14483
  featureToggles.disablePersistingGlobalFiltersLocally = (_featureToggles$disab = featureToggles.disablePersistingGlobalFiltersLocally) != null ? _featureToggles$disab : false;
14990
14484
  }
14991
- if (!supportsFeature$1(queryEngineConfig, 'simpleMaths')) {
14485
+ if (!supportsFeature(queryEngineConfig, 'simpleMaths')) {
14992
14486
  featureToggles.allowSimpleMathsCustomField = false;
14993
14487
  }
14994
- if (!supportsFeature$1(queryEngineConfig, 'aggregateMaths')) {
14488
+ if (!supportsFeature(queryEngineConfig, 'aggregateMaths')) {
14995
14489
  featureToggles.allowAggregateMathsCustomField = false;
14996
14490
  }
14997
- if (!supportsFeature$1(queryEngineConfig, 'subquery')) {
14491
+ if (!supportsFeature(queryEngineConfig, 'subquery')) {
14998
14492
  featureToggles.allowPercentagesCustomField = false;
14999
14493
  }
15000
- if (!supportsFeature$1(queryEngineConfig, 'switchField')) {
14494
+ if (!supportsFeature(queryEngineConfig, 'switchField')) {
15001
14495
  featureToggles.allowRulesCustomField = false;
15002
14496
  }
15003
- if (!supportsFeature$1(queryEngineConfig, 'roundedNumbers')) {
14497
+ if (!supportsFeature(queryEngineConfig, 'roundedNumbers')) {
15004
14498
  featureToggles.allowRoundedNumberCustomField = false;
15005
14499
  }
15006
- if (!supportsFeature$1(queryEngineConfig, 'dateMaths')) {
14500
+ if (!supportsFeature(queryEngineConfig, 'dateMaths')) {
15007
14501
  featureToggles.allowDateCalculationsCustomField = false;
15008
14502
  }
15009
14503
  if (featureToggles.forceMobile) {
@@ -15058,6 +14552,155 @@ var removeField$3 = function removeField(component, fieldId) {
15058
14552
  return newComponent;
15059
14553
  };
15060
14554
 
14555
+ var groupFilters = function groupFilters(dataSets) {
14556
+ var groups = {};
14557
+ dataSets.forEach(function (dataSet) {
14558
+ if (dataSet && dataSet.fields) {
14559
+ dataSet.fields.forEach(function (dataSetField) {
14560
+ (dataSetField.dashboardRequiredFilterGroups || []).forEach(function (filterGroup) {
14561
+ var key = filterGroup.publicName + " - " + dataSetField.dataType;
14562
+ groups[key] = [].concat(groups[key] || [], [{
14563
+ publicName: filterGroup.publicName,
14564
+ dataSetField: dataSetField,
14565
+ dataSetId: dataSet.id
14566
+ }]);
14567
+ });
14568
+ });
14569
+ } else {
14570
+ logError('DataSet is undefined or does not have fields', dataSet);
14571
+ }
14572
+ });
14573
+ return Object.values(groups);
14574
+ };
14575
+ var fromDashboardRequiredFilterGroups = function fromDashboardRequiredFilterGroups(dataSets) {
14576
+ var groupedFilters = groupFilters(dataSets);
14577
+ return groupedFilters.map(function (group) {
14578
+ return {
14579
+ type: group[0].dataSetField.dataType == 'date_time' ? DATE_FILTER : SINGLE_SELECT_FILTER,
14580
+ managedByConfiguration: true,
14581
+ requiresValue: true,
14582
+ title: group[0].publicName,
14583
+ appliesToFields: group.map(function (g) {
14584
+ return {
14585
+ dataSetId: g.dataSetId,
14586
+ fieldId: g.dataSetField.id
14587
+ };
14588
+ }),
14589
+ value: null
14590
+ };
14591
+ });
14592
+ };
14593
+
14594
+ var fieldSchema = /*#__PURE__*/Joi.object({
14595
+ fieldId: /*#__PURE__*/Joi.string().required(),
14596
+ dataSetId: /*#__PURE__*/Joi.string().required()
14597
+ });
14598
+ var optionsFiltersSchema = function optionsFiltersSchema(queryEngineConfig) {
14599
+ return Joi.object().pattern(Joi.string(),
14600
+ // keys of the object
14601
+ Joi.array().items(filterSchema(queryEngineConfig)).optional());
14602
+ };
14603
+ var sharedAdditionalFilterSchema = function sharedAdditionalFilterSchema(queryEngineConfig) {
14604
+ return {
14605
+ title: Joi.string().allow(''),
14606
+ managedByConfiguration: Joi["boolean"]().optional(),
14607
+ requiresValue: Joi["boolean"]().optional(),
14608
+ optionsFilters: optionsFiltersSchema(queryEngineConfig).optional(),
14609
+ appliesToFields: Joi.array().items(fieldSchema).required(),
14610
+ optionsPulledFrom: Joi.array().items(fieldSchema).optional(),
14611
+ hidden: Joi["boolean"](),
14612
+ options: Joi.array().items(Joi.object({
14613
+ value: Joi.allow(Joi.number(), Joi.string()),
14614
+ label: Joi.string()
14615
+ })).optional()
14616
+ };
14617
+ };
14618
+ var selectFilterSchema = function selectFilterSchema(queryEngineConfig, shouldAlwaysHaveValue) {
14619
+ return Joi.object(_extends({}, sharedAdditionalFilterSchema(queryEngineConfig), {
14620
+ type: Joi.valid(SINGLE_SELECT_FILTER).required(),
14621
+ value: Joi.alternatives(Joi.string(), Joi.number(), Joi["boolean"](), Joi.valid.apply(Joi, shouldAlwaysHaveValue ? [] : [null]))
14622
+ }));
14623
+ };
14624
+ var multiSelectFilterSchema = function multiSelectFilterSchema(queryEngineConfig, shouldAlwaysHaveValue) {
14625
+ return Joi.object(_extends({}, sharedAdditionalFilterSchema(queryEngineConfig), {
14626
+ type: Joi.valid(MULTI_SELECT_FILTER).required(),
14627
+ 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))))
14628
+ }));
14629
+ };
14630
+ var advancedFilterSchema = function advancedFilterSchema(queryEngineConfig, shouldAlwaysHaveValue) {
14631
+ return Joi.object(_extends({}, sharedAdditionalFilterSchema(queryEngineConfig), {
14632
+ type: Joi.valid(ADVANCED_FILTER).required(),
14633
+ value: advancedFilterValueSchema(queryEngineConfig, shouldAlwaysHaveValue)
14634
+ }));
14635
+ };
14636
+ var advancedFilterValueSchema = function advancedFilterValueSchema(queryEngineConfig, shouldAlwaysHaveValue) {
14637
+ return Joi.alternatives(Joi.valid.apply(Joi, shouldAlwaysHaveValue ? [] : [null]), Joi.array().items(Joi.array().items(filterSchema(queryEngineConfig))));
14638
+ };
14639
+ var dateTimeFilterSchema = function dateTimeFilterSchema(queryEngineConfig, shouldAlwaysHaveValue, type) {
14640
+ return Joi.object(_extends({}, sharedAdditionalFilterSchema(queryEngineConfig), {
14641
+ type: Joi.valid(type).required(),
14642
+ inclusiveDate: Joi["boolean"]().optional(),
14643
+ allowTimeSelection: Joi["boolean"]().optional(),
14644
+ value: Joi.alternatives(Joi.valid.apply(Joi, shouldAlwaysHaveValue ? [] : [null]), Joi.object({
14645
+ type: Joi.valid('fixedRange'),
14646
+ before: Joi.alternatives(Joi.date()).required(),
14647
+ after: Joi.alternatives(Joi.date()).required()
14648
+ }), Joi.object({
14649
+ type: Joi.valid('relative'),
14650
+ value: Joi.string()
14651
+ }), Joi.object({
14652
+ type: Joi.valid('relativeRange'),
14653
+ filters: Joi.array()
14654
+ }))
14655
+ }));
14656
+ };
14657
+ var numberFilterSchema = function numberFilterSchema(queryEngineConfig, shouldAlwaysHaveValue) {
14658
+ return Joi.object(_extends({}, sharedAdditionalFilterSchema(queryEngineConfig), {
14659
+ type: Joi.valid(NUMERIC_FILTER).required(),
14660
+ value: Joi.alternatives(Joi.object({
14661
+ op: Joi.allow('=', '<', '>', '<=', '>='),
14662
+ value: Joi.number().allow(null, 0)
14663
+ }), Joi.array().items(Joi.array().items(filterSchema(queryEngineConfig))), Joi.valid.apply(Joi, shouldAlwaysHaveValue ? [] : [null]))
14664
+ }));
14665
+ };
14666
+ var additionalFilterSchema = function additionalFilterSchema(queryEngineConfig, shouldAlwaysHaveValue) {
14667
+ return Joi.alternatives().conditional('.type', {
14668
+ is: SINGLE_SELECT_FILTER,
14669
+ then: selectFilterSchema(queryEngineConfig, shouldAlwaysHaveValue)
14670
+ }).conditional('.type', {
14671
+ is: DATE_FILTER,
14672
+ then: dateTimeFilterSchema(queryEngineConfig, shouldAlwaysHaveValue, DATE_FILTER)
14673
+ }).conditional('.type', {
14674
+ is: DATE_AND_TIME_FILTER,
14675
+ then: dateTimeFilterSchema(queryEngineConfig, shouldAlwaysHaveValue, DATE_AND_TIME_FILTER)
14676
+ }).conditional('.type', {
14677
+ is: MULTI_SELECT_FILTER,
14678
+ then: multiSelectFilterSchema(queryEngineConfig, shouldAlwaysHaveValue)
14679
+ }).conditional('.type', {
14680
+ is: NUMERIC_FILTER,
14681
+ then: numberFilterSchema(queryEngineConfig, shouldAlwaysHaveValue)
14682
+ }).conditional('.type', {
14683
+ is: ADVANCED_FILTER,
14684
+ then: advancedFilterSchema(queryEngineConfig, shouldAlwaysHaveValue)
14685
+ });
14686
+ };
14687
+ function globalFilterSchema(queryEngineConfig) {
14688
+ return Joi.array().items(Joi.custom(function (value, helpers) {
14689
+ if (!queryEngineConfig) {
14690
+ return helpers.error('any.invalid');
14691
+ }
14692
+ var schema = additionalFilterSchema(queryEngineConfig, !!value.requiresValue);
14693
+ var _schema$validate = schema.validate(value),
14694
+ error = _schema$validate.error;
14695
+ if (error) {
14696
+ return helpers.error('any.invalid', {
14697
+ message: error.message
14698
+ });
14699
+ }
14700
+ return value;
14701
+ })).required();
14702
+ }
14703
+
15061
14704
  var init$a = function init(displayTitle) {
15062
14705
  return {
15063
14706
  displayTitle: displayTitle,
@@ -15545,7 +15188,7 @@ var defaultDateFilterOptions = function defaultDateFilterOptions() {
15545
15188
  }
15546
15189
  return defaultDateFilterOptions;
15547
15190
  };
15548
- var build$c = function build(textOverride, overrides) {
15191
+ var build$b = function build(textOverride, overrides) {
15549
15192
  var timeRangeMapping = defaultTimeRangeMapping(textOverride);
15550
15193
  var orderedKeys = Object.keys(DEFAULT_DATETIME_FILTER_OPTIONS).map(function (key) {
15551
15194
  return key in timeRangeMapping ? "_vizzly_" + key : key;
@@ -15879,7 +15522,7 @@ var init$b = function init(overrides, includeComponentTypes, excludeComponentTyp
15879
15522
  return _extends({}, defaultFormatMapping, overrides.defaultFormats ? overrides.defaultFormats() : {});
15880
15523
  },
15881
15524
  onEditorUpdate: overrides.onEditorUpdate ? overrides.onEditorUpdate : base.onEditorUpdate,
15882
- dateFilterOptions: build$c(textOverride, overrides.dateFilterOptions),
15525
+ dateFilterOptions: build$b(textOverride, overrides.dateFilterOptions),
15883
15526
  onSave: overrides.onSave ? overrides.onSave : base.onSave,
15884
15527
  onScheduledReportChange: overrides.onScheduledReportChange || base.onScheduledReportChange,
15885
15528
  dashboardFilters: overrides.dashboardFilters ? overrides.dashboardFilters : base.dashboardFilters,
@@ -15933,7 +15576,7 @@ function useSubscription(callback, idOverride, deps) {
15933
15576
  var useFeatureTogglesSetup = function useFeatureTogglesSetup(mode, overrideFeatureToggles, queryEngineConfig, scope, id) {
15934
15577
  var base$1 = base;
15935
15578
  var buildInitialFeatureToggles = function () {
15936
- var updatedFeatureToggles = build$b(___default.merge({}, base$1.featureToggles, overrideFeatureToggles), queryEngineConfig != null ? queryEngineConfig : base$1.queryEngineConfig, mode || base$1.mode, scope || base$1.scope);
15579
+ var updatedFeatureToggles = build$a(___default.merge({}, base$1.featureToggles, overrideFeatureToggles), queryEngineConfig != null ? queryEngineConfig : base$1.queryEngineConfig, mode || base$1.mode, scope || base$1.scope);
15937
15580
  return updatedFeatureToggles;
15938
15581
  }();
15939
15582
  var _useState = React.useState(buildInitialFeatureToggles),
@@ -26244,6 +25887,334 @@ var filterStyles = /*#__PURE__*/Object.assign(function () {
26244
25887
  complete: complete
26245
25888
  });
26246
25889
 
25890
+ var Clause = /*#__PURE__*/function (Clause) {
25891
+ Clause["AND_WHERE"] = "andWhere";
25892
+ Clause["OR_WHERE"] = "orWhere";
25893
+ Clause["WHERE"] = "where";
25894
+ return Clause;
25895
+ }({});
25896
+
25897
+ // export type WhereClause = SqlAST.MultiWhereToken<any>;
25898
+
25899
+ var filterConfigToWhere = function filterConfigToWhere(dataSet, queryEngineConfig, params) {
25900
+ if (!params) return undefined;
25901
+ var filterConfig = params.filterConfig;
25902
+ 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) {
25903
+ return arr.length === 0;
25904
+ }))) {
25905
+ return undefined;
25906
+ }
25907
+ var dash = buildAndWhere(dataSet, queryEngineConfig, params, filterConfig.globalFilters);
25908
+ var local = buildAndWhere(dataSet, queryEngineConfig, params, filterConfig.localFilters);
25909
+ var advancedFilters = buildFromFiltersArray(dataSet, queryEngineConfig, params, filterConfig.advancedFilter);
25910
+ var combinedAndWhere = [dash, local, advancedFilters].filter(Boolean).filter(function (whereClause) {
25911
+ return whereClause && whereClause.value.length > 0;
25912
+ });
25913
+ if (combinedAndWhere.length === 0) return undefined;
25914
+ return {
25915
+ type: Clause.AND_WHERE,
25916
+ value: combinedAndWhere
25917
+ };
25918
+ };
25919
+ var buildAndWhere = function buildAndWhere(dataSet, queryEngineConfig, params, additionalFilters) {
25920
+ if (!additionalFilters || additionalFilters.length === 0) return undefined;
25921
+ var whereClauses = [];
25922
+ additionalFilters.forEach(function (additionalFilter) {
25923
+ if (additionalFilter.type === DATE_AND_TIME_FILTER || additionalFilter.type === DATE_FILTER) {
25924
+ toRelativeQueryAttributesFilters(additionalFilter, dataSet).forEach(function (f) {
25925
+ whereClauses.push(buildWhereFromSingleFilter(dataSet, f, queryEngineConfig, params));
25926
+ });
25927
+ }
25928
+ if (Array.isArray(additionalFilter.value) && additionalFilter.value.length > 1 && isAdditionalFilter(additionalFilter.value)) {
25929
+ additionalFilter.appliesToFields.flatMap(function (field) {
25930
+ if (field.dataSetId != dataSet.id) return [];
25931
+ var convertedToWhere = buildFromFiltersArray(dataSet, queryEngineConfig, params, additionalFilter.value);
25932
+ if (convertedToWhere) {
25933
+ whereClauses.push(convertedToWhere);
25934
+ }
25935
+ return;
25936
+ });
25937
+ } else {
25938
+ toQueryAttributesFilter(dataSet, additionalFilter, params.timeRangeOptions).forEach(function (f) {
25939
+ whereClauses.push(buildWhereFromSingleFilter(dataSet, f, queryEngineConfig, params));
25940
+ });
25941
+ }
25942
+ });
25943
+ return {
25944
+ type: Clause.AND_WHERE,
25945
+ value: whereClauses
25946
+ };
25947
+ };
25948
+ var buildWhereFromSingleFilter = function buildWhereFromSingleFilter(dataSet, f, queryEngineConfig, params) {
25949
+ var field;
25950
+ if (f["function"] && !isSupportedTimeTruncFunction(queryEngineConfig.supportedTimeTruncFunctions, f["function"])) {
25951
+ throw "Query engine does not support the query function " + f["function"] + ".";
25952
+ }
25953
+ var dataSetField = findField(dataSet, f.field);
25954
+ if (isCustomField(dataSetField)) {
25955
+ var _f$function;
25956
+ field = toQueryMeasure({
25957
+ field: dataSetField.id,
25958
+ "function": (_f$function = f["function"]) != null ? _f$function : 'none'
25959
+ }, dataSetField, queryEngineConfig, dataSet, false, params);
25960
+ } else {
25961
+ var _decodedField$functio;
25962
+ var decodedField = decodeId(f.field, queryEngineConfig);
25963
+ field = {
25964
+ type: 'field',
25965
+ value: decodedField.field,
25966
+ "function": (_decodedField$functio = decodedField["function"]) != null ? _decodedField$functio : 'none'
25967
+ };
25968
+ }
25969
+ if ((f.op == 'array_contains' || f.op == 'array_does_not_contain') && Array.isArray(f.value)) {
25970
+ return arrayContainsFilters(f, dataSet, queryEngineConfig, params);
25971
+ }
25972
+ var value = useValue(f.value, params.variables);
25973
+ if (isRelativeDateDefined(f.value)) {
25974
+ value = calculateRelativeDate(f.value);
25975
+ }
25976
+ if (filterIsDate(f)) {
25977
+ value = getUTCDate(f.value);
25978
+ }
25979
+ return {
25980
+ type: Clause.WHERE,
25981
+ value: {
25982
+ op: f.op,
25983
+ value: value,
25984
+ field: field
25985
+ }
25986
+ };
25987
+ };
25988
+ var buildFromFiltersArray = function buildFromFiltersArray(dataSet, queryEngineConfig, params, filters) {
25989
+ if (!filters || filters.length === 0 || filters.every(function (arr) {
25990
+ return arr.length === 0;
25991
+ })) {
25992
+ return undefined;
25993
+ }
25994
+ if (filters.length === 1) return buildFromFilters(filters[0], dataSet, queryEngineConfig, params);
25995
+ return {
25996
+ type: Clause.OR_WHERE,
25997
+ value: filters.map(function (filter) {
25998
+ return buildFromFilters(filter, dataSet, queryEngineConfig, params);
25999
+ })
26000
+ };
26001
+ };
26002
+ var buildFromFilters = function buildFromFilters(filter, dataSet, queryEngineConfig, params) {
26003
+ return {
26004
+ type: Clause.AND_WHERE,
26005
+ value: filter.map(function (filter) {
26006
+ if ((filter.op == 'array_contains' || filter.op == 'array_does_not_contain') && Array.isArray(filter.value)) {
26007
+ return arrayContainsFilters(filter, dataSet, queryEngineConfig, params);
26008
+ }
26009
+ return buildWhereFromSingleFilter(dataSet, filter, queryEngineConfig, params);
26010
+ })
26011
+ };
26012
+ };
26013
+ var arrayContainsFilters = function arrayContainsFilters(filter, dataSet, queryEngineConfig, params) {
26014
+ return {
26015
+ type: Clause.AND_WHERE,
26016
+ value: [].concat(filter.value).map(function (value) {
26017
+ return buildWhereFromSingleFilter(dataSet, _extends({}, filter, {
26018
+ value: value
26019
+ }), queryEngineConfig, params);
26020
+ })
26021
+ };
26022
+ };
26023
+
26024
+ var addMeasure = function addMeasure(current, toAdd) {
26025
+ return [[].concat(current, [toAdd]), current.length];
26026
+ };
26027
+ var buildFromQueryAttributes = function buildFromQueryAttributes(dataSet, measureAttr, orderAttr, dimensionAttr, timeDimensionAttr, limitAttr, offsetAttr, queryEngineConfig, params, prebuiltFilters) {
26028
+ var measureDescription = [];
26029
+ var measure = [];
26030
+ var group = [];
26031
+ var order = [];
26032
+ var filters = buildFilters(dataSet, queryEngineConfig, params, prebuiltFilters);
26033
+ if (timeDimensionAttr) {
26034
+ // Add the measure for the time field.
26035
+ var addedAt = undefined;
26036
+
26037
+ // Stop unsupported time trunc functions being used.
26038
+ if (!isSupportedTimeTruncFunction(queryEngineConfig.supportedTimeTruncFunctions, timeDimensionAttr.truncate)) {
26039
+ throw "Query engine does not support the time trunc function " + timeDimensionAttr.truncate + ".";
26040
+ }
26041
+ var _addMeasure = addMeasure(measure, {
26042
+ type: 'field',
26043
+ value: timeDimensionAttr.field,
26044
+ "function": timeDimensionAttr.truncate
26045
+ });
26046
+ measure = _addMeasure[0];
26047
+ addedAt = _addMeasure[1];
26048
+ measureDescription = [].concat(measureDescription, [{
26049
+ functionId: timeDimensionAttr.truncate,
26050
+ field: findField(dataSet, timeDimensionAttr.field)
26051
+ }]);
26052
+ group = [].concat(group, [{
26053
+ index: addedAt
26054
+ }]);
26055
+ }
26056
+ dimensionAttr.forEach(function (dimension) {
26057
+ // Add the measure for the time field.
26058
+ var addedAt = undefined;
26059
+ var _addMeasure2 = addMeasure(measure, {
26060
+ type: 'field',
26061
+ value: dimension == null ? void 0 : dimension.field,
26062
+ "function": dimension["function"]
26063
+ });
26064
+ measure = _addMeasure2[0];
26065
+ addedAt = _addMeasure2[1];
26066
+ measureDescription = [].concat(measureDescription, [{
26067
+ functionId: dimension["function"],
26068
+ field: findField(dataSet, dimension.field)
26069
+ }]);
26070
+ group = [].concat(group, [{
26071
+ index: addedAt
26072
+ }]);
26073
+ });
26074
+ measureAttr.forEach(function (individualMeasure) {
26075
+ // Stop unsupported aggregate functions being used.
26076
+ if (!isSupportedAggregateFunction(queryEngineConfig.supportedAggregates, individualMeasure["function"])) {
26077
+ throw "Query engine does not support the query function " + individualMeasure["function"] + ".";
26078
+ }
26079
+ var _addMeasure3 = addMeasure(measure, {
26080
+ type: 'field',
26081
+ value: individualMeasure.field,
26082
+ "function": individualMeasure["function"]
26083
+ });
26084
+ measure = _addMeasure3[0];
26085
+ measureDescription = [].concat(measureDescription, [{
26086
+ functionId: individualMeasure["function"],
26087
+ field: findField(dataSet, individualMeasure.field)
26088
+ }]);
26089
+ });
26090
+ orderAttr.forEach(function (apiQueryOrderItem) {
26091
+ var index = measure.findIndex(function (individualMeasure) {
26092
+ if (individualMeasure.type == 'field') {
26093
+ var sameFunction = individualMeasure["function"] == apiQueryOrderItem["function"];
26094
+ // const isTimeFunc = Object.keys(queryEngineConfig.supportedTimeTruncFunctions).includes(
26095
+ // individualMeasure.function
26096
+ // );
26097
+ var sameField = individualMeasure.value == apiQueryOrderItem.field;
26098
+ return sameField && sameFunction;
26099
+
26100
+ // return found;
26101
+ }
26102
+ return false;
26103
+ });
26104
+ if (index >= 0) {
26105
+ order = [].concat(order, [{
26106
+ index: index,
26107
+ direction: apiQueryOrderItem.direction
26108
+ }]);
26109
+ }
26110
+ });
26111
+ measure = measure.map(function (measure) {
26112
+ if (measure.type == 'field' && typeof measure.value == 'string') {
26113
+ var dataSetField = findField(dataSet, measure.value);
26114
+ if (isCustomField(dataSetField)) {
26115
+ var customMeasure = toQueryMeasure({
26116
+ "function": measure["function"],
26117
+ field: measure.value
26118
+ }, dataSetField, queryEngineConfig, dataSet, hasDimensions({
26119
+ group: group
26120
+ }), params);
26121
+ return customMeasure;
26122
+ }
26123
+ }
26124
+ return measure;
26125
+ });
26126
+ return {
26127
+ query: {
26128
+ type: 'query',
26129
+ dataSetId: dataSet.id,
26130
+ measure: measure,
26131
+ group: group,
26132
+ // TODO: Fix this type
26133
+ filter: filters,
26134
+ order: order,
26135
+ limit: limitAttr,
26136
+ offset: offsetAttr
26137
+ },
26138
+ measureDescription: measureDescription
26139
+ };
26140
+ };
26141
+ var buildFilters = function buildFilters(dataSet, queryEngineConfig, params, prebuiltFilters) {
26142
+ if (prebuiltFilters && prebuiltFilters.length > 0) {
26143
+ var filter = [];
26144
+ prebuiltFilters.forEach(function (andFilters) {
26145
+ var newAndFilters = filterAttributeToQueryFilter([andFilters], queryEngineConfig, dataSet, params);
26146
+ filter = [].concat(filter, [newAndFilters[0]]);
26147
+ });
26148
+ return filter;
26149
+ }
26150
+ var whereClause = filterConfigToWhere(dataSet, queryEngineConfig, params);
26151
+ if (whereClause) return whereClause;
26152
+ return [];
26153
+ };
26154
+
26155
+ var build$c = buildFromQueryAttributes;
26156
+ var hasDimensions = function hasDimensions(query) {
26157
+ return query.group.length > 0;
26158
+ };
26159
+ var buildPreAggregatedPreparedQuery = function buildPreAggregatedPreparedQuery(query, dataSet) {
26160
+ return {
26161
+ query: query,
26162
+ resultFields: dataSet.fields.map(function (field) {
26163
+ return {
26164
+ id: field.id,
26165
+ publicName: field.publicName,
26166
+ dataType: field.dataType,
26167
+ fieldId: field.id,
26168
+ "function": 'none',
26169
+ outputDataType: field.dataType
26170
+ };
26171
+ })
26172
+ };
26173
+ };
26174
+ var buildUniqueArrayValuesPreparedQuery = function buildUniqueArrayValuesPreparedQuery(dataSetId, dataSetField, optionsFilters) {
26175
+ return {
26176
+ query: {
26177
+ type: 'preparedQuery',
26178
+ preparedQueryType: 'uniqueArrayValues',
26179
+ dataSetId: dataSetId,
26180
+ fieldId: dataSetField.id,
26181
+ filter: optionsFilters || []
26182
+ },
26183
+ resultFields: [{
26184
+ id: dataSetField.id,
26185
+ publicName: dataSetField.publicName,
26186
+ dataType: dataSetField.dataType,
26187
+ fieldId: dataSetField.id,
26188
+ "function": 'none',
26189
+ outputDataType: 'string'
26190
+ }]
26191
+ };
26192
+ };
26193
+ var buildFilterQuery = function buildFilterQuery(dataSet, fieldId, optionsFilters, optionsOrders) {
26194
+ var measure = [{
26195
+ field: fieldId,
26196
+ "function": 'count'
26197
+ }];
26198
+ var order = optionsOrders != null ? optionsOrders : [];
26199
+ var filter = optionsFilters ? [optionsFilters] : [];
26200
+ var dimension = [{
26201
+ field: fieldId,
26202
+ "function": 'none'
26203
+ }];
26204
+ var timeDimension = null;
26205
+ var limit = 5000;
26206
+ return {
26207
+ dataSetId: dataSet.id,
26208
+ measure: measure,
26209
+ order: order,
26210
+ filter: filter,
26211
+ dimension: dimension,
26212
+ timeDimension: timeDimension,
26213
+ limit: limit,
26214
+ offset: 0
26215
+ };
26216
+ };
26217
+
26247
26218
  /** Returns a key to be used in an useEffect dependency, that changes if there's any change to a field in a data set. */
26248
26219
  var watchDataSetFieldChanges = function watchDataSetFieldChanges(dataSet, queryable) {
26249
26220
  if ('dataSetId' in queryable) {
@@ -26348,12 +26319,12 @@ var useVariables = function useVariables(variables, dashboardId) {
26348
26319
  subscriptionChanges = _useState2[0],
26349
26320
  setSubscriptionChanges = _useState2[1];
26350
26321
  React.useEffect(function () {
26351
- var staticVariables = build$2(variables);
26322
+ var staticVariables = build$1(variables);
26352
26323
  setVariablesState(staticVariables);
26353
26324
  }, [JSON.stringify(variables)]);
26354
26325
  useSubscription(function (data) {
26355
26326
  if (data.variables) {
26356
- var staticVariables = build$2(variables);
26327
+ var staticVariables = build$1(variables);
26357
26328
  var updatedVariables = _extends({}, staticVariables, data.variables);
26358
26329
  logDebug('Updated variables', updatedVariables);
26359
26330
  setSubscriptionChanges(data.variables);
@@ -34788,8 +34759,6 @@ var showLegend = function showLegend(legend, verbose) {
34788
34759
  return false;
34789
34760
  };
34790
34761
 
34791
- // import { hasMeasure } from '../../../shared-logic/src/Query';
34792
-
34793
34762
  var EMPTY_METRICS = 'The Data settings are missing a Metric. Select from the list of Metrics to display the Chart.';
34794
34763
  var EMPTY_PARAMETER = 'The Data settings are missing a parameter. Select from the list of parameters to display the Chart.';
34795
34764
  function noMetricMessage(query) {
@@ -41562,7 +41531,7 @@ var AdminTools = function AdminTools(props) {
41562
41531
  onOpenConfigManagerUi = _useDashboardBehaviou.onOpenConfigManagerUi,
41563
41532
  disableToolbar = _useDashboardBehaviou.disableToolbar;
41564
41533
  var saveableDashboard = toSaveableDefinition(dashboard);
41565
- var supportsConfigManagerUi = supportsFeature$1(queryEngineConfig, 'configManagerUi') && onOpenConfigManagerUi;
41534
+ var supportsConfigManagerUi = supportsFeature(queryEngineConfig, 'configManagerUi') && onOpenConfigManagerUi;
41566
41535
  React.useEffect(function () {
41567
41536
  var abortController = new AbortController();
41568
41537
  var trySave = /*#__PURE__*/function () {
@@ -47064,8 +47033,7 @@ var CustomView = function CustomView(_ref) {
47064
47033
  var component = _ref.component;
47065
47034
  var attributes = component.attributes;
47066
47035
  var _useDashboardBehaviou = useDashboardBehaviourContext(),
47067
- customViews = _useDashboardBehaviou.customViews,
47068
- dateFilterOptions = _useDashboardBehaviou.dateFilterOptions;
47036
+ customViews = _useDashboardBehaviou.customViews;
47069
47037
  var _useDashboardContext = useDashboardContext(),
47070
47038
  dashboard = _useDashboardContext.dashboard;
47071
47039
  var FoundComponent = null;
@@ -47078,7 +47046,9 @@ var CustomView = function CustomView(_ref) {
47078
47046
  if (!FoundComponent) return null;
47079
47047
  var result = FoundComponent.Component({
47080
47048
  attributes: attributes,
47081
- dashboardFilters: toDataSetDashboardFilters(dashboard.dataSets, dashboard.globalFilters, dateFilterOptions)
47049
+ filterConfig: {
47050
+ globalFilters: dashboard.globalFilters
47051
+ }
47082
47052
  });
47083
47053
  if (typeof result === 'string') {
47084
47054
  return jsxRuntime.jsx("div", {
@@ -60015,12 +59985,13 @@ var StaticCustomView = function StaticCustomView(_ref) {
60015
59985
  component = _ref.component;
60016
59986
  var _useDashboardContext = useDashboardContext(),
60017
59987
  dashboard = _useDashboardContext.dashboard;
60018
- var _useDashboardBehaviou = useDashboardBehaviourContext(),
60019
- dateFilterOptions = _useDashboardBehaviou.dateFilterOptions;
59988
+ var _useDashboardBehaviou = useDashboardBehaviourContext();
60020
59989
  var renderComponent = function renderComponent() {
60021
59990
  var result = customView.Component({
60022
59991
  attributes: component.attributes,
60023
- dashboardFilters: toDataSetDashboardFilters(dashboard.dataSets, dashboard.globalFilters, dateFilterOptions)
59992
+ filterConfig: {
59993
+ globalFilters: dashboard.globalFilters
59994
+ }
60024
59995
  });
60025
59996
  if (typeof result === 'string') {
60026
59997
  return jsxRuntime.jsx("div", {
@@ -71760,7 +71731,7 @@ function getOptionsOrders(dataSetField) {
71760
71731
  }
71761
71732
 
71762
71733
  var commonToQueries = function commonToQueries(attributes, dataSet, queryEngineConfig, params) {
71763
- var _Query$build = build$a(dataSet, attributes.measure, attributes.order, attributes.dimension,
71734
+ var _Query$build = build$c(dataSet, attributes.measure, attributes.order, attributes.dimension,
71764
71735
  // @ts-ignore
71765
71736
  attributes.timeDimension || null, attributes.limit, attributes.offset, queryEngineConfig, params),
71766
71737
  query = _Query$build.query,
@@ -71785,8 +71756,8 @@ var toQueries$6 = commonToQueries;
71785
71756
  var toQueries$7 = commonToQueries;
71786
71757
 
71787
71758
  var buildMainQueries = function buildMainQueries(attributes, dataSet, queryEngineConfig, params) {
71788
- var line = build$a(dataSet, attributes.lineMeasure, attributes.order, attributes.lineDimension, attributes.timeDimension, attributes.limit, attributes.offset, queryEngineConfig, params);
71789
- var bar = build$a(dataSet, attributes.barMeasure, attributes.order, attributes.barDimension, attributes.timeDimension, attributes.limit, attributes.offset, queryEngineConfig, params);
71759
+ var line = build$c(dataSet, attributes.lineMeasure, attributes.order, attributes.lineDimension, attributes.timeDimension, attributes.limit, attributes.offset, queryEngineConfig, params);
71760
+ var bar = build$c(dataSet, attributes.barMeasure, attributes.order, attributes.barDimension, attributes.timeDimension, attributes.limit, attributes.offset, queryEngineConfig, params);
71790
71761
  return {
71791
71762
  bar: bar,
71792
71763
  line: line
@@ -71813,8 +71784,8 @@ var toQueries$b = commonToQueries;
71813
71784
  var toQueries$c = commonToQueries;
71814
71785
 
71815
71786
  var buildMainQueries$1 = function buildMainQueries(attributes, dataSet, queryEngineConfig, params) {
71816
- var line = build$a(dataSet, attributes.lineMeasure, attributes.order, attributes.lineDimension, attributes.timeDimension, attributes.limit, attributes.offset, queryEngineConfig, params);
71817
- var bar = build$a(dataSet, attributes.barMeasure, attributes.order, attributes.barDimension, attributes.timeDimension, attributes.limit, attributes.offset, queryEngineConfig, params);
71787
+ var line = build$c(dataSet, attributes.lineMeasure, attributes.order, attributes.lineDimension, attributes.timeDimension, attributes.limit, attributes.offset, queryEngineConfig, params);
71788
+ var bar = build$c(dataSet, attributes.barMeasure, attributes.order, attributes.barDimension, attributes.timeDimension, attributes.limit, attributes.offset, queryEngineConfig, params);
71818
71789
  return {
71819
71790
  bar: bar,
71820
71791
  line: line
@@ -71833,7 +71804,7 @@ var toQueries$d = function toQueries(attributes, dataSet, queryEngineConfig, par
71833
71804
  };
71834
71805
 
71835
71806
  var buildMainQuery = function buildMainQuery(attributes, dataSet, queryEngineConfig, params) {
71836
- var _Query$build = build$a(dataSet, attributes.measure, [], [], null, 1, attributes.offset, queryEngineConfig, params),
71807
+ var _Query$build = build$c(dataSet, attributes.measure, [], [], null, 1, attributes.offset, queryEngineConfig, params),
71837
71808
  query = _Query$build.query,
71838
71809
  measureDescription = _Query$build.measureDescription;
71839
71810
 
@@ -71861,7 +71832,7 @@ var buildMainQuery = function buildMainQuery(attributes, dataSet, queryEngineCon
71861
71832
  };
71862
71833
  var buildDeltaQuery = function buildDeltaQuery(dataSet, attributes, queryEngineConfig, params) {
71863
71834
  if (!attributes.deltaTimeDimension) return null;
71864
- return build$a(dataSet, attributes.measure, [{
71835
+ return build$c(dataSet, attributes.measure, [{
71865
71836
  field: attributes.deltaTimeDimension.field,
71866
71837
  direction: 'asc',
71867
71838
  "function": attributes.deltaTimeDimension.truncate
@@ -71893,7 +71864,7 @@ var toQueries$f = function toQueries(attributes, dataSet, queryEngineConfig, par
71893
71864
  var measures = [];
71894
71865
  attributes.xMeasure && measures.push(attributes.xMeasure);
71895
71866
  attributes.yMeasure && measures.push(attributes.yMeasure);
71896
- var _Query$build = build$a(dataSet, measures, attributes.order, attributes.dimension, attributes.timeDimension, attributes.limit, attributes.offset, queryEngineConfig, params),
71867
+ var _Query$build = build$c(dataSet, measures, attributes.order, attributes.dimension, attributes.timeDimension, attributes.limit, attributes.offset, queryEngineConfig, params),
71897
71868
  query = _Query$build.query,
71898
71869
  measureDescription = _Query$build.measureDescription;
71899
71870
  var resultFields = toResultFields([measureDescription], queryEngineConfig);
@@ -71907,7 +71878,7 @@ var toQueries$g = function toQueries(attributes, dataSet, queryEngineConfig, par
71907
71878
  var measures = [];
71908
71879
  attributes.xMeasure && measures.push(attributes.xMeasure);
71909
71880
  attributes.yMeasure && measures.push(attributes.yMeasure);
71910
- var _Query$build = build$a(dataSet, measures, attributes.order, attributes.dimension, attributes.timeDimension, attributes.limit, attributes.offset, queryEngineConfig, params),
71881
+ var _Query$build = build$c(dataSet, measures, attributes.order, attributes.dimension, attributes.timeDimension, attributes.limit, attributes.offset, queryEngineConfig, params),
71911
71882
  query = _Query$build.query,
71912
71883
  measureDescription = _Query$build.measureDescription;
71913
71884
  var resultFields = toResultFields([measureDescription], queryEngineConfig);
@@ -71919,7 +71890,7 @@ var toQueries$g = function toQueries(attributes, dataSet, queryEngineConfig, par
71919
71890
 
71920
71891
  var toQueries$h = function toQueries(attributes, dataSet, queryEngineConfig, params) {
71921
71892
  var measures = [].concat(attributes.measure || [], attributes.xMeasure || [], attributes.zMeasure || []);
71922
- var _Query$build = build$a(dataSet, measures, attributes.order, attributes.dimension, attributes.timeDimension, attributes.limit, attributes.offset, queryEngineConfig, params),
71893
+ var _Query$build = build$c(dataSet, measures, attributes.order, attributes.dimension, attributes.timeDimension, attributes.limit, attributes.offset, queryEngineConfig, params),
71923
71894
  query = _Query$build.query,
71924
71895
  measureDescription = _Query$build.measureDescription;
71925
71896
  var resultFields = toResultFields([measureDescription], queryEngineConfig);
@@ -72035,6 +72006,7 @@ var buildVizzlyQuery = function buildVizzlyQuery(thing, queryEngineConfig, param
72035
72006
  var dataSet = find(params.dataSets, queryAttributes.dataSetId);
72036
72007
  if (!dataSet) throw 'Data set not found for query-attributes query';
72037
72008
  return _extends({}, queryAttributes, {
72009
+ // TODO; this means that services queries that povide a query, cannot work... GTDEV-6947
72038
72010
  filter: [],
72039
72011
  whereClause: filterConfigToWhere(dataSet, queryEngineConfig, _extends({}, params, {
72040
72012
  filterConfig: _extends({}, params.filterConfig, {
@@ -73271,7 +73243,7 @@ var VizzlyServices = /*#__PURE__*/function () {
73271
73243
  _proto.query = /*#__PURE__*/function () {
73272
73244
  var _query = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee11(queries, params) {
73273
73245
  var _this2 = this;
73274
- var instanceId, service, enhancedQueries, queryEngineEndpoint, runQueriesCallback, fetch;
73246
+ var instanceId, service, queryEngineEndpoint, runQueriesCallback, fetch;
73275
73247
  return _regeneratorRuntime().wrap(function _callee11$(_context11) {
73276
73248
  while (1) switch (_context11.prev = _context11.next) {
73277
73249
  case 0:
@@ -73281,8 +73253,7 @@ var VizzlyServices = /*#__PURE__*/function () {
73281
73253
  instanceId = params.instanceId;
73282
73254
  }
73283
73255
  service = VizzlyServices._instanceStore[instanceId];
73284
- enhancedQueries = addGlobalFiltersToQueries(queries, params == null ? void 0 : params.dashboardFilters);
73285
- validateQuery(enhancedQueries, service.queryEngineConfig);
73256
+ validateQuery(queries, service.queryEngineConfig);
73286
73257
  queryEngineEndpoint = function () {
73287
73258
  if (params != null && params.queryEngineEndpoint) {
73288
73259
  return params.queryEngineEndpoint;
@@ -73297,7 +73268,7 @@ var VizzlyServices = /*#__PURE__*/function () {
73297
73268
  }
73298
73269
  return undefined;
73299
73270
  }();
73300
- runQueriesCallback = getRunQueriesCallback(service.identityConfig, service.queryEngineConfig, build$c(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);
73271
+ 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);
73301
73272
  fetch = /*#__PURE__*/function () {
73302
73273
  var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee10() {
73303
73274
  var _params$abortControll;
@@ -73306,9 +73277,10 @@ var VizzlyServices = /*#__PURE__*/function () {
73306
73277
  case 0:
73307
73278
  _context10.prev = 0;
73308
73279
  _context10.next = 3;
73309
- return runQueriesCallback(enhancedQueries, {
73280
+ return runQueriesCallback(queries, {
73310
73281
  abortSignal: params == null || (_params$abortControll = params.abortController) == null ? void 0 : _params$abortControll.signal,
73311
- dataSets: _this2.dataSets
73282
+ dataSets: _this2.dataSets,
73283
+ filterConfig: params == null ? void 0 : params.filterConfig
73312
73284
  });
73313
73285
  case 3:
73314
73286
  return _context10.abrupt("return", _context10.sent);
@@ -73327,14 +73299,14 @@ var VizzlyServices = /*#__PURE__*/function () {
73327
73299
  return _ref.apply(this, arguments);
73328
73300
  };
73329
73301
  }();
73330
- _context11.next = 11;
73302
+ _context11.next = 10;
73331
73303
  return fetch();
73332
- case 11:
73304
+ case 10:
73333
73305
  _context11.t0 = _context11.sent;
73334
73306
  return _context11.abrupt("return", {
73335
73307
  results: _context11.t0
73336
73308
  });
73337
- case 13:
73309
+ case 12:
73338
73310
  case "end":
73339
73311
  return _context11.stop();
73340
73312
  }
@@ -76265,7 +76237,7 @@ var GlobalProviderContents = function GlobalProviderContents(props) {
76265
76237
  }
76266
76238
  };
76267
76239
  var resolvedDateFilterOptions = (_props$dateFilterOpti = props.dateFilterOptions) != null ? _props$dateFilterOpti : props.dateTimeFilterOptions;
76268
- var runQueriesCallback = getRunQueriesCallback(session.identityConfig, session.queryEngineConfig, build$c(textOverride, resolvedDateFilterOptions), variables.variables, props.runQueries, props.data, props.queryEngineEndpoint, props.timeZone);
76240
+ var runQueriesCallback = getRunQueriesCallback(session.identityConfig, session.queryEngineConfig, build$b(textOverride, resolvedDateFilterOptions), variables.variables, props.runQueries, props.data, props.queryEngineEndpoint, props.timeZone);
76269
76241
  var aiOnAction = /*#__PURE__*/function () {
76270
76242
  var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(conversationId, messageId, actionOptions) {
76271
76243
  return _regeneratorRuntime().wrap(function _callee3$(_context3) {
@@ -76482,7 +76454,7 @@ var index = {
76482
76454
  displayPositions: displayPositions,
76483
76455
  DataSetField: DataSetField
76484
76456
  };
76485
- var VIRDIS_COLOR_PALETTE = ["#440154FF", "#414487FF", "#2A788EFF", "#22A884FF", "#7AD151FF", "#FDE725FF"];
76457
+ var VIRDIS_COLOR_PALETTE = ['#440154FF', '#414487FF', '#2A788EFF', '#22A884FF', '#7AD151FF', '#FDE725FF'];
76486
76458
 
76487
76459
  exports.Dashboard = Dashboard$2;
76488
76460
  exports.DataSetField = DataSetField;