@cubejs-client/playground 1.1.6 → 1.1.16

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 (189) hide show
  1. package/build/assets/{index-CH7p8ya-.js → index-Cc4_B7ie.js} +612 -778
  2. package/build/index.html +1 -1
  3. package/build/vizard/download/react-typescript-antd-table.zip +0 -0
  4. package/build/vizard/download/react-typescript-chartjs-area+bar+doughnut+line+pie.zip +0 -0
  5. package/lib/.tsbuildinfo +1 -1
  6. package/lib/QueryBuilderV2/QueryBuilder.d.ts +4 -0
  7. package/lib/QueryBuilderV2/QueryBuilder.js +12 -9
  8. package/lib/QueryBuilderV2/QueryBuilder.js.map +1 -1
  9. package/lib/QueryBuilderV2/QueryBuilderChart.js +2 -2
  10. package/lib/QueryBuilderV2/QueryBuilderChart.js.map +1 -1
  11. package/lib/QueryBuilderV2/QueryBuilderChartResults.js +4 -4
  12. package/lib/QueryBuilderV2/QueryBuilderChartResults.js.map +1 -1
  13. package/lib/QueryBuilderV2/QueryBuilderError.js +1 -3
  14. package/lib/QueryBuilderV2/QueryBuilderError.js.map +1 -1
  15. package/lib/QueryBuilderV2/QueryBuilderExtras.d.ts +1 -0
  16. package/lib/QueryBuilderV2/QueryBuilderExtras.js +39 -18
  17. package/lib/QueryBuilderV2/QueryBuilderExtras.js.map +1 -1
  18. package/lib/QueryBuilderV2/QueryBuilderFilters.js +88 -84
  19. package/lib/QueryBuilderV2/QueryBuilderFilters.js.map +1 -1
  20. package/lib/QueryBuilderV2/QueryBuilderGraphQL.js +1 -1
  21. package/lib/QueryBuilderV2/QueryBuilderGraphQL.js.map +1 -1
  22. package/lib/QueryBuilderV2/QueryBuilderInternals.js +7 -10
  23. package/lib/QueryBuilderV2/QueryBuilderInternals.js.map +1 -1
  24. package/lib/QueryBuilderV2/QueryBuilderResults.js +87 -45
  25. package/lib/QueryBuilderV2/QueryBuilderResults.js.map +1 -1
  26. package/lib/QueryBuilderV2/QueryBuilderSidePanel.d.ts +4 -3
  27. package/lib/QueryBuilderV2/QueryBuilderSidePanel.js +95 -54
  28. package/lib/QueryBuilderV2/QueryBuilderSidePanel.js.map +1 -1
  29. package/lib/QueryBuilderV2/components/Accordion/AccordionItemTitle.js +1 -1
  30. package/lib/QueryBuilderV2/components/Accordion/AccordionItemTitle.js.map +1 -1
  31. package/lib/QueryBuilderV2/components/AddFilterInput.d.ts +10 -0
  32. package/lib/QueryBuilderV2/components/AddFilterInput.js +195 -0
  33. package/lib/QueryBuilderV2/components/AddFilterInput.js.map +1 -0
  34. package/lib/QueryBuilderV2/components/Badge.d.ts +3 -2
  35. package/lib/QueryBuilderV2/components/Badge.js +4 -3
  36. package/lib/QueryBuilderV2/components/Badge.js.map +1 -1
  37. package/lib/QueryBuilderV2/components/ChartRenderer.js +0 -1
  38. package/lib/QueryBuilderV2/components/ChartRenderer.js.map +1 -1
  39. package/lib/QueryBuilderV2/components/DateRangeFilter.d.ts +7 -0
  40. package/lib/QueryBuilderV2/components/DateRangeFilter.js +25 -4
  41. package/lib/QueryBuilderV2/components/DateRangeFilter.js.map +1 -1
  42. package/lib/QueryBuilderV2/components/EditQueryDialogForm.js +18 -20
  43. package/lib/QueryBuilderV2/components/EditQueryDialogForm.js.map +1 -1
  44. package/lib/QueryBuilderV2/components/FilterByMemberButton.d.ts +6 -1
  45. package/lib/QueryBuilderV2/components/FilterByMemberButton.js +16 -6
  46. package/lib/QueryBuilderV2/components/FilterByMemberButton.js.map +1 -1
  47. package/lib/QueryBuilderV2/components/FilterLabel.d.ts +9 -0
  48. package/lib/QueryBuilderV2/components/FilterLabel.js +18 -4
  49. package/lib/QueryBuilderV2/components/FilterLabel.js.map +1 -1
  50. package/lib/QueryBuilderV2/components/FilterMember.d.ts +19 -0
  51. package/lib/QueryBuilderV2/components/FilterMember.js +137 -0
  52. package/lib/QueryBuilderV2/components/FilterMember.js.map +1 -0
  53. package/lib/QueryBuilderV2/components/FilterOptionsButton.d.ts +8 -0
  54. package/lib/QueryBuilderV2/components/FilterOptionsButton.js +54 -0
  55. package/lib/QueryBuilderV2/components/FilterOptionsButton.js.map +1 -0
  56. package/lib/QueryBuilderV2/components/FilteredLabel.js +10 -2
  57. package/lib/QueryBuilderV2/components/FilteredLabel.js.map +1 -1
  58. package/lib/QueryBuilderV2/components/Folder.d.ts +9 -0
  59. package/lib/QueryBuilderV2/components/Folder.js +47 -0
  60. package/lib/QueryBuilderV2/components/Folder.js.map +1 -0
  61. package/lib/QueryBuilderV2/components/GranularityListMember.d.ts +3 -0
  62. package/lib/QueryBuilderV2/components/GranularityListMember.js +5 -14
  63. package/lib/QueryBuilderV2/components/GranularityListMember.js.map +1 -1
  64. package/lib/QueryBuilderV2/components/HierarchyMember.d.ts +14 -0
  65. package/lib/QueryBuilderV2/components/HierarchyMember.js +47 -0
  66. package/lib/QueryBuilderV2/components/HierarchyMember.js.map +1 -0
  67. package/lib/QueryBuilderV2/components/InstanceTooltipProvider.d.ts +15 -0
  68. package/lib/QueryBuilderV2/components/InstanceTooltipProvider.js +36 -0
  69. package/lib/QueryBuilderV2/components/InstanceTooltipProvider.js.map +1 -0
  70. package/lib/QueryBuilderV2/components/ListButton.d.ts +341 -11
  71. package/lib/QueryBuilderV2/components/ListButton.js +2 -1
  72. package/lib/QueryBuilderV2/components/ListButton.js.map +1 -1
  73. package/lib/QueryBuilderV2/components/ListCube.js +2 -2
  74. package/lib/QueryBuilderV2/components/ListCube.js.map +1 -1
  75. package/lib/QueryBuilderV2/components/ListMember.d.ts +11 -2
  76. package/lib/QueryBuilderV2/components/ListMember.js +39 -29
  77. package/lib/QueryBuilderV2/components/ListMember.js.map +1 -1
  78. package/lib/QueryBuilderV2/components/ListMemberButton.d.ts +341 -11
  79. package/lib/QueryBuilderV2/components/ListMemberButton.js +8 -1
  80. package/lib/QueryBuilderV2/components/ListMemberButton.js.map +1 -1
  81. package/lib/QueryBuilderV2/components/LogicalFilter.d.ts +12 -0
  82. package/lib/QueryBuilderV2/components/LogicalFilter.js +152 -0
  83. package/lib/QueryBuilderV2/components/LogicalFilter.js.map +1 -0
  84. package/lib/QueryBuilderV2/components/MemberLabel.d.ts +11 -1
  85. package/lib/QueryBuilderV2/components/MemberLabel.js +14 -6
  86. package/lib/QueryBuilderV2/components/MemberLabel.js.map +1 -1
  87. package/lib/QueryBuilderV2/components/MemberLabelText.js +11 -4
  88. package/lib/QueryBuilderV2/components/MemberLabelText.js.map +1 -1
  89. package/lib/QueryBuilderV2/components/ReorderableList.d.ts +20 -0
  90. package/lib/QueryBuilderV2/components/ReorderableList.js +173 -0
  91. package/lib/QueryBuilderV2/components/ReorderableList.js.map +1 -0
  92. package/lib/QueryBuilderV2/components/ScrollableArea.d.ts +354 -1
  93. package/lib/QueryBuilderV2/components/SegmentFilter.d.ts +7 -0
  94. package/lib/QueryBuilderV2/components/SegmentFilter.js +30 -4
  95. package/lib/QueryBuilderV2/components/SegmentFilter.js.map +1 -1
  96. package/lib/QueryBuilderV2/components/SidePanelCubeItem.d.ts +4 -5
  97. package/lib/QueryBuilderV2/components/SidePanelCubeItem.js +380 -130
  98. package/lib/QueryBuilderV2/components/SidePanelCubeItem.js.map +1 -1
  99. package/lib/QueryBuilderV2/components/TimeListMember.d.ts +20 -5
  100. package/lib/QueryBuilderV2/components/TimeListMember.js +95 -49
  101. package/lib/QueryBuilderV2/components/TimeListMember.js.map +1 -1
  102. package/lib/QueryBuilderV2/components/ValuesInput.d.ts +4 -0
  103. package/lib/QueryBuilderV2/components/ValuesInput.js +65 -41
  104. package/lib/QueryBuilderV2/components/ValuesInput.js.map +1 -1
  105. package/lib/QueryBuilderV2/hooks/dimension-values.d.ts +13 -0
  106. package/lib/QueryBuilderV2/hooks/dimension-values.js +62 -0
  107. package/lib/QueryBuilderV2/hooks/dimension-values.js.map +1 -0
  108. package/lib/QueryBuilderV2/hooks/filtered-cubes.d.ts +6 -2
  109. package/lib/QueryBuilderV2/hooks/filtered-cubes.js +26 -8
  110. package/lib/QueryBuilderV2/hooks/filtered-cubes.js.map +1 -1
  111. package/lib/QueryBuilderV2/hooks/filtered-members.d.ts +10 -4
  112. package/lib/QueryBuilderV2/hooks/filtered-members.js +57 -20
  113. package/lib/QueryBuilderV2/hooks/filtered-members.js.map +1 -1
  114. package/lib/QueryBuilderV2/hooks/has-overflow.d.ts +1 -1
  115. package/lib/QueryBuilderV2/hooks/has-overflow.js +3 -0
  116. package/lib/QueryBuilderV2/hooks/has-overflow.js.map +1 -1
  117. package/lib/QueryBuilderV2/hooks/index.d.ts +2 -1
  118. package/lib/QueryBuilderV2/hooks/index.js +2 -1
  119. package/lib/QueryBuilderV2/hooks/index.js.map +1 -1
  120. package/lib/QueryBuilderV2/hooks/local-storage.js +1 -1
  121. package/lib/QueryBuilderV2/hooks/local-storage.js.map +1 -1
  122. package/lib/QueryBuilderV2/hooks/query-builder.d.ts +36 -13
  123. package/lib/QueryBuilderV2/hooks/query-builder.js +258 -36
  124. package/lib/QueryBuilderV2/hooks/query-builder.js.map +1 -1
  125. package/lib/QueryBuilderV2/hooks/shown-member-name.d.ts +16 -0
  126. package/lib/QueryBuilderV2/hooks/shown-member-name.js +20 -0
  127. package/lib/QueryBuilderV2/hooks/shown-member-name.js.map +1 -0
  128. package/lib/QueryBuilderV2/icons/{ArrowIcon.d.ts → ChevronIcon.d.ts} +5 -5
  129. package/lib/QueryBuilderV2/icons/ChevronIcon.js +49 -0
  130. package/lib/QueryBuilderV2/icons/ChevronIcon.js.map +1 -0
  131. package/lib/QueryBuilderV2/icons/ItemInfoIcon.d.ts +7 -6
  132. package/lib/QueryBuilderV2/icons/ItemInfoIcon.js +7 -4
  133. package/lib/QueryBuilderV2/icons/ItemInfoIcon.js.map +1 -1
  134. package/lib/QueryBuilderV2/icons/PrimaryKeyIcon.js +1 -1
  135. package/lib/QueryBuilderV2/icons/PrimaryKeyIcon.js.map +1 -1
  136. package/lib/QueryBuilderV2/types.d.ts +38 -4
  137. package/lib/QueryBuilderV2/utils/cube-sql-converter.d.ts +5 -5
  138. package/lib/QueryBuilderV2/utils/cube-sql-converter.js +48 -25
  139. package/lib/QueryBuilderV2/utils/cube-sql-converter.js.map +1 -1
  140. package/lib/QueryBuilderV2/utils/get-member-search-name.d.ts +3 -0
  141. package/lib/QueryBuilderV2/utils/get-member-search-name.js +11 -0
  142. package/lib/QueryBuilderV2/utils/get-member-search-name.js.map +1 -0
  143. package/lib/QueryBuilderV2/utils/get-query-hash.js +2 -29
  144. package/lib/QueryBuilderV2/utils/get-query-hash.js.map +1 -1
  145. package/lib/QueryBuilderV2/utils/get-type-icon.d.ts +1 -1
  146. package/lib/QueryBuilderV2/utils/get-type-icon.js +1 -1
  147. package/lib/QueryBuilderV2/utils/get-type-icon.js.map +1 -1
  148. package/lib/QueryBuilderV2/utils/get-used-cubes-and-members.d.ts +7 -1
  149. package/lib/QueryBuilderV2/utils/get-used-cubes-and-members.js +48 -8
  150. package/lib/QueryBuilderV2/utils/get-used-cubes-and-members.js.map +1 -1
  151. package/lib/QueryBuilderV2/utils/graphql-converters.js +9 -12
  152. package/lib/QueryBuilderV2/utils/graphql-converters.js.map +1 -1
  153. package/lib/QueryBuilderV2/utils/index.d.ts +2 -0
  154. package/lib/QueryBuilderV2/utils/index.js +2 -0
  155. package/lib/QueryBuilderV2/utils/index.js.map +1 -1
  156. package/lib/QueryBuilderV2/utils/validate-query.d.ts +2 -0
  157. package/lib/QueryBuilderV2/utils/validate-query.js +109 -0
  158. package/lib/QueryBuilderV2/utils/validate-query.js.map +1 -0
  159. package/lib/QueryBuilderV2/values.d.ts +2 -2
  160. package/lib/QueryBuilderV2/values.js +8 -7
  161. package/lib/QueryBuilderV2/values.js.map +1 -1
  162. package/lib/components/PlaygroundQueryBuilder/QueryBuilderContainer.js +1 -2
  163. package/lib/components/PlaygroundQueryBuilder/QueryBuilderContainer.js.map +1 -1
  164. package/lib/components/QueryTabs/QueryTabs.d.ts +3 -0
  165. package/lib/components/QueryTabs/QueryTabs.js +29 -4
  166. package/lib/components/QueryTabs/QueryTabs.js.map +1 -1
  167. package/package.json +8 -6
  168. package/public/vizard/download/react-typescript-antd-table.zip +0 -0
  169. package/public/vizard/download/react-typescript-chartjs-area+bar+doughnut+line+pie.zip +0 -0
  170. package/lib/QueryBuilderV2/QueryBuilderDevSidePanel.d.ts +0 -1
  171. package/lib/QueryBuilderV2/QueryBuilderDevSidePanel.js +0 -203
  172. package/lib/QueryBuilderV2/QueryBuilderDevSidePanel.js.map +0 -1
  173. package/lib/QueryBuilderV2/components/DeleteFilterButton.d.ts +0 -122
  174. package/lib/QueryBuilderV2/components/DeleteFilterButton.js +0 -10
  175. package/lib/QueryBuilderV2/components/DeleteFilterButton.js.map +0 -1
  176. package/lib/QueryBuilderV2/components/MemberFilter.d.ts +0 -13
  177. package/lib/QueryBuilderV2/components/MemberFilter.js +0 -106
  178. package/lib/QueryBuilderV2/components/MemberFilter.js.map +0 -1
  179. package/lib/QueryBuilderV2/components/Panel.d.ts +0 -19
  180. package/lib/QueryBuilderV2/components/Panel.js +0 -88
  181. package/lib/QueryBuilderV2/components/Panel.js.map +0 -1
  182. package/lib/QueryBuilderV2/components/QueryVisualization.d.ts +0 -8
  183. package/lib/QueryBuilderV2/components/QueryVisualization.js +0 -85
  184. package/lib/QueryBuilderV2/components/QueryVisualization.js.map +0 -1
  185. package/lib/QueryBuilderV2/hooks/list-mode.d.ts +0 -3
  186. package/lib/QueryBuilderV2/hooks/list-mode.js +0 -9
  187. package/lib/QueryBuilderV2/hooks/list-mode.js.map +0 -1
  188. package/lib/QueryBuilderV2/icons/ArrowIcon.js +0 -30
  189. package/lib/QueryBuilderV2/icons/ArrowIcon.js.map +0 -1
