@finos/legend-cube-builder 0.0.0-stage → 0.0.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 (379) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +64 -2
  3. package/docs/adding-an-operation.md +92 -0
  4. package/docs/hosting.md +79 -0
  5. package/docs/testing.md +83 -0
  6. package/lib/__lib__/LegendCubeCommand.d.ts +26 -0
  7. package/lib/__lib__/LegendCubeCommand.d.ts.map +1 -0
  8. package/lib/__lib__/LegendCubeCommand.js +40 -0
  9. package/lib/__lib__/LegendCubeCommand.js.map +1 -0
  10. package/lib/__lib__/LegendCubeHelpText.d.ts +19 -0
  11. package/lib/__lib__/LegendCubeHelpText.d.ts.map +1 -0
  12. package/lib/__lib__/LegendCubeHelpText.js +35 -0
  13. package/lib/__lib__/LegendCubeHelpText.js.map +1 -0
  14. package/lib/__lib__/LegendCubeLabels.d.ts +87 -0
  15. package/lib/__lib__/LegendCubeLabels.d.ts.map +1 -0
  16. package/lib/__lib__/LegendCubeLabels.js +128 -0
  17. package/lib/__lib__/LegendCubeLabels.js.map +1 -0
  18. package/lib/__lib__/LegendCubeTesting.d.ts +33 -0
  19. package/lib/__lib__/LegendCubeTesting.d.ts.map +1 -0
  20. package/lib/__lib__/LegendCubeTesting.js +34 -0
  21. package/lib/__lib__/LegendCubeTesting.js.map +1 -0
  22. package/lib/__test-utils__/CubeCanvasTestUtils.d.ts +24 -0
  23. package/lib/__test-utils__/CubeCanvasTestUtils.d.ts.map +1 -0
  24. package/lib/__test-utils__/CubeCanvasTestUtils.js +37 -0
  25. package/lib/__test-utils__/CubeCanvasTestUtils.js.map +1 -0
  26. package/lib/__test-utils__/CubeEngineTestSupport.d.ts +47 -0
  27. package/lib/__test-utils__/CubeEngineTestSupport.d.ts.map +1 -0
  28. package/lib/__test-utils__/CubeEngineTestSupport.js +106 -0
  29. package/lib/__test-utils__/CubeEngineTestSupport.js.map +1 -0
  30. package/lib/__test-utils__/CubeNorthwindTestQueries.d.ts +31 -0
  31. package/lib/__test-utils__/CubeNorthwindTestQueries.d.ts.map +1 -0
  32. package/lib/__test-utils__/CubeNorthwindTestQueries.js +102 -0
  33. package/lib/__test-utils__/CubeNorthwindTestQueries.js.map +1 -0
  34. package/lib/__test-utils__/CubeOperationsTestUtils.d.ts +42 -0
  35. package/lib/__test-utils__/CubeOperationsTestUtils.d.ts.map +1 -0
  36. package/lib/__test-utils__/CubeOperationsTestUtils.js +92 -0
  37. package/lib/__test-utils__/CubeOperationsTestUtils.js.map +1 -0
  38. package/lib/__test-utils__/CubePageTestUtils.d.ts +33 -0
  39. package/lib/__test-utils__/CubePageTestUtils.d.ts.map +1 -0
  40. package/lib/__test-utils__/CubePageTestUtils.js +68 -0
  41. package/lib/__test-utils__/CubePageTestUtils.js.map +1 -0
  42. package/lib/__test-utils__/CubeTestApplication.d.ts +30 -0
  43. package/lib/__test-utils__/CubeTestApplication.d.ts.map +1 -0
  44. package/lib/__test-utils__/CubeTestApplication.js +57 -0
  45. package/lib/__test-utils__/CubeTestApplication.js.map +1 -0
  46. package/lib/__test-utils__/FakeCubeEngine.d.ts +41 -0
  47. package/lib/__test-utils__/FakeCubeEngine.d.ts.map +1 -0
  48. package/lib/__test-utils__/FakeCubeEngine.js +91 -0
  49. package/lib/__test-utils__/FakeCubeEngine.js.map +1 -0
  50. package/lib/components/CubeButton.d.ts +20 -0
  51. package/lib/components/CubeButton.d.ts.map +1 -0
  52. package/lib/components/CubeButton.js +24 -0
  53. package/lib/components/CubeButton.js.map +1 -0
  54. package/lib/components/CubeEditor.d.ts +31 -0
  55. package/lib/components/CubeEditor.d.ts.map +1 -0
  56. package/lib/components/CubeEditor.js +90 -0
  57. package/lib/components/CubeEditor.js.map +1 -0
  58. package/lib/components/CubeNodeIcon.d.ts +23 -0
  59. package/lib/components/CubeNodeIcon.d.ts.map +1 -0
  60. package/lib/components/CubeNodeIcon.js +42 -0
  61. package/lib/components/CubeNodeIcon.js.map +1 -0
  62. package/lib/components/canvas/CubeCanvas.d.ts +37 -0
  63. package/lib/components/canvas/CubeCanvas.d.ts.map +1 -0
  64. package/lib/components/canvas/CubeCanvas.js +137 -0
  65. package/lib/components/canvas/CubeCanvas.js.map +1 -0
  66. package/lib/components/canvas/CubeCanvasContext.d.ts +19 -0
  67. package/lib/components/canvas/CubeCanvasContext.d.ts.map +1 -0
  68. package/lib/components/canvas/CubeCanvasContext.js +22 -0
  69. package/lib/components/canvas/CubeCanvasContext.js.map +1 -0
  70. package/lib/components/canvas/CubeCanvasContextMenu.d.ts +28 -0
  71. package/lib/components/canvas/CubeCanvasContextMenu.d.ts.map +1 -0
  72. package/lib/components/canvas/CubeCanvasContextMenu.js +35 -0
  73. package/lib/components/canvas/CubeCanvasContextMenu.js.map +1 -0
  74. package/lib/components/canvas/CubeCanvasDnd.d.ts +43 -0
  75. package/lib/components/canvas/CubeCanvasDnd.d.ts.map +1 -0
  76. package/lib/components/canvas/CubeCanvasDnd.js +51 -0
  77. package/lib/components/canvas/CubeCanvasDnd.js.map +1 -0
  78. package/lib/components/canvas/CubeCanvasEdge.d.ts +24 -0
  79. package/lib/components/canvas/CubeCanvasEdge.d.ts.map +1 -0
  80. package/lib/components/canvas/CubeCanvasEdge.js +33 -0
  81. package/lib/components/canvas/CubeCanvasEdge.js.map +1 -0
  82. package/lib/components/canvas/CubeCanvasElements.d.ts +66 -0
  83. package/lib/components/canvas/CubeCanvasElements.d.ts.map +1 -0
  84. package/lib/components/canvas/CubeCanvasElements.js +97 -0
  85. package/lib/components/canvas/CubeCanvasElements.js.map +1 -0
  86. package/lib/components/canvas/CubeCanvasLayout.d.ts +32 -0
  87. package/lib/components/canvas/CubeCanvasLayout.d.ts.map +1 -0
  88. package/lib/components/canvas/CubeCanvasLayout.js +63 -0
  89. package/lib/components/canvas/CubeCanvasLayout.js.map +1 -0
  90. package/lib/components/canvas/CubeCanvasNode.d.ts +29 -0
  91. package/lib/components/canvas/CubeCanvasNode.d.ts.map +1 -0
  92. package/lib/components/canvas/CubeCanvasNode.js +75 -0
  93. package/lib/components/canvas/CubeCanvasNode.js.map +1 -0
  94. package/lib/components/editors/CubeColumnPicker.d.ts +47 -0
  95. package/lib/components/editors/CubeColumnPicker.d.ts.map +1 -0
  96. package/lib/components/editors/CubeColumnPicker.js +56 -0
  97. package/lib/components/editors/CubeColumnPicker.js.map +1 -0
  98. package/lib/components/editors/CubeDistinctEditor.d.ts +23 -0
  99. package/lib/components/editors/CubeDistinctEditor.d.ts.map +1 -0
  100. package/lib/components/editors/CubeDistinctEditor.js +24 -0
  101. package/lib/components/editors/CubeDistinctEditor.js.map +1 -0
  102. package/lib/components/editors/CubeFilterEditor.d.ts +26 -0
  103. package/lib/components/editors/CubeFilterEditor.d.ts.map +1 -0
  104. package/lib/components/editors/CubeFilterEditor.js +90 -0
  105. package/lib/components/editors/CubeFilterEditor.js.map +1 -0
  106. package/lib/components/editors/CubeIntegerField.d.ts +29 -0
  107. package/lib/components/editors/CubeIntegerField.d.ts.map +1 -0
  108. package/lib/components/editors/CubeIntegerField.js +30 -0
  109. package/lib/components/editors/CubeIntegerField.js.map +1 -0
  110. package/lib/components/editors/CubeJoinEditor.d.ts +26 -0
  111. package/lib/components/editors/CubeJoinEditor.d.ts.map +1 -0
  112. package/lib/components/editors/CubeJoinEditor.js +84 -0
  113. package/lib/components/editors/CubeJoinEditor.js.map +1 -0
  114. package/lib/components/editors/CubeNodeEditorPanel.d.ts +29 -0
  115. package/lib/components/editors/CubeNodeEditorPanel.d.ts.map +1 -0
  116. package/lib/components/editors/CubeNodeEditorPanel.js +72 -0
  117. package/lib/components/editors/CubeNodeEditorPanel.js.map +1 -0
  118. package/lib/components/editors/CubeNodeEditorRegistry.d.ts +44 -0
  119. package/lib/components/editors/CubeNodeEditorRegistry.d.ts.map +1 -0
  120. package/lib/components/editors/CubeNodeEditorRegistry.js +43 -0
  121. package/lib/components/editors/CubeNodeEditorRegistry.js.map +1 -0
  122. package/lib/components/editors/CubeRenameEditor.d.ts +26 -0
  123. package/lib/components/editors/CubeRenameEditor.d.ts.map +1 -0
  124. package/lib/components/editors/CubeRenameEditor.js +58 -0
  125. package/lib/components/editors/CubeRenameEditor.js.map +1 -0
  126. package/lib/components/editors/CubeRestrictEditor.d.ts +26 -0
  127. package/lib/components/editors/CubeRestrictEditor.d.ts.map +1 -0
  128. package/lib/components/editors/CubeRestrictEditor.js +23 -0
  129. package/lib/components/editors/CubeRestrictEditor.js.map +1 -0
  130. package/lib/components/editors/CubeRowCountEditor.d.ts +25 -0
  131. package/lib/components/editors/CubeRowCountEditor.d.ts.map +1 -0
  132. package/lib/components/editors/CubeRowCountEditor.js +38 -0
  133. package/lib/components/editors/CubeRowCountEditor.js.map +1 -0
  134. package/lib/components/editors/CubeSliceEditor.d.ts +25 -0
  135. package/lib/components/editors/CubeSliceEditor.d.ts.map +1 -0
  136. package/lib/components/editors/CubeSliceEditor.js +40 -0
  137. package/lib/components/editors/CubeSliceEditor.js.map +1 -0
  138. package/lib/components/editors/CubeSortEditor.d.ts +27 -0
  139. package/lib/components/editors/CubeSortEditor.d.ts.map +1 -0
  140. package/lib/components/editors/CubeSortEditor.js +72 -0
  141. package/lib/components/editors/CubeSortEditor.js.map +1 -0
  142. package/lib/components/editors/CubeSourceEditor.d.ts +25 -0
  143. package/lib/components/editors/CubeSourceEditor.d.ts.map +1 -0
  144. package/lib/components/editors/CubeSourceEditor.js +41 -0
  145. package/lib/components/editors/CubeSourceEditor.js.map +1 -0
  146. package/lib/components/editors/CubeValueEditor.d.ts +40 -0
  147. package/lib/components/editors/CubeValueEditor.d.ts.map +1 -0
  148. package/lib/components/editors/CubeValueEditor.js +178 -0
  149. package/lib/components/editors/CubeValueEditor.js.map +1 -0
  150. package/lib/components/grid/CubeGridRegion.d.ts +23 -0
  151. package/lib/components/grid/CubeGridRegion.d.ts.map +1 -0
  152. package/lib/components/grid/CubeGridRegion.js +94 -0
  153. package/lib/components/grid/CubeGridRegion.js.map +1 -0
  154. package/lib/components/grid/CubeGridValues.d.ts +25 -0
  155. package/lib/components/grid/CubeGridValues.d.ts.map +1 -0
  156. package/lib/components/grid/CubeGridValues.js +95 -0
  157. package/lib/components/grid/CubeGridValues.js.map +1 -0
  158. package/lib/components/grid/CubeResultGrid.d.ts +39 -0
  159. package/lib/components/grid/CubeResultGrid.d.ts.map +1 -0
  160. package/lib/components/grid/CubeResultGrid.js +86 -0
  161. package/lib/components/grid/CubeResultGrid.js.map +1 -0
  162. package/lib/components/palette/CubePalette.d.ts +29 -0
  163. package/lib/components/palette/CubePalette.d.ts.map +1 -0
  164. package/lib/components/palette/CubePalette.js +73 -0
  165. package/lib/components/palette/CubePalette.js.map +1 -0
  166. package/lib/components/show-pure/CubeShowPureDialog.d.ts +23 -0
  167. package/lib/components/show-pure/CubeShowPureDialog.d.ts.map +1 -0
  168. package/lib/components/show-pure/CubeShowPureDialog.js +37 -0
  169. package/lib/components/show-pure/CubeShowPureDialog.js.map +1 -0
  170. package/lib/components/source-picker/CubeSourcePicker.d.ts +22 -0
  171. package/lib/components/source-picker/CubeSourcePicker.d.ts.map +1 -0
  172. package/lib/components/source-picker/CubeSourcePicker.js +89 -0
  173. package/lib/components/source-picker/CubeSourcePicker.js.map +1 -0
  174. package/lib/components/spec-transfer/CubeSpecTransferDialog.d.ts +26 -0
  175. package/lib/components/spec-transfer/CubeSpecTransferDialog.d.ts.map +1 -0
  176. package/lib/components/spec-transfer/CubeSpecTransferDialog.js +45 -0
  177. package/lib/components/spec-transfer/CubeSpecTransferDialog.js.map +1 -0
  178. package/lib/graph-manager/CubeEngine.d.ts +128 -0
  179. package/lib/graph-manager/CubeEngine.d.ts.map +1 -0
  180. package/lib/graph-manager/CubeEngine.js +61 -0
  181. package/lib/graph-manager/CubeEngine.js.map +1 -0
  182. package/lib/graph-manager/CubeModelOutlineHelper.d.ts +33 -0
  183. package/lib/graph-manager/CubeModelOutlineHelper.d.ts.map +1 -0
  184. package/lib/graph-manager/CubeModelOutlineHelper.js +45 -0
  185. package/lib/graph-manager/CubeModelOutlineHelper.js.map +1 -0
  186. package/lib/graph-manager/protocol/pure/CubeEngineBuilder.d.ts +26 -0
  187. package/lib/graph-manager/protocol/pure/CubeEngineBuilder.d.ts.map +1 -0
  188. package/lib/graph-manager/protocol/pure/CubeEngineBuilder.js +22 -0
  189. package/lib/graph-manager/protocol/pure/CubeEngineBuilder.js.map +1 -0
  190. package/lib/graph-manager/protocol/pure/v1/V1_CubeEngineErrors.d.ts +27 -0
  191. package/lib/graph-manager/protocol/pure/v1/V1_CubeEngineErrors.d.ts.map +1 -0
  192. package/lib/graph-manager/protocol/pure/v1/V1_CubeEngineErrors.js +76 -0
  193. package/lib/graph-manager/protocol/pure/v1/V1_CubeEngineErrors.js.map +1 -0
  194. package/lib/graph-manager/protocol/pure/v1/V1_CubeExecutionResultReader.d.ts +27 -0
  195. package/lib/graph-manager/protocol/pure/v1/V1_CubeExecutionResultReader.d.ts.map +1 -0
  196. package/lib/graph-manager/protocol/pure/v1/V1_CubeExecutionResultReader.js +82 -0
  197. package/lib/graph-manager/protocol/pure/v1/V1_CubeExecutionResultReader.js.map +1 -0
  198. package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.d.ts +32 -0
  199. package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.d.ts.map +1 -0
  200. package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.js +195 -0
  201. package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.js.map +1 -0
  202. package/lib/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.d.ts +20 -0
  203. package/lib/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.d.ts.map +1 -0
  204. package/lib/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.js +174 -0
  205. package/lib/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.js.map +1 -0
  206. package/lib/graph-manager/protocol/pure/v1/V1_CubeRelationTypeAdapter.d.ts +24 -0
  207. package/lib/graph-manager/protocol/pure/v1/V1_CubeRelationTypeAdapter.d.ts.map +1 -0
  208. package/lib/graph-manager/protocol/pure/v1/V1_CubeRelationTypeAdapter.js +43 -0
  209. package/lib/graph-manager/protocol/pure/v1/V1_CubeRelationTypeAdapter.js.map +1 -0
  210. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.d.ts +45 -0
  211. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.d.ts.map +1 -0
  212. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.js +171 -0
  213. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.js.map +1 -0
  214. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.d.ts +22 -0
  215. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.d.ts.map +1 -0
  216. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.js +79 -0
  217. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.js.map +1 -0
  218. package/lib/index.css +17 -0
  219. package/lib/index.css.map +1 -0
  220. package/lib/index.d.ts +25 -0
  221. package/lib/index.d.ts.map +1 -0
  222. package/lib/index.js +24 -0
  223. package/lib/index.js.map +1 -0
  224. package/lib/stores/CubeEditorState.d.ts +236 -0
  225. package/lib/stores/CubeEditorState.d.ts.map +1 -0
  226. package/lib/stores/CubeEditorState.js +632 -0
  227. package/lib/stores/CubeEditorState.js.map +1 -0
  228. package/lib/stores/CubeExecutionState.d.ts +67 -0
  229. package/lib/stores/CubeExecutionState.d.ts.map +1 -0
  230. package/lib/stores/CubeExecutionState.js +212 -0
  231. package/lib/stores/CubeExecutionState.js.map +1 -0
  232. package/lib/stores/CubeGridQuickActions.d.ts +40 -0
  233. package/lib/stores/CubeGridQuickActions.d.ts.map +1 -0
  234. package/lib/stores/CubeGridQuickActions.js +86 -0
  235. package/lib/stores/CubeGridQuickActions.js.map +1 -0
  236. package/lib/stores/CubeHost.d.ts +31 -0
  237. package/lib/stores/CubeHost.d.ts.map +1 -0
  238. package/lib/stores/CubeHost.js +17 -0
  239. package/lib/stores/CubeHost.js.map +1 -0
  240. package/lib/stores/CubeNodeEditorState.d.ts +103 -0
  241. package/lib/stores/CubeNodeEditorState.d.ts.map +1 -0
  242. package/lib/stores/CubeNodeEditorState.js +262 -0
  243. package/lib/stores/CubeNodeEditorState.js.map +1 -0
  244. package/lib/stores/CubeShowPureState.d.ts +41 -0
  245. package/lib/stores/CubeShowPureState.d.ts.map +1 -0
  246. package/lib/stores/CubeShowPureState.js +100 -0
  247. package/lib/stores/CubeShowPureState.js.map +1 -0
  248. package/lib/stores/CubeSourcePickerState.d.ts +98 -0
  249. package/lib/stores/CubeSourcePickerState.d.ts.map +1 -0
  250. package/lib/stores/CubeSourcePickerState.js +334 -0
  251. package/lib/stores/CubeSourcePickerState.js.map +1 -0
  252. package/lib/stores/CubeSpecTransferState.d.ts +60 -0
  253. package/lib/stores/CubeSpecTransferState.d.ts.map +1 -0
  254. package/lib/stores/CubeSpecTransferState.js +167 -0
  255. package/lib/stores/CubeSpecTransferState.js.map +1 -0
  256. package/lib/stores/LocalModelCatalog.d.ts +37 -0
  257. package/lib/stores/LocalModelCatalog.d.ts.map +1 -0
  258. package/lib/stores/LocalModelCatalog.js +49 -0
  259. package/lib/stores/LocalModelCatalog.js.map +1 -0
  260. package/lib/stores/editors/CubeFilterDraft.d.ts +61 -0
  261. package/lib/stores/editors/CubeFilterDraft.d.ts.map +1 -0
  262. package/lib/stores/editors/CubeFilterDraft.js +186 -0
  263. package/lib/stores/editors/CubeFilterDraft.js.map +1 -0
  264. package/lib/stores/editors/CubeIntegerText.d.ts +24 -0
  265. package/lib/stores/editors/CubeIntegerText.d.ts.map +1 -0
  266. package/lib/stores/editors/CubeIntegerText.js +33 -0
  267. package/lib/stores/editors/CubeIntegerText.js.map +1 -0
  268. package/lib/stores/editors/CubeJoinDraft.d.ts +71 -0
  269. package/lib/stores/editors/CubeJoinDraft.d.ts.map +1 -0
  270. package/lib/stores/editors/CubeJoinDraft.js +145 -0
  271. package/lib/stores/editors/CubeJoinDraft.js.map +1 -0
  272. package/lib/stores/editors/CubeNodeDraft.d.ts +38 -0
  273. package/lib/stores/editors/CubeNodeDraft.d.ts.map +1 -0
  274. package/lib/stores/editors/CubeNodeDraft.js +35 -0
  275. package/lib/stores/editors/CubeNodeDraft.js.map +1 -0
  276. package/lib/stores/editors/CubeNodeDraftRegistry.d.ts +35 -0
  277. package/lib/stores/editors/CubeNodeDraftRegistry.d.ts.map +1 -0
  278. package/lib/stores/editors/CubeNodeDraftRegistry.js +55 -0
  279. package/lib/stores/editors/CubeNodeDraftRegistry.js.map +1 -0
  280. package/lib/stores/editors/CubeRenameDraft.d.ts +44 -0
  281. package/lib/stores/editors/CubeRenameDraft.d.ts.map +1 -0
  282. package/lib/stores/editors/CubeRenameDraft.js +79 -0
  283. package/lib/stores/editors/CubeRenameDraft.js.map +1 -0
  284. package/lib/stores/editors/CubeRestrictDraft.d.ts +37 -0
  285. package/lib/stores/editors/CubeRestrictDraft.d.ts.map +1 -0
  286. package/lib/stores/editors/CubeRestrictDraft.js +73 -0
  287. package/lib/stores/editors/CubeRestrictDraft.js.map +1 -0
  288. package/lib/stores/editors/CubeRowCountDraft.d.ts +42 -0
  289. package/lib/stores/editors/CubeRowCountDraft.d.ts.map +1 -0
  290. package/lib/stores/editors/CubeRowCountDraft.js +55 -0
  291. package/lib/stores/editors/CubeRowCountDraft.js.map +1 -0
  292. package/lib/stores/editors/CubeSliceDraft.d.ts +42 -0
  293. package/lib/stores/editors/CubeSliceDraft.d.ts.map +1 -0
  294. package/lib/stores/editors/CubeSliceDraft.js +72 -0
  295. package/lib/stores/editors/CubeSliceDraft.js.map +1 -0
  296. package/lib/stores/editors/CubeSortDraft.d.ts +49 -0
  297. package/lib/stores/editors/CubeSortDraft.d.ts.map +1 -0
  298. package/lib/stores/editors/CubeSortDraft.js +99 -0
  299. package/lib/stores/editors/CubeSortDraft.js.map +1 -0
  300. package/lib/stores/fixtures/CubeNorthwindModel.d.ts +23 -0
  301. package/lib/stores/fixtures/CubeNorthwindModel.d.ts.map +1 -0
  302. package/lib/stores/fixtures/CubeNorthwindModel.js +338 -0
  303. package/lib/stores/fixtures/CubeNorthwindModel.js.map +1 -0
  304. package/package.json +81 -3
  305. package/src/__lib__/LegendCubeCommand.ts +44 -0
  306. package/src/__lib__/LegendCubeHelpText.ts +58 -0
  307. package/src/__lib__/LegendCubeLabels.ts +171 -0
  308. package/src/__lib__/LegendCubeTesting.ts +33 -0
  309. package/src/__test-utils__/CubeCanvasTestUtils.ts +53 -0
  310. package/src/__test-utils__/CubeEngineTestSupport.ts +172 -0
  311. package/src/__test-utils__/CubeNorthwindTestQueries.ts +165 -0
  312. package/src/__test-utils__/CubeOperationsTestUtils.ts +177 -0
  313. package/src/__test-utils__/CubePageTestUtils.tsx +96 -0
  314. package/src/__test-utils__/CubeTestApplication.ts +82 -0
  315. package/src/__test-utils__/FakeCubeEngine.ts +145 -0
  316. package/src/components/CubeButton.tsx +35 -0
  317. package/src/components/CubeEditor.tsx +239 -0
  318. package/src/components/CubeNodeIcon.tsx +64 -0
  319. package/src/components/canvas/CubeCanvas.tsx +262 -0
  320. package/src/components/canvas/CubeCanvasContext.ts +31 -0
  321. package/src/components/canvas/CubeCanvasContextMenu.tsx +89 -0
  322. package/src/components/canvas/CubeCanvasDnd.ts +82 -0
  323. package/src/components/canvas/CubeCanvasEdge.tsx +57 -0
  324. package/src/components/canvas/CubeCanvasElements.ts +153 -0
  325. package/src/components/canvas/CubeCanvasLayout.ts +88 -0
  326. package/src/components/canvas/CubeCanvasNode.tsx +149 -0
  327. package/src/components/editors/CubeColumnPicker.tsx +138 -0
  328. package/src/components/editors/CubeDistinctEditor.tsx +28 -0
  329. package/src/components/editors/CubeFilterEditor.tsx +309 -0
  330. package/src/components/editors/CubeIntegerField.tsx +51 -0
  331. package/src/components/editors/CubeJoinEditor.tsx +247 -0
  332. package/src/components/editors/CubeNodeEditorPanel.tsx +215 -0
  333. package/src/components/editors/CubeNodeEditorRegistry.ts +81 -0
  334. package/src/components/editors/CubeRenameEditor.tsx +143 -0
  335. package/src/components/editors/CubeRestrictEditor.tsx +103 -0
  336. package/src/components/editors/CubeRowCountEditor.tsx +53 -0
  337. package/src/components/editors/CubeSliceEditor.tsx +69 -0
  338. package/src/components/editors/CubeSortEditor.tsx +206 -0
  339. package/src/components/editors/CubeSourceEditor.tsx +106 -0
  340. package/src/components/editors/CubeValueEditor.tsx +333 -0
  341. package/src/components/grid/CubeGridRegion.tsx +275 -0
  342. package/src/components/grid/CubeGridValues.ts +125 -0
  343. package/src/components/grid/CubeResultGrid.tsx +138 -0
  344. package/src/components/palette/CubePalette.tsx +177 -0
  345. package/src/components/show-pure/CubeShowPureDialog.tsx +101 -0
  346. package/src/components/source-picker/CubeSourcePicker.tsx +304 -0
  347. package/src/components/spec-transfer/CubeSpecTransferDialog.tsx +157 -0
  348. package/src/graph-manager/CubeEngine.ts +169 -0
  349. package/src/graph-manager/CubeModelOutlineHelper.ts +58 -0
  350. package/src/graph-manager/protocol/pure/CubeEngineBuilder.ts +34 -0
  351. package/src/graph-manager/protocol/pure/v1/V1_CubeEngineErrors.ts +109 -0
  352. package/src/graph-manager/protocol/pure/v1/V1_CubeExecutionResultReader.ts +115 -0
  353. package/src/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.ts +257 -0
  354. package/src/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.ts +243 -0
  355. package/src/graph-manager/protocol/pure/v1/V1_CubeRelationTypeAdapter.ts +58 -0
  356. package/src/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.ts +278 -0
  357. package/src/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.ts +127 -0
  358. package/src/index.ts +41 -0
  359. package/src/stores/CubeEditorState.ts +807 -0
  360. package/src/stores/CubeExecutionState.ts +288 -0
  361. package/src/stores/CubeGridQuickActions.ts +129 -0
  362. package/src/stores/CubeHost.ts +32 -0
  363. package/src/stores/CubeNodeEditorState.ts +324 -0
  364. package/src/stores/CubeShowPureState.ts +118 -0
  365. package/src/stores/CubeSourcePickerState.ts +426 -0
  366. package/src/stores/CubeSpecTransferState.ts +198 -0
  367. package/src/stores/LocalModelCatalog.ts +70 -0
  368. package/src/stores/editors/CubeFilterDraft.ts +241 -0
  369. package/src/stores/editors/CubeIntegerText.ts +34 -0
  370. package/src/stores/editors/CubeJoinDraft.ts +224 -0
  371. package/src/stores/editors/CubeNodeDraft.ts +46 -0
  372. package/src/stores/editors/CubeNodeDraftRegistry.ts +83 -0
  373. package/src/stores/editors/CubeRenameDraft.ts +110 -0
  374. package/src/stores/editors/CubeRestrictDraft.ts +83 -0
  375. package/src/stores/editors/CubeRowCountDraft.ts +69 -0
  376. package/src/stores/editors/CubeSliceDraft.ts +87 -0
  377. package/src/stores/editors/CubeSortDraft.ts +135 -0
  378. package/src/stores/fixtures/CubeNorthwindModel.ts +355 -0
  379. package/tsconfig.json +133 -0
