@datawheel/data-explorer 0.1.1 → 0.1.2

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.
Files changed (2) hide show
  1. package/dist/main.js +1738 -1245
  2. package/package.json +5 -1
package/dist/main.js CHANGED
@@ -1,9 +1,9 @@
1
- import { keyframes, createStyles, rem, Select, Flex, Title, Text, Group, Button, Box, Anchor, Input, Stack, SimpleGrid, Table, Alert, Loader, Modal, useMantineTheme, Center, Header, MantineProvider, Paper, useComponentDefaultProps, Menu, ActionIcon, UnstyledButton, Switch, ThemeIcon, Tooltip, Tabs, ScrollArea, TextInput, Accordion, Popover, Divider } from '@mantine/core';
2
- import { useClipboard, useClickOutside, useFullscreen, useDebouncedValue } from '@mantine/hooks';
1
+ import { keyframes, createStyles, Select, rem, Flex, Title, Text, Group, Button, Box, Anchor, Input, Stack, SimpleGrid, Table, MultiSelect, Center, Alert, Loader, Modal, NumberInput, Menu, ActionIcon, useMantineTheme, Header, MantineProvider, Paper, useComponentDefaultProps, Switch, ThemeIcon, Tooltip, Tabs, ScrollArea, CloseButton, Drawer, Checkbox, UnstyledButton, TextInput, Accordion, Popover, Divider } from '@mantine/core';
2
+ import { useClipboard, useClickOutside, useFullscreen, useMediaQuery, useDebouncedValue, useDisclosure } from '@mantine/hooks';
3
3
  import { Prism } from '@mantine/prism';
4
- import { IconWorld, IconExternalLink, IconClipboard, IconAlertCircle, IconAlertTriangle, IconStack2, IconChevronRight as IconChevronRight$1, IconCopy, IconDownload, IconDotsVertical, IconBox, IconArrowsMinimize, IconArrowsMaximize, IconInfoCircleFilled, IconStack3, IconStack, IconTrash, IconSearch, IconPhotoDown, IconVectorTriangle, IconArrowsSort, IconSortDescendingNumbers, IconSortDescendingLetters, IconSortAscendingNumbers, IconSortAscendingLetters, IconLanguage } from '@tabler/icons-react';
5
- import * as React13 from 'react';
6
- import React13__default, { createContext, forwardRef, useMemo, useCallback, useContext, useState, useEffect, useRef, Suspense } from 'react';
4
+ import { IconWorld, IconExternalLink, IconClipboard, IconAlertCircle, IconAlertTriangle, IconSettings, IconMathGreater, IconMathLower, IconArrowsLeftRight, IconCopy, IconDownload, IconDotsVertical, IconArrowsMinimize, IconArrowsMaximize, IconInfoCircleFilled, IconTrash, IconSearch, IconPhotoDown, IconVectorTriangle, IconStack3, IconFilterOff, IconFilter, IconArrowsSort, IconSortDescendingNumbers, IconSortDescendingLetters, IconSortAscendingNumbers, IconSortAscendingLetters, IconLanguage } from '@tabler/icons-react';
5
+ import * as React10 from 'react';
6
+ import React10__default, { createContext, forwardRef, useMemo, useCallback, useContext, useState, useEffect, useRef, Suspense } from 'react';
7
7
  import { translationFactory } from '@datawheel/use-translation';
8
8
  import { translationDict, generateCharts, createChartConfig } from '@datawheel/vizbuilder';
9
9
  import { createSlice, createSelector, combineReducers, bindActionCreators, configureStore } from '@reduxjs/toolkit';
@@ -12,8 +12,10 @@ import ISO6391 from 'iso-639-1';
12
12
  import { TesseractDataSource, Format, Client, Measure, Level, Comparison } from '@datawheel/olap-client';
13
13
  import formUrlEncode from 'form-urlencoded';
14
14
  import formUrlDecode from 'form-urldecoded';
15
- import { flexRender, MRT_TableHeadCellFilterContainer, MRT_TableBodyCell, useMantineReactTable, MantineReactTable, MRT_TablePagination } from 'mantine-react-table';
15
+ import { MRT_ProgressBar, flexRender, MRT_TableBodyCell, MRT_ToolbarAlertBanner, useMantineReactTable, MantineReactTable, MRT_TablePagination } from 'mantine-react-table';
16
16
  import { formatAbbreviate, format } from 'd3plus-format';
17
+ import { QueryClient, QueryClientProvider, useQuery } from '@tanstack/react-query';
18
+ import debounce from 'lodash.debounce';
17
19
  import { matchSorter } from 'match-sorter';
18
20
  import yn from 'yn';
19
21
  import { BarChart, Donut, Geomap, LinePlot, Pie, StackedArea, Treemap } from 'd3plus-react';
