@difizen/libro-core 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (302) hide show
  1. package/es/add-cell/index.less +1 -1
  2. package/es/add-cell/libro-add-cell-slot-contribution.d.ts +1 -2
  3. package/es/add-cell/libro-add-cell-slot-contribution.d.ts.map +1 -1
  4. package/es/add-cell/libro-add-cell-slot-contribution.js +12 -6
  5. package/es/add-cell/libro-add-cell-view.d.ts +4 -4
  6. package/es/add-cell/libro-add-cell-view.d.ts.map +1 -1
  7. package/es/add-cell/libro-add-cell-view.js +4 -6
  8. package/es/cell/libro-cell-contribution.d.ts +1 -2
  9. package/es/cell/libro-cell-contribution.d.ts.map +1 -1
  10. package/es/cell/libro-cell-contribution.js +14 -8
  11. package/es/cell/libro-cell-model.d.ts +9 -0
  12. package/es/cell/libro-cell-model.d.ts.map +1 -1
  13. package/es/cell/libro-cell-model.js +53 -11
  14. package/es/cell/libro-cell-protocol.d.ts +2 -0
  15. package/es/cell/libro-cell-protocol.d.ts.map +1 -1
  16. package/es/cell/libro-cell-view.d.ts +6 -2
  17. package/es/cell/libro-cell-view.d.ts.map +1 -1
  18. package/es/cell/libro-cell-view.js +54 -24
  19. package/es/cell/libro-edit-cell-view.d.ts +6 -12
  20. package/es/cell/libro-edit-cell-view.d.ts.map +1 -1
  21. package/es/cell/libro-edit-cell-view.js +9 -4
  22. package/es/cell/libro-executable-cell-view.d.ts +2 -0
  23. package/es/cell/libro-executable-cell-view.d.ts.map +1 -1
  24. package/es/cell/libro-executable-cell-view.js +4 -1
  25. package/es/collapse-service.d.ts +1 -1
  26. package/es/collapse-service.d.ts.map +1 -1
  27. package/es/collapse-service.js +1 -1
  28. package/es/command/document-commands.d.ts +1 -2
  29. package/es/command/document-commands.d.ts.map +1 -1
  30. package/es/command/document-commands.js +3 -2
  31. package/es/command/kernel-command.d.ts.map +1 -1
  32. package/es/command/kernel-command.js +3 -0
  33. package/es/command/libro-command-contribution.d.ts +0 -1
  34. package/es/command/libro-command-contribution.d.ts.map +1 -1
  35. package/es/command/libro-command-contribution.js +179 -129
  36. package/es/command/libro-command-register.d.ts +0 -1
  37. package/es/command/libro-command-register.d.ts.map +1 -1
  38. package/es/command/libro-command-register.js +13 -7
  39. package/es/command/notebook-commands.d.ts.map +1 -1
  40. package/es/command/notebook-commands.js +17 -4
  41. package/es/components/cell-protocol.d.ts +5 -5
  42. package/es/components/cell-protocol.d.ts.map +1 -1
  43. package/es/components/dnd-cell-item-render.d.ts +6 -2
  44. package/es/components/dnd-cell-item-render.d.ts.map +1 -1
  45. package/es/components/dnd-cell-item-render.js +194 -89
  46. package/es/components/dnd-component/custom-drag-layer.d.ts +1 -1
  47. package/es/components/dnd-component/custom-drag-layer.d.ts.map +1 -1
  48. package/es/components/dnd-component/custom-drag-layer.js +3 -4
  49. package/es/components/dnd-component/default-dnd-content.d.ts +2 -1
  50. package/es/components/dnd-component/default-dnd-content.d.ts.map +1 -1
  51. package/es/components/dnd-component/default-dnd-content.js +100 -44
  52. package/es/components/dnd-component/dnd-context.js +1 -1
  53. package/es/components/dnd-component/dnd-list.d.ts +9 -5
  54. package/es/components/dnd-component/dnd-list.d.ts.map +1 -1
  55. package/es/components/dnd-component/dnd-list.js +93 -26
  56. package/es/components/dnd-component/index.d.ts +1 -1
  57. package/es/components/dnd-component/index.d.ts.map +1 -1
  58. package/es/components/dnd-component/index.js +2 -2
  59. package/es/components/dnd-component/index.less +8 -0
  60. package/es/components/dnd-component/overscanIndices-getter.d.ts +22 -0
  61. package/es/components/dnd-component/overscanIndices-getter.d.ts.map +1 -0
  62. package/es/components/dnd-component/overscanIndices-getter.js +58 -0
  63. package/es/components/dnd-component/virtualized-manager.d.ts +19 -0
  64. package/es/components/dnd-component/virtualized-manager.d.ts.map +1 -0
  65. package/es/components/dnd-component/virtualized-manager.js +60 -0
  66. package/es/components/index.d.ts +2 -2
  67. package/es/components/index.d.ts.map +1 -1
  68. package/es/components/index.js +2 -2
  69. package/es/components/libro-virtualized-render.d.ts +15 -0
  70. package/es/components/libro-virtualized-render.d.ts.map +1 -0
  71. package/es/components/libro-virtualized-render.js +174 -0
  72. package/es/content/index.d.ts +1 -0
  73. package/es/content/index.d.ts.map +1 -1
  74. package/es/content/index.js +2 -1
  75. package/es/content/libro-content-contribution.d.ts +2 -2
  76. package/es/content/libro-content-contribution.d.ts.map +1 -1
  77. package/es/content/libro-content-contribution.js +2 -3
  78. package/es/content/libro-content-module.d.ts.map +1 -1
  79. package/es/content/libro-content-module.js +3 -2
  80. package/es/content/libro-content-protocol.d.ts +5 -0
  81. package/es/content/libro-content-protocol.d.ts.map +1 -1
  82. package/es/content/libro-content-protocol.js +2 -1
  83. package/es/content/libro-content-service.d.ts +5 -3
  84. package/es/content/libro-content-service.d.ts.map +1 -1
  85. package/es/content/libro-content-service.js +36 -8
  86. package/es/content/libro-save-content-contribution.d.ts +6 -0
  87. package/es/content/libro-save-content-contribution.d.ts.map +1 -0
  88. package/es/content/libro-save-content-contribution.js +27 -0
  89. package/es/formatter/index.d.ts +6 -0
  90. package/es/formatter/index.d.ts.map +1 -0
  91. package/es/formatter/index.js +5 -0
  92. package/es/formatter/libro-formatter-json-contribution.d.ts +18 -0
  93. package/es/formatter/libro-formatter-json-contribution.d.ts.map +1 -0
  94. package/es/formatter/libro-formatter-json-contribution.js +41 -0
  95. package/es/formatter/libro-formatter-manager.d.ts +16 -0
  96. package/es/formatter/libro-formatter-manager.d.ts.map +1 -0
  97. package/es/formatter/libro-formatter-manager.js +86 -0
  98. package/es/formatter/libro-formatter-module.d.ts +3 -0
  99. package/es/formatter/libro-formatter-module.d.ts.map +1 -0
  100. package/es/formatter/libro-formatter-module.js +7 -0
  101. package/es/formatter/libro-formatter-protocol.d.ts +37 -0
  102. package/es/formatter/libro-formatter-protocol.d.ts.map +1 -0
  103. package/es/formatter/libro-formatter-protocol.js +18 -0
  104. package/es/formatter/libro-formatter-string-contribution.d.ts +18 -0
  105. package/es/formatter/libro-formatter-string-contribution.d.ts.map +1 -0
  106. package/es/formatter/libro-formatter-string-contribution.js +41 -0
  107. package/es/formatter/libro-formatter-trans-default-contribution.d.ts +7 -0
  108. package/es/formatter/libro-formatter-trans-default-contribution.d.ts.map +1 -0
  109. package/es/formatter/libro-formatter-trans-default-contribution.js +19 -0
  110. package/es/index.d.ts +5 -1
  111. package/es/index.d.ts.map +1 -1
  112. package/es/index.js +6 -2
  113. package/es/index.less +135 -58
  114. package/es/libro-context-key.d.ts.map +1 -1
  115. package/es/libro-model.d.ts +13 -2
  116. package/es/libro-model.d.ts.map +1 -1
  117. package/es/libro-model.js +149 -70
  118. package/es/libro-protocol.d.ts +44 -2
  119. package/es/libro-protocol.d.ts.map +1 -1
  120. package/es/libro-protocol.js +16 -3
  121. package/es/libro-service.d.ts +1 -1
  122. package/es/libro-service.d.ts.map +1 -1
  123. package/es/libro-service.js +29 -20
  124. package/es/{configuration/libro-configuration-contribution.d.ts → libro-setting-contribution.d.ts} +2 -2
  125. package/es/libro-setting-contribution.d.ts.map +1 -0
  126. package/es/{configuration/libro-configuration-contribution.js → libro-setting-contribution.js} +8 -9
  127. package/es/{configuration/libro-configuration.d.ts → libro-setting.d.ts} +3 -2
  128. package/es/libro-setting.d.ts.map +1 -0
  129. package/es/{configuration/libro-configuration.js → libro-setting.js} +17 -7
  130. package/es/libro-view.d.ts +21 -8
  131. package/es/libro-view.d.ts.map +1 -1
  132. package/es/libro-view.js +477 -338
  133. package/es/material-from-designer.d.ts +3 -0
  134. package/es/material-from-designer.d.ts.map +1 -1
  135. package/es/material-from-designer.js +112 -1
  136. package/es/module.d.ts.map +1 -1
  137. package/es/module.js +20 -5
  138. package/es/output/output-area.d.ts +3 -4
  139. package/es/output/output-area.d.ts.map +1 -1
  140. package/es/output/output-area.js +23 -16
  141. package/es/output/output-contribution.d.ts +0 -1
  142. package/es/output/output-contribution.d.ts.map +1 -1
  143. package/es/output/output-contribution.js +14 -9
  144. package/es/output/output-model.d.ts +2 -2
  145. package/es/output/output-model.d.ts.map +1 -1
  146. package/es/output/output-model.js +2 -2
  147. package/es/output/output-protocol.d.ts.map +1 -1
  148. package/es/output/output-protocol.js +0 -2
  149. package/es/settings/index.d.ts +5 -0
  150. package/es/settings/index.d.ts.map +1 -0
  151. package/es/settings/index.js +4 -0
  152. package/es/settings/index.less +3 -0
  153. package/es/settings/module.d.ts +3 -0
  154. package/es/settings/module.d.ts.map +1 -0
  155. package/es/settings/module.js +4 -0
  156. package/es/settings/setting-editor/configuration-panel-view.d.ts +13 -0
  157. package/es/settings/setting-editor/configuration-panel-view.d.ts.map +1 -0
  158. package/es/settings/setting-editor/configuration-panel-view.js +115 -0
  159. package/es/settings/setting-editor/configuration-render-contribution.d.ts +6 -0
  160. package/es/settings/setting-editor/configuration-render-contribution.d.ts.map +1 -0
  161. package/es/settings/setting-editor/configuration-render-contribution.js +77 -0
  162. package/es/settings/setting-editor/default-node-render.d.ts +9 -0
  163. package/es/settings/setting-editor/default-node-render.d.ts.map +1 -0
  164. package/es/settings/setting-editor/default-node-render.js +79 -0
  165. package/es/settings/setting-editor/index.d.ts +7 -0
  166. package/es/settings/setting-editor/index.d.ts.map +1 -0
  167. package/es/settings/setting-editor/index.js +6 -0
  168. package/es/settings/setting-editor/index.less +12 -0
  169. package/es/settings/setting-editor/module.d.ts +3 -0
  170. package/es/settings/setting-editor/module.d.ts.map +1 -0
  171. package/es/settings/setting-editor/module.js +7 -0
  172. package/es/settings/setting-editor/setting-editor-view.d.ts +15 -0
  173. package/es/settings/setting-editor/setting-editor-view.d.ts.map +1 -0
  174. package/es/settings/setting-editor/setting-editor-view.js +169 -0
  175. package/es/settings/setting-editor/setting-tree-service.d.ts +9 -0
  176. package/es/settings/setting-editor/setting-tree-service.d.ts.map +1 -0
  177. package/es/settings/setting-editor/setting-tree-service.js +118 -0
  178. package/es/settings/setting-editor/setting-tree-view.d.ts +19 -0
  179. package/es/settings/setting-editor/setting-tree-view.d.ts.map +1 -0
  180. package/es/settings/setting-editor/setting-tree-view.js +88 -0
  181. package/es/settings/settings-contribution.d.ts +7 -0
  182. package/es/settings/settings-contribution.d.ts.map +1 -0
  183. package/es/settings/settings-contribution.js +36 -0
  184. package/es/settings/settings-modal.d.ts +5 -0
  185. package/es/settings/settings-modal.d.ts.map +1 -0
  186. package/es/settings/settings-modal.js +53 -0
  187. package/es/settings/settings-modal.less +3 -0
  188. package/es/settings/settings-protocol.d.ts +4 -0
  189. package/es/settings/settings-protocol.d.ts.map +1 -0
  190. package/es/settings/settings-protocol.js +5 -0
  191. package/es/slot/libro-slot-manager.d.ts +2 -2
  192. package/es/slot/libro-slot-manager.d.ts.map +1 -1
  193. package/es/slot/libro-slot-manager.js +14 -8
  194. package/es/slot/libro-slot-view.d.ts +3 -3
  195. package/es/slot/libro-slot-view.d.ts.map +1 -1
  196. package/es/slot/libro-slot-view.js +2 -2
  197. package/es/theme/libro-color-registry.d.ts.map +1 -1
  198. package/es/theme/libro-color-registry.js +7 -0
  199. package/es/toolbar/all-outputs-scroll-icon.d.ts +3 -0
  200. package/es/toolbar/all-outputs-scroll-icon.d.ts.map +1 -0
  201. package/es/toolbar/all-outputs-scroll-icon.js +10 -0
  202. package/es/toolbar/libro-toolbar.d.ts +2 -1
  203. package/es/toolbar/libro-toolbar.d.ts.map +1 -1
  204. package/es/toolbar/libro-toolbar.js +44 -8
  205. package/es/toolbar/restart-clear-outputs-modal.d.ts +1 -2
  206. package/es/toolbar/restart-clear-outputs-modal.d.ts.map +1 -1
  207. package/es/toolbar/restart-clear-outputs-modal.js +2 -2
  208. package/es/toolbar/shutdown-modal.d.ts +1 -2
  209. package/es/toolbar/shutdown-modal.d.ts.map +1 -1
  210. package/es/toolbar/shutdown-modal.js +2 -2
  211. package/es/toolbar/side-toolar-more-select.d.ts.map +1 -1
  212. package/es/toolbar/side-toolar-more-select.js +2 -2
  213. package/es/virtualized-manager-helper.d.ts +11 -0
  214. package/es/virtualized-manager-helper.d.ts.map +1 -0
  215. package/es/virtualized-manager-helper.js +51 -0
  216. package/es/virtualized-manager.d.ts +19 -0
  217. package/es/virtualized-manager.d.ts.map +1 -0
  218. package/es/virtualized-manager.js +61 -0
  219. package/package.json +9 -6
  220. package/src/add-cell/index.less +1 -1
  221. package/src/add-cell/libro-add-cell-slot-contribution.ts +1 -4
  222. package/src/add-cell/libro-add-cell-view.tsx +13 -6
  223. package/src/cell/libro-cell-contribution.ts +2 -6
  224. package/src/cell/libro-cell-model.ts +57 -4
  225. package/src/cell/libro-cell-protocol.ts +2 -0
  226. package/src/cell/libro-cell-view.tsx +21 -9
  227. package/src/cell/libro-edit-cell-view.tsx +10 -9
  228. package/src/cell/libro-executable-cell-view.ts +6 -1
  229. package/src/collapse-service.ts +1 -1
  230. package/src/command/document-commands.ts +3 -5
  231. package/src/command/kernel-command.ts +3 -0
  232. package/src/command/libro-command-contribution.ts +107 -91
  233. package/src/command/libro-command-register.ts +1 -4
  234. package/src/command/notebook-commands.ts +16 -3
  235. package/src/components/cell-protocol.ts +5 -5
  236. package/src/components/dnd-cell-item-render.tsx +239 -92
  237. package/src/components/dnd-component/custom-drag-layer.tsx +5 -6
  238. package/src/components/dnd-component/default-dnd-content.tsx +113 -42
  239. package/src/components/dnd-component/dnd-context.tsx +1 -1
  240. package/src/components/dnd-component/dnd-list.tsx +135 -43
  241. package/src/components/dnd-component/index.less +8 -0
  242. package/src/components/dnd-component/index.tsx +1 -1
  243. package/src/components/dnd-component/overscanIndices-getter.ts +92 -0
  244. package/src/components/dnd-component/virtualized-manager.ts +34 -0
  245. package/src/components/index.ts +2 -2
  246. package/src/components/libro-virtualized-render.tsx +178 -0
  247. package/src/content/index.ts +1 -0
  248. package/src/content/libro-content-contribution.ts +2 -3
  249. package/src/content/libro-content-module.ts +11 -3
  250. package/src/content/libro-content-protocol.ts +6 -0
  251. package/src/content/libro-content-service.ts +26 -8
  252. package/src/content/libro-save-content-contribution.ts +12 -0
  253. package/src/formatter/index.ts +5 -0
  254. package/src/formatter/libro-formatter-json-contribution.ts +42 -0
  255. package/src/formatter/libro-formatter-manager.ts +85 -0
  256. package/src/formatter/libro-formatter-module.ts +19 -0
  257. package/src/formatter/libro-formatter-protocol.ts +63 -0
  258. package/src/formatter/libro-formatter-string-contribution.ts +41 -0
  259. package/src/formatter/libro-formatter-trans-default-contribution.ts +15 -0
  260. package/src/index.less +135 -58
  261. package/src/index.tsx +6 -1
  262. package/src/libro-context-key.ts +3 -3
  263. package/src/libro-model.ts +87 -23
  264. package/src/libro-protocol.ts +81 -4
  265. package/src/libro-service.ts +4 -13
  266. package/src/{configuration/libro-configuration-contribution.ts → libro-setting-contribution.ts} +7 -8
  267. package/src/{configuration/libro-configuration.ts → libro-setting.ts} +18 -7
  268. package/src/libro-view.tsx +273 -141
  269. package/src/material-from-designer.tsx +93 -1
  270. package/src/module.ts +29 -7
  271. package/src/output/output-area.tsx +18 -12
  272. package/src/output/output-contribution.ts +2 -6
  273. package/src/output/output-model.tsx +3 -3
  274. package/src/output/output-protocol.ts +0 -1
  275. package/src/settings/index.less +3 -0
  276. package/src/settings/index.ts +4 -0
  277. package/src/settings/module.ts +8 -0
  278. package/src/settings/setting-editor/configuration-panel-view.tsx +89 -0
  279. package/src/settings/setting-editor/configuration-render-contribution.ts +81 -0
  280. package/src/settings/setting-editor/default-node-render.tsx +65 -0
  281. package/src/settings/setting-editor/index.less +12 -0
  282. package/src/settings/setting-editor/index.ts +6 -0
  283. package/src/settings/setting-editor/module.ts +17 -0
  284. package/src/settings/setting-editor/setting-editor-view.tsx +93 -0
  285. package/src/settings/setting-editor/setting-tree-service.ts +82 -0
  286. package/src/settings/setting-editor/setting-tree-view.tsx +95 -0
  287. package/src/settings/settings-contribution.tsx +24 -0
  288. package/src/settings/settings-modal.less +3 -0
  289. package/src/settings/settings-modal.tsx +50 -0
  290. package/src/settings/settings-protocol.ts +7 -0
  291. package/src/slot/libro-slot-manager.ts +1 -3
  292. package/src/slot/libro-slot-view.tsx +2 -5
  293. package/src/theme/libro-color-registry.ts +6 -0
  294. package/src/toolbar/all-outputs-scroll-icon.tsx +19 -0
  295. package/src/toolbar/libro-toolbar.tsx +30 -5
  296. package/src/toolbar/restart-clear-outputs-modal.tsx +3 -3
  297. package/src/toolbar/shutdown-modal.tsx +3 -3
  298. package/src/toolbar/side-toolar-more-select.tsx +2 -1
  299. package/src/virtualized-manager-helper.ts +29 -0
  300. package/src/virtualized-manager.ts +34 -0
  301. package/es/configuration/libro-configuration-contribution.d.ts.map +0 -1
  302. package/es/configuration/libro-configuration.d.ts.map +0 -1
