@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,215 @@
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 { QuestionCircleIcon, TimesIcon, WarningIcon } from '@finos/legend-art';
18
+ import {
19
+ isIncompleteError,
20
+ isSchemasError,
21
+ type QueryNode,
22
+ type Schema,
23
+ UnknownNode,
24
+ } from '@finos/legend-cube';
25
+ import { observer } from 'mobx-react-lite';
26
+ import {
27
+ CUBE_NODE_HELP_TEXT,
28
+ SELECT_NODE_TOOLTIP,
29
+ } from '../../__lib__/LegendCubeHelpText.js';
30
+ import { READ_ONLY_CUBE_TITLE } from '../../__lib__/LegendCubeLabels.js';
31
+ import { LEGEND_CUBE_TEST_ID } from '../../__lib__/LegendCubeTesting.js';
32
+ import type { CubeEditorState } from '../../stores/CubeEditorState.js';
33
+ import { CUBE_NODE_DRAFT_FACTORIES } from '../../stores/editors/CubeNodeDraftRegistry.js';
34
+ import { CubeButton } from '../CubeButton.js';
35
+ import { CubeNodeIcon } from '../CubeNodeIcon.js';
36
+ import { CUBE_NODE_EDITORS } from './CubeNodeEditorRegistry.js';
37
+
38
+ /** The problems of the edited node against its inputs, as Apply would leave it */
39
+ const validateEdited = (
40
+ node: QueryNode,
41
+ inputSchemas: readonly Schema[],
42
+ ): string[] => {
43
+ const errors: string[] = [];
44
+ node.validate(inputSchemas, errors);
45
+ return [...new Set(errors)];
46
+ };
47
+
48
+ /**
49
+ * The node editor, in a side panel (spec §17.5): the node's label and id, its
50
+ * help, Select, and its type's editor. Edits stay in the panel until Apply
51
+ * or closing it; Cancel drops them. While an input is missing or invalid,
52
+ * the panel shows why instead of the editor, since there would be no
53
+ * columns to pick.
54
+ */
55
+ export const CubeNodeEditorPanel = observer(
56
+ (props: { editorState: CubeEditorState }) => {
57
+ const { editorState } = props;
58
+ const { nodeEditor, readOnly } = editorState;
59
+ const { node, draft, edited } = nodeEditor;
60
+ if (!node || !draft || !edited) {
61
+ return null;
62
+ }
63
+ const { query } = editorState.document;
64
+ const definition = editorState.registry.get(node.type);
65
+ const isCapture = query.selected === node.id;
66
+ const inputProblems = editorState
67
+ .getNodeErrors(node.id)
68
+ .filter((error) => isSchemasError(error) || isIncompleteError(error));
69
+ const inputSchemas = query
70
+ .getInputIds(node.id)
71
+ .map((inputId) =>
72
+ inputId === undefined
73
+ ? undefined
74
+ : editorState.analysis.schemas.get(inputId),
75
+ )
76
+ .filter((schema): schema is Schema => schema !== undefined);
77
+ const Editor = CUBE_NODE_EDITORS.get(node.type);
78
+ const isEditable = CUBE_NODE_DRAFT_FACTORIES.has(node.type);
79
+ const problems =
80
+ isEditable && !inputProblems.length
81
+ ? validateEdited(edited, inputSchemas)
82
+ : [];
83
+ const warnings = editorState.getNodeWarnings(node);
84
+ return (
85
+ <div
86
+ className="flex h-full flex-col border-l border-[var(--color-border-default)] bg-[var(--color-bg-panel)]"
87
+ data-testid={LEGEND_CUBE_TEST_ID.NODE_EDITOR}
88
+ >
89
+ <div className="flex h-8 shrink-0 items-center gap-2 border-b border-[var(--color-border-default)] bg-[var(--color-bg-panel-header)] px-2">
90
+ <CubeNodeIcon
91
+ icon={definition?.icon}
92
+ className="shrink-0 text-[var(--color-text-secondary)]"
93
+ />
94
+ <span className="min-w-0 truncate text-lg font-medium">
95
+ {definition?.label ?? 'Unknown'}
96
+ </span>
97
+ <span className="shrink-0 text-base text-[var(--color-text-muted)]">
98
+ {node.id}
99
+ </span>
100
+ {definition?.beta && (
101
+ <span className="shrink-0 rounded-sm bg-[var(--color-accent)] px-1 text-xs font-medium text-[var(--color-text-on-accent)]">
102
+ BETA
103
+ </span>
104
+ )}
105
+ <span
106
+ className="shrink-0 text-[var(--color-text-secondary)]"
107
+ title={
108
+ CUBE_NODE_HELP_TEXT[node.type] ??
109
+ CUBE_NODE_HELP_TEXT[UnknownNode.TYPE]
110
+ }
111
+ role="img"
112
+ aria-label="Help"
113
+ >
114
+ <QuestionCircleIcon />
115
+ </span>
116
+ <span className="flex-1" />
117
+ {isCapture ? (
118
+ <span
119
+ className="shrink-0 text-base text-[var(--color-text-secondary)]"
120
+ title={SELECT_NODE_TOOLTIP}
121
+ >
122
+ (Selected)
123
+ </span>
124
+ ) : (
125
+ <button
126
+ className="shrink-0 text-base text-[var(--color-accent)] underline"
127
+ title={SELECT_NODE_TOOLTIP}
128
+ onClick={() => editorState.select(node.id)}
129
+ >
130
+ Select
131
+ </button>
132
+ )}
133
+ <button
134
+ className="flex h-6 w-6 shrink-0 items-center justify-center text-[var(--color-text-secondary)] hover:text-[var(--color-text-primary)]"
135
+ title={
136
+ nodeEditor.hasChanges && !readOnly
137
+ ? 'Close, applying the changes'
138
+ : 'Close'
139
+ }
140
+ aria-label="Close the editor"
141
+ onClick={() => nodeEditor.close()}
142
+ >
143
+ <TimesIcon />
144
+ </button>
145
+ </div>
146
+ <div className="min-h-0 flex-1 overflow-auto p-2">
147
+ {warnings.map((warning) => (
148
+ <div
149
+ key={warning}
150
+ className="mb-2 flex gap-1 text-sm text-[var(--color-status-warn)]"
151
+ role="status"
152
+ >
153
+ <WarningIcon className="mt-0.5 shrink-0" aria-hidden={true} />
154
+ <span>{warning}</span>
155
+ </div>
156
+ ))}
157
+ {inputProblems.length ? (
158
+ <div
159
+ className="text-base text-[var(--color-status-warn)]"
160
+ role="alert"
161
+ >
162
+ {inputProblems.map((problem) => (
163
+ <div key={problem}>{problem}</div>
164
+ ))}
165
+ </div>
166
+ ) : Editor ? (
167
+ <Editor
168
+ editorState={editorState}
169
+ draft={draft}
170
+ inputSchemas={inputSchemas}
171
+ readOnly={readOnly}
172
+ />
173
+ ) : (
174
+ <div className="text-base text-[var(--color-text-secondary)]">
175
+ {`${node.describe()}: this node can't be edited.`}
176
+ </div>
177
+ )}
178
+ {problems.length > 0 && (
179
+ <div
180
+ className="mt-3 border-t border-[var(--color-border-subtle)] pt-2 text-base text-[var(--color-status-error)]"
181
+ role="alert"
182
+ aria-label="Problems"
183
+ >
184
+ {problems.map((problem) => (
185
+ <div key={problem}>{problem}</div>
186
+ ))}
187
+ </div>
188
+ )}
189
+ </div>
190
+ {isEditable && (
191
+ <div className="flex h-10 shrink-0 items-center justify-end gap-2 border-t border-[var(--color-border-default)] px-2">
192
+ <CubeButton
193
+ title="Drop the changes and close"
194
+ onClick={() => nodeEditor.cancel()}
195
+ >
196
+ Cancel
197
+ </CubeButton>
198
+ <CubeButton
199
+ primary={true}
200
+ title={
201
+ readOnly
202
+ ? READ_ONLY_CUBE_TITLE
203
+ : 'Store the changes, as one step to undo'
204
+ }
205
+ disabled={readOnly || !nodeEditor.hasChanges}
206
+ onClick={() => nodeEditor.apply()}
207
+ >
208
+ Apply
209
+ </CubeButton>
210
+ </div>
211
+ )}
212
+ </div>
213
+ );
214
+ },
215
+ );
@@ -0,0 +1,81 @@
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
+ Distinct,
19
+ Drop,
20
+ Filter,
21
+ Join,
22
+ Limit,
23
+ RelationalTableSource,
24
+ Rename,
25
+ Restrict,
26
+ type Schema,
27
+ Slice,
28
+ Sort,
29
+ } from '@finos/legend-cube';
30
+ import type { CubeEditorState } from '../../stores/CubeEditorState.js';
31
+ import type { CubeNodeDraft } from '../../stores/editors/CubeNodeDraft.js';
32
+ import { CubeDistinctEditor } from './CubeDistinctEditor.js';
33
+ import { CubeFilterEditor } from './CubeFilterEditor.js';
34
+ import { CubeJoinEditor } from './CubeJoinEditor.js';
35
+ import { CubeRenameEditor } from './CubeRenameEditor.js';
36
+ import { CubeRestrictEditor } from './CubeRestrictEditor.js';
37
+ import { CubeRowCountEditor } from './CubeRowCountEditor.js';
38
+ import { CubeSliceEditor } from './CubeSliceEditor.js';
39
+ import { CubeSortEditor } from './CubeSortEditor.js';
40
+ import { CubeSourceEditor } from './CubeSourceEditor.js';
41
+
42
+ /**
43
+ * What the panel gives a node type's editor (PLAN §7.4). Edits go to the
44
+ * draft, which the panel's Apply stores; an action on the document goes
45
+ * through `editorState.nodeEditor` (e.g. `swapInputs`), which applies the
46
+ * draft first, so the panel never loses its edits under a replaced node.
47
+ */
48
+ export interface CubeNodeEditorProps {
49
+ readonly editorState: CubeEditorState;
50
+ /** The node's draft, made by its type's factory in `CUBE_NODE_DRAFT_FACTORIES` */
51
+ readonly draft: CubeNodeDraft;
52
+ /**
53
+ * The schemas of the node's inputs, in port order, e.g. a Join's Left then
54
+ * Right. All are there: the panel shows the upstream error instead of the
55
+ * editor while an input is missing or invalid.
56
+ */
57
+ readonly inputSchemas: readonly Schema[];
58
+ /** The cube was saved by a newer version: show, don't edit */
59
+ readonly readOnly: boolean;
60
+ }
61
+
62
+ /**
63
+ * The editor of each node type, by type. A type without one shows its
64
+ * description; a type with one either has a draft factory in
65
+ * `CUBE_NODE_DRAFT_FACTORIES` or edits nothing (a source).
66
+ */
67
+ export const CUBE_NODE_EDITORS: ReadonlyMap<
68
+ string,
69
+ React.FC<CubeNodeEditorProps>
70
+ > = new Map<string, React.FC<CubeNodeEditorProps>>([
71
+ [RelationalTableSource.TYPE, CubeSourceEditor],
72
+ [Sort.TYPE, CubeSortEditor],
73
+ [Filter.TYPE, CubeFilterEditor],
74
+ [Restrict.TYPE, CubeRestrictEditor],
75
+ [Rename.TYPE, CubeRenameEditor],
76
+ [Distinct.TYPE, CubeDistinctEditor],
77
+ [Join.TYPE, CubeJoinEditor],
78
+ [Drop.TYPE, CubeRowCountEditor],
79
+ [Limit.TYPE, CubeRowCountEditor],
80
+ [Slice.TYPE, CubeSliceEditor],
81
+ ]);
@@ -0,0 +1,143 @@
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 { clsx, TimesIcon } from '@finos/legend-art';
18
+ import { type Schema, validateRenameMapping } from '@finos/legend-cube';
19
+ import { guaranteeType } from '@finos/legend-shared';
20
+ import { observer } from 'mobx-react-lite';
21
+ import { COLUMN_NAME_RULES_HINT } from '../../__lib__/LegendCubeLabels.js';
22
+ import {
23
+ type CubeRenameRow,
24
+ CubeRenameDraft,
25
+ } from '../../stores/editors/CubeRenameDraft.js';
26
+ import { CubeButton } from '../CubeButton.js';
27
+ import { CubeColumnPicker } from './CubeColumnPicker.js';
28
+ import type { CubeNodeEditorProps } from './CubeNodeEditorRegistry.js';
29
+
30
+ const CubeRenameRowEditor = observer(
31
+ (props: {
32
+ draft: CubeRenameDraft;
33
+ row: CubeRenameRow;
34
+ position: number;
35
+ schema: Schema;
36
+ problem: string | undefined;
37
+ readOnly: boolean;
38
+ }) => {
39
+ const { draft, row, position, schema, problem, readOnly } = props;
40
+ return (
41
+ <li className="flex flex-col gap-1 border-b border-[var(--color-border-subtle)] py-1">
42
+ <div className="grid grid-cols-[1fr_auto_1fr_auto] items-center gap-1">
43
+ <CubeColumnPicker
44
+ label={`Old column ${position}`}
45
+ schema={schema}
46
+ value={row.from}
47
+ disabled={readOnly}
48
+ onChange={(name) => draft.setFrom(row.key, name)}
49
+ />
50
+ <span className="text-[var(--color-text-secondary)]">→</span>
51
+ <input
52
+ aria-label={`New column name ${position}`}
53
+ aria-invalid={problem !== undefined}
54
+ title={problem}
55
+ className={clsx(
56
+ 'h-6 min-w-0 rounded-sm border bg-[var(--color-bg-input)] px-1 text-base',
57
+ problem
58
+ ? 'border-[var(--color-status-error)]'
59
+ : 'border-[var(--color-border-default)]',
60
+ )}
61
+ type="text"
62
+ spellCheck={false}
63
+ value={row.to}
64
+ disabled={readOnly}
65
+ onChange={(event) => draft.setTo(row.key, event.target.value)}
66
+ />
67
+ <button
68
+ className="flex h-6 w-6 items-center justify-center text-[var(--color-text-secondary)] hover:text-[var(--color-text-primary)] disabled:text-[var(--color-text-disabled)]"
69
+ aria-label={`Remove rename ${position}`}
70
+ title="Remove this rename"
71
+ disabled={readOnly}
72
+ onClick={() => draft.removeRow(row.key)}
73
+ >
74
+ <TimesIcon />
75
+ </button>
76
+ </div>
77
+ {problem && (
78
+ <div className="text-sm text-[var(--color-status-error)]">
79
+ {problem}
80
+ </div>
81
+ )}
82
+ </li>
83
+ );
84
+ },
85
+ );
86
+
87
+ /**
88
+ * The Rename editor (spec §17.6): rows of an old column, picked from the
89
+ * input, and its new name, typed. Each row shows its first problem, as the
90
+ * node checks it, and the rule for new names stays shown under the rows. The
91
+ * rows scroll on their own, so the editor fits wherever it is shown.
92
+ */
93
+ export const CubeRenameEditor = observer((props: CubeNodeEditorProps) => {
94
+ const { readOnly } = props;
95
+ const draft = guaranteeType(props.draft, CubeRenameDraft);
96
+ const [schema] = props.inputSchemas as [Schema];
97
+ const { mappings } = draft;
98
+ // a row's problem, as the node will judge it; a blank row has none
99
+ let mappingIndex = 0;
100
+ const problems = draft.rows.map((row) => {
101
+ if (!row.from && !row.to) {
102
+ return undefined;
103
+ }
104
+ const errors: string[] = [];
105
+ validateRenameMapping(mappings, mappingIndex, schema, errors);
106
+ mappingIndex += 1;
107
+ return errors[0];
108
+ });
109
+ const canAddRow = !readOnly && draft.rows.length < schema.columns.length;
110
+ return (
111
+ <div className="flex flex-col gap-2 text-base">
112
+ <ul aria-label="Column renames" className="max-h-80 overflow-auto">
113
+ {draft.rows.map((row, index) => (
114
+ <CubeRenameRowEditor
115
+ key={row.key}
116
+ draft={draft}
117
+ row={row}
118
+ position={index + 1}
119
+ schema={schema}
120
+ problem={problems[index]}
121
+ readOnly={readOnly}
122
+ />
123
+ ))}
124
+ </ul>
125
+ <div>
126
+ <CubeButton
127
+ title={
128
+ canAddRow
129
+ ? 'Add a column to rename'
130
+ : 'Every column of the input already has a row'
131
+ }
132
+ disabled={!canAddRow}
133
+ onClick={() => draft.addRow()}
134
+ >
135
+ Add column to rename
136
+ </CubeButton>
137
+ </div>
138
+ <div className="text-sm text-[var(--color-text-secondary)]">
139
+ {COLUMN_NAME_RULES_HINT}
140
+ </div>
141
+ </div>
142
+ );
143
+ });
@@ -0,0 +1,103 @@
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 type { Schema } from '@finos/legend-cube';
18
+ import { guaranteeType } from '@finos/legend-shared';
19
+ import { observer } from 'mobx-react-lite';
20
+ import { getColumnTypeLabel } from '../../__lib__/LegendCubeLabels.js';
21
+ import { CubeRestrictDraft } from '../../stores/editors/CubeRestrictDraft.js';
22
+ import { CubeButton } from '../CubeButton.js';
23
+ import { CubeColumnTypeIcon } from './CubeColumnPicker.js';
24
+ import type { CubeNodeEditorProps } from './CubeNodeEditorRegistry.js';
25
+
26
+ const KEEP = 'Columns to keep';
27
+
28
+ /**
29
+ * The Restrict editor (spec §17.6): the input's columns, in its order, each
30
+ * ticked to keep it. A saved column the input doesn't have stays listed, last
31
+ * and ticked, until it is unticked. The list scrolls on its own, so the
32
+ * editor fits wherever it is shown.
33
+ */
34
+ export const CubeRestrictEditor = observer((props: CubeNodeEditorProps) => {
35
+ const { readOnly } = props;
36
+ const draft = guaranteeType(props.draft, CubeRestrictDraft);
37
+ const [schema] = props.inputSchemas as [Schema];
38
+ // each once, though a saved restrict may repeat one (validation reports it)
39
+ const missing = Array.from(
40
+ new Set(draft.columns.filter((name) => !schema.lookup(name))),
41
+ );
42
+ return (
43
+ <div className="flex flex-col gap-2 text-base">
44
+ <div className="flex items-center gap-2">
45
+ <span>{KEEP}</span>
46
+ <span className="flex-1" />
47
+ <CubeButton
48
+ title="Keep every column of the input"
49
+ disabled={readOnly}
50
+ onClick={() => draft.selectAll(schema)}
51
+ >
52
+ All
53
+ </CubeButton>
54
+ <CubeButton
55
+ title="Untick every column"
56
+ disabled={readOnly}
57
+ onClick={() => draft.clear()}
58
+ >
59
+ None
60
+ </CubeButton>
61
+ </div>
62
+ <ul
63
+ aria-label={KEEP}
64
+ className="max-h-80 overflow-auto rounded-sm border border-[var(--color-border-subtle)]"
65
+ >
66
+ {schema.columns.map((column) => (
67
+ <li key={column.name}>
68
+ <label className="flex items-center gap-2 px-1 py-0.5">
69
+ <input
70
+ type="checkbox"
71
+ checked={draft.columns.includes(column.name)}
72
+ disabled={readOnly}
73
+ onChange={() => draft.toggleColumn(column.name, schema)}
74
+ />
75
+ <CubeColumnTypeIcon
76
+ type={column.type}
77
+ className="text-[var(--color-text-secondary)]"
78
+ />
79
+ <span className="min-w-0 truncate">{column.name}</span>
80
+ <span className="shrink-0 text-sm text-[var(--color-text-muted)]">
81
+ {getColumnTypeLabel(column)}
82
+ </span>
83
+ </label>
84
+ </li>
85
+ ))}
86
+ {missing.map((name) => (
87
+ <li key={`missing:${name}`}>
88
+ <label className="flex items-center gap-2 px-1 py-0.5 text-[var(--color-status-error)]">
89
+ <input
90
+ type="checkbox"
91
+ checked={true}
92
+ disabled={readOnly}
93
+ onChange={() => draft.toggleColumn(name, schema)}
94
+ />
95
+ <span className="min-w-0 truncate">{name || '(blank)'}</span>
96
+ <span className="shrink-0 text-sm">(not in the input)</span>
97
+ </label>
98
+ </li>
99
+ ))}
100
+ </ul>
101
+ </div>
102
+ );
103
+ });
@@ -0,0 +1,53 @@
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 { Drop, isPositiveWholeNumber, Limit } from '@finos/legend-cube';
18
+ import { guaranteeType } from '@finos/legend-shared';
19
+ import { observer } from 'mobx-react-lite';
20
+ import { CubeRowCountDraft } from '../../stores/editors/CubeRowCountDraft.js';
21
+ import { CubeIntegerField } from './CubeIntegerField.js';
22
+ import type { CubeNodeEditorProps } from './CubeNodeEditorRegistry.js';
23
+
24
+ /** The field's label for each node type the editor serves */
25
+ const ROW_COUNT_LABELS: Readonly<Record<string, string>> = {
26
+ [Drop.TYPE]: 'Rows to drop',
27
+ [Limit.TYPE]: 'Rows to keep',
28
+ };
29
+
30
+ /**
31
+ * The editor of a node whose one setting is a number of rows, a Limit or a
32
+ * Drop (spec §17.6: one integer field). Clearing the field leaves the size empty,
33
+ * which the panel reports; it never falls back to the default.
34
+ */
35
+ export const CubeRowCountEditor = observer((props: CubeNodeEditorProps) => {
36
+ const { readOnly } = props;
37
+ const draft = guaranteeType(props.draft, CubeRowCountDraft);
38
+ const label = ROW_COUNT_LABELS[draft.original.type] ?? 'Rows';
39
+ return (
40
+ <div className="flex flex-col gap-2 text-base">
41
+ <label className="flex items-center gap-2">
42
+ <span>{label}</span>
43
+ <CubeIntegerField
44
+ label={label}
45
+ text={draft.sizeText}
46
+ invalid={!isPositiveWholeNumber(draft.size)}
47
+ disabled={readOnly}
48
+ onChange={(text) => draft.setSizeText(text)}
49
+ />
50
+ </label>
51
+ </div>
52
+ );
53
+ });
@@ -0,0 +1,69 @@
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 { isRowIndex } from '@finos/legend-cube';
18
+ import { guaranteeType } from '@finos/legend-shared';
19
+ import { observer } from 'mobx-react-lite';
20
+ import { SLICE_RANGE_HINT } from '../../__lib__/LegendCubeLabels.js';
21
+ import { CubeSliceDraft } from '../../stores/editors/CubeSliceDraft.js';
22
+ import { CubeIntegerField } from './CubeIntegerField.js';
23
+ import type { CubeNodeEditorProps } from './CubeNodeEditorRegistry.js';
24
+
25
+ const START = 'Start row index';
26
+ const STOP = 'Stop row index';
27
+
28
+ /**
29
+ * The Slice editor (spec §17.6): the start and stop row indexes, counting
30
+ * from 0, the start row kept and the stop row not (D5). A cleared field
31
+ * leaves its bound empty, which the panel reports.
32
+ */
33
+ export const CubeSliceEditor = observer((props: CubeNodeEditorProps) => {
34
+ const { readOnly } = props;
35
+ const draft = guaranteeType(props.draft, CubeSliceDraft);
36
+ const { start, stop } = draft;
37
+ const validStart = isRowIndex(start);
38
+ const validStop = isRowIndex(stop);
39
+ // the stop is marked when it doesn't come after the start, too
40
+ const outOfOrder =
41
+ validStart && validStop && (start as number) >= (stop as number);
42
+ return (
43
+ <div className="flex flex-col gap-2 text-base">
44
+ <label className="flex items-center gap-2">
45
+ <span className="w-28">{START}</span>
46
+ <CubeIntegerField
47
+ label={START}
48
+ text={draft.startText}
49
+ invalid={!validStart}
50
+ disabled={readOnly}
51
+ onChange={(text) => draft.setStartText(text)}
52
+ />
53
+ </label>
54
+ <label className="flex items-center gap-2">
55
+ <span className="w-28">{STOP}</span>
56
+ <CubeIntegerField
57
+ label={STOP}
58
+ text={draft.stopText}
59
+ invalid={!validStop || outOfOrder}
60
+ disabled={readOnly}
61
+ onChange={(text) => draft.setStopText(text)}
62
+ />
63
+ </label>
64
+ <div className="text-sm text-[var(--color-text-secondary)]">
65
+ {SLICE_RANGE_HINT}
66
+ </div>
67
+ </div>
68
+ );
69
+ });