tianheng-ui 0.0.39 → 0.0.40

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 (35) hide show
  1. package/lib/iconfont.eot +0 -0
  2. package/lib/iconfont.svg +155 -0
  3. package/lib/iconfont.ttf +0 -0
  4. package/lib/iconfont.woff +0 -0
  5. package/lib/index.js +5 -2
  6. package/lib/tianheng-ui.js +34 -1
  7. package/lib/tianheng-ui.js.map +1 -1
  8. package/package.json +8 -2
  9. package/packages/formMaking/Container.vue +592 -0
  10. package/packages/formMaking/CusDialog.vue +134 -0
  11. package/packages/formMaking/FormConfig.vue +31 -0
  12. package/packages/formMaking/GenerateForm.vue +184 -0
  13. package/packages/formMaking/GenerateFormItem.vue +266 -0
  14. package/packages/formMaking/Upload/index.vue +451 -0
  15. package/packages/formMaking/WidgetConfig.vue +498 -0
  16. package/packages/formMaking/WidgetForm.vue +217 -0
  17. package/packages/formMaking/WidgetFormItem.vue +284 -0
  18. package/packages/formMaking/componentsConfig.js +313 -0
  19. package/packages/formMaking/generateCode.js +155 -0
  20. package/packages/formMaking/iconfont/demo.css +539 -0
  21. package/packages/formMaking/iconfont/demo_index.html +1159 -0
  22. package/packages/formMaking/iconfont/iconfont.css +189 -0
  23. package/packages/formMaking/iconfont/iconfont.eot +0 -0
  24. package/packages/formMaking/iconfont/iconfont.js +1 -0
  25. package/packages/formMaking/iconfont/iconfont.svg +155 -0
  26. package/packages/formMaking/iconfont/iconfont.ttf +0 -0
  27. package/packages/formMaking/iconfont/iconfont.woff +0 -0
  28. package/packages/formMaking/iconfont/iconfont.woff2 +0 -0
  29. package/packages/formMaking/index.js +79 -0
  30. package/packages/formMaking/lang/en-US.js +187 -0
  31. package/packages/formMaking/lang/zh-CN.js +187 -0
  32. package/packages/formMaking/styles/cover.scss +41 -0
  33. package/packages/formMaking/styles/index.scss +746 -0
  34. package/packages/formMaking/util/index.js +33 -0
  35. package/packages/formMaking/util/request.js +28 -0
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "tianheng-ui",
3
3
  "description": "A Vue.js project",
4
- "version": "0.0.39",
4
+ "version": "0.0.40",
5
5
  "author": "shu lang <403732931@qq.com>",
6
6
  "license": "MIT",
7
7
  "private": false,
@@ -12,10 +12,16 @@
12
12
  },
13
13
  "dependencies": {
14
14
  "ace-builds": "^1.4.13",
15
+ "axios": "^0.27.2",
16
+ "clipboard": "^2.0.11",
15
17
  "element-ui": "^2.15.6",
18
+ "normalize.css": "^8.0.1",
16
19
  "nprogress": "^0.2.0",
20
+ "viewerjs": "^1.10.5",
17
21
  "vue": "^2.5.11",
18
- "vue-router": "^3.5.3"
22
+ "vue-i18n": "^5.0.3",
23
+ "vue-router": "^3.5.3",
24
+ "vuedraggable": "^2.24.3"
19
25
  },
