@cicctencent/low-code-editor 0.0.0-stage → 1.1.9-beta.6

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 (97) hide show
  1. package/README.md +2 -2
  2. package/api-extractor.json +36 -0
  3. package/dist/ActivityBar/index.vue.d.ts +29 -0
  4. package/dist/ComponentTree/components/List.vue.d.ts +29 -0
  5. package/dist/ComponentTree/index.vue.d.ts +32 -0
  6. package/dist/DataSource/index.vue.d.ts +34 -0
  7. package/dist/HeaderBar/components/BarTooltip.vue.d.ts +37 -0
  8. package/dist/HeaderBar/index.vue.d.ts +49 -0
  9. package/dist/NavTree/index.vue.d.ts +48 -0
  10. package/dist/SchemaConfig/index.vue.d.ts +36 -0
  11. package/dist/SidebarPane/index.vue.d.ts +38 -0
  12. package/dist/components/ComponentTreeFavorites/components/List.vue.d.ts +41 -0
  13. package/dist/components/ComponentTreeFavorites/components/Tips.vue.d.ts +16 -0
  14. package/dist/components/ComponentTreeFavorites/index.vue.d.ts +44 -0
  15. package/dist/components/ImageGuide/index.vue.d.ts +45 -0
  16. package/dist/components.d.ts +7 -0
  17. package/dist/composables/useComponentTree.d.ts +13 -0
  18. package/dist/config/ace.config.d.ts +3 -0
  19. package/dist/domain/EditorDomain.d.ts +89 -0
  20. package/dist/editor.d.ts +466 -0
  21. package/dist/editor.vue.d.ts +104 -0
  22. package/dist/formily/ActivityBar/index.d.ts +4 -0
  23. package/dist/formily/ComponentTree/index.d.ts +4 -0
  24. package/dist/formily/DataBinding/index.d.ts +4 -0
  25. package/dist/formily/DataBinding/index.vue.d.ts +26 -0
  26. package/dist/formily/DataSource/index.d.ts +4 -0
  27. package/dist/formily/MenuTable/PageList.vue.d.ts +28 -0
  28. package/dist/formily/MenuTable/index.d.ts +4 -0
  29. package/dist/formily/MenuTable/index.vue.d.ts +30 -0
  30. package/dist/formily/MenuTable/useMenuTable.d.ts +2 -0
  31. package/dist/formily/NavTree/index.d.ts +4 -0
  32. package/dist/formily/SidebarPane/index.d.ts +4 -0
  33. package/dist/formily/index.d.ts +2 -0
  34. package/dist/index.css +1167 -0
  35. package/dist/index.d.ts +250 -0
  36. package/dist/index.js +42688 -0
  37. package/dist/utils/base64.d.ts +4 -0
  38. package/dist/utils/index.d.ts +27 -0
  39. package/package.json +62 -4
  40. package/rollup.config.js +3 -0
  41. package/src/ActivityBar/index.vue +71 -0
  42. package/src/ComponentTree/components/List.vue +310 -0
  43. package/src/ComponentTree/index.vue +77 -0
  44. package/src/DataSource/index.vue +640 -0
  45. package/src/HeaderBar/components/BarDialog.vue +43 -0
  46. package/src/HeaderBar/components/BarTooltip.vue +33 -0
  47. package/src/HeaderBar/index.vue +513 -0
  48. package/src/NavTree/index.vue +345 -0
  49. package/src/SchemaConfig/index.vue +150 -0
  50. package/src/SidebarPane/index.vue +199 -0
  51. package/src/SynBarComponent/index.vue +31 -0
  52. package/src/assets/font/NotoSansSC.ttf +0 -0
  53. package/src/assets/img/header/edit.png +0 -0
  54. package/src/assets/img/header/link.png +0 -0
  55. package/src/assets/img/header/link.svg +9 -0
  56. package/src/assets/img/header/preview.png +0 -0
  57. package/src/assets/img/header/preview.svg +9 -0
  58. package/src/assets/img/header/redo.svg +1 -0
  59. package/src/assets/img/header/undo.svg +1 -0
  60. package/src/assets/img/tool/all-select.svg +9 -0
  61. package/src/assets/img/tool/all.svg +9 -0
  62. package/src/assets/img/tool/collect.svg +6 -0
  63. package/src/assets/img/tool/collection-select.svg +3 -0
  64. package/src/assets/img/tool/collection-tag.svg +5 -0
  65. package/src/assets/img/tool/info.svg +4 -0
  66. package/src/assets/img/tool/union.svg +4 -0
  67. package/src/components/ComponentTreeFavorites/components/List.vue +452 -0
  68. package/src/components/ComponentTreeFavorites/components/Tips.vue +108 -0
  69. package/src/components/ComponentTreeFavorites/index.vue +180 -0
  70. package/src/components/ImageGuide/index.vue +100 -0
  71. package/src/components.ts +23 -0
  72. package/src/composables/useComponentTree.ts +38 -0
  73. package/src/config/ace.config.ts +22 -0
  74. package/src/domain/EditorDomain.ts +265 -0
  75. package/src/editor.ts +645 -0
  76. package/src/editor.vue +380 -0
  77. package/src/formily/ActivityBar/index.ts +23 -0
  78. package/src/formily/ActivityBar/index.vue +121 -0
  79. package/src/formily/ComponentTree/index.ts +22 -0
  80. package/src/formily/DataBinding/index.ts +22 -0
  81. package/src/formily/DataBinding/index.vue +285 -0
  82. package/src/formily/DataSource/index.ts +22 -0
  83. package/src/formily/MenuTable/PageList.vue +132 -0
  84. package/src/formily/MenuTable/index.ts +19 -0
  85. package/src/formily/MenuTable/index.vue +218 -0
  86. package/src/formily/MenuTable/useMenuTable.ts +147 -0
  87. package/src/formily/NavTree/index.ts +20 -0
  88. package/src/formily/SidebarPane/index.ts +23 -0
  89. package/src/formily/SidebarPane/index.vue +174 -0
  90. package/src/formily/index.ts +12 -0
  91. package/src/index.ts +29 -0
  92. package/src/typings/vue-shim.d.ts +13 -0
  93. package/src/utils/base64.ts +5 -0
  94. package/src/utils/index.ts +57 -0
  95. package/test/case.ts +67 -0
  96. package/test/utils/index.test.ts +27 -0
  97. package/tsconfig.json +8 -0
