@datawheel/data-explorer 0.1.2 → 0.1.3

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 +211 -224
  2. package/package.json +3 -1
package/dist/main.js CHANGED
@@ -1,4 +1,4 @@
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';
1
+ import { keyframes, createStyles, Select, rem, Flex, Title, Text, Group, Button, Box, Anchor, Input, Stack, SimpleGrid, ScrollArea, Table, MultiSelect, Center, Alert, Loader, Modal, NumberInput, Menu, ActionIcon, useMantineTheme, MantineProvider, Paper, useComponentDefaultProps, Switch, ThemeIcon, Tooltip, Tabs, CloseButton, Drawer, Checkbox, UnstyledButton, TextInput, Accordion, Popover, Divider } from '@mantine/core';
2
2
  import { useClipboard, useClickOutside, useFullscreen, useMediaQuery, useDebouncedValue, useDisclosure } from '@mantine/hooks';
3
3
  import { Prism } from '@mantine/prism';
4
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';
@@ -203,6 +203,7 @@ var defaultTranslation = {
203
203
  dataset: "Select Dataset"
204
204
  },
205
205
  comparison: {
206
+ BT: "Between",
206
207
  EQ: "Equal to",
207
208
  GT: "Greater than",
208
209
  GTE: "Equal or greater than",
@@ -238,12 +239,15 @@ var defaultTranslation = {
238
239
  action_clear: "Clear query",
239
240
  action_clear_description: "Clear all parameters from your current query",
240
241
  action_execute: "Execute query",
242
+ add_columns: "Add columns",
241
243
  column_title: "Parameters",
242
244
  current_endpoint: "Current endpoint: {{label}}",
243
245
  dimmenu_abbrjoint: ": ",
244
246
  dimmenu_dimension: "{{dimension}}",
245
247
  dimmenu_hierarchy: "{{abbr}}",
246
248
  dimmenu_level: "{{abbr}}",
249
+ filter_mode: "Filter Mode",
250
+ filter_by: "Filter by {{name}}",
247
251
  error_no_cut_selected_detail: "You can add data filters based on selected drilldowns.",
248
252
  error_no_cut_selected_title: "No cuts added",
249
253
  error_no_dimension_selected_detail: "You must add at least one drilldown.",
@@ -1362,7 +1366,6 @@ function parseStateFromSearchParams(query) {
1362
1366
  const comparison = cond[0];
1363
1367
  const inputtedValue = cond[1];
1364
1368
  const interpretedValue = Number.parseFloat(cond[1]);
1365
- console.log("Entro parse", comparison, inputtedValue, interpretedValue);
1366
1369
  return [comparison, inputtedValue, interpretedValue];
1367
1370
  }
1368
1371
  }
@@ -1560,24 +1563,7 @@ function calcMaxMemberCount(query, params, dispatch) {
1560
1563
  });
1561
1564
  const memberLengths = query.getParam("drilldowns").map(
1562
1565
  (level) => Level.isLevel(level) ? drills[level.uniqueName] || ds.fetchMembers(level).then(async (members) => {
1563
- const { cube, name: name4, dimension, fullName, depth, properties, hierarchy, annotations, key } = level;
1564
- ({
1565
- cube: cube.name,
1566
- dimension: dimension.name,
1567
- fullName,
1568
- depth,
1569
- _type: "level",
1570
- name: name4,
1571
- uri: level._source.uri,
1572
- properties: properties.map((p) => ({
1573
- name: p.name,
1574
- annotations: p.annotations,
1575
- uri: p._source.uri,
1576
- _type: "property"
1577
- })),
1578
- hierarchy: hierarchy.name,
1579
- annotations
1580
- });
1566
+ const { dimension } = level;
1581
1567
  const drilldown = Object.values(params.drilldowns).find(
1582
1568
  (d) => d.uniqueName === level.uniqueName
1583
1569
  );
@@ -2183,40 +2169,41 @@ function IconChevronRight() {
2183
2169
  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" }));
2184
2170
  }
2185
2171
  function DataSetSVG() {
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(
2187
- "path",
2188
- {
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",
2190
- stroke: "#212529",
2191
- strokeLinecap: "round",
2192
- strokeLinejoin: "round"
2193
- }
2194
- ), /* @__PURE__ */ React10__default.createElement(
2195
- "path",
2196
- {
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",
2198
- stroke: "#212529",
2199
- strokeLinecap: "round",
2200
- strokeLinejoin: "round"
2201
- }
2202
- ), /* @__PURE__ */ React10__default.createElement(
2203
- "path",
2204
- {
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",
2206
- stroke: "#212529",
2207
- strokeLinecap: "round",
2208
- strokeLinejoin: "round"
2209
- }
2210
- ));
2211
- }
2212
- function HomeSVG() {
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(
2214
- "path",
2172
+ return /* @__PURE__ */ React10__default.createElement(
2173
+ "svg",
2215
2174
  {
2216
- d: "M2 16H5V10H11V16H14V7L8 2.5L2 7V16ZM0 18V6L8 0L16 6V18H9V12H7V18H0Z",
2217
- fill: "#545454"
2218
- }
2219
- ));
2175
+ width: "25",
2176
+ height: "25",
2177
+ viewBox: "0 0 20 20",
2178
+ fill: "none",
2179
+ stroke: "currentColor",
2180
+ xmlns: "http://www.w3.org/2000/svg"
2181
+ },
2182
+ /* @__PURE__ */ React10__default.createElement(
2183
+ "path",
2184
+ {
2185
+ 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",
2186
+ strokeLinecap: "round",
2187
+ strokeLinejoin: "round"
2188
+ }
2189
+ ),
2190
+ /* @__PURE__ */ React10__default.createElement(
2191
+ "path",
2192
+ {
2193
+ 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",
2194
+ strokeLinecap: "round",
2195
+ strokeLinejoin: "round"
2196
+ }
2197
+ ),
2198
+ /* @__PURE__ */ React10__default.createElement(
2199
+ "path",
2200
+ {
2201
+ 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",
2202
+ strokeLinecap: "round",
2203
+ strokeLinejoin: "round"
2204
+ }
2205
+ )
2206
+ );
2220
2207
  }