20
26
  "browserslist": [
21
27
  "> 1%",
@@ -0,0 +1,592 @@
1
+ <template>
2
+ <div class="fm-style">
3
+ <el-container class="fm2-container">
4
+ <el-main class="fm2-main">
5
+ <el-container>
6
+ <el-aside width="250px">
7
+ <div class="components-list">
8
+ <template v-if="basicFields.length">
9
+ <div class="widget-cate">
10
+ {{ $t("fm.components.basic.title") }}
11
+ </div>
12
+ <draggable
13
+ tag="ul"
14
+ :list="basicComponents"
15
+ v-bind="{
16
+ group: { name: 'people', pull: 'clone', put: false },
17
+ sort: false,
18
+ ghostClass: 'ghost'
19
+ }"
20
+ @end="handleMoveEnd"
21
+ @start="handleMoveStart"
22
+ :move="handleMove"
23
+ >
24
+ <template v-for="(item, index) in basicComponents">
25
+ <li
26
+ v-if="basicFields.indexOf(item.type) >= 0"
27
+ class="form-edit-widget-label"
28
+ :class="{ 'no-put': item.type == 'divider' }"
29
+ :key="index"
30
+ >
31
+ <a>
32
+ <i class="icon iconfont" :class="item.icon"></i>
33
+ <span>{{ item.name }}</span>
34
+ </a>
35
+ </li>
36
+ </template>
37
+ </draggable>
38
+ </template>
39
+ <template v-if="advanceFields.length">
40
+ <div class="widget-cate">
41
+ {{ $t("fm.components.advance.title") }}
42
+ </div>
43
+ <draggable
44
+ tag="ul"
45
+ :list="advanceComponents"
46
+ v-bind="{
47
+ group: { name: 'people', pull: 'clone', put: false },
48
+ sort: false,
49
+ ghostClass: 'ghost'
50
+ }"
51
+ @end="handleMoveEnd"
52
+ @start="handleMoveStart"
53
+ :move="handleMove"
54
+ >
55
+ <template v-for="(item, index) in advanceComponents">
56
+ <li
57
+ v-if="advanceFields.indexOf(item.type) >= 0"
58
+ class="form-edit-widget-label"
59
+ :class="{ 'no-put': item.type == 'table' }"
60
+ :key="index"
61
+ >
62
+ <a>
63
+ <i class="icon iconfont" :class="item.icon"></i>
64
+ <span>{{ item.name }}</span>
65
+ </a>
66
+ </li>
67
+ </template>
68
+ </draggable>
69
+ </template>
70
+
71
+ <template v-if="layoutFields.length">
72
+ <div class="widget-cate">
73
+ {{ $t("fm.components.layout.title") }}
74
+ </div>
75
+ <draggable
76
+ tag="ul"
77
+ :list="layoutComponents"
78
+ v-bind="{
79
+ group: { name: 'people', pull: 'clone', put: false },
80
+ sort: false,
81
+ ghostClass: 'ghost'
82
+ }"
83
+ @end="handleMoveEnd"
84
+ @start="handleMoveStart"
85
+ :move="handleMove"
86
+ >
87
+ <template v-for="(item, index) in layoutComponents">
88
+ <li
89
+ v-if="layoutFields.indexOf(item.type) >= 0"
90
+ class="form-edit-widget-label no-put"
91
+ :key="index"
92
+ >
93
+ <a>
94
+ <i class="icon iconfont" :class="item.icon"></i>
95
+ <span>{{ item.name }}</span>
96
+ </a>
97
+ </li>
98
+ </template>
99
+ </draggable>
100
+ </template>
101
+ </div>
102
+ </el-aside>
103
+ <el-container class="center-container" direction="vertical">
104
+ <el-header class="btn-bar" style="height: 45px;">
105
+ <slot name="action"> </slot>
106
+ <el-button
107
+ v-if="upload"
108
+ type="text"
109
+ size="medium"
110
+ icon="el-icon-upload2"
111
+ @click="handleUpload"
112
+ >{{ $t("fm.actions.import") }}</el-button
113
+ >
114
+ <el-button
115
+ v-if="clearable"
116
+ type="text"
117
+ size="medium"
118
+ icon="el-icon-delete"
119
+ @click="handleClear"
120
+ >{{ $t("fm.actions.clear") }}</el-button
121
+ >
122
+ <el-button
123
+ v-if="preview"
124
+ type="text"
125
+ size="medium"
126
+ icon="el-icon-view"
127
+ @click="handlePreview"
128
+ >{{ $t("fm.actions.preview") }}</el-button
129
+ >
130
+ <el-button
131
+ v-if="generateJson"
132
+ type="text"
133
+ size="medium"
134
+ icon="el-icon-tickets"
135
+ @click="handleGenerateJson"
136
+ >{{ $t("fm.actions.json") }}</el-button
137
+ >
138
+ <el-button
139
+ v-if="generateCode"
140
+ type="text"
141
+ size="medium"
142
+ icon="el-icon-document"
143
+ @click="handleGenerateCode"
144
+ >{{ $t("fm.actions.code") }}</el-button
145
+ >
146
+ </el-header>
147
+ <el-main :class="{ 'widget-empty': widgetForm.list.length == 0 }">
148
+ <widget-form
149
+ v-if="!resetJson"
150
+ ref="widgetForm"
151
+ :data="widgetForm"
152
+ :select.sync="widgetFormSelect"
153
+ ></widget-form>
154
+ </el-main>
155
+ </el-container>
156
+
157
+ <el-aside class="widget-config-container">
158
+ <el-container>
159
+ <el-header height="45px">
160
+ <div
161
+ class="config-tab"
162
+ :class="{ active: configTab == 'widget' }"
163
+ @click="handleConfigSelect('widget')"
164
+ >
165
+ {{ $t("fm.config.widget.title") }}
166
+ </div>
167
+ <div
168
+ class="config-tab"
169
+ :class="{ active: configTab == 'form' }"
170
+ @click="handleConfigSelect('form')"
171
+ >
172
+ {{ $t("fm.config.form.title") }}
173
+ </div>
174
+ </el-header>
175
+ <el-main class="config-content">
176
+ <widget-config
177
+ v-show="configTab == 'widget'"
178
+ :data="widgetFormSelect"
179
+ ></widget-config>
180
+ <form-config
181
+ v-show="configTab == 'form'"
182
+ :data="widgetForm.config"
183
+ ></form-config>
184
+ </el-main>
185
+ </el-container>
186
+ </el-aside>
187
+
188
+ <cus-dialog
189
+ :visible="previewVisible"
190
+ @on-close="previewVisible = false"
191
+ ref="widgetPreview"
192
+ width="1000px"
193
+ form
194
+ >
195
+ <generate-form
196
+ insite="true"
197
+ @on-change="handleDataChange"
198
+ v-if="previewVisible"
199
+ :data="widgetForm"
200
+ :value="widgetModels"
201
+ :remote="remoteFuncs"
202
+ ref="generateForm"
203
+ >
204
+ <template v-slot:blank="scope">
205
+ Width
206
+ <el-input
207
+ v-model="scope.model.blank.width"
208
+ style="width: 100px"
209
+ ></el-input>
210
+ Height
211
+ <el-input
212
+ v-model="scope.model.blank.height"
213
+ style="width: 100px"
214
+ ></el-input>
215
+ </template>
216
+ </generate-form>
217
+
218
+ <template slot="action">
219
+ <el-button type="primary" @click="handleTest">{{
220
+ $t("fm.actions.getData")
221
+ }}</el-button>
222
+ <el-button @click="handleReset">{{
223
+ $t("fm.actions.reset")
224
+ }}</el-button>
225
+ </template>
226
+ </cus-dialog>
227
+
228
+ <cus-dialog
229
+ :visible="uploadVisible"
230
+ @on-close="uploadVisible = false"
231
+ @on-submit="handleUploadJson"
232
+ ref="uploadJson"
233
+ width="800px"
234
+ form
235
+ >
236
+ <el-alert
237
+ type="info"
238
+ :title="$t('fm.description.uploadJsonInfo')"
239
+ ></el-alert>
240
+ <div id="uploadeditor" style="height: 400px;width: 100%;">
241
+ {{ jsonEg }}
242
+ </div>
243
+ </cus-dialog>
244
+
245
+ <cus-dialog
246
+ :visible="jsonVisible"
247
+ @on-close="jsonVisible = false"
248
+ ref="jsonPreview"
249
+ width="800px"
250
+ form
251
+ >
252
+ <div id="jsoneditor" style="height: 400px;width: 100%;">
253
+ {{ jsonTemplate }}
254
+ </div>
255
+
256
+ <template slot="action">
257
+ <el-button
258
+ type="primary"
259
+ class="json-btn"
260
+ :data-clipboard-text="jsonCopyValue"
261
+ >{{ $t("fm.actions.copyData") }}</el-button
262
+ >
263
+ </template>
264
+ </cus-dialog>
265
+
266
+ <cus-dialog
267
+ :visible="codeVisible"
268
+ @on-close="codeVisible = false"
269
+ ref="codePreview"
270
+ width="800px"
271
+ form
272
+ :action="false"
273
+ >
274
+ <!-- <div id="codeeditor" style="height: 500px; width: 100%;">{{htmlTemplate}}</div> -->
275
+ <el-tabs
276
+ type="border-card"
277
+ style="box-shadow: none;"
278
+ v-model="codeActiveName"
279
+ >
280
+ <el-tab-pane label="Vue Component" name="vue">
281
+ <div id="vuecodeeditor" style="height: 500px; width: 100%;">
282
+ {{ vueTemplate }}
283
+ </div>
284
+ </el-tab-pane>
285
+ <el-tab-pane label="HTML" name="html">
286
+ <div id="codeeditor" style="height: 500px; width: 100%;">
287
+ {{ htmlTemplate }}
288
+ </div>
289
+ </el-tab-pane>
290
+ </el-tabs>
291
+ </cus-dialog>
292
+ </el-container>
293
+ </el-main>
294
+ <!-- <el-footer height="30px" style="font-weight: 600;"
295
+ >Powered by
296
+ <a target="_blank" href="https://github.com/GavinZhuLei/vue-form-making"
297
+ >vue-form-making</a
298
+ ></el-footer
299
+ > -->
300
+ </el-container>
301
+ </div>
302
+ </template>
303
+
304
+ <script>
305
+ import Draggable from "vuedraggable";
306
+ import Clipboard from "clipboard";
307
+ import WidgetConfig from "./WidgetConfig";
308
+ import FormConfig from "./FormConfig";
309
+ import WidgetForm from "./WidgetForm";
310
+ import CusDialog from "./CusDialog";
311
+ import GenerateForm from "./GenerateForm";
312
+ import {
313
+ basicComponents,
314
+ layoutComponents,
315
+ advanceComponents
316
+ } from "./componentsConfig.js";
317
+ // import {loadJs, loadCss} from '../util/index.js'
318
+ import request from "./util/request";
319
+ import generateCode from "./generateCode.js";
320
+
321
+ export default {
322
+ name: "fm-making-form",
323
+ components: {
324
+ Draggable,
325
+ WidgetConfig,
326
+ FormConfig,
327
+ WidgetForm,
328
+ CusDialog,
329
+ GenerateForm
330
+ },
331
+ props: {
332
+ preview: {
333
+ type: Boolean,
334
+ default: false
335
+ },
336
+ generateCode: {
337
+ type: Boolean,
338
+ default: false
339
+ },
340
+ generateJson: {
341
+ type: Boolean,
342
+ default: false
343
+ },
344
+ upload: {
345
+ type: Boolean,
346
+ default: false
347
+ },
348
+ clearable: {
349
+ type: Boolean,
350
+ default: false
351
+ },
352
+ basicFields: {
353
+ type: Array,
354
+ default: () => [
355
+ "input",
356
+ "textarea",
357
+ "number",
358
+ "radio",
359
+ "checkbox",
360
+ "time",
361
+ "date",
362
+ "rate",
363
+ "color",
364
+ "select",
365
+ "switch",
366
+ "slider",
367
+ "text"
368
+ ]
369
+ },
370
+ advanceFields: {
371
+ type: Array,
372
+ default: () => ["blank", "imgupload", "editor", "cascader"]
373
+ },
374
+ layoutFields: {
375
+ type: Array,
376
+ default: () => ["grid"]
377
+ }
378
+ },
379
+ data() {
380
+ return {
381
+ basicComponents,
382
+ layoutComponents,
383
+ advanceComponents,
384
+ resetJson: false,
385
+ widgetForm: {
386
+ list: [],
387
+ config: {
388
+ labelWidth: 100,
389
+ labelPosition: "right",
390
+ size: "small"
391
+ }
392
+ },
393
+ configTab: "widget",
394
+ widgetFormSelect: null,
395
+ previewVisible: false,
396
+ jsonVisible: false,
397
+ codeVisible: false,
398
+ uploadVisible: false,
399
+ remoteFuncs: {
400
+ func_test(resolve) {
401
+ setTimeout(() => {
402
+ const options = [
403
+ { id: "1", name: "1111" },
404
+ { id: "2", name: "2222" },
405
+ { id: "3", name: "3333" }
406
+ ];
407
+
408
+ resolve(options);
409
+ }, 2000);
410
+ },
411
+ funcGetToken(resolve) {
412
+ request
413
+ .get("http://tools-server.making.link/api/uptoken")
414
+ .then(res => {
415
+ resolve(res.uptoken);
416
+ });
417
+ },
418
+ upload_callback(response, file, fileList) {
419
+ console.log("callback", response, file, fileList);
420
+ }
421
+ },
422
+ widgetModels: {},
423
+ blank: "",
424
+ htmlTemplate: "",
425
+ vueTemplate: "",
426
+ jsonTemplate: "",
427
+ uploadEditor: null,
428
+ jsonCopyValue: "",
429
+ jsonClipboard: null,
430
+ jsonEg: `{
431
+ "list": [],
432
+ "config": {
433
+ "labelWidth": 100,
434
+ "labelPosition": "top",
435
+ "size": "small"
436
+ }
437
+ }`,
438
+ codeActiveName: "vue"
439
+ };
440
+ },
441
+ mounted() {
442
+ this._loadComponents();
443
+ },
444
+ methods: {
445
+ _loadComponents() {
446
+ this.basicComponents = this.basicComponents.map(item => {
447
+ return {
448
+ ...item,
449
+ name: this.$t(`fm.components.fields.${item.type}`)
450
+ };
451
+ });
452
+ this.advanceComponents = this.advanceComponents.map(item => {
453
+ return {
454
+ ...item,
455
+ name: this.$t(`fm.components.fields.${item.type}`)
456
+ };
457
+ });
458
+ this.layoutComponents = this.layoutComponents.map(item => {
459
+ return {
460
+ ...item,
461
+ name: this.$t(`fm.components.fields.${item.type}`)
462
+ };
463
+ });
464
+ },
465
+ handleGoGithub() {
466
+ window.location.href = "https://github.com/GavinZhuLei/vue-form-making";
467
+ },
468
+ handleConfigSelect(value) {
469
+ this.configTab = value;
470
+ },
471
+ handleMoveEnd(evt) {
472
+ console.log("end", evt);
473
+ },
474
+ handleMoveStart({ oldIndex }) {
475
+ console.log("start", oldIndex, this.basicComponents);
476
+ },
477
+ handleMove() {
478
+ return true;
479
+ },
480
+ handlePreview() {
481
+ console.log(this.widgetForm);
482
+ this.previewVisible = true;
483
+ },
484
+ handleTest() {
485
+ this.$refs.generateForm
486
+ .getData()
487
+ .then(data => {
488
+ this.$alert(data, "").catch(e => {});
489
+ this.$refs.widgetPreview.end();
490
+ })
491
+ .catch(e => {
492
+ this.$refs.widgetPreview.end();
493
+ });
494
+ },
495
+ handleReset() {
496
+ this.$refs.generateForm.reset();
497
+ },
498
+ handleGenerateJson() {
499
+ this.jsonVisible = true;
500
+ this.jsonTemplate = this.widgetForm;
501
+ console.log(JSON.stringify(this.widgetForm));
502
+ this.$nextTick(() => {
503
+ const editor = ace.edit("jsoneditor");
504
+ editor.session.setMode("ace/mode/json");
505
+
506
+ if (!this.jsonClipboard) {
507
+ this.jsonClipboard = new Clipboard(".json-btn");
508
+ this.jsonClipboard.on("success", e => {
509
+ this.$message.success(this.$t("fm.message.copySuccess"));
510
+ });
511
+ }
512
+ this.jsonCopyValue = JSON.stringify(this.widgetForm);
513
+ });
514
+ },
515
+ handleGenerateCode() {
516
+ this.codeVisible = true;
517
+ this.htmlTemplate = generateCode(JSON.stringify(this.widgetForm), "html");
518
+ this.vueTemplate = generateCode(JSON.stringify(this.widgetForm), "vue");
519
+ this.$nextTick(() => {
520
+ const editor = ace.edit("codeeditor");
521
+ editor.session.setMode("ace/mode/html");
522
+
523
+ const vueeditor = ace.edit("vuecodeeditor");
524
+ vueeditor.session.setMode("ace/mode/html");
525
+ });
526
+ },
527
+ handleUpload() {
528
+ this.uploadVisible = true;
529
+ this.$nextTick(() => {
530
+ this.uploadEditor = ace.edit("uploadeditor");
531
+ this.uploadEditor.session.setMode("ace/mode/json");
532
+ });
533
+ },
534
+ handleUploadJson() {
535
+ try {
536
+ this.setJSON(JSON.parse(this.uploadEditor.getValue()));
537
+ this.uploadVisible = false;
538
+ } catch (e) {
539
+ this.$message.error(e.message);
540
+ this.$refs.uploadJson.end();
541
+ }
542
+ },
543
+ handleClear() {
544
+ this.widgetForm = {
545
+ list: [],
546
+ config: {
547
+ labelWidth: 100,
548
+ labelPosition: "right",
549
+ size: "small",
550
+ customClass: ""
551
+ }
552
+ };
553
+
554
+ this.widgetFormSelect = {};
555
+ },
556
+ clear() {
557
+ this.handleClear();
558
+ },
559
+ getJSON() {
560
+ return this.widgetForm;
561
+ },
562
+ getHtml() {
563
+ return generateCode(JSON.stringify(this.widgetForm));
564
+ },
565
+ setJSON(json) {
566
+ this.widgetForm = json;
567
+
568
+ if (json.list.length > 0) {
569
+ this.widgetFormSelect = json.list[0];
570
+ }
571
+ },
572
+ handleInput(val) {
573
+ console.log(val);
574
+ this.blank = val;
575
+ },
576
+ handleDataChange(field, value, data) {
577
+ console.log(field, value, data);
578
+ }
579
+ },
580
+ watch: {
581
+ widgetForm: {
582
+ deep: true,
583
+ handler: function(val) {
584
+ console.log(this.$refs.widgetForm);
585
+ }
586
+ },
587
+ $lang: function(val) {
588
+ this._loadComponents();
589
+ }
590
+ }
591
+ };
592
+ </script>