@@ -1,16 +1,18 @@
1
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useEffect, useMemo, useRef, useState } from 'react';
3
- import { Block, Button, Space, tasty, Text, CubeIcon, ViewIcon, TooltipProvider, } from '@cube-dev/ui-kit';
4
- import { QuestionCircleOutlined } from '@ant-design/icons';
3
+ import { Block, Button, Space, tasty, Text, CubeIcon, ViewIcon } from '@cube-dev/ui-kit';
5
4
  import { useQueryBuilderContext } from '../context';
6
- import { ArrowIcon } from '../icons/ArrowIcon';
5
+ import { ChevronIcon } from '../icons/ChevronIcon';
7
6
  import { NonPublicIcon } from '../icons/NonPublicIcon';
8
7
  import { ItemInfoIcon } from '../icons/ItemInfoIcon';
9
- import { useHasOverflow, useFilteredMembers } from '../hooks';
10
- import { titleize } from '../utils/index';
8
+ import { useEvent, useFilteredMembers } from '../hooks';
9
+ import { titleize } from '../utils';
10
+ import { HierarchyMember } from './HierarchyMember';
11
+ import { Folder } from './Folder';
11
12
  import { ListMember } from './ListMember';
12
13
  import { TimeListMember } from './TimeListMember';
13
14
  import { FilteredLabel } from './FilteredLabel';