@@ -1,18 +1,29 @@
1
- import { useConfigurationValue } from '@difizen/mana-app';
1
+ /* eslint-disable react-hooks/exhaustive-deps */
2
2
  import { getOrigin, useInject, ViewInstance } from '@difizen/mana-app';
3
+ import { useConfigurationValue } from '@difizen/mana-app';
3
4
  import type { Identifier } from 'dnd-core';
4
- import React, { useEffect, useRef, useState, useCallback, forwardRef } from 'react';
5
+ import React, {
6
+ useCallback,
7
+ useEffect,
8
+ useLayoutEffect,
9
+ useMemo,
10
+ useRef,
11
+ useState,
12
+ forwardRef,
13
+ } from 'react';
5
14
  import { useDrag, useDragDropManager, useDrop } from 'react-dnd';
6
15
  import { getEmptyImage } from 'react-dnd-html5-backend';
16
+ import 'resize-observer-polyfill';
7
17
 
8
- import { CellService } from '../../cell/index.js';
18
+ import type { CellService } from '../../cell/index.js';
19
+ import { LibroCellService } from '../../cell/index.js';
9
20
  import { CellCollapsible } from '../../collapse-service.js';
10
- import { MultiSelectionWhenShiftClick } from '../../configuration/libro-configuration.js';
11
- import { isCellView, DragAreaKey } from '../../libro-protocol.js';
21
+ import { DragAreaKey, isCellView } from '../../libro-protocol.js';
12
22
  import type { CellView, DndContentProps } from '../../libro-protocol.js';