@@ -0,0 +1,177 @@
1
+ /**
2
+ * Copyright (c) 2026-present, Goldman Sachs
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import { ChevronLeftIcon, ChevronRightIcon, clsx } from '@finos/legend-art';
18
+ import type { AnyNodeDefinition } from '@finos/legend-cube';
19
+ import { observer } from 'mobx-react-lite';
20
+ import { useRef } from 'react';
21
+ import { useDrag } from 'react-dnd';
22
+ import { READ_ONLY_CUBE_TITLE } from '../../__lib__/LegendCubeLabels.js';
23
+ import { LEGEND_CUBE_TEST_ID } from '../../__lib__/LegendCubeTesting.js';
24
+ import type { CubeEditorState } from '../../stores/CubeEditorState.js';
25
+ import {
26
+ CUBE_DND_TYPE,
27
+ type CubePaletteDragItem,
28
+ } from '../canvas/CubeCanvasDnd.js';
29
+ import { CubeNodeIcon } from '../CubeNodeIcon.js';
30
+
31
+ /** Shown in the palette while the cube has no node yet (spec §17.2, worded for the canvas) */
32
+ export const PALETTE_EMPTY_HINT = 'Drag items onto the canvas.';
33
+
34
+ /** What an item does, for its tooltip */
35
+ const describeItem = (definition: AnyNodeDefinition): string =>
36
+ definition.kind === 'source'
37
+ ? 'Click, or drop it on the canvas, to pick a table'
38
+ : 'Drag it onto a node to add it after that node, or onto the canvas to add it on its own; click to add it on its own';
39
+
40
+ const CubePaletteItem = observer(
41
+ (props: {
42
+ editorState: CubeEditorState;
43
+ definition: AnyNodeDefinition;
44
+ collapsed: boolean;
45
+ }) => {
46
+ const { editorState, definition, collapsed } = props;
47
+ const { readOnly } = editorState;
48
+ const ref = useRef<HTMLDivElement>(null);
49
+ const [, dragConnector] = useDrag<CubePaletteDragItem>(
50
+ () => ({
51
+ type: CUBE_DND_TYPE.PALETTE_ITEM,
52
+ item: { nodeType: definition.type },
53
+ canDrag: () => !editorState.readOnly,
54
+ }),
55
+ [editorState, definition.type],
56
+ );
57
+ dragConnector(ref);
58
+ const label = `${definition.label}${definition.beta ? ' (BETA)' : ''}`;
59
+ const add = (): void => {
60
+ if (!readOnly) {
61
+ editorState.addNode(definition.type);
62
+ }
63
+ };
64
+ return (
65
+ // a div, not a button: browsers won't drag a button
66
+ <div
67
+ ref={ref}
68
+ role="button"
69
+ tabIndex={readOnly ? -1 : 0}
70
+ aria-disabled={readOnly}
71
+ aria-label={label}
72
+ className={clsx(
73
+ 'flex h-8 shrink-0 items-center gap-2 px-3 text-base',
74
+ readOnly
75
+ ? 'cursor-not-allowed text-[var(--color-text-disabled)]'
76
+ : 'cursor-grab hover:bg-[var(--color-bg-hover)]',
77
+ )}
78
+ title={
79
+ readOnly
80
+ ? READ_ONLY_CUBE_TITLE
81
+ : collapsed
82
+ ? `${label}: ${describeItem(definition)}`
83
+ : describeItem(definition)
84
+ }
85
+ onClick={add}
86
+ onKeyDown={(event) => {
87
+ if (event.key === 'Enter' || event.key === ' ') {
88
+ event.preventDefault();
89
+ add();
90
+ }
91
+ }}
92
+ data-testid={LEGEND_CUBE_TEST_ID.PALETTE_ITEM}
93
+ >
94
+ <CubeNodeIcon
95
+ icon={definition.icon}
96
+ className="shrink-0 text-[var(--color-text-secondary)]"
97
+ />
98
+ {!collapsed && (
99
+ <span className="min-w-0 flex-1 truncate">{definition.label}</span>
100
+ )}
101
+ {!collapsed && definition.beta && (
102
+ <span className="shrink-0 rounded-sm bg-[var(--color-accent)] px-1 text-xs font-medium text-[var(--color-text-on-accent)]">
103
+ BETA
104
+ </span>
105
+ )}
106
+ </div>
107
+ );
108
+ },
109
+ );
110
+
111
+ /**
112
+ * The sidebar of node types to add (spec §17.2): the sources, then the
113
+ * transforms in menu order, read from the registry, as the context menu is.
114
+ * Collapsed, it shows icons only; that choice is kept per user.
115
+ */
116
+ export const CubePalette = observer(
117
+ (props: { editorState: CubeEditorState }) => {
118
+ const { editorState } = props;
119
+ const collapsed = editorState.isPaletteCollapsed;
120
+ const { registry } = editorState;
121
+ return (
122
+ <div
123
+ className={clsx(
124
+ 'flex h-full shrink-0 flex-col border-r border-[var(--color-border-default)] bg-[var(--color-bg-panel)]',
125
+ collapsed ? 'w-10' : 'w-56',
126
+ )}
127
+ data-testid={LEGEND_CUBE_TEST_ID.PALETTE}
128
+ >
129
+ <div className="flex h-8 shrink-0 items-center border-b border-[var(--color-border-default)] bg-[var(--color-bg-panel-header)] px-2">
130
+ {!collapsed && (
131
+ <span className="min-w-0 flex-1 truncate text-base font-medium">
132
+ Add to the query
133
+ </span>
134
+ )}
135
+ <button
136
+ className="flex h-6 w-6 shrink-0 items-center justify-center text-[var(--color-text-secondary)] hover:text-[var(--color-text-primary)]"
137
+ title={collapsed ? 'Expand the palette' : 'Collapse the palette'}
138
+ onClick={() => editorState.setPaletteCollapsed(!collapsed)}
139
+ >
140
+ {collapsed ? <ChevronRightIcon /> : <ChevronLeftIcon />}
141
+ </button>
142
+ </div>
143
+ <div
144
+ className="flex min-h-0 shrink flex-col overflow-auto py-1"
145
+ role="group"
146
+ aria-label="Palette"
147
+ >
148
+ {registry.sources.map((definition) => (
149
+ <CubePaletteItem
150
+ key={definition.type}
151
+ editorState={editorState}
152
+ definition={definition}
153
+ collapsed={collapsed}
154
+ />
155
+ ))}
156
+ <div
157
+ className="mx-2 my-1 shrink-0 border-t border-[var(--color-border-default)]"
158
+ role="separator"
159
+ />
160
+ {registry.transforms.map((definition) => (
161
+ <CubePaletteItem
162
+ key={definition.type}
163
+ editorState={editorState}
164
+ definition={definition}
165
+ collapsed={collapsed}
166
+ />
167
+ ))}
168
+ </div>
169
+ {!collapsed && editorState.document.query.isEmpty && (
170
+ <div className="shrink-0 px-3 py-2 text-sm text-[var(--color-text-muted)]">
171
+ {PALETTE_EMPTY_HINT}
172
+ </div>
173
+ )}
174
+ </div>
175
+ );
176
+ },
177
+ );
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Copyright (c) 2026-present, Goldman Sachs
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import {
18
+ Dialog,
19
+ Modal,
20
+ ModalBody,
21
+ ModalFooter,
22
+ ModalFooterButton,
23
+ ModalHeader,
24
+ PanelLoadingIndicator,
25
+ } from '@finos/legend-art';
26
+ import { observer } from 'mobx-react-lite';
27
+ import { CUBE_PENDING_LABEL } from '../../__lib__/LegendCubeLabels.js';
28
+ import type { CubeEditorState } from '../../stores/CubeEditorState.js';
29
+
30
+ /** The Pure text of what Execute would run, read-only, with Copy */
31
+ export const CubeShowPureDialog = observer(
32
+ (props: { editorState: CubeEditorState }) => {
33
+ const { editorState } = props;
34
+ const showPure = editorState.showPure;
35
+ const { applicationStore } = editorState.host;
36
+ const darkMode =
37
+ !applicationStore.layoutService.TEMPORARY__isLightColorThemeEnabled;
38
+ const { text, error } = showPure;
39
+
40
+ return (
41
+ <Dialog open={showPure.isOpen} onClose={() => showPure.close()}>
42
+ <Modal darkMode={darkMode} className="w-[800px] max-w-full">
43
+ <ModalHeader>
44
+ <div className="modal__title">Pure query</div>
45
+ </ModalHeader>
46
+ <PanelLoadingIndicator isLoading={showPure.isRendering} />
47
+ <ModalBody>
48
+ <div className="flex flex-col gap-2">
49
+ {showPure.isRendering && (
50
+ <div className="text-base text-[var(--color-text-secondary)]">
51
+ {CUBE_PENDING_LABEL.RENDERING_QUERY}
52
+ </div>
53
+ )}
54
+ {text !== undefined && (
55
+ <pre
56
+ className="max-h-[60vh] overflow-auto whitespace-pre rounded-sm border border-[var(--color-border-default)] bg-[var(--color-bg-input)] p-2 font-mono text-sm text-[var(--color-text-primary)]"
57
+ aria-label="Pure query"
58
+ >
59
+ {text}
60
+ </pre>
61
+ )}
62
+ {error && (
63
+ <div
64
+ className="whitespace-pre-wrap break-words text-base text-[var(--color-status-error)]"
65
+ role="alert"
66
+ >
67
+ {error.detail}
68
+ </div>
69
+ )}
70
+ </div>
71
+ </ModalBody>
72
+ <ModalFooter>
73
+ <ModalFooterButton
74
+ darkMode={darkMode}
75
+ formatText={false}
76
+ text="Copy to Clipboard"
77
+ disabled={text === undefined}
78
+ onClick={() => {
79
+ if (text !== undefined) {
80
+ applicationStore.clipboardService
81
+ .copyTextToClipboard(text, {
82
+ notifySuccessMessage:
83
+ 'Pure query copied to the clipboard',
84
+ })
85
+ .catch(applicationStore.alertUnhandledError);
86
+ }
87
+ }}
88
+ />
89
+ <ModalFooterButton
90
+ darkMode={darkMode}
91
+ formatText={false}
92
+ type="secondary"
93
+ text="Close"
94
+ onClick={() => showPure.close()}
95
+ />
96
+ </ModalFooter>
97
+ </Modal>
98
+ </Dialog>
99
+ );
100
+ },
101
+ );
@@ -0,0 +1,304 @@
1
+ /**
2
+ * Copyright (c) 2026-present, Goldman Sachs
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import {
18
+ clsx,
19
+ Dialog,
20
+ Modal,
21
+ ModalBody,
22
+ ModalFooter,
23
+ ModalFooterButton,
24
+ ModalHeader,
25
+ PanelLoadingIndicator,
26
+ } from '@finos/legend-art';
27
+ import { getRelationalDisplayName } from '@finos/legend-cube';
28
+ import { flowResult } from 'mobx';
29
+ import { observer } from 'mobx-react-lite';
30
+ import { useId } from 'react';
31
+ import {
32
+ CUBE_PENDING_LABEL,
33
+ CUBE_TABLE_FLAG_LABELS,
34
+ } from '../../__lib__/LegendCubeLabels.js';
35
+ import type { CubeEditorState } from '../../stores/CubeEditorState.js';
36
+ import { isTableSelectable } from '../../stores/CubeSourcePickerState.js';
37
+ import { CubeButton } from '../CubeButton.js';
38
+
39
+ /** One step of the picker: a labelled list of choices, read-only when the cube fixes it */
40
+ const CubePickerStep: React.FC<{
41
+ label: string;
42
+ value: string | undefined;
43
+ options: readonly { value: string; label: string }[];
44
+ disabled?: boolean;
45
+ onChange: (value: string | undefined) => void;
46
+ }> = ({ label, value, options, disabled, onChange }) => {
47
+ const id = useId();
48
+ return (
49
+ <div className="flex items-center gap-2">
50
+ <label className="w-20 shrink-0 text-base" htmlFor={id}>
51
+ {label}
52
+ </label>
53
+ <select
54
+ id={id}
55
+ className="h-7 min-w-0 flex-1 rounded-sm border border-[var(--color-border-default)] bg-[var(--color-bg-input)] px-1 text-base text-[var(--color-text-primary)] disabled:text-[var(--color-text-secondary)]"
56
+ value={value ?? ''}
57
+ disabled={Boolean(disabled) || !options.length}
58
+ onChange={(event) => onChange(event.target.value || undefined)}
59
+ >
60
+ {value === undefined && <option value="">Choose…</option>}
61
+ {options.map((option) => (
62
+ <option key={option.value} value={option.value}>
63
+ {option.label}
64
+ </option>
65
+ ))}
66
+ </select>
67
+ </div>
68
+ );
69
+ };
70
+
71
+ /**
72
+ * Adds a table to the cube (PLAN §6.2.7): a minimal dialog, which M3
73
+ * redesigns. The table lands with its schema; the first one fixes the cube's
74
+ * model and runtime.
75
+ */
76
+ /** The Model option that offers a text box for Pure text */
77
+ const PASTE_MODEL_OPTION = 'paste';
78
+
79
+ export const CubeSourcePicker = observer(
80
+ (props: { editorState: CubeEditorState }) => {
81
+ const { editorState } = props;
82
+ const picker = editorState.sourcePicker;
83
+ const { applicationStore } = editorState.host;
84
+ const darkMode =
85
+ !applicationStore.layoutService.TEMPORARY__isLightColorThemeEnabled;
86
+ const isFixed = picker.fixedContext !== undefined;
87
+ const fixedModelLabel =
88
+ picker.models.find(
89
+ (model) =>
90
+ JSON.stringify(model.model) ===
91
+ JSON.stringify(picker.fixedContext?.model),
92
+ )?.label ?? "The cube's model";
93
+ const confirm = (): void => {
94
+ flowResult(picker.confirm()).catch(applicationStore.alertUnhandledError);
95
+ };
96
+
97
+ return (
98
+ <Dialog open={picker.isOpen} onClose={() => picker.close()}>
99
+ <Modal darkMode={darkMode} className="w-[640px] max-w-full">
100
+ <ModalHeader>
101
+ <div className="modal__title">Add a table</div>
102
+ </ModalHeader>
103
+ <PanelLoadingIndicator
104
+ isLoading={picker.isLoadingModel || picker.isResolving}
105
+ />
106
+ <ModalBody>
107
+ <div className="flex flex-col gap-2">
108
+ <CubePickerStep
109
+ label="Model"
110
+ value={
111
+ isFixed
112
+ ? 'fixed'
113
+ : picker.isPastingModel
114
+ ? PASTE_MODEL_OPTION
115
+ : picker.models.find(
116
+ (model) => model.model === picker.model,
117
+ )?.id
118
+ }
119
+ options={
120
+ isFixed
121
+ ? [{ value: 'fixed', label: fixedModelLabel }]
122
+ : [
123
+ ...picker.models.map((model) => ({
124
+ value: model.id,
125
+ label: model.label,
126
+ })),
127
+ {
128
+ value: PASTE_MODEL_OPTION,
129
+ label: 'Paste Pure model…',
130
+ },
131
+ ]
132
+ }
133
+ disabled={isFixed}
134
+ onChange={(id) => {
135
+ if (id === PASTE_MODEL_OPTION) {
136
+ picker.startPastingModel();
137
+ return;
138
+ }
139
+ const model = picker.models.find(
140
+ (candidate) => candidate.id === id,
141
+ );
142
+ if (model) {
143
+ flowResult(picker.selectModel(model.model)).catch(
144
+ applicationStore.alertUnhandledError,
145
+ );
146
+ }
147
+ }}
148
+ />
149
+ {picker.isPastingModel && !isFixed && (
150
+ <div className="flex flex-col gap-1">
151
+ <textarea
152
+ className="h-40 w-full resize-y rounded-sm border border-[var(--color-border-default)] bg-[var(--color-bg-input)] p-1 font-mono text-sm text-[var(--color-text-primary)]"
153
+ aria-label="Pure model"
154
+ placeholder={
155
+ '###Relational\nDatabase my::Database ( … )\n\n###Runtime\nRuntime my::Runtime { … }'
156
+ }
157
+ spellCheck={false}
158
+ value={picker.pastedModelText}
159
+ onChange={(event) =>
160
+ picker.setPastedModelText(event.target.value)
161
+ }
162
+ />
163
+ <div className="flex items-center gap-2">
164
+ <CubeButton
165
+ disabled={
166
+ !picker.pastedModelText.trim() || picker.isLoadingModel
167
+ }
168
+ onClick={() => {
169
+ flowResult(picker.loadPastedModel()).catch(
170
+ applicationStore.alertUnhandledError,
171
+ );
172
+ }}
173
+ >
174
+ Load model
175
+ </CubeButton>
176
+ <span className="text-sm text-[var(--color-text-muted)]">
177
+ The cube keeps the model&apos;s text, which counts towards
178
+ the 1 MiB a cube spec can hold.
179
+ </span>
180
+ </div>
181
+ </div>
182
+ )}
183
+ {picker.isLoadingModel && (
184
+ <div className="text-base text-[var(--color-text-secondary)]">
185
+ {CUBE_PENDING_LABEL.LOADING_MODEL}
186
+ </div>
187
+ )}
188
+ <CubePickerStep
189
+ label="Database"
190
+ value={picker.databasePath}
191
+ options={picker.databases.map((database) => ({
192
+ value: database.path,
193
+ label: database.path,
194
+ }))}
195
+ disabled={picker.fixedDatabasePath !== undefined}
196
+ onChange={(path) => picker.selectDatabase(path)}
197
+ />
198
+ <CubePickerStep
199
+ label="Runtime"
200
+ value={picker.runtimePath}
201
+ options={picker.runtimes.map((runtime) => ({
202
+ value: runtime.path,
203
+ label: runtime.path,
204
+ }))}
205
+ disabled={picker.fixedContext?.runtime !== undefined}
206
+ onChange={(path) => picker.selectRuntime(path)}
207
+ />
208
+ <CubePickerStep
209
+ label="Schema"
210
+ value={picker.schemaName}
211
+ options={picker.schemas.map((schema) => ({
212
+ value: schema.name,
213
+ label: getRelationalDisplayName(schema.name),
214
+ }))}
215
+ onChange={(name) => picker.selectSchema(name)}
216
+ />
217
+ {picker.schemaName !== undefined && (
218
+ <div className="flex flex-col gap-1">
219
+ <input
220
+ className="h-7 rounded-sm border border-[var(--color-border-default)] bg-[var(--color-bg-input)] px-1 text-base text-[var(--color-text-primary)]"
221
+ placeholder="Search tables"
222
+ aria-label="Search tables"
223
+ value={picker.tableSearch}
224
+ onChange={(event) =>
225
+ picker.setTableSearch(event.target.value)
226
+ }
227
+ />
228
+ <ul
229
+ className="h-56 overflow-auto rounded-sm border border-[var(--color-border-subtle)]"
230
+ aria-label="Tables"
231
+ >
232
+ {picker.tables.map((table) => {
233
+ const selectable = isTableSelectable(table);
234
+ const isPicked = picker.tableName === table.name;
235
+ return (
236
+ <li key={table.name}>
237
+ <button
238
+ type="button"
239
+ className={clsx(
240
+ 'flex w-full items-center gap-2 px-2 py-1 text-left text-base enabled:hover:bg-[var(--color-bg-hover)] disabled:cursor-not-allowed disabled:text-[var(--color-text-disabled)]',
241
+ { 'bg-[var(--color-bg-selected)]': isPicked },
242
+ )}
243
+ aria-pressed={isPicked}
244
+ disabled={!selectable}
245
+ onClick={() => picker.selectTable(table.name)}
246
+ >
247
+ <span className="min-w-0 flex-1 truncate">
248
+ {getRelationalDisplayName(table.name)}
249
+ </span>
250
+ {table.flags.map((flag) => (
251
+ <span
252
+ key={flag}
253
+ className="rounded-sm bg-[var(--color-status-warn-bg)] px-1 text-sm text-[var(--color-status-warn)]"
254
+ title={CUBE_TABLE_FLAG_LABELS[flag].description}
255
+ >
256
+ {CUBE_TABLE_FLAG_LABELS[flag].label}
257
+ </span>
258
+ ))}
259
+ <span className="shrink-0 text-sm text-[var(--color-text-muted)]">
260
+ {table.columnCount} columns
261
+ </span>
262
+ </button>
263
+ </li>
264
+ );
265
+ })}
266
+ </ul>
267
+ </div>
268
+ )}
269
+ {picker.isResolving && (
270
+ <div className="text-base text-[var(--color-text-secondary)]">
271
+ {CUBE_PENDING_LABEL.RESOLVING_SOURCE}
272
+ </div>
273
+ )}
274
+ {picker.error !== undefined && (
275
+ <div
276
+ className="text-base text-[var(--color-status-error)]"
277
+ role="alert"
278
+ >
279
+ {picker.error}
280
+ </div>
281
+ )}
282
+ </div>
283
+ </ModalBody>
284
+ <ModalFooter>
285
+ <ModalFooterButton
286
+ darkMode={darkMode}
287
+ formatText={false}
288
+ text="Add"
289
+ disabled={!picker.canConfirm}
290
+ onClick={confirm}
291
+ />
292
+ <ModalFooterButton
293
+ darkMode={darkMode}
294
+ formatText={false}
295
+ type="secondary"
296
+ text="Cancel"
297
+ onClick={() => picker.close()}
298
+ />
299
+ </ModalFooter>
300
+ </Modal>
301
+ </Dialog>
302
+ );
303
+ },
304
+ );