@@ -0,0 +1,147 @@
1
+ import { reactive, nextTick, ref, computed, watch } from 'vue';
2
+ import type { FormInstance } from '@jt/jtui';
3
+ import { ProjectMetaNavMenu } from '@cicctencent/low-code-core';
4
+ interface IMenuForm extends Omit<ProjectMetaNavMenu, 'children'> {
5
+ content: 'pageId' | 'url';
6
+ }
7
+ export default function (props, emits) {
8
+ // 配置菜单的对话框配置
9
+ const editModalOptions = reactive({
10
+ title: '',
11
+ visible: false,
12
+ hasClose: false,
13
+ hasFooter: true,
14
+ width: '604px',
15
+ });
16
+ // 配置菜单的表单对象
17
+ const menuForm = reactive<IMenuForm>({
18
+ content: 'pageId',
19
+ name: '',
20
+ icon: '',
21
+ target: '_blank',
22
+ url: '',
23
+ pageId: 0,
24
+ });
25
+ const menuFormRef = ref<FormInstance>();
26
+ // 渲染在表格的菜单数组
27
+ const menuTree = ref<ProjectMetaNavMenu[]>([]);
28
+
29
+ // key为页面id value为页面名称
30
+ const pageNameMap = computed(() =>
31
+ props.project.pages.reduce(
32
+ (pre, cur) => ({ ...pre, [cur.id]: cur.title }),
33
+ {}
34
+ )
35
+ );
36
+
37
+ watch(
38
+ () => props.modelValue,
39
+ val => {
40
+ menuTree.value = val;
41
+ },
42
+ { deep: true, immediate: true }
43
+ );
44
+
45
+ // 当前点击行的菜单数据
46
+ let currentRow;
47
+
48
+ /* 处理菜单表格中的四个操作 */
49
+ const operateMenu = (
50
+ menuTree: ProjectMetaNavMenu[],
51
+ row: ProjectMetaNavMenu,
52
+ menu?: ProjectMetaNavMenu
53
+ ) => {
54
+ let stop = false;
55
+ for (const i in menuTree) {
56
+ if (menuTree[i] === row) {
57
+ if (editModalOptions.title === '添加同级') {
58
+ menuTree.splice(+i + 1, 0, menu);
59
+ } else if (editModalOptions.title === '添加下级') {
60
+ menuTree[i].children.push(menu);
61
+ } else if (editModalOptions.title === '') {
62
+ menuTree.splice(+i, 1);
63
+ } else {
64
+ menuTree[i] = { ...menu, children: menuTree[i].children };
65
+ }
66
+ stop = true;
67
+ } else if (menuTree[i].children.length) {
68
+ stop = operateMenu(menuTree[i].children, row, menu);
69
+ }
70
+ if (stop) break;
71
+ }
72
+ return stop;
73
+ };
74
+
75
+ /* 点击编辑对话框确认按钮触发 */
76
+ const confirm = () => {
77
+ const { name, icon, pageId, url, target, content } = menuForm;
78
+ const finalMenu = {
79
+ pageId: pageId
80
+ ? { name, icon, pageId, children: [] }
81
+ : { name, icon, children: [] },
82
+ url: { name, icon, url, target, children: [] },
83
+ };
84
+ operateMenu(menuTree.value, currentRow, finalMenu[content]);
85
+ emits('update:modelValue', menuTree.value);
86
+ editModalOptions.visible = false;
87
+ editModalOptions.title = '';
88
+ menuFormRef.value.resetFields();
89
+ };
90
+
91
+ /* 点击编辑对话框取消按钮触发 */
92
+ const cancel = () => {
93
+ editModalOptions.visible = false;
94
+ editModalOptions.title = '';
95
+ menuFormRef.value.resetFields();
96
+ };
97
+
98
+ // 点击表格添加同级按钮
99
+ const addPeer = (index, row) => {
100
+ editModalOptions.title = '添加同级';
101
+ editModalOptions.visible = true;
102
+ currentRow = row;
103
+ };
104
+ // 点击表格添加下级按钮
105
+ const addSubordinate = (index, row) => {
106
+ editModalOptions.title = '添加下级';
107
+ editModalOptions.visible = true;
108
+ currentRow = row;
109
+ };
110
+ // 点击表格编辑按钮
111
+ const handleEdit = (index, row) => {
112
+ editModalOptions.title = row.name;
113
+ editModalOptions.visible = true;
114
+ currentRow = row;
115
+ nextTick(() => {
116
+ menuForm.name = row.name;
117
+ menuForm.icon = row.icon;
118
+ if (row.url) {
119
+ menuForm.content = 'url';
120
+ menuForm.url = row.url;
121
+ menuForm.target = row.target;
122
+ } else if (row.pageId) {
123
+ menuForm.content = 'pageId';
124
+ menuForm.pageId = row.pageId;
125
+ }
126
+ });
127
+ };
128
+ // 点击表格删除按钮
129
+ const handleDelete = (index, row) => {
130
+ operateMenu(menuTree.value, row);
131
+ emits('update:modelValue', menuTree.value);
132
+ };
133
+
134
+ return {
135
+ editModalOptions,
136
+ menuForm,
137
+ menuFormRef,
138
+ menuTree,
139
+ pageNameMap,
140
+ confirm,
141
+ cancel,
142
+ addPeer,
143
+ addSubordinate,
144
+ handleEdit,
145
+ handleDelete,
146
+ };
147
+ }
@@ -0,0 +1,20 @@
1
+ import { connect, mapProps } from '@formily/vue';
2
+ import { transformComponent } from '@jt/formily';
3
+ // @ts-ignore
4
+ import JtNavTree from '../../NavTree/index.vue';
5
+
6
+ export type JtNavTreeProps = typeof JtNavTree;
7
+
8
+ const TransformJtNavTree = transformComponent<JtNavTreeProps>(JtNavTree, {
9
+ change: 'update:modelValue',
10
+ });
11
+
12
+ export const ActivityBar = connect(
13
+ TransformJtNavTree,
14
+ mapProps({
15
+ value: 'modelValue',
16
+ readOnly: 'readonly',
17
+ })
18
+ );
19
+
20
+ export default ActivityBar;
@@ -0,0 +1,23 @@
1
+ import { connect, mapProps } from '@formily/vue';
2
+ import { transformComponent } from '@jt/formily';
3
+ // @ts-ignore
4
+ import JtSidebarPane from './index.vue';
5
+
6
+ export type JtSidebarPaneProps = typeof JtSidebarPane;
7
+
8
+ const TransformJtSidebarPane = transformComponent<JtSidebarPaneProps>(
9
+ JtSidebarPane,
10
+ {
11
+ change: 'update:modelValue',
12
+ }
13
+ );
14
+
15
+ export const ActivityBar = connect(
16
+ TransformJtSidebarPane,
17
+ mapProps({
18
+ value: 'modelValue',
19
+ readOnly: 'readonly',
20
+ })
21
+ );
22
+
23
+ export default ActivityBar;
@@ -0,0 +1,174 @@
1
+ <template>
2
+ <div :class="['float-pane', currentType === 'float' ? 'visible' : '']">
3
+ <div class="titled-panel">
4
+ <template v-if="showHeader">
5
+ <button class="icon-float" @click="currentType = 'fixed'">
6
+ <svg
7
+ fill="currentColor"
8
+ preserveAspectRatio="xMidYMid meet"
9
+ width="16"
10
+ height="16"
11
+ viewBox="0 0 1024 1024"
12
+ >
13
+ <path
14
+ d="M160.256 816.64C116.224 872.448 102.4 921.6 102.4 921.6s49.152-13.824 104.96-57.856c22.016-17.408 128-112.64 200.704-174.08l-73.728-73.728c-61.44 72.704-157.184 178.688-174.08 200.704zM648.704 209.408L442.368 355.328l226.304 226.304 145.92-206.336 15.872 15.872c20.992 20.992 54.784 20.992 75.776 0s20.992-54.784 0-75.776l-197.12-197.12c-20.992-20.992-54.784-20.992-75.776 0-20.992 20.992-20.992 54.784 0 75.776l15.36 15.36zM247.808 334.848c-9.728 2.048-18.944 6.656-26.624 14.336-20.992 20.992-20.992 54.784 0 75.776l377.856 377.856c20.992 20.992 54.784 20.992 75.776 0 7.68-7.68 12.288-16.896 14.336-26.624L247.808 334.848z"
15
+ ></path>
16
+ <path
17
+ d="M840.704 879.104c-9.728 0-19.456-3.584-27.136-11.264L155.648 210.432c-14.848-14.848-14.848-39.424 0-54.272 14.848-14.848 39.424-14.848 54.272 0L867.84 814.08c14.848 14.848 14.848 39.424 0 54.272-7.168 7.168-16.896 10.752-27.136 10.752z"
18
+ ></path>
19
+ </svg>
20
+ </button>
21
+ <button class="icon-close" @click="currentType = 'none'">
22
+ <el-icon :size="16"><Close /></el-icon>
23
+ </button>
24
+ <div class="panel-title">
25
+ <span>{{ name }}</span>
26
+ </div>
27
+ </template>
28
+ <div class="panel-body" :style="{ top: showHeader ? '48px' : 0 }">
29
+ <slot></slot>
30
+ </div>
31
+ </div>
32
+ </div>
33
+ <div :class="['fixed-pane', currentType === 'fixed' ? 'visible' : '']">
34
+ <div class="titled-panel">
35
+ <template v-if="showHeader">
36
+ <button class="icon-fixed" @click="currentType = 'float'">
37
+ <svg
38
+ fill="currentColor"
39
+ preserveAspectRatio="xMidYMid meet"
40
+ width="16"
41
+ height="16"
42
+ viewBox="0 0 1024 1024"
43
+ >
44
+ <path
45
+ d="M750.848 28.928l245.248 242.944a66.048 66.048 0 1 1-93.184 93.184l-25.6-19.456-249.6 353.792 78.336 78.336a66.048 66.048 0 0 1-93.184 92.672l-460.8-464.64a66.048 66.048 0 0 1 93.184-93.184l76.8 78.336 354.048-249.856-18.176-18.944a66.048 66.048 0 1 1 93.184-93.184zM380.672 732.416l-91.904-90.88c-74.24 89.6-191.488 219.904-212.736 247.04a419.84 419.84 0 0 0-70.656 128 419.84 419.84 0 0 0 128-70.144c27.136-21.248 157.44-138.496 246.528-214.016z"
46
+ ></path>
47
+ </svg>
48
+ </button>
49
+ <button class="icon-close" @click="currentType = 'none'">
50
+ <el-icon :size="16"><Close /></el-icon>
51
+ </button>
52
+ <div class="panel-title">
53
+ <span>{{ name }}</span>
54
+ </div>
55
+ </template>
56
+ <div class="panel-body" :style="{ top: showHeader ? '48px' : 0 }">
57
+ <slot></slot>
58
+ </div>
59
+ </div>
60
+ </div>
61
+ </template>
62
+
63
+ <script lang="ts" setup>
64
+ // @ts-nocheck
65
+ import { Close } from '@cicctencent/icons-vue';
66
+ import { ref, watch, withDefaults, defineProps } from 'vue';
67
+ const props = withDefaults(
68
+ defineProps<{
69
+ type: 'float' | 'fixed' | 'none';
70
+ name: string;
71
+ showHeader: boolean;
72
+ }>(),
73
+ {
74
+ type: 'float',
75
+ name: '默认标题',
76
+ showHeader: true,
77
+ }
78
+ );
79
+ const currentType = ref('');
80
+ watch(
81
+ () => props.type,
82
+ val => {
83
+ currentType.value = val;
84
+ },
85
+ { immediate: true }
86
+ );
87
+ </script>
88
+
89
+ <style lang="scss" scoped>
90
+ .float-pane {
91
+ position: absolute;
92
+ width: 300px;
93
+ top: 0;
94
+ bottom: 0;
95
+ left: 46px;
96
+ z-index: 820;
97
+ border-left: 1px solid rgba(0, 0, 0, 0.1);
98
+ box-shadow: 4px 6px 6px 0 rgba(31, 50, 88, 0.08);
99
+ background-color: #fff;
100
+ display: none;
101
+ }
102
+ .fixed-pane {
103
+ position: relative;
104
+ margin-left: 1px;
105
+ border-left: 1px solid rgba(0, 0, 0, 0.1);
106
+ height: 100%;
107
+ width: 300px;
108
+ flex-shrink: 0;
109
+ background-color: #fff;
110
+ display: none;
111
+ }
112
+ .float-pane .titled-panel,
113
+ .fixed-pane .titled-panel {
114
+ position: relative;
115
+ width: 100%;
116
+ height: 100%;
117
+ .icon-float,
118
+ .icon-fixed {
119
+ position: absolute;
120
+ right: 38px;
121
+ top: 14px;
122
+ height: auto;
123
+ z-index: 2;
124
+ background: transparent;
125
+ border-color: transparent;
126
+ border-radius: 0;
127
+ padding: 0;
128
+ height: 20px;
129
+ font-size: 14px;
130
+ border-width: 0;
131
+ cursor: pointer;
132
+ }
133
+ .icon-close {
134
+ position: absolute;
135
+ right: 16px;
136
+ top: 14px;
137
+ height: auto;
138
+ z-index: 2;
139
+ background: transparent;
140
+ border-color: transparent;
141
+ border-radius: 0;
142
+ padding: 0;
143
+ height: 20px;
144
+ font-size: 14px;
145
+ border-width: 0;
146
+ cursor: pointer;
147
+ display: flex;
148
+ align-items: center;
149
+ justify-content: center;
150
+ }
151
+ .panel-title {
152
+ height: 48px;
153
+ font-size: 16px;
154
+ padding: 0 15px;
155
+ color: #0f1726;
156
+ font-weight: 700;
157
+ display: flex;
158
+ justify-content: flex-start;
159
+ align-items: center;
160
+ }
161
+ .panel-body {
162
+ position: absolute;
163
+ top: 0;
164
+ bottom: 0;
165
+ left: 0;
166
+ right: 0;
167
+ overflow: visible;
168
+ border-top: 1px solid rgba(31, 56, 88, 0.1);
169
+ }
170
+ }
171
+ .visible {
172
+ display: block;
173
+ }
174
+ </style>
@@ -0,0 +1,12 @@
1
+ import MenuTable from './MenuTable';
2
+
3
+ import DataBinding from './DataBinding';
4
+
5
+ const formily: Record<string, any> = {
6
+ MenuTable,
7
+ DataBinding,
8
+ };
9
+
10
+ console.log('>>>formily', formily);
11
+
12
+ export default formily;
package/src/index.ts ADDED
@@ -0,0 +1,29 @@
1
+
2
+ import { App } from 'vue';
3
+ import Editor from './editor.vue';
4
+ import EditorDomain from './domain/EditorDomain';
5
+ declare global {
6
+ interface Window {
7
+ JT_VERSION: Record<string, string>;
8
+ }
9
+ }
10
+ const EditorComponent = Editor as any;
11
+
12
+ EditorComponent.install = (app: App) => {
13
+ app.component('VcEditor', Editor);
14
+ };
15
+ import formilyComponents from './formily';
16
+ export default EditorComponent;
17
+
18
+ import ComponentTreeFavorites from './components/ComponentTreeFavorites/index.vue'
19
+
20
+ export { formilyComponents, Editor, EditorDomain, ComponentTreeFavorites };
21
+
22
+ window.JT_VERSION = Object.assign(
23
+ {
24
+ '__rollup__name__@__rollup__version__': '__rollup__date__',
25
+ },
26
+ window.JT_VERSION
27
+ );
28
+
29
+
@@ -0,0 +1,13 @@
1
+ declare module "*.vue" {
2
+ import type { DefineComponent } from "vue";
3
+ const component: DefineComponent<{}, {}, any>;
4
+ export default component;
5
+ }
6
+
7
+ declare module "*.png" {
8
+ export default any;
9
+ }
10
+
11
+ declare module "*.svg" {
12
+ export default any;
13
+ }
@@ -0,0 +1,5 @@
1
+ /** 提示图标 */
2
+ export const tipIcon = 'data:image/webp;base64,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';
3
+
4
+ /** 非图片图标 */
5
+ export const notImageIcon = `data:image/webp;base64,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`
@@ -0,0 +1,57 @@
1
+ export declare interface SelectItem {
2
+ label: string;
3
+ value: any;
4
+ }
5
+
6
+ type PlainObject<T = any> = { [key: string]: T };
7
+ export const changeEnum2Array = (param: PlainObject): SelectItem[] => {
8
+ const arr: SelectItem[] = [];
9
+ let keys = Object.keys(param);
10
+ // 反向映射 值为数字
11
+ if (param[param[keys[0]]] !== undefined) {
12
+ keys = keys.slice(keys.length / 2);
13
+ }
14
+ keys.forEach((key) => {
15
+ arr.push({
16
+ label: key,
17
+ value: param[key],
18
+ });
19
+ });
20
+ return arr;
21
+ };
22
+
23
+ /**
24
+ * style图片背景渲染
25
+ * @param img
26
+ * @returns
27
+ */
28
+ export function imageStyle(img: string) {
29
+ return {
30
+ width: "100%",
31
+ height: "100%",
32
+ backgroundImage: `url(${img})`,
33
+ backgroundSize: "cover",
34
+ };
35
+ }
36
+
37
+ /**
38
+ * 过滤收藏
39
+ * @param tree
40
+ * @param favorites
41
+ * @returns
42
+ */
43
+ export function favoriteRebuild(tree, favorites) {
44
+ if (!tree) return tree;
45
+ const newTree = [];
46
+ for (const item of tree) {
47
+ if (item.list) {
48
+ item.list = favoriteRebuild(item.list, favorites);
49
+ if (item.list?.length) {
50
+ newTree.push(item);
51
+ }
52
+ } else if (favorites.includes(item.name)) {
53
+ newTree.push(item);
54
+ }
55
+ }
56
+ return newTree;
57
+ };
package/test/case.ts ADDED
@@ -0,0 +1,67 @@
1
+ export const case1 = [
2
+ {
3
+ title: "基础组件",
4
+ list: [
5
+ {
6
+ title: "普通容器",
7
+ list: [
8
+ {
9
+ title: "普通容器",
10
+ icon: "https://jtcospublic.ciccten.com/low-code/files/4c27q5/snipaste_2022-08-01_10-40-301659321679266.png",
11
+ name: "PlainContainer",
12
+ },
13
+ {
14
+ title: "TAB(内容切换)",
15
+ icon: "https://jtcospublic.ciccten.com/low-code/files/4c27q5/snipaste_2022-08-01_10-40-301659321679266.png",
16
+ name: "TabContainer",
17
+ }
18
+ ]
19
+ },
20
+ {
21
+ title: "图片",
22
+ list: [
23
+ {
24
+ title: "单图片",
25
+ icon: "http://jtcospublic.ciccten.com/config-server/1632374118739563199/picture.png",
26
+ name: "ComponentImage",
27
+ }
28
+ ]
29
+ },
30
+ {
31
+ title: "富文本",
32
+ list: [
33
+ {
34
+ title: "富文本",
35
+ icon: "http://jtcospublic.ciccten.com/config-server/1632374135943751700/rich-text.png",
36
+ name: "ComponentRich",
37
+ }
38
+ ]
39
+ },
40
+ {
41
+ title: "吸底按钮",
42
+ list: [
43
+ {
44
+ title: "吸底按钮",
45
+ icon: "http:////jtcospublic.ciccten.com/config-server/1638512519326572833/bottom-potocol.png",
46
+ name: "BottomButton",
47
+ }
48
+ ]
49
+ }
50
+ ]
51
+ },
52
+ {
53
+ title: "模块组件",
54
+ list: [
55
+ {
56
+ title: "纯文本",
57
+ list: [
58
+ {
59
+ title: "纯文本",
60
+ icon: "http://jtcospublic.ciccten.com/config-server/1632374102992225549/text.png",
61
+ name: "ComponentText",
62
+ }
63
+ ]
64
+ }
65
+ ]
66
+ }
67
+ ]
@@ -0,0 +1,27 @@
1
+ import { test, expect } from 'vitest'
2
+ import { favoriteRebuild } from '../../src/utils/index'
3
+ import { case1 } from '../case'
4
+ test('adds 1 + 2 to equal 3', () => {
5
+ expect(1 + 2).toBe(3)
6
+ })
7
+
8
+ test('favoriteRebuild', () => {
9
+ const res = favoriteRebuild(case1, ['ComponentImage'])
10
+ expect(res).toEqual([
11
+ {
12
+ title: "基础组件",
13
+ list: [
14
+ {
15
+ title: "图片",
16
+ list: [
17
+ {
18
+ title: "单图片",
19
+ icon: "http://jtcospublic.ciccten.com/config-server/1632374118739563199/picture.png",
20
+ name: "ComponentImage",
21
+ }
22
+ ]
23
+ },
24
+ ]
25
+ },
26
+ ])
27
+ })
package/tsconfig.json ADDED
@@ -0,0 +1,8 @@
1
+ {
2
+ "extends": "../../tsconfig.json",
3
+ "include": ["./src/**/*.ts", "./src/*.ts", "./src/**/*.vue", "./src/*.vue"],
4
+ "exclude": ["./src/__tests__/*", "demo", "node_modules"],
5
+ "compilerOptions": {
6
+ "lib": ["ESNext", "DOM"]
7
+ }
8
+ }