23
+ import { MultiSelectionWhenShiftClick } from '../../libro-setting.js';
13
24
  import type { LibroView } from '../../libro-view.js';
14
25
  import { HolderOutlined, PlusOutlined } from '../../material-from-designer.js';
15
- import { hasErrorOutput } from '../../output/index.js';
26
+ import { VirtualizedManagerHelper } from '../../virtualized-manager-helper.js';
16
27
  import { BetweenCellProvider } from '../cell-protocol.js';
17
28
 
18
29
  export interface Dragparams {
@@ -20,17 +31,51 @@ export interface Dragparams {
20
31
  index: number;
21
32
  }
22
33
 
23
- export const DefaultDndContent: React.FC<DndContentProps> = ({ cell, index }) => {
34
+ export const DndCellContainer: React.FC<DndContentProps> = ({ cell, index }) => {
24
35
  const ref = useRef<HTMLDivElement>(null);
25
36
  const instance = useInject<LibroView>(ViewInstance);
26
37
  const [multiSelectionWhenShiftClick] = useConfigurationValue(
27
38
  MultiSelectionWhenShiftClick,
28
39
  );
29
40
  const BetweenCellContent = useInject<BetweenCellProvider>(BetweenCellProvider);
30
- const cellService = useInject<CellService>(CellService);
41
+ const cellService = useInject<CellService>(LibroCellService);
42
+ const virtualizedManagerHelper = useInject(VirtualizedManagerHelper);
43
+ const virtualizedManager = virtualizedManagerHelper.getOrCreate(cell.parent.model);
31
44
  const dragDropManager = useDragDropManager();
32
45
  const dragDropMonitor = dragDropManager.getMonitor();
33
46
  const ItemRender = getOrigin(instance.dndItemRender);
47
+
48
+ useLayoutEffect(() => {
49
+ if (typeof ref !== 'object') {
50
+ return () => {
51
+ //
52
+ };
53
+ }
54
+ const el = ref?.current;
55
+ if (!el) {
56
+ return () => {
57
+ //
58
+ };
59
+ }
60
+
61
+ const resizeObserver = new ResizeObserver((entries) => {
62
+ entries.forEach((entry) => {
63
+ const isVisible =
64
+ entry.contentRect.width !== 0 && entry.contentRect.height !== 0;
65
+
66
+ if (isVisible) {
67
+ cell.noEditorAreaHeight = ref.current?.clientHeight || 0;
68
+ }
69
+ });
70
+ });
71
+
72
+ resizeObserver.observe(el as HTMLElement);
73
+ return () => {
74
+ cell.noEditorAreaHeight = 0;
75
+ resizeObserver.disconnect();
76
+ };
77
+ }, [ref, cell]);
78
+
34
79
  const handleFocus = useCallback(
35
80
  (e: React.FocusEvent<HTMLElement>) => {
36
81
  const className = (e.target as HTMLDivElement).className;
@@ -75,6 +120,9 @@ export const DefaultDndContent: React.FC<DndContentProps> = ({ cell, index }) =>
75
120
  instance.model.selections = [];
76
121
  }, [instance, cell]);
77
122
 
123
+ const scrollTimer = useRef<null | NodeJS.Timeout>(null);
124
+ const unsubscribe = useRef<null | any>(null);
125
+
78
126
  const [{ isDrag }, drag, preview] = useDrag(
79
127
  {
80
128
  type: DragAreaKey,
@@ -84,40 +132,46 @@ export const DefaultDndContent: React.FC<DndContentProps> = ({ cell, index }) =>
84
132
  }),
85
133
  end() {
86
134
  instance.isDragging = false;
135
+ if (scrollTimer.current) {
136
+ clearInterval(scrollTimer.current);
137
+ }
87
138
  },
88
139
  },
89
140
  [cell, index],
90
141
  );
91
- dragDropMonitor.subscribeToStateChange(() => {
92
- instance.isDragging = dragDropMonitor.isDragging();
93
- });
142
+
94
143
  const libroViewContent = instance.container?.current?.getElementsByClassName(
95
144
  'libro-view-content',
96
145
  )[0] as HTMLElement;
97
- const scrollTimer = useRef<null | NodeJS.Timeout>(null);
146
+
98
147
  useEffect(() => {
99
- scrollTimer.current = setInterval(() => {
100
- const currentOffset = dragDropMonitor.getClientOffset();
101
- if (libroViewContent && instance.isDragging && currentOffset) {
102
- const libroViewClientRect = libroViewContent.getBoundingClientRect();
103
- const { top, bottom } = libroViewClientRect;
104
- const { y } = currentOffset;
105
- const topLimit = top + 30;
106
- const bottomLimit = bottom - 50;
107
- if (y < topLimit) {
108
- libroViewContent.scrollTop -= 0.5;
109
- } else if (y > bottomLimit) {
110
- libroViewContent.scrollTop += 0.5;
148
+ unsubscribe.current = dragDropMonitor.subscribeToStateChange(() => {
149
+ instance.isDragging = dragDropMonitor.isDragging();
150
+ scrollTimer.current = setInterval(() => {
151
+ const currentOffset = dragDropMonitor.getClientOffset();
152
+ if (libroViewContent && instance.isDragging && currentOffset) {
153
+ const libroViewClientRect = libroViewContent.getBoundingClientRect();
154
+ const { top, bottom } = libroViewClientRect;
155
+ const { y } = currentOffset;
156
+ const topLimit = top + 30;
157
+ const bottomLimit = bottom - 50;
158
+ if (y < topLimit) {
159
+ libroViewContent.scrollTop -= 0.5;
160
+ } else if (y > bottomLimit) {
161
+ libroViewContent.scrollTop += 0.5;
162
+ }
111
163
  }
112
- }
113
- }, 10);
114
- return () => {
115
- if (scrollTimer.current) {
116
- clearInterval(scrollTimer.current);
117
- }
118
- };
119
- // eslint-disable-next-line react-hooks/exhaustive-deps
120
- }, []);
164
+ }, 10);
165
+ return () => {
166
+ if (scrollTimer.current) {
167
+ clearInterval(scrollTimer.current);
168
+ }
169
+ if (unsubscribe.current) {
170
+ unsubscribe.current();
171
+ }
172
+ };
173
+ });
174
+ }, [dragDropMonitor]);
121
175
 