2221
2208
  function StackSVG() {
2222
2209
  return /* @__PURE__ */ React10__default.createElement(
@@ -2450,7 +2437,7 @@ function CubeSource() {
2450
2437
 
2451
2438
  // src/components/TableFooter.tsx
2452
2439
  function TableFooter(props) {
2453
- const { result, table } = props;
2440
+ const { result, table, data = [] } = props;
2454
2441
  const { translate: t } = useTranslation();
2455
2442
  const { url } = result;
2456
2443
  const { copy, copied } = useClipboard({ timeout: 1e3 });
@@ -2465,7 +2452,7 @@ function TableFooter(props) {
2465
2452
  gap: "sm"
2466
2453
  },
2467
2454
  /* @__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 }))
2455
+ /* @__PURE__ */ React10__default.createElement(Group, { position: "right", spacing: "sm" }, /* @__PURE__ */ React10__default.createElement(Text, { c: "dimmed" }, t("results.count_rows", { n: data.length })), /* @__PURE__ */ React10__default.createElement(MRT_TablePagination, { table }), /* @__PURE__ */ React10__default.createElement(ApiAndCsvButtons, { copied, copyHandler, url }))
2469
2456
  ));
2470
2457
  }
2471
2458
  var ApiAndCsvButtons = (props) => {
@@ -2672,6 +2659,7 @@ function abbreviateFullName(nameParts, joint = "/") {
2672
2659
  }
2673
2660
  function AddColumnsDrawer() {
2674
2661
  const [opened, { open, close: close2 }] = useDisclosure(false);
2662
+ const { translate: t } = useTranslation();
2675
2663
  const theme = useMantineTheme();
2676
2664
  const smallerThanMd = useMediaQuery(`(max-width: ${theme.breakpoints.md})`);
2677
2665
  return /* @__PURE__ */ React10__default.createElement(React10__default.Fragment, null, /* @__PURE__ */ React10__default.createElement(
@@ -2680,8 +2668,8 @@ function AddColumnsDrawer() {
2680
2668
  opened,
2681
2669
  position: "right",
2682
2670
  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) => ({
2671
+ title: /* @__PURE__ */ React10__default.createElement(Group, null, /* @__PURE__ */ React10__default.createElement(IconStack3, { size: "1rem" }), /* @__PURE__ */ React10__default.createElement(Text, { fw: 700 }, t("params.add_columns"))),
2672
+ styles: (t2) => ({
2685
2673
  inner: {
2686
2674
  position: "absolute",
2687
2675
  inset: 0
@@ -2690,7 +2678,7 @@ function AddColumnsDrawer() {
2690
2678
  background: "transparent"
2691
2679
  },
2692
2680
  content: {
2693
- backgroundColor: t.colorScheme === "dark" ? t.colors.dark[8] : t.colors.gray[1]
2681
+ backgroundColor: t2.colorScheme === "dark" ? t2.colors.dark[8] : t2.colors.gray[1]
2694
2682
  }
2695
2683
  }),
2696
2684
  overlayProps: {
@@ -2700,7 +2688,7 @@ function AddColumnsDrawer() {
2700
2688
  },
2701
2689
  /* @__PURE__ */ React10__default.createElement(MeasuresOptions, null),
2702
2690
  /* @__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")));
2691
+ ), /* @__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: "1rem" }), onClick: open, m: "md", size: "xs" }, t("params.add_columns"))));
2704
2692
  }
2705
2693
  function DrillDownOptions() {
2706
2694
  const locale = useSelector$1(selectLocale);
@@ -2712,7 +2700,7 @@ function DrillDownOptions() {
2712
2700
  cutItem.active = false;
2713
2701
  actions2.updateCut(cutItem);
2714
2702
  }, []);
2715
- const createHandler = useCallback(
2703
+ useCallback(
2716
2704
  (level) => {
2717
2705
  var _a;
2718
2706
  const drilldownItem = (_a = selectedDimensions.find((item) => item.uniqueName === level.uniqueName)) != null ? _a : buildDrilldown({ ...level });
@@ -2739,7 +2727,6 @@ function DrillDownOptions() {
2739
2727
  dimension,
2740
2728
  locale: locale.code,
2741
2729
  key: dimension.uri,
2742
- onItemSelect: createHandler,
2743
2730
  activeItems
2744
2731
  }
2745
2732
  )),
@@ -2862,9 +2849,10 @@ function LevelItem({ dimension, hierarchy, isSubMenu, level, locale, activeItems
2862
2849
  actions2.updateDrilldown({ ...currentDrilldown, active: !currentDrilldown.active });
2863
2850
  },
2864
2851
  checked,
2865
- label
2852
+ label,
2853
+ size: "xs"
2866
2854
  }
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(
2855
+ ), /* @__PURE__ */ React10__default.createElement(Group, null, /* @__PURE__ */ React10__default.createElement(ActionIcon, { size: "sm", 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
2856
  MultiSelect,
2869
2857
  {
2870
2858
  sx: { flex: "1 1 100%" },
@@ -2889,14 +2877,14 @@ function LevelItem({ dimension, hierarchy, isSubMenu, level, locale, activeItems
2889
2877
  }
2890
2878
  )));
2891
2879
  }
2892
- function getFilterfnText(type) {
2880
+ function getFilterfnKey(type) {
2893
2881
  switch (type) {
2894
2882
  case "greaterThan":
2895
- return "Greater Than";
2883
+ return "GT";
2896
2884
  case "lessThan":
2897
- return "Less Than";
2885
+ return "LT";
2898
2886
  case "between":
2899
- return "Between";
2887
+ return "BT";
2900
2888
  default:
2901
2889
  return "Not Found";
2902
2890
  }
@@ -2986,7 +2974,8 @@ function MinMax({ filter, ...rest }) {
2986
2974
  }
2987
2975
  function FilterFnsMenu({ filter }) {
2988
2976
  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(
2977
+ const { translate: t } = useTranslation();
2978
+ 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, t("params.filter_mode")), /* @__PURE__ */ React10__default.createElement(
2990
2979
  Menu.Item,
2991
2980
  {
2992
2981
  icon: /* @__PURE__ */ React10__default.createElement(IconMathGreater, { size: 14 }),
@@ -2995,7 +2984,7 @@ function FilterFnsMenu({ filter }) {
2995
2984
  actions2.updateFilter(buildFilter({ ...filter, ...conditions, active: false }));
2996
2985
  }
2997
2986
  },
2998
- "Greater Than"
2987
+ t("comparison.GT")
2999
2988
  ), /* @__PURE__ */ React10__default.createElement(
3000
2989
  Menu.Item,
3001
2990
  {
@@ -3005,7 +2994,7 @@ function FilterFnsMenu({ filter }) {
3005
2994
  actions2.updateFilter(buildFilter({ ...filter, ...conditions, active: false }));
3006
2995
  }
3007
2996
  },
3008
- "Less Than"
2997
+ t("comparison.LT")
3009
2998
  ), /* @__PURE__ */ React10__default.createElement(
3010
2999
  Menu.Item,
3011
3000
  {
@@ -3015,16 +3004,15 @@ function FilterFnsMenu({ filter }) {
3015
3004
  actions2.updateFilter(buildFilter({ ...filter, ...conditions, active: false }));
3016
3005
  }
3017
3006
  },
3018
- "Between"
3007
+ t("comparison.BT")
3019
3008
  ))));
3020
3009
  }
3021
3010
  function MeasuresOptions() {
3022
- const [activeFilter, setActiveFilter] = useState(false);
3023
- const { code: locale } = useSelector$1(selectLocale);
3011
+ useSelector$1(selectLocale);
3012
+ useTranslation();
3024
3013
  const itemMap = useSelector$1(selectMeasureMap);
3025
3014
  const filtersMap = useSelector$1(selectFilterMap);
3026
3015
  const filtersItems = useSelector$1(selectFilterItems);
3027
- useSelector$1(selectOlapMeasureMap);
3028
3016
  const measures = useSelector$1(selectOlapMeasureItems);
3029
3017
  const actions2 = useActions();
3030
3018
  function handlerCreateMeasure(data) {
@@ -3048,40 +3036,49 @@ function MeasuresOptions() {
3048
3036
  });
3049
3037
  return { measure, filter };
3050
3038
  });
3051
- }, [itemMap, measures, filtersMap, filtersItems, locale]);
3039
+ }, [itemMap, measures, filtersMap, filtersItems]);
3052
3040
  const activeItems = filteredItems.filter((f) => isActiveItem(f.measure));
3053
3041
  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 })));
