@thienvu18/designable-formily-setters 2.0.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.
Files changed (91) hide show
  1. package/LICENSE.md +20 -0
  2. package/README.md +7 -0
  3. package/esm/components/DataSourceSetter/DataSettingPanel.d.ts +10 -0
  4. package/esm/components/DataSourceSetter/DataSettingPanel.js +54 -0
  5. package/esm/components/DataSourceSetter/Header.d.ts +7 -0
  6. package/esm/components/DataSourceSetter/Header.js +8 -0
  7. package/esm/components/DataSourceSetter/Title.d.ts +7 -0
  8. package/esm/components/DataSourceSetter/Title.js +46 -0
  9. package/esm/components/DataSourceSetter/TreePanel.d.ts +12 -0
  10. package/esm/components/DataSourceSetter/TreePanel.js +94 -0
  11. package/esm/components/DataSourceSetter/index.d.ts +18 -0
  12. package/esm/components/DataSourceSetter/index.js +27 -0
  13. package/esm/components/DataSourceSetter/shared.d.ts +9 -0
  14. package/esm/components/DataSourceSetter/shared.js +45 -0
  15. package/esm/components/DataSourceSetter/styles.less +81 -0
  16. package/esm/components/DataSourceSetter/types.d.ts +18 -0
  17. package/esm/components/DataSourceSetter/types.js +1 -0
  18. package/esm/components/ReactionsSetter/FieldPropertySetter.d.ts +10 -0
  19. package/esm/components/ReactionsSetter/FieldPropertySetter.js +65 -0
  20. package/esm/components/ReactionsSetter/PathSelector.d.ts +10 -0
  21. package/esm/components/ReactionsSetter/PathSelector.js +103 -0
  22. package/esm/components/ReactionsSetter/declarations.d.ts +5 -0
  23. package/esm/components/ReactionsSetter/declarations.js +51 -0
  24. package/esm/components/ReactionsSetter/helpers.d.ts +10 -0
  25. package/esm/components/ReactionsSetter/helpers.js +384 -0
  26. package/esm/components/ReactionsSetter/index.d.ts +8 -0
  27. package/esm/components/ReactionsSetter/index.js +251 -0
  28. package/esm/components/ReactionsSetter/properties.d.ts +11 -0
  29. package/esm/components/ReactionsSetter/properties.js +41 -0
  30. package/esm/components/ReactionsSetter/styles.less +105 -0
  31. package/esm/components/ReactionsSetter/types.d.ts +13 -0
  32. package/esm/components/ReactionsSetter/types.js +1 -0
  33. package/esm/components/ValidatorSetter/index.d.ts +6 -0
  34. package/esm/components/ValidatorSetter/index.js +135 -0
  35. package/esm/components/index.d.ts +3 -0
  36. package/esm/components/index.js +3 -0
  37. package/esm/index.d.ts +2 -0
  38. package/esm/index.js +2 -0
  39. package/esm/locales/en-US.d.ts +93 -0
  40. package/esm/locales/en-US.js +98 -0
  41. package/esm/locales/index.d.ts +1 -0
  42. package/esm/locales/index.js +5 -0
  43. package/esm/locales/ko-KR.d.ts +93 -0
  44. package/esm/locales/ko-KR.js +98 -0
  45. package/esm/locales/zh-CN.d.ts +93 -0
  46. package/esm/locales/zh-CN.js +98 -0
  47. package/lib/components/DataSourceSetter/DataSettingPanel.d.ts +10 -0
  48. package/lib/components/DataSourceSetter/DataSettingPanel.js +57 -0
  49. package/lib/components/DataSourceSetter/Header.d.ts +7 -0
  50. package/lib/components/DataSourceSetter/Header.js +11 -0
  51. package/lib/components/DataSourceSetter/Title.d.ts +7 -0
  52. package/lib/components/DataSourceSetter/Title.js +49 -0
  53. package/lib/components/DataSourceSetter/TreePanel.d.ts +12 -0
  54. package/lib/components/DataSourceSetter/TreePanel.js +97 -0
  55. package/lib/components/DataSourceSetter/index.d.ts +18 -0
  56. package/lib/components/DataSourceSetter/index.js +33 -0
  57. package/lib/components/DataSourceSetter/shared.d.ts +9 -0
  58. package/lib/components/DataSourceSetter/shared.js +51 -0
  59. package/lib/components/DataSourceSetter/styles.less +81 -0
  60. package/lib/components/DataSourceSetter/types.d.ts +18 -0
  61. package/lib/components/DataSourceSetter/types.js +2 -0
  62. package/lib/components/ReactionsSetter/FieldPropertySetter.d.ts +10 -0
  63. package/lib/components/ReactionsSetter/FieldPropertySetter.js +69 -0
  64. package/lib/components/ReactionsSetter/PathSelector.d.ts +10 -0
  65. package/lib/components/ReactionsSetter/PathSelector.js +107 -0
  66. package/lib/components/ReactionsSetter/declarations.d.ts +5 -0
  67. package/lib/components/ReactionsSetter/declarations.js +55 -0
  68. package/lib/components/ReactionsSetter/helpers.d.ts +10 -0
  69. package/lib/components/ReactionsSetter/helpers.js +387 -0
  70. package/lib/components/ReactionsSetter/index.d.ts +8 -0
  71. package/lib/components/ReactionsSetter/index.js +255 -0
  72. package/lib/components/ReactionsSetter/properties.d.ts +11 -0
  73. package/lib/components/ReactionsSetter/properties.js +44 -0
  74. package/lib/components/ReactionsSetter/styles.less +105 -0
  75. package/lib/components/ReactionsSetter/types.d.ts +13 -0
  76. package/lib/components/ReactionsSetter/types.js +2 -0
  77. package/lib/components/ValidatorSetter/index.d.ts +6 -0
  78. package/lib/components/ValidatorSetter/index.js +138 -0
  79. package/lib/components/index.d.ts +3 -0
  80. package/lib/components/index.js +19 -0
  81. package/lib/index.d.ts +2 -0
  82. package/lib/index.js +18 -0
  83. package/lib/locales/en-US.d.ts +93 -0
  84. package/lib/locales/en-US.js +100 -0
  85. package/lib/locales/index.d.ts +1 -0
  86. package/lib/locales/index.js +10 -0
  87. package/lib/locales/ko-KR.d.ts +93 -0
  88. package/lib/locales/ko-KR.js +100 -0
  89. package/lib/locales/zh-CN.d.ts +93 -0
  90. package/lib/locales/zh-CN.js +100 -0
  91. package/package.json +64 -0
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ import { INodeItem, ITreeDataSource } from './types';
3
+ import './styles.less';
4
+ export interface ITitleProps extends INodeItem {
5
+ treeDataSource: ITreeDataSource;
6
+ }
7
+ export declare const Title: React.FC<ITitleProps>;
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Title = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const shared_1 = require("@formily/shared");
6
+ const reactive_react_1 = require("@formily/reactive-react");
7
+ const designable_react_1 = require("@thienvu18/designable-react");
8
+ const shared_2 = require("./shared");
9
+ require("./styles.less");
10
+ exports.Title = (0, reactive_react_1.observer)((props) => {
11
+ const prefix = (0, designable_react_1.usePrefix)('data-source-setter-node-title');
12
+ const getTitleValue = (dataSource) => {
13
+ const optionalKeys = ['label', 'title', 'header'];
14
+ let nodeTitle;
15
+ optionalKeys.some((key) => {
16
+ const title = (0, shared_1.toArr)(dataSource).find((item) => item.label === key)?.value;
17
+ if (title !== undefined) {
18
+ nodeTitle = title;
19
+ return true;
20
+ }
21
+ return false;
22
+ });
23
+ if (nodeTitle === undefined) {
24
+ (0, shared_1.toArr)(dataSource || []).some((item) => {
25
+ if (item.value && typeof item.value === 'string') {
26
+ nodeTitle = item.value;
27
+ return true;
28
+ }
29
+ return false;
30
+ });
31
+ }
32
+ return nodeTitle;
33
+ };
34
+ const renderTitle = (dataSource) => {
35
+ const nodeTitle = getTitleValue(dataSource);
36
+ if (nodeTitle === undefined)
37
+ return ((0, jsx_runtime_1.jsx)(designable_react_1.TextWidget, { token: "SettingComponents.DataSourceSetter.defaultTitle" }));
38
+ else
39
+ return nodeTitle + '';
40
+ };
41
+ return ((0, jsx_runtime_1.jsxs)("div", { className: prefix, children: [(0, jsx_runtime_1.jsx)("span", { style: { marginRight: '5px' }, children: renderTitle(props?.map || []) }), (0, jsx_runtime_1.jsx)(designable_react_1.IconWidget, { className: prefix + '-icon', infer: "Remove", onClick: () => {
42
+ const newDataSource = (0, shared_1.clone)(props?.treeDataSource?.dataSource);
43
+ (0, shared_2.traverseTree)(newDataSource || [], (dataItem, i, data) => {
44
+ if (data[i].key === props.duplicateKey)
45
+ (0, shared_1.toArr)(data).splice(i, 1);
46
+ });
47
+ props.treeDataSource.dataSource = newDataSource;
48
+ } })] }));
49
+ });
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ import { ITreeDataSource } from './types';
3
+ import './styles.less';
4
+ export interface ITreePanelProps {
5
+ treeDataSource: ITreeDataSource;
6
+ allowTree: boolean;
7
+ defaultOptionValue: {
8
+ label: string;
9
+ value: any;
10
+ }[];
11
+ }
12
+ export declare const TreePanel: React.FC<ITreePanelProps>;
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TreePanel = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const antd_1 = require("antd");
7
+ const shared_1 = require("@formily/shared");
8
+ const reactive_react_1 = require("@formily/reactive-react");
9
+ const designable_react_1 = require("@thienvu18/designable-react");
10
+ const Title_1 = require("./Title");
11
+ const Header_1 = require("./Header");
12
+ const shared_2 = require("./shared");
13
+ require("./styles.less");
14
+ const designable_core_1 = require("@thienvu18/designable-core");
15
+ const limitTreeDrag = ({ dropPosition }) => {
16
+ if (dropPosition === 0) {
17
+ return false;
18
+ }
19
+ return true;
20
+ };
21
+ exports.TreePanel = (0, reactive_react_1.observer)((props) => {
22
+ const prefix = (0, designable_react_1.usePrefix)('data-source-setter');
23
+ const dropHandler = (info) => {
24
+ const dropKey = info.node?.key;
25
+ const dragKey = info.dragNode?.key;
26
+ const dropPos = info.node.pos.split('-');
27
+ const dropPosition = info.dropPosition - Number(dropPos[dropPos.length - 1]);
28
+ const data = [...props.treeDataSource.dataSource];
29
+ // Find dragObject
30
+ let dragObj;
31
+ (0, shared_2.traverseTree)(data, (item, index, arr) => {
32
+ if (arr[index].key === dragKey) {
33
+ arr.splice(index, 1);
34
+ dragObj = item;
35
+ }
36
+ });
37
+ if (!info.dropToGap) {
38
+ (0, shared_2.traverseTree)(data, (item) => {
39
+ if (item.key === dropKey) {
40
+ item.children = item.children || [];
41
+ item.children.unshift(dragObj);
42
+ }
43
+ });
44
+ }
45
+ else if ((info.node.children || []).length > 0 &&
46
+ info.node.expanded &&
47
+ dropPosition === 1) {
48
+ (0, shared_2.traverseTree)(data, (item) => {
49
+ if (item.key === dropKey) {
50
+ item.children = item.children || [];
51
+ item.children.unshift(dragObj);
52
+ }
53
+ });
54
+ }
55
+ else {
56
+ let ar;
57
+ let i;
58
+ (0, shared_2.traverseTree)(data, (item, index, arr) => {
59
+ if (item.key === dropKey) {
60
+ ar = arr;
61
+ i = index;
62
+ }
63
+ });
64
+ if (dropPosition === -1) {
65
+ ar.splice(i, 0, dragObj);
66
+ }
67
+ else {
68
+ ar.splice(i + 1, 0, dragObj);
69
+ }
70
+ }
71
+ props.treeDataSource.dataSource = data;
72
+ };
73
+ return ((0, jsx_runtime_1.jsxs)(react_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(Header_1.Header, { title: (0, jsx_runtime_1.jsx)(designable_react_1.TextWidget, { token: "SettingComponents.DataSourceSetter.dataSourceTree" }), extra: (0, jsx_runtime_1.jsx)(antd_1.Button, { type: "text", onClick: () => {
74
+ const uuid = (0, shared_1.uid)();
75
+ const dataSource = props.treeDataSource.dataSource;
76
+ const initialKeyValuePairs = props.defaultOptionValue?.map((item) => ({ ...item })) || [
77
+ {
78
+ label: 'label',
79
+ value: `${designable_core_1.GlobalRegistry.getDesignerMessage(`SettingComponents.DataSourceSetter.item`)} ${dataSource.length + 1}`,
80
+ },
81
+ { label: 'value', value: uuid },
82
+ ];
83
+ props.treeDataSource.dataSource = dataSource.concat({
84
+ key: uuid,
85
+ duplicateKey: uuid,
86
+ map: initialKeyValuePairs,
87
+ children: [],
88
+ });
89
+ }, icon: (0, jsx_runtime_1.jsx)(designable_react_1.IconWidget, { infer: "Add" }), children: (0, jsx_runtime_1.jsx)(designable_react_1.TextWidget, { token: "SettingComponents.DataSourceSetter.addNode" }) }) }), (0, jsx_runtime_1.jsx)("div", { className: `${prefix + '-layout-item-content'}`, children: (0, jsx_runtime_1.jsx)(antd_1.Tree, { blockNode: true, draggable: true, allowDrop: props.allowTree ? () => true : limitTreeDrag, defaultExpandAll: true, defaultExpandParent: true, autoExpandParent: true, showLine: { showLeafIcon: false }, treeData: props.treeDataSource.dataSource, onDragEnter: () => { }, onDrop: dropHandler, titleRender: (titleProps) => {
90
+ const { key, ...rest } = titleProps;
91
+ return ((0, jsx_runtime_1.jsx)(Title_1.Title, { ...rest, treeDataSource: props.treeDataSource }, key));
92
+ }, onSelect: (selectedKeys) => {
93
+ if (selectedKeys[0]) {
94
+ props.treeDataSource.selectedKey = selectedKeys[0].toString();
95
+ }
96
+ } }) })] }));
97
+ });
@@ -0,0 +1,18 @@
1
+ import React from 'react';
2
+ import { Form } from '@formily/core';
3
+ import { IDataSourceItem } from './types';
4
+ import './styles.less';
5
+ export interface IDataSourceSetterProps {
6
+ className?: string;
7
+ style?: React.CSSProperties;
8
+ onChange: (dataSource: IDataSourceItem[]) => void;
9
+ value: IDataSourceItem[];
10
+ allowTree?: boolean;
11
+ allowExtendOption?: boolean;
12
+ defaultOptionValue?: {
13
+ label: string;
14
+ value: any;
15
+ }[];
16
+ effects?: (form: Form<any>) => void;
17
+ }
18
+ export declare const DataSourceSetter: React.FC<IDataSourceSetterProps>;
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DataSourceSetter = void 0;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const react_1 = require("react");
9
+ const classnames_1 = __importDefault(require("classnames"));
10
+ const antd_1 = require("antd");
11
+ const reactive_1 = require("@formily/reactive");
12
+ const reactive_react_1 = require("@formily/reactive-react");
13
+ const designable_react_1 = require("@thienvu18/designable-react");
14
+ const DataSettingPanel_1 = require("./DataSettingPanel");
15
+ const TreePanel_1 = require("./TreePanel");
16
+ const shared_1 = require("./shared");
17
+ require("./styles.less");
18
+ exports.DataSourceSetter = (0, reactive_react_1.observer)((props) => {
19
+ const { className, value = [], onChange, allowTree = true, allowExtendOption = true, defaultOptionValue, effects = () => { }, } = props;
20
+ const theme = (0, designable_react_1.useTheme)();
21
+ const prefix = (0, designable_react_1.usePrefix)('data-source-setter');
22
+ const [modalVisible, setModalVisible] = (0, react_1.useState)(false);
23
+ const treeDataSource = (0, react_1.useMemo)(() => (0, reactive_1.observable)({
24
+ dataSource: (0, shared_1.transformValueToData)(value),
25
+ selectedKey: '',
26
+ }), [value, modalVisible]);
27
+ const openModal = () => setModalVisible(true);
28
+ const closeModal = () => setModalVisible(false);
29
+ return ((0, jsx_runtime_1.jsxs)(react_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(antd_1.Button, { block: true, onClick: openModal, children: (0, jsx_runtime_1.jsx)(designable_react_1.TextWidget, { token: "SettingComponents.DataSourceSetter.configureDataSource" }) }), (0, jsx_runtime_1.jsx)(antd_1.Modal, { title: (0, jsx_runtime_1.jsx)(designable_react_1.TextWidget, { token: "SettingComponents.DataSourceSetter.configureDataSource" }), width: "65%", styles: { body: { padding: 10 } }, transitionName: "", maskTransitionName: "", open: modalVisible, onCancel: closeModal, onOk: () => {
30
+ onChange((0, shared_1.transformDataToValue)(treeDataSource.dataSource));
31
+ closeModal();
32
+ }, children: (0, jsx_runtime_1.jsxs)("div", { className: `${(0, classnames_1.default)(prefix, className)} ${prefix + '-' + theme} ${prefix + '-layout'}`, children: [(0, jsx_runtime_1.jsx)("div", { className: `${prefix + '-layout-item left'}`, children: (0, jsx_runtime_1.jsx)(TreePanel_1.TreePanel, { defaultOptionValue: defaultOptionValue, allowTree: allowTree, treeDataSource: treeDataSource }) }), (0, jsx_runtime_1.jsx)("div", { className: `${prefix + '-layout-item right'}`, children: (0, jsx_runtime_1.jsx)(DataSettingPanel_1.DataSettingPanel, { allowExtendOption: allowExtendOption, treeDataSource: treeDataSource, effects: effects }) })] }) })] }));
33
+ });
@@ -0,0 +1,9 @@
1
+ import { IDataSourceItem, INodeItem } from './types';
2
+ export interface INode {
3
+ key?: string;
4
+ map?: any;
5
+ children?: INode[];
6
+ }
7
+ export declare const traverseTree: <T extends INode>(data: T[], callback: (dataItem: T, i: number, data: T[]) => any) => void;
8
+ export declare const transformValueToData: (value: IDataSourceItem[]) => INodeItem[];
9
+ export declare const transformDataToValue: (data: INodeItem[]) => IDataSourceItem[];
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.transformDataToValue = exports.transformValueToData = exports.traverseTree = void 0;
4
+ const shared_1 = require("@formily/shared");
5
+ const traverseTree = (data, callback) => {
6
+ for (let i = 0; i < data.length; i++) {
7
+ callback(data[i], i, data);
8
+ if (data[i]?.children) {
9
+ (0, exports.traverseTree)(data[i]?.children, callback);
10
+ }
11
+ }
12
+ };
13
+ exports.traverseTree = traverseTree;
14
+ const transformValueToData = (value) => {
15
+ const data = (0, shared_1.clone)(value);
16
+ (0, exports.traverseTree)(data, (item, i, dataSource) => {
17
+ const dataItem = {
18
+ key: '',
19
+ duplicateKey: '',
20
+ map: [],
21
+ children: [],
22
+ };
23
+ for (const [key, value] of Object.entries(dataSource[i] || {})) {
24
+ if (key !== 'children')
25
+ dataItem.map.push({ label: key, value: value });
26
+ }
27
+ const uuid = (0, shared_1.uid)();
28
+ dataItem.key = uuid;
29
+ dataItem.duplicateKey = uuid;
30
+ dataItem.children = dataSource[i].children || [];
31
+ dataSource[i] = dataItem;
32
+ });
33
+ return data;
34
+ };
35
+ exports.transformValueToData = transformValueToData;
36
+ const transformDataToValue = (data) => {
37
+ const value = (0, shared_1.clone)(data);
38
+ (0, exports.traverseTree)(value, (item, i, dataSource) => {
39
+ const valueItem = {
40
+ children: [],
41
+ };
42
+ (0, shared_1.toArr)(dataSource[i].map).forEach((item) => {
43
+ if (item.label)
44
+ valueItem[item.label] = item.value;
45
+ });
46
+ valueItem.children = dataSource[i]?.children || [];
47
+ dataSource[i] = valueItem;
48
+ });
49
+ return value;
50
+ };
51
+ exports.transformDataToValue = transformDataToValue;
@@ -0,0 +1,81 @@
1
+
2
+ .dn-data-source-setter {
3
+ ::-webkit-scrollbar {
4
+ width: 5px;
5
+ height: 5px;
6
+ }
7
+
8
+ ::-webkit-scrollbar-thumb {
9
+ background-color: rgba(0, 0, 0, 0.2);
10
+ border-radius: 0;
11
+ transition: all 0.25s ease-in-out;
12
+ }
13
+
14
+ ::-webkit-scrollbar-thumb:hover {
15
+ background-color: rgba(0, 0, 0, 0.3);
16
+ }
17
+ &-node-title {
18
+ display: flex;
19
+ justify-content: space-between;
20
+ align-items: center;
21
+
22
+ &-icon {
23
+ transition: all 0.15s ease-in-out;
24
+ opacity: 0;
25
+
26
+ &:hover {
27
+ color: var(--dn-color-primary, #1677ff);
28
+ }
29
+ }
30
+ }
31
+
32
+ &-layout {
33
+ display: flex;
34
+ justify-content: space-around;
35
+ border: 1px solid var(--dn-color-border-secondary, rgba(5, 5, 5, 0.06));
36
+ border-radius: 3px;
37
+
38
+ .@{ant-prefix}-tree-treenode {
39
+ padding-right: 10px;
40
+ white-space: nowrap;
41
+
42
+ &:hover {
43
+ .dn-data-source-setter-node-title-icon {
44
+ opacity: 1;
45
+ }
46
+ }
47
+ }
48
+
49
+ &-item {
50
+ position: relative;
51
+
52
+ &.left {
53
+ width: 40%;
54
+ border-right: 1px solid var(--dn-color-border-secondary, rgba(5, 5, 5, 0.06));
55
+ }
56
+
57
+ &.right {
58
+ width: 60%;
59
+ }
60
+
61
+ &-header {
62
+ display: flex;
63
+ flex: none;
64
+ align-items: center;
65
+ justify-content: space-between;
66
+ height: 40px;
67
+ padding: 8px 12px 9px;
68
+ border-bottom: 1px solid var(--dn-color-border-secondary, rgba(5, 5, 5, 0.06));
69
+ border-radius: 2px 2px 0 0;
70
+ }
71
+
72
+ &-content {
73
+ padding: 2%;
74
+ height: 300px;
75
+ max-height: 300px;
76
+ overflow: scroll;
77
+ }
78
+ }
79
+ }
80
+ }
81
+ @ant-prefix: ant;
@@ -0,0 +1,18 @@
1
+ export interface IDataSourceItem {
2
+ label?: '';
3
+ value?: any;
4
+ children?: any[];
5
+ }
6
+ export interface INodeItem {
7
+ key: string;
8
+ duplicateKey?: string;
9
+ map?: {
10
+ label: string;
11
+ value: any;
12
+ }[];
13
+ children?: INodeItem[];
14
+ }
15
+ export interface ITreeDataSource {
16
+ dataSource: INodeItem[];
17
+ selectedKey: string;
18
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ export interface IFieldProperty {
3
+ [key: string]: string;
4
+ }
5
+ export interface IFieldPropertySetterProps {
6
+ extraLib?: string;
7
+ value?: IFieldProperty;
8
+ onChange?: (value: IFieldProperty) => void;
9
+ }
10
+ export declare const FieldPropertySetter: React.FC<IFieldPropertySetterProps>;
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FieldPropertySetter = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const designable_react_1 = require("@thienvu18/designable-react");
7
+ const antd_1 = require("antd");
8
+ const designable_react_settings_form_1 = require("@thienvu18/designable-react-settings-form");
9
+ const shared_1 = require("@formily/shared");
10
+ const properties_1 = require("./properties");
11
+ const template = (code) => {
12
+ if (!code)
13
+ return;
14
+ return code.trim();
15
+ };
16
+ const FieldPropertySetter = (props) => {
17
+ const [selectKeys, setSelectKeys] = (0, react_1.useState)(['visible']);
18
+ const prefix = (0, designable_react_1.usePrefix)('field-property-setter');
19
+ const value = { ...props.value };
20
+ const parseExpression = (expression) => {
21
+ if (!expression)
22
+ return '';
23
+ return String(expression).match(/^\{\{([\s\S]*)\}\}$/)?.[1] || '';
24
+ };
25
+ const filterEmpty = (value) => {
26
+ return (0, shared_1.reduce)(value, (buf, value, key) => {
27
+ if (!value || value === '{{}}')
28
+ return buf;
29
+ buf[key] = value;
30
+ return buf;
31
+ }, {});
32
+ };
33
+ const currentProperty = properties_1.FieldProperties.find((item) => item.key === selectKeys[0]);
34
+ return ((0, jsx_runtime_1.jsxs)("div", { className: prefix, children: [(0, jsx_runtime_1.jsx)(antd_1.Menu, { mode: "vertical", style: {
35
+ width: 200,
36
+ height: 300,
37
+ paddingRight: 4,
38
+ overflowY: 'auto',
39
+ overflowX: 'hidden',
40
+ }, defaultSelectedKeys: selectKeys, selectedKeys: selectKeys, onSelect: ({ selectedKeys }) => {
41
+ setSelectKeys(selectedKeys);
42
+ }, children: properties_1.FieldProperties.map((key) => {
43
+ if ((0, shared_1.isPlainObj)(key)) {
44
+ return ((0, jsx_runtime_1.jsx)(antd_1.Menu.Item, { children: (0, jsx_runtime_1.jsx)(designable_react_1.TextWidget, { token: `SettingComponents.ReactionsSetter.${key.token || key.key}` }) }, key.key));
45
+ }
46
+ return ((0, jsx_runtime_1.jsx)(antd_1.Menu.Item, { children: (0, jsx_runtime_1.jsx)(designable_react_1.TextWidget, { token: `SettingComponents.ReactionsSetter.${key}` }) }, key));
47
+ }) }), (0, jsx_runtime_1.jsxs)("div", { className: prefix + '-coder-wrapper', children: [(0, jsx_runtime_1.jsxs)("div", { className: prefix + '-coder-start', children: [`$self.${selectKeys[0]} = (`, (0, jsx_runtime_1.jsxs)("span", { style: {
48
+ fontSize: 14,
49
+ marginLeft: 10,
50
+ color: '#888',
51
+ fontWeight: 'normal',
52
+ }, children: ['//', ' ', (0, jsx_runtime_1.jsx)(designable_react_1.TextWidget, { token: "SettingComponents.ReactionsSetter.expressionValueTypeIs" }), ' ', '`', currentProperty?.type, '`'] })] }), (0, jsx_runtime_1.jsx)("div", { className: prefix + '-coder', children: (0, jsx_runtime_1.jsx)(designable_react_settings_form_1.MonacoInput, { language: "javascript.expression", extraLib: props.extraLib, helpCode: template(currentProperty?.helpCode), value: parseExpression(value[selectKeys[0]]), options: {
53
+ lineNumbers: 'off',
54
+ wordWrap: 'on',
55
+ glyphMargin: false,
56
+ folding: false,
57
+ lineDecorationsWidth: 0,
58
+ lineNumbersMinChars: 0,
59
+ minimap: {
60
+ enabled: false,
61
+ },
62
+ }, onChange: (expression) => {
63
+ props.onChange?.(filterEmpty({
64
+ ...value,
65
+ [selectKeys[0]]: `{{${expression}}}`,
66
+ }));
67
+ } }, selectKeys[0]) }), (0, jsx_runtime_1.jsx)("div", { className: prefix + '-coder-end', children: `)` })] })] }));
68
+ };
69
+ exports.FieldPropertySetter = FieldPropertySetter;
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ import { TreeNode } from '@thienvu18/designable-core';
3
+ import { TreeSelectProps } from 'antd';
4
+ export interface IPathSelectorProps extends Omit<TreeSelectProps<any>, 'onChange'> {
5
+ value?: string;
6
+ onChange?: (value: string, node: TreeNode) => void;
7
+ style?: React.CSSProperties;
8
+ className?: string;
9
+ }
10
+ export declare const PathSelector: React.FC<IPathSelectorProps>;
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PathSelector = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const designable_react_1 = require("@thienvu18/designable-react");
6
+ const antd_1 = require("antd");
7
+ const transformDataSource = (node) => {
8
+ const currentNode = node;
9
+ const dots = (count) => {
10
+ let dots = '';
11
+ for (let i = 0; i < count; i++) {
12
+ dots += '.';
13
+ }
14
+ return dots;
15
+ };
16
+ const targetPath = (parentNode, targetNode) => {
17
+ const path = [];
18
+ const transform = (node) => {
19
+ if (node && node !== parentNode) {
20
+ path.push(node.props.name || node.id);
21
+ }
22
+ else {
23
+ transform(node.parent);
24
+ }
25
+ };
26
+ transform(targetNode);
27
+ return path.reverse().join('.');
28
+ };
29
+ const hasNoVoidChildren = (node) => {
30
+ return node.children?.some((node) => {
31
+ if (node.props.type !== 'void' && node !== currentNode)
32
+ return true;
33
+ return hasNoVoidChildren(node);
34
+ });
35
+ };
36
+ const findRoot = (node) => {
37
+ if (!node?.parent)
38
+ return node;
39
+ if (node?.parent?.componentName !== node.componentName)
40
+ return node.parent;
41
+ return findRoot(node.parent);
42
+ };
43
+ const findArrayParent = (node) => {
44
+ if (!node?.parent)
45
+ return;
46
+ if (node.parent.props.type === 'array')
47
+ return node.parent;
48
+ if (node.parent === root)
49
+ return;
50
+ return findArrayParent(node.parent);
51
+ };
52
+ const transformRelativePath = (arrayNode, targetNode) => {
53
+ if (targetNode.depth === currentNode.depth)
54
+ return `.${targetNode.props.name || targetNode.id}`;
55
+ return `${dots(currentNode.depth - arrayNode.depth)}[].${targetPath(arrayNode, targetNode)}`;
56
+ };
57
+ const transformChildren = (children, path = []) => {
58
+ return children.reduce((buf, node) => {
59
+ if (node === currentNode)
60
+ return buf;
61
+ if (node.props.type === 'array' && !node.contains(currentNode))
62
+ return buf;
63
+ if (node.props.type === 'void' && !hasNoVoidChildren(node))
64
+ return buf;
65
+ const currentPath = path.concat(node.props.name || node.id);
66
+ const arrayNode = findArrayParent(node);
67
+ const label = node.props.title ||
68
+ node.props['x-component-props']?.title ||
69
+ node.props.name ||
70
+ node.designerProps.title;
71
+ const value = arrayNode
72
+ ? transformRelativePath(arrayNode, node)
73
+ : currentPath.join('.');
74
+ return buf.concat({
75
+ label,
76
+ value,
77
+ node,
78
+ children: transformChildren(node.children, currentPath),
79
+ });
80
+ }, []);
81
+ };
82
+ const root = findRoot(node);
83
+ if (root) {
84
+ return transformChildren(root.children);
85
+ }
86
+ return [];
87
+ };
88
+ const PathSelector = (props) => {
89
+ const baseNode = (0, designable_react_1.useSelectedNode)();
90
+ const dataSource = transformDataSource(baseNode);
91
+ const findNode = (dataSource, value) => {
92
+ for (let i = 0; i < dataSource.length; i++) {
93
+ const item = dataSource[i];
94
+ if (item.value === value)
95
+ return item.node;
96
+ if (item.children?.length) {
97
+ const fondedChild = findNode(item.children, value);
98
+ if (fondedChild)
99
+ return fondedChild;
100
+ }
101
+ }
102
+ };
103
+ return ((0, jsx_runtime_1.jsx)(antd_1.TreeSelect, { ...props, onChange: (value) => {
104
+ props.onChange(value, findNode(dataSource, value));
105
+ }, treeDefaultExpandAll: true, treeData: dataSource }));
106
+ };
107
+ exports.PathSelector = PathSelector;
@@ -0,0 +1,5 @@
1
+ export interface IDependency {
2
+ name: string;
3
+ path: string;
4
+ }
5
+ export declare const initDeclaration: () => Promise<void>;
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.initDeclaration = void 0;
4
+ const designable_react_settings_form_1 = require("@thienvu18/designable-react-settings-form");
5
+ const loadDependencies = async (deps) => {
6
+ return Promise.all(deps.map(async ({ name, path }) => ({
7
+ name,
8
+ path,
9
+ library: await fetch(`${(0, designable_react_settings_form_1.getNpmCDNRegistry)()}/${name}/${path}`).then((res) => res.text()),
10
+ })));
11
+ };
12
+ const initDeclaration = async () => {
13
+ return designable_react_settings_form_1.MonacoInput.loader.init().then(async (monaco) => {
14
+ const deps = await loadDependencies([
15
+ { name: '@formily/core', path: 'dist/formily.core.all.d.ts' },
16
+ ]);
17
+ deps?.forEach(({ name, library }) => {
18
+ monaco.languages.typescript.typescriptDefaults.addExtraLib(`declare module '${name}'{ ${library} }`, `file:///node_modules/${name}/index.d.ts`);
19
+ });
20
+ monaco.languages.typescript.typescriptDefaults.addExtraLib(`
21
+ import { Form, Field } from '@formily/core'
22
+ declare global {
23
+ /*
24
+ * Form Model
25
+ **/
26
+ declare var $form: Form
27
+ /*
28
+ * Form Values
29
+ **/
30
+ declare var $values: any
31
+ /*
32
+ * Field Model
33
+ **/
34
+ declare var $self: Field
35
+ /*
36
+ * create an persistent observable state object
37
+ **/
38
+ declare var $observable: <T>(target: T, deps?: any[]) => T
39
+ /*
40
+ * create a persistent data
41
+ **/
42
+ declare var $memo: <T>(callback: () => T, deps?: any[]) => T
43
+ /*
44
+ * handle side-effect logic
45
+ **/
46
+ declare var $effect: (callback: () => void | (() => void), deps?: any[]) => void
47
+ /*
48
+ * set initial component props to current field
49
+ **/
50
+ declare var $props: (props: any) => void
51
+ }
52
+ `, `file:///node_modules/formily_global.d.ts`);
53
+ });
54
+ };
55
+ exports.initDeclaration = initDeclaration;