122
176
  useEffect(() => {
123
177
  // This gets called after every render, by default
@@ -155,7 +209,7 @@ export const DefaultDndContent: React.FC<DndContentProps> = ({ cell, index }) =>
155
209
  view.dispose();
156
210
  return;
157
211
  })
158
- .catch(() => {
212
+ .catch((e) => {
159
213
  //
160
214
  });
161
215
  if (isCellView(item.cell)) {
@@ -183,17 +237,31 @@ export const DefaultDndContent: React.FC<DndContentProps> = ({ cell, index }) =>
183
237
  }
184
238
  if (isDragInSelections) {
185
239
  instance.model.exchangeCells(instance.model.selections, dropIndex);
186
- instance.model.scrollToView(cell);
240
+ if (virtualizedManager.isVirtualized) {
241
+ instance.model.scrollToCellView({ cellIndex: dropIndex });
242
+ } else {
243
+ instance.model.scrollToView(cell);
244
+ }
245
+
187
246
  return;
188
247
  }
189
248
  }
190
249
  if (dragIndex < dropIndex) {
191
250
  instance.model.exchangeCell(dragIndex, dropIndex - 1);
192
- instance.model.scrollToView(cell);
251
+
252
+ if (virtualizedManager.isVirtualized) {
253
+ instance.model.scrollToCellView({ cellIndex: dropIndex });
254
+ } else {
255
+ instance.model.scrollToView(cell);
256
+ }
193
257
  }
194
258
  if (dragIndex > dropIndex) {
195
259
  instance.model.exchangeCell(dragIndex, dropIndex);
196
- instance.model.scrollToView(cell);
260
+ if (virtualizedManager.isVirtualized) {
261
+ instance.model.scrollToCellView({ cellIndex: dropIndex });
262
+ } else {
263
+ instance.model.scrollToView(cell);
264
+ }
197
265
  }
198
266
  }