3042
+ return /* @__PURE__ */ React10__default.createElement(FilterItem4, { measure, filter, activeItems });
3069
3043
  });
3070
3044
  return options;
3071
3045
  }
3046
+ function FilterItem4({
3047
+ measure,
3048
+ filter,
3049
+ activeItems
3050
+ }) {
3051
+ const [activeFilter, setActiveFilter] = useState(false);
3052
+ const { translate: t } = useTranslation();
3053
+ const filterFn = getFilterFn(filter);
3054
+ const text = t(`comparison.${getFilterfnKey(filterFn)}`);
3055
+ const isBetween = filterFn === "between";
3056
+ const checked = activeItems.map((active) => active.measure.name).includes(measure.name);
3057
+ const actions2 = useActions();
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
+ size: "xs"
3068
+ }
3069
+ ), /* @__PURE__ */ React10__default.createElement(Group, null, activeFilter && /* @__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 })));
3070
+ }
3072
3071
  var DrawerMenu_default = AddColumnsDrawer;
3073
3072
  var removeColumn = (actions2, entity, measures, drilldowns) => {
3074
3073
  if (entity._type === "measure") {
3075
3074
  if (entity.name) {
3076
- const measure = Object.values(measures).find((d) => d.name === entity.name);
3075
+ const measure = measures.find((d) => d.name === entity.name);
3077
3076
  measure && actions2.updateMeasure({ ...measure, active: false });
3078
- actions2.willRequestQuery();
3079
3077
  }
3080
3078
  }
3081
3079
  if (entity._type === "level") {
3082
- const drilldown = Object.values(drilldowns).find((d) => d.uniqueName === (entity == null ? void 0 : entity.uniqueName));
3080
+ const drilldown = drilldowns.find((d) => d.uniqueName === (entity == null ? void 0 : entity.uniqueName));
3083
3081
  drilldown && actions2.updateDrilldown({ ...drilldown, active: false });
3084
- actions2.willRequestQuery();
3085
3082
  }
3086
3083
  };
3087
3084
  function showTrashIcon(columns, type) {
@@ -3105,45 +3102,10 @@ var getEntityText = (entityType) => {
3105
3102
  return "";
3106
3103
  }
3107
3104
  };
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) {
3105
+ function getMantineFilterMultiSelectProps(isId, isNumeric, range) {
3127
3106
  let result = {};
3128
- const filterVariant = !isId && !isNumeric2 && (!range || range && range[1] - range[0] <= 100) ? "multi-select" : "text";
3107
+ const filterVariant = !isId && !isNumeric && (!range || range && range[1] - range[0] <= 100) ? "multi-select" : "text";
3129
3108
  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
3109
  return result;
3148
3110
  }
3149
3111
  function getSortIcon(value, entityType) {
@@ -3190,25 +3152,31 @@ function getFiltersConditions(fn, value) {
3190
3152
  function useTableData({ offset, limit, columns, filters, cuts }) {
3191
3153
  const normalizedFilters = filters.map((filter) => ({
3192
3154
  id: filter.measure,
3193
- value: getFilterValue(filter),
3194
- fn: getFilterFn(filter)
3155
+ value: getFilterValue(filter)
3156
+ // fn: getFilterFn(filter)
3195
3157
  }));
3196
3158
  const normalizedCuts = cuts.map((cut) => ({ id: cut.uniqueName, members: cut.members }));
3197
3159
  const filterKey = JSON.stringify(normalizedFilters);
3198
3160
  const cutKey = JSON.stringify(normalizedCuts);
3199
3161
  const actions2 = useActions();
3200
- const [filterKeydebouced, setDebouncedTerm] = useState("");
3162
+ const columnsStr = JSON.stringify(columns.sort());
3201
3163
  const page = offset;
3164
+ const [filterKeydebouced, setDebouncedTerm] = useState([
3165
+ limit,
3166
+ offset,
3167
+ columnsStr,
3168
+ filterKey,
3169
+ cutKey,
3170
+ page
3171
+ ]);
3202
3172
  useEffect(() => {
3203
3173
  const handler = debounce(() => {
3204
- const term = [limit, offset, ...columns.sort(), filterKey, cutKey, page];
3174
+ const term = [limit, offset, columnsStr, filterKey, cutKey, page];
3205
3175
  setDebouncedTerm(term);
3206
3176
  }, 700);
3207
3177
  handler();
3208
- return () => {
3209
- handler.cancel();
3210
- };
3211
- }, [...columns, offset, filterKey, cutKey, page]);
3178
+ return () => handler.cancel();
3179
+ }, [columnsStr, offset, filterKey, cutKey, page]);
3212
3180
  return useQuery({
3213
3181
  queryKey: ["table", filterKeydebouced],
3214
3182
  queryFn: () => {
@@ -3219,7 +3187,6 @@ function useTableData({ offset, limit, columns, filters, cuts }) {
3219
3187
  },
3220
3188
  staleTime: 3e5,
3221
3189
  enabled: !!filterKeydebouced
3222
- // placeholderData: keepPreviousData
3223
3190
  });
3224
3191
  }
3225
3192
  function useTable({
@@ -3230,24 +3197,12 @@ function useTable({
3230
3197
  ...mantineTableProps
3231
3198
  }) {
3232
3199
  const { types } = result;
3233
- const { measures, drilldowns } = useSelector$1(selectCurrentQueryParams);
3234
3200
  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
- ];
3201
+ const filtersMap = useSelector$1(selectFilterMap);
3202
+ const measuresOlap = useSelector$1(selectOlapMeasureItems);
3203
+ const measuresMap = useSelector$1(selectMeasureMap);
3204
+ const drilldowns = useSelector$1(selectDrilldownItems);
3205
+ const measures = useSelector$1(selectMeasureItems);
3251
3206
  const actions2 = useActions();
3252
3207
  const itemsCuts = useSelector$1(selectCutItems);
3253
3208
  const { limit, offset } = useSelector$1(selectPaginationParams);
@@ -3255,7 +3210,36 @@ function useTable({
3255
3210
  pageIndex: offset,
3256
3211
  pageSize: limit
3257
3212
  });
3258
- const { isLoading, isFetching, isError, data, isPlaceholderData } = useTableData({
3213
+ const finalUniqueKeys = useMemo(
3214
+ () => [
3215
+ ...measures.map((m) => m.active ? m.name : null),
3216
+ ...drilldowns.map((d) => d.active ? d.uniqueName : null)
3217
+ ].filter((a) => a !== null),
3218
+ [measures, drilldowns]
3219
+ );
3220
+ function handlerCreateMeasure(data2) {
3221
+ const measure = buildMeasure(data2);
3222
+ actions2.updateMeasure(measure);
3223
+ return measure;
3224
+ }
3225
+ function handlerCreateFilter(data2) {
3226
+ const filter = buildFilter(data2);
3227
+ actions2.updateFilter(filter);
3228
+ return filter;
3229
+ }
3230
+ useMemo(() => {
3231
+ return filterMap(measuresOlap, (m) => {
3232
+ const measure = measuresMap[m.name] || handlerCreateMeasure({ ...m, active: false });
3233
+ const foundFilter = filtersMap[m.name] || filterItems.find((f) => f.measure === measure.name);
3234
+ const filter = foundFilter || handlerCreateFilter({
3235
+ measure: measure.name,
3236
+ active: false,
3237
+ key: measure.name
3238
+ });
3239
+ return { measure, filter };
3240
+ });
3241
+ }, [measuresMap, measuresOlap, filtersMap, filterItems]);
3242
+ const { isLoading, isFetching, isError, data } = useTableData({
3259
3243
  offset,
3260
3244
  limit,
3261
3245
  columns: finalUniqueKeys,
@@ -3299,19 +3283,11 @@ function useTable({
3299
3283
  range,
3300
3284
  isId
3301
3285
  } = column;
3302
- const isNumeric2 = valueType === "number" && columnKey !== "Year";
3303
- const formatterKey = getFormatterKey(columnKey) || (isNumeric2 ? "Decimal" : "identity");
3286
+ const isNumeric = valueType === "number" && columnKey !== "Year";
3287
+ const formatterKey = getFormatterKey(columnKey) || (isNumeric ? "Decimal" : "identity");
3304
3288
  const formatter = getFormatter(formatterKey);
3305
- const filterOption = getColumnFilterOption(entityType);
3306
- const mantineFilterVariantObject = getMantineFilterMultiSelectProps(
3307
- isId,
3308
- isNumeric2,
3309
- range,
3310
- entity,
3311
- drilldowns,
3312
- columnKey);
3289
+ const mantineFilterVariantObject = getMantineFilterMultiSelectProps(isId, isNumeric, range);
3313
3290
  return {
3314
- ...filterOption,
3315
3291
  ...mantineFilterVariantObject,
3316
3292
  entityType,
3317
3293
  header,
@@ -3335,7 +3311,7 @@ function useTable({
3335
3311
  onClick: column2.getToggleSortingHandler()
3336
3312
  },
3337
3313
  getSortIcon(column2.getIsSorted(), entityType)
3338
- )), /* @__PURE__ */ React10__default.createElement(Text, { ml: rem(30), size: "sm", color: "dimmed", fw: "normal" }, getEntityText(entityType))), /* @__PURE__ */ React10__default.createElement(
3314
+ ))), /* @__PURE__ */ React10__default.createElement(
3339
3315
  CustomActionIcon_default,
3340
3316
  {
3341
3317
  label: `At least one ${getEntityText(entityType)} is required.`,
@@ -3351,10 +3327,10 @@ function useTable({
3351
3327
  },
3352
3328
  formatter,
3353
3329
  formatterKey,
3354
- id: (_a = entity.fullName) != null ? _a : entity.name,
3330
+ id: (_a = entity.uniqueName) != null ? _a : entity.name,
3355
3331
  dataType: valueType,
3356
3332
  accessorFn: (item) => item[columnKey],
3357
- Cell: isNumeric2 ? ({ cell }) => formatter(cell.getValue()) : ({ cell, renderedCellValue, row }) => {
3333
+ Cell: isNumeric ? ({ cell }) => formatter(cell.getValue()) : ({ cell, renderedCellValue, row }) => {
3358
3334
  const cellId = row.original[`${cell.column.id} ID`];
3359
3335
  return /* @__PURE__ */ React10__default.createElement(Flex, { justify: "space-between", sx: { width: "100%", maxWidth: 400 }, gap: "sm" }, /* @__PURE__ */ React10__default.createElement(
3360
3336
  Text,
@@ -3466,16 +3442,16 @@ function useTable({
3466
3442
  ...constTableProps,
3467
3443
  ...mantineTableProps
3468
3444
  });
3469
- return { table, isError, isLoading };
3445
+ return { table, isError, isLoading, data: fetchedTableData };
3470
3446
  }
3471
- function TableView({ table, result, isError, isLoading }) {
3447
+ function TableView({ table, result, isError, isLoading, data }) {
3472
3448
  const isData = Boolean(table.getRowModel().rows.length);
3473
3449
  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(
3474
- Box,
3450
+ ScrollArea,
3475
3451
  {
3452
+ h: isData ? "100%" : "auto",
3476
3453
  sx: {
3477
3454
  flex: "1 1 auto",
3478
- height: isData ? "100%" : "auto",
3479
3455
  position: "relative",
3480
3456
  overflow: "scroll"
3481
3457
  }
@@ -3505,11 +3481,11 @@ function TableView({ table, result, isError, isLoading }) {
3505
3481
  table.getHeaderGroups().map((headerGroup) => /* @__PURE__ */ React10__default.createElement(Box, { component: "tr", key: headerGroup.id, sx: { fontWeight: "normal" } }, headerGroup.headers.map((header) => {
3506
3482
  var _a;
3507
3483
  const column = table.getColumn(header.id);
3508
- const isNumeric2 = column.columnDef.dataType === "number";
3484
+ const isNumeric = column.columnDef.dataType === "number";
3509
3485
  const isRowIndex = column.id === "#";
3510
3486
  const base = (theme) => ({
3511
3487
  backgroundColor: theme.colorScheme === "dark" ? theme.colors.dark[7] : theme.colors.gray[0],
3512
- align: isNumeric2 ? "right" : "left",
3488
+ align: isNumeric ? "right" : "left",
3513
3489
  height: 60,
3514
3490
  paddingBottom: 10,
3515
3491
  minWidth: 210,
@@ -3538,7 +3514,7 @@ function TableView({ table, result, isError, isLoading }) {
3538
3514
  (_a = header.column.columnDef.Header) != null ? _a : header.column.columnDef.header,
3539
3515
  header.getContext()
3540
3516
  ),
3541
- !isRowIndex && /* @__PURE__ */ React10__default.createElement(ColumnFilterCell, { isNumeric: isNumeric2, header, table })
3517
+ !isRowIndex && /* @__PURE__ */ React10__default.createElement(ColumnFilterCell, { isNumeric, header, table })
3542
3518
  );
3543
3519
  })))
3544
3520
  ),
@@ -3553,33 +3529,34 @@ function TableView({ table, result, isError, isLoading }) {
3553
3529
  )))))
3554
3530
  ),
3555
3531
  !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 })));
3532
+ ), /* @__PURE__ */ React10__default.createElement(MRT_ToolbarAlertBanner, { stackAlertBanner: true, table }), /* @__PURE__ */ React10__default.createElement(TableFooter_default, { table, data, result })));
3557
3533
  }
