register.ts 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import { Attrib, ShapeType, Plugin } from "./type";
  2. import { Container } from "./packages/container";
  3. import { EntityType } from "./packages";
  4. export const register = <
  5. T extends string,
  6. R extends Attrib,
  7. S extends ShapeType,
  8. PT extends { [key in string]: Plugin },
  9. TYPE extends EntityType<R, S> = EntityType<R, S>,
  10. TYPES extends { [key in T]: TYPE } = { [key in T]: TYPE },
  11. DATA extends { [key in T]?: R | R[] } = { [key in T]?: R | R[] }
  12. >(
  13. types: TYPES,
  14. plugins?: PT
  15. ) => {
  16. const initBoard = (dom?: HTMLDivElement, data?: DATA, readonly = false) => {
  17. const virtual = document.createElement("div");
  18. virtual.style.width = "100%";
  19. virtual.style.height = "100%";
  20. const container = new Container({
  21. dom: virtual,
  22. readonly,
  23. types,
  24. data,
  25. reactive: !readonly,
  26. });
  27. container.init();
  28. const pluginApis = {} as PT;
  29. if (plugins) {
  30. for (const key in plugins) {
  31. const plugin = plugins[key];
  32. plugin.setTree(container);
  33. pluginApis[key] = plugin;
  34. }
  35. }
  36. let mountedDom: HTMLDivElement | null = null;
  37. const mount = (dom: HTMLDivElement) => {
  38. if (virtual.parentElement) {
  39. virtual.parentElement.removeChild(virtual);
  40. }
  41. dom.appendChild(virtual);
  42. virtual.style.width = "100%";
  43. virtual.style.height = "100%";
  44. container.stage.width(virtual.offsetWidth);
  45. container.stage.width(virtual.offsetHeight);
  46. mountedDom = dom;
  47. };
  48. if (!dom) {
  49. virtual.style.width = "300px";
  50. virtual.style.height = "300px";
  51. } else {
  52. mount(dom);
  53. }
  54. return {
  55. types,
  56. tree: container,
  57. setData(newData: Partial<DATA>) {
  58. container.setAttrib({ data: newData as any });
  59. },
  60. getData() {
  61. return container.attrib.data;
  62. },
  63. destory() {
  64. for (const key in plugins) {
  65. const plugin = plugins[key];
  66. plugin.destory && plugin.destory();
  67. }
  68. container.destory();
  69. },
  70. mountedDom,
  71. mount,
  72. ...pluginApis,
  73. };
  74. };
  75. return initBoard;
  76. };