199
267
  return;
@@ -214,15 +282,18 @@ export const DefaultDndContent: React.FC<DndContentProps> = ({ cell, index }) =>
214
282
  instance.model.mouseMode = 'drag';
215
283
  }
216
284
 
217
- const isSelected = instance.isSelected(cell);
285
+ const isMultiSelected =
286
+ instance.model.selections.length !== 0 && instance.isSelected(cell);
218
287
  // let isMouseOver = false;
219
288
  const [isMouseOverDragArea, setIsMouseOverDragArea] = useState(false);
220
- const hasCellHidden = cell.hasCellHidden();
221
- const hasErrorOutputs = hasErrorOutput(cell);
289
+ const hasCellHidden = useMemo(() => {
290
+ return cell.hasCellHidden();
291
+ }, [cell]);
222
292
  const isCollapsible = CellCollapsible.is(cell);
293
+
223
294
  return (
224
295
  <div
225
- className={`libro-dnd-cell-container ${isSelected ? 'selected' : ''} ${
296
+ className={`libro-dnd-cell-container ${isMultiSelected ? 'multi-selected' : ''} ${
226
297
  hasCellHidden ? 'hidden' : ''
227
298
  }`}
228
299
  data-handler-id={handlerId}
@@ -245,7 +316,7 @@ export const DefaultDndContent: React.FC<DndContentProps> = ({ cell, index }) =>
245
316
  tabIndex={-1}
246
317
  onFocus={handleFocus}
247
318
  // onClick={e => e.preventDefault()}
248
- className={`libro-dnd-cell-content ${hasErrorOutputs ? 'error' : ''}`}
319
+ className="libro-dnd-cell-content"
249
320
  >
250
321
  <ItemRender
251
322
  isDragOver={!!isDragOver}
@@ -1,5 +1,5 @@
1
- import { ViewInstance } from '@difizen/mana-app';
2
1
  import { getOrigin, useInject } from '@difizen/mana-app';
2
+ import { ViewInstance } from '@difizen/mana-app';
3
3
  import type { FC } from 'react';
4
4
  import { DndProvider } from 'react-dnd';
5
5
  import { HTML5Backend } from 'react-dnd-html5-backend';
@@ -1,57 +1,149 @@
1
1
  import { getOrigin, useInject, useObserve, ViewInstance } from '@difizen/mana-app';
2
- import type { FC } from 'react';
3
- import { forwardRef, memo } from 'react';
2
+ import classNames from 'classnames';
3
+ import type { FC, ReactNode } from 'react';
4
+ import { forwardRef, memo, useEffect, useState } from 'react';
4
5
  import type { XYCoord } from 'react-dnd';
5
6
  import { useDrop } from 'react-dnd';
6
7
 
7
- import { LibroCellService } from '../../cell/index.js';
8
8
  import type { CellService } from '../../cell/index.js';
9
- import { DragAreaKey, isCellView } from '../../libro-protocol.js';
9
+ import { LibroCellService } from '../../cell/index.js';
10
10
  import type { CellView, DndContentProps } from '../../libro-protocol.js';
11
+ import { DragAreaKey, isCellView } from '../../libro-protocol.js';
11
12
  import type { LibroView } from '../../libro-view.js';
13
+ import { VirtualizedManagerHelper } from '../../virtualized-manager-helper.js';
14
+ import { LibroCellsOutputRender } from '../libro-virtualized-render.js';
12
15
 
13
16
  import type { Dragparams } from './default-dnd-content.js';
17
+ import './index.less';
14
18
 
15
- const DndContent: FC<DndContentProps> = ({ cell, index, ...props }) => {
19
+ export const DndCellRender: FC<DndContentProps> = memo(function DndCellRender({
20
+ cell,
21
+ index,
22
+ ...props
23
+ }: DndContentProps) {
16
24
  const observableCell = useObserve(cell);
17
25
  const instance = useInject<LibroView>(ViewInstance);
18
- const DndContentRender = instance.dndContentRender;
26
+ const DndCellContainer = instance.dndContentRender;
27
+
19
28
  return (
20
- <DndContentRender cell={observableCell} key={cell.id} index={index} {...props} />
29
+ <DndCellContainer cell={observableCell} key={cell.id} index={index} {...props} />
21
30
  );
22
- };
23
- const DndContentMemo = memo(DndContent);
24
-
25
- export const DndCellContent = forwardRef<HTMLDivElement, { libroView: LibroView }>(
26
- function DndCellContent({ libroView }, ref) {
27
- const LoadingRender = getOrigin(libroView.loadingRender);
28
- const cells = libroView.model.getCells().reduce<CellView[]>(function (a, b) {
29
- if (a.indexOf(b) < 0) {
30
- a.push(b);
31
- }
32
- return a;
33
- }, []);
34
- return (
35
- <div className="libro-dnd-cells-container" ref={ref}>
36
- {!libroView.model.isInitialized && <LoadingRender />}
37
- {libroView.model.isInitialized &&
38
- cells
39
- .filter((cell) => cell.collapsedHidden === false)
40
- .map((cell, index) => {
41
- return <DndContentMemo cell={cell} key={cell.id} index={index} />;
42
- })}
43
- </div>
44
- );
45
- },
31
+ });
32
+
33
+ // 定义一个函数用于渲染非虚拟列表时的单元格
34
+ const renderNonVirtualListCells = (cells: CellView[]) => (
35
+ <div style={{ height: '100%', overflow: 'visible' }}>
36
+ {cells
37
+ .filter((cell) => !cell.collapsedHidden)
38
+ .map((cell, index) => (
39
+ <DndCellRender cell={cell} key={cell.id} index={index} />
40
+ ))}
41
+ </div>
46
42
  );
47
43
 
48
- export function DndList({
49
- libroView,
50
- children,
51
- }: {
52
- libroView: LibroView;
53
- children: any;
54
- }) {
44
+ export const DndCellsRender = forwardRef<
45
+ HTMLDivElement,
46
+ { libroView: LibroView; addCellButtons: ReactNode }
47
+ >(function DndCellsRender(
48
+ { libroView, addCellButtons }: { libroView: LibroView; addCellButtons: ReactNode },
49
+ ref,
50
+ ) {
51
+ const LoadingRender = getOrigin(libroView.loadingRender);
52
+ const virtualizedManagerHelper = useInject(VirtualizedManagerHelper);
53
+ const virtualizedManager = virtualizedManagerHelper.getOrCreate(libroView.model);
54
+
55
+ const cells = libroView.model.getCells().reduce<CellView[]>(function (a, b) {
56
+ if (a.indexOf(b) < 0) {
57
+ a.push(b);
58
+ }
59
+ return a;
60
+ }, []);
61
+
62
+ const [isVirtualList, setIsVirtualList] = useState<boolean>(false);
63
+ const [isJudging, setIsJudging] = useState<boolean>(true);
64
+
65
+ useEffect(() => {
66
+ if (!libroView.model.isInitialized) {
67
+ return;
68
+ }
69
+
70
+ let size = undefined;
71
+ let path = undefined;
72
+
73
+ // TODO: 类型处理
74
+ const model = libroView.model as any;
75
+ if (model.currentFileContents && model.currentFileContents.size) {
76
+ size = parseFloat((model.currentFileContents.size / 1048576).toFixed(3)); // 单位MB
77
+ path = model.currentFileContents.path || '';
78
+ }
79
+
80
+ setIsJudging(true);
81
+ virtualizedManager
82
+ .openVirtualized(cells.length, size, path)
83
+ .then((willOpen) => {
84
+ setIsVirtualList(willOpen);
85
+ return;
86
+ })
87
+ .catch(() => {
88
+ setIsVirtualList(false);
89
+ })
90
+ .finally(() => {
91
+ setIsJudging(false);
92
+ })
93
+ .catch((e) => {
94
+ //
95
+ });
96
+ // eslint-disable-next-line react-hooks/exhaustive-deps
97
+ }, [virtualizedManager, libroView.model.isInitialized]);
98
+
99
+ const isInitialized = libroView.model.isInitialized;
100
+ const isLoading = !isInitialized || isJudging;
101
+ const shouldRenderCells = isInitialized && !isJudging;
102
+
103
+ return (
104
+ <>
105
+ <div
106
+ className={classNames(
107
+ 'libro-dnd-cells-container',
108
+ isVirtualList && 'virtual_list_container',
109
+ )}
110
+ ref={ref}
111
+ >
112
+ {isLoading && <LoadingRender />}
113
+ <>
114
+ {shouldRenderCells && (
115
+ <>
116
+ {isVirtualList ? (
117
+ <LibroCellsOutputRender
118
+ cells={cells}
119
+ libroView={libroView}
120
+ addCellButtons={addCellButtons}
121
+ />
122
+ ) : (
123
+ renderNonVirtualListCells(cells)
124
+ )}
125
+ </>
126
+ )}
127
+ </>
128
+ </div>
129
+ {shouldRenderCells && !isVirtualList && addCellButtons}
130
+ </>
131
+ );
132
+ });
133
+
134
+ export const DndList = forwardRef<
135
+ HTMLDivElement,
136
+ { libroView: LibroView; children: ReactNode }
137
+ >(function DndList(
138
+ {
139
+ libroView,
140
+ children,
141
+ }: {
142
+ libroView: LibroView;
143
+ children: ReactNode;
144
+ },
145
+ ref,
146
+ ) {
55
147
  const cellService = useInject<CellService>(LibroCellService);
56
148
 
57
149
  const [, drop] = useDrop<Dragparams>(() => ({
@@ -67,9 +159,10 @@ export function DndList({
67
159
  item.cell.parent.id,
68
160
  )
69
161
  .then((view) => {
70
- return view.dispose();
162
+ view.dispose();
163
+ return;
71
164
  })
72
- .catch(() => {
165
+ .catch((e) => {
73
166
  //
74
167
  });
75
168
  if (isCellView(item.cell)) {
@@ -112,8 +205,7 @@ export function DndList({
112
205
 
113
206
  return (
114
207
  <div className="libro-dnd-list-container" ref={drop}>
115
- <DndCellContent libroView={libroView} />
116
- {children}
208
+ <DndCellsRender libroView={libroView} addCellButtons={children} />
117
209
  </div>
118
210
  );
119
- }
211
+ });
@@ -0,0 +1,8 @@
1
+ .virtual_list_container {
2
+ height: 100%;
3
+ width: 100%;
4
+
5
+ // .ReactVirtualized__Grid__innerScrollContainer {
6
+ // overflow: auto !important;
7
+ // }
8
+ }
@@ -1,4 +1,4 @@
1
+ export * from './custom-drag-layer.js';
1
2
  export * from './default-dnd-content.js';
2
3
  export * from './dnd-context.js';
3
4
  export * from './dnd-list.js';
4
- export * from './custom-drag-layer.js';
@@ -0,0 +1,92 @@
1
+ export type OverscanIndicesGetterParams = {
2
+ // One of SCROLL_DIRECTION_HORIZONTAL or SCROLL_DIRECTION_VERTICAL
3
+ direction: 'horizontal' | 'vertical';
4
+
5
+ // One of SCROLL_DIRECTION_BACKWARD or SCROLL_DIRECTION_FORWARD
6
+ scrollDirection: -1 | 1;
7
+
8
+ // Number of rows or columns in the current axis
9
+ cellCount: number;
10
+
11
+ // Maximum number of cells to over-render in either direction
12
+ overscanCellsCount: number;
13
+
14
+ // Begin of range of visible cells
15
+ startIndex: number;
16
+
17
+ // End of range of visible cells
18
+ stopIndex: number;
19
+ };
20
+
21
+ export type OverscanIndices = {
22
+ overscanStartIndex: number;
23
+ overscanStopIndex: number;
24
+ };
25
+
26
+ export const SCROLL_DIRECTION_BACKWARD = -1;
27
+ export const SCROLL_DIRECTION_FORWARD = 1;
28
+
29
+ export const SCROLL_DIRECTION_HORIZONTAL = 'horizontal';
30
+ export const SCROLL_DIRECTION_VERTICAL = 'vertical';
31
+
32
+ let overscanIndicesCache: { value: any; timestamp: number } | null = null;
33
+
34
+ /**
35
+ * Calculates the number of cells to overscan before and after a specified range.
36
+ * This function ensures that overscanning doesn't exceed the available cells.
37
+ */
38
+ export default function libroOverscanIndicesGetter({
39
+ cellCount,
40
+ overscanCellsCount,
41
+ scrollDirection,
42
+ startIndex,
43
+ stopIndex,
44
+ }: OverscanIndicesGetterParams): OverscanIndices {
45
+ // Make sure we render at least 1 cell extra before and after (except near boundaries)
46
+ // This is necessary in order to support keyboard navigation (TAB/SHIFT+TAB) in some cases
47
+ // For more info see issues #625
48
+
49
+ // 计算 overscanIndices 的函数
50
+ const calculateOverscanIndices = () => {
51
+ const _overscanCellsCount = Math.max(1, overscanCellsCount);
52
+
53
+ let overscanIndices = null;
54
+
55
+ if (scrollDirection === SCROLL_DIRECTION_FORWARD) {
56
+ overscanIndices = {
57
+ overscanStartIndex: Math.max(0, startIndex - 1),
58
+ overscanStopIndex: Math.min(cellCount - 1, stopIndex + _overscanCellsCount),
59
+ };
60
+ } else {
61
+ overscanIndices = {
62
+ overscanStartIndex: Math.max(0, startIndex - _overscanCellsCount),
63
+ overscanStopIndex: Math.min(cellCount - 1, stopIndex + 1),
64
+ };
65
+ }
66
+
67
+ return overscanIndices;
68
+ };
69
+
70
+ // 检查缓存和时间戳函数
71
+ const checkCacheAndTimestamp = () => {
72
+ if (cellCount === 1) {
73
+ // 'horizontal' 方向 不用缓存
74
+ const overscanIndices = calculateOverscanIndices();
75
+ return overscanIndices;
76
+ }
77
+
78
+ if (overscanIndicesCache && Date.now() - overscanIndicesCache.timestamp < 500) {
79
+ return overscanIndicesCache.value;
80
+ } else {
81
+ const overscanIndices = calculateOverscanIndices();
82
+ overscanIndicesCache = {
83
+ value: overscanIndices,
84
+ timestamp: Date.now(),
85
+ };
86
+
87
+ return overscanIndices;
88
+ }
89
+ };
90
+
91
+ return checkCacheAndTimestamp();
92
+ }
@@ -0,0 +1,34 @@
1
+ import { prop, singleton } from '@difizen/mana-app';
2
+
3
+ export interface IVirtualizedManager {
4
+ openVirtualized: (length: number, size?: number) => Promise<boolean>;
5
+ isVirtualized: boolean;
6
+ }
7
+
8
+ @singleton()
9
+ export class VirtualizedManager implements IVirtualizedManager {
10
+ /**
11
+ * 因为进行isVirtualized判断过后才会渲染list
12
+ * 所以它用于滚动到某个cell的判断依据是没有问题的。
13
+ */
14
+ @prop()
15
+ isVirtualized = false;
16
+
17
+ /**
18
+ *
19
+ * @param length cell个数
20
+ * @param size undefined 或者 单位 为B
21
+ * @returns 是否使用虚拟滚动
22
+ */
23
+ openVirtualized = async (length: number, size?: number) => {
24
+ // this.isVirtualized = true;
25
+ // return true;
26
+ if (length > 100 || (size && size > 4)) {
27
+ this.isVirtualized = true;
28
+ return true;
29
+ } else {
30
+ this.isVirtualized = false;
31
+ return false;
32
+ }
33
+ };
34
+ }
@@ -1,5 +1,5 @@
1
- export * from './libro-component.js';
2
- export * from './dnd-component/index.js';
3
1
  export * from './cell-protocol.js';
4
2
  export * from './dnd-cell-item-render.js';
3
+ export * from './dnd-component/index.js';
4
+ export * from './libro-component.js';
5
5
  export * from './libro-side-toolbar-menu.js';