@houaoran/designer 1.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 (126) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +98 -0
  3. package/dist/components.es.js +11424 -0
  4. package/dist/components.umd.js +878 -0
  5. package/dist/index.es.js +39113 -0
  6. package/dist/index.umd.js +1187 -0
  7. package/package.json +96 -0
  8. package/src/components/DragBox.vue +49 -0
  9. package/src/components/DragTool.vue +235 -0
  10. package/src/components/EventConfig.vue +557 -0
  11. package/src/components/FcDesigner.vue +2569 -0
  12. package/src/components/FcTitle.vue +69 -0
  13. package/src/components/FetchConfig.vue +415 -0
  14. package/src/components/FieldInput.vue +371 -0
  15. package/src/components/FnConfig.vue +315 -0
  16. package/src/components/FnEditor.vue +327 -0
  17. package/src/components/FnInput.vue +103 -0
  18. package/src/components/FormLabel.vue +47 -0
  19. package/src/components/HtmlEditor.vue +125 -0
  20. package/src/components/JsonPreview.vue +146 -0
  21. package/src/components/OptionsTextInput.vue +151 -0
  22. package/src/components/PropsInput.vue +72 -0
  23. package/src/components/Required.vue +75 -0
  24. package/src/components/Row.vue +26 -0
  25. package/src/components/SignaturePad.vue +176 -0
  26. package/src/components/Struct.vue +153 -0
  27. package/src/components/StructEditor.vue +121 -0
  28. package/src/components/StructTree.vue +209 -0
  29. package/src/components/TableOptions.vue +164 -0
  30. package/src/components/TreeOptions.vue +167 -0
  31. package/src/components/TypeSelect.vue +144 -0
  32. package/src/components/Validate.vue +302 -0
  33. package/src/components/ValueInput.vue +89 -0
  34. package/src/components/Warning.vue +46 -0
  35. package/src/components/ai/AiPanel.vue +1122 -0
  36. package/src/components/ai/MarkdownRenderer.vue +548 -0
  37. package/src/components/language/LanguageConfig.vue +174 -0
  38. package/src/components/language/LanguageInput.vue +191 -0
  39. package/src/components/style/BackgroundInput.vue +315 -0
  40. package/src/components/style/BorderInput.vue +242 -0
  41. package/src/components/style/BoxSizeInput.vue +166 -0
  42. package/src/components/style/BoxSpaceInput.vue +269 -0
  43. package/src/components/style/ColorInput.vue +90 -0
  44. package/src/components/style/ConfigItem.vue +118 -0
  45. package/src/components/style/FontInput.vue +197 -0
  46. package/src/components/style/PositionInput.vue +146 -0
  47. package/src/components/style/RadiusInput.vue +164 -0
  48. package/src/components/style/ShadowContent.vue +335 -0
  49. package/src/components/style/ShadowInput.vue +91 -0
  50. package/src/components/style/SizeInput.vue +118 -0
  51. package/src/components/style/StyleConfig.vue +307 -0
  52. package/src/components/table/Table.vue +252 -0
  53. package/src/components/table/TableView.vue +1058 -0
  54. package/src/components/tableForm/TableForm.vue +471 -0
  55. package/src/components/tableForm/TableFormColumnView.vue +103 -0
  56. package/src/components/tableForm/TableFormView.vue +46 -0
  57. package/src/components/tree/FcTree.vue +713 -0
  58. package/src/components/tree/FcTreeNode.vue +216 -0
  59. package/src/config/base/field.js +43 -0
  60. package/src/config/base/form.js +132 -0
  61. package/src/config/base/style.js +26 -0
  62. package/src/config/base/validate.js +15 -0
  63. package/src/config/index.js +70 -0
  64. package/src/config/menu.js +24 -0
  65. package/src/config/rule/alert.js +45 -0
  66. package/src/config/rule/button.js +49 -0
  67. package/src/config/rule/card.js +40 -0
  68. package/src/config/rule/cascader.js +121 -0
  69. package/src/config/rule/checkbox.js +68 -0
  70. package/src/config/rule/col.js +86 -0
  71. package/src/config/rule/collapse.js +30 -0
  72. package/src/config/rule/collapseItem.js +36 -0
  73. package/src/config/rule/color.js +53 -0
  74. package/src/config/rule/date.js +66 -0
  75. package/src/config/rule/dateRange.js +60 -0
  76. package/src/config/rule/divider.js +31 -0
  77. package/src/config/rule/editor.js +31 -0
  78. package/src/config/rule/group.js +86 -0
  79. package/src/config/rule/html.js +43 -0
  80. package/src/config/rule/image.js +32 -0
  81. package/src/config/rule/input.js +62 -0
  82. package/src/config/rule/number.js +49 -0
  83. package/src/config/rule/password.js +52 -0
  84. package/src/config/rule/radio.js +43 -0
  85. package/src/config/rule/rate.js +44 -0
  86. package/src/config/rule/row.js +46 -0
  87. package/src/config/rule/select.js +70 -0
  88. package/src/config/rule/signaturePad.js +59 -0
  89. package/src/config/rule/slider.js +53 -0
  90. package/src/config/rule/space.js +44 -0
  91. package/src/config/rule/subForm.js +47 -0
  92. package/src/config/rule/switch.js +46 -0
  93. package/src/config/rule/tabPane.js +29 -0
  94. package/src/config/rule/table.js +37 -0
  95. package/src/config/rule/tableForm.js +115 -0
  96. package/src/config/rule/tableFormColumn.js +55 -0
  97. package/src/config/rule/tabs.js +38 -0
  98. package/src/config/rule/tag.js +69 -0
  99. package/src/config/rule/text.js +41 -0
  100. package/src/config/rule/textarea.js +63 -0
  101. package/src/config/rule/time.js +58 -0
  102. package/src/config/rule/timeRange.js +49 -0
  103. package/src/config/rule/title.js +37 -0
  104. package/src/config/rule/transfer.js +59 -0
  105. package/src/config/rule/tree.js +70 -0
  106. package/src/config/rule/treeSelect.js +77 -0
  107. package/src/config/rule/upload.js +107 -0
  108. package/src/form/index.js +19 -0
  109. package/src/index.js +173 -0
  110. package/src/locale/en.js +981 -0
  111. package/src/locale/zh-cn.js +983 -0
  112. package/src/style/fonts/fc-icons.woff +0 -0
  113. package/src/style/icon.css +1052 -0
  114. package/src/style/index.css +836 -0
  115. package/src/utils/form.js +9 -0
  116. package/src/utils/highlight/highlight.min.js +307 -0
  117. package/src/utils/highlight/javascript.min.js +80 -0
  118. package/src/utils/highlight/style.css +1 -0
  119. package/src/utils/highlight/xml.min.js +29 -0
  120. package/src/utils/hintStubs.js +120 -0
  121. package/src/utils/index.js +544 -0
  122. package/src/utils/jsonDiff.js +173 -0
  123. package/src/utils/locale.js +23 -0
  124. package/src/utils/message.js +19 -0
  125. package/src/utils/template.js +105 -0
  126. package/types/index.d.ts +575 -0