3558
3534
  var ColumnFilterCell = ({
3559
3535
  header,
3560
- table,
3561
- isNumeric: isNumeric2
3536
+ isNumeric
3562
3537
  }) => {
3563
3538
  const filterVariant = header.column.columnDef.filterVariant;
3564
3539
  const isMulti = filterVariant === "multi-select";
3565
3540
  if (isMulti) {
3566
3541
  return /* @__PURE__ */ React10__default.createElement(MultiFilter, { header });
3567
3542
  }
3568
- if (isNumeric2) {
3543
+ if (isNumeric) {
3569
3544
  return /* @__PURE__ */ React10__default.createElement(NumericFilter, { header });
3570
3545
  }
3571
3546
  };
3572
3547
  function NumericFilter({ header }) {
3573
3548
  const filters = useSelector$1(selectFilterItems);
3549
+ const { translate: t } = useTranslation();
3574
3550
  const filter = filters.find((f) => f.measure === header.column.id);
3575
3551
  if (filter) {
3576
3552
  const filterFn = getFilterFn(filter);
3577
- const text = getFilterfnText(filterFn);
3553
+ const text = t(`comparison.${getFilterfnKey(filterFn)}`);
3578
3554
  const isBetween = filterFn === "between";
3579
3555
  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
3556
  }
3581
3557
  }
3582
3558
  function MultiFilter({ header }) {
3559
+ const { translate: t } = useTranslation();
3583
3560
  const cutItems = useSelector$1(selectCutItems);
3584
3561
  const drilldownItems = useSelector$1(selectDrilldownItems);
3585
3562
  const label = header.column.id;
@@ -3599,11 +3576,11 @@ function MultiFilter({ header }) {
3599
3576
  onChange: (value) => {
3600
3577
  updatecutHandler({ ...cut, active: true }, value);
3601
3578
  },
3602
- placeholder: `Filter by ${label}`,
3579
+ placeholder: t("params.filter_by", { name: label }),
3603
3580
  value: cut.members || [],
3604
3581
  data: drilldown.members.map((m) => ({
3605
3582
  value: String(m.key),
3606
- label: m.caption ? `${m.caption} ${m.key}` : m.name
3583
+ label: m.caption ? `${m.caption} (${m.key})` : m.name
3607
3584
  })),
3608
3585
  clearButtonProps: { "aria-label": "Clear selection" },
3609
3586
  clearable: true,
@@ -3841,7 +3818,7 @@ function SuccessResult(props) {
3841
3818
  const { previewLimit, actions: actions2 } = useSettings();
3842
3819
  const queryItem = useSelector$1(selectCurrentQueryItem);
3843
3820
  const isPreviewMode = useSelector$1(selectIsPreviewMode);
3844
- const { table, isError, isLoading } = useTable({ cube, result });
3821
+ const { table, isError, isLoading, data } = useTable({ cube, result });
3845
3822
  const fullscreen = useFullscreen();
3846
3823
  const [CurrentComponent, panelKey, panelMeta] = useMemo(() => {
3847
3824
  const currentPanel = queryItem.panel || `${panels[0].key}-`;
@@ -3873,7 +3850,8 @@ function SuccessResult(props) {
3873
3850
  result,
3874
3851
  table,
3875
3852
  isError,
3876
- isLoading
3853
+ isLoading,
3854
+ data
3877
3855
  }
3878
3856
  )))))));