@@ -197,6 +199,9 @@ var defaultTranslation = {
197
199
  action_download: "Download",
198
200
  action_open: "Open",
199
201
  action_reload: "Reload",
202
+ sidebar: {
203
+ dataset: "Select Dataset"
204
+ },
200
205
  comparison: {
201
206
  EQ: "Equal to",
202
207
  GT: "Greater than",
@@ -253,11 +258,15 @@ var defaultTranslation = {
253
258
  label_boolean_nonempty: "Only return non-empty data",
254
259
  label_boolean_parents: "Include parent levels",
255
260
  label_boolean_sparse: "Optimize sparse results",
261
+ label_clear: "Clear",
256
262
  label_cube: "Cube",
257
263
  label_cuts_filterby_id: "IDs",
258
264
  label_cuts_filterby_name: "Names",
259
265
  label_cuts_filterby_any: "Any",
260
- label_locale: "",
266
+ label_fullscreen: "Full screen",
267
+ label_locale: "Language",
268
+ label_search: "Search",
269
+ label_no_results: "No results",
261
270
  label_dataset: "Select Dataset",
262
271
  label_localeoption: "{{nativeName}}",
263
272
  label_measure: "Measure",
@@ -378,13 +387,13 @@ function DebugView(props) {
378
387
  const { copy, copied } = useClipboard({ timeout: 1e3 });
379
388
  const copyHandler = useCallback(() => copy(url), [url]);
380
389
  const openHandler = useCallback(() => window.open(url, "_blank"), [url]);
381
- const jssourceLabel = /* @__PURE__ */ React13__default.createElement(Box, { component: "span" }, t("debug_view.jssource_prefix"), /* @__PURE__ */ React13__default.createElement(Anchor, { href: "https://www.npmjs.com/package/@datawheel/olap-client" }, "olap-client"), t("debug_view.jssource_suffix"));
390
+ const jssourceLabel = /* @__PURE__ */ React10__default.createElement(Box, { component: "span" }, t("debug_view.jssource_prefix"), /* @__PURE__ */ React10__default.createElement(Anchor, { href: "https://www.npmjs.com/package/@datawheel/olap-client" }, "olap-client"), t("debug_view.jssource_suffix"));
382
391
  const headers = useMemo(() => {
383
392
  const headers2 = Object.entries(props.result.headers || {});
384
393
  if (headers2.length === 0) return null;
385
- return /* @__PURE__ */ React13__default.createElement(Input.Wrapper, { label: t("debug_view.httpheaders") }, /* @__PURE__ */ React13__default.createElement(Box, { component: "dl", sx: { fontFamily: "monospace", overflowWrap: "break-word" } }, headers2.map((entry) => /* @__PURE__ */ React13__default.createElement(React13__default.Fragment, { key: entry[0] }, /* @__PURE__ */ React13__default.createElement(Text, { component: "dt", fw: "bold", fz: "sm" }, entry[0]), /* @__PURE__ */ React13__default.createElement(Text, { component: "dd", c: "#5c940d", fz: "sm" }, entry[1])))));
394
+ return /* @__PURE__ */ React10__default.createElement(Input.Wrapper, { label: t("debug_view.httpheaders") }, /* @__PURE__ */ React10__default.createElement(Box, { component: "dl", sx: { fontFamily: "monospace", overflowWrap: "break-word" } }, headers2.map((entry) => /* @__PURE__ */ React10__default.createElement(React10__default.Fragment, { key: entry[0] }, /* @__PURE__ */ React10__default.createElement(Text, { component: "dt", fw: "bold", fz: "sm" }, entry[0]), /* @__PURE__ */ React10__default.createElement(Text, { component: "dd", c: "#5c940d", fz: "sm" }, entry[1])))));
386
395
  }, [props.result.headers]);
387
- return /* @__PURE__ */ React13__default.createElement(Box, { id: "query-results-debug-view" }, /* @__PURE__ */ React13__default.createElement(Stack, { spacing: "md", px: "md", py: "sm" }, url && /* @__PURE__ */ React13__default.createElement(Input.Wrapper, { label: t("debug_view.url_logiclayer") }, /* @__PURE__ */ React13__default.createElement(Group, { noWrap: true, spacing: "xs" }, /* @__PURE__ */ React13__default.createElement(Input, { icon: /* @__PURE__ */ React13__default.createElement(IconWorld, null), readOnly: true, rightSectionWidth: "auto", value: url, w: "100%" }), /* @__PURE__ */ React13__default.createElement(Button.Group, null, /* @__PURE__ */ React13__default.createElement(Button, { leftIcon: /* @__PURE__ */ React13__default.createElement(IconExternalLink, null), onClick: openHandler, variant: "default" }, t("action_open")), /* @__PURE__ */ React13__default.createElement(Button, { leftIcon: /* @__PURE__ */ React13__default.createElement(IconClipboard, null), onClick: copyHandler, variant: "default" }, copied ? t("action_copy_done") : t("action_copy"))))), /* @__PURE__ */ React13__default.createElement(SimpleGrid, { cols: 2 }, sourceCall && /* @__PURE__ */ React13__default.createElement(Input.Wrapper, { label: jssourceLabel }, /* @__PURE__ */ React13__default.createElement(Prism, { language: "javascript", styles: { line: { boxSizing: "border-box" } } }, sourceCall)), headers)));
396
+ return /* @__PURE__ */ React10__default.createElement(Box, { id: "query-results-debug-view" }, /* @__PURE__ */ React10__default.createElement(Stack, { spacing: "md", px: "md", py: "sm" }, url && /* @__PURE__ */ React10__default.createElement(Input.Wrapper, { label: t("debug_view.url_logiclayer") }, /* @__PURE__ */ React10__default.createElement(Group, { noWrap: true, spacing: "xs" }, /* @__PURE__ */ React10__default.createElement(Input, { icon: /* @__PURE__ */ React10__default.createElement(IconWorld, null), readOnly: true, rightSectionWidth: "auto", value: url, w: "100%" }), /* @__PURE__ */ React10__default.createElement(Button.Group, null, /* @__PURE__ */ React10__default.createElement(Button, { leftIcon: /* @__PURE__ */ React10__default.createElement(IconExternalLink, null), onClick: openHandler, variant: "default" }, t("action_open")), /* @__PURE__ */ React10__default.createElement(Button, { leftIcon: /* @__PURE__ */ React10__default.createElement(IconClipboard, null), onClick: copyHandler, variant: "default" }, copied ? t("action_copy_done") : t("action_copy"))))), /* @__PURE__ */ React10__default.createElement(SimpleGrid, { cols: 2 }, sourceCall && /* @__PURE__ */ React10__default.createElement(Input.Wrapper, { label: jssourceLabel }, /* @__PURE__ */ React10__default.createElement(Prism, { language: "javascript", styles: { line: { boxSizing: "border-box" } } }, sourceCall)), headers)));
388
397
  }
389
398
 
390
399
  // src/components/Explorer.tsx
@@ -493,7 +502,7 @@ function describeData(cube, params, data) {
493
502
  return drilldowns.find((item) => item.uniqueName === name4) || measures.find((item) => item.name === name4) || drilldowns.find((item) => item.name === name4) || drilldowns.find((item) => item.uniqueName === nameWoId) || measures.find((item) => item.name === nameWoId) || drilldowns.find((item) => item.name === nameWoId);
494
503
  };
495
504
  return Object.fromEntries(
496
- filterMap(Object.keys(data[0]), (key) => {
505
+ filterMap(Object.keys(data[0] || {}), (key) => {
497
506
  const entity = entityFinder(key);
498
507
  if (!entity) return null;
499
508
  const typeSet = new Set(data.map((item) => typeof item[key]));
@@ -567,16 +576,6 @@ function parseName(name4) {
567
576
  }
568
577
  return levelArrayToRef(name4);
569
578
  }
570
- function safeRegExp(pattern, flags) {
571
- let regex;
572
- try {
573
- regex = new RegExp(pattern, flags);
574
- } catch (e) {
575
- pattern = pattern.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&");
576
- regex = new RegExp(pattern, flags);
577
- }
578
- return regex;
579
- }
580
579
  function splitName(name4) {
581
580
  const nameParts = name4.indexOf("].[") > -1 ? name4.replace(/^\[|\]$/g, "").split("].[") : name4.split(".");
582
581
  if (nameParts.length === 1) {
@@ -627,7 +626,7 @@ function buildQueryParams(props) {
627
626
  isPreview: props.isPreview || false,
628
627
  locale: props.locale || "",
629
628
  measures: props.measures || {},
630
- pagiLimit: props.pagiLimit || props.limitAmount || props.limit || 0,
629
+ pagiLimit: props.pagiLimit || props.limitAmount || props.limit || 100,
631
630
  pagiOffset: props.pagiOffset || props.limitOffset || props.offset || 0,
632
631
  sortDir: props.sortDir || props.sortDirection || props.sortOrder || props.order || "desc",
633
632
  sortKey: props.sortKey || props.sortProperty || ""
@@ -1100,7 +1099,7 @@ var selectCutMap = createSelector(
1100
1099
  (params) => params.cuts
1101
1100
  );
1102
1101
  createSelector(selectCutMap, getKeys);
1103
- createSelector(selectCutMap, getValues);
1102
+ var selectCutItems = createSelector(selectCutMap, getValues);
1104
1103
  var selectDrilldownMap = createSelector(
1105
1104
  selectCurrentQueryParams,
1106
1105
  (params) => params.drilldowns
@@ -1112,7 +1111,7 @@ var selectFilterMap = createSelector(
1112
1111
  (params) => params.filters
1113
1112
  );
1114
1113
  createSelector(selectFilterMap, getKeys);
1115
- createSelector(selectFilterMap, getValues);
1114
+ var selectFilterItems = createSelector(selectFilterMap, getValues);
1116
1115
  var selectMeasureMap = createSelector(
1117
1116
  selectCurrentQueryParams,
1118
1117
  (params) => params.measures
@@ -1127,7 +1126,7 @@ var selectIsPreviewMode = createSelector(
1127
1126
  selectCurrentQueryParams,
1128
1127
  (params) => params.isPreview
1129
1128
  );
1130
- createSelector(
1129
+ var selectPaginationParams = createSelector(
1131
1130
  selectCurrentQueryParams,
1132
1131
  (params) => ({ limit: params.pagiLimit || 0, offset: params.pagiOffset || 0 })
1133
1132
  );
@@ -1190,9 +1189,6 @@ var loadingActions = {
1190
1189
  return { type: `${name3}/setLoadingState:${status}`, payload: message };
1191
1190
  }
1192
1191
  };
1193
- function selectLoadingState(state) {
1194
- return state[name3];
1195
- }
1196
1192
  function isFetchingAction(action) {
1197
1193
  return action.type.endsWith(`:${LOADINGSTATUS.FETCHING}`);
1198
1194
  }
@@ -1288,12 +1284,7 @@ function serializeStateToSearchParams(query) {
1288
1284
  return [stringifyName(item)].concat(item.members).join(",");
1289
1285
  }
1290
1286
  function serializeDrilldown(item) {
1291
- return [stringifyName(item)].concat(
1292
- filterMap(
1293
- item.properties,
1294
- (prop) => isActiveItem(prop) ? prop.name : null
1295
- )
1296
- ).join(",");
1287
+ return [stringifyName(item)].concat(filterMap(item.properties, (prop) => isActiveItem(prop) ? prop.name : null)).join(",");
1297
1288
  }
1298
1289
  function serializeFilter(item) {
1299
1290
  const conditions = filterMap(
@@ -1357,9 +1348,9 @@ function parseStateFromSearchParams(query) {
1357
1348
  }
1358
1349
  function parseFilter(item) {
1359
1350
  const [measure, ...comparisons] = item.split(",");
1360
- const conditionOne = comparisons.slice(1, 3);
1361
- const conditionTwo = comparisons.length > 2 ? comparisons.slice(4, 6) : void 0;
1362
- const joint = comparisons.length > 2 ? comparisons[3] : void 0;
1351
+ const conditionOne = comparisons.slice(0, 3);
1352
+ const conditionTwo = comparisons.length > 2 ? comparisons.slice(3, 5) : void 0;
1353
+ const joint = comparisons.length > 2 ? comparisons[2] : void 0;
1363
1354
  return buildFilter({
1364
1355
  active: true,
1365
1356
  measure,
@@ -1371,6 +1362,7 @@ function parseStateFromSearchParams(query) {
1371
1362
  const comparison = cond[0];
1372
1363
  const inputtedValue = cond[1];
1373
1364
  const interpretedValue = Number.parseFloat(cond[1]);
1365
+ console.log("Entro parse", comparison, inputtedValue, interpretedValue);
1374
1366
  return [comparison, inputtedValue, interpretedValue];
1375
1367
  }
1376
1368
  }
@@ -1425,10 +1417,10 @@ function SettingsProvider(props) {
1425
1417
  panels: props.panels,
1426
1418
  previewLimit: props.previewLimit || 50
1427
1419
  }), [props.formatters, props.previewLimit]);
1428
- return /* @__PURE__ */ React13__default.createElement(ContextProvider, { value }, props.children);
1420
+ return /* @__PURE__ */ React10__default.createElement(ContextProvider, { value }, props.children);
1429
1421
  }
1430
1422
  function SettingsConsumer(props) {
1431
- return /* @__PURE__ */ React13__default.createElement(ContextConsumer, null, useCallback((context) => {
1423
+ return /* @__PURE__ */ React10__default.createElement(ContextConsumer, null, useCallback((context) => {
1432
1424
  if (context === void 0) {
1433
1425
  throw new Error("SettingsConsumer must be used within a SettingsProvider.");
1434
1426
  }
@@ -1474,6 +1466,14 @@ function applyQueryParams(query, params, settings) {
1474
1466
  Object.values(params.cuts).forEach((item) => {
1475
1467
  isActiveCut(item) && query.addCut(item, item.members);
1476
1468
  });
1469
+ Object.values(params.filters).forEach((item) => {
1470
+ isActiveItem(item) && query.addFilter(
1471
+ item.measure,
1472
+ item.conditionOne,
1473
+ item.joint && item.conditionTwo ? item.joint : "",
1474
+ item.joint && item.conditionTwo ? item.conditionTwo : ""
1475
+ );
1476
+ });
1477
1477
  Object.values(params.drilldowns).forEach((item) => {
1478
1478
  if (!isActiveItem(item)) return;
1479
1479
  query.addDrilldown(item);
@@ -1541,6 +1541,16 @@ function extractQueryParams(query) {
1541
1541
 
1542
1542
  // src/state/utils.ts
1543
1543
  init_esm_shims();
1544
+ var createCutHandler = (cuts, level, dispatch) => {
1545
+ const cutItem = Object.values(cuts).find((cut) => {
1546
+ return cut.uniqueName === level.uniqueName;
1547
+ });
1548
+ if (!cutItem) {
1549
+ const cutItem2 = buildCut({ ...level, key: level.uniqueName, members: [] });
1550
+ cutItem2.active = false;
1551
+ dispatch(actions.updateCut(cutItem2));
1552
+ }
1553
+ };
1544
1554
  function calcMaxMemberCount(query, params, dispatch) {
1545
1555
  const ds = query.cube.datasource;
1546
1556
  ds.axiosInstance.defaults.responseType = void 0;
@@ -1550,8 +1560,8 @@ function calcMaxMemberCount(query, params, dispatch) {
1550
1560
  });
1551
1561
  const memberLengths = query.getParam("drilldowns").map(
1552
1562
  (level) => Level.isLevel(level) ? drills[level.uniqueName] || ds.fetchMembers(level).then(async (members) => {
1553
- const { cube, name: name4, dimension, fullName, depth, properties, hierarchy, annotations } = level;
1554
- const lv = {
1563
+ const { cube, name: name4, dimension, fullName, depth, properties, hierarchy, annotations, key } = level;
1564
+ ({
1555
1565
  cube: cube.name,
1556
1566
  dimension: dimension.name,
1557
1567
  fullName,
@@ -1559,19 +1569,32 @@ function calcMaxMemberCount(query, params, dispatch) {
1559
1569
  _type: "level",
1560
1570
  name: name4,
1561
1571
  uri: level._source.uri,
1562
- properties: properties.map((p) => ({ name: p.name, annotations: p.annotations, uri: p._source.uri, _type: "property" })),
1572
+ properties: properties.map((p) => ({
1573
+ name: p.name,
1574
+ annotations: p.annotations,
1575
+ uri: p._source.uri,
1576
+ _type: "property"
1577
+ })),
1563
1578
  hierarchy: hierarchy.name,
1564
1579
  annotations
1565
- };
1566
- const dd = buildDrilldown(lv);
1567
- const ddd = { ...dd, key: dd.fullName, dimType: dimension.dimensionType, memberCount: members.length, members };
1568
- dispatch(actions.updateDrilldown(ddd));
1580
+ });
1581
+ const drilldown = Object.values(params.drilldowns).find(
1582
+ (d) => d.uniqueName === level.uniqueName
1583
+ );
1584
+ if (drilldown) {
1585
+ const ddd = {
1586
+ ...drilldown,
1587
+ dimType: dimension.dimensionType,
1588
+ memberCount: members.length,
1589
+ members
1590
+ };
1591
+ dispatch(actions.updateDrilldown(ddd));
1592
+ createCutHandler(params.cuts, ddd, dispatch);
1593
+ }
1569
1594
  return members.length;
1570
1595
  }) : Promise.resolve(1)
1571
1596
  );
1572
- return Promise.all(memberLengths).then(
1573
- (lengths) => lengths.reduce((prev, curr) => prev * curr)
1574
- );
1597
+ return Promise.all(memberLengths).then((lengths) => lengths.reduce((prev, curr) => prev * curr));
1575
1598
  }
1576
1599
  function hydrateDrilldownProperties(cube, drilldownItem) {
1577
1600
  const activeProperties = filterMap(
@@ -1585,17 +1608,98 @@ function hydrateDrilldownProperties(cube, drilldownItem) {
1585
1608
  fullName: level.fullName,
1586
1609
  uniqueName: level.uniqueName,
1587
1610
  dimType: level.dimension.dimensionType,
1588
- properties: level.properties.map((property) => buildProperty({
1589
- active: activeProperties.includes(property.name),
1590
- level: level.uniqueName,
1591
- name: property.name,
1592
- uniqueName: property.uniqueName
1593
- }))
1611
+ properties: level.properties.map(
1612
+ (property) => buildProperty({
1613
+ active: activeProperties.includes(property.name),
1614
+ level: level.uniqueName,
1615
+ name: property.name,
1616
+ uniqueName: property.uniqueName
1617
+ })
1618
+ )
1594
1619
  });
1595
1620
  }
1596
1621
  }
1597
1622
  return drilldownItem;
1598
1623
  }
1624
+ function deriveDrilldowns(dimensions) {
1625
+ const drilldowns = [];
1626
+ const findDefaultHierarchy = (d) => d.hierarchies.find((h) => h.name === d.defaultHierarchy);
1627
+ const timeDim = dimensions.find((d) => d.dimensionType === "time");
1628
+ if (timeDim) {
1629
+ const timeDrilldown = findDefaultHierarchy(timeDim).levels[0];
1630
+ drilldowns.push(timeDrilldown);
1631
+ }
1632
+ for (const dim of dimensions) {
1633
+ if (dim.type !== "time" && drilldowns.length < 4) {
1634
+ const { levels } = findDefaultHierarchy(dim);
1635
+ const levelIndex = dim.type === "geo" ? levels.length - 1 : 0;
1636
+ drilldowns.push(levels[levelIndex]);
1637
+ }
1638
+ }
1639
+ return drilldowns;
1640
+ }
1641
+
1642
+ // src/state/selectors.js
1643
+ init_esm_shims();
1644
+ var selectOlapCube = createSelector(
1645
+ [selectOlapCubeMap, selectCubeName],
1646
+ (cubeMap, cubeName) => cubeName in cubeMap ? cubeMap[cubeName] : void 0
1647
+ );
1648
+ var selectOlapMeasureItems = createSelector(
1649
+ selectOlapCube,
1650
+ (cube) => cube ? cube.measures : []
1651
+ );
1652
+ var selectOlapMeasureMap = createSelector(
1653
+ selectOlapMeasureItems,
1654
+ (measures) => Object.fromEntries(measures.map((item) => [item.name, item]))
1655
+ );
1656
+ var selectOlapDimensionItems = createSelector(
1657
+ selectOlapCube,
1658
+ (cube) => !cube ? [] : cube.dimensions.map((dim) => ({
1659
+ item: {
1660
+ ...dim,
1661
+ hierarchies: dim.hierarchies.slice().map((hierarchy) => {
1662
+ hierarchy.levels.slice().sort(
1663
+ (a, b) => getOrderValue(a) - getOrderValue(b)
1664
+ );
1665
+ return hierarchy;
1666
+ }).sort(
1667
+ (a, b) => getOrderValue(a) - getOrderValue(b)
1668
+ )
1669
+ },
1670
+ count: dim.hierarchies.reduce((acc, hie) => acc + hie.levels.length, 0),
1671
+ alpha: dim.hierarchies.reduce((acc, hie) => acc.concat(hie.name, "-"), "")
1672
+ })).sort(
1673
+ (a, b) => getOrderValue(a.item) - getOrderValue(b.item) || b.count - a.count || a.alpha.localeCompare(b.alpha)
1674
+ ).map((i) => i.item)
1675
+ );
1676
+ createSelector(
1677
+ selectOlapDimensionItems,
1678
+ (dimensions) => Object.fromEntries(dimensions.map((item) => [item.name, item]))
1679
+ );
1680
+ createSelector(
1681
+ selectOlapCube,
1682
+ (cube) => !cube ? {} : Object.fromEntries(
1683
+ cube.dimensions.flatMap(
1684
+ (dim) => dim.hierarchies.flatMap(
1685
+ (hie) => hie.levels.map((lvl) => {
1686
+ const fullName = [dim.name, hie.name, lvl.name].join(".");
1687
+ return tuple(fullName, triad(dim, hie, lvl));
1688
+ })
1689
+ )
1690
+ )
1691
+ )
1692
+ );
1693
+ createSelector(
1694
+ selectOlapDimensionItems,
1695
+ (dimensions) => dimensions.find(
1696
+ (d) => d.dimensionType === "time" || d.name === "Year" || d.name === "Date"
1697
+ )
1698
+ );
1699
+ var selectSerializedParams = createSelector(
1700
+ selectCurrentQueryParams,
1701
+ serializePermalink
1702
+ );
1599
1703
 
1600
1704
  // src/state/thunks.ts
1601
1705
  function willDownloadQuery(format2) {
@@ -1608,15 +1712,14 @@ function willDownloadQuery(format2) {
1608
1712
  const axios = olapClient.datasource.axiosInstance;
1609
1713
  return olapClient.getCube(params.cube).then((cube) => {
1610
1714
  const filename = `${cube.name}_${(/* @__PURE__ */ new Date()).toISOString()}`;
1611
- const query = applyQueryParams(cube.query, params, { previewLimit }).setFormat(format2);
1715
+ const queryParams = { ...params, pagiLimit: 0, pagiOffset: 0 };
1716
+ const query = applyQueryParams(cube.query, queryParams, { previewLimit }).setFormat(format2);
1612
1717
  const dataURL = query.toString("logiclayer").replace(olapClient.datasource.serverUrl, "");
1613
1718
  return Promise.all([
1614
1719
  axios({ url: dataURL, responseType: "blob" }).then((response) => response.data),
1615
1720
  calcMaxMemberCount(query, params).then((maxRows) => {
1616
1721
  if (maxRows > 5e4) {
1617
- dispatch(
1618
- loadingActions.setLoadingMessage({ type: "HEAVY_QUERY", rows: maxRows })
1619
- );
1722
+ dispatch(loadingActions.setLoadingMessage({ type: "HEAVY_QUERY", rows: maxRows }));
1620
1723
  }
1621
1724
  })
1622
1725
  ]).then((result) => ({
@@ -1627,43 +1730,55 @@ function willDownloadQuery(format2) {
1627
1730
  });
1628
1731
  };
1629
1732
  }
1630
- function willExecuteQuery() {
1733
+ function willExecuteQuery({ limit, offset } = {}) {
1631
1734
  return (dispatch, getState, { olapClient, previewLimit }) => {
1632
1735
  const state = getState();
1633
1736
  const params = selectCurrentQueryParams(state);
1634
1737
  const endpoint = selectServerEndpoint(state);
1738
+ const isPrefetch = limit && offset;
1739
+ const allParams = isPrefetch ? { ...params, pagiLimit: limit, pagiOffset: offset } : params;
1740
+ const { result: currentResult } = selectCurrentQueryItem(state);
1635
1741
  if (!isValidQuery(params)) return Promise.resolve();
1636
1742
  return olapClient.getCube(params.cube).then((cube) => {
1637
- const query = applyQueryParams(cube.query, params, { previewLimit });
1743
+ const query = applyQueryParams(cube.query, allParams, { previewLimit });
1638
1744
  return Promise.all([
1639
1745
  olapClient.execQuery(query, endpoint),
1640
- calcMaxMemberCount(query, params, dispatch).then((maxRows) => {
1746
+ calcMaxMemberCount(query, allParams, dispatch).then((maxRows) => {
1641
1747
  if (maxRows > 5e4) {
1642
1748
  dispatch(loadingActions.setLoadingMessage({ type: "HEAVY_QUERY", rows: maxRows }));
1643
1749
  }
1644
1750
  })
1645
- ]).then((result) => {
1646
- const [aggregation] = result;
1647
- dispatch(
1648
- queriesActions.updateResult({
1751
+ ]).then(
1752
+ (result) => {
1753
+ const [aggregation] = result;
1754
+ !isPrefetch && dispatch(
1755
+ queriesActions.updateResult({
1756
+ data: aggregation.data,
1757
+ types: aggregation.data.length ? describeData(cube.toJSON(), params, aggregation.data) : currentResult.types,
1758
+ headers: { ...aggregation.headers },
1759
+ sourceCall: query.toSource(),
1760
+ status: aggregation.status || 500,
1761
+ url: query.toString(endpoint)
1762
+ })
1763
+ );
1764
+ return {
1649
1765
  data: aggregation.data,
1650
- types: describeData(cube.toJSON(), params, aggregation.data),
1651
- headers: { ...aggregation.headers },
1652
- sourceCall: query.toSource(),
1653
- status: aggregation.status || 500,
1654
- url: query.toString(endpoint)
1655
- })
1656
- );
1657
- }, (error) => {
1658
- var _a, _b;
1659
- dispatch(queriesActions.updateResult({
1660
- data: [],
1661
- types: {},
1662
- error: error.message,
1663
- status: (_b = (_a = error == null ? void 0 : error.response) == null ? void 0 : _a.status) != null ? _b : 500,
1664
- url: query.toString(endpoint)
1665
- }));
1666
- });
1766
+ types: aggregation.data.length ? describeData(cube.toJSON(), params, aggregation.data) : currentResult.types
1767
+ };
1768
+ },
1769
+ (error) => {
1770
+ var _a, _b;
1771
+ dispatch(
1772
+ queriesActions.updateResult({
1773
+ data: [],
1774
+ types: {},
1775
+ error: error.message,
1776
+ status: (_b = (_a = error == null ? void 0 : error.response) == null ? void 0 : _a.status) != null ? _b : 500,
1777
+ url: query.toString(endpoint)
1778
+ })
1779
+ );
1780
+ }
1781
+ );
1667
1782
  });
1668
1783
  };
1669
1784
  }
@@ -1695,11 +1810,15 @@ function willHydrateParams(suggestedCube) {
1695
1810
  Object.keys(cubeMap)[0]
1696
1811
  );
1697
1812
  return olapClient.getCube(cubeName).then((cube) => {
1698
- const resolvedMeasures = cube.measures.map((measure) => buildMeasure(measureItems[measure.name] || {
1699
- active: false,
1700
- key: measure.name,
1701
- name: measure.name
1702
- }));
1813
+ const resolvedMeasures = cube.measures.map(
1814
+ (measure) => buildMeasure(
1815
+ measureItems[measure.name] || {
1816
+ active: false,
1817
+ key: measure.name,
1818
+ name: measure.name
1819
+ }
1820
+ )
1821
+ );
1703
1822
  const resolvedDrilldowns = filterMap(
1704
1823
  Object.values(params.drilldowns),
1705
1824
  (item) => hydrateDrilldownProperties(cube, item) || null
@@ -1724,6 +1843,7 @@ function willHydrateParams(suggestedCube) {
1724
1843
  }
1725
1844
  function willParseQueryUrl(url) {
1726
1845
  return (dispatch, getState, { olapClient }) => olapClient.parseQueryURL(url.toString(), { anyServer: true }).then((query) => {
1846
+ extractQueryParams(query);
1727
1847
  const queryItem = buildQuery({
1728
1848
  params: extractQueryParams(query)
1729
1849
  });
@@ -1748,11 +1868,14 @@ function willRequestQuery() {
1748
1868
  const params = selectCurrentQueryParams(state);
1749
1869
  if (!isValidQuery(params)) return Promise.resolve();
1750
1870
  dispatch(loadingActions.setLoadingState("FETCHING"));
1751
- return dispatch(willExecuteQuery()).then(() => {
1752
- dispatch(loadingActions.setLoadingState("SUCCESS"));
1753
- }, (error) => {
1754
- dispatch(loadingActions.setLoadingState("FAILURE", error.message));
1755
- });
1871
+ return dispatch(willExecuteQuery()).then(
1872
+ () => {
1873
+ dispatch(loadingActions.setLoadingState("SUCCESS"));
1874
+ },
1875
+ (error) => {
1876
+ dispatch(loadingActions.setLoadingState("FAILURE", error.message));
1877
+ }
1878
+ );
1756
1879
  };
1757
1880
  }
1758
1881
  function willSetCube(cubeName) {
@@ -1764,15 +1887,22 @@ function willSetCube(cubeName) {
1764
1887
  (item) => item.active ? item.name : null
1765
1888
  );
1766
1889
  return olapClient.getCube(cubeName).then((cube) => {
1767
- const measures = filterMap(cube.measures, (measure) => buildMeasure({
1768
- active: currentActiveMeasures.includes(measure.name),
1769
- key: measure.name,
1770
- name: measure.name
1771
- }));
1772
- dispatch(queriesActions.updateCube({
1773
- cube: cube.name,
1774
- measures: keyBy(measures, (item) => item.key)
1775
- }));
1890
+ const measures = filterMap(
1891
+ cube.measures,
1892
+ (measure) => buildMeasure({
1893
+ active: currentActiveMeasures.includes(measure.name),
1894
+ key: measure.name,
1895
+ name: measure.name
1896
+ })
1897
+ );
1898
+ dispatch(
1899
+ queriesActions.updateCube({
1900
+ cube: cube.name,
1901
+ measures: keyBy(measures, (item) => item.key)
1902
+ })
1903
+ );
1904
+ const dimensions = selectOlapDimensionItems(getState());
1905
+ return { cube, measures, dimensions };
1776
1906
  });
1777
1907
  };
1778
1908
  }
@@ -1780,23 +1910,30 @@ function willSetupClient(serverConfig) {
1780
1910
  return (dispatch, getState, { olapClient: client }) => Client.dataSourceFromURL(serverConfig).then((datasource) => {
1781
1911
  client.setDataSource(datasource);
1782
1912
  return client.checkStatus();
1783
- }).then((serverInfo) => {
1784
- dispatch(serverActions.updateServer({
1785
- online: serverInfo.online,
1786
- software: serverInfo.software,
1787
- url: serverInfo.url,
1788
- version: serverInfo.version,
1789
- endpoint: serverInfo.software === TesseractDataSource.softwareName ? "logiclayer" : "aggregate"
1790
- }));
1791
- }, (error) => {
1792
- dispatch(serverActions.updateServer({
1793
- online: false,
1794
- software: "",
1795
- url: error.config.url,
1796
- version: ""
1797
- }));
1798
- throw error;
1799
- });
1913
+ }).then(
1914
+ (serverInfo) => {
1915
+ dispatch(
1916
+ serverActions.updateServer({
1917
+ online: serverInfo.online,
1918
+ software: serverInfo.software,
1919
+ url: serverInfo.url,
1920
+ version: serverInfo.version,
1921
+ endpoint: serverInfo.software === TesseractDataSource.softwareName ? "logiclayer" : "aggregate"
1922
+ })
1923
+ );
1924
+ },
1925
+ (error) => {
1926
+ dispatch(
1927
+ serverActions.updateServer({
1928
+ online: false,
1929
+ software: "",
1930
+ url: error.config.url,
1931
+ version: ""
1932
+ })
1933
+ );
1934
+ throw error;
1935
+ }
1936
+ );
1800
1937
  }
1801
1938
 
1802
1939
  // src/state/index.ts
@@ -1812,7 +1949,7 @@ init_esm_shims();
1812
1949
 
1813
1950
  // src/hooks/setup.js
1814
1951
  init_esm_shims();
1815
- function useSetup(serverConfig, locale) {
1952
+ function useSetup(serverConfig, locale, defaultCube) {
1816
1953
  const actions2 = useActions();
1817
1954
  const [done, setDone] = useState(false);
1818
1955
  const cleanLocale = useMemo(
@@ -1845,20 +1982,23 @@ function useSetup(serverConfig, locale) {
1845
1982
  query = buildQuery({ params: { ...historyState } });
1846
1983
  }
1847
1984
  if (!query || !hasOwnProperty(cubeMap, query.params.cube)) {
1848
- const defaultCube = Object.keys(cubeMap)[0];
1849
- return actions2.willHydrateParams(defaultCube);
1985
+ const cube = defaultCube && hasOwnProperty(cubeMap, defaultCube) ? defaultCube : Object.keys(cubeMap)[0];
1986
+ return actions2.willHydrateParams(cube);
1850
1987
  }
1851
1988
  query.params.locale = query.params.locale || cleanLocale[0];
1852
1989
  actions2.resetQueries({ [query.key]: query });
1853
- return actions2.willHydrateParams().then(() => actions2.willExecuteQuery());
1854
- }).then(() => {
1855
- actions2.setLoadingState("SUCCESS");
1856
- setDone(true);
1857
- }, (error) => {
1858
- console.dir("There was an error during setup:", error);
1859
- actions2.setLoadingState("FAILURE", error.message);
1860
- setDone(true);
1861
- });
1990
+ return actions2.willHydrateParams();
1991
+ }).then(
1992
+ () => {
1993
+ actions2.setLoadingState("SUCCESS");
1994
+ setDone(true);
1995
+ },
1996
+ (error) => {
1997
+ console.dir("There was an error during setup:", error);
1998
+ actions2.setLoadingState("FAILURE", error.message);
1999
+ setDone(true);
2000
+ }
2001
+ );
1862
2002
  }, [serverConfig]);
1863
2003
  return done;
1864
2004
  }
@@ -1913,7 +2053,7 @@ var defaultProps = {
1913
2053
  function AnimatedCube(props) {
1914
2054
  const { color, shade } = useComponentDefaultProps(AnimatedCube.displayName, defaultProps, props);
1915
2055
  const { classes, cx } = useStyles({ color, shade });
1916
- return /* @__PURE__ */ React13__default.createElement(
2056
+ return /* @__PURE__ */ React10__default.createElement(
1917
2057
  "svg",
1918
2058
  {
1919
2059
  className: cx("dataex-Anicube-root", classes.root),
@@ -1921,12 +2061,12 @@ function AnimatedCube(props) {
1921
2061
  viewBox: "0 0 256 256",
1922
2062
  height: props.size || 256
1923
2063
  },
1924
- /* @__PURE__ */ React13__default.createElement("path", { className: cx("dataex-Anicube-side", classes.side, "a"), d: "M128 128v128l111 -64v-128l-111 64z" }),
1925
- /* @__PURE__ */ React13__default.createElement("path", { className: cx("dataex-Anicube-side", classes.side, "b"), d: "M128 128l111 -64l-111 -64l-111 64l111 64z" }),
1926
- /* @__PURE__ */ React13__default.createElement("path", { className: cx("dataex-Anicube-side", classes.side, "c"), d: "M128 128l-111 -64v128l111 64v-128z" }),
1927
- /* @__PURE__ */ React13__default.createElement("path", { className: cx("dataex-Anicube-side", classes.side, "a"), d: "M128 128v-64l-55 32v64l55 -32z" }),
1928
- /* @__PURE__ */ React13__default.createElement("path", { className: cx("dataex-Anicube-side", classes.side, "b"), d: "M128 128l-55 32l55 32l55 -32l-55 -32z" }),
1929
- /* @__PURE__ */ React13__default.createElement("path", { className: cx("dataex-Anicube-side", classes.side, "c"), d: "M128 128l55 32v-64l-55 -32v64z" })
2064
+ /* @__PURE__ */ React10__default.createElement("path", { className: cx("dataex-Anicube-side", classes.side, "a"), d: "M128 128v128l111 -64v-128l-111 64z" }),
2065
+ /* @__PURE__ */ React10__default.createElement("path", { className: cx("dataex-Anicube-side", classes.side, "b"), d: "M128 128l111 -64l-111 -64l-111 64l111 64z" }),
2066
+ /* @__PURE__ */ React10__default.createElement("path", { className: cx("dataex-Anicube-side", classes.side, "c"), d: "M128 128l-111 -64v128l111 64v-128z" }),
2067
+ /* @__PURE__ */ React10__default.createElement("path", { className: cx("dataex-Anicube-side", classes.side, "a"), d: "M128 128v-64l-55 32v64l55 -32z" }),
2068
+ /* @__PURE__ */ React10__default.createElement("path", { className: cx("dataex-Anicube-side", classes.side, "b"), d: "M128 128l-55 32l55 32l55 -32l-55 -32z" }),
2069
+ /* @__PURE__ */ React10__default.createElement("path", { className: cx("dataex-Anicube-side", classes.side, "c"), d: "M128 128l55 32v-64l-55 -32v64z" })
1930
2070
  );
1931
2071
  }
1932
2072
  AnimatedCube.displayName = "DataExplorer/Anicube";
@@ -1934,68 +2074,6 @@ AnimatedCube.displayName = "DataExplorer/Anicube";
1934
2074
  // src/components/ExplorerResults.tsx
1935
2075
  init_esm_shims();
1936
2076
 
1937
- // src/state/selectors.js
1938
- init_esm_shims();
1939
- var selectOlapCube = createSelector(
1940
- [selectOlapCubeMap, selectCubeName],
1941
- (cubeMap, cubeName) => cubeName in cubeMap ? cubeMap[cubeName] : void 0
1942
- );
1943
- var selectOlapMeasureItems = createSelector(
1944
- selectOlapCube,
1945
- (cube) => cube ? cube.measures : []
1946
- );
1947
- var selectOlapMeasureMap = createSelector(
1948
- selectOlapMeasureItems,
1949
- (measures) => Object.fromEntries(measures.map((item) => [item.name, item]))
1950
- );
1951
- var selectOlapDimensionItems = createSelector(
1952
- selectOlapCube,
1953
- (cube) => !cube ? [] : cube.dimensions.map((dim) => ({
1954
- item: {
1955
- ...dim,
1956
- hierarchies: dim.hierarchies.slice().map((hierarchy) => {
1957
- hierarchy.levels.slice().sort(
1958
- (a, b) => getOrderValue(a) - getOrderValue(b)
1959
- );
1960
- return hierarchy;
1961
- }).sort(
1962
- (a, b) => getOrderValue(a) - getOrderValue(b)
1963
- )
1964
- },
1965
- count: dim.hierarchies.reduce((acc, hie) => acc + hie.levels.length, 0),
1966
- alpha: dim.hierarchies.reduce((acc, hie) => acc.concat(hie.name, "-"), "")
1967
- })).sort(
1968
- (a, b) => getOrderValue(a.item) - getOrderValue(b.item) || b.count - a.count || a.alpha.localeCompare(b.alpha)
1969
- ).map((i) => i.item)
1970
- );
1971
- createSelector(
1972
- selectOlapDimensionItems,
1973
- (dimensions) => Object.fromEntries(dimensions.map((item) => [item.name, item]))
1974
- );
1975
- createSelector(
1976
- selectOlapCube,
1977
- (cube) => !cube ? {} : Object.fromEntries(
1978
- cube.dimensions.flatMap(
1979
- (dim) => dim.hierarchies.flatMap(
1980
- (hie) => hie.levels.map((lvl) => {
1981
- const fullName = [dim.name, hie.name, lvl.name].join(".");
1982
- return tuple(fullName, triad(dim, hie, lvl));
1983
- })
1984
- )
1985
- )
1986
- )
1987
- );
1988
- createSelector(
1989
- selectOlapDimensionItems,
1990
- (dimensions) => dimensions.find(
1991
- (d) => d.dimensionType === "time" || d.name === "Year" || d.name === "Date"
1992
- )
1993
- );
1994
- var selectSerializedParams = createSelector(
1995
- selectCurrentQueryParams,
1996
- serializePermalink
1997
- );
1998
-
1999
2077
  // src/components/PreviewModeSwitch.jsx
2000
2078
  init_esm_shims();
2001
2079
  var PreviewModeSwitch = (props) => {
@@ -2011,17 +2089,17 @@ var PreviewModeSwitch = (props) => {
2011
2089
  const onClickLoadAllResults = useCallback(() => {
2012
2090
  actions2.updateIsPreview(!isPreviewMode);
2013
2091
  }, [isPreviewMode]);
2014
- const target = /* @__PURE__ */ React13__default.createElement(
2092
+ const target = /* @__PURE__ */ React10__default.createElement(
2015
2093
  Switch,
2016
2094
  {
2017
2095
  checked: !isPreviewMode,
2018
2096
  styles: { label: { display: "flex", alignContent: "center", gap: "0.25rem" } },
2019
- label: /* @__PURE__ */ React13__default.createElement(React13__default.Fragment, null, t("params.label_boolean_full_results"), withTooltip && /* @__PURE__ */ React13__default.createElement(ThemeIcon, { variant: "subtle", size: "sm" }, /* @__PURE__ */ React13__default.createElement(IconInfoCircleFilled, null))),
2097
+ label: /* @__PURE__ */ React10__default.createElement(React10__default.Fragment, null, t("params.label_boolean_full_results"), withTooltip && /* @__PURE__ */ React10__default.createElement(ThemeIcon, { variant: "subtle", size: "sm" }, /* @__PURE__ */ React10__default.createElement(IconInfoCircleFilled, null))),
2020
2098
  onChange: onClickLoadAllResults
2021
2099
  }
2022
2100
  );
2023
2101
  if (!withTooltip) return target;
2024
- return /* @__PURE__ */ React13__default.createElement(
2102
+ return /* @__PURE__ */ React10__default.createElement(
2025
2103
  Tooltip,
2026
2104
  {
2027
2105
  events: {
@@ -2034,7 +2112,7 @@ var PreviewModeSwitch = (props) => {
2034
2112
  withArrow: true,
2035
2113
  withinPortal: true
2036
2114
  },
2037
- /* @__PURE__ */ React13__default.createElement("div", null, target)
2115
+ /* @__PURE__ */ React10__default.createElement("div", null, target)
2038
2116
  );
2039
2117
  };
2040
2118
 
@@ -2099,13 +2177,13 @@ function useFormatter(measures) {
2099
2177
  // src/components/icons/index.tsx
2100
2178
  init_esm_shims();
2101
2179
  function IconChevronLeft() {
2102
- return /* @__PURE__ */ React13__default.createElement("svg", { width: "9", height: "13", viewBox: "0 0 6 11", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, /* @__PURE__ */ React13__default.createElement("path", { d: "M5.5 1L1 5.5L5.5 10", stroke: "black", strokeLinecap: "round" }));
2180
+ return /* @__PURE__ */ React10__default.createElement("svg", { width: "9", height: "13", viewBox: "0 0 6 11", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, /* @__PURE__ */ React10__default.createElement("path", { d: "M5.5 1L1 5.5L5.5 10", stroke: "black", strokeLinecap: "round" }));
2103
2181
  }
2104
2182
  function IconChevronRight() {
2105
- return /* @__PURE__ */ React13__default.createElement("svg", { width: "9", height: "13", viewBox: "0 0 7 11", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, /* @__PURE__ */ React13__default.createElement("path", { d: "M1 10L5.5 5.5L1 1", stroke: "black", strokeLinecap: "round" }));
2183
+ return /* @__PURE__ */ React10__default.createElement("svg", { width: "9", height: "13", viewBox: "0 0 7 11", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, /* @__PURE__ */ React10__default.createElement("path", { d: "M1 10L5.5 5.5L1 1", stroke: "black", strokeLinecap: "round" }));
2106
2184
  }
2107
2185
  function DataSetSVG() {
2108
- return /* @__PURE__ */ React13__default.createElement("svg", { width: "25", height: "25", viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, /* @__PURE__ */ React13__default.createElement(
2186
+ return /* @__PURE__ */ React10__default.createElement("svg", { width: "25", height: "25", viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, /* @__PURE__ */ React10__default.createElement(
2109
2187
  "path",
2110
2188
  {
2111
2189
  d: "M3.33325 5C3.33325 5.66304 4.03563 6.29893 5.28587 6.76777C6.53612 7.23661 8.23181 7.5 9.99992 7.5C11.768 7.5 13.4637 7.23661 14.714 6.76777C15.9642 6.29893 16.6666 5.66304 16.6666 5C16.6666 4.33696 15.9642 3.70107 14.714 3.23223C13.4637 2.76339 11.768 2.5 9.99992 2.5C8.23181 2.5 6.53612 2.76339 5.28587 3.23223C4.03563 3.70107 3.33325 4.33696 3.33325 5Z",
@@ -2113,7 +2191,7 @@ function DataSetSVG() {
2113
2191
  strokeLinecap: "round",
2114
2192
  strokeLinejoin: "round"
2115
2193
  }
2116
- ), /* @__PURE__ */ React13__default.createElement(
2194
+ ), /* @__PURE__ */ React10__default.createElement(
2117
2195
  "path",
2118
2196
  {
2119
2197
  d: "M3.33325 5V10C3.33325 10.663 4.03563 11.2989 5.28587 11.7678C6.53612 12.2366 8.23181 12.5 9.99992 12.5C11.768 12.5 13.4637 12.2366 14.714 11.7678C15.9642 11.2989 16.6666 10.663 16.6666 10V5",
@@ -2121,7 +2199,7 @@ function DataSetSVG() {
2121
2199
  strokeLinecap: "round",
2122
2200
  strokeLinejoin: "round"
2123
2201
  }
2124
- ), /* @__PURE__ */ React13__default.createElement(
2202
+ ), /* @__PURE__ */ React10__default.createElement(
2125
2203
  "path",
2126
2204
  {
2127
2205
  d: "M3.33325 10V15C3.33325 15.663 4.03563 16.2989 5.28587 16.7678C6.53612 17.2366 8.23181 17.5 9.99992 17.5C11.768 17.5 13.4637 17.2366 14.714 16.7678C15.9642 16.2989 16.6666 15.663 16.6666 15V10",
@@ -2132,7 +2210,7 @@ function DataSetSVG() {
2132
2210
  ));
2133
2211
  }
2134
2212
  function HomeSVG() {
2135
- return /* @__PURE__ */ React13__default.createElement("svg", { width: "22", height: "24", viewBox: "0 0 16 18", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, /* @__PURE__ */ React13__default.createElement(
2213
+ return /* @__PURE__ */ React10__default.createElement("svg", { width: "22", height: "24", viewBox: "0 0 16 18", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, /* @__PURE__ */ React10__default.createElement(
2136
2214
  "path",
2137
2215
  {
2138
2216
  d: "M2 16H5V10H11V16H14V7L8 2.5L2 7V16ZM0 18V6L8 0L16 6V18H9V12H7V18H0Z",
@@ -2140,18 +2218,8 @@ function HomeSVG() {
2140
2218
  }
2141
2219
  ));
2142
2220
  }
2143
- function PlusSVG() {
2144
- const theme = useMantineTheme();
2145
- return /* @__PURE__ */ React13__default.createElement("svg", { width: "35", height: "37", viewBox: "0 0 26 29", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, /* @__PURE__ */ React13__default.createElement("circle", { cx: "13", cy: "12", r: "12", fill: theme.colors[theme.primaryColor][5] }), /* @__PURE__ */ React13__default.createElement(
2146
- "path",
2147
- {
2148
- d: "M18.8008 10.8477V12.8867H7.10547V10.8477H18.8008ZM14.043 5.86719V18.2891H11.875V5.86719H14.043Z",
2149
- fill: "white"
2150
- }
2151
- ));
2152
- }
2153
2221
  function StackSVG() {
2154
- return /* @__PURE__ */ React13__default.createElement(
2222
+ return /* @__PURE__ */ React10__default.createElement(
2155
2223
  "svg",
2156
2224
  {
2157
2225
  width: "15",
@@ -2160,12 +2228,12 @@ function StackSVG() {
2160
2228
  fill: "currentColor",
2161
2229
  xmlns: "http://www.w3.org/2000/svg"
2162
2230
  },
2163
- /* @__PURE__ */ React13__default.createElement("path", { d: "M14 3.38826C14 1.87066 10.7949 0.588257 7 0.588257C3.20513 0.588257 0 1.87066 0 3.38826V4.78826C0 6.30586 3.20513 7.58826 7 7.58826C10.7949 7.58826 14 6.30586 14 4.78826V3.38826ZM7 12.4883C3.20513 12.4883 0 11.2059 0 9.68826V11.7883C0 13.3059 3.20513 14.5883 7 14.5883C10.7949 14.5883 14 13.3059 14 11.7883V9.68826C14 11.2059 10.7949 12.4883 7 12.4883Z" }),
2164
- /* @__PURE__ */ React13__default.createElement("path", { d: "M14 6.18823C14 7.70583 10.7949 8.98823 7 8.98823C3.20513 8.98823 0 7.70583 0 6.18823V8.28823C0 9.80583 3.20513 11.0882 7 11.0882C10.7949 11.0882 14 9.80583 14 8.28823V6.18823Z" })
2231
+ /* @__PURE__ */ React10__default.createElement("path", { d: "M14 3.38826C14 1.87066 10.7949 0.588257 7 0.588257C3.20513 0.588257 0 1.87066 0 3.38826V4.78826C0 6.30586 3.20513 7.58826 7 7.58826C10.7949 7.58826 14 6.30586 14 4.78826V3.38826ZM7 12.4883C3.20513 12.4883 0 11.2059 0 9.68826V11.7883C0 13.3059 3.20513 14.5883 7 14.5883C10.7949 14.5883 14 13.3059 14 11.7883V9.68826C14 11.2059 10.7949 12.4883 7 12.4883Z" }),
2232
+ /* @__PURE__ */ React10__default.createElement("path", { d: "M14 6.18823C14 7.70583 10.7949 8.98823 7 8.98823C3.20513 8.98823 0 7.70583 0 6.18823V8.28823C0 9.80583 3.20513 11.0882 7 11.0882C10.7949 11.0882 14 9.80583 14 8.28823V6.18823Z" })
2165
2233
  );
2166
2234
  }
2167
2235
  function BarsSVG() {
2168
- return /* @__PURE__ */ React13__default.createElement(
2236
+ return /* @__PURE__ */ React10__default.createElement(
2169
2237
  "svg",
2170
2238
  {
2171
2239
  width: "15",
@@ -2174,316 +2242,97 @@ function BarsSVG() {
2174
2242
  xmlns: "http://www.w3.org/2000/svg",
2175
2243
  fill: "currentColor"
2176
2244
  },
2177
- /* @__PURE__ */ React13__default.createElement("path", { d: "M3.78947 9.6H0.631579V4.8H3.78947V9.6ZM7.57895 9.6H4.42105V2.4H7.57895V9.6ZM11.3684 9.6H8.21053V0H11.3684V9.6ZM12 12H0V10.8H12V12Z" })
2245
+ /* @__PURE__ */ React10__default.createElement("path", { d: "M3.78947 9.6H0.631579V4.8H3.78947V9.6ZM7.57895 9.6H4.42105V2.4H7.57895V9.6ZM11.3684 9.6H8.21053V0H11.3684V9.6ZM12 12H0V10.8H12V12Z" })
2178
2246
  );
2179
2247
  }
2180
2248
  function SearchSVG() {
2181
- return /* @__PURE__ */ React13__default.createElement("svg", { width: "18", height: "18", viewBox: "0 0 18 18", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, /* @__PURE__ */ React13__default.createElement("g", { "clip-path": "url(#clip0_905_15769)" }, /* @__PURE__ */ React13__default.createElement("path", { d: "M2.25 7.5C2.25 8.18944 2.3858 8.87213 2.64963 9.50909C2.91347 10.146 3.30018 10.7248 3.78769 11.2123C4.2752 11.6998 4.85395 12.0865 5.49091 12.3504C6.12787 12.6142 6.81056 12.75 7.5 12.75C8.18944 12.75 8.87213 12.6142 9.50909 12.3504C10.146 12.0865 10.7248 11.6998 11.2123 11.2123C11.6998 10.7248 12.0865 10.146 12.3504 9.50909C12.6142 8.87213 12.75 8.18944 12.75 7.5C12.75 6.81056 12.6142 6.12787 12.3504 5.49091C12.0865 4.85395 11.6998 4.2752 11.2123 3.78769C10.7248 3.30018 10.146 2.91347 9.50909 2.64963C8.87213 2.3858 8.18944 2.25 7.5 2.25C6.81056 2.25 6.12787 2.3858 5.49091 2.64963C4.85395 2.91347 4.2752 3.30018 3.78769 3.78769C3.30018 4.2752 2.91347 4.85395 2.64963 5.49091C2.3858 6.12787 2.25 6.81056 2.25 7.5Z", stroke: "black", "stroke-linecap": "round", "stroke-linejoin": "round" }), /* @__PURE__ */ React13__default.createElement("path", { d: "M15.75 15.75L11.25 11.25", stroke: "black", "stroke-linecap": "round", "stroke-linejoin": "round" })), /* @__PURE__ */ React13__default.createElement("defs", null, /* @__PURE__ */ React13__default.createElement("clipPath", { id: "clip0_905_15769" }, /* @__PURE__ */ React13__default.createElement("rect", { width: "18", height: "18", fill: "white" }))));
2249
+ return /* @__PURE__ */ React10__default.createElement("svg", { width: "18", height: "18", viewBox: "0 0 18 18", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, /* @__PURE__ */ React10__default.createElement("g", { clipPath: "url(#clip0_905_15769)" }, /* @__PURE__ */ React10__default.createElement(
2250
+ "path",
2251
+ {
2252
+ d: "M2.25 7.5C2.25 8.18944 2.3858 8.87213 2.64963 9.50909C2.91347 10.146 3.30018 10.7248 3.78769 11.2123C4.2752 11.6998 4.85395 12.0865 5.49091 12.3504C6.12787 12.6142 6.81056 12.75 7.5 12.75C8.18944 12.75 8.87213 12.6142 9.50909 12.3504C10.146 12.0865 10.7248 11.6998 11.2123 11.2123C11.6998 10.7248 12.0865 10.146 12.3504 9.50909C12.6142 8.87213 12.75 8.18944 12.75 7.5C12.75 6.81056 12.6142 6.12787 12.3504 5.49091C12.0865 4.85395 11.6998 4.2752 11.2123 3.78769C10.7248 3.30018 10.146 2.91347 9.50909 2.64963C8.87213 2.3858 8.18944 2.25 7.5 2.25C6.81056 2.25 6.12787 2.3858 5.49091 2.64963C4.85395 2.91347 4.2752 3.30018 3.78769 3.78769C3.30018 4.2752 2.91347 4.85395 2.64963 5.49091C2.3858 6.12787 2.25 6.81056 2.25 7.5Z",
2253
+ stroke: "black",
2254
+ strokeLinecap: "round",
2255
+ strokeLinejoin: "round"
2256
+ }
2257
+ ), /* @__PURE__ */ React10__default.createElement(
2258
+ "path",
2259
+ {
2260
+ d: "M15.75 15.75L11.25 11.25",
2261
+ stroke: "black",
2262
+ strokeLinecap: "round",
2263
+ strokeLinejoin: "round"
2264
+ }
2265
+ )), /* @__PURE__ */ React10__default.createElement("defs", null, /* @__PURE__ */ React10__default.createElement("clipPath", { id: "clip0_905_15769" }, /* @__PURE__ */ React10__default.createElement("rect", { width: "18", height: "18", fill: "white" }))));
2182
2266
  }
2183
2267
  function FullScreenSVG() {
2184
- return /* @__PURE__ */ React13__default.createElement("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, /* @__PURE__ */ React13__default.createElement("g", { "clip-path": "url(#clip0_905_15763)" }, /* @__PURE__ */ React13__default.createElement("path", { d: "M3.33325 6.66668V5.00001C3.33325 4.55798 3.50885 4.13406 3.82141 3.8215C4.13397 3.50894 4.55789 3.33334 4.99992 3.33334H6.66659", stroke: "black", "stroke-linecap": "round", "stroke-linejoin": "round" }), /* @__PURE__ */ React13__default.createElement("path", { d: "M3.33325 13.3333V15C3.33325 15.442 3.50885 15.866 3.82141 16.1785C4.13397 16.4911 4.55789 16.6667 4.99992 16.6667H6.66659", stroke: "black", "stroke-linecap": "round", "stroke-linejoin": "round" }), /* @__PURE__ */ React13__default.createElement("path", { d: "M13.3333 3.33334H14.9999C15.4419 3.33334 15.8659 3.50894 16.1784 3.8215C16.491 4.13406 16.6666 4.55798 16.6666 5.00001V6.66668", stroke: "black", "stroke-linecap": "round", "stroke-linejoin": "round" }), /* @__PURE__ */ React13__default.createElement("path", { d: "M13.3333 16.6667H14.9999C15.4419 16.6667 15.8659 16.4911 16.1784 16.1785C16.491 15.866 16.6666 15.442 16.6666 15V13.3333", stroke: "black", "stroke-linecap": "round", "stroke-linejoin": "round" })), /* @__PURE__ */ React13__default.createElement("defs", null, /* @__PURE__ */ React13__default.createElement("clipPath", { id: "clip0_905_15763" }, /* @__PURE__ */ React13__default.createElement("rect", { width: "20", height: "20", fill: "white" }))));
2268
+ return /* @__PURE__ */ React10__default.createElement("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, /* @__PURE__ */ React10__default.createElement("g", { clipPath: "url(#clip0_905_15763)" }, /* @__PURE__ */ React10__default.createElement(
2269
+ "path",
2270
+ {
2271
+ d: "M3.33325 6.66668V5.00001C3.33325 4.55798 3.50885 4.13406 3.82141 3.8215C4.13397 3.50894 4.55789 3.33334 4.99992 3.33334H6.66659",
2272
+ stroke: "black",
2273
+ strokeLinecap: "round",
2274
+ strokeLinejoin: "round"
2275
+ }
2276
+ ), /* @__PURE__ */ React10__default.createElement(
2277
+ "path",
2278
+ {
2279
+ d: "M3.33325 13.3333V15C3.33325 15.442 3.50885 15.866 3.82141 16.1785C4.13397 16.4911 4.55789 16.6667 4.99992 16.6667H6.66659",
2280
+ stroke: "black",
2281
+ strokeLinecap: "round",
2282
+ strokeLinejoin: "round"
2283
+ }
2284
+ ), /* @__PURE__ */ React10__default.createElement(
2285
+ "path",
2286
+ {
2287
+ d: "M13.3333 3.33334H14.9999C15.4419 3.33334 15.8659 3.50894 16.1784 3.8215C16.491 4.13406 16.6666 4.55798 16.6666 5.00001V6.66668",
2288
+ stroke: "black",
2289
+ strokeLinecap: "round",
2290
+ strokeLinejoin: "round"
2291
+ }
2292
+ ), /* @__PURE__ */ React10__default.createElement(
2293
+ "path",
2294
+ {
2295
+ d: "M13.3333 16.6667H14.9999C15.4419 16.6667 15.8659 16.4911 16.1784 16.1785C16.491 15.866 16.6666 15.442 16.6666 15V13.3333",
2296
+ stroke: "black",
2297
+ strokeLinecap: "round",
2298
+ strokeLinejoin: "round"
2299
+ }
2300
+ )), /* @__PURE__ */ React10__default.createElement("defs", null, /* @__PURE__ */ React10__default.createElement("clipPath", { id: "clip0_905_15763" }, /* @__PURE__ */ React10__default.createElement("rect", { width: "20", height: "20", fill: "white" }))));
2185
2301
  }
2186
2302
  function ClearSVG() {
2187
- return /* @__PURE__ */ React13__default.createElement("svg", { width: "17", height: "16", viewBox: "0 0 17 16", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, /* @__PURE__ */ React13__default.createElement("g", { "clip-path": "url(#clip0_1545_1134)" }, /* @__PURE__ */ React13__default.createElement("path", { d: "M13.4072 10.6882C13.9751 9.56054 14.172 8.28312 13.9697 7.03754C13.7675 5.79196 13.1766 4.64164 12.2808 3.75013C11.3851 2.85861 10.2303 2.27129 8.98048 2.07166C7.73068 1.87204 6.44956 2.07028 5.31928 2.63819M3.7671 3.75952C2.63879 4.88519 2.00527 6.41157 2.0059 8.00288C2.00652 9.59419 2.64125 11.1201 3.77044 12.2449C4.89964 13.3696 6.4308 14.0012 8.02709 14.0006C9.62339 13.9999 11.1541 13.3672 12.2824 12.2415", stroke: "black", "stroke-linecap": "round", "stroke-linejoin": "round" }), /* @__PURE__ */ React13__default.createElement("path", { d: "M2.00626 2L14.0439 14", stroke: "black", "stroke-linecap": "round", "stroke-linejoin": "round" })), /* @__PURE__ */ React13__default.createElement("defs", null, /* @__PURE__ */ React13__default.createElement("clipPath", { id: "clip0_1545_1134" }, /* @__PURE__ */ React13__default.createElement("rect", { width: "16.0501", height: "16", fill: "white" }))));
2303
+ return /* @__PURE__ */ React10__default.createElement("svg", { width: "17", height: "16", viewBox: "0 0 17 16", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, /* @__PURE__ */ React10__default.createElement("g", { clipPath: "url(#clip0_1545_1134)" }, /* @__PURE__ */ React10__default.createElement(
2304
+ "path",
2305
+ {
2306
+ d: "M13.4072 10.6882C13.9751 9.56054 14.172 8.28312 13.9697 7.03754C13.7675 5.79196 13.1766 4.64164 12.2808 3.75013C11.3851 2.85861 10.2303 2.27129 8.98048 2.07166C7.73068 1.87204 6.44956 2.07028 5.31928 2.63819M3.7671 3.75952C2.63879 4.88519 2.00527 6.41157 2.0059 8.00288C2.00652 9.59419 2.64125 11.1201 3.77044 12.2449C4.89964 13.3696 6.4308 14.0012 8.02709 14.0006C9.62339 13.9999 11.1541 13.3672 12.2824 12.2415",
2307
+ stroke: "black",
2308
+ strokeLinecap: "round",
2309
+ strokeLinejoin: "round"
2310
+ }
2311
+ ), /* @__PURE__ */ React10__default.createElement(
2312
+ "path",
2313
+ {
2314
+ d: "M2.00626 2L14.0439 14",
2315
+ stroke: "black",
2316
+ strokeLinecap: "round",
2317
+ strokeLinejoin: "round"
2318
+ }
2319
+ )), /* @__PURE__ */ React10__default.createElement("defs", null, /* @__PURE__ */ React10__default.createElement("clipPath", { id: "clip0_1545_1134" }, /* @__PURE__ */ React10__default.createElement("rect", { width: "16.0501", height: "16", fill: "white" }))));
2188
2320
  }
2189
2321
 
2190
- // src/components/OptionsMenu.tsx
2191
- init_esm_shims();
2192
-
2193
- // src/components/MenuDimension.jsx
2322
+ // src/components/TableFooter.tsx
2194
2323
  init_esm_shims();
2195
2324
 
2196
- // src/utils/format.js
2197
- init_esm_shims();
2198
- function abbreviateFullName(nameParts, joint = "/") {
2199
- if (!nameParts) {
2200
- return "";
2201
- }
2202
- if (typeof nameParts === "string") {
2203
- nameParts = splitName(nameParts);
2204
- }
2205
- const target = [];
2206
- let n = nameParts.length;
2207
- while (n--) {
2208
- const token = nameParts[n];
2209
- if (target.indexOf(token) === -1) {
2210
- target.unshift(token);
2211
- }
2212
- }
2213
- return target.join(joint);
2214
- }
2215
-
2216
- // src/components/MenuDimension.jsx
2217
- var DimensionMenu = (props) => {
2218
- const dimensions = useSelector$1(selectOlapDimensionItems) || [];
2219
- const locale = useSelector$1(selectLocale);
2220
- const options = useMemo(
2221
- () => dimensions.map((dim) => /* @__PURE__ */ React13__default.createElement(
2222
- DimensionMenuItem,
2223
- {
2224
- dimension: dim,
2225
- locale: locale.code,
2226
- isMediumScreen: props.isMediumScreen,
2227
- key: dim.uri,
2228
- onItemSelect: props.onItemSelect,
2229
- selectedItems: props.selectedItems
2230
- }
2231
- )),
2232
- [dimensions, props.selectedItems, props.onItemSelect]
2233
- );
2234
- return /* @__PURE__ */ React13__default.createElement(Menu, null, options);
2235
- };
2236
- var DimensionMenuItem = (props) => {
2237
- const { dimension, locale, isMediumScreen, onItemSelect, selectedItems } = props;
2238
- const { translate: t } = useTranslation();
2239
- const label = useMemo(
2240
- () => t("params.dimmenu_dimension", {
2241
- dimension: getCaption(dimension, locale)
2242
- }),
2243
- [locale, dimension]
2244
- );
2245
- const isChildSubMenu = dimension.hierarchies.length !== 1;
2246
- const options = dimension.hierarchies.map((hie) => /* @__PURE__ */ React13__default.createElement(
2247
- HierarchyMenuItem,
2248
- {
2249
- dimension,
2250
- hierarchy: hie,
2251
- isMediumScreen,
2252
- isSubMenu: isChildSubMenu,
2253
- key: hie.uri,
2254
- locale,
2255
- onItemSelect,
2256
- selectedItems
2257
- }
2258
- ));
2259
- if (!isChildSubMenu) {
2260
- return options[0];
2261
- }
2262
- return /* @__PURE__ */ React13__default.createElement(Menu, { key: dimension.uri, position: "left", shadow: "md", withArrow: true }, /* @__PURE__ */ React13__default.createElement(Menu.Target, null, /* @__PURE__ */ React13__default.createElement(UnstyledButton, { component: "span" }, /* @__PURE__ */ React13__default.createElement(
2263
- Menu.Item,
2264
- {
2265
- icon: /* @__PURE__ */ React13__default.createElement(IconStack3, null),
2266
- sx: (theme) => ({
2267
- [theme.fn.smallerThan("md")]: {
2268
- maxWidth: 200
2269
- }
2270
- })
2271
- },
2272
- /* @__PURE__ */ React13__default.createElement(Group, { noWrap: true, position: "apart" }, /* @__PURE__ */ React13__default.createElement(Text, null, label), /* @__PURE__ */ React13__default.createElement(IconChevronRight$1, { stroke: 1.5, size: 16 }))
2273
- ))), /* @__PURE__ */ React13__default.createElement(Menu.Dropdown, null, /* @__PURE__ */ React13__default.createElement(Menu, null, options)));
2274
- };
2275
- var HierarchyMenuItem = (props) => {
2276
- const { dimension, hierarchy, locale, onItemSelect, selectedItems } = props;
2277
- const { translate: t } = useTranslation();
2278
- const label = useMemo(() => {
2279
- const captions = [getCaption(dimension, locale), getCaption(hierarchy, locale)];
2280
- if (props.isSubMenu) {
2281
- return captions[1];
2282
- }
2283
- return t("params.dimmenu_hierarchy", {
2284
- abbr: abbreviateFullName(captions, t("params.dimmenu_abbrjoint")),
2285
- dimension: captions[0],
2286
- hierarchy: captions[1]
2287
- });
2288
- }, [locale, dimension, hierarchy, props.isSubMenu]);
2289
- const isChildSubMenu = hierarchy.levels.length !== 1;
2290
- const options = hierarchy.levels.map((lvl) => /* @__PURE__ */ React13__default.createElement(
2291
- LevelMenuItem,
2292
- {
2293
- dimension,
2294
- hierarchy,
2295
- isSubMenu: isChildSubMenu,
2296
- key: lvl.uri,
2297
- level: lvl,
2298
- locale,
2299
- onItemSelect,
2300
- selectedItems
2301
- }
2302
- ));
2303
- if (!isChildSubMenu) {
2304
- return options[0];
2305
- }
2306
- return /* @__PURE__ */ React13__default.createElement(Menu, { key: hierarchy.uri, position: "left", shadow: "md", withArrow: true }, /* @__PURE__ */ React13__default.createElement(Menu.Target, null, /* @__PURE__ */ React13__default.createElement(UnstyledButton, { component: "span" }, /* @__PURE__ */ React13__default.createElement(
2307
- Menu.Item,
2308
- {
2309
- icon: /* @__PURE__ */ React13__default.createElement(IconStack2, null),
2310
- sx: (theme) => ({
2311
- [theme.fn.smallerThan("md")]: {
2312
- maxWidth: 200
2313
- }
2314
- })
2315
- },
2316
- /* @__PURE__ */ React13__default.createElement(Group, { noWrap: true, position: "apart" }, /* @__PURE__ */ React13__default.createElement(Text, null, label), /* @__PURE__ */ React13__default.createElement(IconChevronRight$1, { stroke: 1.5, size: 16 }))
2317
- ))), /* @__PURE__ */ React13__default.createElement(Menu.Dropdown, null, /* @__PURE__ */ React13__default.createElement(Menu, null, options)));
2318
- };
2319
- var LevelMenuItem = (props) => {
2320
- const { dimension, hierarchy, level, locale } = props;
2321
- const { translate: t } = useTranslation();
2322
- const label = useMemo(() => {
2323
- const captions = [
2324
- getCaption(dimension, locale),
2325
- getCaption(hierarchy, locale),
2326
- getCaption(level, locale)
2327
- ];
2328
- if (props.isSubMenu) {
2329
- return captions[2];
2330
- }
2331
- return t("params.dimmenu_level", {
2332
- abbr: abbreviateFullName(captions, t("params.dimmenu_abbrjoint")),
2333
- dimension: captions[0],
2334
- hierarchy: captions[1],
2335
- level: captions[2]
2336
- });
2337
- }, [locale, dimension, hierarchy, level, props.isSubMenu]);
2338
- return /* @__PURE__ */ React13__default.createElement(
2339
- Menu.Item,
2340
- {
2341
- disabled: props.selectedItems.includes(stringifyName(level)),
2342
- icon: /* @__PURE__ */ React13__default.createElement(IconStack, null),
2343
- key: level.uri,
2344
- miw: 200,
2345
- onClick: () => props.onItemSelect(level, hierarchy, dimension),
2346
- sx: (theme) => ({
2347
- [theme.fn.smallerThan("md")]: {
2348
- maxWidth: 200
2349
- }
2350
- })
2351
- },
2352
- label
2353
- );
2354
- };
2355
-
2356
- // src/components/MeasuresMenu.tsx
2357
- init_esm_shims();
2358
- function MeasuresMenu(props) {
2359
- const actions2 = useActions();
2360
- const { code: locale } = useSelector$1(selectLocale);
2361
- const itemMap = useSelector$1(selectMeasureMap);
2362
- useSelector$1(selectOlapMeasureMap);
2363
- const measures = useSelector$1(selectOlapMeasureItems);
2364
- const [filter, setFilter] = useState("");
2365
- useTranslation();
2366
- const { children } = props;
2367
- const filteredItems = useMemo(() => {
2368
- const query = filter ? safeRegExp(filter, "i") : null;
2369
- return filterMap(measures, (measure) => {
2370
- if (query && !query.test(getCaption(measure, locale))) {
2371
- return null;
2372
- }
2373
- return itemMap[measure.name] || buildMeasure({ active: false, ...measure });
2374
- });
2375
- }, [itemMap, measures, filter, locale]);
2376
- const activeItems = filteredItems.filter(isActiveItem);
2377
- const options = filteredItems.map((item) => /* @__PURE__ */ React13__default.createElement(
2378
- Menu.Item,
2379
- {
2380
- disabled: activeItems.map((active) => active.name).includes(item.name),
2381
- key: item.name,
2382
- onClick: () => {
2383
- actions2.updateMeasure({ ...item, active: !item.active });
2384
- actions2.willRequestQuery();
2385
- }
2386
- },
2387
- item.name
2388
- ));
2389
- return /* @__PURE__ */ React13__default.createElement(Menu, { position: "left" }, /* @__PURE__ */ React13__default.createElement(Menu.Target, null, /* @__PURE__ */ React13__default.createElement(UnstyledButton, { component: "span" }, /* @__PURE__ */ React13__default.createElement(
2390
- Menu.Item,
2391
- {
2392
- icon: /* @__PURE__ */ React13__default.createElement(IconStack3, null),
2393
- sx: (theme) => ({
2394
- [theme.fn.smallerThan("md")]: {
2395
- maxWidth: 200
2396
- }
2397
- })
2398
- },
2399
- /* @__PURE__ */ React13__default.createElement(Group, { noWrap: true, position: "apart" }, /* @__PURE__ */ React13__default.createElement(Text, null, children), /* @__PURE__ */ React13__default.createElement(IconChevronRight$1, { stroke: 1.5, size: 16 }))
2400
- ))), /* @__PURE__ */ React13__default.createElement(Menu.Dropdown, null, options));
2401
- }
2402
- var MeasuresMenu_default = MeasuresMenu;
2403
- function OptionsMenu({ children }) {
2404
- const actions2 = useActions();
2405
- const items = useSelector$1(selectDrilldownItems);
2406
- const dimensions = useSelector$1(selectOlapDimensionItems);
2407
- const { willRequestQuery: willRequestQuery2 } = useActions();
2408
- const createHandler = useCallback(
2409
- (level) => {
2410
- const drilldownItem = buildDrilldown({ ...level, key: level.fullName });
2411
- actions2.updateDrilldown(drilldownItem);
2412
- actions2.willFetchMembers({ ...level, level: level.name }).then((members) => {
2413
- const dimension = dimensions.find((dim) => dim.name === level.dimension);
2414
- if (!dimension) return;
2415
- actions2.updateDrilldown({
2416
- ...drilldownItem,
2417
- dimType: dimension.dimensionType,
2418
- memberCount: members.length,
2419
- members
2420
- });
2421
- }).then(() => willRequestQuery2());
2422
- },
2423
- [dimensions]
2424
- );
2425
- return /* @__PURE__ */ React13__default.createElement(
2426
- Menu,
2427
- {
2428
- closeOnClickOutside: true,
2429
- closeOnEscape: true,
2430
- position: "left",
2431
- shadow: "md",
2432
- withArrow: true,
2433
- key: "options-menu"
2434
- },
2435
- /* @__PURE__ */ React13__default.createElement(Menu.Target, null, /* @__PURE__ */ React13__default.createElement(ActionIcon, { size: "xl", id: "icon-icon-plus" }, children)),
2436
- /* @__PURE__ */ React13__default.createElement(Menu.Dropdown, null, /* @__PURE__ */ React13__default.createElement(MeasuresMenu_default, null, "Metrics"), /* @__PURE__ */ React13__default.createElement(NestedMenu, { selectedItems: items, onItemSelect: createHandler }, "Dimensions"))
2437
- );
2438
- }
2439
- function NestedMenu({ selectedItems, children, onItemSelect }) {
2440
- return /* @__PURE__ */ React13__default.createElement(
2441
- Menu,
2442
- {
2443
- key: "options-dimensions",
2444
- closeOnClickOutside: true,
2445
- closeOnEscape: true,
2446
- position: "left",
2447
- shadow: "md",
2448
- withArrow: true
2449
- },
2450
- /* @__PURE__ */ React13__default.createElement(Menu.Target, null, /* @__PURE__ */ React13__default.createElement(UnstyledButton, { component: "span" }, /* @__PURE__ */ React13__default.createElement(
2451
- Menu.Item,
2452
- {
2453
- icon: /* @__PURE__ */ React13__default.createElement(IconStack2, null),
2454
- sx: (theme) => ({
2455
- [theme.fn.smallerThan("md")]: {
2456
- maxWidth: 200
2457
- }
2458
- })
2459
- },
2460
- /* @__PURE__ */ React13__default.createElement(Group, { noWrap: true, position: "apart" }, /* @__PURE__ */ React13__default.createElement(Text, null, children), /* @__PURE__ */ React13__default.createElement(IconChevronRight$1, { stroke: 1.5, size: 16 }))
2461
- ))),
2462
- /* @__PURE__ */ React13__default.createElement(Menu.Dropdown, null, /* @__PURE__ */ React13__default.createElement(
2463
- DimensionMenu,
2464
- {
2465
- selectedItems: selectedItems.map(stringifyName),
2466
- onItemSelect
2467
- }
2468
- ))
2469
- );
2470
- }
2471
- var OptionsMenu_default = OptionsMenu;
2472
-
2473
- // src/components/TableFooter.tsx
2474
- init_esm_shims();
2475
-
2476
- // src/hooks/useAsync.tsx
2325
+ // src/hooks/useAsync.tsx
2477
2326
  init_esm_shims();
2478
2327
  function useSafeDispatch(dispatch) {
2479
- const mounted = React13.useRef(false);
2480
- React13.useLayoutEffect(() => {
2328
+ const mounted = React10.useRef(false);
2329
+ React10.useLayoutEffect(() => {
2481
2330
  mounted.current = true;
2482
2331
  return () => {
2483
2332
  mounted.current = false;
2484
2333
  };
2485
2334
  }, []);
2486
- return React13.useCallback(
2335
+ return React10.useCallback(
2487
2336
  (...args) => {
2488
2337
  if (mounted.current) {
2489
2338
  dispatch(...args);
@@ -2494,11 +2343,11 @@ function useSafeDispatch(dispatch) {
2494
2343
  }
2495
2344
  var defaultInitialState = { status: "idle", data: null, error: null };
2496
2345
  function useAsync(initialState4) {
2497
- const initialStateRef = React13.useRef({
2346
+ const initialStateRef = React10.useRef({
2498
2347
  ...defaultInitialState,
2499
2348
  ...initialState4
2500
2349
  });
2501
- const [state, dispatch] = React13.useReducer(
2350
+ const [state, dispatch] = React10.useReducer(
2502
2351
  (state2, action) => {
2503
2352
  switch (action.type) {
2504
2353
  case "idle":
@@ -2516,16 +2365,16 @@ function useAsync(initialState4) {
2516
2365
  initialStateRef.current
2517
2366
  );
2518
2367
  const safeDispatch = useSafeDispatch(dispatch);
2519
- const setData = React13.useCallback(
2368
+ const setData = React10.useCallback(
2520
2369
  (data) => safeDispatch({ type: "resolved", data }),
2521
2370
  [safeDispatch]
2522
2371
  );
2523
- const setError = React13.useCallback(
2372
+ const setError = React10.useCallback(
2524
2373
  (error) => safeDispatch({ type: "rejected", error }),
2525
2374
  [safeDispatch]
2526
2375
  );
2527
- const reset = React13.useCallback(() => safeDispatch({ type: "idle" }), [safeDispatch]);
2528
- const run = React13.useCallback(
2376
+ const reset = React10.useCallback(() => safeDispatch({ type: "idle" }), [safeDispatch]);
2377
+ const run = React10.useCallback(
2529
2378
  (promise) => {
2530
2379
  if (!promise || !promise.then) {
2531
2380
  throw new Error(
@@ -2566,7 +2415,7 @@ init_esm_shims();
2566
2415
  function CubeAnnotation(props) {
2567
2416
  const { annotation, item, locale, ...textProps } = props;
2568
2417
  const content = getAnnotation(item, annotation, locale);
2569
- return content ? /* @__PURE__ */ React13__default.createElement(Text, { component: "p", ...textProps }, content) : null;
2418
+ return content ? /* @__PURE__ */ React10__default.createElement(Text, { component: "p", ...textProps }, content) : null;
2570
2419
  }
2571
2420
  function CubeSourceAnchor(props) {
2572
2421
  const { item, locale, ...textProps } = props;
@@ -2574,12 +2423,12 @@ function CubeSourceAnchor(props) {
2574
2423
  const srcName = getAnnotation(item, "source_name", locale);
2575
2424
  const srcLink = getAnnotation(item, "source_link", locale);
2576
2425
  if (!srcName) return null;
2577
- return /* @__PURE__ */ React13__default.createElement(Text, { component: "p", ...textProps }, `${t("params.label_source")}: `, srcLink ? /* @__PURE__ */ React13__default.createElement(Anchor, { href: srcLink }, srcName) : /* @__PURE__ */ React13__default.createElement(Text, { span: true }, srcName));
2426
+ return /* @__PURE__ */ React10__default.createElement(Text, { component: "p", ...textProps }, `${t("params.label_source")}: `, srcLink ? /* @__PURE__ */ React10__default.createElement(Anchor, { href: srcLink }, srcName) : /* @__PURE__ */ React10__default.createElement(Text, { span: true }, srcName));
2578
2427
  }
2579
2428
  function CubeSource() {
2580
2429
  const selectedItem = useSelector$1(selectOlapCube);
2581
2430
  const { code: locale } = useSelector$1(selectLocale);
2582
- return selectedItem && /* @__PURE__ */ React13__default.createElement(Text, { sx: { "& p": { margin: 0 } } }, /* @__PURE__ */ React13__default.createElement(
2431
+ return selectedItem && /* @__PURE__ */ React10__default.createElement(Text, { sx: { "& p": { margin: 0 } } }, /* @__PURE__ */ React10__default.createElement(
2583
2432
  CubeAnnotation,
2584
2433
  {
2585
2434
  annotation: "description",
@@ -2587,7 +2436,7 @@ function CubeSource() {
2587
2436
  item: selectedItem,
2588
2437
  locale
2589
2438
  }
2590
- ), /* @__PURE__ */ React13__default.createElement(CubeSourceAnchor, { item: selectedItem, locale, fz: "xs" }), /* @__PURE__ */ React13__default.createElement(
2439
+ ), /* @__PURE__ */ React10__default.createElement(CubeSourceAnchor, { item: selectedItem, locale, fz: "xs" }), /* @__PURE__ */ React10__default.createElement(
2591
2440
  CubeAnnotation,
2592
2441
  {
2593
2442
  annotation: "source_description",
@@ -2606,23 +2455,34 @@ function TableFooter(props) {
2606
2455
  const { url } = result;
2607
2456
  const { copy, copied } = useClipboard({ timeout: 1e3 });
2608
2457
  const copyHandler = useCallback(() => copy(url), [url]);
2609
- return /* @__PURE__ */ React13__default.createElement(Box, { w: "100%", sx: { flex: "0 0 70px" } }, /* @__PURE__ */ React13__default.createElement(Flex, { p: "md", justify: "space-between", align: "center" }, /* @__PURE__ */ React13__default.createElement(CubeSource, null), /* @__PURE__ */ React13__default.createElement(Group, { noWrap: true }, /* @__PURE__ */ React13__default.createElement(Text, { c: "dimmed" }, t("results.count_rows", { n: result.data.length })), /* @__PURE__ */ React13__default.createElement(MRT_TablePagination, { table }), /* @__PURE__ */ React13__default.createElement(ApiAndCsvButtons, { copied, copyHandler, url }))));
2458
+ return /* @__PURE__ */ React10__default.createElement(Box, { w: "100%", sx: { flex: "0 0 70px" } }, /* @__PURE__ */ React10__default.createElement(
2459
+ Flex,
2460
+ {
2461
+ p: "md",
2462
+ justify: "space-between",
2463
+ align: "flex-end",
2464
+ direction: { base: "column-reverse", md: "row" },
2465
+ gap: "sm"
2466
+ },
2467
+ /* @__PURE__ */ React10__default.createElement(CubeSource, null),
2468
+ /* @__PURE__ */ React10__default.createElement(Group, { position: "right", spacing: "sm" }, /* @__PURE__ */ React10__default.createElement(Text, { c: "dimmed" }, t("results.count_rows", { n: result.data.length })), /* @__PURE__ */ React10__default.createElement(MRT_TablePagination, { table }), /* @__PURE__ */ React10__default.createElement(ApiAndCsvButtons, { copied, copyHandler, url }))
2469
+ ));
2610
2470
  }
2611
2471
  var ApiAndCsvButtons = (props) => {
2612
2472
  const { copied, copyHandler, url } = props;
2613
2473
  const { translate: t } = useTranslation();
2614
- return /* @__PURE__ */ React13__default.createElement(Box, { id: "query-results-debug-view" }, /* @__PURE__ */ React13__default.createElement(Group, { spacing: "xs" }, url && /* @__PURE__ */ React13__default.createElement(
2474
+ return /* @__PURE__ */ React10__default.createElement(Box, { id: "query-results-debug-view" }, /* @__PURE__ */ React10__default.createElement(Group, { spacing: "xs" }, url && /* @__PURE__ */ React10__default.createElement(
2615
2475
  Button,
2616
2476
  {
2617
2477
  variant: "filled",
2618
2478
  color: "dark",
2619
- leftIcon: /* @__PURE__ */ React13__default.createElement(IconCopy, { size: 20 }),
2479
+ leftIcon: /* @__PURE__ */ React10__default.createElement(IconCopy, { size: 20 }),
2620
2480
  sx: { height: 30, backgroundColor: "#5A5A5A" },
2621
2481
  onClick: copyHandler
2622
2482
  },
2623
2483
  copied ? t("action_copy_done") : t("action_copy"),
2624
2484
  " API"
2625
- ), /* @__PURE__ */ React13__default.createElement(DownloadQuery, null)));
2485
+ ), /* @__PURE__ */ React10__default.createElement(DownloadQuery, null)));
2626
2486
  };
2627
2487
  var DownloadQuery = () => {
2628
2488
  const actions2 = useActions();
@@ -2633,12 +2493,12 @@ var DownloadQuery = () => {
2633
2493
  const components = [];
2634
2494
  if (csv) {
2635
2495
  components.push(
2636
- /* @__PURE__ */ React13__default.createElement(
2496
+ /* @__PURE__ */ React10__default.createElement(
2637
2497
  ButtonDownload,
2638
2498
  {
2639
2499
  variant: "filled",
2640
2500
  color: "dark",
2641
- leftIcon: /* @__PURE__ */ React13__default.createElement(IconDownload, { size: 20 }),
2501
+ leftIcon: /* @__PURE__ */ React10__default.createElement(IconDownload, { size: 20 }),
2642
2502
  sx: { height: 30, backgroundColor: "#5A5A5A" },
2643
2503
  key: csv,
2644
2504
  provider: () => actions2.willDownloadQuery(csv)
@@ -2647,10 +2507,10 @@ var DownloadQuery = () => {
2647
2507
  )
2648
2508
  );
2649
2509
  }
2650
- if (components.length === 0 || isDirty || result.data.length === 0) {
2510
+ if (components.length === 0 || result.data.length === 0) {
2651
2511
  return null;
2652
2512
  }
2653
- return /* @__PURE__ */ React13__default.createElement(Box, { id: "button-group-download-results" }, /* @__PURE__ */ React13__default.createElement(Group, { spacing: "xs" }, components, /* @__PURE__ */ React13__default.createElement(MenuOpts, { formats: formats.filter((f) => f !== "csv") })));
2513
+ return /* @__PURE__ */ React10__default.createElement(Box, { id: "button-group-download-results" }, /* @__PURE__ */ React10__default.createElement(Group, { spacing: "xs" }, components, /* @__PURE__ */ React10__default.createElement(MenuOpts, { formats: formats.filter((f) => f !== "csv") })));
2654
2514
  };
2655
2515
  var mimeTypes = {
2656
2516
  csv: "text/csv",
@@ -2696,12 +2556,12 @@ function useDownload(props) {
2696
2556
  var ButtonDownload = (props) => {
2697
2557
  const { provider, ...buttonProps } = props;
2698
2558
  const { onClick, isLoading } = useDownload({ provider });
2699
- return /* @__PURE__ */ React13__default.createElement(Button, { ...buttonProps, onClick, loading: isLoading }, /* @__PURE__ */ React13__default.createElement(Text, { fz: "sm" }, props.children));
2559
+ return /* @__PURE__ */ React10__default.createElement(Button, { ...buttonProps, onClick, loading: isLoading }, /* @__PURE__ */ React10__default.createElement(Text, { fz: "sm" }, props.children));
2700
2560
  };
2701
2561
  var ItemDownload = (props) => {
2702
2562
  const { provider, icon, setOpened, ...itemProps } = props;
2703
2563
  const { onClick, isLoading } = useDownload({ provider });
2704
- return /* @__PURE__ */ React13__default.createElement(
2564
+ return /* @__PURE__ */ React10__default.createElement(
2705
2565
  Menu.Item,
2706
2566
  {
2707
2567
  ...itemProps,
@@ -2713,7 +2573,7 @@ var ItemDownload = (props) => {
2713
2573
  });
2714
2574
  }
2715
2575
  },
2716
- /* @__PURE__ */ React13__default.createElement(Text, { fz: "sm" }, props.children)
2576
+ /* @__PURE__ */ React10__default.createElement(Text, { fz: "sm" }, props.children)
2717
2577
  );
2718
2578
  };
2719
2579
  function MenuOpts({ formats }) {
@@ -2722,20 +2582,20 @@ function MenuOpts({ formats }) {
2722
2582
  const [opened, setOpened] = useState(false);
2723
2583
  const ref = useClickOutside(() => setOpened(false));
2724
2584
  const buttons = useMemo(
2725
- () => formats.map((format2) => /* @__PURE__ */ React13__default.createElement(
2585
+ () => formats.map((format2) => /* @__PURE__ */ React10__default.createElement(
2726
2586
  ItemDownload,
2727
2587
  {
2728
2588
  component: "a",
2729
2589
  key: format2,
2730
2590
  provider: () => actions2.willDownloadQuery(format2),
2731
- icon: (loading) => loading ? /* @__PURE__ */ React13__default.createElement(Loader, { size: 15 }) : /* @__PURE__ */ React13__default.createElement(IconDownload, { size: 15 }),
2591
+ icon: (loading) => loading ? /* @__PURE__ */ React10__default.createElement(Loader, { size: 15 }) : /* @__PURE__ */ React10__default.createElement(IconDownload, { size: 15 }),
2732
2592
  setOpened
2733
2593
  },
2734
- /* @__PURE__ */ React13__default.createElement(Text, { size: "xs" }, t(`formats.${format2}`))
2594
+ /* @__PURE__ */ React10__default.createElement(Text, { size: "xs" }, t(`formats.${format2}`))
2735
2595
  )),
2736
2596
  [formats]
2737
2597
  );
2738
- return /* @__PURE__ */ React13__default.createElement(Menu, { shadow: "md", width: 200, opened }, /* @__PURE__ */ React13__default.createElement(Menu.Target, null, /* @__PURE__ */ React13__default.createElement(
2598
+ return /* @__PURE__ */ React10__default.createElement(Menu, { shadow: "md", width: 200, opened }, /* @__PURE__ */ React10__default.createElement(Menu.Target, null, /* @__PURE__ */ React10__default.createElement(
2739
2599
  ActionIcon,
2740
2600
  {
2741
2601
  onClick: () => setOpened((o) => !o),
@@ -2746,8 +2606,8 @@ function MenuOpts({ formats }) {
2746
2606
  minWidth: 0
2747
2607
  }
2748
2608
  },
2749
- /* @__PURE__ */ React13__default.createElement(IconDotsVertical, { size: "0.8rem" })
2750
- )), /* @__PURE__ */ React13__default.createElement(Menu.Dropdown, null, /* @__PURE__ */ React13__default.createElement(Menu.Label, null, t("params.title_downloaddata")), /* @__PURE__ */ React13__default.createElement("div", { ref }, buttons)));
2609
+ /* @__PURE__ */ React10__default.createElement(IconDotsVertical, { size: "0.8rem" })
2610
+ )), /* @__PURE__ */ React10__default.createElement(Menu.Dropdown, null, /* @__PURE__ */ React10__default.createElement(Menu.Label, null, t("params.title_downloaddata")), /* @__PURE__ */ React10__default.createElement("div", { ref }, buttons)));
2751
2611
  }
2752
2612
  var TableFooter_default = TableFooter;
2753
2613
 
@@ -2760,9 +2620,9 @@ var CustomActionIcon = ({
2760
2620
  children,
2761
2621
  label
2762
2622
  }) => {
2763
- const [popoverOpened, setPopoverOpened] = React13__default.useState(false);
2764
- const actionIcon = /* @__PURE__ */ React13__default.createElement(ActionIcon, { disabled, size: 25, ml: 5, onClick }, children);
2765
- return showTooltip ? /* @__PURE__ */ React13__default.createElement("div", { onMouseEnter: () => setPopoverOpened(true), onMouseLeave: () => setPopoverOpened(false) }, /* @__PURE__ */ React13__default.createElement(
2623
+ const [popoverOpened, setPopoverOpened] = React10__default.useState(false);
2624
+ const actionIcon = /* @__PURE__ */ React10__default.createElement(ActionIcon, { disabled, size: 25, ml: 5, onClick }, children);
2625
+ return showTooltip ? /* @__PURE__ */ React10__default.createElement("div", { onMouseEnter: () => setPopoverOpened(true), onMouseLeave: () => setPopoverOpened(false) }, /* @__PURE__ */ React10__default.createElement(
2766
2626
  Popover,
2767
2627
  {
2768
2628
  width: 200,
@@ -2782,133 +2642,654 @@ var CustomActionIcon = ({
2782
2642
  }
2783
2643
  })
2784
2644
  },
2785
- /* @__PURE__ */ React13__default.createElement(Popover.Target, null, actionIcon),
2786
- /* @__PURE__ */ React13__default.createElement(Popover.Dropdown, null, /* @__PURE__ */ React13__default.createElement(Text, { size: "xs" }, label))
2645
+ /* @__PURE__ */ React10__default.createElement(Popover.Target, null, actionIcon),
2646
+ /* @__PURE__ */ React10__default.createElement(Popover.Dropdown, null, /* @__PURE__ */ React10__default.createElement(Text, { size: "xs" }, label))
2787
2647
  )) : actionIcon;
2788
2648
  };
2789
2649
  var CustomActionIcon_default = CustomActionIcon;
2790
2650
 
2791
- // src/components/TableView.tsx
2792
- var removeColumn = (actions2, entity, measures, drilldowns) => {
2793
- if (entity._type === "measure") {
2794
- if (entity.name) {
2795
- const measure = measures[entity.name];
2796
- actions2.updateMeasure({ ...measure, active: false });
2797
- }
2798
- }
2799
- if (entity._type === "level") {
2800
- if (entity.fullName) {
2801
- const drilldown = drilldowns[entity.fullName];
2802
- actions2.updateDrilldown({ ...drilldown, active: false });
2803
- }
2804
- }
2805
- actions2.willRequestQuery();
2806
- };
2807
- function showTrashIcon(columns, type) {
2808
- const result = columns.filter((c) => c.entityType === type);
2809
- return result.length > 1;
2810
- }
2811
- var getActionIcon = (entityType) => {
2812
- if (entityType === "measure") {
2813
- return /* @__PURE__ */ React13__default.createElement(ActionIcon, { size: "md", color: "red" }, /* @__PURE__ */ React13__default.createElement(BarsSVG, null));
2814
- } else if (entityType === "level") {
2815
- return /* @__PURE__ */ React13__default.createElement(ActionIcon, { size: "md", color: "blue" }, /* @__PURE__ */ React13__default.createElement(StackSVG, null));
2816
- }
2817
- };
2818
- var getEntityText = (entityType) => {
2819
- switch (entityType) {
2820
- case "measure":
2821
- return "Metric";
2822
- case "level":
2823
- return "Dimension";
2824
- default:
2825
- return "";
2826
- }
2827
- };
2828
- var getColumnFilterOption = (entityType) => {
2829
- switch (entityType) {
2830
- case "measure":
2831
- return { columnFilterModeOptions: ["between", "greaterThan", "lessThan"] };
2832
- case "level":
2833
- return { columnFilterModeOptions: true };
2834
- default:
2835
- return { columnFilterModeOptions: true };
2651
+ // src/components/DrawerMenu.tsx
2652
+ init_esm_shims();
2653
+
2654
+ // src/utils/format.js
2655
+ init_esm_shims();
2656
+ function abbreviateFullName(nameParts, joint = "/") {
2657
+ if (!nameParts) {
2658
+ return "";
2836
2659
  }
2837
- };
2838
- function getMemberFilterFn(data, key) {
2839
- const dd = data[0];
2840
- if (dd[key + " ID"]) {
2841
- return (member) => `${member.caption} ${member.key}`;
2660
+ if (typeof nameParts === "string") {
2661
+ nameParts = splitName(nameParts);
2842
2662
  }
2843
- return (member) => member.caption;
2844
- }
2845
- function getMantineFilterMultiSelectProps(isId, isNumeric, range, entity, drilldowns, data, columnKey) {
2846
- let result = {};
2847
- const filterVariant = !isId && (!range || range && range[1] - range[0] <= 50) ? "multi-select" : "text";
2848
- result = Object.assign({}, result, { filterVariant });
2849
- if (result.filterVariant === "multi-select") {
2850
- if (entity._type === "level") {
2851
- if (entity.fullName) {
2852
- const dd = Object.keys(drilldowns).reduce(
2853
- (prev, key) => ({ ...prev, [drilldowns[key].fullName]: drilldowns[key] }),
2854
- {}
2855
- );
2856
- const drilldwonData = dd[entity.fullName];
2857
- if (drilldwonData && drilldwonData.members) {
2858
- const getmemberFilterValue = getMemberFilterFn(data, columnKey);
2859
- result = Object.assign({}, result, {
2860
- mantineFilterMultiSelectProps: {
2861
- data: drilldwonData.members.map(getmemberFilterValue)
2862
- },
2863
- filterFn: (row, id, filterValue) => {
2864
- if (filterValue.length) {
2865
- const rowValue = row.getValue(id);
2866
- if (typeof rowValue === "object") {
2867
- return filterValue.includes(String(rowValue.value + " " + rowValue.id));
2868
- }
2869
- return filterValue.includes(String(rowValue));
2870
- }
2871
- return true;
2872
- }
2873
- });
2874
- }
2875
- }
2663
+ const target = [];
2664
+ let n = nameParts.length;
2665
+ while (n--) {
2666
+ const token = nameParts[n];
2667
+ if (target.indexOf(token) === -1) {
2668
+ target.unshift(token);
2876
2669
  }
2877
2670
  }
2878
- return result;
2671
+ return target.join(joint);
2879
2672
  }
2880
- function getSortIcon(value, entityType) {
2881
- switch (value) {
2882
- case "asc":
2883
- return entityType === "measure" ? /* @__PURE__ */ React13__default.createElement(IconSortAscendingNumbers, null) : /* @__PURE__ */ React13__default.createElement(IconSortAscendingLetters, null);
2884
- case "desc":
2885
- return entityType === "measure" ? /* @__PURE__ */ React13__default.createElement(IconSortDescendingNumbers, null) : /* @__PURE__ */ React13__default.createElement(IconSortDescendingLetters, null);
2886
- default:
2887
- return /* @__PURE__ */ React13__default.createElement(IconArrowsSort, null);
2888
- }
2673
+ function AddColumnsDrawer() {
2674
+ const [opened, { open, close: close2 }] = useDisclosure(false);
2675
+ const theme = useMantineTheme();
2676
+ const smallerThanMd = useMediaQuery(`(max-width: ${theme.breakpoints.md})`);
2677
+ return /* @__PURE__ */ React10__default.createElement(React10__default.Fragment, null, /* @__PURE__ */ React10__default.createElement(
2678
+ Drawer,
2679
+ {
2680
+ opened,
2681
+ position: "right",
2682
+ onClose: close2,
2683
+ title: /* @__PURE__ */ React10__default.createElement(Group, null, /* @__PURE__ */ React10__default.createElement(IconStack3, { size: "0.75rem" }), /* @__PURE__ */ React10__default.createElement(Text, { fw: 700 }, "Add Columns")),
2684
+ styles: (t) => ({
2685
+ inner: {
2686
+ position: "absolute",
2687
+ inset: 0
2688
+ },
2689
+ header: {
2690
+ background: "transparent"
2691
+ },
2692
+ content: {
2693
+ backgroundColor: t.colorScheme === "dark" ? t.colors.dark[8] : t.colors.gray[1]
2694
+ }
2695
+ }),
2696
+ overlayProps: {
2697
+ opacity: 0.1
2698
+ },
2699
+ withinPortal: false
2700
+ },
2701
+ /* @__PURE__ */ React10__default.createElement(MeasuresOptions, null),
2702
+ /* @__PURE__ */ React10__default.createElement(DrillDownOptions, null)
2703
+ ), /* @__PURE__ */ React10__default.createElement(Group, { position: "center" }, smallerThanMd ? /* @__PURE__ */ React10__default.createElement(ActionIcon, { onClick: open, size: "md", variant: "filled", color: theme.primaryColor }, /* @__PURE__ */ React10__default.createElement(IconStack3, { size: "0.75rem" })) : /* @__PURE__ */ React10__default.createElement(Button, { leftIcon: /* @__PURE__ */ React10__default.createElement(IconStack3, { size: "0.75rem" }), onClick: open, m: "md", size: "xs" }, "Add Columns")));
2889
2704
  }
2890
- function useTable({
2891
- cube,
2892
- result,
2893
- columnFilter = () => true,
2894
- columnSorting = () => 0,
2895
- ...mantineTableProps
2896
- }) {
2897
- const { types } = result;
2898
- const { locale, measures, drilldowns } = useSelector$1(selectCurrentQueryParams);
2705
+ function DrillDownOptions() {
2706
+ const locale = useSelector$1(selectLocale);
2899
2707
  const actions2 = useActions();
2900
- const data = useMemo(
2901
- () => window.navigator.userAgent.includes("Firefox") ? result.data.slice(0, 1e4) : result.data,
2902
- [result.data]
2708
+ const selectedDimensions = useSelector$1(selectDrilldownItems);
2709
+ const dimensions = useSelector$1(selectOlapDimensionItems) || [];
2710
+ const createCutHandler2 = React10__default.useCallback((level) => {
2711
+ const cutItem = buildCut({ ...level, key: level.fullName, members: [] });
2712
+ cutItem.active = false;
2713
+ actions2.updateCut(cutItem);
2714
+ }, []);
2715
+ const createHandler = useCallback(
2716
+ (level) => {
2717
+ var _a;
2718
+ const drilldownItem = (_a = selectedDimensions.find((item) => item.uniqueName === level.uniqueName)) != null ? _a : buildDrilldown({ ...level });
2719
+ createCutHandler2(level);
2720
+ actions2.updateDrilldown(drilldownItem);
2721
+ actions2.willFetchMembers({ ...level, level: level.name }).then((members) => {
2722
+ const dimension = dimensions.find((dim) => dim.name === level.dimension);
2723
+ if (!dimension) return;
2724
+ actions2.updateDrilldown({
2725
+ ...drilldownItem,
2726
+ dimType: dimension.dimensionType,
2727
+ memberCount: members.length,
2728
+ members
2729
+ });
2730
+ });
2731
+ },
2732
+ [dimensions]
2733
+ );
2734
+ const activeItems = selectedDimensions.filter((i) => i.active);
2735
+ const options = useMemo(
2736
+ () => dimensions.map((dimension) => /* @__PURE__ */ React10__default.createElement(
2737
+ DimensionItem,
2738
+ {
2739
+ dimension,
2740
+ locale: locale.code,
2741
+ key: dimension.uri,
2742
+ onItemSelect: createHandler,
2743
+ activeItems
2744
+ }
2745
+ )),
2746
+ [dimensions, activeItems, createCutHandler2]
2747
+ );
2748
+ return options;
2749
+ }
2750
+ function DimensionItem({ dimension, locale, activeItems }) {
2751
+ const isChildSubMenu = dimension.hierarchies.length !== 1;
2752
+ const options = dimension.hierarchies.map((hie) => /* @__PURE__ */ React10__default.createElement(
2753
+ HierarchyItem,
2754
+ {
2755
+ dimension,
2756
+ hierarchy: hie,
2757
+ isSubMenu: isChildSubMenu,
2758
+ key: hie.uri,
2759
+ locale,
2760
+ activeItems
2761
+ }
2762
+ ));
2763
+ if (!isChildSubMenu) {
2764
+ return options[0];
2765
+ }
2766
+ return options;
2767
+ }
2768
+ function HierarchyItem({ dimension, hierarchy, isSubMenu, locale, activeItems }) {
2769
+ const { translate: t } = useTranslation();
2770
+ useMemo(() => {
2771
+ const captions = [getCaption(dimension, locale), getCaption(hierarchy, locale)];
2772
+ if (isSubMenu) {
2773
+ return captions[1];
2774
+ }
2775
+ return t("params.dimmenu_hierarchy", {
2776
+ abbr: abbreviateFullName(captions, t("params.dimmenu_abbrjoint")),
2777
+ dimension: captions[0],
2778
+ hierarchy: captions[1]
2779
+ });
2780
+ }, [locale, dimension, hierarchy, isSubMenu]);
2781
+ const isChildSubMenu = hierarchy.levels.length !== 1;
2782
+ const options = hierarchy.levels.map((lvl) => /* @__PURE__ */ React10__default.createElement(
2783
+ LevelItem,
2784
+ {
2785
+ dimension,
2786
+ hierarchy,
2787
+ isSubMenu: isChildSubMenu,
2788
+ key: lvl.uri,
2789
+ level: lvl,
2790
+ locale,
2791
+ activeItems
2792
+ }
2793
+ ));
2794
+ if (!isChildSubMenu) {
2795
+ return options[0];
2796
+ }
2797
+ return options;
2798
+ }
2799
+ function LevelItem({ dimension, hierarchy, isSubMenu, level, locale, activeItems }) {
2800
+ const [activeFilter, setActiveFilter] = useState(false);
2801
+ const { translate: t } = useTranslation();
2802
+ const actions2 = useActions();
2803
+ const cutItems = useSelector$1(selectCutItems);
2804
+ const dimensions = useSelector$1(selectOlapDimensionItems);
2805
+ const drilldowns = useSelector$1(selectDrilldownMap);
2806
+ const label = useMemo(() => {
2807
+ const captions = [
2808
+ getCaption(dimension, locale),
2809
+ getCaption(hierarchy, locale),
2810
+ getCaption(level, locale)
2811
+ ];
2812
+ if (isSubMenu) {
2813
+ return captions[2];
2814
+ }
2815
+ return t("params.dimmenu_level", {
2816
+ abbr: abbreviateFullName(captions, t("params.dimmenu_abbrjoint")),
2817
+ dimension: captions[0],
2818
+ hierarchy: captions[1],
2819
+ level: captions[2]
2820
+ });
2821
+ }, [locale, dimension, hierarchy, level, isSubMenu]);
2822
+ const createCutHandler2 = React10__default.useCallback((level2) => {
2823
+ const cutItem = buildCut({ ...level2, members: [], key: level2.fullName });
2824
+ cutItem.active = false;
2825
+ actions2.updateCut(cutItem);
2826
+ }, []);
2827
+ function createDrilldown(level2, cuts) {
2828
+ const drilldown = buildDrilldown({ ...level2, key: stringifyName(level2), active: false });
2829
+ actions2.updateDrilldown(drilldown);
2830
+ const cut2 = cuts.find((cut3) => cut3.uniqueName === drilldown.uniqueName);
2831
+ if (!cut2) {
2832
+ createCutHandler2({ ...level2, key: stringifyName(level2) });
2833
+ }
2834
+ actions2.willFetchMembers({ ...level2, level: level2.name }).then((members) => {
2835
+ const dimension2 = dimensions.find((dim) => dim.name === level2.dimension);
2836
+ if (!dimension2) return;
2837
+ actions2.updateDrilldown({
2838
+ ...drilldown,
2839
+ dimType: dimension2.dimensionType,
2840
+ memberCount: members.length,
2841
+ members
2842
+ });
2843
+ });
2844
+ return drilldown;
2845
+ }
2846
+ const currentDrilldown = drilldowns[stringifyName(level)] || createDrilldown(level, cutItems);
2847
+ const cut = cutItems.find((cut2) => {
2848
+ return cut2.uniqueName === currentDrilldown.uniqueName;
2849
+ });
2850
+ const updatecutHandler = React10__default.useCallback((item, members) => {
2851
+ actions2.updateCut({ ...item, members });
2852
+ }, []);
2853
+ const checked = activeItems.map(stringifyName).includes(stringifyName(level));
2854
+ return /* @__PURE__ */ React10__default.createElement(React10__default.Fragment, null, /* @__PURE__ */ React10__default.createElement(Group, { mt: "sm", position: "apart", key: level.uri, noWrap: true }, /* @__PURE__ */ React10__default.createElement(
2855
+ Checkbox,
2856
+ {
2857
+ onChange: () => {
2858
+ if (cut) {
2859
+ const active = checked ? false : cut.members.length ? true : false;
2860
+ actions2.updateCut({ ...cut, active });
2861
+ }
2862
+ actions2.updateDrilldown({ ...currentDrilldown, active: !currentDrilldown.active });
2863
+ },
2864
+ checked,
2865
+ label
2866
+ }
2867
+ ), /* @__PURE__ */ React10__default.createElement(Group, null, /* @__PURE__ */ React10__default.createElement(ActionIcon, { size: "xs", onClick: () => setActiveFilter((value) => !value) }, activeFilter ? /* @__PURE__ */ React10__default.createElement(IconFilterOff, null) : /* @__PURE__ */ React10__default.createElement(IconFilter, null)), /* @__PURE__ */ React10__default.createElement(ThemeIcon, { size: "xs", color: "gray", variant: "light", bg: "transparent" }, /* @__PURE__ */ React10__default.createElement(StackSVG, null)))), activeFilter && /* @__PURE__ */ React10__default.createElement(Box, { pt: "md" }, /* @__PURE__ */ React10__default.createElement(
2868
+ MultiSelect,
2869
+ {
2870
+ sx: { flex: "1 1 100%" },
2871
+ searchable: true,
2872
+ onChange: (value) => {
2873
+ if (cut) {
2874
+ if (currentDrilldown.active && !cut.active) {
2875
+ updatecutHandler({ ...cut, active: true }, value);
2876
+ } else {
2877
+ updatecutHandler(cut, value);
2878
+ }
2879
+ }
2880
+ },
2881
+ placeholder: `Filter by ${label}`,
2882
+ value: (cut == null ? void 0 : cut.members) || [],
2883
+ data: currentDrilldown.members.map((m) => ({
2884
+ value: String(m.key),
2885
+ label: m.caption ? `${m.caption} ${m.key}` : m.name
2886
+ })),
2887
+ clearable: true,
2888
+ nothingFound: "Nothing found"
2889
+ }
2890
+ )));
2891
+ }
2892
+ function getFilterfnText(type) {
2893
+ switch (type) {
2894
+ case "greaterThan":
2895
+ return "Greater Than";
2896
+ case "lessThan":
2897
+ return "Less Than";
2898
+ case "between":
2899
+ return "Between";
2900
+ default:
2901
+ return "Not Found";
2902
+ }
2903
+ }
2904
+ function getFilterFn(filter) {
2905
+ if (filter.conditionOne && filter.conditionTwo) {
2906
+ if (filter.conditionOne[0] === Comparison.GTE && filter.conditionTwo[0] === Comparison.LTE) {
2907
+ return "between";
2908
+ }
2909
+ }
2910
+ if (filter.conditionOne[0] === Comparison.GTE || filter.conditionOne[0] === Comparison.GT) {
2911
+ return "greaterThan";
2912
+ }
2913
+ if (filter.conditionOne[0] === Comparison.LTE) {
2914
+ return "lessThan";
2915
+ }
2916
+ }
2917
+ function getFilterValue(filter) {
2918
+ const filterFn = getFilterFn(filter);
2919
+ const isBetween = filterFn === "between";
2920
+ if (isBetween && filter.conditionTwo) {
2921
+ return [filter.conditionOne[2], filter.conditionTwo[2]];
2922
+ }
2923
+ return filter.conditionOne[2];
2924
+ }
2925
+ function isNotValid(value) {
2926
+ return value === null || value === void 0 || Number.isNaN(value);
2927
+ }
2928
+ function NumberInputComponent({ text, filter }) {
2929
+ const actions2 = useActions();
2930
+ function getFilterValue2(filter2) {
2931
+ return isNotValid(filter2.conditionOne[2]) || filter2.conditionOne[2] === 0 ? "" : filter2.conditionOne[2];
2932
+ }
2933
+ function onInputChange({ filter: filter2, value }) {
2934
+ const isEmpty = value === "";
2935
+ const conditions = getFiltersConditions(getFilterFn(filter2) || "greaterThan", [Number(value)]) || {};
2936
+ const active = isEmpty ? false : true;
2937
+ actions2.updateFilter(buildFilter({ ...filter2, active, ...conditions }));
2938
+ }
2939
+ return /* @__PURE__ */ React10__default.createElement(
2940
+ NumberInput,
2941
+ {
2942
+ description: text,
2943
+ placeholder: text,
2944
+ value: getFilterValue2(filter),
2945
+ onChange: (value) => onInputChange({ filter, value }),
2946
+ sx: { flex: "1 1 auto" },
2947
+ size: "xs"
2948
+ }
2903
2949
  );
2904
- const isLimited = result.data.length !== data.length;
2950
+ }
2951
+ function MinMax({ filter, ...rest }) {
2952
+ const actions2 = useActions();
2953
+ function onInputChangeMinMax(props) {
2954
+ const { filter: filter2, min: min2, max: max2 } = props;
2955
+ const conditions = getFiltersConditions(getFilterFn(filter2) || "greaterThan", [Number(min2), Number(max2)]) || {};
2956
+ const active = Boolean(min2) && Boolean(max2);
2957
+ actions2.updateFilter(buildFilter({ ...filter2, active, ...conditions }));
2958
+ }
2959
+ function getFilterValue2(condition) {
2960
+ if (condition) {
2961
+ return isNotValid(condition[2]) || condition[2] === 0 ? "" : condition[2];
2962
+ }
2963
+ return "";
2964
+ }
2965
+ const min = getFilterValue2(filter.conditionOne);
2966
+ const max = getFilterValue2(filter.conditionTwo);
2967
+ return /* @__PURE__ */ React10__default.createElement(Flex, { gap: "xs" }, /* @__PURE__ */ React10__default.createElement(
2968
+ NumberInput,
2969
+ {
2970
+ placeholder: "Min",
2971
+ description: "Min",
2972
+ value: min,
2973
+ onChange: (value) => onInputChangeMinMax({ filter, min: value, max }),
2974
+ ...rest
2975
+ }
2976
+ ), /* @__PURE__ */ React10__default.createElement(
2977
+ NumberInput,
2978
+ {
2979
+ placeholder: "Max",
2980
+ description: "Max",
2981
+ value: max,
2982
+ onChange: (value) => onInputChangeMinMax({ filter, min, max: value }),
2983
+ ...rest
2984
+ }
2985
+ ));
2986
+ }
2987
+ function FilterFnsMenu({ filter }) {
2988
+ const actions2 = useActions();
2989
+ return /* @__PURE__ */ React10__default.createElement(React10__default.Fragment, null, /* @__PURE__ */ React10__default.createElement(Menu, { shadow: "md", width: 200 }, /* @__PURE__ */ React10__default.createElement(Menu.Target, null, /* @__PURE__ */ React10__default.createElement(ActionIcon, { size: "xs" }, /* @__PURE__ */ React10__default.createElement(IconSettings, null))), /* @__PURE__ */ React10__default.createElement(Menu.Dropdown, null, /* @__PURE__ */ React10__default.createElement(Menu.Label, null, "Filter Mode"), /* @__PURE__ */ React10__default.createElement(
2990
+ Menu.Item,
2991
+ {
2992
+ icon: /* @__PURE__ */ React10__default.createElement(IconMathGreater, { size: 14 }),
2993
+ onClick: () => {
2994
+ const conditions = getFiltersConditions("greaterThan", [0]) || {};
2995
+ actions2.updateFilter(buildFilter({ ...filter, ...conditions, active: false }));
2996
+ }
2997
+ },
2998
+ "Greater Than"
2999
+ ), /* @__PURE__ */ React10__default.createElement(
3000
+ Menu.Item,
3001
+ {
3002
+ icon: /* @__PURE__ */ React10__default.createElement(IconMathLower, { size: 14 }),
3003
+ onClick: () => {
3004
+ const conditions = getFiltersConditions("lessThan", [0]) || {};
3005
+ actions2.updateFilter(buildFilter({ ...filter, ...conditions, active: false }));
3006
+ }
3007
+ },
3008
+ "Less Than"
3009
+ ), /* @__PURE__ */ React10__default.createElement(
3010
+ Menu.Item,
3011
+ {
3012
+ icon: /* @__PURE__ */ React10__default.createElement(IconArrowsLeftRight, { size: 14 }),
3013
+ onClick: () => {
3014
+ const conditions = getFiltersConditions("between", [0, 0]) || {};
3015
+ actions2.updateFilter(buildFilter({ ...filter, ...conditions, active: false }));
3016
+ }
3017
+ },
3018
+ "Between"
3019
+ ))));
3020
+ }
3021
+ function MeasuresOptions() {
3022
+ const [activeFilter, setActiveFilter] = useState(false);
3023
+ const { code: locale } = useSelector$1(selectLocale);
3024
+ const itemMap = useSelector$1(selectMeasureMap);
3025
+ const filtersMap = useSelector$1(selectFilterMap);
3026
+ const filtersItems = useSelector$1(selectFilterItems);
3027
+ useSelector$1(selectOlapMeasureMap);
3028
+ const measures = useSelector$1(selectOlapMeasureItems);
3029
+ const actions2 = useActions();
3030
+ function handlerCreateMeasure(data) {
3031
+ const measure = buildMeasure(data);
3032
+ actions2.updateMeasure(measure);
3033
+ return measure;
3034
+ }
3035
+ function handlerCreateFilter(data) {
3036
+ const filter = buildFilter(data);
3037
+ actions2.updateFilter(filter);
3038
+ return filter;
3039
+ }
3040
+ const filteredItems = useMemo(() => {
3041
+ return filterMap(measures, (m) => {
3042
+ const measure = itemMap[m.name] || handlerCreateMeasure({ ...m, active: false });
3043
+ const foundFilter = filtersMap[m.name] || filtersItems.find((f) => f.measure === measure.name);
3044
+ const filter = foundFilter || handlerCreateFilter({
3045
+ measure: measure.name,
3046
+ active: false,
3047
+ key: measure.name
3048
+ });
3049
+ return { measure, filter };
3050
+ });
3051
+ }, [itemMap, measures, filtersMap, filtersItems, locale]);
3052
+ const activeItems = filteredItems.filter((f) => isActiveItem(f.measure));
3053
+ const options = filteredItems.map(({ measure, filter }) => {
3054
+ const filterFn = getFilterFn(filter);
3055
+ const text = getFilterfnText(filterFn);
3056
+ const isBetween = filterFn === "between";
3057
+ const checked = activeItems.map((active) => active.measure.name).includes(measure.name);
3058
+ return /* @__PURE__ */ React10__default.createElement(Box, { key: measure.name }, /* @__PURE__ */ React10__default.createElement(Group, { mt: "sm", position: "apart" }, /* @__PURE__ */ React10__default.createElement(
3059
+ Checkbox,
3060
+ {
3061
+ onChange: () => {
3062
+ actions2.updateMeasure({ ...measure, active: !measure.active });
3063
+ actions2.updateFilter({ ...filter, active: checked ? false : true });
3064
+ },
3065
+ checked,
3066
+ label: measure.name
3067
+ }
3068
+ ), /* @__PURE__ */ React10__default.createElement(Group, null, /* @__PURE__ */ React10__default.createElement(FilterFnsMenu, { filter }), /* @__PURE__ */ React10__default.createElement(ActionIcon, { size: "xs", onClick: () => setActiveFilter((value) => !value) }, activeFilter ? /* @__PURE__ */ React10__default.createElement(IconFilterOff, null) : /* @__PURE__ */ React10__default.createElement(IconFilter, null)), /* @__PURE__ */ React10__default.createElement(ThemeIcon, { size: "xs", color: "gray", variant: "light", bg: "transparent" }, /* @__PURE__ */ React10__default.createElement(BarsSVG, null)))), activeFilter && /* @__PURE__ */ React10__default.createElement(Box, { pt: "md" }, isBetween ? /* @__PURE__ */ React10__default.createElement(MinMax, { filter }) : /* @__PURE__ */ React10__default.createElement(NumberInputComponent, { text, filter })));
3069
+ });
3070
+ return options;
3071
+ }
3072
+ var DrawerMenu_default = AddColumnsDrawer;
3073
+ var removeColumn = (actions2, entity, measures, drilldowns) => {
3074
+ if (entity._type === "measure") {
3075
+ if (entity.name) {
3076
+ const measure = Object.values(measures).find((d) => d.name === entity.name);
3077
+ measure && actions2.updateMeasure({ ...measure, active: false });
3078
+ actions2.willRequestQuery();
3079
+ }
3080
+ }
3081
+ if (entity._type === "level") {
3082
+ const drilldown = Object.values(drilldowns).find((d) => d.uniqueName === (entity == null ? void 0 : entity.uniqueName));
3083
+ drilldown && actions2.updateDrilldown({ ...drilldown, active: false });
3084
+ actions2.willRequestQuery();
3085
+ }
3086
+ };
3087
+ function showTrashIcon(columns, type) {
3088
+ const result = columns.filter((c) => c.entityType === type);
3089
+ return result.length > 1;
3090
+ }
3091
+ var getActionIcon = (entityType) => {
3092
+ if (entityType === "measure") {
3093
+ return /* @__PURE__ */ React10__default.createElement(ActionIcon, { size: "md", color: "red" }, /* @__PURE__ */ React10__default.createElement(BarsSVG, null));
3094
+ } else if (entityType === "level") {
3095
+ return /* @__PURE__ */ React10__default.createElement(ActionIcon, { size: "md", color: "blue" }, /* @__PURE__ */ React10__default.createElement(StackSVG, null));
3096
+ }
3097
+ };
3098
+ var getEntityText = (entityType) => {
3099
+ switch (entityType) {
3100
+ case "measure":
3101
+ return "Metric";
3102
+ case "level":
3103
+ return "Dimension";
3104
+ default:
3105
+ return "";
3106
+ }
3107
+ };
3108
+ var getColumnFilterOption = (entityType) => {
3109
+ switch (entityType) {
3110
+ case "measure":
3111
+ return {
3112
+ columnFilterModeOptions: ["between", "greaterThan", "lessThan"]
3113
+ };
3114
+ case "level":
3115
+ return { columnFilterModeOptions: true };
3116
+ default:
3117
+ return { columnFilterModeOptions: true };
3118
+ }
3119
+ };
3120
+ function getMemberFilterFnTypes(member) {
3121
+ return {
3122
+ value: String(member.key),
3123
+ label: member.caption ? `${member.caption} ${member.key}` : member.name
3124
+ };
3125
+ }
3126
+ function getMantineFilterMultiSelectProps(isId, isNumeric2, range, entity, drilldowns, columnKey, types) {
3127
+ let result = {};
3128
+ const filterVariant = !isId && !isNumeric2 && (!range || range && range[1] - range[0] <= 100) ? "multi-select" : "text";
3129
+ result = Object.assign({}, result, { filterVariant });
3130
+ if (result.filterVariant === "multi-select") {
3131
+ if (entity._type === "level") {
3132
+ const dd = Object.keys(drilldowns).reduce(
3133
+ (prev, key) => ({ ...prev, [drilldowns[key].uniqueName]: drilldowns[key] }),
3134
+ {}
3135
+ );
3136
+ const drilldwonData = dd[entity.uniqueName];
3137
+ if (drilldwonData && drilldwonData.members) {
3138
+ result = Object.assign({}, result, {
3139
+ mantineFilterMultiSelectProps: {
3140
+ data: drilldwonData.members.map(getMemberFilterFnTypes),
3141
+ placeholder: columnKey
3142
+ }
3143
+ });
3144
+ }
3145
+ }
3146
+ }
3147
+ return result;
3148
+ }
3149
+ function getSortIcon(value, entityType) {
3150
+ switch (value) {
3151
+ case "asc":
3152
+ return entityType === "measure" ? /* @__PURE__ */ React10__default.createElement(IconSortAscendingNumbers, null) : /* @__PURE__ */ React10__default.createElement(IconSortAscendingLetters, null);
3153
+ case "desc":
3154
+ return entityType === "measure" ? /* @__PURE__ */ React10__default.createElement(IconSortDescendingNumbers, null) : /* @__PURE__ */ React10__default.createElement(IconSortDescendingLetters, null);
3155
+ default:
3156
+ return /* @__PURE__ */ React10__default.createElement(IconArrowsSort, null);
3157
+ }
3158
+ }
3159
+ function getFiltersConditions(fn, value) {
3160
+ var _a;
3161
+ const comparisonMap = /* @__PURE__ */ new Map([
3162
+ [
3163
+ "greaterThan",
3164
+ (value2) => ({
3165
+ conditionOne: [Comparison.GTE, String(value2[0]), Number(value2[0])],
3166
+ conditionTwo: [Comparison.GT, "0", 0]
3167
+ })
3168
+ ],
3169
+ [
3170
+ "lessThan",
3171
+ (value2) => ({
3172
+ conditionOne: [Comparison.LTE, String(value2[0]), Number(value2[0])],
3173
+ conditionTwo: [Comparison.GT, "0", 0]
3174
+ })
3175
+ ],
3176
+ [
3177
+ "between",
3178
+ (values) => {
3179
+ const [min, max] = values;
3180
+ return {
3181
+ conditionOne: [Comparison.GTE, String(min), Number(min)],
3182
+ conditionTwo: [Comparison.LTE, String(max), Number(max)],
3183
+ joint: "and"
3184
+ };
3185
+ }
3186
+ ]
3187
+ ]);
3188
+ return (_a = comparisonMap.get(fn)) == null ? void 0 : _a(value);
3189
+ }
3190
+ function useTableData({ offset, limit, columns, filters, cuts }) {
3191
+ const normalizedFilters = filters.map((filter) => ({
3192
+ id: filter.measure,
3193
+ value: getFilterValue(filter),
3194
+ fn: getFilterFn(filter)
3195
+ }));
3196
+ const normalizedCuts = cuts.map((cut) => ({ id: cut.uniqueName, members: cut.members }));
3197
+ const filterKey = JSON.stringify(normalizedFilters);
3198
+ const cutKey = JSON.stringify(normalizedCuts);
3199
+ const actions2 = useActions();
3200
+ const [filterKeydebouced, setDebouncedTerm] = useState("");
3201
+ const page = offset;
3202
+ useEffect(() => {
3203
+ const handler = debounce(() => {
3204
+ const term = [limit, offset, ...columns.sort(), filterKey, cutKey, page];
3205
+ setDebouncedTerm(term);
3206
+ }, 700);
3207
+ handler();
3208
+ return () => {
3209
+ handler.cancel();
3210
+ };
3211
+ }, [...columns, offset, filterKey, cutKey, page]);
3212
+ return useQuery({
3213
+ queryKey: ["table", filterKeydebouced],
3214
+ queryFn: () => {
3215
+ return actions2.willExecuteQuery().then((res) => {
3216
+ const { data, types } = res;
3217
+ return { data: data != null ? data : [], types };
3218
+ });
3219
+ },
3220
+ staleTime: 3e5,
3221
+ enabled: !!filterKeydebouced
3222
+ // placeholderData: keepPreviousData
3223
+ });
3224
+ }
3225
+ function useTable({
3226
+ cube,
3227
+ result,
3228
+ columnFilter = () => true,
3229
+ columnSorting = () => 0,
3230
+ ...mantineTableProps
3231
+ }) {
3232
+ const { types } = result;
3233
+ const { measures, drilldowns } = useSelector$1(selectCurrentQueryParams);
3234
+ const filterItems = useSelector$1(selectFilterItems);
3235
+ const finalUniqueKeys = [
3236
+ ...Object.keys(measures).reduce((prev, curr) => {
3237
+ const measure = measures[curr];
3238
+ if (measure.active) {
3239
+ return [...prev, curr];
3240
+ }
3241
+ return prev;
3242
+ }, []),
3243
+ ...Object.keys(drilldowns).reduce((prev, curr) => {
3244
+ const dd = drilldowns[curr];
3245
+ if (dd.active) {
3246
+ return [...prev, curr];
3247
+ }
3248
+ return prev;
3249
+ }, [])
3250
+ ];
3251
+ const actions2 = useActions();
3252
+ const itemsCuts = useSelector$1(selectCutItems);
3253
+ const { limit, offset } = useSelector$1(selectPaginationParams);
3254
+ const [pagination, setPagination] = useState({
3255
+ pageIndex: offset,
3256
+ pageSize: limit
3257
+ });
3258
+ const { isLoading, isFetching, isError, data, isPlaceholderData } = useTableData({
3259
+ offset,
3260
+ limit,
3261
+ columns: finalUniqueKeys,
3262
+ filters: filterItems.filter(isActiveItem),
3263
+ cuts: itemsCuts.filter(isActiveCut)
3264
+ });
3265
+ const tableData = (data == null ? void 0 : data.data) || [];
3266
+ const tableTypes = (data == null ? void 0 : data.types) || types;
3267
+ const finalKeys = Object.values(tableTypes).filter((t2) => !t2.isId).filter(columnFilter).sort(columnSorting);
3268
+ const totalRowCount = result.data.length === limit ? limit * 10 : result.data.length;
3269
+ const fetchedTableData = tableData != null ? tableData : [];
3270
+ useEffect(() => {
3271
+ actions2.updatePagination({
3272
+ limit: pagination.pageSize,
3273
+ offset: pagination.pageIndex * pagination.pageSize
3274
+ });
3275
+ }, [pagination]);
2905
3276
  const { translate: t } = useTranslation();
2906
3277
  const { currentFormats, getAvailableKeys, getFormatter, getFormatterKey, setFormat } = useFormatter(
2907
3278
  cube.measures
2908
3279
  );
2909
- const finalKeys = Object.values(types).filter((t2) => !t2.isId).filter(columnFilter).sort(columnSorting);
2910
3280
  const columns = useMemo(() => {
2911
- return finalKeys.map((column) => {
3281
+ const indexColumn = {
3282
+ id: "#",
3283
+ Header: "#",
3284
+ Cell: ({ row }) => row.index + 1,
3285
+ minWidth: 50,
3286
+ maxWidth: 50,
3287
+ width: 50,
3288
+ maxSize: 50,
3289
+ size: 50
3290
+ };
3291
+ const columnsDef = finalKeys.map((column) => {
3292
+ var _a;
2912
3293
  const {
2913
3294
  entity,
2914
3295
  entityType,
@@ -2918,19 +3299,17 @@ function useTable({
2918
3299
  range,
2919
3300
  isId
2920
3301
  } = column;
2921
- const isNumeric = valueType === "number";
2922
- const formatterKey = getFormatterKey(columnKey) || (isNumeric ? "Decimal" : "identity");
3302
+ const isNumeric2 = valueType === "number" && columnKey !== "Year";
3303
+ const formatterKey = getFormatterKey(columnKey) || (isNumeric2 ? "Decimal" : "identity");
2923
3304
  const formatter = getFormatter(formatterKey);
2924
3305
  const filterOption = getColumnFilterOption(entityType);
2925
3306
  const mantineFilterVariantObject = getMantineFilterMultiSelectProps(
2926
3307
  isId,
2927
- isNumeric,
3308
+ isNumeric2,
2928
3309
  range,
2929
3310
  entity,
2930
3311
  drilldowns,
2931
- data,
2932
- columnKey
2933
- );
3312
+ columnKey);
2934
3313
  return {
2935
3314
  ...filterOption,
2936
3315
  ...mantineFilterVariantObject,
@@ -2946,10 +3325,8 @@ function useTable({
2946
3325
  }
2947
3326
  return 0;
2948
3327
  },
2949
- getFilterValue: () => {
2950
- },
2951
3328
  Header: ({ column: column2 }) => {
2952
- return /* @__PURE__ */ React13__default.createElement(Box, { mb: rem(5) }, /* @__PURE__ */ React13__default.createElement(Flex, { justify: "center", align: "center" }, /* @__PURE__ */ React13__default.createElement(Box, { sx: { flexGrow: 1 } }, /* @__PURE__ */ React13__default.createElement(Flex, { gap: "xs", align: "center" }, getActionIcon(entityType), /* @__PURE__ */ React13__default.createElement(Text, { size: "sm" }, column2.columnDef.header), /* @__PURE__ */ React13__default.createElement(
3329
+ return /* @__PURE__ */ React10__default.createElement(Box, { mb: rem(5) }, /* @__PURE__ */ React10__default.createElement(Flex, { justify: "center", align: "center" }, /* @__PURE__ */ React10__default.createElement(Box, { sx: { flexGrow: 1 } }, /* @__PURE__ */ React10__default.createElement(Flex, { gap: "xs", align: "center" }, getActionIcon(entityType), /* @__PURE__ */ React10__default.createElement(Text, { size: "sm" }, column2.columnDef.header), /* @__PURE__ */ React10__default.createElement(
2953
3330
  ActionIcon,
2954
3331
  {
2955
3332
  key: `sort-${column2.columnDef.header}`,
@@ -2958,7 +3335,7 @@ function useTable({
2958
3335
  onClick: column2.getToggleSortingHandler()
2959
3336
  },
2960
3337
  getSortIcon(column2.getIsSorted(), entityType)
2961
- )), /* @__PURE__ */ React13__default.createElement(Text, { ml: rem(30), size: "sm", color: "dimmed", fw: "normal" }, getEntityText(entityType))), /* @__PURE__ */ React13__default.createElement(
3338
+ )), /* @__PURE__ */ React10__default.createElement(Text, { ml: rem(30), size: "sm", color: "dimmed", fw: "normal" }, getEntityText(entityType))), /* @__PURE__ */ React10__default.createElement(
2962
3339
  CustomActionIcon_default,
2963
3340
  {
2964
3341
  label: `At least one ${getEntityText(entityType)} is required.`,
@@ -2969,18 +3346,17 @@ function useTable({
2969
3346
  size: 25,
2970
3347
  ml: rem(5)
2971
3348
  },
2972
- /* @__PURE__ */ React13__default.createElement(IconTrash, null)
3349
+ /* @__PURE__ */ React10__default.createElement(IconTrash, null)
2973
3350
  )));
2974
3351
  },
2975
- size: isId ? 80 : void 0,
2976
3352
  formatter,
2977
3353
  formatterKey,
2978
- id: columnKey,
3354
+ id: (_a = entity.fullName) != null ? _a : entity.name,
2979
3355
  dataType: valueType,
2980
3356
  accessorFn: (item) => item[columnKey],
2981
- Cell: isNumeric ? ({ cell }) => formatter(cell.getValue()) : ({ cell, renderedCellValue, row }) => {
3357
+ Cell: isNumeric2 ? ({ cell }) => formatter(cell.getValue()) : ({ cell, renderedCellValue, row }) => {
2982
3358
  const cellId = row.original[`${cell.column.id} ID`];
2983
- return /* @__PURE__ */ React13__default.createElement(Flex, { justify: "space-between", sx: { width: "100%" }, gap: "sm" }, /* @__PURE__ */ React13__default.createElement(
3359
+ return /* @__PURE__ */ React10__default.createElement(Flex, { justify: "space-between", sx: { width: "100%", maxWidth: 400 }, gap: "sm" }, /* @__PURE__ */ React10__default.createElement(
2984
3360
  Text,
2985
3361
  {
2986
3362
  size: "sm",
@@ -2991,14 +3367,18 @@ function useTable({
2991
3367
  }
2992
3368
  },
2993
3369
  renderedCellValue
2994
- ), /* @__PURE__ */ React13__default.createElement(Box, null, cellId && /* @__PURE__ */ React13__default.createElement(Text, { color: "dimmed" }, cellId)));
3370
+ ), /* @__PURE__ */ React10__default.createElement(Box, null, cellId && /* @__PURE__ */ React10__default.createElement(Text, { color: "dimmed" }, cellId)));
2995
3371
  }
2996
3372
  };
2997
3373
  });
2998
- }, [currentFormats, data, types, drilldowns, measures]);
3374
+ return columnsDef.length ? [indexColumn, ...columnsDef] : [];
3375
+ }, [currentFormats, tableData, tableTypes, drilldowns, measures]);
2999
3376
  const constTableProps = useMemo(
3000
3377
  () => ({
3001
- enableBottomToolbar: isLimited,
3378
+ mantineToolbarAlertBannerProps: isError ? {
3379
+ color: "red",
3380
+ children: "Error loading data."
3381
+ } : void 0,
3002
3382
  enableColumnFilterModes: true,
3003
3383
  enableColumnResizing: true,
3004
3384
  enableDensityToggle: false,
@@ -3008,27 +3388,10 @@ function useTable({
3008
3388
  showRowsPerPage: false
3009
3389
  },
3010
3390
  paginationDisplayMode: "pages",
3011
- enableRowNumbers: true,
3012
- rowNumberMode: "static",
3013
- displayColumnDefOptions: {
3014
- "mrt-row-numbers": {
3015
- size: 10,
3016
- maxSize: 25,
3017
- enableOrdering: true,
3018
- mantineTableBodyCellProps: {
3019
- sx: (t2) => ({
3020
- fontSize: t2.fontSizes.sm,
3021
- color: t2.colors.gray[6]
3022
- })
3023
- }
3024
- }
3025
- },
3026
3391
  enableRowVirtualization: false,
3027
- // globalFilterFn: "contains",
3392
+ globalFilterFn: "contains",
3028
3393
  initialState: {
3029
- density: "xs",
3030
- showColumnFilters: true,
3031
- pagination: { pageSize: 100, pageIndex: 0 }
3394
+ density: "xs"
3032
3395
  },
3033
3396
  mantineBottomToolbarProps: {
3034
3397
  id: "query-results-table-view-footer"
@@ -3036,8 +3399,9 @@ function useTable({
3036
3399
  mantineTableProps: {
3037
3400
  sx: {
3038
3401
  "& td": {
3039
- padding: "7px 10px!important"
3040
- }
3402
+ padding: "7px 10px !important"
3403
+ },
3404
+ tableLayout: "fixed"
3041
3405
  },
3042
3406
  withColumnBorders: true
3043
3407
  },
@@ -3068,12 +3432,12 @@ function useTable({
3068
3432
  }
3069
3433
  },
3070
3434
  renderBottomToolbar() {
3071
- const [isOpen, setIsOpen] = useState(isLimited);
3435
+ const [isOpen, setIsOpen] = useState(false);
3072
3436
  if (!isOpen) return null;
3073
- return /* @__PURE__ */ React13__default.createElement(
3437
+ return /* @__PURE__ */ React10__default.createElement(
3074
3438
  Alert,
3075
3439
  {
3076
- icon: /* @__PURE__ */ React13__default.createElement(IconAlertCircle, { size: "1rem" }),
3440
+ icon: /* @__PURE__ */ React10__default.createElement(IconAlertCircle, { size: "1rem" }),
3077
3441
  color: "yellow",
3078
3442
  withCloseButton: true,
3079
3443
  onClose: () => setIsOpen(false)
@@ -3082,30 +3446,41 @@ function useTable({
3082
3446
  );
3083
3447
  }
3084
3448
  }),
3085
- [isLimited]
3449
+ [isError]
3086
3450
  );
3087
3451
  const table = useMantineReactTable({
3088
3452
  columns,
3089
- data,
3453
+ data: fetchedTableData,
3454
+ onPaginationChange: setPagination,
3090
3455
  enableHiding: false,
3456
+ manualFiltering: true,
3457
+ manualPagination: true,
3458
+ manualSorting: false,
3459
+ rowCount: totalRowCount,
3460
+ state: {
3461
+ isLoading: isLoading || isFetching || data === void 0,
3462
+ pagination,
3463
+ showAlertBanner: isError,
3464
+ showProgressBars: isFetching || isLoading
3465
+ },
3091
3466
  ...constTableProps,
3092
3467
  ...mantineTableProps
3093
3468
  });
3094
- return { table };
3469
+ return { table, isError, isLoading };
3095
3470
  }
3096
- function TableView({ table, result }) {
3097
- return /* @__PURE__ */ React13__default.createElement(Flex, { justify: "space-between", align: "center", sx: { height: "100%" } }, /* @__PURE__ */ React13__default.createElement(Flex, { direction: "column", justify: "space-between", sx: { height: "100%", flex: "1 1 auto" } }, /* @__PURE__ */ React13__default.createElement(
3471
+ function TableView({ table, result, isError, isLoading }) {
3472
+ const isData = Boolean(table.getRowModel().rows.length);
3473
+ return /* @__PURE__ */ React10__default.createElement(Box, { sx: { height: "100%" } }, /* @__PURE__ */ React10__default.createElement(Flex, { direction: "column", justify: "space-between", sx: { height: "100%", flex: "1 1 auto" } }, /* @__PURE__ */ React10__default.createElement(MRT_ProgressBar, { isTopToolbar: false, table }), /* @__PURE__ */ React10__default.createElement(
3098
3474
  Box,
3099
3475
  {
3100
3476
  sx: {
3101
3477
  flex: "1 1 auto",
3102
- height: "100%",
3103
- maxHeight: "calc(100vh - 70px)",
3478
+ height: isData ? "100%" : "auto",
3104
3479
  position: "relative",
3105
- overflowY: "scroll"
3480
+ overflow: "scroll"
3106
3481
  }
3107
3482
  },
3108
- /* @__PURE__ */ React13__default.createElement(
3483
+ /* @__PURE__ */ React10__default.createElement(
3109
3484
  Table,
3110
3485
  {
3111
3486
  captionSide: "top",
@@ -3117,85 +3492,57 @@ function TableView({ table, result }) {
3117
3492
  withBorder: true,
3118
3493
  withColumnBorders: true
3119
3494
  },
3120
- /* @__PURE__ */ React13__default.createElement(
3495
+ /* @__PURE__ */ React10__default.createElement(
3121
3496
  Box,
3122
3497
  {
3123
3498
  component: "thead",
3124
3499
  sx: {
3125
3500
  position: "relative",
3126
- top: 0
3501
+ top: 0,
3502
+ zIndex: 10
3127
3503
  }
3128
3504
  },
3129
- table.getHeaderGroups().map((headerGroup) => /* @__PURE__ */ React13__default.createElement(Box, { component: "tr", key: headerGroup.id }, headerGroup.headers.map((header) => {
3130
- var _a, _b;
3505
+ table.getHeaderGroups().map((headerGroup) => /* @__PURE__ */ React10__default.createElement(Box, { component: "tr", key: headerGroup.id, sx: { fontWeight: "normal" } }, headerGroup.headers.map((header) => {
3506
+ var _a;
3131
3507
  const column = table.getColumn(header.id);
3132
- if (column.id !== "mrt-row-numbers") {
3133
- const isNumeric = column.columnDef.dataType === "number";
3134
- return /* @__PURE__ */ React13__default.createElement(
3135
- Box,
3136
- {
3137
- component: "th",
3138
- key: header.id,
3139
- sx: (theme) => ({
3140
- backgroundColor: theme.colorScheme === "dark" ? theme.colors.dark[7] : theme.colors.gray[0],
3141
- align: isNumeric ? "right" : "left",
3142
- height: 60,
3143
- paddingBottom: 10,
3144
- width: 300,
3145
- position: "sticky",
3146
- fontSize: theme.fontSizes.sm,
3147
- top: 0,
3148
- display: "table-cell"
3149
- })
3150
- },
3151
- header.isPlaceholder ? null : flexRender(
3152
- (_a = header.column.columnDef.Header) != null ? _a : header.column.columnDef.header,
3153
- header.getContext()
3154
- ),
3155
- /* @__PURE__ */ React13__default.createElement(MRT_TableHeadCellFilterContainer, { header, table })
3156
- );
3157
- } else {
3158
- return /* @__PURE__ */ React13__default.createElement(React13__default.Fragment, null, /* @__PURE__ */ React13__default.createElement(
3159
- Box,
3160
- {
3161
- component: "th",
3162
- key: header.id,
3163
- sx: (theme) => ({
3164
- width: `calc(1rem * ${String(table.getRowModel().rows.length).length})`,
3165
- maxWidth: `calc(1rem * ${String(table.getRowModel().rows.length).length})`,
3166
- position: "sticky",
3167
- top: 0,
3168
- backgroundColor: theme.colorScheme === "dark" ? theme.colors.dark[7] : theme.colors.gray[0],
3169
- display: "table-cell"
3170
- })
3171
- },
3172
- /* @__PURE__ */ React13__default.createElement(Box, null, header.isPlaceholder ? null : flexRender(
3173
- (_b = header.column.columnDef.Header) != null ? _b : header.column.columnDef.header,
3174
- header.getContext()
3175
- ))
3176
- ));
3177
- }
3178
- }), /* @__PURE__ */ React13__default.createElement(
3179
- Box,
3180
- {
3181
- component: "th",
3182
- key: "placeholder",
3183
- sx: (theme) => ({
3184
- backgroundColor: theme.colorScheme === "dark" ? theme.colors.dark[7] : theme.colors.gray[0],
3185
- align: "center",
3186
- height: 60,
3187
- paddingBottom: 10,
3188
- width: 20,
3189
- position: "sticky",
3190
- top: 0,
3191
- display: "table-cell",
3192
- textAlign: "center"
3193
- })
3194
- },
3195
- /* @__PURE__ */ React13__default.createElement(OptionsMenu_default, null, /* @__PURE__ */ React13__default.createElement(PlusSVG, null))
3196
- )))
3508
+ const isNumeric2 = column.columnDef.dataType === "number";
3509
+ const isRowIndex = column.id === "#";
3510
+ const base = (theme) => ({
3511
+ backgroundColor: theme.colorScheme === "dark" ? theme.colors.dark[7] : theme.colors.gray[0],
3512
+ align: isNumeric2 ? "right" : "left",
3513
+ height: 60,
3514
+ paddingBottom: 10,
3515
+ minWidth: 210,
3516
+ width: 300,
3517
+ maxWidth: 450,
3518
+ position: "sticky",
3519
+ fontSize: theme.fontSizes.sm,
3520
+ top: 0,
3521
+ display: "table-cell"
3522
+ });
3523
+ const index = (theme) => ({
3524
+ ...base(theme),
3525
+ minWidth: 10,
3526
+ width: 10,
3527
+ maxWidth: 10,
3528
+ size: 10
3529
+ });
3530
+ return /* @__PURE__ */ React10__default.createElement(
3531
+ Box,
3532
+ {
3533
+ component: "th",
3534
+ key: header.id,
3535
+ sx: (theme) => isRowIndex ? index(theme) : base(theme)
3536
+ },
3537
+ header.isPlaceholder ? null : flexRender(
3538
+ (_a = header.column.columnDef.Header) != null ? _a : header.column.columnDef.header,
3539
+ header.getContext()
3540
+ ),
3541
+ !isRowIndex && /* @__PURE__ */ React10__default.createElement(ColumnFilterCell, { isNumeric: isNumeric2, header, table })
3542
+ );
3543
+ })))
3197
3544
  ),
3198
- /* @__PURE__ */ React13__default.createElement(Box, { component: "tbody" }, table.getRowModel().rows.map((row) => /* @__PURE__ */ React13__default.createElement("tr", { key: row.id }, row.getVisibleCells().map((cell) => /* @__PURE__ */ React13__default.createElement(
3545
+ isData && /* @__PURE__ */ React10__default.createElement(Box, { component: "tbody" }, table.getRowModel().rows.map((row) => /* @__PURE__ */ React10__default.createElement("tr", { key: row.id }, row.getVisibleCells().map((cell) => /* @__PURE__ */ React10__default.createElement(
3199
3546
  MRT_TableBodyCell,
3200
3547
  {
3201
3548
  key: cell.id,
@@ -3204,25 +3551,95 @@ function TableView({ table, result }) {
3204
3551
  table
3205
3552
  }
3206
3553
  )))))
3207
- )
3208
- ), /* @__PURE__ */ React13__default.createElement(TableFooter_default, { table, result })));
3554
+ ),
3555
+ !isData && !isError && !isLoading && /* @__PURE__ */ React10__default.createElement(NoRecords, null)
3556
+ ), /* @__PURE__ */ React10__default.createElement(MRT_ToolbarAlertBanner, { stackAlertBanner: true, table }), /* @__PURE__ */ React10__default.createElement(TableFooter_default, { table, result })));
3557
+ }
3558
+ var ColumnFilterCell = ({
3559
+ header,
3560
+ table,
3561
+ isNumeric: isNumeric2
3562
+ }) => {
3563
+ const filterVariant = header.column.columnDef.filterVariant;
3564
+ const isMulti = filterVariant === "multi-select";
3565
+ if (isMulti) {
3566
+ return /* @__PURE__ */ React10__default.createElement(MultiFilter, { header });
3567
+ }
3568
+ if (isNumeric2) {
3569
+ return /* @__PURE__ */ React10__default.createElement(NumericFilter, { header });
3570
+ }
3571
+ };
3572
+ function NumericFilter({ header }) {
3573
+ const filters = useSelector$1(selectFilterItems);
3574
+ const filter = filters.find((f) => f.measure === header.column.id);
3575
+ if (filter) {
3576
+ const filterFn = getFilterFn(filter);
3577
+ const text = getFilterfnText(filterFn);
3578
+ const isBetween = filterFn === "between";
3579
+ return /* @__PURE__ */ React10__default.createElement(Flex, { gap: "xs", style: { fontWeight: "normal" } }, /* @__PURE__ */ React10__default.createElement(Box, { sx: { flex: "1 1 auto" } }, isBetween ? /* @__PURE__ */ React10__default.createElement(MinMax, { filter, hideControls: true }) : /* @__PURE__ */ React10__default.createElement(NumberInputComponent, { text, filter })), /* @__PURE__ */ React10__default.createElement(Box, { sx: { alignSelf: "flex-end" } }, /* @__PURE__ */ React10__default.createElement(FilterFnsMenu, { filter })));
3580
+ }
3581
+ }
3582
+ function MultiFilter({ header }) {
3583
+ const cutItems = useSelector$1(selectCutItems);
3584
+ const drilldownItems = useSelector$1(selectDrilldownItems);
3585
+ const label = header.column.id;
3586
+ const drilldown = drilldownItems.find((c) => c.uniqueName === header.column.id);
3587
+ const actions2 = useActions();
3588
+ const cut = cutItems.find((cut2) => {
3589
+ return cut2.uniqueName === (drilldown == null ? void 0 : drilldown.uniqueName);
3590
+ });
3591
+ const updatecutHandler = React10__default.useCallback((item, members) => {
3592
+ actions2.updateCut({ ...item, members });
3593
+ }, []);
3594
+ return drilldown && cut && /* @__PURE__ */ React10__default.createElement(Box, { pt: "md", style: { fontWeight: "normal" } }, /* @__PURE__ */ React10__default.createElement(
3595
+ MultiSelect,
3596
+ {
3597
+ sx: { flex: "1 1 100%" },
3598
+ searchable: true,
3599
+ onChange: (value) => {
3600
+ updatecutHandler({ ...cut, active: true }, value);
3601
+ },
3602
+ placeholder: `Filter by ${label}`,
3603
+ value: cut.members || [],
3604
+ data: drilldown.members.map((m) => ({
3605
+ value: String(m.key),
3606
+ label: m.caption ? `${m.caption} ${m.key}` : m.name
3607
+ })),
3608
+ clearButtonProps: { "aria-label": "Clear selection" },
3609
+ clearable: true,
3610
+ nothingFound: "Nothing found",
3611
+ size: "xs"
3612
+ }
3613
+ ));
3209
3614
  }
3615
+ var NoRecords = () => {
3616
+ return /* @__PURE__ */ React10__default.createElement(Center, { style: { height: "calc(100% - 210px)" } }, /* @__PURE__ */ React10__default.createElement(Text, { size: "xl", color: "gray", italic: true }, "No records to display."));
3617
+ };
3210
3618
  TableView.displayName = "TesseractExplorer:TableView";
3211
3619
 
3212
3620
  // src/components/Toolbar.tsx
3213
3621
  init_esm_shims();
3214
3622
  var toolbarSx = (t) => ({
3215
3623
  background: t.colorScheme === "dark" ? t.black : t.white,
3216
- borderRadius: t.radius.xl
3624
+ borderRadius: t.radius.xl,
3625
+ height: "fit-content"
3217
3626
  });
3218
3627
  function ToolbarButton({ icon, label, onClick = () => void 0 }) {
3219
- return /* @__PURE__ */ React13__default.createElement(UnstyledButton, { onClick, py: 4, sx: (t) => ({ "& svg path": { stroke: t.colorScheme === "dark" ? "white" : "black" } }) }, /* @__PURE__ */ React13__default.createElement(Group, { spacing: "xs", noWrap: true }, icon, /* @__PURE__ */ React13__default.createElement(Text, { size: "sm" }, label)));
3628
+ return /* @__PURE__ */ React10__default.createElement(
3629
+ UnstyledButton,
3630
+ {
3631
+ onClick,
3632
+ py: { base: "0.2rem", md: 0 },
3633
+ sx: (t) => ({ "& svg path": { stroke: t.colorScheme === "dark" ? "white" : "black" } })
3634
+ },
3635
+ /* @__PURE__ */ React10__default.createElement(Group, { spacing: "xs", noWrap: true }, icon, /* @__PURE__ */ React10__default.createElement(Text, { size: "sm" }, label))
3636
+ );
3220
3637
  }
3221
3638
  function ToolbarSearch({ table }) {
3639
+ const { translate: t } = useTranslation();
3222
3640
  const { setShowGlobalFilter, setGlobalFilter } = table;
3223
- const { globalFilter, showGlobalFilter } = table.getState();
3641
+ const { showGlobalFilter } = table.getState();
3224
3642
  const inputRef = useRef(null);
3225
- useState(false);
3226
3643
  const [query, setQuery] = useState(table.getState().globalFilter);
3227
3644
  const [debouncedQuery] = useDebouncedValue(query, 200);
3228
3645
  useEffect(() => {
@@ -3239,30 +3656,24 @@ function ToolbarSearch({ table }) {
3239
3656
  return (_a = inputRef.current) == null ? void 0 : _a.focus();
3240
3657
  }, 100);
3241
3658
  };
3242
- return /* @__PURE__ */ React13__default.createElement(Group, { position: "left" }, /* @__PURE__ */ React13__default.createElement(
3243
- ToolbarButton,
3244
- {
3245
- icon: /* @__PURE__ */ React13__default.createElement(ClearSVG, null),
3246
- label: "Clear",
3247
- onClick: handleClear
3248
- }
3249
- ), /* @__PURE__ */ React13__default.createElement(
3659
+ return /* @__PURE__ */ React10__default.createElement(Flex, { justify: "flex-start", direction: { base: "column", md: "row" }, gap: "xs" }, /* @__PURE__ */ React10__default.createElement(ToolbarButton, { icon: /* @__PURE__ */ React10__default.createElement(ClearSVG, null), label: t("params.label_clear"), onClick: handleClear }), /* @__PURE__ */ React10__default.createElement(
3250
3660
  ToolbarButton,
3251
3661
  {
3252
- icon: /* @__PURE__ */ React13__default.createElement(SearchSVG, null),
3253
- label: "Search",
3662
+ icon: /* @__PURE__ */ React10__default.createElement(SearchSVG, null),
3663
+ label: t("params.label_search"),
3254
3664
  onClick: () => handleShowFilter(!showGlobalFilter)
3255
3665
  }
3256
- ), /* @__PURE__ */ React13__default.createElement(
3666
+ ), /* @__PURE__ */ React10__default.createElement(
3257
3667
  Box,
3258
3668
  {
3259
3669
  w: showGlobalFilter ? 120 : 0,
3670
+ h: showGlobalFilter ? "auto" : 0,
3260
3671
  sx: {
3261
3672
  transition: "width .2s cubic-bezier(0.4, 0, 0.2, 1)",
3262
3673
  overflow: "hidden"
3263
3674
  }
3264
3675
  },
3265
- /* @__PURE__ */ React13__default.createElement(
3676
+ /* @__PURE__ */ React10__default.createElement(
3266
3677
  TextInput,
3267
3678
  {
3268
3679
  ref: inputRef,
@@ -3275,13 +3686,43 @@ function ToolbarSearch({ table }) {
3275
3686
  )
3276
3687
  ));
3277
3688
  }
3278
- function Toolbar({ table, fullscreen }) {
3279
- return /* @__PURE__ */ React13__default.createElement(Group, { sx: toolbarSx, my: "sm", p: "xs", px: "md", noWrap: true }, /* @__PURE__ */ React13__default.createElement(ToolbarSearch, { table }), /* @__PURE__ */ React13__default.createElement(ToolbarButton, { icon: /* @__PURE__ */ React13__default.createElement(FullScreenSVG, null), label: "Full screen", onClick: fullscreen.toggle }));
3689
+ function Toolbar({
3690
+ table,
3691
+ fullscreen
3692
+ }) {
3693
+ const { translate: t } = useTranslation();
3694
+ const theme = useMantineTheme();
3695
+ const smallerThanMd = useMediaQuery(`(max-width: ${theme.breakpoints.md})`);
3696
+ const settings = /* @__PURE__ */ React10__default.createElement(
3697
+ Flex,
3698
+ {
3699
+ direction: { base: "column", md: "row" },
3700
+ justify: "flex-start",
3701
+ sx: toolbarSx,
3702
+ p: "0.325rem",
3703
+ px: "md",
3704
+ wrap: "nowrap",
3705
+ gap: "xs"
3706
+ },
3707
+ /* @__PURE__ */ React10__default.createElement(ToolbarSearch, { table }),
3708
+ /* @__PURE__ */ React10__default.createElement(
3709
+ ToolbarButton,
3710
+ {
3711
+ icon: /* @__PURE__ */ React10__default.createElement(FullScreenSVG, null),
3712
+ label: t("params.label_fullscreen"),
3713
+ onClick: fullscreen.toggle
3714
+ }
3715
+ )
3716
+ );
3717
+ return smallerThanMd ? /* @__PURE__ */ React10__default.createElement(Menu, null, /* @__PURE__ */ React10__default.createElement(Menu.Target, null, /* @__PURE__ */ React10__default.createElement(ActionIcon, null, /* @__PURE__ */ React10__default.createElement(IconSettings, null))), /* @__PURE__ */ React10__default.createElement(Menu.Dropdown, null, settings)) : settings;
3280
3718
  }
3281
3719
 
3282
3720
  // src/components/ExplorerTabs.tsx
3283
3721
  init_esm_shims();
3284
3722
  var tabsStyles = (t) => ({
3723
+ root: {
3724
+ alignSelf: "flex-end"
3725
+ },
3285
3726
  tab: {
3286
3727
  fontWeight: 700,
3287
3728
  color: t.colors.gray[6],
@@ -3300,7 +3741,7 @@ function ExplorerTabs({
3300
3741
  value
3301
3742
  }) {
3302
3743
  const { translate: t } = useTranslation();
3303
- return /* @__PURE__ */ React13__default.createElement(
3744
+ return /* @__PURE__ */ React10__default.createElement(
3304
3745
  Tabs,
3305
3746
  {
3306
3747
  color: "blue",
@@ -3309,7 +3750,7 @@ function ExplorerTabs({
3309
3750
  value,
3310
3751
  styles: tabsStyles
3311
3752
  },
3312
- /* @__PURE__ */ React13__default.createElement(Tabs.List, null, panels.map((panel) => /* @__PURE__ */ React13__default.createElement(Tabs.Tab, { key: panel.key, id: panel.key, value: panel.key, h: 56 }, t(panel.label))))
3753
+ /* @__PURE__ */ React10__default.createElement(Tabs.List, null, panels.map((panel) => /* @__PURE__ */ React10__default.createElement(Tabs.Tab, { key: panel.key, id: panel.key, value: panel.key, h: 56 }, t(panel.label))))
3313
3754
  );
3314
3755
  }
3315
3756
  var useStyles2 = createStyles(() => ({
@@ -3322,35 +3763,34 @@ var useStyles2 = createStyles(() => ({
3322
3763
  function ExplorerResults(props) {
3323
3764
  const cube = useSelector$1(selectOlapCube);
3324
3765
  const serverStatus = useSelector$1(selectServerState);
3325
- const { isDirty, params, result } = useSelector$1(selectCurrentQueryItem);
3326
- const { loading: isLoading } = useSelector$1(selectLoadingState);
3766
+ const { params, result } = useSelector$1(selectCurrentQueryItem);
3327
3767
  const { online: isServerOnline, url: serverUrl } = serverStatus;
3328
3768
  const { data, error } = result;
3329
3769
  const { translate: t } = useTranslation();
3330
3770
  const { classes, cx } = useStyles2();
3331
3771
  if (typeof window === "object" && window.navigator.onLine === false) {
3332
- return /* @__PURE__ */ React13__default.createElement(
3772
+ return /* @__PURE__ */ React10__default.createElement(
3333
3773
  FailureResult,
3334
3774
  {
3335
3775
  className: cx(classes.container, props.className),
3336
- icon: /* @__PURE__ */ React13__default.createElement(IconWorld, { color: "orange", size: "5rem" }),
3776
+ icon: /* @__PURE__ */ React10__default.createElement(IconWorld, { color: "orange", size: "5rem" }),
3337
3777
  title: t("results.error_disconnected_title")
3338
3778
  }
3339
3779
  );
3340
3780
  }
3341
3781
  if (isServerOnline === false) {
3342
- return /* @__PURE__ */ React13__default.createElement(
3782
+ return /* @__PURE__ */ React10__default.createElement(
3343
3783
  FailureResult,
3344
3784
  {
3345
3785
  className: cx(classes.container, props.className),
3346
- icon: /* @__PURE__ */ React13__default.createElement(IconAlertTriangle, { color: "orange", size: "5rem" }),
3786
+ icon: /* @__PURE__ */ React10__default.createElement(IconAlertTriangle, { color: "orange", size: "5rem" }),
3347
3787
  title: t("results.error_serveroffline_title"),
3348
- description: /* @__PURE__ */ React13__default.createElement(Text, { span: true }, t("results.error_serveroffline_detail"), /* @__PURE__ */ React13__default.createElement(Anchor, { href: serverUrl, target: "_blank", rel: "noopener noreferrer" }, serverUrl), ".")
3788
+ description: /* @__PURE__ */ React10__default.createElement(Text, { span: true }, t("results.error_serveroffline_detail"), /* @__PURE__ */ React10__default.createElement(Anchor, { href: serverUrl, target: "_blank", rel: "noopener noreferrer" }, serverUrl), ".")
3349
3789
  }
3350
3790
  );
3351
3791
  }
3352
- if (isServerOnline == null || !cube || isDirty || isLoading) {
3353
- return /* @__PURE__ */ React13__default.createElement(
3792
+ if (isServerOnline == null || !cube) {
3793
+ return /* @__PURE__ */ React10__default.createElement(
3354
3794
  Paper,
3355
3795
  {
3356
3796
  className: cx(classes.container, props.className),
@@ -3361,27 +3801,16 @@ function ExplorerResults(props) {
3361
3801
  );
3362
3802
  }
3363
3803
  if (error) {
3364
- return /* @__PURE__ */ React13__default.createElement(
3365
- FailureResult,
3366
- {
3367
- className: cx(classes.container, props.className),
3368
- description: /* @__PURE__ */ React13__default.createElement(Stack, { align: "center", spacing: "xs" }, /* @__PURE__ */ React13__default.createElement(Text, null, t("results.error_execquery_detail")), /* @__PURE__ */ React13__default.createElement(Text, null, error)),
3369
- icon: /* @__PURE__ */ React13__default.createElement(IconAlertTriangle, { color: "orange", size: "5rem" })
3370
- }
3371
- );
3372
- }
3373
- if (data.length === 0) {
3374
- return /* @__PURE__ */ React13__default.createElement(
3804
+ return /* @__PURE__ */ React10__default.createElement(
3375
3805
  FailureResult,
3376
3806
  {
3377
3807
  className: cx(classes.container, props.className),
3378
- icon: /* @__PURE__ */ React13__default.createElement(IconBox, { color: "orange", size: "5rem" }),
3379
- title: t("results.error_emptyresult_title"),
3380
- description: t("results.error_emptyresult_detail")
3808
+ description: /* @__PURE__ */ React10__default.createElement(Stack, { align: "center", spacing: "xs" }, /* @__PURE__ */ React10__default.createElement(Text, null, t("results.error_execquery_detail")), /* @__PURE__ */ React10__default.createElement(Text, null, error)),
3809
+ icon: /* @__PURE__ */ React10__default.createElement(IconAlertTriangle, { color: "orange", size: "5rem" })
3381
3810
  }
3382
3811
  );
3383
3812
  }
3384
- return /* @__PURE__ */ React13__default.createElement(
3813
+ return /* @__PURE__ */ React10__default.createElement(
3385
3814
  SuccessResult,
3386
3815
  {
3387
3816
  className: cx(classes.container, props.className),
@@ -3394,7 +3823,7 @@ function ExplorerResults(props) {
3394
3823
  );
3395
3824
  }
3396
3825
  function FailureResult(props) {
3397
- return /* @__PURE__ */ React13__default.createElement(
3826
+ return /* @__PURE__ */ React10__default.createElement(
3398
3827
  Paper,
3399
3828
  {
3400
3829
  id: "query-results-failure",
@@ -3403,7 +3832,7 @@ function FailureResult(props) {
3403
3832
  withBorder: true,
3404
3833
  sx: { justifyContent: "center" }
3405
3834
  },
3406
- /* @__PURE__ */ React13__default.createElement(Stack, { align: "center", spacing: "xs" }, props.icon && props.icon, props.title && /* @__PURE__ */ React13__default.createElement(Title, { order: 5 }, props.title), props.description && /* @__PURE__ */ React13__default.createElement(Text, null, props.description), props.children && props.children, props.action && props.action)
3835
+ /* @__PURE__ */ React10__default.createElement(Stack, { align: "center", spacing: "xs" }, props.icon && props.icon, props.title && /* @__PURE__ */ React10__default.createElement(Title, { order: 5 }, props.title), props.description && /* @__PURE__ */ React10__default.createElement(Text, null, props.description), props.children && props.children, props.action && props.action)
3407
3836
  );
3408
3837
  }
3409
3838
  function SuccessResult(props) {
@@ -3412,7 +3841,7 @@ function SuccessResult(props) {
3412
3841
  const { previewLimit, actions: actions2 } = useSettings();
3413
3842
  const queryItem = useSelector$1(selectCurrentQueryItem);
3414
3843
  const isPreviewMode = useSelector$1(selectIsPreviewMode);
3415
- const { table } = useTable({ cube, result });
3844
+ const { table, isError, isLoading } = useTable({ cube, result });
3416
3845
  const fullscreen = useFullscreen();
3417
3846
  const [CurrentComponent, panelKey, panelMeta] = useMemo(() => {
3418
3847
  const currentPanel = queryItem.panel || `${panels[0].key}-`;
@@ -3423,7 +3852,7 @@ function SuccessResult(props) {
3423
3852
  const tabHandler = useCallback((newTab) => {
3424
3853
  actions2.switchPanel(newTab);
3425
3854
  }, []);
3426
- return /* @__PURE__ */ React13__default.createElement(Flex, { gap: "xs", direction: "column", w: "100%", className: props.className }, /* @__PURE__ */ React13__default.createElement(Paper, { ref: fullscreen.ref, id: "query-results-success", h: "100%" }, /* @__PURE__ */ React13__default.createElement(
3855
+ return /* @__PURE__ */ React10__default.createElement(Flex, { gap: "xs", direction: "column", w: "100%", className: props.className }, /* @__PURE__ */ React10__default.createElement(Paper, { ref: fullscreen.ref, id: "query-results-success", h: "100%" }, /* @__PURE__ */ React10__default.createElement(
3427
3856
  Flex,
3428
3857
  {
3429
3858
  sx: (t2) => ({
@@ -3433,16 +3862,18 @@ function SuccessResult(props) {
3433
3862
  }),
3434
3863
  w: "100%"
3435
3864
  },
3436
- /* @__PURE__ */ React13__default.createElement(ExplorerTabs, { panels, onChange: tabHandler, value: panelKey }),
3437
- (!queryItem.panel || queryItem.panel === "table") && /* @__PURE__ */ React13__default.createElement(Box, { sx: { display: "flex", flex: "0 1 auto" }, mr: "sm" }, /* @__PURE__ */ React13__default.createElement(Toolbar, { table, fullscreen }))
3438
- ), isPreviewMode && /* @__PURE__ */ React13__default.createElement(Alert, { id: "alert-load-all-results", color: "yellow", radius: 0, sx: { flex: "0 0 auto" } }, /* @__PURE__ */ React13__default.createElement(Group, { position: "apart" }, /* @__PURE__ */ React13__default.createElement(Text, null, /* @__PURE__ */ React13__default.createElement(Text, { fw: 700, span: true }, t("previewMode.title_preview"), ":", " "), /* @__PURE__ */ React13__default.createElement(Text, { span: true }, t("previewMode.description_preview", { limit: previewLimit }))), /* @__PURE__ */ React13__default.createElement(PreviewModeSwitch, null))), /* @__PURE__ */ React13__default.createElement(Box, { id: "query-results-content", sx: { flex: "1 1", height: "calc(100% - 60px)" } }, /* @__PURE__ */ React13__default.createElement(Suspense, { fallback: props.children }, /* @__PURE__ */ React13__default.createElement(Flex, { h: "100%" }, /* @__PURE__ */ React13__default.createElement(Box, { sx: { flex: "1 1" } }, /* @__PURE__ */ React13__default.createElement(
3865
+ /* @__PURE__ */ React10__default.createElement(ExplorerTabs, { panels, onChange: tabHandler, value: panelKey }),
3866
+ (!queryItem.panel || queryItem.panel === "table") && /* @__PURE__ */ React10__default.createElement(Group, { sx: { display: "flex", flex: "0 1 auto" }, mr: "sm", noWrap: true }, /* @__PURE__ */ React10__default.createElement(DrawerMenu_default, null), /* @__PURE__ */ React10__default.createElement(Toolbar, { table, fullscreen }))
3867
+ ), isPreviewMode && /* @__PURE__ */ React10__default.createElement(Alert, { id: "alert-load-all-results", color: "yellow", radius: 0, sx: { flex: "0 0 auto" } }, /* @__PURE__ */ React10__default.createElement(Group, { position: "apart" }, /* @__PURE__ */ React10__default.createElement(Text, null, /* @__PURE__ */ React10__default.createElement(Text, { fw: 700, span: true }, t("previewMode.title_preview"), ":", " "), /* @__PURE__ */ React10__default.createElement(Text, { span: true }, t("previewMode.description_preview", { limit: previewLimit }))), /* @__PURE__ */ React10__default.createElement(PreviewModeSwitch, null))), /* @__PURE__ */ React10__default.createElement(Box, { id: "query-results-content", sx: { flex: "1 1", height: "calc(100% - 60px)" } }, /* @__PURE__ */ React10__default.createElement(Suspense, { fallback: props.children }, /* @__PURE__ */ React10__default.createElement(Flex, { h: "100%" }, /* @__PURE__ */ React10__default.createElement(Box, { sx: { flex: "1 1", overflowX: "scroll" } }, /* @__PURE__ */ React10__default.createElement(
3439
3868
  CurrentComponent,
3440
3869
  {
3441
3870
  panelKey: `${panelKey}-${panelMeta}`,
3442
3871
  cube,
3443
3872
  params,
3444
3873
  result,
3445
- table
3874
+ table,
3875
+ isError,
3876
+ isLoading
3446
3877
  }
3447
3878
  )))))));
3448
3879
  }
@@ -3453,9 +3884,9 @@ init_esm_shims();
3453
3884
  // src/utils/create-context.ts
3454
3885
  init_esm_shims();
3455
3886
  var createContext2 = (name4) => {
3456
- const Context = React13__default.createContext(void 0);
3887
+ const Context = React10__default.createContext(void 0);
3457
3888
  const useContext2 = () => {
3458
- const ctx = React13__default.useContext(Context);
3889
+ const ctx = React10__default.useContext(Context);
3459
3890
  if (ctx === void 0) {
3460
3891
  throw new Error(`useContext for must be inside a ${name4}Provider with a value`);
3461
3892
  }
@@ -3523,7 +3954,7 @@ var Graph = class {
3523
3954
  });
3524
3955
  return subtopic;
3525
3956
  }
3526
- filter(locale, startingNode, filter) {
3957
+ filter(locale, filter) {
3527
3958
  function addItemToSubtopic(map2, subtopic, item) {
3528
3959
  if (map2.has(subtopic)) {
3529
3960
  map2.get(subtopic).push(item);
@@ -3534,24 +3965,21 @@ var Graph = class {
3534
3965
  const map = /* @__PURE__ */ new Map();
3535
3966
  const matches = [];
3536
3967
  if (filter !== "") {
3537
- this.depthFirstTraversal(startingNode, (node) => {
3538
- const items = this.isTable(locale, node);
3539
- if (items.length) {
3540
- if (filter) {
3541
- for (const item of items) {
3542
- const list = matchSorter([node], filter);
3543
- if (list.length) {
3544
- const subtopic = getAnnotation(item, "subtopic", locale);
3545
- const topic = getAnnotation(item, "topic", locale);
3546
- addItemToSubtopic(map, `${topic} - ${subtopic}`, list[0]);
3547
- matches.push(...list);
3548
- }
3549
- }
3550
- } else {
3551
- matches.push(node);
3552
- }
3553
- }
3968
+ const results = matchSorter(this.items, filter, {
3969
+ keys: [
3970
+ "name",
3971
+ (item) => getAnnotation(item, "topic", locale) || "",
3972
+ (item) => getAnnotation(item, "subtopic", locale) || "",
3973
+ (item) => getAnnotation(item, "table", locale) || ""
3974
+ ]
3554
3975
  });
3976
+ for (const item of results) {
3977
+ const topic = getAnnotation(item, "topic", locale);
3978
+ const subtopic = getAnnotation(item, "subtopic", locale);
3979
+ const title = getAnnotation(item, "table", locale);
3980
+ addItemToSubtopic(map, `${topic} - ${subtopic}`, title);
3981
+ matches.push(title);
3982
+ }
3555
3983
  }
3556
3984
  return { matches, map };
3557
3985
  }
@@ -3598,6 +4026,308 @@ var Graph = class {
3598
4026
  };
3599
4027
  var graph_default = Graph;
3600
4028
 
4029
+ // src/components/LocaleSelector.tsx
4030
+ init_esm_shims();
4031
+
4032
+ // src/components/Select.tsx
4033
+ init_esm_shims();
4034
+ var SelectObject = forwardRef(function(props, ref) {
4035
+ var _a;
4036
+ const { getLabel, getValue = identity, items, onItemSelect, selectedItem, selectProps = {} } = props;
4037
+ const [itemList, itemMap] = useMemo(() => {
4038
+ const valueAccessor = accesorFactory(getValue);
4039
+ const labelAccessor = getLabel ? accesorFactory(getLabel) : valueAccessor;
4040
+ const list = items.map((item) => ({
4041
+ label: labelAccessor(item),
4042
+ value: valueAccessor(item),
4043
+ item
4044
+ }));
4045
+ return [list, keyBy(list, (option) => option.value)];
4046
+ }, [items, getLabel, getValue]);
4047
+ const selected = useMemo(() => {
4048
+ if (selectedItem == null) return null;
4049
+ if (typeof selectedItem === "string") return selectedItem;
4050
+ const valueAccessor = accesorFactory(getValue);
4051
+ return valueAccessor(selectedItem);
4052
+ }, [selectedItem, getValue]);
4053
+ const itemSelectHandler = (value) => {
4054
+ onItemSelect && onItemSelect(itemMap[value].item);
4055
+ };
4056
+ if (items.length === 0 || !selected) {
4057
+ return null;
4058
+ }
4059
+ return /* @__PURE__ */ React10__default.createElement(
4060
+ Select,
4061
+ {
4062
+ ref,
4063
+ data: itemList,
4064
+ disabled: props.loading || props.disabled,
4065
+ hidden: props.hidden,
4066
+ label: props.label,
4067
+ onChange: itemSelectHandler,
4068
+ onClick: inputFocusHandler,
4069
+ onFocus: inputFocusHandler,
4070
+ searchable: (_a = props.searchable) != null ? _a : props.items.length > 6,
4071
+ value: selected,
4072
+ ...selectProps
4073
+ }
4074
+ );
4075
+ });
4076
+ function inputFocusHandler(event) {
4077
+ if (event.target instanceof HTMLInputElement) event.target.select();
4078
+ }
4079
+ var localeSelectorStyle = (theme) => ({
4080
+ input: {
4081
+ border: "none",
4082
+ background: theme.colorScheme === "dark" ? theme.fn.darken(theme.fn.primaryColor(), 0.1) : theme.fn.lighten(theme.fn.primaryColor(), 0.8),
4083
+ borderRadius: theme.radius.sm,
4084
+ color: theme.colorScheme === "dark" ? theme.fn.lighten(theme.fn.primaryColor(), 0.7) : theme.fn.primaryColor(),
4085
+ fontSize: 12,
4086
+ fontWeight: 700,
4087
+ width: 94,
4088
+ textTransform: "uppercase"
4089
+ },
4090
+ item: {
4091
+ fontSize: 12,
4092
+ textTransform: "uppercase"
4093
+ },
4094
+ rightSection: {
4095
+ pointerEvents: "none"
4096
+ // weird hack, seems like CSSObject is not completely right defined inside mantine.
4097
+ }
4098
+ });
4099
+ function LocaleSelector() {
4100
+ const actions2 = useActions();
4101
+ const { resetGraph } = useSideBar();
4102
+ const { translate: t, locale } = useTranslation();
4103
+ const { code: currentCode } = useSelector$1(selectLocale);
4104
+ const { localeOptions } = useSelector$1(selectServerState);
4105
+ const theme = useMantineTheme();
4106
+ const options = useMemo(() => {
4107
+ const languages = ISO6391.getLanguages(localeOptions);
4108
+ return languages.map((lang) => ({
4109
+ label: t("params.label_localeoption", {
4110
+ code: lang.code,
4111
+ engName: lang.name,
4112
+ nativeName: lang.nativeName,
4113
+ customName: t(`params.label_localecustom_${lang.code}`)
4114
+ }) || lang.nativeName,
4115
+ value: lang.code
4116
+ }));
4117
+ }, [locale, localeOptions]);
4118
+ const localeChangeHandler = (l) => {
4119
+ if (currentCode !== l.value) {
4120
+ resetGraph();
4121
+ actions2.updateLocale(l.value);
4122
+ actions2.willRequestQuery();
4123
+ }
4124
+ };
4125
+ if (localeOptions.length < 2) {
4126
+ return null;
4127
+ }
4128
+ return /* @__PURE__ */ React10__default.createElement(Box, { id: "select-locale" }, /* @__PURE__ */ React10__default.createElement(Tooltip, { label: t("params.label_locale") }, /* @__PURE__ */ React10__default.createElement(
4129
+ SelectObject,
4130
+ {
4131
+ getLabel: "value",
4132
+ getValue: "value",
4133
+ items: options,
4134
+ onItemSelect: localeChangeHandler,
4135
+ selectedItem: currentCode,
4136
+ selectProps: {
4137
+ styles: localeSelectorStyle,
4138
+ icon: /* @__PURE__ */ React10__default.createElement(IconLanguage, { size: "0.8rem", color: theme.colorScheme === "dark" ? theme.fn.lighten(theme.fn.primaryColor(), 0.8) : theme.fn.primaryColor() })
4139
+ }
4140
+ }
4141
+ )));
4142
+ }
4143
+ var [useSideBar, Provider] = createContext2("SideBar");
4144
+ function SideBarProvider(props) {
4145
+ const [input, setInput] = useState("");
4146
+ const [expanded, setExpanded] = useState(false);
4147
+ const [results, setResults] = useState([]);
4148
+ const [map, setMap] = useState();
4149
+ const [graph, setGraph] = useState(new graph_default());
4150
+ const resetGraph = () => setGraph(new graph_default());
4151
+ return /* @__PURE__ */ React10__default.createElement(
4152
+ Provider,
4153
+ {
4154
+ ...props,
4155
+ value: {
4156
+ expanded,
4157
+ setExpanded,
4158
+ graph,
4159
+ setGraph,
4160
+ results,
4161
+ setResults,
4162
+ input,
4163
+ map,
4164
+ setMap,
4165
+ setInput,
4166
+ resetGraph
4167
+ }
4168
+ }
4169
+ );
4170
+ }
4171
+ function SideBar(props) {
4172
+ const { expanded, setExpanded } = useSideBar();
4173
+ const { translate: t } = useTranslation();
4174
+ return /* @__PURE__ */ React10__default.createElement(
4175
+ Box,
4176
+ {
4177
+ id: "dex-sidebar",
4178
+ py: "md",
4179
+ sx: (t2) => ({
4180
+ height: "calc(100vh - 75px)",
4181
+ backgroundColor: t2.colorScheme === "dark" ? t2.colors.dark[8] : t2.colors.gray[1],
4182
+ boxShadow: "0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)",
4183
+ maxWidth: expanded ? 300 : 54,
4184
+ padding: 0,
4185
+ zIndex: 99,
4186
+ [t2.fn.smallerThan("md")]: {
4187
+ position: "absolute",
4188
+ width: expanded ? 300 : 54,
4189
+ height: expanded ? "calc(100vh - 75px)" : 54,
4190
+ bottom: expanded ? "unset" : t2.spacing.md,
4191
+ left: expanded ? "unset" : t2.spacing.md,
4192
+ overflow: "hidden",
4193
+ paddingTop: expanded ? t2.spacing.md : 0,
4194
+ paddingBottom: expanded ? t2.spacing.md : 0,
4195
+ borderRadius: expanded ? 0 : "100%"
4196
+ }
4197
+ })
4198
+ },
4199
+ /* @__PURE__ */ React10__default.createElement(Flex, { h: "100%", direction: "column", justify: "flex-start" }, /* @__PURE__ */ React10__default.createElement(Box, { px: "sm", my: "sm" }, /* @__PURE__ */ React10__default.createElement(Flex, { direction: "column", sx: { flex: 1 } }, /* @__PURE__ */ React10__default.createElement(Flex, { align: "center", justify: "apart" }, /* @__PURE__ */ React10__default.createElement(
4200
+ ActionIcon,
4201
+ {
4202
+ onClick: () => setExpanded(!expanded),
4203
+ variant: "subtle",
4204
+ sx: (t2) => ({
4205
+ alignSelf: "center",
4206
+ color: t2.colorScheme === "dark" ? t2.white : t2.colors.gray[7]
4207
+ })
4208
+ },
4209
+ /* @__PURE__ */ React10__default.createElement(DataSetSVG, null)
4210
+ ), /* @__PURE__ */ React10__default.createElement(
4211
+ Group,
4212
+ {
4213
+ position: "apart",
4214
+ noWrap: true,
4215
+ sx: {
4216
+ overflow: "hidden",
4217
+ whiteSpace: "nowrap",
4218
+ transition: "width 0.2s cubic-bezier(0.4, 0, 0.2, 1), margin-left 0.2s cubic-bezier(0.4, 0, 0.2, 1)",
4219
+ width: expanded ? 300 : 0
4220
+ }
4221
+ },
4222
+ /* @__PURE__ */ React10__default.createElement(Text, { sx: (t2) => ({ color: t2.colorScheme === "dark" ? t2.white : t2.black }), ml: "sm" }, t("params.label_dataset")),
4223
+ /* @__PURE__ */ React10__default.createElement(LocaleSelector, null)
4224
+ )), /* @__PURE__ */ React10__default.createElement(
4225
+ Box,
4226
+ {
4227
+ my: "md",
4228
+ sx: {
4229
+ overflow: "hidden",
4230
+ whiteSpace: "nowrap",
4231
+ transition: "width 0.2s cubic-bezier(0.4, 0, 0.2, 1), margin-left 0.2s cubic-bezier(0.4, 0, 0.2, 1)",
4232
+ width: expanded ? "100%" : 0
4233
+ }
4234
+ },
4235
+ /* @__PURE__ */ React10__default.createElement(Auto, null)
4236
+ ), /* @__PURE__ */ React10__default.createElement(Box, { sx: { flexGrow: 1 } }))), /* @__PURE__ */ React10__default.createElement(
4237
+ ScrollArea,
4238
+ {
4239
+ sx: (theme) => ({
4240
+ borderTopColor: theme.colorScheme === "dark" ? theme.colors.dark[6] : theme.colors.gray[3],
4241
+ borderTopWidth: "1px",
4242
+ borderTopStyle: expanded ? "solid" : "none"
4243
+ })
4244
+ },
4245
+ /* @__PURE__ */ React10__default.createElement(Box, { h: expanded ? "auto" : "0px" }, props.children)
4246
+ ), /* @__PURE__ */ React10__default.createElement(
4247
+ Group,
4248
+ {
4249
+ align: "center",
4250
+ position: expanded ? "right" : "center",
4251
+ w: "100%",
4252
+ p: "md",
4253
+ sx: { alignSelf: "flex-end", marginTop: "auto" },
4254
+ noWrap: true
4255
+ },
4256
+ /* @__PURE__ */ React10__default.createElement(
4257
+ ActionIcon,
4258
+ {
4259
+ onClick: () => setExpanded(!expanded),
4260
+ variant: "subtle",
4261
+ mt: "auto",
4262
+ sx: (t2) => ({ alignSelf: "flex-end", color: t2.colors.gray[7] })
4263
+ },
4264
+ expanded ? /* @__PURE__ */ React10__default.createElement(IconChevronLeft, null) : /* @__PURE__ */ React10__default.createElement(IconChevronRight, null)
4265
+ )
4266
+ ))
4267
+ );
4268
+ }
4269
+ var SideBar_default = SideBar;
4270
+ function SideBarItem({ children }) {
4271
+ const { expanded } = useSideBar();
4272
+ return /* @__PURE__ */ React10__default.createElement(
4273
+ Box,
4274
+ {
4275
+ sx: {
4276
+ overflow: "hidden",
4277
+ whiteSpace: "nowrap",
4278
+ width: expanded ? 300 : 0,
4279
+ transition: "width 0.2s cubic-bezier(0.4, 0, 0.2, 1)"
4280
+ }
4281
+ },
4282
+ children
4283
+ );
4284
+ }
4285
+ function Auto() {
4286
+ const { code: locale } = useSelector$1(selectLocale);
4287
+ const { translate: t } = useTranslation();
4288
+ const { expanded, graph, setResults, input, setInput, setMap } = useSideBar();
4289
+ const [debouncedInput] = useDebouncedValue(input, 200);
4290
+ useEffect(() => {
4291
+ if (graph.items.length > 0) {
4292
+ const { matches, map } = graph.filter(locale, debouncedInput);
4293
+ setResults(matches);
4294
+ setMap(map);
4295
+ }
4296
+ }, [debouncedInput, graph]);
4297
+ return /* @__PURE__ */ React10__default.createElement(
4298
+ Input,
4299
+ {
4300
+ icon: /* @__PURE__ */ React10__default.createElement(IconSearch, null),
4301
+ radius: "xl",
4302
+ size: "md",
4303
+ placeholder: t("params.label_search"),
4304
+ value: input,
4305
+ onInput: (e) => setInput(e.currentTarget.value),
4306
+ styles: {
4307
+ wrapper: {
4308
+ width: expanded ? "100%" : 0,
4309
+ overflow: "hidden",
4310
+ transition: "width 0.2s cubic-bezier(0.4, 0, 0.2, 1), margin-left 0.2s cubic-bezier(0.4, 0, 0.2, 1)"
4311
+ },
4312
+ input: {
4313
+ whiteSpace: "nowrap"
4314
+ }
4315
+ },
4316
+ rightSection: /* @__PURE__ */ React10__default.createElement(
4317
+ CloseButton,
4318
+ {
4319
+ "aria-label": "Clear input",
4320
+ onClick: () => setInput(""),
4321
+ style: { display: input ? void 0 : "none" }
4322
+ }
4323
+ )
4324
+ }
4325
+ );
4326
+ }
4327
+
4328
+ // src/components/ParamsExplorer.tsx
4329
+ init_esm_shims();
4330
+
3601
4331
  // src/components/SelectCubes.tsx
3602
4332
  init_esm_shims();
3603
4333
 
@@ -3611,25 +4341,28 @@ function Results(props) {
3611
4341
  if (map) {
3612
4342
  for (let [key, items] of map) {
3613
4343
  const [topic, subtopic] = key.split(" - ");
3614
- const component = /* @__PURE__ */ React13__default.createElement("div", { key }, /* @__PURE__ */ React13__default.createElement(Divider, { my: "xs", label: key }), items.map((item) => /* @__PURE__ */ React13__default.createElement(
3615
- Text,
3616
- {
3617
- key: item,
3618
- component: "a",
3619
- fz: "sm",
3620
- className: isSelected2(selectedItem, getCube2(graph.items, item, subtopic, locale)) ? `${classes.link} ${classes.linkActive}` : classes.link,
3621
- onClick: () => {
3622
- onSelectCube(item, subtopic);
3623
- setExpanded(false);
3624
- setInput("");
3625
- }
3626
- },
3627
- item
3628
- )));
4344
+ const component = /* @__PURE__ */ React10__default.createElement("div", { key }, /* @__PURE__ */ React10__default.createElement(Divider, { my: "xs", label: key }), items.map((item) => {
4345
+ const cube = getCube2(graph.items, item, subtopic, locale);
4346
+ return /* @__PURE__ */ React10__default.createElement(
4347
+ Text,
4348
+ {
4349
+ key: cube.name,
4350
+ component: "a",
4351
+ fz: "xs",
4352
+ className: isSelected2(selectedItem, cube) ? `${classes.link} ${classes.linkActive}` : classes.link,
4353
+ onClick: () => {
4354
+ onSelectCube(item, subtopic);
4355
+ setExpanded(false);
4356
+ setInput("");
4357
+ }
4358
+ },
4359
+ item
4360
+ );
4361
+ }));
3629
4362
  result.push(component);
3630
4363
  }
3631
4364
  }
3632
- return result;
4365
+ return /* @__PURE__ */ React10__default.createElement(Box, { px: "sm" }, result);
3633
4366
  }
3634
4367
  var useStyles3 = createStyles((theme) => ({
3635
4368
  link: {
@@ -3661,20 +4394,25 @@ function SelectCube() {
3661
4394
  if (items.length === 1) {
3662
4395
  return null;
3663
4396
  }
3664
- return /* @__PURE__ */ React13__default.createElement(SelectCubeInternal, { items, selectedItem });
4397
+ return /* @__PURE__ */ React10__default.createElement(SelectCubeInternal, { items, selectedItem });
3665
4398
  }
3666
4399
  function SelectCubeInternal(props) {
3667
4400
  const { items, selectedItem } = props;
3668
4401
  useTranslation();
3669
4402
  const { code: locale } = useSelector$1(selectLocale);
3670
- const { willRequestQuery: willRequestQuery2, updateMeasure, updateDrilldown, willFetchMembers: willFetchMembers2 } = useActions();
3671
- const initRef = useRef(false);
4403
+ const { updateMeasure, updateDrilldown, willFetchMembers: willFetchMembers2, updateCut } = useActions();
3672
4404
  const cube = useSelector$1(selectCubeName);
3673
4405
  const itemMap = useSelector$1(selectMeasureMap);
3674
4406
  const dimensions = useSelector$1(selectOlapDimensionItems);
4407
+ const createCutHandler2 = React10__default.useCallback((level) => {
4408
+ const cutItem = buildCut({ ...level });
4409
+ cutItem.active = false;
4410
+ updateCut(cutItem);
4411
+ }, []);
3675
4412
  const addDrilldown = useCallback(
3676
4413
  (level) => {
3677
- const drilldownItem = buildDrilldown({ ...level, key: level.fullName });
4414
+ const drilldownItem = buildDrilldown(level);
4415
+ createCutHandler2(level);
3678
4416
  updateDrilldown(drilldownItem);
3679
4417
  return willFetchMembers2({ ...level, level: level.name }).then((members) => {
3680
4418
  const dimension = dimensions.find((dim) => dim.name === level.dimension);
@@ -3693,35 +4431,24 @@ function SelectCubeInternal(props) {
3693
4431
  const params = new URLSearchParams(location.search);
3694
4432
  const cubeParam = params.get("cube");
3695
4433
  if (selectedItem && cube && !cubeParam) {
3696
- initRef.current = true;
3697
- const measure = Object.keys(itemMap).map((k) => itemMap[k]).shift();
3698
- const dimension = [...dimensions].shift();
4434
+ const [measure] = Object.values(itemMap);
4435
+ const [dimension] = dimensions;
3699
4436
  if (measure && dimension) {
3700
4437
  updateMeasure({ ...measure, active: true });
3701
- addDrilldown(dimension.hierarchies[0].levels[0]).then(() => {
3702
- willRequestQuery2();
3703
- });
3704
- }
3705
- }
3706
- if (selectedItem && cube && cubeParam) {
3707
- if (!initRef.current) {
3708
- initRef.current = true;
3709
- } else {
3710
- const measure = Object.keys(itemMap).map((k) => itemMap[k]).shift();
3711
- const dimension = [...dimensions].shift();
3712
- if (measure && dimension) {
4438
+ const drilldowns = deriveDrilldowns(dimensions);
4439
+ if (measure && drilldowns.length > 0) {
3713
4440
  updateMeasure({ ...measure, active: true });
3714
- addDrilldown(dimension.hierarchies[0].levels[0]).then(() => {
3715
- willRequestQuery2();
3716
- });
4441
+ for (const level of drilldowns) {
4442
+ addDrilldown(level, dimensions);
4443
+ }
3717
4444
  }
3718
4445
  }
3719
4446
  }
3720
4447
  }, [selectedItem, cube]);
3721
- return /* @__PURE__ */ React13__default.createElement(Stack, { id: "select-cube", spacing: "xs", w: "100%" }, /* @__PURE__ */ React13__default.createElement(CubeTree, { items, locale, selectedItem }));
4448
+ return /* @__PURE__ */ React10__default.createElement(Stack, { id: "select-cube", spacing: "xs", w: "100%" }, /* @__PURE__ */ React10__default.createElement(CubeTree, { items, locale, selectedItem }));
3722
4449
  }
3723
4450
  function AccordionControl(props) {
3724
- return /* @__PURE__ */ React13__default.createElement(Box, { sx: { display: "flex", alignItems: "center" } }, /* @__PURE__ */ React13__default.createElement(Accordion.Control, { ...props }));
4451
+ return /* @__PURE__ */ React10__default.createElement(Box, { sx: { display: "flex", alignItems: "center" } }, /* @__PURE__ */ React10__default.createElement(Accordion.Control, { ...props }));
3725
4452
  }
3726
4453
  function getKeys2(items, k, locale, filter) {
3727
4454
  let cubes = items;
@@ -3773,7 +4500,8 @@ function CubeTree({
3773
4500
  locale,
3774
4501
  selectedItem
3775
4502
  }) {
3776
- const { graph, setGraph, map } = useSideBar();
4503
+ const { graph, setGraph, map, input } = useSideBar();
4504
+ const { translate: t } = useTranslation();
3777
4505
  useBuildGraph(items, locale, graph, setGraph);
3778
4506
  const actions2 = useActions();
3779
4507
  const onSelectCube = (table, subtopic) => {
@@ -3781,11 +4509,14 @@ function CubeTree({
3781
4509
  (item) => getAnnotation(item, "table", locale) === table && getAnnotation(item, "subtopic", locale) === subtopic
3782
4510
  );
3783
4511
  if (cube) {
3784
- actions2.willSetCube(cube.name);
4512
+ return actions2.willSetCube(cube.name);
3785
4513
  }
3786
4514
  };
3787
4515
  const topics = useMemo(() => getKeys2(items, "topic", locale), [items, locale]);
3788
- return map && map.size > 0 ? /* @__PURE__ */ React13__default.createElement(
4516
+ if (input.length > 0 && map && !(map.size > 0)) {
4517
+ return /* @__PURE__ */ React10__default.createElement(Text, { ta: "center", fz: "xs", my: "sm", italic: true }, t("params.label_no_results"));
4518
+ }
4519
+ return map && map.size > 0 ? /* @__PURE__ */ React10__default.createElement(
3789
4520
  Results_default,
3790
4521
  {
3791
4522
  onSelectCube,
@@ -3795,7 +4526,7 @@ function CubeTree({
3795
4526
  graph,
3796
4527
  locale
3797
4528
  }
3798
- ) : graph.items.length > 0 && /* @__PURE__ */ React13__default.createElement(
4529
+ ) : graph.items.length > 0 && /* @__PURE__ */ React10__default.createElement(
3799
4530
  RootAccordions,
3800
4531
  {
3801
4532
  items: topics,
@@ -3819,7 +4550,7 @@ function useAccordionValue(key, locale) {
3819
4550
  }
3820
4551
  function RootAccordions({ items, graph, locale, selectedItem, onSelectCube }) {
3821
4552
  const { value, setValue } = useAccordionValue("topic", locale);
3822
- return /* @__PURE__ */ React13__default.createElement(
4553
+ return /* @__PURE__ */ React10__default.createElement(
3823
4554
  Accordion,
3824
4555
  {
3825
4556
  value,
@@ -3830,11 +4561,12 @@ function RootAccordions({ items, graph, locale, selectedItem, onSelectCube }) {
3830
4561
  styles: (t) => ({
3831
4562
  control: {
3832
4563
  background: t.colorScheme === "dark" ? t.colors.dark[7] : t.colors.gray[1],
3833
- borderLeft: 8,
4564
+ borderLeft: 6,
3834
4565
  borderLeftColor: "transparent",
3835
4566
  borderLeftStyle: "solid",
4567
+ fontSize: t.fontSizes.md,
3836
4568
  "&[data-active]": {
3837
- borderLeft: 8,
4569
+ borderLeft: 6,
3838
4570
  borderLeftColor: t.colors[t.primaryColor][t.fn.primaryShade()],
3839
4571
  borderLeftStyle: "solid",
3840
4572
  color: t.colors[t.primaryColor][t.fn.primaryShade()]
@@ -3849,7 +4581,7 @@ function RootAccordions({ items, graph, locale, selectedItem, onSelectCube }) {
3849
4581
  })
3850
4582
  },
3851
4583
  items.map((item) => {
3852
- return /* @__PURE__ */ React13__default.createElement(Accordion.Item, { value: `topic-${item}`, key: `topic-${item}` }, /* @__PURE__ */ React13__default.createElement(AccordionControl, null, item), /* @__PURE__ */ React13__default.createElement(Accordion.Panel, null, /* @__PURE__ */ React13__default.createElement(
4584
+ return /* @__PURE__ */ React10__default.createElement(Accordion.Item, { value: `topic-${item}`, key: `topic-${item}` }, /* @__PURE__ */ React10__default.createElement(AccordionControl, null, item), /* @__PURE__ */ React10__default.createElement(Accordion.Panel, null, /* @__PURE__ */ React10__default.createElement(
3853
4585
  SubtopicAccordion,
3854
4586
  {
3855
4587
  graph,
@@ -3872,29 +4604,55 @@ function CubeButton({
3872
4604
  locale,
3873
4605
  parent
3874
4606
  }) {
3875
- const { setExpanded } = useSideBar();
4607
+ const { updateMeasure, updateCut, updateDrilldown, willFetchMembers: willFetchMembers2 } = useActions();
3876
4608
  const { classes } = useStyles3();
4609
+ const createCutHandler2 = React10__default.useCallback((level) => {
4610
+ const cutItem = buildCut({ ...level });
4611
+ cutItem.active = false;
4612
+ updateCut(cutItem);
4613
+ }, []);
4614
+ const addDrilldown = useCallback((level, dimensions) => {
4615
+ const drilldownItem = buildDrilldown(level);
4616
+ createCutHandler2(level);
4617
+ updateDrilldown(drilldownItem);
4618
+ return willFetchMembers2({ ...level, level: level.name }).then((members) => {
4619
+ const dimension = dimensions.find((dim) => dim.name === level.dimension);
4620
+ if (!dimension) return;
4621
+ return updateDrilldown({
4622
+ ...drilldownItem,
4623
+ dimType: dimension.dimensionType,
4624
+ memberCount: members.length,
4625
+ members
4626
+ });
4627
+ });
4628
+ }, []);
3877
4629
  const table = item;
3878
4630
  const subtopic = parent != null ? parent : "";
3879
- return /* @__PURE__ */ React13__default.createElement(
4631
+ return /* @__PURE__ */ React10__default.createElement(
3880
4632
  Text,
3881
4633
  {
3882
4634
  key: `table-${item}`,
3883
- fz: "sm",
4635
+ fz: "xs",
3884
4636
  pl: 60,
3885
- maw: 240,
4637
+ maw: "100%",
3886
4638
  pr: "md",
3887
4639
  component: "a",
3888
4640
  className: isSelected(selectedItem, getCube(graph.items, table, subtopic, locale)) ? `${classes.link} ${classes.linkActive}` : classes.link,
3889
4641
  sx: (t) => ({
3890
4642
  background: isSelected(selectedItem, getCube(graph.items, table, subtopic, locale)) ? t.fn.primaryColor() : t.colorScheme === "dark" ? t.colors.dark[6] : t.colors.gray[3],
3891
- whiteSpace: "nowrap",
3892
- overflow: "hidden",
3893
- textOverflow: "ellipsis"
4643
+ overflow: "hidden"
3894
4644
  }),
3895
4645
  onClick: () => {
3896
- onSelectCube(item, subtopic);
3897
- setExpanded(false);
4646
+ onSelectCube(item, subtopic).then(({ cube, measures, dimensions }) => {
4647
+ const [measure] = Object.values(measures);
4648
+ const drilldowns = deriveDrilldowns(dimensions);
4649
+ if (measure && drilldowns.length > 0) {
4650
+ updateMeasure({ ...measure, active: true });
4651
+ for (const level of drilldowns) {
4652
+ addDrilldown(level, dimensions);
4653
+ }
4654
+ }
4655
+ });
3898
4656
  }
3899
4657
  },
3900
4658
  item
@@ -3909,7 +4667,7 @@ function SubtopicAccordion({
3909
4667
  locale
3910
4668
  }) {
3911
4669
  const { value, setValue } = useAccordionValue("subtopic", locale);
3912
- return /* @__PURE__ */ React13__default.createElement(
4670
+ return /* @__PURE__ */ React10__default.createElement(
3913
4671
  Accordion,
3914
4672
  {
3915
4673
  value,
@@ -3920,15 +4678,13 @@ function SubtopicAccordion({
3920
4678
  ml: 0,
3921
4679
  styles: (t) => ({
3922
4680
  control: {
3923
- fontSize: 14,
4681
+ fontSize: t.fontSizes.sm,
3924
4682
  background: t.colorScheme === "dark" ? t.colors.dark[7] : t.colors.gray[2],
3925
4683
  borderLeft: 8,
3926
4684
  borderLeftColor: "transparent",
3927
4685
  borderLeftStyle: "solid",
3928
- "&[data-active]": {
3929
- borderLeft: 8,
3930
- borderLeftColor: t.colors[t.primaryColor][4],
3931
- borderLeftStyle: "solid"
4686
+ "&[data-active] span": {
4687
+ color: t.fn.primaryColor()
3932
4688
  }
3933
4689
  },
3934
4690
  content: {
@@ -3938,7 +4694,7 @@ function SubtopicAccordion({
3938
4694
  },
3939
4695
  [...items].map((item, index) => {
3940
4696
  const filtered = [...graph.adjList[item]].filter((value2) => value2 !== parent);
3941
- return /* @__PURE__ */ React13__default.createElement(Accordion.Item, { value: `subtopic-${item}`, key: `subtopic-${item}-${index}` }, /* @__PURE__ */ React13__default.createElement(AccordionControl, null, item), /* @__PURE__ */ React13__default.createElement(Accordion.Panel, null, filtered.map((table, index2) => /* @__PURE__ */ React13__default.createElement(
4697
+ return /* @__PURE__ */ React10__default.createElement(Accordion.Item, { value: `subtopic-${item}`, key: `subtopic-${item}-${index}` }, /* @__PURE__ */ React10__default.createElement(AccordionControl, null, item), /* @__PURE__ */ React10__default.createElement(Accordion.Panel, null, filtered.map((table, index2) => /* @__PURE__ */ React10__default.createElement(
3942
4698
  CubeButton,
3943
4699
  {
3944
4700
  key: index2,
@@ -3954,281 +4710,19 @@ function SubtopicAccordion({
3954
4710
  );
3955
4711
  }
3956
4712
 
3957
- // src/components/LocaleSelector.tsx
3958
- init_esm_shims();
3959
-
3960
- // src/components/Select.tsx
3961
- init_esm_shims();
3962
- var SelectObject = forwardRef(function(props, ref) {
3963
- var _a;
3964
- const { getLabel, getValue = identity, items, onItemSelect, selectedItem, selectProps = {} } = props;
3965
- const [itemList, itemMap] = useMemo(() => {
3966
- const valueAccessor = accesorFactory(getValue);
3967
- const labelAccessor = getLabel ? accesorFactory(getLabel) : valueAccessor;
3968
- const list = items.map((item) => ({
3969
- label: labelAccessor(item),
3970
- value: valueAccessor(item),
3971
- item
3972
- }));
3973
- return [list, keyBy(list, (option) => option.value)];
3974
- }, [items, getLabel, getValue]);
3975
- const selected = useMemo(() => {
3976
- if (selectedItem == null) return null;
3977
- if (typeof selectedItem === "string") return selectedItem;
3978
- const valueAccessor = accesorFactory(getValue);
3979
- return valueAccessor(selectedItem);
3980
- }, [selectedItem, getValue]);
3981
- const itemSelectHandler = (value) => {
3982
- onItemSelect && onItemSelect(itemMap[value].item);
3983
- };
3984
- if (items.length === 0 || !selected) {
3985
- return null;
3986
- }
3987
- return /* @__PURE__ */ React13__default.createElement(
3988
- Select,
3989
- {
3990
- ref,
3991
- data: itemList,
3992
- disabled: props.loading || props.disabled,
3993
- hidden: props.hidden,
3994
- label: props.label,
3995
- onChange: itemSelectHandler,
3996
- onClick: inputFocusHandler,
3997
- onFocus: inputFocusHandler,
3998
- searchable: (_a = props.searchable) != null ? _a : props.items.length > 6,
3999
- value: selected,
4000
- ...selectProps
4001
- }
4002
- );
4003
- });
4004
- function inputFocusHandler(event) {
4005
- if (event.target instanceof HTMLInputElement) event.target.select();
4006
- }
4007
- var localeSelectorStyle = (theme) => ({
4008
- input: {
4009
- border: "none",
4010
- background: theme.colorScheme === "dark" ? theme.fn.darken(theme.fn.primaryColor(), 0.1) : theme.fn.lighten(theme.fn.primaryColor(), 0.8),
4011
- borderRadius: theme.radius.sm,
4012
- color: theme.colorScheme === "dark" ? theme.fn.lighten(theme.fn.primaryColor(), 0.7) : theme.fn.primaryColor(),
4013
- fontSize: 12,
4014
- fontWeight: 700,
4015
- width: 94,
4016
- textTransform: "uppercase"
4017
- },
4018
- item: {
4019
- fontSize: 12,
4020
- textTransform: "uppercase"
4021
- },
4022
- rightSection: {
4023
- pointerEvents: "none"
4024
- // weird hack, seems like CSSObject is not completely right defined inside mantine.
4025
- }
4026
- });
4027
- function LocaleSelector() {
4028
- const actions2 = useActions();
4029
- const { resetGraph } = useSideBar();
4030
- const { translate: t, locale } = useTranslation();
4031
- const { code: currentCode } = useSelector$1(selectLocale);
4032
- const { localeOptions } = useSelector$1(selectServerState);
4033
- const theme = useMantineTheme();
4034
- const options = useMemo(() => {
4035
- const languages = ISO6391.getLanguages(localeOptions);
4036
- return languages.map((lang) => ({
4037
- label: t("params.label_localeoption", {
4038
- code: lang.code,
4039
- engName: lang.name,
4040
- nativeName: lang.nativeName,
4041
- customName: t(`params.label_localecustom_${lang.code}`)
4042
- }) || lang.nativeName,
4043
- value: lang.code
4044
- }));
4045
- }, [locale, localeOptions]);
4046
- const localeChangeHandler = (l) => {
4047
- if (currentCode !== l.value) {
4048
- resetGraph();
4049
- actions2.updateLocale(l.value);
4050
- }
4051
- };
4052
- if (localeOptions.length < 2) {
4053
- return null;
4054
- }
4055
- return /* @__PURE__ */ React13__default.createElement(Box, { id: "select-locale" }, /* @__PURE__ */ React13__default.createElement(Tooltip, { label: t("params.label_locale") }, /* @__PURE__ */ React13__default.createElement(
4056
- SelectObject,
4057
- {
4058
- getLabel: "value",
4059
- getValue: "value",
4060
- items: options,
4061
- onItemSelect: localeChangeHandler,
4062
- selectedItem: currentCode,
4063
- selectProps: {
4064
- styles: localeSelectorStyle,
4065
- icon: /* @__PURE__ */ React13__default.createElement(IconLanguage, { size: "0.8rem", color: theme.colorScheme === "dark" ? theme.fn.lighten(theme.fn.primaryColor(), 0.8) : theme.fn.primaryColor() })
4066
- }
4067
- }
4068
- )));
4069
- }
4070
-
4071
- // src/components/SideBar.tsx
4072
- var [useSideBar, Provider] = createContext2("SideBar");
4073
- function SideBarProvider(props) {
4074
- const [input, setInput] = useState("");
4075
- const [expanded, setExpanded] = useState(false);
4076
- const [results, setResults] = useState([]);
4077
- const [map, setMap] = useState();
4078
- const [graph, setGraph] = useState(new graph_default());
4079
- const resetGraph = () => {
4080
- setGraph(new graph_default());
4081
- };
4082
- return /* @__PURE__ */ React13__default.createElement(
4083
- Provider,
4084
- {
4085
- ...props,
4086
- value: {
4087
- expanded,
4088
- setExpanded,
4089
- graph,
4090
- setGraph,
4091
- results,
4092
- setResults,
4093
- input,
4094
- map,
4095
- setMap,
4096
- setInput,
4097
- resetGraph
4098
- }
4099
- }
4100
- );
4101
- }
4102
- function SideBar(props) {
4103
- const { expanded, setExpanded } = useSideBar();
4104
- return /* @__PURE__ */ React13__default.createElement(
4105
- Box,
4106
- {
4107
- py: "md",
4108
- sx: (t) => ({
4109
- height: "calc(100vh - 75px)",
4110
- backgroundColor: t.colorScheme === "dark" ? t.colors.dark[8] : t.colors.gray[2],
4111
- boxShadow: "0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)",
4112
- maxWidth: 300,
4113
- padding: 0
4114
- })
4115
- },
4116
- /* @__PURE__ */ React13__default.createElement(Flex, { h: "100%", direction: "column", justify: "flex-start" }, /* @__PURE__ */ React13__default.createElement(Box, { px: "sm" }, /* @__PURE__ */ React13__default.createElement(Flex, { direction: "column", sx: { flex: 1 } }, /* @__PURE__ */ React13__default.createElement(Flex, { align: "center", justify: "center" }, /* @__PURE__ */ React13__default.createElement(
4117
- ActionIcon,
4118
- {
4119
- onClick: () => setExpanded(!expanded),
4120
- variant: "subtle",
4121
- sx: (t) => ({ alignSelf: "center", color: t.colorScheme === "dark" ? t.white : t.colors.gray[7] })
4122
- },
4123
- /* @__PURE__ */ React13__default.createElement(DataSetSVG, null)
4124
- ), /* @__PURE__ */ React13__default.createElement(
4125
- Group,
4126
- {
4127
- position: "apart",
4128
- noWrap: true,
4129
- sx: {
4130
- overflow: "hidden",
4131
- whiteSpace: "nowrap",
4132
- transition: "width 0.2s cubic-bezier(0.4, 0, 0.2, 1), margin-left 0.2s cubic-bezier(0.4, 0, 0.2, 1)",
4133
- width: expanded ? 300 : 0
4134
- }
4135
- },
4136
- /* @__PURE__ */ React13__default.createElement(Text, { sx: (t) => ({ color: t.colorScheme === "dark" ? t.white : t.black }), ml: "sm" }, "Select Dataset"),
4137
- /* @__PURE__ */ React13__default.createElement(LocaleSelector, null)
4138
- )), /* @__PURE__ */ React13__default.createElement(Box, { my: "md" }, /* @__PURE__ */ React13__default.createElement(Auto, null)), /* @__PURE__ */ React13__default.createElement(Box, { sx: { flexGrow: 1 } }))), /* @__PURE__ */ React13__default.createElement(ScrollArea, { sx: (theme) => ({
4139
- borderTopColor: theme.colorScheme === "dark" ? theme.colors.dark[6] : theme.colors.gray[3],
4140
- borderTopWidth: "1px",
4141
- borderTopStyle: expanded ? "solid" : "none"
4142
- }) }, /* @__PURE__ */ React13__default.createElement(Box, { h: expanded ? "auto" : "0px" }, props.children)), /* @__PURE__ */ React13__default.createElement(
4143
- Group,
4144
- {
4145
- align: "center",
4146
- position: expanded ? "right" : "center",
4147
- w: "100%",
4148
- p: "md",
4149
- sx: { alignSelf: "flex-end", marginTop: "auto" },
4150
- noWrap: true
4151
- },
4152
- /* @__PURE__ */ React13__default.createElement(
4153
- ActionIcon,
4154
- {
4155
- onClick: () => setExpanded(!expanded),
4156
- variant: "subtle",
4157
- mt: "auto",
4158
- sx: (t) => ({ alignSelf: "flex-end", color: t.colors.gray[7] })
4159
- },
4160
- expanded ? /* @__PURE__ */ React13__default.createElement(IconChevronLeft, null) : /* @__PURE__ */ React13__default.createElement(IconChevronRight, null)
4161
- )
4162
- ))
4163
- );
4164
- }
4165
- var SideBar_default = SideBar;
4166
- function SideBarItem({ children }) {
4167
- const { expanded } = useSideBar();
4168
- return /* @__PURE__ */ React13__default.createElement(
4169
- Box,
4170
- {
4171
- sx: {
4172
- overflow: "hidden",
4173
- whiteSpace: "nowrap",
4174
- width: expanded ? 300 : 0,
4175
- transition: "width 0.2s cubic-bezier(0.4, 0, 0.2, 1)"
4176
- }
4177
- },
4178
- children
4179
- );
4180
- }
4181
- function Auto() {
4182
- const { code: locale } = useSelector$1(selectLocale);
4183
- const { expanded, graph, setResults, input, setInput, setMap } = useSideBar();
4184
- const items = graph.items;
4185
- const roots = useMemo(() => getKeys2(items, "topic", locale), [items]);
4186
- useEffect(() => {
4187
- if (graph.items.length > 0) {
4188
- let matches = [];
4189
- let maps = /* @__PURE__ */ new Map();
4190
- roots.forEach((root) => {
4191
- const { matches: result, map } = graph.filter(locale, root, input);
4192
- matches = [...matches, ...result];
4193
- maps = new Map([...maps, ...map]);
4194
- });
4195
- setResults(matches);
4196
- setMap(maps);
4197
- }
4198
- }, [input, graph]);
4199
- return /* @__PURE__ */ React13__default.createElement(Box, null, /* @__PURE__ */ React13__default.createElement(
4200
- Input,
4201
- {
4202
- icon: /* @__PURE__ */ React13__default.createElement(IconSearch, null),
4203
- radius: "xl",
4204
- size: "md",
4205
- placeholder: "Search",
4206
- value: input,
4207
- onInput: (e) => setInput(e.currentTarget.value),
4208
- styles: {
4209
- wrapper: {
4210
- whiteSpace: "nowrap",
4211
- width: expanded ? "100%" : 0,
4212
- overflow: "hidden",
4213
- animation: "width 0.2s cubic-bezier(0.4, 0, 0.2, 1)"
4214
- },
4215
- input: {
4216
- whiteSpace: "nowrap",
4217
- width: expanded ? "100%" : 0,
4218
- overflow: "hidden"
4219
- }
4220
- }
4221
- }
4222
- ));
4223
- }
4224
-
4225
4713
  // src/components/ParamsExplorer.tsx
4226
- init_esm_shims();
4227
4714
  function ParamsExplorer(props) {
4228
- return /* @__PURE__ */ React13__default.createElement(SelectCube, null);
4715
+ return /* @__PURE__ */ React10__default.createElement(SelectCube, null);
4229
4716
  }
4230
4717
  var ParamsExplorer_default = ParamsExplorer;
4231
4718
 
4719
+ // src/context/index.tsx
4720
+ init_esm_shims();
4721
+ var queryClient = new QueryClient();
4722
+ function AppProviders({ children }) {
4723
+ return /* @__PURE__ */ React10.createElement(QueryClientProvider, { client: queryClient }, children);
4724
+ }
4725
+
4232
4726
  // src/components/ExplorerContent.tsx
4233
4727
  var useStyles4 = createStyles((theme, params) => ({
4234
4728
  container: {
@@ -4241,7 +4735,8 @@ var useStyles4 = createStyles((theme, params) => ({
4241
4735
  root: {
4242
4736
  display: "flex",
4243
4737
  flexFlow: "column nowrap",
4244
- height: "calc(100% - 50px)",
4738
+ position: "relative",
4739
+ height: "calc(100% - 70px)",
4245
4740
  [theme.fn.largerThan("md")]: {
4246
4741
  flexDirection: "row"
4247
4742
  // height: params.height,
@@ -4250,9 +4745,10 @@ var useStyles4 = createStyles((theme, params) => ({
4250
4745
  },
4251
4746
  flexCol: {
4252
4747
  flex: "1 1 auto",
4253
- height: "calc(100vh - 50px)",
4748
+ height: "calc(100vh - 70px)",
4254
4749
  [theme.fn.largerThan("md")]: {
4255
- width: 0
4750
+ width: 0,
4751
+ paddingLeft: 0
4256
4752
  }
4257
4753
  }
4258
4754
  }));
@@ -4260,17 +4756,16 @@ function ExplorerContent(props) {
4260
4756
  useMantineTheme();
4261
4757
  useState(false);
4262
4758
  const translation = useTranslation();
4263
- useSetup(props.source, props.dataLocale);
4264
- useSelector$1(selectServerState);
4759
+ useSetup(props.source, props.dataLocale, props.defaultCube);
4265
4760
  const { classes } = useStyles4({ height: props.height });
4266
4761
  useEffect(() => {
4267
4762
  if (props.uiLocale) translation.setLocale(props.uiLocale);
4268
4763
  }, [props.uiLocale]);
4269
4764
  const splash = useMemo(() => {
4270
4765
  const SplashComponent = props.splash;
4271
- return SplashComponent ? /* @__PURE__ */ React13__default.createElement(SplashComponent, { translation }) : /* @__PURE__ */ React13__default.createElement(Center, { h: "100%", sx: { flex: 1 } }, /* @__PURE__ */ React13__default.createElement(AnimatedCube, null));
4766
+ return SplashComponent ? /* @__PURE__ */ React10__default.createElement(SplashComponent, { translation }) : /* @__PURE__ */ React10__default.createElement(Center, { h: "100%", sx: { flex: 1 } }, /* @__PURE__ */ React10__default.createElement(AnimatedCube, null));
4272
4767
  }, [props.splash]);
4273
- return /* @__PURE__ */ React13__default.createElement("div", { className: classes.container }, /* @__PURE__ */ React13__default.createElement(Header, { height: { base: 50 }, p: "md" }, /* @__PURE__ */ React13__default.createElement("div", { style: { display: "flex", alignItems: "center", height: "100%", padding: 5 } }, /* @__PURE__ */ React13__default.createElement(HomeSVG, null))), /* @__PURE__ */ React13__default.createElement("div", { className: classes.root }, /* @__PURE__ */ React13__default.createElement(SideBarProvider, null, /* @__PURE__ */ React13__default.createElement(SideBar_default, null, /* @__PURE__ */ React13__default.createElement(SideBarItem, null, /* @__PURE__ */ React13__default.createElement(ParamsExplorer_default, null)), /* @__PURE__ */ React13__default.createElement(SideBarItem, null))), /* @__PURE__ */ React13__default.createElement(ExplorerResults, { className: classes.flexCol, panels: props.panels, splash })));
4768
+ return /* @__PURE__ */ React10__default.createElement("div", { className: classes.container }, /* @__PURE__ */ React10__default.createElement(Header, { height: { base: 50 }, p: "md" }, /* @__PURE__ */ React10__default.createElement("div", { style: { display: "flex", alignItems: "center", height: "100%", padding: 5 } }, /* @__PURE__ */ React10__default.createElement(HomeSVG, null))), /* @__PURE__ */ React10__default.createElement("div", { className: classes.root }, /* @__PURE__ */ React10__default.createElement(AppProviders, null, /* @__PURE__ */ React10__default.createElement(SideBarProvider, null, /* @__PURE__ */ React10__default.createElement(SideBar_default, null, /* @__PURE__ */ React10__default.createElement(SideBarItem, null, /* @__PURE__ */ React10__default.createElement(ParamsExplorer_default, null)))), /* @__PURE__ */ React10__default.createElement(ExplorerResults, { className: classes.flexCol, panels: props.panels, splash }))));
4274
4769
  }
4275
4770
 
4276
4771
  // src/components/PivotView.tsx
@@ -4556,7 +5051,7 @@ var ButtonDownload2 = (props) => {
4556
5051
  console.error("Error downloading content:", error.message);
4557
5052
  });
4558
5053
  }, [provider]);
4559
- return /* @__PURE__ */ React13__default.createElement(
5054
+ return /* @__PURE__ */ React10__default.createElement(
4560
5055
  Button,
4561
5056
  {
4562
5057
  ...buttonProps,
@@ -4564,13 +5059,13 @@ var ButtonDownload2 = (props) => {
4564
5059
  onClick,
4565
5060
  variant: "default"
4566
5061
  },
4567
- /* @__PURE__ */ React13__default.createElement(Text, { fz: "xs" }, props.children)
5062
+ /* @__PURE__ */ React10__default.createElement(Text, { fz: "xs" }, props.children)
4568
5063
  );
4569
5064
  };
4570
5065
 
4571
5066
  // src/components/NonIdealState.jsx
4572
5067
  init_esm_shims();
4573
- var NonIdealState = (props) => /* @__PURE__ */ React13__default.createElement(
5068
+ var NonIdealState = (props) => /* @__PURE__ */ React10__default.createElement(
4574
5069
  Center,
4575
5070
  {
4576
5071
  h: "100%",
@@ -4581,7 +5076,7 @@ var NonIdealState = (props) => /* @__PURE__ */ React13__default.createElement(
4581
5076
  }
4582
5077
  })
4583
5078
  },
4584
- /* @__PURE__ */ React13__default.createElement(Stack, { align: "center", spacing: "xs" }, props.icon && props.icon, props.title && /* @__PURE__ */ React13__default.createElement(Title, { order: 5 }, props.title), props.description && /* @__PURE__ */ React13__default.createElement(Text, null, props.description), props.children && props.children, props.action && props.action)
5079
+ /* @__PURE__ */ React10__default.createElement(Stack, { align: "center", spacing: "xs" }, props.icon && props.icon, props.title && /* @__PURE__ */ React10__default.createElement(Title, { order: 5 }, props.title), props.description && /* @__PURE__ */ React10__default.createElement(Text, null, props.description), props.children && props.children, props.action && props.action)
4585
5080
  );
4586
5081
 
4587
5082
  // src/components/PivotView.tsx
@@ -4671,12 +5166,12 @@ function PivotView(props) {
4671
5166
  const warnings2 = [];
4672
5167
  if (rowProp.type === "prop" || colProp.type === "prop") {
4673
5168
  warnings2.push(
4674
- /* @__PURE__ */ React13__default.createElement(
5169
+ /* @__PURE__ */ React10__default.createElement(
4675
5170
  Alert,
4676
5171
  {
4677
5172
  color: "yellow",
4678
5173
  m: "sm",
4679
- icon: /* @__PURE__ */ React13__default.createElement(IconAlertCircle, { size: "2rem" }),
5174
+ icon: /* @__PURE__ */ React10__default.createElement(IconAlertCircle, { size: "2rem" }),
4680
5175
  key: "propertypivot"
4681
5176
  },
4682
5177
  t("pivot_view.warning_propertypivot")
@@ -4686,21 +5181,21 @@ function PivotView(props) {
4686
5181
  const drilldownCount = Object.values(params.drilldowns).filter(isActiveItem).length;
4687
5182
  if (drilldownCount > 2) {
4688
5183
  warnings2.push(
4689
- valProp.type !== "SUM" ? /* @__PURE__ */ React13__default.createElement(
5184
+ valProp.type !== "SUM" ? /* @__PURE__ */ React10__default.createElement(
4690
5185
  Alert,
4691
5186
  {
4692
5187
  color: "yellow",
4693
5188
  m: "sm",
4694
- icon: /* @__PURE__ */ React13__default.createElement(IconAlertCircle, { size: "2rem" }),
5189
+ icon: /* @__PURE__ */ React10__default.createElement(IconAlertCircle, { size: "2rem" }),
4695
5190
  key: "notsummeasure"
4696
5191
  },
4697
5192
  t("pivot_view.warning_notsummeasure")
4698
- ) : /* @__PURE__ */ React13__default.createElement(
5193
+ ) : /* @__PURE__ */ React10__default.createElement(
4699
5194
  Alert,
4700
5195
  {
4701
5196
  color: "yellow",
4702
5197
  m: "sm",
4703
- icon: /* @__PURE__ */ React13__default.createElement(IconAlertCircle, { size: "2rem" }),
5198
+ icon: /* @__PURE__ */ React10__default.createElement(IconAlertCircle, { size: "2rem" }),
4704
5199
  key: "sumdimensions"
4705
5200
  },
4706
5201
  t("pivot_view.warning_sumdimensions")
@@ -4711,7 +5206,7 @@ function PivotView(props) {
4711
5206
  }, [params.drilldowns, rowProp, colProp, valProp]);
4712
5207
  const downloadToolbar = useMemo(() => {
4713
5208
  if (!pivottedData) return null;
4714
- return /* @__PURE__ */ React13__default.createElement(Input.Wrapper, { label: t("pivot_view.title_download") }, /* @__PURE__ */ React13__default.createElement(Button.Group, null, /* @__PURE__ */ React13__default.createElement(
5209
+ return /* @__PURE__ */ React10__default.createElement(Input.Wrapper, { label: t("pivot_view.title_download") }, /* @__PURE__ */ React10__default.createElement(Button.Group, null, /* @__PURE__ */ React10__default.createElement(
4715
5210
  ButtonDownload2,
4716
5211
  {
4717
5212
  provider: () => ({
@@ -4721,7 +5216,7 @@ function PivotView(props) {
4721
5216
  })
4722
5217
  },
4723
5218
  "CSV"
4724
- ), /* @__PURE__ */ React13__default.createElement(
5219
+ ), /* @__PURE__ */ React10__default.createElement(
4725
5220
  ButtonDownload2,
4726
5221
  {
4727
5222
  provider: () => ({
@@ -4734,51 +5229,51 @@ function PivotView(props) {
4734
5229
  )));
4735
5230
  }, [pivottedData, formatter]);
4736
5231
  if (drilldownOptions.length < 2) {
4737
- return /* @__PURE__ */ React13__default.createElement(
5232
+ return /* @__PURE__ */ React10__default.createElement(
4738
5233
  NonIdealState,
4739
5234
  {
4740
- icon: /* @__PURE__ */ React13__default.createElement(IconAlertTriangle, { color: "orange", size: "5rem" }),
5235
+ icon: /* @__PURE__ */ React10__default.createElement(IconAlertTriangle, { color: "orange", size: "5rem" }),
4741
5236
  title: t("pivot_view.error_missingparams")
4742
5237
  }
4743
5238
  );
4744
5239
  }
4745
5240
  let preview;
4746
5241
  if (!colProp || !rowProp || !valProp) {
4747
- preview = /* @__PURE__ */ React13__default.createElement(
5242
+ preview = /* @__PURE__ */ React10__default.createElement(
4748
5243
  NonIdealState,
4749
5244
  {
4750
- icon: /* @__PURE__ */ React13__default.createElement(IconAlertTriangle, { color: "orange", size: "5rem" }),
5245
+ icon: /* @__PURE__ */ React10__default.createElement(IconAlertTriangle, { color: "orange", size: "5rem" }),
4751
5246
  title: t("pivot_view.error_missingparams")
4752
5247
  }
4753
5248
  );
4754
5249
  } else if (colProp === rowProp) {
4755
- preview = /* @__PURE__ */ React13__default.createElement(
5250
+ preview = /* @__PURE__ */ React10__default.createElement(
4756
5251
  NonIdealState,
4757
5252
  {
4758
- icon: /* @__PURE__ */ React13__default.createElement(IconAlertTriangle, { color: "orange", size: "5rem" }),
5253
+ icon: /* @__PURE__ */ React10__default.createElement(IconAlertTriangle, { color: "orange", size: "5rem" }),
4759
5254
  title: t("pivot_view.error_onedimension")
4760
5255
  }
4761
5256
  );
4762
5257
  } else if (pivottingError != null) {
4763
- preview = /* @__PURE__ */ React13__default.createElement(
5258
+ preview = /* @__PURE__ */ React10__default.createElement(
4764
5259
  NonIdealState,
4765
5260
  {
4766
- icon: /* @__PURE__ */ React13__default.createElement(IconAlertTriangle, { color: "orange", size: "5rem" }),
5261
+ icon: /* @__PURE__ */ React10__default.createElement(IconAlertTriangle, { color: "orange", size: "5rem" }),
4767
5262
  title: t("pivot_view.error_internal"),
4768
5263
  description: t("pivot_view.error_internal_detail", { error: pivottingError.message })
4769
5264
  }
4770
5265
  );
4771
5266
  } else if (!pivottedData) {
4772
- preview = /* @__PURE__ */ React13__default.createElement(
5267
+ preview = /* @__PURE__ */ React10__default.createElement(
4773
5268
  NonIdealState,
4774
5269
  {
4775
- icon: /* @__PURE__ */ React13__default.createElement(Loader, { size: "xl" }),
5270
+ icon: /* @__PURE__ */ React10__default.createElement(Loader, { size: "xl" }),
4776
5271
  title: t("pivot_view.loading_title"),
4777
5272
  description: t("pivot_view.loading_details")
4778
5273
  }
4779
5274
  );
4780
5275
  } else {
4781
- preview = /* @__PURE__ */ React13__default.createElement(
5276
+ preview = /* @__PURE__ */ React10__default.createElement(
4782
5277
  MatrixTable,
4783
5278
  {
4784
5279
  key: `${fileName} ${formatterKey}`,
@@ -4789,13 +5284,13 @@ function PivotView(props) {
4789
5284
  }
4790
5285
  );
4791
5286
  }
4792
- return /* @__PURE__ */ React13__default.createElement(
5287
+ return /* @__PURE__ */ React10__default.createElement(
4793
5288
  Box,
4794
5289
  {
4795
5290
  id: "query-results-pivot-view",
4796
5291
  className: cx(props.className, classes.container)
4797
5292
  },
4798
- /* @__PURE__ */ React13__default.createElement(Box, { className: classes.colParams }, /* @__PURE__ */ React13__default.createElement(
5293
+ /* @__PURE__ */ React10__default.createElement(Box, { className: classes.colParams }, /* @__PURE__ */ React10__default.createElement(
4799
5294
  SimpleGrid,
4800
5295
  {
4801
5296
  id: "query-results-pivot-view-params",
@@ -4808,7 +5303,7 @@ function PivotView(props) {
4808
5303
  { minWidth: "md", cols: 1 }
4809
5304
  ]
4810
5305
  },
4811
- /* @__PURE__ */ React13__default.createElement(
5306
+ /* @__PURE__ */ React10__default.createElement(
4812
5307
  SelectOption,
4813
5308
  {
4814
5309
  getLabel: "label",
@@ -4819,7 +5314,7 @@ function PivotView(props) {
4819
5314
  label: colProp.type === "prop" ? t("pivot_view.label_ddcolumnprop") : t("pivot_view.label_ddcolumn")
4820
5315
  }
4821
5316
  ),
4822
- /* @__PURE__ */ React13__default.createElement(
5317
+ /* @__PURE__ */ React10__default.createElement(
4823
5318
  SelectOption,
4824
5319
  {
4825
5320
  getLabel: "label",
@@ -4830,7 +5325,7 @@ function PivotView(props) {
4830
5325
  label: rowProp.type === "prop" ? t("pivot_view.label_ddrowprop") : t("pivot_view.label_ddrow")
4831
5326
  }
4832
5327
  ),
4833
- /* @__PURE__ */ React13__default.createElement(
5328
+ /* @__PURE__ */ React10__default.createElement(
4834
5329
  SelectOption,
4835
5330
  {
4836
5331
  getLabel: "label",
@@ -4841,7 +5336,7 @@ function PivotView(props) {
4841
5336
  selectedItem: valProp.value
4842
5337
  }
4843
5338
  ),
4844
- /* @__PURE__ */ React13__default.createElement(
5339
+ /* @__PURE__ */ React10__default.createElement(
4845
5340
  SelectObject,
4846
5341
  {
4847
5342
  getLabel: "label",
@@ -4854,7 +5349,7 @@ function PivotView(props) {
4854
5349
  ),
4855
5350
  downloadToolbar
4856
5351
  ), warnings.length > 0 ? warnings : null),
4857
- /* @__PURE__ */ React13__default.createElement(Box, { className: classes.colContent }, preview)
5352
+ /* @__PURE__ */ React10__default.createElement(Box, { className: classes.colContent }, preview)
4858
5353
  );
4859
5354
  }
4860
5355
  function MatrixTable(props) {
@@ -4916,7 +5411,7 @@ function MatrixTable(props) {
4916
5411
  columns,
4917
5412
  data
4918
5413
  });
4919
- return /* @__PURE__ */ React13__default.createElement(MantineReactTable, { table });
5414
+ return /* @__PURE__ */ React10__default.createElement(MantineReactTable, { table });
4920
5415
  }
4921
5416
  function stringifyMatrix(matrix, formatter, format2) {
4922
5417
  const joint = { csv: ",", tsv: " " }[format2];
@@ -4963,7 +5458,7 @@ function ExplorerComponent(props) {
4963
5458
  extra.previewLimit = previewLimit;
4964
5459
  });
4965
5460
  }, [previewLimit]);
4966
- let content = /* @__PURE__ */ React13__default.createElement(
5461
+ let content = /* @__PURE__ */ React10__default.createElement(
4967
5462
  SettingsProvider,
4968
5463
  {
4969
5464
  actions: boundActions,
@@ -4973,7 +5468,7 @@ function ExplorerComponent(props) {
4973
5468
  withPermalink: props.withPermalink,
4974
5469
  panels
4975
5470
  },
4976
- /* @__PURE__ */ React13__default.createElement(TranslationProvider, { defaultLocale: props.uiLocale, translations: props.translations }, /* @__PURE__ */ React13__default.createElement(
5471
+ /* @__PURE__ */ React10__default.createElement(TranslationProvider, { defaultLocale: props.uiLocale, translations: props.translations }, /* @__PURE__ */ React10__default.createElement(
4977
5472
  ExplorerContent,
4978
5473
  {
4979
5474
  dataLocale: locale,
@@ -4983,12 +5478,13 @@ function ExplorerComponent(props) {
4983
5478
  source: props.source,
4984
5479
  splash: props.splash,
4985
5480
  uiLocale: props.uiLocale,
5481
+ defaultCube: props.defaultCube,
4986
5482
  withMultiQuery
4987
5483
  }
4988
5484
  ))
4989
5485
  );
4990
5486
  if (withinMantineProvider) {
4991
- content = /* @__PURE__ */ React13__default.createElement(
5487
+ content = /* @__PURE__ */ React10__default.createElement(
4992
5488
  MantineProvider,
4993
5489
  {
4994
5490
  withNormalizeCSS: true,
@@ -5025,13 +5521,10 @@ function ExplorerComponent(props) {
5025
5521
  );
5026
5522
  }
5027
5523
  if (withinReduxProvider) {
5028
- content = /* @__PURE__ */ React13__default.createElement(Provider$1, { store }, content);
5524
+ content = /* @__PURE__ */ React10__default.createElement(Provider$1, { store }, content);
5029
5525
  }
5030
5526
  return content;
5031
5527
  }
5032
- ExplorerComponent.defaultProps = {
5033
- version: process.env.BUILD_VERSION || "dev"
5034
- };
5035
5528
  ExplorerComponent.displayName = "TesseractExplorer";
5036
5529
 
5037
5530
  // src/vizbuilder/components/VizbuilderView.tsx
@@ -5915,7 +6408,7 @@ function saveElement_default(elem) {
5915
6408
 
5916
6409
  // src/vizbuilder/components/ErrorBoundary.tsx
5917
6410
  init_esm_shims();
5918
- var ErrorBoundary = class extends React13__default.Component {
6411
+ var ErrorBoundary = class extends React10__default.Component {
5919
6412
  constructor() {
5920
6413
  super(...arguments);
5921
6414
  this.state = {
@@ -5932,9 +6425,9 @@ var ErrorBoundary = class extends React13__default.Component {
5932
6425
  if (!message) {
5933
6426
  return this.props.children;
5934
6427
  }
5935
- return /* @__PURE__ */ React13__default.createElement(TranslationConsumer, null, ({ translate: t }) => {
6428
+ return /* @__PURE__ */ React10__default.createElement(TranslationConsumer, null, ({ translate: t }) => {
5936
6429
  const detailText = t("error.detail");
5937
- return /* @__PURE__ */ React13__default.createElement(Flex, { p: "xl", align: "center", justify: "center", direction: "column", className: "chart-card error" }, /* @__PURE__ */ React13__default.createElement(Title, { order: 3 }, t("error.title")), detailText.length ? /* @__PURE__ */ React13__default.createElement(Text, null, detailText) : null, /* @__PURE__ */ React13__default.createElement(Text, null, t("error.message", { message })), /* @__PURE__ */ React13__default.createElement(Group, { spacing: "xs", my: "sm" }, /* @__PURE__ */ React13__default.createElement(
6430
+ return /* @__PURE__ */ React10__default.createElement(Flex, { p: "xl", align: "center", justify: "center", direction: "column", className: "chart-card error" }, /* @__PURE__ */ React10__default.createElement(Title, { order: 3 }, t("error.title")), detailText.length ? /* @__PURE__ */ React10__default.createElement(Text, null, detailText) : null, /* @__PURE__ */ React10__default.createElement(Text, null, t("error.message", { message })), /* @__PURE__ */ React10__default.createElement(Group, { spacing: "xs", my: "sm" }, /* @__PURE__ */ React10__default.createElement(
5938
6431
  Button,
5939
6432
  {
5940
6433
  onClick: this.clearError,
@@ -5942,7 +6435,7 @@ var ErrorBoundary = class extends React13__default.Component {
5942
6435
  variant: "light"
5943
6436
  },
5944
6437
  t("action_retry")
5945
- ), /* @__PURE__ */ React13__default.createElement(Button, { error: name4, message })));
6438
+ ), /* @__PURE__ */ React10__default.createElement(Button, { error: name4, message })));
5946
6439
  });
5947
6440
  }
5948
6441
  };
@@ -5988,12 +6481,12 @@ function ChartCard(props) {
5988
6481
  return asArray2(props.downloadFormats).map((format2) => {
5989
6482
  const formatLower = format2.toLowerCase();
5990
6483
  const Icon = iconByFormat[formatLower] || IconDownload;
5991
- return /* @__PURE__ */ React13__default.createElement(
6484
+ return /* @__PURE__ */ React10__default.createElement(
5992
6485
  Button,
5993
6486
  {
5994
6487
  compact: true,
5995
6488
  key: format2,
5996
- leftIcon: /* @__PURE__ */ React13__default.createElement(Icon, { size: 16 }),
6489
+ leftIcon: /* @__PURE__ */ React10__default.createElement(Icon, { size: 16 }),
5997
6490
  onClick: () => {
5998
6491
  const { current: boxElement } = nodeRef;
5999
6492
  const svgElement = boxElement && boxElement.querySelector("svg");
@@ -6015,11 +6508,11 @@ function ChartCard(props) {
6015
6508
  const focusButton = useMemo(() => {
6016
6509
  if (!isFocused && isSingleChart) return null;
6017
6510
  const Icon = isFocused ? IconArrowsMinimize : IconArrowsMaximize;
6018
- return /* @__PURE__ */ React13__default.createElement(
6511
+ return /* @__PURE__ */ React10__default.createElement(
6019
6512
  Button,
6020
6513
  {
6021
6514
  compact: true,
6022
- leftIcon: /* @__PURE__ */ React13__default.createElement(Icon, { size: 16 }),
6515
+ leftIcon: /* @__PURE__ */ React10__default.createElement(Icon, { size: 16 }),
6023
6516
  onClick: props.onToggle,
6024
6517
  size: "sm",
6025
6518
  variant: isFocused ? "filled" : "light"
@@ -6028,7 +6521,7 @@ function ChartCard(props) {
6028
6521
  );
6029
6522
  }, [isFocused, isSingleChart, locale, props.onToggle]);
6030
6523
  const height = isFocused ? "calc(100vh - 3rem)" : isSingleChart ? "75vh" : 300;
6031
- return /* @__PURE__ */ React13__default.createElement(Paper, { h: height, w: "100%", style: { overflow: "hidden" } }, /* @__PURE__ */ React13__default.createElement(ErrorBoundary, null, /* @__PURE__ */ React13__default.createElement(Stack, { spacing: 0, h: height, style: { position: "relative" }, w: "100%" }, /* @__PURE__ */ React13__default.createElement(Group, { position: "right", p: "xs", spacing: "xs", align: "center" }, downloadButtons, focusButton), /* @__PURE__ */ React13__default.createElement(Box, { style: { flex: "1 1 auto" }, ref: nodeRef, pb: "xs", px: "xs" }, /* @__PURE__ */ React13__default.createElement(ChartComponent, { config })))));
6524
+ return /* @__PURE__ */ React10__default.createElement(Paper, { h: height, w: "100%", style: { overflow: "hidden" } }, /* @__PURE__ */ React10__default.createElement(ErrorBoundary, null, /* @__PURE__ */ React10__default.createElement(Stack, { spacing: 0, h: height, style: { position: "relative" }, w: "100%" }, /* @__PURE__ */ React10__default.createElement(Group, { position: "right", p: "xs", spacing: "xs", align: "center" }, downloadButtons, focusButton), /* @__PURE__ */ React10__default.createElement(Box, { style: { flex: "1 1 auto" }, ref: nodeRef, pb: "xs", px: "xs" }, /* @__PURE__ */ React10__default.createElement(ChartComponent, { config })))));
6032
6525
  }
6033
6526
  var getBackground = (node) => {
6034
6527
  if (node.nodeType !== Node.ELEMENT_NODE) return "white";
@@ -6107,8 +6600,8 @@ function createVizbuilderView(settings) {
6107
6600
  const isSingleChart = charts.length === 1;
6108
6601
  const chartMap = new Map(charts.map((item) => [item.key, item]));
6109
6602
  const filteredCharts = [...chartMap.values()];
6110
- if (filteredCharts.length === 0) return /* @__PURE__ */ React13__default.createElement(Notice, null);
6111
- return /* @__PURE__ */ React13__default.createElement(
6603
+ if (filteredCharts.length === 0) return /* @__PURE__ */ React10__default.createElement(Notice, null);
6604
+ return /* @__PURE__ */ React10__default.createElement(
6112
6605
  SimpleGrid,
6113
6606
  {
6114
6607
  breakpoints: [
@@ -6119,7 +6612,7 @@ function createVizbuilderView(settings) {
6119
6612
  ],
6120
6613
  className: clsx_m_default({ unique: filteredCharts.length === 1 })
6121
6614
  },
6122
- filteredCharts.map((chart) => /* @__PURE__ */ React13__default.createElement(
6615
+ filteredCharts.map((chart) => /* @__PURE__ */ React10__default.createElement(
6123
6616
  ChartCard,
6124
6617
  {
6125
6618
  chart,
@@ -6140,7 +6633,7 @@ function createVizbuilderView(settings) {
6140
6633
  const focusContent = useMemo(() => {
6141
6634
  const chart = charts.find((chart2) => currentChart && chart2.key === currentChart);
6142
6635
  if (!chart) return null;
6143
- return /* @__PURE__ */ React13__default.createElement(
6636
+ return /* @__PURE__ */ React10__default.createElement(
6144
6637
  ChartCard,
6145
6638
  {
6146
6639
  chart,
@@ -6155,7 +6648,7 @@ function createVizbuilderView(settings) {
6155
6648
  }
6156
6649
  );
6157
6650
  }, [currentChart, charts]);
6158
- return /* @__PURE__ */ React13__default.createElement(Box, { className: props.className, p: "sm" }, content, /* @__PURE__ */ React13__default.createElement(
6651
+ return /* @__PURE__ */ React10__default.createElement(Box, { className: props.className, p: "sm" }, content, /* @__PURE__ */ React10__default.createElement(
6159
6652
  Modal,
6160
6653
  {
6161
6654
  centered: true,
@@ -6175,7 +6668,7 @@ function createVizbuilderView(settings) {
6175
6668
  }
6176
6669
  function NonIdealState2() {
6177
6670
  const { translate: t } = useTranslation();
6178
- return /* @__PURE__ */ React13__default.createElement(Box, { className: "vizbuilder-nonidealstate" }, /* @__PURE__ */ React13__default.createElement(Title, { order: 1, className: "vizbuilder-nonidealstate-header" }, t("nonidealstate_msg")));
6671
+ return /* @__PURE__ */ React10__default.createElement(Box, { className: "vizbuilder-nonidealstate" }, /* @__PURE__ */ React10__default.createElement(Title, { order: 1, className: "vizbuilder-nonidealstate-header" }, t("nonidealstate_msg")));
6179
6672
  }
6180
6673
  /*! Bundled license information:
6181
6674