@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.
- package/dist/main.js +211 -224
- 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,
|
|
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 {
|
|
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(
|
|
2187
|
-
"
|
|
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
|
-
|
|
2217
|
-
|
|
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:
|
|
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: "
|
|
2684
|
-
styles: (
|
|
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:
|
|
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: "
|
|
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
|
-
|
|
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: "
|
|
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
|
|
2880
|
+
function getFilterfnKey(type) {
|
|
2893
2881
|
switch (type) {
|
|
2894
2882
|
case "greaterThan":
|
|
2895
|
-
return "
|
|
2883
|
+
return "GT";
|
|
2896
2884
|
case "lessThan":
|
|
2897
|
-
return "
|
|
2885
|
+
return "LT";
|
|
2898
2886
|
case "between":
|
|
2899
|
-
return "
|
|
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
|
-
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
3007
|
+
t("comparison.BT")
|
|
3019
3008
|
))));
|
|
3020
3009
|
}
|
|
3021
3010
|
function MeasuresOptions() {
|
|
3022
|
-
|
|
3023
|
-
|
|
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
|
|
3039
|
+
}, [itemMap, measures, filtersMap, filtersItems]);
|
|
3052
3040
|
const activeItems = filteredItems.filter((f) => isActiveItem(f.measure));
|
|
3053
3041
|
const options = filteredItems.map(({ measure, filter }) => {
|
|
3054
|
-
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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 && !
|
|
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
|
|
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,
|
|
3174
|
+
const term = [limit, offset, columnsStr, filterKey, cutKey, page];
|
|
3205
3175
|
setDebouncedTerm(term);
|
|
3206
3176
|
}, 700);
|
|
3207
3177
|
handler();
|
|
3208
|
-
return () =>
|
|
3209
|
-
|
|
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
|
|
3236
|
-
|
|
3237
|
-
|
|
3238
|
-
|
|
3239
|
-
|
|
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
|
|
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
|
|
3303
|
-
const formatterKey = getFormatterKey(columnKey) || (
|
|
3286
|
+
const isNumeric = valueType === "number" && columnKey !== "Year";
|
|
3287
|
+
const formatterKey = getFormatterKey(columnKey) || (isNumeric ? "Decimal" : "identity");
|
|
3304
3288
|
const formatter = getFormatter(formatterKey);
|
|
3305
|
-
const
|
|
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
|
-
))
|
|
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.
|
|
3330
|
+
id: (_a = entity.uniqueName) != null ? _a : entity.name,
|
|
3355
3331
|
dataType: valueType,
|
|
3356
3332
|
accessorFn: (item) => item[columnKey],
|
|
3357
|
-
Cell:
|
|
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
|
-
|
|
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
|
|
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:
|
|
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
|
|
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
|
-
|
|
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 (
|
|
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 =
|
|
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:
|
|
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 -
|
|
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
|
-
|
|
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
|
|
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(
|
|
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.
|
|
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": {
|