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