15
+ import { InstanceTooltipProvider } from './InstanceTooltipProvider';
14
16
  const CubeWrapper = tasty({
15
17
  styles: {
16
18
  position: 'sticky',
@@ -43,19 +45,15 @@ const CubeButton = tasty(Button, {
43
45
  '': '#purple.08',
44
46
  hovered: '#purple.16',
45
47
  pressed: '#purple.12',
46
- '!joinable': '#dark.04',
48
+ '!joinable | missing': '#dark.04',
47
49
  },
48
- padding: '(.75x - 1bw) (1.5x - 1bw) (.75x - 1bw) (1.5x - 1bw)',
50
+ padding: '(.75x - 1bw) 1x (.75x - 1bw) (1x - 1bw)',
49
51
  cursor: {
50
52
  joinable: 'pointer',
51
53
  disabled: 'default',
52
54
  },
53
- // shadow: {
54
- // '': '0 1ow 3ow #dark.0',
55
- // open: '0 1ow 1ow #dark.1',
56
- // },
57
55
  placeContent: 'space-between',
58
- gridTemplateColumns: 'auto 1fr auto',
56
+ gridTemplateColumns: 'auto 1fr auto 2x',
59
57
  textAlign: 'left',
60
58
  zIndex: 2,
61
59
  transition: 'fill .08s, color .3s',
@@ -68,62 +66,87 @@ const CubeButton = tasty(Button, {
68
66
  },
69
67
  },
70
68
  });
71
- export function SidePanelCubeItem({ isOpen, name, mode = 'all', isFiltered, isNonJoinable, isSelected, onToggle, filterString, onMemberToggle, }) {
69
+ function sortFn(a, b) {
70
+ return a.localeCompare(b);
71
+ }
72
+ export function SidePanelCubeItem(props) {
73
+ const { isOpen, cubeName, mode = 'all', isNonJoinable, onToggle, filterString, onMemberToggle, onHierarchyToggle, } = props;
72
74
  const textRef = useRef(null);
73
- const { query, grouping, dateRanges, dimensions: dimensionsUpdater, measures: measuresUpdater, segments: segmentsUpdater, filters,
74
- // queryStats,
75
- cubes, meta, usedCubes, usedMembers, } = useQueryBuilderContext();
76
- const cube = cubes.find((cube) => cube.name === name);
75
+ const { query, grouping, dateRanges, dimensions: dimensionsUpdater, measures: measuresUpdater, segments: segmentsUpdater, filters, cubes, meta, members, usedCubes, usedMembers, usedMembersInFilters, usedGranularities, missingMembers, memberViewType, isQueryEmpty, queryStats, } = useQueryBuilderContext();
76
+ const cube = cubes.find((cube) => cube.name === cubeName);
77
77
  // @ts-ignore
78
78
  const type = cube?.type || 'cube';
79
- const isUsed = usedCubes.includes(name);
79
+ const isUsed = usedCubes.includes(cubeName);
80
80
  // @ts-ignore
81
81
  const isPrivate = cube?.public === false;
82
82
  // const stats = queryStats[name];
83
83
  const isMissing = !cube;
84
- const [showAllMembers, setShowAllMembers] = useState(false);
84
+ const shownName = memberViewType === 'name' ? cubeName : (cube?.title ?? titleize(cubeName));
85
85
  // @ts-ignore
86
86
  const { title, description } = cube || {};
87
- const { measures: shownMeasures, dimensions: shownDimensions, segments: shownSegments, } = useFilteredMembers(filterString || '', {
88
- measures: cube?.measures || [],
89
- dimensions: cube?.dimensions || [],
90
- segments: cube?.segments || [],
91
- });
92
- const dimensions = (filterString ? shownDimensions : cube?.dimensions || [])
87
+ const folders = cube?.folders || [];
88
+ const hierarchies = cube?.hierarchies || [];
89
+ const hierarchyNames = hierarchies.map((h) => h.name);
90
+ const [openTimeDimensions, setOpenTimeDimensions] = useState([]);
91
+ const [openFolders, setOpenFolders] = useState([]);
92
+ const [openHierarchies, setOpenHierarchies] = useState([]);
93
+ const folderMembers = folders.reduce((acc, folder) => {
94
+ return acc.concat(folder.members);
95
+ }, []);
96
+ const hierarchyMembers = hierarchies.reduce((acc, hierarchy) => {
97
+ return acc.concat(hierarchy.levels);
98
+ }, []);
99
+ const importedDimensionsInHierarchies = hierarchies
100
+ .reduce((acc, hierarchy) => {
101
+ return acc.concat(hierarchy.levels.filter((level) => cube && !level.startsWith(cube?.name)));
102
+ }, [])
103
+ .map((member) => members.dimensions[member])
104
+ .filter(Boolean);
105
+ const importedDimensionsInHierarchiesNames = importedDimensionsInHierarchies.map((d) => d.name);
106
+ const cubeDimensions = (cube?.dimensions ?? [])
93
107
  .map((d) => d.name)
94
- .filter((d) => (mode === 'all' && isOpen) ||
95
- filterString ||
96
- showAllMembers ||
97
- usedMembers.filter((d) => d.startsWith(`${name}.`)).includes(d));
98
- const measures = (filterString ? shownMeasures : cube?.measures || [])
99
- .map((m) => m.name)
100
- .filter((m) => (mode === 'all' && isOpen) ||
101
- filterString ||
102
- showAllMembers ||
103
- usedMembers.filter((m) => m.startsWith(`${name}.`)).includes(m));
104
- const segments = (filterString ? shownSegments : cube?.segments || [])
105
- .map((s) => s.name)
106
- .filter((s) => (mode === 'all' && isOpen) || showAllMembers || query?.segments?.includes(s));
107
- if (!filterString) {
108
- query?.dimensions?.forEach((dimension) => {
109
- if (!dimensions?.includes(dimension) && dimension.startsWith(`${name}.`)) {
110
- dimensions.push(dimension);
111
- }
112
- });
113
- query?.measures?.forEach((measure) => {
114
- if (!measures?.includes(measure) && measure.startsWith(`${name}.`)) {
115
- measures.push(measure);
116
- }
117
- });
118
- query?.segments?.forEach((segment) => {
119
- if (!segments?.includes(segment) && segment.startsWith(`${name}.`)) {
120
- segments.push(segment);
121
- }
122
- });
108
+ .concat(importedDimensionsInHierarchiesNames);
109
+ const cubeMeasures = cube?.measures.map((m) => m.name) ?? [];
110
+ const cubeSegments = cube?.segments.map((s) => s.name) ?? [];
111
+ missingMembers.forEach(({ name, category }) => {
112
+ switch (category) {
113
+ case 'measures':
114
+ if (name.startsWith(`${cubeName}.`) && !cubeMeasures.includes(name)) {
115
+ cubeMeasures.push(name);
116
+ }
117
+ break;
118
+ case 'segments':
119
+ if (name.startsWith(`${cubeName}.`) && !cubeSegments.includes(name)) {
120
+ cubeSegments.push(name);
121
+ }
122
+ break;
123
+ case 'dimensions':
124
+ case 'timeDimensions':
125
+ if (name.startsWith(`${cubeName}.`) && !cubeDimensions.includes(name)) {
126
+ cubeDimensions.push(name);
127
+ }
128
+ break;
129
+ }
130
+ });
131
+ const { measures: filteredMeasures, dimensions: filteredDimensions, segments: filteredSegments, folders: filteredFolders, hierarchies: filteredHierarchies, members: filteredMembers, } = useFilteredMembers(filterString || '', {
132
+ measures: cubeMeasures.map((m) => members.measures[m] ?? { name: m, type: 'number' }),
133
+ dimensions: cubeDimensions.map((d) => members.dimensions[d] ?? { name: d }),
134
+ segments: cubeSegments.map((s) => members.segments[s] ?? { name: s }),
135
+ folders: cube?.folders ?? [],
136
+ hierarchies: cube?.hierarchies ?? [],
137
+ }, memberViewType);
138
+ const filteredDimensionNames = filteredDimensions.map((dimension) => dimension.name);
139
+ const filteredFolderNames = filteredFolders.map((folder) => folder.name);
140
+ const filteredHierarchyNames = filteredHierarchies.map((hierarchy) => hierarchy.name);
141
+ const filteredMemberNames = filteredMembers.map((member) => member.name);
142
+ function filterMembers(members) {
143
+ return members.filter((m) => (mode === 'all' && isOpen) ||
144
+ filterString ||
145
+ usedMembers.filter((m) => m.startsWith(`${cubeName}.`)).includes(m));
123
146
  }
124
- dimensions.sort();
125
- measures.sort();
126
- segments.sort();
147
+ const dimensions = filterMembers(filterString ? filteredDimensions.map((d) => d.name) : cubeDimensions);
148
+ const measures = filterMembers(filterString ? filteredMeasures.map((m) => m.name) : cubeMeasures);
149
+ const segments = filterMembers(filterString ? filteredSegments.map((s) => s.name) : cubeSegments);
127
150
  function addFilter(name) {
128
151
  filters.add({ member: name, operator: 'set' });
129
152
  }
@@ -137,104 +160,330 @@ export function SidePanelCubeItem({ isOpen, name, mode = 'all', isFiltered, isNo
137
160
  dateRanges.remove(name);
138
161
  }
139
162
  const showMembers = (isOpen || mode === 'query' || isUsed || !!filterString) && !isNonJoinable;
140
- const dimensionsSection = useMemo(() => {
141
- return showMembers && dimensions.length ? (_jsx(_Fragment, { children: dimensions.map((name) => {
142
- const item = cube?.dimensions?.find((d) => d.name === name);
143
- // @TODO: support missing dimensions
144
- if (!item || !cube) {
145
- return null;
163
+ function cacheOfMembers(members, ignore) {
164
+ return (members
165
+ ?.filter((dim) => dim.startsWith(`${cubeName}.`) || ignore?.includes(dim))
166
+ .sort()
167
+ .join() || '');
168
+ }
169
+ // Opens folders that contain specific member
170
+ const openContainingFolder = function (name) {
171
+ const foldersToOpen = folders.filter((folder) => folder.members.includes(name));
172
+ if (foldersToOpen.length) {
173
+ setOpenFolders(() => {
174
+ const newOpenFolders = [];
175
+ foldersToOpen.forEach((folder) => {
176
+ if (!newOpenFolders.includes(folder.name)) {
177
+ newOpenFolders.push(folder.name);
178
+ }
179
+ });
180
+ return newOpenFolders;
181
+ });
182
+ }
183
+ else {
184
+ setOpenFolders([]);
185
+ }
186
+ };
187
+ const toggleTimeDimension = useEvent((isOpen, name) => {
188
+ if (mode === 'query' || !!filterString) {
189
+ onMemberToggle?.(name);
190
+ if (isOpen) {
191
+ setOpenTimeDimensions([name]);
192
+ openContainingFolder(name);
193
+ setOpenHierarchies([]);
194
+ }
195
+ }
196
+ else {
197
+ if (!isOpen) {
198
+ setOpenTimeDimensions((timeDimensions) => timeDimensions.filter((f) => f !== name));
199
+ }
200
+ else {
201
+ setOpenTimeDimensions((timeDimensions) => timeDimensions.concat([name]));
202
+ }
203
+ }
204
+ });
205
+ const dimensionsElementMap = useMemo(() => {
206
+ return cubeDimensions.reduce((map, memberName) => {
207
+ const member = members.dimensions[memberName];
208
+ const timeDimension = usedGranularities.find((td) => td.dimension === memberName);
209
+ const isSelected = query?.dimensions?.includes(memberName) ?? false;
210
+ const isImported = importedDimensionsInHierarchiesNames.includes(memberName);
211
+ if (!member || !cube) {
212
+ const missingMember = missingMembers.find((m) => m.name === memberName);
213
+ if (!missingMember ||
214
+ (missingMember.category !== 'dimensions' && missingMember.category !== 'timeDimensions')) {
215
+ return map;
146
216
  }
147
- if (cube && item?.type === 'time') {
148
- return (_jsx(TimeListMember, { cube: cube, member: item, filterString: filterString, isCompact: (mode === 'query' && !showAllMembers) || !isOpen, isSelected: (granularity) => {
217
+ if (missingMember.category === 'dimensions') {
218
+ map[memberName] = (_jsx(ListMember, { cube: cube ?? { name: cubeName }, member: { name: memberName, type: undefined }, category: "dimensions", filterString: filterString, memberViewType: memberViewType, isImported: isImported, isMissing: true, isSelected: isSelected, isFiltered: usedMembersInFilters.includes(memberName), onRemoveFilter: removeFilter, onToggle: () => {
219
+ dimensionsUpdater?.toggle(memberName);
220
+ onMemberToggle?.(memberName);
221
+ } }, memberName));
222
+ }
223
+ else {
224
+ map[memberName] = (_jsx(TimeListMember, { isMissing: true, cube: cube ?? { name: cubeName }, member: { name: memberName, type: 'time' }, filterString: filterString, selectedGranularities: timeDimension?.granularities, memberViewType: memberViewType, isSelected: (granularity) => {
149
225
  if (granularity) {
150
- return (query?.timeDimensions?.some((td) => td.dimension === item.name && td.granularity === granularity) || false);
226
+ return timeDimension?.granularities.includes(granularity) ?? false;
151
227
  }
152
- return query?.dimensions?.includes(item.name) || false;
153
- }, isFiltered: query?.timeDimensions?.some((td) => td.dimension === item.name && td.dateRange) ||
154
- false, onDimensionToggle: (dimension) => {
228
+ return isSelected;
229
+ }, isFiltered: usedMembersInFilters.includes(memberName), isDateRangeFiltered: dateRanges.list.includes(memberName), onDimensionToggle: (dimension) => {
155
230
  dimensionsUpdater?.toggle(dimension);
156
231
  onMemberToggle?.(dimension);
157
232
  }, onGranularityToggle: (name, granularity) => {
158
233
  grouping.toggle(name, granularity);
159
- onMemberToggle?.(name);
160
- }, onToggleDataRange: !dateRanges.list.includes(item.name) ? addDateRange : removeDateRange }, item.name));
234
+ }, onAddDataRange: addDateRange, onRemoveDataRange: removeDateRange, onAddFilter: addFilter, onRemoveFilter: removeFilter, onToggle: toggleTimeDimension }, memberName));
161
235
  }
162
- return (_jsx(ListMember, { cube: cube, member: item, category: "dimensions", filterString: filterString, isSelected: query?.dimensions?.includes(name) || false, isFiltered: query?.filters?.some((filter) => 'member' in filter && filter.member === name) ||
163
- false, onAddFilter: addFilter, onRemoveFilter: removeFilter, onToggle: () => {
164
- dimensionsUpdater?.toggle(name);
165
- onMemberToggle?.(name);
166
- } }, name));
167
- }) })) : null;
236
+ }
237
+ else if (cube && member?.type === 'time') {
238
+ map[memberName] = (_jsx(TimeListMember, { isOpen: !filterString && mode === 'all' && openTimeDimensions.includes(memberName), cube: cube, member: member, filterString: filterString, memberViewType: memberViewType, selectedGranularities: timeDimension?.granularities, isSelected: (granularity) => {
239
+ if (granularity) {
240
+ return timeDimension?.granularities.includes(granularity) ?? false;
241
+ }
242
+ return isSelected;
243
+ }, isDateRangeFiltered: dateRanges.list.includes(memberName), isFiltered: usedMembersInFilters.includes(memberName), onDimensionToggle: (dimension) => {
244
+ dimensionsUpdater?.toggle(dimension);
245
+ onMemberToggle?.(dimension);
246
+ }, onGranularityToggle: (name, granularity) => {
247
+ grouping.toggle(name, granularity);
248
+ }, onAddDataRange: addDateRange, onRemoveDataRange: removeDateRange, onAddFilter: addFilter, onRemoveFilter: removeFilter, onToggle: toggleTimeDimension }, memberName));
249
+ }
250
+ else {
251
+ map[memberName] = (_jsx(ListMember, { cube: cube, member: member, category: "dimensions", filterString: filterString, memberViewType: memberViewType, isImported: isImported, isSelected: isSelected, isFiltered: usedMembersInFilters.includes(memberName), onAddFilter: addFilter, onRemoveFilter: removeFilter, onToggle: () => {
252
+ dimensionsUpdater?.toggle(memberName);
253
+ onMemberToggle?.(memberName);
254
+ } }, memberName));
255
+ }
256
+ return map;
257
+ }, {});
168
258
  }, [
169
- dimensions.join(','),
170
- query?.dimensions?.join(','),
171
- JSON.stringify(query?.timeDimensions),
172
- showMembers,
173
- mode,
174
- isOpen,
259
+ cacheOfMembers(query.dimensions, importedDimensionsInHierarchiesNames),
260
+ cacheOfMembers(usedMembersInFilters),
261
+ cacheOfMembers(dateRanges.list),
262
+ JSON.stringify(query.timeDimensions?.filter((dim) => dim.dimension.startsWith(`${cubeName}.`))),
175
263
  meta,
264
+ openTimeDimensions.join(),
265
+ memberViewType,
176
266
  filterString,
177
- JSON.stringify(query?.filters),
178
267
  ]);
179
- const measuresSection = useMemo(() => {
180
- return showMembers && measures.length ? (_jsx(_Fragment, { children: measures.map((name) => {
181
- const item = cube?.measures?.find((m) => m.name === name);
182
- // @TODO: support missing measures
183
- if (!item || !cube) {
184
- return null;
268
+ const toggleFolder = useEvent((isOpen, name) => {
269
+ if (mode === 'query' || !!filterString) {
270
+ onHierarchyToggle?.(cube?.name);
271
+ if (isOpen) {
272
+ setOpenFolders([name]);
273
+ setOpenTimeDimensions([]);
274
+ setOpenHierarchies([]);
275
+ }
276
+ }
277
+ else {
278
+ if (!isOpen) {
279
+ setOpenFolders((openFolders) => openFolders.filter((f) => f !== name));
280
+ }
281
+ else {
282
+ setOpenFolders((openFolders) => openFolders.concat([name]));
283
+ }
284
+ }
285
+ });
286
+ const toggleHierarchy = useEvent((isOpen, name) => {
287
+ if (mode === 'query' || !!filterString) {
288
+ onHierarchyToggle?.(cube?.name);
289
+ if (isOpen) {
290
+ setOpenHierarchies([name]);
291
+ setOpenTimeDimensions([]);
292
+ openContainingFolder(name);
293
+ }
294
+ }
295
+ else {
296
+ if (!isOpen) {
297
+ setOpenHierarchies((openHierarchies) => openHierarchies.filter((f) => f !== name));
298
+ }
299
+ else {
300
+ setOpenHierarchies((openHierarchies) => openHierarchies.concat([name]));
301
+ }
302
+ }
303
+ });
304
+ const measuresElementMap = useMemo(() => {
305
+ return cubeMeasures.reduce((map, memberName) => {
306
+ const member = cube?.measures?.find((m) => m.name === memberName);
307
+ if (!member || !cube) {
308
+ const missingMember = missingMembers.find((m) => m.name === memberName);
309
+ if (!missingMember || missingMember.category !== 'measures') {
310
+ return map;
185
311
  }
186
- return (_jsx(ListMember, { cube: cube, member: item, category: "measures", filterString: filterString, isSelected: query?.measures?.includes(name) || false, isFiltered: query?.filters?.some((filter) => 'member' in filter && filter.member === name) ||
187
- false, onAddFilter: addFilter, onRemoveFilter: removeFilter, onToggle: () => {
188
- measuresUpdater?.toggle(name);
189
- onMemberToggle?.(name);
190
- } }, name));
191
- }) })) : null;
312
+ map[memberName] = (_jsx(ListMember, { cube: cube ?? { name: cubeName }, member: { name: memberName, type: 'number' }, category: "measures", filterString: filterString, memberViewType: memberViewType, isMissing: true, isSelected: query.measures?.includes(memberName) ?? false, isFiltered: usedMembersInFilters.includes(memberName), onRemoveFilter: removeFilter, onToggle: () => {
313
+ measuresUpdater?.toggle(memberName);
314
+ onMemberToggle?.(memberName);
315
+ } }, memberName));
316
+ }
317
+ else {
318
+ map[memberName] = (_jsx(ListMember, { cube: cube, member: member, category: "measures", filterString: filterString, memberViewType: memberViewType, isSelected: query.measures?.includes(memberName) ?? false, isFiltered: usedMembersInFilters.includes(memberName), onAddFilter: addFilter, onRemoveFilter: removeFilter, onToggle: () => {
319
+ measuresUpdater?.toggle(memberName);
320
+ onMemberToggle?.(memberName);
321
+ } }, memberName));
322
+ }
323
+ return map;
324
+ }, {});
192
325
  }, [
193
- measures.join(','),
194
- query?.measures?.join(','),
195
- showMembers,
196
- filterString,
197
- mode,
326
+ cacheOfMembers(query.measures),
327
+ cacheOfMembers(usedMembersInFilters),
198
328
  meta,
199
- JSON.stringify(query?.filters),
329
+ memberViewType,
330
+ filterString,
200
331
  ]);
201
- const segmentsSection = useMemo(() => {
202
- return showMembers && segments.length ? (_jsx(_Fragment, { children: segments.map((name) => {
203
- const item = cube?.segments?.find((s) => s.name === name);
204
- if (!item || !cube) {
205
- return null;
332
+ const segmentElementMap = useMemo(() => {
333
+ return cubeSegments.reduce((map, memberName) => {
334
+ const member = cube?.segments?.find((s) => s.name === memberName);
335
+ if (!member || !cube) {
336
+ const missingMember = missingMembers.find((m) => m.name === memberName);
337
+ if (!missingMember || missingMember.category !== 'segments') {
338
+ return map;
206
339
  }
207
- return (_jsx(ListMember, { cube: cube, member: item, category: "segments", isSelected: query?.segments?.includes(name) || false, onToggle: () => {
208
- segmentsUpdater?.toggle(name);
209
- } }, name));
210
- }) })) : null;
211
- }, [segments.join(','), query?.segments?.join(','), showMembers, mode, meta]);
212
- const hasOverflow = useHasOverflow(textRef);
213
- const isAutoTitle = titleize(name) === title;
214
- const noVisibleMembers = !dimensions.length && !measures.length && !segments.length;
340
+ map[memberName] = (_jsx(ListMember, { cube: cube ?? { name: cubeName }, member: { name: memberName }, category: "segments", filterString: filterString, memberViewType: memberViewType, isMissing: true, isSelected: true, onToggle: () => {
341
+ dimensionsUpdater?.toggle(memberName);
342
+ onMemberToggle?.(memberName);
343
+ } }, memberName));
344
+ }
345
+ else {
346
+ map[memberName] = (_jsx(ListMember, { cube: cube, member: member, category: "segments", memberViewType: memberViewType, isSelected: usedMembers.includes(memberName), onToggle: () => {
347
+ segmentsUpdater?.toggle(memberName);
348
+ } }, memberName));
349
+ }
350
+ return map;
351
+ }, {});
352
+ }, [cacheOfMembers(query.segments), meta, memberViewType, filterString]);
353
+ const membersByFolderMap = folders.reduce((acc, folder) => {
354
+ acc[folder.name] = [];
355
+ acc[folder.name].push(
356
+ // sort hierarchies and dimensions together
357
+ ...[
358
+ ...hierarchyNames.filter((hierarchy) => folder.members.includes(hierarchy)),
359
+ ...dimensions.filter((dimension) => folder.members.includes(dimension)),
360
+ ].sort(sortFn), ...measures.filter((measure) => folder.members.includes(measure)), ...segments.filter((segment) => folder.members.includes(segment)));
361
+ return acc;
362
+ }, {});
363
+ membersByFolderMap[''] = [
364
+ // sort hierarchies and dimensions together
365
+ ...[
366
+ ...hierarchyNames.filter((hierarchy) => !folderMembers.includes(hierarchy)),
367
+ ...dimensions.filter((dimension) => !folderMembers.includes(dimension) && !hierarchyMembers.includes(dimension)),
368
+ ].sort(sortFn),
369
+ ...measures.filter((measure) => !folderMembers.includes(measure)),
370
+ ...segments.filter((segment) => !folderMembers.includes(segment)),
371
+ ];
372
+ // When switching between to and from search mode reset the open instances
373
+ // Leave the latest one, because that one is selected by the switch
215
374
  useEffect(() => {
216
- setShowAllMembers(false);
217
- }, [mode, filterString]);
218
- if (noVisibleMembers) {
219
- if (mode === 'query' && !isUsed) {
220
- return null;
375
+ if (openFolders.length > 1) {
376
+ setOpenFolders([openFolders.slice(-1)[0]]);
221
377
  }
222
- if (filterString && !isFiltered) {
223
- return null;
378
+ if (openHierarchies.length > 1) {
379
+ setOpenHierarchies([openHierarchies.slice(-1)[0]]);
224
380
  }
225
- }
381
+ if (openTimeDimensions.length > 1) {
382
+ setOpenTimeDimensions([openTimeDimensions.slice(-1)[0]]);
383
+ }
384
+ }, [filterString]);
385
+ useEffect(() => {
386
+ const folderNames = folders.map((folder) => folder.name);
387
+ if (mode === 'all') {
388
+ setOpenFolders(folderNames.filter((folderName) => membersByFolderMap[folderName].some((memberName) => usedMembers.includes(memberName) || usedHierarchies.includes(memberName))));
389
+ }
390
+ else {
391
+ setOpenFolders([]);
392
+ setOpenHierarchies([]);
393
+ setOpenTimeDimensions([]);
394
+ }
395
+ }, [mode]);
396
+ useEffect(() => {
397
+ if (!isOpen) {
398
+ setOpenFolders([]);
399
+ setOpenHierarchies([]);
400
+ setOpenTimeDimensions([]);
401
+ }
402
+ }, [isOpen]);
403
+ useEffect(() => {
404
+ const closeHiddenMembers = (openMembers) => {
405
+ return openMembers.filter((memberName) => {
406
+ return (
407
+ // if the hierarchy on the top level
408
+ membersByFolderMap[''].includes(memberName) ||
409
+ // or if an open folder contains it
410
+ openFolders.some((folderName) => {
411
+ return folders
412
+ .find((folder) => folder.name === folderName)
413
+ ?.members.includes(memberName);
414
+ }));
415
+ });
416
+ };
417
+ // When open folders changes, close all open hierarchies within closed folders
418
+ setOpenHierarchies(closeHiddenMembers);
419
+ // When open folders changes, close all open time dimensions within closed folders
420
+ setOpenTimeDimensions(closeHiddenMembers);
421
+ }, [openFolders]);
422
+ let mapElements = (members, skipHierarchies = false) => members
423
+ .map((memberName) => dimensionsElementMap[memberName] ??
424
+ measuresElementMap[memberName] ??
425
+ segmentElementMap[memberName] ??
426
+ (!skipHierarchies && hierarchiesElementMap[memberName]))
427
+ .filter((el) => el);
428
+ const hierarchiesElementMap = useMemo(() => {
429
+ return hierarchies.reduce((map, hierarchy) => {
430
+ const isHierarchyOpen = openHierarchies.includes(hierarchy.name);
431
+ const shownDimensions = hierarchy.levels.filter((dimensionName) =>
432
+ // Show all members if open and used ones when it's closed
433
+ !filterString
434
+ ? isHierarchyOpen || usedMembers?.includes(dimensionName)
435
+ : filteredDimensionNames.includes(dimensionName));
436
+ const children = mapElements(shownDimensions, true);
437
+ const isFiltered = filterString && filteredHierarchyNames.includes(hierarchy.name);
438
+ map[hierarchy.name] =
439
+ // That the place where we also hide the hierarchy if we show only used member
440
+ // and there are none of the inside this hierarchy
441
+ (!filterString && (mode === 'all' || shownDimensions.length) && isOpen) || isFiltered ? (_jsx(HierarchyMember, { cube: cube, isOpen: isHierarchyOpen && mode === 'all' && !filterString, member: hierarchy, memberViewType: memberViewType, filterString: filterString, onToggle: toggleHierarchy, children: children }, hierarchy.name)) : null;
442
+ return map;
443
+ }, {});
444
+ }, [
445
+ openHierarchies.join(),
446
+ dimensionsElementMap,
447
+ meta,
448
+ mode,
449
+ memberViewType,
450
+ filterString,
451
+ isOpen,
452
+ ]);
226
453
  if (filterString && isNonJoinable) {
227
454
  return null;
228
455
  }
456
+ const usedHierarchies = hierarchies
457
+ .filter((hierarchy) => {
458
+ return hierarchy.levels.find((member) => usedMembers.includes(member));
459
+ })
460
+ .map((hierarchy) => hierarchy.name);
229
461
  const memberList = (() => {
230
462
  if (showMembers) {
231
- if (!noVisibleMembers) {
232
- return (_jsxs(Space, { flow: "column", gap: "1bw", padding: "1ow 1x 0 4.5x", children: [dimensionsSection, measuresSection, segmentsSection, mode === 'query' ? (_jsx(Button, { type: "neutral", size: "small", icon: !showAllMembers ? _jsx(ArrowIcon, { direction: "bottom" }) : _jsx(ArrowIcon, { direction: "top" }), placeContent: "start", onPress: () => setShowAllMembers(!showAllMembers), children: !showAllMembers ? 'Show all members' : 'Hide unused members' })) : null] }));
463
+ if (mode === 'all' || !cube || queryStats[cubeName]?.isUsed) {
464
+ return (_jsxs(Space, { flow: "column", gap: "1bw", padding: "1ow 1ow 0 2.5x", children: [folders.map((folder) => {
465
+ const isFolderOpen = openFolders.includes(folder.name);
466
+ const shownMembers = membersByFolderMap[folder.name].filter((memberName) => !filterString
467
+ ? isFolderOpen
468
+ ? true
469
+ : usedMembers.includes(memberName) || usedHierarchies.includes(memberName)
470
+ : filteredMemberNames.includes(memberName) ||
471
+ filteredHierarchyNames.includes(memberName));
472
+ const children = mapElements(shownMembers);
473
+ return (!filterString
474
+ ? (mode === 'all' || shownMembers.length) && isOpen
475
+ : filteredFolderNames.includes(folder.name)) ? (_jsx(Folder, { name: folder.name, isOpen: !filterString && mode === 'all' && isFolderOpen, filterString: filterString, onToggle: toggleFolder, children: children }, folder.name)) : null;
476
+ }), mapElements(membersByFolderMap[''].filter((memberName) => !filterString
477
+ ? mode === 'all' ||
478
+ usedMembers.includes(memberName) ||
479
+ usedHierarchies.includes(memberName)
480
+ : filteredMemberNames.includes(memberName) ||
481
+ filteredHierarchyNames.includes(memberName))), mode === 'query' && !isMissing && onToggle && queryStats[cube?.name]?.isUsed ? (_jsx(Button, { type: "neutral", size: "small", icon: _jsx(ChevronIcon, { direction: "bottom" }), placeContent: "start", onPress: () => onToggle(true), children: "Show all members" })) : null] }));
233
482
  }
234
483
  else if (filterString) {
235
484
  return null;
236
485
  }
237
- else if (isOpen || mode === 'query') {
486
+ else if (isOpen) {
238
487
  return (_jsxs(Block, { padding: ".5x 0 .5x 4.5x", children: ["No members", mode === 'query' ? ' selected' : ''] }));
239
488
  }
240
489
  }
@@ -242,13 +491,14 @@ export function SidePanelCubeItem({ isOpen, name, mode = 'all', isFiltered, isNo
242
491
  return null;
243
492
  }
244
493
  })();
494
+ const isLocked = isOpen && type === 'view' && !isQueryEmpty;
245
495
  const isCollapsable = isNonJoinable || !!filterString;
246
- const cubeButton = (_jsxs(CubeButton, { qaVal: name, icon: isMissing ? (_jsx(QuestionCircleOutlined, { style: { color: 'var(--danger-text-color)' } })) : type === 'cube' ? (_jsx(CubeIcon, { color: "#purple" })) : (_jsx(ViewIcon, { color: "#purple" })), rightIcon: mode === 'all' && !isNonJoinable ? (_jsx(ArrowIconWrapper, { children: _jsx(ArrowIcon, { direction: !isCollapsable ? (isOpen ? 'top' : 'bottom') : 'right', style: { color: 'var(--purple-color)' } }) })) : isNonJoinable ? (_jsx(ArrowIconWrapper, {})) : undefined, mods: {
496
+ const cubeButton = (_jsxs(CubeButton, { qaVal: cubeName, icon: type === 'cube' ? (_jsx(CubeIcon, { color: isMissing ? '#danger-text' : '#purple' })) : (_jsx(ViewIcon, { color: isMissing ? '#danger-text' : '#purple' })), rightIcon: mode === 'all' && !isNonJoinable && !isLocked ? (_jsx(ArrowIconWrapper, { children: _jsx(ChevronIcon, { direction: !isCollapsable ? (isOpen ? 'top' : 'bottom') : 'right', style: { color: 'var(--purple-color)' } }) })) : undefined, mods: {
247
497
  open: isOpen,
248
498
  joinable: !isNonJoinable,
249
499
  missing: isMissing,
250
500
  collapsable: isCollapsable,
251
- }, flow: "column", placeContent: "space-between", onPress: () => !isMissing && !isNonJoinable && onToggle?.(!isOpen), children: [_jsx(Text, { ref: textRef, ellipsis: true, children: filterString ? _jsx(FilteredLabel, { text: name, filter: filterString }) : name }), description ? _jsx(ItemInfoIcon, { title: title, description: description }) : undefined, isPrivate ? _jsx(NonPublicIcon, { type: "cube" }) : undefined] }));
252
- return (_jsxs(Space, { flow: "column", gap: "0", children: [_jsx(CubeWrapper, { children: hasOverflow || !isAutoTitle ? (_jsx(TooltipProvider, { delay: 1000, title: _jsxs(_Fragment, { children: [_jsx(Text, { preset: "t4", children: _jsx("b", { children: name }) }), _jsx("br", {}), _jsx(Text, { preset: "t4", children: title })] }), placement: "right", children: cubeButton })) : (cubeButton) }), memberList] }));
501
+ }, flow: "column", placeContent: "space-between", onPress: () => !isMissing && !isNonJoinable && !isLocked && onToggle?.(!isOpen), children: [_jsx(Text, { ref: textRef, ellipsis: true, children: filterString ? _jsx(FilteredLabel, { text: shownName, filter: filterString }) : shownName }), _jsxs(Space, { padding: ".5x right", children: [description ? _jsx(ItemInfoIcon, { description: description }) : undefined, isPrivate ? _jsx(NonPublicIcon, { type: "cube" }) : undefined] })] }));
502
+ return (_jsxs(Space, { flow: "column", gap: "0", children: [_jsx(CubeWrapper, { children: _jsx(InstanceTooltipProvider, { name: cubeName, title: title, overflowRef: textRef, children: cubeButton }) }), memberList] }));
253
503
  }
254
504
  //# sourceMappingURL=SidePanelCubeItem.js.map