@visactor/react-vtable 1.4.0-alpha.0 → 1.4.0
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.
- package/cjs/components/base-component.d.ts +2 -0
- package/cjs/components/base-component.js +20 -8
- package/cjs/components/base-component.js.map +1 -1
- package/cjs/components/custom/component.d.ts +16 -0
- package/cjs/components/custom/component.js +7 -0
- package/cjs/components/custom/component.js.map +1 -0
- package/cjs/components/custom/custom-layout.d.ts +10 -0
- package/cjs/components/custom/custom-layout.js +96 -0
- package/cjs/components/custom/custom-layout.js.map +1 -0
- package/cjs/components/custom/graphic.d.ts +32 -0
- package/cjs/components/custom/graphic.js +9 -0
- package/cjs/components/custom/graphic.js.map +1 -0
- package/cjs/components/custom/reconciler.d.ts +5 -0
- package/cjs/components/custom/reconciler.js +105 -0
- package/cjs/components/custom/reconciler.js.map +1 -0
- package/cjs/components/custom/vtable-browser-env-contribution.d.ts +2 -0
- package/cjs/components/custom/vtable-browser-env-contribution.js +35 -0
- package/cjs/components/custom/vtable-browser-env-contribution.js.map +1 -0
- package/cjs/components/custom/vtable-react-attribute-plugin.d.ts +17 -0
- package/cjs/components/custom/vtable-react-attribute-plugin.js +92 -0
- package/cjs/components/custom/vtable-react-attribute-plugin.js.map +1 -0
- package/cjs/components/index.d.ts +3 -0
- package/cjs/components/index.js +25 -1
- package/cjs/components/index.js.map +1 -1
- package/cjs/eventsUtils.js +1 -2
- package/cjs/index.d.ts +2 -3
- package/cjs/index.js +4 -19
- package/cjs/index.js.map +1 -1
- package/cjs/tables/base-table.d.ts +2 -1
- package/cjs/tables/base-table.js +14 -5
- package/cjs/tables/base-table.js.map +1 -1
- package/cjs/vtable.d.ts +2 -0
- package/cjs/vtable.js +35 -0
- package/cjs/vtable.js.map +1 -0
- package/dist/react-vtable.js +10115 -137
- package/dist/react-vtable.min.js +30 -3
- package/es/components/base-component.d.ts +2 -0
- package/es/components/base-component.js +21 -7
- package/es/components/base-component.js.map +1 -1
- package/es/components/custom/component.d.ts +16 -0
- package/es/components/custom/component.js +6 -0
- package/es/components/custom/component.js.map +1 -0
- package/es/components/custom/custom-layout.d.ts +10 -0
- package/es/components/custom/custom-layout.js +70 -0
- package/es/components/custom/custom-layout.js.map +1 -0
- package/es/components/custom/graphic.d.ts +32 -0
- package/es/components/custom/graphic.js +22 -0
- package/es/components/custom/graphic.js.map +1 -0
- package/es/components/custom/reconciler.d.ts +5 -0
- package/es/components/custom/reconciler.js +105 -0
- package/es/components/custom/reconciler.js.map +1 -0
- package/es/components/custom/vtable-browser-env-contribution.d.ts +2 -0
- package/es/components/custom/vtable-browser-env-contribution.js +33 -0
- package/es/components/custom/vtable-browser-env-contribution.js.map +1 -0
- package/es/components/custom/vtable-react-attribute-plugin.d.ts +17 -0
- package/es/components/custom/vtable-react-attribute-plugin.js +86 -0
- package/es/components/custom/vtable-react-attribute-plugin.js.map +1 -0
- package/es/components/index.d.ts +3 -0
- package/es/components/index.js +6 -0
- package/es/components/index.js.map +1 -1
- package/es/eventsUtils.js +1 -2
- package/es/index.d.ts +2 -3
- package/es/index.js +3 -4
- package/es/index.js.map +1 -1
- package/es/tables/base-table.d.ts +2 -1
- package/es/tables/base-table.js +17 -4
- package/es/tables/base-table.js.map +1 -1
- package/es/vtable.d.ts +2 -0
- package/es/vtable.js +4 -0
- package/es/vtable.js.map +1 -0
- package/package.json +8 -6
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
export interface BaseComponentProps {
|
|
3
3
|
id?: string | number;
|
|
4
|
+
children?: React.ReactNode;
|
|
4
5
|
}
|
|
5
6
|
type ComponentProps = BaseComponentProps & {
|
|
6
7
|
updateId?: number;
|
|
7
8
|
componentId?: number;
|
|
9
|
+
componentIndex?: number;
|
|
8
10
|
};
|
|
9
11
|
export declare const createComponent: <T extends ComponentProps>(componentName: string, optionName: string, supportedEvents?: Record<string, string> | null, isSingle?: boolean) => React.FC<T>;
|
|
10
12
|
export {};
|
|
@@ -6,8 +6,10 @@ import RootTableContext from "../context/table";
|
|
|
6
6
|
|
|
7
7
|
import { bindEventsToTable } from "../eventsUtils";
|
|
8
8
|
|
|
9
|
+
import { CustomLayout } from "./custom/custom-layout";
|
|
10
|
+
|
|
9
11
|
export const createComponent = (componentName, optionName, supportedEvents, isSingle) => {
|
|
10
|
-
const ignoreKeys = [ "id", "updateId", "componentId" ], notOptionKeys = supportedEvents ? Object.keys(supportedEvents).concat(ignoreKeys) : ignoreKeys, Comp = props => {
|
|
12
|
+
const ignoreKeys = [ "id", "updateId", "componentId", "componentIndex", "children" ], notOptionKeys = supportedEvents ? Object.keys(supportedEvents).concat(ignoreKeys) : ignoreKeys, Comp = props => {
|
|
11
13
|
const context = useContext(RootTableContext), eventsBinded = React.useRef(null), updateId = React.useRef(props.updateId);
|
|
12
14
|
if (props.updateId !== updateId.current) {
|
|
13
15
|
updateId.current = props.updateId;
|
|
@@ -15,11 +17,23 @@ export const createComponent = (componentName, optionName, supportedEvents, isSi
|
|
|
15
17
|
}
|
|
16
18
|
return useEffect((() => () => {
|
|
17
19
|
supportedEvents && bindEventsToTable(context.table, null, eventsBinded.current, supportedEvents);
|
|
18
|
-
}), []),
|
|
20
|
+
}), []), props.children ? React.Children.map(props.children, (child => React.createElement(CustomLayout, {
|
|
21
|
+
componentIndex: props.componentIndex
|
|
22
|
+
}, child))) : null;
|
|
19
23
|
};
|
|
20
|
-
return Comp.displayName = componentName, Comp.parseOption = props =>
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
24
|
+
return Comp.displayName = componentName, Comp.parseOption = props => {
|
|
25
|
+
const newComponentOption = pickWithout(props, notOptionKeys);
|
|
26
|
+
if (props.children) {
|
|
27
|
+
const {children: children} = props;
|
|
28
|
+
React.Children.map(children, (child => {
|
|
29
|
+
"custom-layout" === child.props.role && (newComponentOption.customLayout = "react-custom-layout"),
|
|
30
|
+
"header-custom-layout" === child.props.role && (newComponentOption.headerCustomLayout = "react-custom-layout");
|
|
31
|
+
}));
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
option: newComponentOption,
|
|
35
|
+
optionName: optionName,
|
|
36
|
+
isSingle: isSingle
|
|
37
|
+
};
|
|
38
|
+
}, Comp;
|
|
25
39
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["components/base-component.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["components/base-component.tsx"],"names":[],"mappings":"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","file":"base-component.js","sourcesContent":["import type { ReactElement } from 'react';\nimport React, { useContext, useEffect } from 'react';\nimport { isEqual, isNil, pickWithout } from '@visactor/vutils';\n\nimport type { TableContextType } from '../context/table';\nimport RootTableContext from '../context/table';\nimport { bindEventsToTable } from '../eventsUtils';\nimport { uid } from '../util';\nimport { CustomLayout } from './custom/custom-layout';\n\nexport interface BaseComponentProps {\n id?: string | number;\n children?: React.ReactNode;\n}\n\ntype ComponentProps = BaseComponentProps & { updateId?: number; componentId?: number; componentIndex?: number };\n\nexport const createComponent = <T extends ComponentProps>(\n componentName: string,\n optionName: string,\n supportedEvents?: Record<string, string> | null,\n isSingle?: boolean\n) => {\n const ignoreKeys = ['id', 'updateId', 'componentId', 'componentIndex', 'children'];\n const notOptionKeys = supportedEvents ? Object.keys(supportedEvents).concat(ignoreKeys) : ignoreKeys;\n\n const Comp: React.FC<T> = (props: T) => {\n const context = useContext(RootTableContext);\n // const id = React.useRef<string | number>(isNil(props.id) ? uid(optionName) : props.id);\n\n const eventsBinded = React.useRef<T>(null);\n const updateId = React.useRef<number>(props.updateId);\n // const componentOption = React.useRef<Partial<T>>();\n\n if (props.updateId !== updateId.current) {\n // update triggered by table when table is rendered\n updateId.current = props.updateId;\n\n // rebind events after table render\n const hasPrevEventsBinded = supportedEvents\n ? bindEventsToTable(context.table, props, eventsBinded.current, supportedEvents)\n : false;\n if (hasPrevEventsBinded) {\n eventsBinded.current = props;\n }\n // } else {\n // const newComponentOption: Partial<T> = pickWithout<T>(props, notOptionKeys);\n\n // if (!isEqual(newComponentOption, componentOption.current)) {\n // componentOption.current = newComponentOption;\n // updateToContext(context, id.current, optionName, isSingle, newComponentOption);\n // }\n }\n\n useEffect(() => {\n return () => {\n if (supportedEvents) {\n bindEventsToTable(context.table, null, eventsBinded.current, supportedEvents);\n }\n // deleteToContext(context, id.current, optionName, isSingle);\n };\n }, []);\n\n // children are all custom layout temply\n // return props.children\n // ? React.cloneElement(props.children as ReactElement, { componentIndex: props.componentIndex })\n // : null;\n if (props.children) {\n return React.Children.map(props.children as ReactElement, (child: ReactElement) => {\n return React.createElement(CustomLayout, { componentIndex: props.componentIndex }, child);\n });\n }\n return null;\n };\n\n Comp.displayName = componentName;\n\n (Comp as any).parseOption = (props: T & { updateId?: number; componentId?: string }) => {\n const newComponentOption: Partial<T> = pickWithout<T>(props, notOptionKeys);\n\n // deal width customLayout\n if (props.children) {\n const { children } = props;\n React.Children.map(children as ReactElement, (child: ReactElement) => {\n if (child.props.role === 'custom-layout') {\n (newComponentOption as any).customLayout = 'react-custom-layout';\n }\n if (child.props.role === 'header-custom-layout') {\n (newComponentOption as any).headerCustomLayout = 'react-custom-layout';\n }\n });\n }\n // if (props.children && (props.children as React.ReactElement).props.role === 'custom-layout') {\n // (newComponentOption as any).customLayout = 'react-custom-layout';\n // }\n\n return {\n option: newComponentOption,\n optionName,\n isSingle\n };\n };\n\n return Comp;\n};\n\n// const updateToContext = (\n// context: TableContextType,\n// id: string | number,\n// optionName: string,\n// isSingle: boolean,\n// props: Partial<ComponentProps>\n// ) => {\n// if (!context.optionFromChildren) {\n// return;\n// }\n\n// if (isSingle) {\n// context.optionFromChildren[optionName] = { ...props };\n// } else {\n// if (!context.optionFromChildren[optionName]) {\n// context.optionFromChildren[optionName] = [];\n// }\n\n// const comps = context.optionFromChildren[optionName];\n// const index = comps.findIndex((entry: any) => entry.id === id);\n\n// if (index >= 0) {\n// comps[index] = {\n// id,\n// ...props\n// };\n// } else {\n// context.optionFromChildren[optionName].push({\n// id,\n// ...props\n// });\n// }\n// }\n// context.isChildrenUpdated = true;\n// };\n\n// const deleteToContext = (context: TableContextType, id: string | number, optionName: string, isSingle: boolean) => {\n// if (!context.optionFromChildren) {\n// return;\n// }\n\n// if (isSingle) {\n// context.optionFromChildren[optionName] = null;\n// } else {\n// const comps = context.optionFromChildren[optionName] ?? [];\n// const index = comps.findIndex((entry: any) => entry.id === id);\n\n// if (index >= 0) {\n// const newComps = comps.slice(0, index - 1).concat(comps.slice(index + 1));\n\n// context.optionFromChildren[optionName] = newComps;\n// context.isChildrenUpdated = true;\n// }\n// }\n// };\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ReactElement, ReactNode, Ref, JSXElementConstructor } from 'react';
|
|
2
|
+
import type { VRender } from '@visactor/vtable';
|
|
3
|
+
type IGraphic = VRender.IGraphic;
|
|
4
|
+
type TagAttributes = VRender.TagAttributes;
|
|
5
|
+
type RadioAttributes = VRender.RadioAttributes;
|
|
6
|
+
type CheckboxAttributes = VRender.CheckboxAttributes;
|
|
7
|
+
type IEventParamsType = VRender.IEventParamsType;
|
|
8
|
+
type GraphicProps<IGraphicGraphicAttribute> = {
|
|
9
|
+
attribute: IGraphicGraphicAttribute;
|
|
10
|
+
ref?: Ref<IGraphic>;
|
|
11
|
+
children?: ReactNode;
|
|
12
|
+
} & IEventParamsType;
|
|
13
|
+
export declare const Tag: (props: GraphicProps<TagAttributes>) => ReactElement<GraphicProps<TagAttributes>, JSXElementConstructor<GraphicProps<TagAttributes>>>;
|
|
14
|
+
export declare const Radio: (props: GraphicProps<RadioAttributes>) => ReactElement<GraphicProps<RadioAttributes>, JSXElementConstructor<GraphicProps<RadioAttributes>>>;
|
|
15
|
+
export declare const Checkbox: (props: GraphicProps<CheckboxAttributes>) => ReactElement<GraphicProps<CheckboxAttributes>, JSXElementConstructor<GraphicProps<CheckboxAttributes>>>;
|
|
16
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["components/custom/component.ts"],"names":[],"mappings":"AAcA,MAAM,CAAC,MAAM,GAAG,GAEqF,KAAY,CAAC;AAElH,MAAM,CAAC,MAAM,KAAK,GAEuF,OAAc,CAAC;AAExH,MAAM,CAAC,MAAM,QAAQ,GAGnB,UAAiB,CAAC","file":"component.js","sourcesContent":["import type { ReactElement, ReactNode, Ref, JSXElementConstructor } from 'react';\nimport type { VRender } from '@visactor/vtable';\ntype IGraphic = VRender.IGraphic;\ntype TagAttributes = VRender.TagAttributes;\ntype RadioAttributes = VRender.RadioAttributes;\ntype CheckboxAttributes = VRender.CheckboxAttributes;\ntype IEventParamsType = VRender.IEventParamsType;\n\ntype GraphicProps<IGraphicGraphicAttribute> = {\n attribute: IGraphicGraphicAttribute;\n ref?: Ref<IGraphic>;\n children?: ReactNode;\n} & IEventParamsType;\n\nexport const Tag: (\n props: GraphicProps<TagAttributes>\n) => ReactElement<GraphicProps<TagAttributes>, JSXElementConstructor<GraphicProps<TagAttributes>>> = 'tag' as any;\n\nexport const Radio: (\n props: GraphicProps<RadioAttributes>\n) => ReactElement<GraphicProps<RadioAttributes>, JSXElementConstructor<GraphicProps<RadioAttributes>>> = 'radio' as any;\n\nexport const Checkbox: (\n props: GraphicProps<CheckboxAttributes>\n) => ReactElement<GraphicProps<CheckboxAttributes>, JSXElementConstructor<GraphicProps<CheckboxAttributes>>> =\n 'checkbox' as any;\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { CustomRenderFunctionArg } from '@visactor/vtable/src/ts-types';
|
|
3
|
+
type CustomLayoutProps = {
|
|
4
|
+
componentIndex?: number;
|
|
5
|
+
};
|
|
6
|
+
export type CustomLayoutFunctionArg = Partial<CustomRenderFunctionArg> & {
|
|
7
|
+
role?: 'custom-layout' | 'header-custom-layout';
|
|
8
|
+
};
|
|
9
|
+
export declare const CustomLayout: React.FC<CustomLayoutProps>;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import React, { isValidElement, useCallback, useContext, useLayoutEffect, useRef } from "react";
|
|
2
|
+
|
|
3
|
+
import RootTableContext from "../../context/table";
|
|
4
|
+
|
|
5
|
+
import { VRender } from "@visactor/vtable";
|
|
6
|
+
|
|
7
|
+
import { reconcilor } from "./reconciler";
|
|
8
|
+
|
|
9
|
+
import { LegacyRoot } from "react-reconciler/constants";
|
|
10
|
+
|
|
11
|
+
const {Group: Group} = VRender;
|
|
12
|
+
|
|
13
|
+
export const CustomLayout = (props, ref) => {
|
|
14
|
+
const {componentIndex: componentIndex, children: children} = props;
|
|
15
|
+
if (!isValidElement(children)) return null;
|
|
16
|
+
const context = useContext(RootTableContext), {table: table} = context, isHeaderCustomLayout = "header-custom-layout" === children.props.role, container = useRef(new Map), createGraphic = useCallback((args => {
|
|
17
|
+
const key = `${args.col}-${args.row}`;
|
|
18
|
+
let group;
|
|
19
|
+
if (container.current.has(key)) {
|
|
20
|
+
const currentContainer = container.current.get(key);
|
|
21
|
+
reconcilorUpdateContainer(children, currentContainer, group, args), group = currentContainer.containerInfo;
|
|
22
|
+
} else {
|
|
23
|
+
group = new Group({});
|
|
24
|
+
const currentContainer = reconcilor.createContainer(group, LegacyRoot, null, null, null, "custom", null, null);
|
|
25
|
+
container.current.set(key, currentContainer), reconcilorUpdateContainer(children, currentContainer, group, args);
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
rootContainer: group,
|
|
29
|
+
renderDefault: !1
|
|
30
|
+
};
|
|
31
|
+
}), [ children ]), removeContainer = useCallback(((col, row) => {
|
|
32
|
+
const key = `${col}-${row}`;
|
|
33
|
+
if (container.current.has(key)) {
|
|
34
|
+
const currentContainer = container.current.get(key);
|
|
35
|
+
reconcilor.updateContainer(null, currentContainer, null), container.current.delete(key);
|
|
36
|
+
}
|
|
37
|
+
}), []);
|
|
38
|
+
return useLayoutEffect((() => () => {}), []), useLayoutEffect((() => {
|
|
39
|
+
var _a, _b, _c, _d;
|
|
40
|
+
null == table || table.checkReactCustomLayout(), table && !(null === (_a = table.reactCustomLayout) || void 0 === _a ? void 0 : _a.hasReactCreateGraphic(componentIndex, isHeaderCustomLayout)) ? (null === (_b = table.reactCustomLayout) || void 0 === _b || _b.setReactCreateGraphic(componentIndex, createGraphic, isHeaderCustomLayout),
|
|
41
|
+
null === (_c = table.reactCustomLayout) || void 0 === _c || _c.setReactRemoveGraphic(componentIndex, removeContainer, isHeaderCustomLayout),
|
|
42
|
+
null === (_d = table.reactCustomLayout) || void 0 === _d || _d.updateCustomCell(componentIndex, isHeaderCustomLayout)) : table && container.current.forEach(((value, key) => {
|
|
43
|
+
const [col, row] = key.split("-").map(Number), width = table.getColWidth(col), height = table.getRowHeight(row), currentContainer = value, args = {
|
|
44
|
+
col: col,
|
|
45
|
+
row: row,
|
|
46
|
+
dataValue: table.getCellOriginValue(col, row),
|
|
47
|
+
value: table.getCellValue(col, row) || "",
|
|
48
|
+
rect: {
|
|
49
|
+
left: 0,
|
|
50
|
+
top: 0,
|
|
51
|
+
right: width,
|
|
52
|
+
bottom: height,
|
|
53
|
+
width: width,
|
|
54
|
+
height: height
|
|
55
|
+
},
|
|
56
|
+
table: table
|
|
57
|
+
}, group = currentContainer.containerInfo;
|
|
58
|
+
reconcilorUpdateContainer(children, currentContainer, group, args), table.scenegraph.updateNextFrame();
|
|
59
|
+
}));
|
|
60
|
+
})), null;
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
function reconcilorUpdateContainer(children, currentContainer, group, args) {
|
|
64
|
+
reconcilor.updateContainer(React.cloneElement(children, Object.assign({}, args)), currentContainer, null);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function isReactElement(obj) {
|
|
68
|
+
return obj && obj.$$typeof === Symbol.for("react.element");
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=custom-layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["components/custom/custom-layout.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAChG,OAAO,gBAAgB,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAG3C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAExD,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;AAO1B,MAAM,CAAC,MAAM,YAAY,GAAgC,CAAC,KAA2C,EAAE,GAAG,EAAE,EAAE;IAC5G,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAC3C,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE;QAC7B,OAAO,IAAI,CAAC;KACb;IACD,MAAM,OAAO,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAC7C,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAE1B,MAAM,oBAAoB,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,sBAAsB,CAAC;IAG5E,MAAM,SAAS,GAAG,MAAM,CAAyB,IAAI,GAAG,EAAE,CAAC,CAAC;IAG5D,MAAM,aAAa,GAAqB,WAAW,CACjD,IAAI,CAAC,EAAE;QACL,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC;QACV,IAAI,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YAC9B,MAAM,gBAAgB,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAEpD,yBAAyB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YACnE,KAAK,GAAG,gBAAgB,CAAC,aAAa,CAAC;SACxC;aAAM;YACL,KAAK,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC;YACtB,MAAM,gBAAgB,GAAG,UAAU,CAAC,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YAC/G,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;YAC7C,yBAAyB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;SAGpE;QAED,OAAO;YACL,aAAa,EAAE,KAAK;YACpB,aAAa,EAAE,KAAK;SACrB,CAAC;IACJ,CAAC,EACD,CAAC,QAAQ,CAAC,CACX,CAAC;IAEF,MAAM,eAAe,GAAG,WAAW,CAAC,CAAC,GAAW,EAAE,GAAW,EAAE,EAAE;QAC/D,MAAM,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;QAC5B,IAAI,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YAC9B,MAAM,gBAAgB,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACpD,UAAU,CAAC,eAAe,CAAC,IAAI,EAAE,gBAAgB,EAAE,IAAI,CAAC,CAAC;YAEzD,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;SAC/B;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,eAAe,CAAC,GAAG,EAAE;QAGnB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAGlC,OAAO,GAAG,EAAE;YAEV,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACvC,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,eAAe,CAAC,GAAG,EAAE;;QAGnB,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAE1C,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,sBAAsB,EAAE,CAAC;QAChC,IAAI,KAAK,IAAI,CAAC,CAAA,MAAA,KAAK,CAAC,iBAAiB,0CAAE,qBAAqB,CAAC,cAAc,EAAE,oBAAoB,CAAC,CAAA,EAAE;YAClG,MAAA,KAAK,CAAC,iBAAiB,0CAAE,qBAAqB,CAC5C,cAAc,EACd,aAAa,EAEb,oBAAoB,CACrB,CAAC;YACF,MAAA,KAAK,CAAC,iBAAiB,0CAAE,qBAAqB,CAAC,cAAc,EAAE,eAAe,EAAE,oBAAoB,CAAC,CAAC;YACtG,MAAA,KAAK,CAAC,iBAAiB,0CAAE,gBAAgB,CAAC,cAAc,EAAE,oBAAoB,CAAC,CAAC;SACjF;aAAM,IAAI,KAAK,EAAE;YAEhB,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;gBACvC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;gBACrC,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;gBACvC,MAAM,gBAAgB,GAAG,KAAK,CAAC;gBAC/B,MAAM,IAAI,GAAG;oBACX,GAAG;oBACH,GAAG;oBACH,SAAS,EAAE,KAAK,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC;oBAC7C,KAAK,EAAE,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE;oBACzC,IAAI,EAAE;wBACJ,IAAI,EAAE,CAAC;wBACP,GAAG,EAAE,CAAC;wBACN,KAAK,EAAE,KAAK;wBACZ,MAAM,EAAE,MAAM;wBACd,KAAK;wBACL,MAAM;qBACP;oBACD,KAAK;iBACN,CAAC;gBAEF,MAAM,KAAK,GAAG,gBAAgB,CAAC,aAAa,CAAC;gBAC7C,yBAAyB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;gBAEnE,KAAK,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC;YACrC,CAAC,CAAC,CAAC;SACJ;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,SAAS,yBAAyB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,EAAE,IAAI;IACxE,UAAU,CAAC,eAAe,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,oBAAO,IAAI,EAAG,EAAE,gBAAgB,EAAE,IAAI,CAAC,CAAC;AAUhG,CAAC;AAED,SAAS,cAAc,CAAC,GAAG;IACzB,OAAO,GAAG,IAAI,GAAG,CAAC,QAAQ,KAAK,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;AAC7D,CAAC","file":"custom-layout.js","sourcesContent":["/* eslint-disable react-hooks/rules-of-hooks */\nimport type { PropsWithChildren } from 'react';\nimport React, { isValidElement, useCallback, useContext, useLayoutEffect, useRef } from 'react';\nimport RootTableContext from '../../context/table';\nimport { VRender } from '@visactor/vtable';\nimport type { ICustomLayoutFuc, CustomRenderFunctionArg } from '@visactor/vtable/src/ts-types';\nimport type { FiberRoot } from 'react-reconciler';\nimport { reconcilor } from './reconciler';\nimport { LegacyRoot } from 'react-reconciler/constants';\n\nconst { Group } = VRender;\ntype CustomLayoutProps = { componentIndex?: number };\n\nexport type CustomLayoutFunctionArg = Partial<CustomRenderFunctionArg> & {\n role?: 'custom-layout' | 'header-custom-layout';\n};\n\nexport const CustomLayout: React.FC<CustomLayoutProps> = (props: PropsWithChildren<CustomLayoutProps>, ref) => {\n const { componentIndex, children } = props;\n if (!isValidElement(children)) {\n return null;\n }\n const context = useContext(RootTableContext);\n const { table } = context;\n\n const isHeaderCustomLayout = children.props.role === 'header-custom-layout';\n\n // react customLayout component container cache\n const container = useRef<Map<string, FiberRoot>>(new Map());\n\n // customLayout function for vtable\n const createGraphic: ICustomLayoutFuc = useCallback(\n args => {\n const key = `${args.col}-${args.row}`;\n let group;\n if (container.current.has(key)) {\n const currentContainer = container.current.get(key);\n // reconcilor.updateContainer(React.cloneElement(children, { ...args }), currentContainer, null);\n reconcilorUpdateContainer(children, currentContainer, group, args);\n group = currentContainer.containerInfo;\n } else {\n group = new Group({});\n const currentContainer = reconcilor.createContainer(group, LegacyRoot, null, null, null, 'custom', null, null);\n container.current.set(key, currentContainer);\n reconcilorUpdateContainer(children, currentContainer, group, args);\n // const ele = React.cloneElement(children, { ...args });\n // reconcilor.updateContainer(ele, currentContainer, null);\n }\n\n return {\n rootContainer: group,\n renderDefault: false\n };\n },\n [children]\n );\n\n const removeContainer = useCallback((col: number, row: number) => {\n const key = `${col}-${row}`;\n if (container.current.has(key)) {\n const currentContainer = container.current.get(key);\n reconcilor.updateContainer(null, currentContainer, null);\n // group = currentContainer.containerInfo;\n container.current.delete(key);\n }\n }, []);\n\n useLayoutEffect(() => {\n // init and release\n // eslint-disable-next-line no-undef\n console.log('init', props, table);\n // table && (table._reactCreateGraphic = createGraphic); // never go to here\n // table?.renderWithRecreateCells();\n return () => {\n // eslint-disable-next-line no-undef\n console.log('release', props, table);\n };\n }, []);\n\n useLayoutEffect(() => {\n // update props\n // eslint-disable-next-line no-undef\n console.log('update props', props, table);\n\n table?.checkReactCustomLayout(); // init reactCustomLayout component\n if (table && !table.reactCustomLayout?.hasReactCreateGraphic(componentIndex, isHeaderCustomLayout)) {\n table.reactCustomLayout?.setReactCreateGraphic(\n componentIndex,\n createGraphic,\n // container.current,\n isHeaderCustomLayout\n ); // set customLayout function\n table.reactCustomLayout?.setReactRemoveGraphic(componentIndex, removeContainer, isHeaderCustomLayout); // set customLayout function\n table.reactCustomLayout?.updateCustomCell(componentIndex, isHeaderCustomLayout); // update cell content\n } else if (table) {\n // update all container\n container.current.forEach((value, key) => {\n const [col, row] = key.split('-').map(Number);\n const width = table.getColWidth(col); // to be fixed: may be merge cell\n const height = table.getRowHeight(row); // to be fixed: may be merge cell\n const currentContainer = value;\n const args = {\n col,\n row,\n dataValue: table.getCellOriginValue(col, row),\n value: table.getCellValue(col, row) || '',\n rect: {\n left: 0,\n top: 0,\n right: width,\n bottom: height,\n width,\n height\n },\n table\n };\n // update element in container\n const group = currentContainer.containerInfo;\n reconcilorUpdateContainer(children, currentContainer, group, args);\n // reconcilor.updateContainer(React.cloneElement(children, { ...args }), currentContainer, null);\n table.scenegraph.updateNextFrame();\n });\n }\n });\n\n return null;\n};\n\nfunction reconcilorUpdateContainer(children, currentContainer, group, args) {\n reconcilor.updateContainer(React.cloneElement(children, { ...args }), currentContainer, null);\n // group = group.firstChild;\n // if (isReactElement(group.attribute.html?.dom)) {\n // const div = document.createElement('div');\n // const root = ReactDOM.createRoot(div as HTMLElement);\n // root.render(group.attribute.html.dom);\n // group.attribute.html.dom = div;\n // // debugger;\n // // group.html.dom = div;\n // }\n}\n\nfunction isReactElement(obj) {\n return obj && obj.$$typeof === Symbol.for('react.element');\n}\n"]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ReactElement, ReactNode, Ref, JSXElementConstructor } from 'react';
|
|
2
|
+
import type { VRender } from '@visactor/vtable';
|
|
3
|
+
type IGraphic = VRender.IGraphic;
|
|
4
|
+
type IGroupGraphicAttribute = VRender.IGroupGraphicAttribute;
|
|
5
|
+
type ITextGraphicAttribute = VRender.ITextGraphicAttribute;
|
|
6
|
+
type IEventParamsType = VRender.IEventParamsType;
|
|
7
|
+
type IArcGraphicAttribute = VRender.IArcGraphicAttribute;
|
|
8
|
+
type ICircleGraphicAttribute = VRender.ICircleGraphicAttribute;
|
|
9
|
+
type IImageGraphicAttribute = VRender.IImageGraphicAttribute;
|
|
10
|
+
type ILineGraphicAttribute = VRender.ILineGraphicAttribute;
|
|
11
|
+
type IPathGraphicAttribute = VRender.IPathGraphicAttribute;
|
|
12
|
+
type IRectGraphicAttribute = VRender.IRectGraphicAttribute;
|
|
13
|
+
type ISymbolGraphicAttribute = VRender.ISymbolGraphicAttribute;
|
|
14
|
+
type IRichTextGraphicAttribute = VRender.IRichTextGraphicAttribute;
|
|
15
|
+
type IPolygonGraphicAttribute = VRender.IPolygonGraphicAttribute;
|
|
16
|
+
type GraphicProps<IGraphicGraphicAttribute> = {
|
|
17
|
+
attribute: IGraphicGraphicAttribute;
|
|
18
|
+
ref?: Ref<IGraphic>;
|
|
19
|
+
children?: ReactNode;
|
|
20
|
+
} & IEventParamsType;
|
|
21
|
+
export declare const Group: (props: GraphicProps<IGroupGraphicAttribute>) => ReactElement<GraphicProps<IGroupGraphicAttribute>, JSXElementConstructor<GraphicProps<IGroupGraphicAttribute>>>;
|
|
22
|
+
export declare const Text: (props: GraphicProps<ITextGraphicAttribute>) => ReactElement<GraphicProps<ITextGraphicAttribute>, JSXElementConstructor<GraphicProps<ITextGraphicAttribute>>>;
|
|
23
|
+
export declare const Arc: (props: GraphicProps<IArcGraphicAttribute>) => ReactElement<GraphicProps<IArcGraphicAttribute>, JSXElementConstructor<GraphicProps<IArcGraphicAttribute>>>;
|
|
24
|
+
export declare const Circle: (props: GraphicProps<ICircleGraphicAttribute>) => ReactElement<GraphicProps<ICircleGraphicAttribute>, JSXElementConstructor<GraphicProps<ICircleGraphicAttribute>>>;
|
|
25
|
+
export declare const Image: (props: GraphicProps<IImageGraphicAttribute>) => ReactElement<GraphicProps<IImageGraphicAttribute>, JSXElementConstructor<GraphicProps<IImageGraphicAttribute>>>;
|
|
26
|
+
export declare const Line: (props: GraphicProps<ILineGraphicAttribute>) => ReactElement<GraphicProps<ILineGraphicAttribute>, JSXElementConstructor<GraphicProps<ILineGraphicAttribute>>>;
|
|
27
|
+
export declare const Path: (props: GraphicProps<IPathGraphicAttribute>) => ReactElement<GraphicProps<IPathGraphicAttribute>, JSXElementConstructor<GraphicProps<IPathGraphicAttribute>>>;
|
|
28
|
+
export declare const Rect: (props: GraphicProps<IRectGraphicAttribute>) => ReactElement<GraphicProps<IRectGraphicAttribute>, JSXElementConstructor<GraphicProps<IRectGraphicAttribute>>>;
|
|
29
|
+
export declare const Symbol: (props: GraphicProps<ISymbolGraphicAttribute>) => ReactElement<GraphicProps<ISymbolGraphicAttribute>, JSXElementConstructor<GraphicProps<ISymbolGraphicAttribute>>>;
|
|
30
|
+
export declare const RichText: (props: GraphicProps<IRichTextGraphicAttribute>) => ReactElement<GraphicProps<IRichTextGraphicAttribute>, JSXElementConstructor<GraphicProps<IRichTextGraphicAttribute>>>;
|
|
31
|
+
export declare const Polygon: (props: GraphicProps<IPolygonGraphicAttribute>) => ReactElement<GraphicProps<IPolygonGraphicAttribute>, JSXElementConstructor<GraphicProps<IPolygonGraphicAttribute>>>;
|
|
32
|
+
export {};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export const Group = "group";
|
|
2
|
+
|
|
3
|
+
export const Text = "text";
|
|
4
|
+
|
|
5
|
+
export const Arc = "arc";
|
|
6
|
+
|
|
7
|
+
export const Circle = "circle";
|
|
8
|
+
|
|
9
|
+
export const Image = "image";
|
|
10
|
+
|
|
11
|
+
export const Line = "line";
|
|
12
|
+
|
|
13
|
+
export const Path = "path";
|
|
14
|
+
|
|
15
|
+
export const Rect = "rect";
|
|
16
|
+
|
|
17
|
+
export const Symbol = "symbol";
|
|
18
|
+
|
|
19
|
+
export const RichText = "richtext";
|
|
20
|
+
|
|
21
|
+
export const Polygon = "polygon";
|
|
22
|
+
//# sourceMappingURL=graphic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["components/custom/graphic.ts"],"names":[],"mappings":"AA2BA,MAAM,CAAC,MAAM,KAAK,GAGhB,OAAc,CAAC;AAEjB,MAAM,CAAC,MAAM,IAAI,GAGf,MAAa,CAAC;AAEhB,MAAM,CAAC,MAAM,GAAG,GAGd,KAAY,CAAC;AAEf,MAAM,CAAC,MAAM,MAAM,GAGjB,QAAe,CAAC;AAElB,MAAM,CAAC,MAAM,KAAK,GAGhB,OAAc,CAAC;AAEjB,MAAM,CAAC,MAAM,IAAI,GAGf,MAAa,CAAC;AAEhB,MAAM,CAAC,MAAM,IAAI,GAGf,MAAa,CAAC;AAEhB,MAAM,CAAC,MAAM,IAAI,GAGf,MAAa,CAAC;AAEhB,MAAM,CAAC,MAAM,MAAM,GAGjB,QAAe,CAAC;AAElB,MAAM,CAAC,MAAM,QAAQ,GAKjB,UAAiB,CAAC;AAEtB,MAAM,CAAC,MAAM,OAAO,GAKhB,SAAgB,CAAC","file":"graphic.js","sourcesContent":["// export const Group = 'group';\n// export const Rect = 'rect';\n// export const Text = 'text';\n\nimport type { ReactElement, ReactNode, Ref, JSXElementConstructor } from 'react';\nimport type { VRender } from '@visactor/vtable';\n\ntype IGraphic = VRender.IGraphic;\ntype IGroupGraphicAttribute = VRender.IGroupGraphicAttribute;\ntype ITextGraphicAttribute = VRender.ITextGraphicAttribute;\ntype IEventParamsType = VRender.IEventParamsType;\ntype IArcGraphicAttribute = VRender.IArcGraphicAttribute;\ntype ICircleGraphicAttribute = VRender.ICircleGraphicAttribute;\ntype IImageGraphicAttribute = VRender.IImageGraphicAttribute;\ntype ILineGraphicAttribute = VRender.ILineGraphicAttribute;\ntype IPathGraphicAttribute = VRender.IPathGraphicAttribute;\ntype IRectGraphicAttribute = VRender.IRectGraphicAttribute;\ntype ISymbolGraphicAttribute = VRender.ISymbolGraphicAttribute;\ntype IRichTextGraphicAttribute = VRender.IRichTextGraphicAttribute;\ntype IPolygonGraphicAttribute = VRender.IPolygonGraphicAttribute;\n\ntype GraphicProps<IGraphicGraphicAttribute> = {\n attribute: IGraphicGraphicAttribute;\n ref?: Ref<IGraphic>;\n children?: ReactNode;\n} & IEventParamsType;\n\nexport const Group: (\n props: GraphicProps<IGroupGraphicAttribute>\n) => ReactElement<GraphicProps<IGroupGraphicAttribute>, JSXElementConstructor<GraphicProps<IGroupGraphicAttribute>>> =\n 'group' as any;\n\nexport const Text: (\n props: GraphicProps<ITextGraphicAttribute>\n) => ReactElement<GraphicProps<ITextGraphicAttribute>, JSXElementConstructor<GraphicProps<ITextGraphicAttribute>>> =\n 'text' as any;\n\nexport const Arc: (\n props: GraphicProps<IArcGraphicAttribute>\n) => ReactElement<GraphicProps<IArcGraphicAttribute>, JSXElementConstructor<GraphicProps<IArcGraphicAttribute>>> =\n 'arc' as any;\n\nexport const Circle: (\n props: GraphicProps<ICircleGraphicAttribute>\n) => ReactElement<GraphicProps<ICircleGraphicAttribute>, JSXElementConstructor<GraphicProps<ICircleGraphicAttribute>>> =\n 'circle' as any;\n\nexport const Image: (\n props: GraphicProps<IImageGraphicAttribute>\n) => ReactElement<GraphicProps<IImageGraphicAttribute>, JSXElementConstructor<GraphicProps<IImageGraphicAttribute>>> =\n 'image' as any;\n\nexport const Line: (\n props: GraphicProps<ILineGraphicAttribute>\n) => ReactElement<GraphicProps<ILineGraphicAttribute>, JSXElementConstructor<GraphicProps<ILineGraphicAttribute>>> =\n 'line' as any;\n\nexport const Path: (\n props: GraphicProps<IPathGraphicAttribute>\n) => ReactElement<GraphicProps<IPathGraphicAttribute>, JSXElementConstructor<GraphicProps<IPathGraphicAttribute>>> =\n 'path' as any;\n\nexport const Rect: (\n props: GraphicProps<IRectGraphicAttribute>\n) => ReactElement<GraphicProps<IRectGraphicAttribute>, JSXElementConstructor<GraphicProps<IRectGraphicAttribute>>> =\n 'rect' as any;\n\nexport const Symbol: (\n props: GraphicProps<ISymbolGraphicAttribute>\n) => ReactElement<GraphicProps<ISymbolGraphicAttribute>, JSXElementConstructor<GraphicProps<ISymbolGraphicAttribute>>> =\n 'symbol' as any;\n\nexport const RichText: (\n props: GraphicProps<IRichTextGraphicAttribute>\n) => ReactElement<\n GraphicProps<IRichTextGraphicAttribute>,\n JSXElementConstructor<GraphicProps<IRichTextGraphicAttribute>>\n> = 'richtext' as any;\n\nexport const Polygon: (\n props: GraphicProps<IPolygonGraphicAttribute>\n) => ReactElement<\n GraphicProps<IPolygonGraphicAttribute>,\n JSXElementConstructor<GraphicProps<IPolygonGraphicAttribute>>\n> = 'polygon' as any;\n"]}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { VRender } from "@visactor/vtable";
|
|
2
|
+
|
|
3
|
+
import { isFunction } from "@visactor/vutils";
|
|
4
|
+
|
|
5
|
+
import React from "react";
|
|
6
|
+
|
|
7
|
+
import ReactReconciler from "react-reconciler";
|
|
8
|
+
|
|
9
|
+
import { DefaultEventPriority } from "react-reconciler/constants.js";
|
|
10
|
+
|
|
11
|
+
const {application: application, createText: createText, REACT_TO_CANOPUS_EVENTS: REACT_TO_CANOPUS_EVENTS, Tag: Tag} = VRender;
|
|
12
|
+
|
|
13
|
+
export const reconcilor = ReactReconciler({
|
|
14
|
+
supportsMutation: !0,
|
|
15
|
+
supportsPersistence: !1,
|
|
16
|
+
createInstance: (type, props, instance) => {
|
|
17
|
+
const graphic = createGraphic(type, props);
|
|
18
|
+
if (graphic) return bindEventsToGraphic(graphic, props), graphic;
|
|
19
|
+
},
|
|
20
|
+
createTextInstance: (text, instance) => {},
|
|
21
|
+
appendInitialChild: (parentInstance, childInstance) => {
|
|
22
|
+
parentInstance.add(childInstance);
|
|
23
|
+
},
|
|
24
|
+
finalizeInitialChildren: () => !1,
|
|
25
|
+
prepareUpdate: () => !0,
|
|
26
|
+
shouldSetTextContent: () => !1,
|
|
27
|
+
getRootHostContext: () => null,
|
|
28
|
+
getChildHostContext: () => null,
|
|
29
|
+
getPublicInstance: instance => instance,
|
|
30
|
+
prepareForCommit: () => null,
|
|
31
|
+
resetAfterCommit: () => {},
|
|
32
|
+
preparePortalMount: () => null,
|
|
33
|
+
scheduleTimeout: setTimeout,
|
|
34
|
+
cancelTimeout: clearTimeout,
|
|
35
|
+
noTimeout: -1,
|
|
36
|
+
isPrimaryRenderer: !1,
|
|
37
|
+
getCurrentEventPriority: () => DefaultEventPriority,
|
|
38
|
+
getInstanceFromNode: node => null,
|
|
39
|
+
beforeActiveInstanceBlur: () => {},
|
|
40
|
+
afterActiveInstanceBlur: () => {},
|
|
41
|
+
prepareScopeUpdate: () => {},
|
|
42
|
+
getInstanceFromScope: () => {},
|
|
43
|
+
detachDeletedInstance: () => {},
|
|
44
|
+
supportsHydration: !1,
|
|
45
|
+
appendChild: (parentInstance, child) => {
|
|
46
|
+
parentInstance.add(child);
|
|
47
|
+
},
|
|
48
|
+
appendChildToContainer: (container, child) => {
|
|
49
|
+
container.add(child);
|
|
50
|
+
},
|
|
51
|
+
insertBefore: (parentInstance, child, beforeChild) => {
|
|
52
|
+
parentInstance.insertBefore(child, beforeChild);
|
|
53
|
+
},
|
|
54
|
+
insertInContainerBefore: (parentInstance, child, beforeChild) => {
|
|
55
|
+
parentInstance.insertBefore(child, beforeChild);
|
|
56
|
+
},
|
|
57
|
+
removeChild: (parentInstance, child) => {
|
|
58
|
+
child.delete();
|
|
59
|
+
},
|
|
60
|
+
removeChildFromContainer: (parentInstance, child) => {
|
|
61
|
+
child.delete();
|
|
62
|
+
},
|
|
63
|
+
commitUpdate: (instance, updatePayload, type, oldProps, newProps) => {
|
|
64
|
+
updateGraphicProps(instance, newProps, oldProps);
|
|
65
|
+
},
|
|
66
|
+
hideInstance: instance => {
|
|
67
|
+
instance.setAttribute("visible", !1);
|
|
68
|
+
},
|
|
69
|
+
unhideInstance: (instance, props) => {
|
|
70
|
+
instance.setAttribute("visible", !0);
|
|
71
|
+
},
|
|
72
|
+
clearContainer: container => {
|
|
73
|
+
container.removeAllChild();
|
|
74
|
+
},
|
|
75
|
+
commitTextUpdate: (textInstance, oldText, newText) => {}
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
function createGraphic(type, props) {
|
|
79
|
+
if ("tag" === type) {
|
|
80
|
+
return new Tag(props.attribute);
|
|
81
|
+
}
|
|
82
|
+
if (!application.graphicService.creator[type]) return;
|
|
83
|
+
return application.graphicService.creator[type](props.attribute);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function isEventProp(key, props) {
|
|
87
|
+
return key.startsWith("on") && isFunction(props[key]);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function bindEventsToGraphic(graphic, props) {
|
|
91
|
+
for (const key in props) isEventProp(key, props) && graphic.addEventListener(REACT_TO_CANOPUS_EVENTS[key], props[key]);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function updateGraphicProps(graphic, newProps, oldProps) {
|
|
95
|
+
for (const propKey in oldProps) isEventProp(propKey, oldProps) && oldProps[propKey] !== newProps[propKey] && graphic.removeEventListener(REACT_TO_CANOPUS_EVENTS[propKey], oldProps[propKey]);
|
|
96
|
+
for (const propKey in newProps) isEventProp(propKey, newProps) && oldProps[propKey] !== newProps[propKey] && graphic.addEventListener(REACT_TO_CANOPUS_EVENTS[propKey], newProps[propKey]);
|
|
97
|
+
graphic.initAttributes(newProps.attribute), "image" === graphic.type && graphic.loadImage(newProps.attribute.image);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
//# sourceMappingURL=reconciler.js.map
|
|
101
|
+
reconcilor.injectIntoDevTools({
|
|
102
|
+
bundleType: "production" !== process.env.NODE_ENV ? 1 : 0,
|
|
103
|
+
version: React.version,
|
|
104
|
+
rendererPackageName: "react-vtable"
|
|
105
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["components/custom/reconciler.ts"],"names":[],"mappings":"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","file":"reconciler.js","sourcesContent":["import { VRender } from '@visactor/vtable';\nimport { isFunction } from '@visactor/vutils';\nimport React from 'react';\nimport ReactReconciler from 'react-reconciler';\nimport { DefaultEventPriority } from 'react-reconciler/constants.js';\n\nconst { application, createText, REACT_TO_CANOPUS_EVENTS, Tag } = VRender;\ntype Graphic = VRender.Graphic;\ntype Instance = Graphic;\n\nexport const reconcilor = ReactReconciler({\n supportsMutation: true,\n supportsPersistence: false,\n\n createInstance: (type: string, props: any, instance) => {\n const graphic = createGraphic(type, props);\n if (graphic) {\n bindEventsToGraphic(graphic, props);\n } else {\n return undefined;\n // createInstance\n // graphic = createGraphic('group', {});\n }\n return graphic;\n },\n\n createTextInstance: (text, instance) => {\n // const textGraphic = createText({ text });\n // return textGraphic;\n // debugger;\n // return document.createTextNode(text);\n return undefined;\n },\n\n appendInitialChild: (parentInstance: Instance, childInstance: Instance) => {\n parentInstance.add(childInstance);\n },\n\n finalizeInitialChildren: () => false,\n\n prepareUpdate: () => true,\n\n shouldSetTextContent: () => false,\n\n getRootHostContext: () => null,\n\n getChildHostContext: () => null,\n\n getPublicInstance: (instance: Instance) => {\n return instance;\n },\n\n prepareForCommit: () => null,\n\n resetAfterCommit: () => undefined,\n\n preparePortalMount: () => null,\n\n // eslint-disable-next-line no-undef\n scheduleTimeout: setTimeout,\n // eslint-disable-next-line no-undef\n cancelTimeout: clearTimeout,\n\n noTimeout: -1,\n isPrimaryRenderer: false,\n\n getCurrentEventPriority: () => DefaultEventPriority,\n\n getInstanceFromNode: node => null,\n\n beforeActiveInstanceBlur: () => undefined,\n\n afterActiveInstanceBlur: () => undefined,\n\n prepareScopeUpdate: () => undefined,\n\n getInstanceFromScope: () => undefined,\n\n detachDeletedInstance: () => undefined,\n\n supportsHydration: false,\n\n appendChild: (parentInstance: Instance, child: Instance) => {\n parentInstance.add(child);\n },\n appendChildToContainer: (container: Instance, child: Instance) => {\n container.add(child);\n },\n\n insertBefore: (parentInstance: Instance, child: Instance, beforeChild: Instance) => {\n parentInstance.insertBefore(child, beforeChild);\n },\n\n insertInContainerBefore: (parentInstance: Instance, child: Instance, beforeChild: Instance) => {\n parentInstance.insertBefore(child, beforeChild);\n },\n\n removeChild: (parentInstance: Instance, child: Instance) => {\n child.delete();\n },\n\n removeChildFromContainer: (parentInstance: Instance, child: Instance) => {\n child.delete();\n },\n\n commitUpdate: (instance, updatePayload, type, oldProps, newProps) => {\n updateGraphicProps(instance, newProps, oldProps);\n },\n\n hideInstance: (instance: Instance) => {\n instance.setAttribute('visible', false);\n },\n\n unhideInstance: (instance, props) => {\n instance.setAttribute('visible', true);\n },\n\n clearContainer: (container: Instance) => {\n container.removeAllChild();\n },\n\n commitTextUpdate: (textInstance: any, oldText: string, newText: string) => {\n // debugger;\n }\n});\n\nreconcilor.injectIntoDevTools({\n // findFiberByHostInstance: () => {},\n // @ts-ignore\n // eslint-disable-next-line no-undef\n bundleType: process.env.NODE_ENV !== 'production' ? 1 : 0,\n version: React.version,\n rendererPackageName: 'react-vtable'\n});\n\nfunction createGraphic(type: string, props: any) {\n // may have unwanted onxxx prop\n if (type === 'tag') {\n const tag = new Tag(props.attribute);\n return tag;\n } else if (!application.graphicService.creator[type]) {\n return;\n }\n const graphic = application.graphicService.creator[type]((props as any).attribute);\n return graphic;\n}\n\nfunction isEventProp(key: string, props: any) {\n return key.startsWith('on') && isFunction(props[key]);\n}\n\nfunction bindEventsToGraphic(graphic: Graphic, props: any) {\n for (const key in props) {\n if (isEventProp(key, props)) {\n graphic.addEventListener(REACT_TO_CANOPUS_EVENTS[key], props[key]);\n }\n }\n}\n\nfunction updateGraphicProps(graphic: Graphic, newProps: any, oldProps: any) {\n // deal width event update\n for (const propKey in oldProps) {\n if (isEventProp(propKey, oldProps) && oldProps[propKey] !== newProps[propKey]) {\n graphic.removeEventListener(REACT_TO_CANOPUS_EVENTS[propKey], oldProps[propKey]);\n }\n }\n for (const propKey in newProps) {\n if (isEventProp(propKey, newProps) && oldProps[propKey] !== newProps[propKey]) {\n graphic.addEventListener(REACT_TO_CANOPUS_EVENTS[propKey], newProps[propKey]);\n }\n }\n\n // update all attribute\n graphic.initAttributes(newProps.attribute);\n if (graphic.type === 'image') {\n graphic.loadImage(newProps.attribute.image);\n }\n}\n"]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { getTargetCell, VRender } from "@visactor/vtable";
|
|
2
|
+
|
|
3
|
+
import { isString } from "@visactor/vutils";
|
|
4
|
+
|
|
5
|
+
const {ContainerModule: ContainerModule, EnvContribution: EnvContribution, BrowserEnvContribution: BrowserEnvContribution} = VRender;
|
|
6
|
+
|
|
7
|
+
export const reactEnvModule = new ContainerModule(((bind, unbind, isBound, rebind) => {
|
|
8
|
+
bind(VTableBrowserEnvContribution).toSelf().inSingletonScope(), isBound(EnvContribution) ? rebind(EnvContribution).toService(VTableBrowserEnvContribution) : bind(EnvContribution).toService(VTableBrowserEnvContribution);
|
|
9
|
+
}));
|
|
10
|
+
|
|
11
|
+
class VTableBrowserEnvContribution extends BrowserEnvContribution {
|
|
12
|
+
updateDom(dom, params) {
|
|
13
|
+
var _a, _b;
|
|
14
|
+
const tableDiv = dom.parentElement;
|
|
15
|
+
if (tableDiv) {
|
|
16
|
+
const top = parseInt(params.style.top, 10), left = parseInt(params.style.left, 10);
|
|
17
|
+
let domWidth, domHeight;
|
|
18
|
+
if (dom.style.display = "none") {
|
|
19
|
+
const cellGroup = getTargetCell(params.graphic);
|
|
20
|
+
domWidth = null !== (_a = cellGroup.attribute.width) && void 0 !== _a ? _a : 1,
|
|
21
|
+
domHeight = null !== (_b = cellGroup.attribute.height) && void 0 !== _b ? _b : 1;
|
|
22
|
+
} else domWidth = dom.offsetWidth, domHeight = dom.offsetHeight;
|
|
23
|
+
if (top + domHeight < 0 || left + domWidth < 0 || top > tableDiv.offsetHeight || left > tableDiv.offsetWidth) return dom.style.display = "none",
|
|
24
|
+
!1;
|
|
25
|
+
}
|
|
26
|
+
const {width: width, height: height, style: style} = params;
|
|
27
|
+
return style && (isString(style) ? dom.setAttribute("style", style) : Object.keys(style).forEach((k => {
|
|
28
|
+
dom.style[k] = style[k];
|
|
29
|
+
}))), null != width && (dom.style.width = `${width}px`), null != height && (dom.style.height = `${height}px`),
|
|
30
|
+
!0;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=vtable-browser-env-contribution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["components/custom/vtable-browser-env-contribution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,MAAM,EAAE,eAAe,EAAE,eAAe,EAAE,sBAAsB,EAAE,GAAG,OAAO,CAAC;AAG7E,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,eAAe,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;IAClF,IAAI,CAAC,4BAA4B,CAAC,CAAC,MAAM,EAAE,CAAC,gBAAgB,EAAE,CAAC;IAC/D,IAAI,OAAO,CAAC,eAAe,CAAC,EAAE;QAC5B,MAAM,CAAC,eAAe,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;KACjE;SAAM;QACL,IAAI,CAAC,eAAe,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;KAC/D;AACH,CAAC,CAAC,CAAC;AAEH,MAAM,4BAA6B,SAAQ,sBAAsB;IAC/D,SAAS,CAAC,GAAgB,EAAE,MAA2B;;QACrD,MAAM,QAAQ,GAAG,GAAG,CAAC,aAAa,CAAC;QACnC,IAAI,QAAQ,EAAE;YACZ,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC3C,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAE7C,IAAI,QAAQ,CAAC;YACb,IAAI,SAAS,CAAC;YACd,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,EAAE;gBAChC,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAChD,QAAQ,GAAG,MAAA,SAAS,CAAC,SAAS,CAAC,KAAK,mCAAI,CAAC,CAAC;gBAC1C,SAAS,GAAG,MAAA,SAAS,CAAC,SAAS,CAAC,MAAM,mCAAI,CAAC,CAAC;aAC7C;iBAAM;gBACL,QAAQ,GAAG,GAAG,CAAC,WAAW,CAAC;gBAC3B,SAAS,GAAG,GAAG,CAAC,YAAY,CAAC;aAC9B;YACD,IAAI,GAAG,GAAG,SAAS,GAAG,CAAC,IAAI,IAAI,GAAG,QAAQ,GAAG,CAAC,IAAI,GAAG,GAAG,QAAQ,CAAC,YAAY,IAAI,IAAI,GAAG,QAAQ,CAAC,WAAW,EAAE;gBAC5G,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;gBAC3B,OAAO,KAAK,CAAC;aACd;SACF;QAED,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;QAExC,IAAI,KAAK,EAAE;YACT,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;gBACnB,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;aAClC;iBAAM;gBACL,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;oBAC7B,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC1B,CAAC,CAAC,CAAC;aACJ;SACF;QACD,IAAI,KAAK,IAAI,IAAI,EAAE;YACjB,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,KAAK,IAAI,CAAC;SAChC;QACD,IAAI,MAAM,IAAI,IAAI,EAAE;YAClB,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC;SAClC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF","file":"vtable-browser-env-contribution.js","sourcesContent":["import { getTargetCell, VRender } from '@visactor/vtable';\nimport { isString } from '@visactor/vutils';\n\nconst { ContainerModule, EnvContribution, BrowserEnvContribution } = VRender;\ntype CreateDOMParamsType = VRender.CreateDOMParamsType;\n\nexport const reactEnvModule = new ContainerModule((bind, unbind, isBound, rebind) => {\n bind(VTableBrowserEnvContribution).toSelf().inSingletonScope();\n if (isBound(EnvContribution)) {\n rebind(EnvContribution).toService(VTableBrowserEnvContribution);\n } else {\n bind(EnvContribution).toService(VTableBrowserEnvContribution);\n }\n});\n\nclass VTableBrowserEnvContribution extends BrowserEnvContribution {\n updateDom(dom: HTMLElement, params: CreateDOMParamsType): boolean {\n const tableDiv = dom.parentElement;\n if (tableDiv) {\n const top = parseInt(params.style.top, 10);\n const left = parseInt(params.style.left, 10);\n\n let domWidth;\n let domHeight;\n if ((dom.style.display = 'none')) {\n const cellGroup = getTargetCell(params.graphic);\n domWidth = cellGroup.attribute.width ?? 1;\n domHeight = cellGroup.attribute.height ?? 1;\n } else {\n domWidth = dom.offsetWidth;\n domHeight = dom.offsetHeight;\n }\n if (top + domHeight < 0 || left + domWidth < 0 || top > tableDiv.offsetHeight || left > tableDiv.offsetWidth) {\n dom.style.display = 'none';\n return false;\n }\n }\n\n const { width, height, style } = params;\n\n if (style) {\n if (isString(style)) {\n dom.setAttribute('style', style);\n } else {\n Object.keys(style).forEach(k => {\n dom.style[k] = style[k];\n });\n }\n }\n if (width != null) {\n dom.style.width = `${width}px`;\n }\n if (height != null) {\n dom.style.height = `${height}px`;\n }\n\n return true;\n }\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { VRender } from '@visactor/vtable';
|
|
2
|
+
declare const ReactAttributePlugin: typeof VRender.ReactAttributePlugin;
|
|
3
|
+
type CommonDomOptions = VRender.CommonDomOptions;
|
|
4
|
+
type CreateDOMParamsType = VRender.CreateDOMParamsType;
|
|
5
|
+
type IGraphic = VRender.CreateDOMParamsType;
|
|
6
|
+
type IStage = VRender.CreateDOMParamsType;
|
|
7
|
+
type SimpleDomStyleOptions = VRender.CreateDOMParamsType;
|
|
8
|
+
export declare class VTableReactAttributePlugin extends ReactAttributePlugin {
|
|
9
|
+
removeElement(id: string): void;
|
|
10
|
+
renderGraphicHTML(graphic: IGraphic): void;
|
|
11
|
+
getWrapContainer(stage: IStage, userContainer?: string | HTMLElement | null, domParams?: CreateDOMParamsType): {
|
|
12
|
+
wrapContainer: HTMLElement;
|
|
13
|
+
nativeContainer: any;
|
|
14
|
+
};
|
|
15
|
+
updateStyleOfWrapContainer(graphic: IGraphic, stage: IStage, wrapContainer: HTMLElement, nativeContainer: HTMLElement, options: SimpleDomStyleOptions & CommonDomOptions): void;
|
|
16
|
+
}
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { VRender } from "@visactor/vtable";
|
|
2
|
+
|
|
3
|
+
import { calculateAnchorOfBounds, isFunction, isNil, isObject, isString, styleStringToObject } from "@visactor/vutils";
|
|
4
|
+
|
|
5
|
+
const {ReactAttributePlugin: ReactAttributePlugin, application: application} = VRender;
|
|
6
|
+
|
|
7
|
+
export class VTableReactAttributePlugin extends ReactAttributePlugin {
|
|
8
|
+
removeElement(id) {
|
|
9
|
+
super.removeElement(id), delete this.htmlMap[id];
|
|
10
|
+
}
|
|
11
|
+
renderGraphicHTML(graphic) {
|
|
12
|
+
var _a;
|
|
13
|
+
const {react: react} = graphic.attribute;
|
|
14
|
+
if (!react) return;
|
|
15
|
+
const stage = graphic.stage;
|
|
16
|
+
if (!stage) return;
|
|
17
|
+
const ReactDOM = stage.params.ReactDOM, {element: element, container: container} = react;
|
|
18
|
+
if (!(element && ReactDOM && ReactDOM.createRoot)) return;
|
|
19
|
+
const id = isNil(react.id) ? `${null !== (_a = graphic.id) && void 0 !== _a ? _a : graphic._uid}_react` : react.id;
|
|
20
|
+
if (this.htmlMap && this.htmlMap[id] && container && container !== this.htmlMap[id].container && this.removeElement(id),
|
|
21
|
+
this.htmlMap && this.htmlMap[id]) this.htmlMap[id].root.render(element); else {
|
|
22
|
+
const {wrapContainer: wrapContainer, nativeContainer: nativeContainer} = this.getWrapContainer(stage, container);
|
|
23
|
+
if (wrapContainer) {
|
|
24
|
+
const root = ReactDOM.createRoot(wrapContainer);
|
|
25
|
+
root.render(element), this.htmlMap || (this.htmlMap = {}), this.htmlMap[id] = {
|
|
26
|
+
root: root,
|
|
27
|
+
wrapContainer: wrapContainer,
|
|
28
|
+
nativeContainer: nativeContainer,
|
|
29
|
+
container: container,
|
|
30
|
+
renderId: this.renderId
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (!this.htmlMap || !this.htmlMap[id]) return;
|
|
35
|
+
const {wrapContainer: wrapContainer, nativeContainer: nativeContainer} = this.htmlMap[id];
|
|
36
|
+
this.updateStyleOfWrapContainer(graphic, stage, wrapContainer, nativeContainer, react),
|
|
37
|
+
this.htmlMap[id].renderId = this.renderId;
|
|
38
|
+
}
|
|
39
|
+
getWrapContainer(stage, userContainer, domParams) {
|
|
40
|
+
let nativeContainer;
|
|
41
|
+
return nativeContainer = userContainer ? "string" == typeof userContainer ? application.global.getElementById(userContainer) : userContainer : stage.window.getContainer(),
|
|
42
|
+
{
|
|
43
|
+
wrapContainer: application.global.createDom(Object.assign({
|
|
44
|
+
tagName: "div",
|
|
45
|
+
parent: nativeContainer
|
|
46
|
+
}, domParams)),
|
|
47
|
+
nativeContainer: nativeContainer
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
updateStyleOfWrapContainer(graphic, stage, wrapContainer, nativeContainer, options) {
|
|
51
|
+
const {pointerEvents: pointerEvents} = options;
|
|
52
|
+
let calculateStyle = this.parseDefaultStyleFromGraphic(graphic);
|
|
53
|
+
calculateStyle.display = !1 !== graphic.attribute.visible ? "block" : "none", calculateStyle.pointerEvents = !0 === pointerEvents ? "all" : pointerEvents || "none",
|
|
54
|
+
wrapContainer.style.position || (wrapContainer.style.position = "absolute", nativeContainer.style.position = "relative");
|
|
55
|
+
let left = 0, top = 0;
|
|
56
|
+
const b = graphic.globalAABBBounds;
|
|
57
|
+
let anchorType = options.anchorType;
|
|
58
|
+
if (isNil(anchorType) && (anchorType = "text" === graphic.type ? "position" : "boundsLeftTop"),
|
|
59
|
+
"boundsLeftTop" === anchorType && (anchorType = "top-left"), "position" === anchorType || b.empty()) {
|
|
60
|
+
const matrix = graphic.globalTransMatrix;
|
|
61
|
+
left = matrix.e, top = matrix.f;
|
|
62
|
+
} else {
|
|
63
|
+
const anchor = calculateAnchorOfBounds(b, anchorType);
|
|
64
|
+
left = anchor.x, top = anchor.y;
|
|
65
|
+
}
|
|
66
|
+
const containerTL = application.global.getElementTopLeft(nativeContainer, !1), windowTL = stage.window.getTopLeft(!1), offsetX = left + windowTL.left - containerTL.left, offsetTop = top + windowTL.top - containerTL.top;
|
|
67
|
+
if (calculateStyle.left = `${offsetX}px`, calculateStyle.top = `${offsetTop}px`,
|
|
68
|
+
"text" === graphic.type && "position" === anchorType && (calculateStyle = Object.assign(Object.assign({}, calculateStyle), this.getTransformOfText(graphic))),
|
|
69
|
+
isFunction(options.style)) {
|
|
70
|
+
const userStyle = options.style({
|
|
71
|
+
top: offsetTop,
|
|
72
|
+
left: offsetX,
|
|
73
|
+
width: b.width(),
|
|
74
|
+
height: b.height()
|
|
75
|
+
}, graphic, wrapContainer);
|
|
76
|
+
userStyle && (calculateStyle = Object.assign(Object.assign({}, calculateStyle), userStyle));
|
|
77
|
+
} else isObject(options.style) ? calculateStyle = Object.assign(Object.assign({}, calculateStyle), options.style) : isString(options.style) && options.style && (calculateStyle = Object.assign(Object.assign({}, calculateStyle), styleStringToObject(options.style)));
|
|
78
|
+
application.global.updateDom(wrapContainer, {
|
|
79
|
+
width: options.width,
|
|
80
|
+
height: options.width,
|
|
81
|
+
style: calculateStyle,
|
|
82
|
+
graphic: graphic
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=vtable-react-attribute-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["components/custom/vtable-react-attribute-plugin.ts"],"names":[],"mappings":"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","file":"vtable-react-attribute-plugin.js","sourcesContent":["import { VRender } from '@visactor/vtable';\nimport { calculateAnchorOfBounds, isFunction, isNil, isObject, isString, styleStringToObject } from '@visactor/vutils';\n\nconst { ReactAttributePlugin, application } = VRender;\ntype CommonDomOptions = VRender.CommonDomOptions;\ntype CreateDOMParamsType = VRender.CreateDOMParamsType;\ntype IGraphic = VRender.CreateDOMParamsType;\ntype IStage = VRender.CreateDOMParamsType;\ntype IText = VRender.CreateDOMParamsType;\ntype SimpleDomStyleOptions = VRender.CreateDOMParamsType;\n\nexport class VTableReactAttributePlugin extends ReactAttributePlugin {\n removeElement(id: string) {\n super.removeElement(id);\n delete this.htmlMap[id];\n }\n\n renderGraphicHTML(graphic: IGraphic) {\n const { react } = graphic.attribute;\n if (!react) {\n return;\n }\n const stage = graphic.stage;\n if (!stage) {\n return;\n }\n const ReactDOM = stage.params.ReactDOM;\n const { element, container } = react;\n if (!(element && ReactDOM && ReactDOM.createRoot)) {\n return;\n }\n const id = isNil(react.id) ? `${graphic.id ?? graphic._uid}_react` : react.id;\n\n if (this.htmlMap && this.htmlMap[id] && container && container !== this.htmlMap[id].container) {\n this.removeElement(id);\n }\n\n if (!this.htmlMap || !this.htmlMap[id]) {\n // createa a wrapper contianer to be the root of react element\n const { wrapContainer, nativeContainer } = this.getWrapContainer(stage, container);\n\n if (wrapContainer) {\n const root = ReactDOM.createRoot(wrapContainer);\n root.render(element);\n\n if (!this.htmlMap) {\n this.htmlMap = {};\n }\n\n this.htmlMap[id] = { root, wrapContainer, nativeContainer, container, renderId: this.renderId };\n }\n } else {\n // update react element\n this.htmlMap[id].root.render(element);\n }\n\n if (!this.htmlMap || !this.htmlMap[id]) {\n return;\n }\n\n const { wrapContainer, nativeContainer } = this.htmlMap[id];\n\n this.updateStyleOfWrapContainer(graphic, stage, wrapContainer, nativeContainer, react);\n this.htmlMap[id].renderId = this.renderId;\n }\n\n getWrapContainer(stage: IStage, userContainer?: string | HTMLElement | null, domParams?: CreateDOMParamsType) {\n let nativeContainer;\n if (userContainer) {\n if (typeof userContainer === 'string') {\n nativeContainer = application.global.getElementById(userContainer);\n } else {\n nativeContainer = userContainer;\n }\n } else {\n nativeContainer = stage.window.getContainer();\n }\n // 创建wrapGroup\n return {\n wrapContainer: application.global.createDom({ tagName: 'div', parent: nativeContainer, ...domParams }),\n nativeContainer\n };\n }\n\n updateStyleOfWrapContainer(\n graphic: IGraphic,\n stage: IStage,\n wrapContainer: HTMLElement,\n nativeContainer: HTMLElement,\n options: SimpleDomStyleOptions & CommonDomOptions\n ) {\n const { pointerEvents } = options;\n let calculateStyle = this.parseDefaultStyleFromGraphic(graphic);\n\n calculateStyle.display = graphic.attribute.visible !== false ? 'block' : 'none';\n // 事件穿透\n calculateStyle.pointerEvents = pointerEvents === true ? 'all' : pointerEvents ? pointerEvents : 'none';\n // 定位wrapGroup\n if (!wrapContainer.style.position) {\n wrapContainer.style.position = 'absolute';\n nativeContainer.style.position = 'relative';\n }\n let left: number = 0;\n let top: number = 0;\n const b = graphic.globalAABBBounds;\n\n let anchorType = options.anchorType;\n\n if (isNil(anchorType)) {\n anchorType = graphic.type === 'text' ? 'position' : 'boundsLeftTop';\n }\n\n if (anchorType === 'boundsLeftTop') {\n // 兼容老的配置,统一配置\n anchorType = 'top-left';\n }\n if (anchorType === 'position' || b.empty()) {\n const matrix = graphic.globalTransMatrix;\n left = matrix.e;\n top = matrix.f;\n } else {\n const anchor = calculateAnchorOfBounds(b, anchorType);\n\n left = anchor.x;\n top = anchor.y;\n }\n\n // 查看wrapGroup的位置\n // const wrapGroupTL = application.global.getElementTopLeft(wrapGroup, false);\n const containerTL = application.global.getElementTopLeft(nativeContainer, false);\n const windowTL = stage.window.getTopLeft(false);\n const offsetX = left + windowTL.left - containerTL.left;\n const offsetTop = top + windowTL.top - containerTL.top;\n // wrapGroup.style.transform = `translate(${offsetX}px, ${offsetTop}px)`;\n calculateStyle.left = `${offsetX}px`;\n calculateStyle.top = `${offsetTop}px`;\n\n if (graphic.type === 'text' && anchorType === 'position') {\n calculateStyle = {\n ...calculateStyle,\n ...this.getTransformOfText(graphic as IText)\n };\n }\n\n if (isFunction(options.style)) {\n const userStyle = options.style(\n { top: offsetTop, left: offsetX, width: b.width(), height: b.height() },\n graphic,\n wrapContainer\n );\n\n if (userStyle) {\n calculateStyle = { ...calculateStyle, ...userStyle };\n }\n } else if (isObject(options.style)) {\n calculateStyle = { ...calculateStyle, ...options.style };\n } else if (isString(options.style) && options.style) {\n calculateStyle = { ...calculateStyle, ...styleStringToObject(options.style as string) };\n }\n\n // 更新样式\n application.global.updateDom(wrapContainer, {\n width: options.width,\n height: options.width,\n style: calculateStyle,\n graphic\n });\n }\n}\n"]}
|