@@ -0,0 +1,69 @@
1
+ <template>
2
+ <div class="_fc-title" :class="size || 'h2'" :style="textStyle">
3
+ {{ title }}
4
+ </div>
5
+ </template>
6
+
7
+ <script>
8
+ import {defineComponent} from 'vue';
9
+
10
+ export default defineComponent({
11
+ name: 'FcTitle',
12
+ data() {
13
+ return {};
14
+ },
15
+ props: {
16
+ title: String,
17
+ size: String,
18
+ align: String,
19
+ },
20
+ computed: {
21
+ textStyle() {
22
+ return {
23
+ textAlign: this.align || 'left',
24
+ }
25
+ }
26
+ }
27
+ });
28
+ </script>
29
+ <style>
30
+ ._fc-title {
31
+ width: 100%;
32
+ font-size: 16px;
33
+ font-weight: 600;
34
+ margin-top: 1em;
35
+ margin-bottom: 16px;
36
+ }
37
+
38
+ ._fc-title.h1, ._fc-title.h2 {
39
+ padding-bottom: .3em;
40
+ border-bottom: 1px solid #eee
41
+ }
42
+
43
+ ._fc-title.h1 {
44
+ font-size: 32px;
45
+ line-height: 1.2
46
+ }
47
+
48
+ ._fc-title.h2 {
49
+ font-size: 24px;
50
+ line-height: 1.225
51
+ }
52
+
53
+ ._fc-title.h3 {
54
+ font-size: 20px;
55
+ line-height: 1.43
56
+ }
57
+
58
+ ._fc-title.h4 {
59
+ font-size: 16px;
60
+ }
61
+
62
+ ._fc-title.h5 {
63
+ font-size: 14px;
64
+ }
65
+
66
+ ._fc-title.h6 {
67
+ font-size: 12px;
68
+ }
69
+ </style>
@@ -0,0 +1,415 @@
1
+ <template>
2
+ <div class="_fd-gfc">
3
+ <el-badge type="warning" is-dot :hidden="!configured">
4
+ <el-button @click="visible=true" size="small">{{ t('struct.title') }}</el-button>
5
+ </el-badge>
6
+ <el-dialog class="_fd-gfc-dialog" v-model="visible" destroy-on-close
7
+ :close-on-click-modal="false"
8
+ append-to-body
9
+ width="1080px">
10
+ <template #header>
11
+ {{ t('fetch.optionsType.fetch') }}
12
+ <Warning :tooltip="t('warning.fetch')"></Warning>
13
+ </template>
14
+ <el-container class="_fd-gfc-con" style="height: 600px;">
15
+ <el-tabs model-value="first" class="_fc-tabs" style="width: 100%">
16
+ <el-tab-pane :label="t('fetch.config')" name="first">
17
+ <DragForm v-model:api="form.api" v-model="form.formData" :rule="form.rule"
18
+ :option="form.options">
19
+ <template #title="scope">
20
+ <template v-if="scope.rule.warning">
21
+ <Warning :tooltip="scope.rule.warning">
22
+ {{ scope.rule.title }}
23
+ </Warning>
24
+ </template>
25
+ <template v-else>
26
+ {{ scope.rule.title }}
27
+ </template>
28
+ </template>
29
+ </DragForm>
30
+ <div class="_fd-fetch-preview">
31
+ <div class="_fd-fetch-preview-header">
32
+ <span class="_fd-fetch-preview-title">{{ t('fetch.preview') }}</span>
33
+ <el-button size="small" type="primary" @click="previewData" :loading="previewLoading">
34
+ {{ t('fetch.test') }}
35
+ </el-button>
36
+ </div>
37
+ <div class="_fd-fetch-preview-content">
38
+ <div v-if="!previewResult" class="_fd-fetch-preview-empty">
39
+ {{ t('fetch.previewEmpty') }}
40
+ </div>
41
+ <div v-else class="_fd-fetch-preview-result">
42
+ <div class="_fd-fetch-preview-status">
43
+ <el-tag disable-transitions
44
+ :type="previewResult.success ? 'success' : 'danger'">
45
+ {{ previewResult.success ? t('props.success') : t('props.error') }}
46
+ </el-tag>
47
+ <span class="_fd-fetch-preview-time">{{ previewResult.time }}ms</span>
48
+ </div>
49
+ <div class="_fd-fetch-preview-data">
50
+ <pre>{{ previewResult.data }}</pre>
51
+ </div>
52
+ </div>
53
+ </div>
54
+ </div>
55
+ </el-tab-pane>
56
+ <el-tab-pane lazy :label="t('fetch.beforeFetch')" name="second">
57
+ <template #label>
58
+ {{ t('fetch.beforeFetch') }}
59
+ <Warning :tooltip="t('warning.beforeFetch')"></Warning>
60
+ </template>
61
+ <FnEditor style="height: 415px;" v-model="form.beforeFetch" name="beforeFetch"
62
+ :args="['config', 'data']"
63
+ ref="beforeFetch"></FnEditor>
64
+ </el-tab-pane>
65
+ <el-tab-pane lazy name="third">
66
+ <template #label>
67
+ {{ t('fetch.parse') }}
68
+ <Warning :tooltip="t('warning.fetchParse')"></Warning>
69
+ </template>
70
+ <FnEditor style="height: 415px;" v-model="form.parse" name="parse"
71
+ :args="[{name:'res', info: t('fetch.response')}, 'rule', 'api']"
72
+ ref="parse"></FnEditor>
73
+ </el-tab-pane>
74
+ <el-tab-pane lazy :label="t('fetch.onError')" name="fourth">
75
+ <FnEditor style="height: 415px;" v-model="form.onError" name="onError"
76
+ :args="['e']"
77
+ ref="error"></FnEditor>
78
+ </el-tab-pane>
79
+ </el-tabs>
80
+ </el-container>
81
+ <template #footer>
82
+ <div>
83
+ <el-button size="default" @click="visible=false">{{ t('props.cancel') }}</el-button>
84
+ <el-button type="primary" size="default" @click="save" color="#2f73ff">{{
85
+ t('props.ok')
86
+ }}
87
+ </el-button>
88
+ </div>
89
+ </template>
90
+ </el-dialog>
91
+ </div>
92
+ </template>
93
+
94
+ <script>
95
+ import {deepCopy} from '@form-create/utils/lib/deepextend';
96
+ import FnEditor from './FnEditor.vue';
97
+ import StructEditor from './StructEditor.vue';
98
+ import {defineComponent} from 'vue';
99
+ import {designerForm} from '../utils/form';
100
+ import errorMessage from '../utils/message';
101
+ import is from '@form-create/utils/lib/type';
102
+ import Warning from './Warning.vue';
103
+
104
+ const makeRule = (t) => {
105
+ return [
106
+ {
107
+ type: 'input',
108
+ field: 'action',
109
+ title: t('fetch.action'),
110
+ value: '',
111
+ props: {size: 'default'},
112
+ validate: [{required: true, message: t('fetch.actionRequired'), trigger: 'blur'}]
113
+ },
114
+ {
115
+ type: 'radio',
116
+ field: 'method',
117
+ title: t('fetch.method'),
118
+ value: 'GET',
119
+ props: {
120
+ size: 'default'
121
+ },
122
+ options: [
123
+ {label: 'GET', value: 'GET'},
124
+ {label: 'POST', value: 'POST'},
125
+ ],
126
+ $required: true,
127
+ },
128
+ {
129
+ type: 'radio',
130
+ field: 'dataType',
131
+ title: t('fetch.dataType'),
132
+ warning: t('warning.fetchDataType'),
133
+ value: 'json',
134
+ props: {
135
+ size: 'default'
136
+ },
137
+ options: [
138
+ {label: 'JSON', value: 'json'},
139
+ {label: 'FormData', value: 'formData'},
140
+ ],
141
+ $required: true,
142
+ },
143
+ {
144
+ type: 'TableOptions',
145
+ field: 'headers',
146
+ title: t('fetch.headers'),
147
+ value: {},
148
+ props: {
149
+ column: [{label: t('props.key'), key: 'label'}, {label: t('props.value'), key: 'value'}],
150
+ valueType: 'object',
151
+ size: 'default'
152
+ },
153
+ },
154
+ {
155
+ type: 'TableOptions',
156
+ field: 'query',
157
+ title: t('fetch.query'),
158
+ warning: t('warning.fetchQuery'),
159
+ value: {},
160
+ props: {
161
+ column: [{label: t('props.key'), key: 'label'}, {label: t('props.value'), key: 'value'}],
162
+ valueType: 'object',
163
+ size: 'default'
164
+ },
165
+ },
166
+ {
167
+ type: 'TableOptions',
168
+ field: 'data',
169
+ title: t('fetch.data'),
170
+ warning: t('warning.fetchData'),
171
+ value: {},
172
+ props: {
173
+ column: [{label: t('props.key'), key: 'label'}, {label: t('props.value'), key: 'value'}],
174
+ valueType: 'object',
175
+ size: 'default'
176
+ },
177
+ }];
178
+ }
179
+
180
+ export default defineComponent({
181
+ name: 'FetchConfig',
182
+ emits: ['update:modelValue'],
183
+ props: {
184
+ modelValue: [Object, String],
185
+ to: String,
186
+ },
187
+ components: {
188
+ Warning,
189
+ DragForm: designerForm.$form(),
190
+ FnEditor,
191
+ StructEditor
192
+ },
193
+ inject: ['designer'],
194
+ data() {
195
+ return {
196
+ visible: false,
197
+ value: deepCopy(this.modelValue || {}),
198
+ form: {
199
+ api: {},
200
+ formData: {},
201
+ rule: [],
202
+ options: {
203
+ form: {
204
+ labelWidth: '90px',
205
+ size: 'default'
206
+ },
207
+ submitBtn: false,
208
+ resetBtn: false,
209
+ }
210
+ },
211
+ previewLoading: false,
212
+ previewResult: null
213
+ };
214
+ },
215
+ computed: {
216
+ t() {
217
+ return this.designer.setupState.t;
218
+ },
219
+ configured() {
220
+ return !is.empty(this.modelValue);
221
+ },
222
+ },
223
+ watch: {
224
+ visible(v) {
225
+ if (v) {
226
+ this.value = deepCopy(this.modelValue || {});
227
+ this.active();
228
+ }
229
+ },
230
+ },
231
+ methods: {
232
+ open() {
233
+ this.visible = true;
234
+ },
235
+ active() {
236
+ const formData = this.value;
237
+ this.form.rule = formData.type === 'static' ? [] : makeRule(this.t);
238
+ this.form.formData = {...formData};
239
+ this.form.label = formData.label;
240
+ this.form.type = formData.type;
241
+ this.form.data = formData.data;
242
+ this.form.dataType = formData.dataType;
243
+ this.form.parse = formData.parse || '';
244
+ this.form.beforeFetch = formData.beforeFetch || '';
245
+ this.form.onError = formData.onError || '';
246
+ },
247
+ save() {
248
+ this.form.api.validate().then(() => {
249
+ const formData = {...this.form.formData};
250
+ if ((this.$refs.parse && !this.$refs.parse.save()) || (this.$refs.beforeFetch && !this.$refs.beforeFetch.save()) || (this.$refs.error && !this.$refs.error.save())) {
251
+ return;
252
+ }
253
+ formData.parse = designerForm.parseFn(this.form.parse);
254
+ formData.beforeFetch = designerForm.parseFn(this.form.beforeFetch);
255
+ formData.onError = this.form.onError;
256
+ formData.label = this.form.label;
257
+ formData.type = this.form.type;
258
+ formData.to = this.to || 'options';
259
+ this.$emit('update:modelValue', formData);
260
+ this.visible = false;
261
+ }).catch(err => {
262
+ console.error(err);
263
+ errorMessage(err[Object.keys(err)[0]][0].message);
264
+ });
265
+ },
266
+ previewData() {
267
+ this.form.api.validate().then(() => {
268
+ this.previewLoading = true;
269
+ this.previewResult = null;
270
+ const startTime = Date.now();
271
+ const formData = {...this.form.formData};
272
+ delete formData.beforeFetch;
273
+ delete formData.parse;
274
+ delete formData.onError;
275
+ if (this.form.beforeFetch) {
276
+ formData.beforeFetch = designerForm.parseFn(this.form.beforeFetch);
277
+ }
278
+ this.designer.setupState.dragForm.api
279
+ .fetch(formData)
280
+ .then(response => {
281
+ const endTime = Date.now();
282
+ this.previewResult = {
283
+ success: true,
284
+ time: endTime - startTime,
285
+ data: JSON.stringify(response, null, 2),
286
+ };
287
+ this.previewLoading = false;
288
+ })
289
+ .catch(() => {
290
+ const endTime = Date.now();
291
+ this.previewResult = {
292
+ success: false,
293
+ time: endTime - startTime,
294
+ data: this.t('fetch.requestFailed'),
295
+ };
296
+ this.previewLoading = false;
297
+ });
298
+ });
299
+ },
300
+ },
301
+ created() {
302
+ this.active();
303
+ }
304
+ });
305
+ </script>
306
+
307
+ <style>
308
+ ._fd-gfc, ._fd-gfc .el-badge {
309
+ width: 100%;
310
+ }
311
+
312
+ ._fd-gfc .el-button {
313
+ font-weight: 400;
314
+ width: 100%;
315
+ border-color: #2E73FF;
316
+ color: #2E73FF;
317
+ }
318
+
319
+ ._fd-gfc-dialog .el-tabs__header {
320
+ margin-bottom: 0;
321
+ }
322
+
323
+ ._fd-gfc-dialog .form-create {
324
+ margin-top: 15px;
325
+ }
326
+
327
+ ._fd-gfc-con .CodeMirror {
328
+ height: 100%;
329
+ width: 100%;
330
+ }
331
+
332
+ ._fd-gfc-con .CodeMirror-wrap pre.CodeMirror-line {
333
+ padding-left: 20px;
334
+ }
335
+
336
+ ._fd-fetch-preview {
337
+ margin-top: 20px;
338
+ margin-left: 15px;
339
+ border: 1px solid #ececec;
340
+ border-radius: 6px;
341
+ background: #ffffff;
342
+ }
343
+
344
+ ._fd-fetch-preview-header {
345
+ display: flex;
346
+ justify-content: space-between;
347
+ align-items: center;
348
+ padding: 12px 15px;
349
+ border-bottom: 1px solid #ececec;
350
+ background: #f5f5f5;
351
+ border-radius: 6px 6px 0 0;
352
+ }
353
+
354
+ ._fd-fetch-preview-title {
355
+ font-size: 14px;
356
+ font-weight: 500;
357
+ color: #262626;
358
+ }
359
+
360
+ ._fd-fetch-preview-content {
361
+ padding: 15px;
362
+ min-height: 120px;
363
+ max-height: 300px;
364
+ overflow-y: auto;
365
+ }
366
+
367
+ ._fd-fetch-preview-empty {
368
+ display: flex;
369
+ align-items: center;
370
+ justify-content: center;
371
+ height: 90px;
372
+ color: #aaaaaa;
373
+ font-size: 13px;
374
+ background: rgba(170, 170, 170, 0.05);
375
+ border-radius: 4px;
376
+ border: 1px dashed #ececec;
377
+ }
378
+
379
+ ._fd-fetch-preview-result {
380
+ display: flex;
381
+ flex-direction: column;
382
+ gap: 10px;
383
+ }
384
+
385
+ ._fd-fetch-preview-status {
386
+ display: flex;
387
+ align-items: center;
388
+ gap: 10px;
389
+ }
390
+
391
+ ._fd-fetch-preview-time {
392
+ font-size: 12px;
393
+ color: #aaaaaa;
394
+ font-family: monospace;
395
+ }
396
+
397
+ ._fd-fetch-preview-data {
398
+ background: #f5f5f5;
399
+ border: 1px solid #ececec;
400
+ border-radius: 4px;
401
+ padding: 10px;
402
+ max-height: 200px;
403
+ overflow-y: auto;
404
+ }
405
+
406
+ ._fd-fetch-preview-data pre {
407
+ margin: 0;
408
+ font-size: 12px;
409
+ line-height: 1.4;
410
+ color: #666666;
411
+ font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
412
+ white-space: pre-wrap;
413
+ word-break: break-word;
414
+ }
415
+ </style>