3879
3857
  }
@@ -4177,12 +4155,13 @@ function SideBar(props) {
4177
4155
  id: "dex-sidebar",
4178
4156
  py: "md",
4179
4157
  sx: (t2) => ({
4180
- height: "calc(100vh - 75px)",
4158
+ height: "calc(100vh - 50px)",
4181
4159
  backgroundColor: t2.colorScheme === "dark" ? t2.colors.dark[8] : t2.colors.gray[1],
4182
4160
  boxShadow: "0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)",
4183
4161
  maxWidth: expanded ? 300 : 54,
4184
4162
  padding: 0,
4185
4163
  zIndex: 99,
4164
+ boxSizing: "border-box",
4186
4165
  [t2.fn.smallerThan("md")]: {
4187
4166
  position: "absolute",
4188
4167
  width: expanded ? 300 : 54,
@@ -4333,10 +4312,49 @@ init_esm_shims();
4333
4312
 
4334
4313
  // src/components/Results.tsx
4335
4314
  init_esm_shims();
4315
+
4316
+ // src/hooks/useSelectCube.tsx
4317
+ init_esm_shims();
4318
+ function useSelectCube(onSelectCube) {
4319
+ const { updateMeasure, updateCut, updateDrilldown, willFetchMembers: willFetchMembers2 } = useActions();
4320
+ const createCutHandler2 = React10__default.useCallback((level) => {
4321
+ const cutItem = buildCut({ ...level });
4322
+ cutItem.active = false;
4323
+ updateCut(cutItem);
4324
+ }, []);
4325
+ const addDrilldown = useCallback((level, dimensions) => {
4326
+ const drilldownItem = buildDrilldown(level);
4327
+ createCutHandler2(level);
4328
+ updateDrilldown(drilldownItem);
4329
+ return willFetchMembers2({ ...level, level: level.name }).then((members) => {
4330
+ const dimension = dimensions.find((dim) => dim.name === level.dimension);
4331
+ if (!dimension) return;
4332
+ return updateDrilldown({
4333
+ ...drilldownItem,
4334
+ dimType: dimension.dimensionType,
4335
+ memberCount: members.length,
4336
+ members
4337
+ });
4338
+ });
4339
+ }, []);
4340
+ return (item, subtopic) => () => onSelectCube(item, subtopic).then(({ cube, measures, dimensions }) => {
4341
+ const [measure] = Object.values(measures);
4342
+ const drilldowns = deriveDrilldowns(dimensions);
4343
+ if (measure && drilldowns.length > 0) {
4344
+ updateMeasure({ ...measure, active: true });
4345
+ for (const level of drilldowns) {
4346
+ addDrilldown(level, dimensions);
4347
+ }
4348
+ }
4349
+ });
4350
+ }
4351
+
4352
+ // src/components/Results.tsx
4336
4353
  function Results(props) {
4337
4354
  const { onSelectCube, graph, selectedItem, locale, getCube: getCube2, isSelected: isSelected2 } = props;
4338
4355
  const { classes } = useStyles3();
4339
4356
  const { setExpanded, setInput, map } = useSideBar();
4357
+ const callback = useSelectCube(onSelectCube);
4340
4358
  const result = [];
4341
4359
  if (map) {
4342
4360
  for (let [key, items] of map) {
@@ -4351,7 +4369,7 @@ function Results(props) {
4351
4369
  fz: "xs",
4352
4370
  className: isSelected2(selectedItem, cube) ? `${classes.link} ${classes.linkActive}` : classes.link,
4353
4371
  onClick: () => {
4354
- onSelectCube(item, subtopic);
4372
+ callback(item, subtopic)();
4355
4373
  setExpanded(false);
4356
4374
  setInput("");
4357
4375
  }
@@ -4604,28 +4622,8 @@ function CubeButton({
4604
4622
  locale,
4605
4623
  parent
4606
4624
  }) {
4607
- const { updateMeasure, updateCut, updateDrilldown, willFetchMembers: willFetchMembers2 } = useActions();
4625
+ const callback = useSelectCube(onSelectCube);
4608
4626
  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
- }, []);
4629
4627
  const table = item;
4630
4628
  const subtopic = parent != null ? parent : "";
4631
4629
  return /* @__PURE__ */ React10__default.createElement(
@@ -4642,18 +4640,7 @@ function CubeButton({
4642
4640
  background: isSelected(selectedItem, getCube(graph.items, table, subtopic, locale)) ? t.fn.primaryColor() : t.colorScheme === "dark" ? t.colors.dark[6] : t.colors.gray[3],
4643
4641
  overflow: "hidden"
4644
4642
  }),
4645
- onClick: () => {
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
- });
4656
- }
4643
+ onClick: callback(item, subtopic)
4657
4644
  },
4658
4645
  item
4659
4646
  );
@@ -4765,7 +4752,7 @@ function ExplorerContent(props) {
4765
4752
  const SplashComponent = props.splash;
4766
4753
  return SplashComponent ? /* @__PURE__ */ React10__default.createElement(SplashComponent, { translation }) : /* @__PURE__ */ React10__default.createElement(Center, { h: "100%", sx: { flex: 1 } }, /* @__PURE__ */ React10__default.createElement(AnimatedCube, null));
4767
4754
  }, [props.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 }))));
4755
+ return /* @__PURE__ */ React10__default.createElement("div", { className: classes.container }, /* @__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 }))));
4769
4756
  }
4770
4757
 
4771
4758
  // src/components/PivotView.tsx
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@datawheel/data-explorer",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "exports": {
5
5
  ".": {
6
6
  "import": "./dist/main.js"
@@ -37,6 +37,8 @@
37
37
  "postcss-modules": "^6.0.0",
38
38
  "react-redux": "^7.0.0",
39
39
  "react-viewport-list": "^3.0.0",
40
+ "stylis": "^4.3.4",
41
+ "stylis-plugin-rtl": "^2.1.1",
40
42
  "yn": "^5.0.0"
41
43
  },
42
44
  "peerDependencies": {