register.ts 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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. console.log(virtual);
  42. dom.appendChild(virtual);
  43. virtual.style.width = "100%";
  44. virtual.style.height = "100%";
  45. container.stage.width(virtual.offsetWidth);
  46. container.stage.width(virtual.offsetHeight);
  47. mountedDom = dom;
  48. };
  49. if (!dom) {
  50. virtual.style.width = "300px";
  51. virtual.style.height = "300px";
  52. } else {
  53. mount(dom);
  54. }
  55. return {
  56. types,
  57. tree: container,
  58. setData(newData: Partial<DATA>) {
  59. container.setAttrib({ data: newData as any });
  60. },
  61. getData() {
  62. return container.attrib.data;
  63. },
  64. destory() {
  65. for (const key in plugins) {
  66. const plugin = plugins[key];
  67. plugin.destory && plugin.destory();
  68. }
  69. container.destory();
  70. },
  71. mountedDom,
  72. mount,
  73. ...pluginApis,
  74. };
  75. };
  76. return initBoard;
  77. };