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
@@ -0,0 +1,217 @@
1
+ <template>
2
+ <div class="widget-form-container">
3
+ <div v-if="data.list.length == 0" class="form-empty">{{$t('fm.description.containerEmpty')}}</div>
4
+ <el-form :size="data.config.size" label-suffix=":" :label-position="data.config.labelPosition" :label-width="data.config.labelWidth + 'px'">
5
+
6
+ <draggable class=""
7
+ v-model="data.list"
8
+ v-bind="{group:'people', ghostClass: 'ghost',animation: 200, handle: '.drag-widget'}"
9
+ @end="handleMoveEnd"
10
+ @add="handleWidgetAdd"
11
+ >
12
+
13
+ <transition-group name="fade" tag="div" class="widget-form-list">
14
+ <template v-for="(element, index) in data.list">
15
+ <template v-if="element.type == 'grid'">
16
+ <el-row class="widget-col widget-view" v-if="element && element.key" :key="element.key"
17
+ type="flex"
18
+ :class="{active: selectWidget.key == element.key}"
19
+ :gutter="element.options.gutter ? element.options.gutter : 0"
20
+ :justify="element.options.justify"
21
+ :align="element.options.align"
22
+ @click.native="handleSelectWidget(index)">
23
+ <el-col v-for="(col, colIndex) in element.columns" :key="colIndex" :span="col.span ? col.span : 0">
24
+
25
+ <draggable
26
+ v-model="col.list"
27
+ :no-transition-on-drag="true"
28
+ v-bind="{group:'people', ghostClass: 'ghost',animation: 200, handle: '.drag-widget'}"
29
+ @end="handleMoveEnd"
30
+ @add="handleWidgetColAdd($event, element, colIndex)"
31
+ >
32
+ <transition-group name="fade" tag="div" class="widget-col-list">
33
+ <template v-for="(el, i) in col.list">
34
+ <widget-form-item
35
+ :key="el.key"
36
+ v-if="el.key"
37
+ :element="el"
38
+ :select.sync="selectWidget"
39
+ :index="i"
40
+ :data="col">
41
+ </widget-form-item>
42
+ </template>
43
+
44
+ </transition-group>
45
+
46
+ </draggable>
47
+ </el-col>
48
+ <div class="widget-view-action widget-col-action" v-if="selectWidget.key == element.key">
49
+
50
+ <i class="iconfont icon-trash" @click.stop="handleWidgetDelete(index)"></i>
51
+ </div>
52
+
53
+ <div class="widget-view-drag widget-col-drag" v-if="selectWidget.key == element.key">
54
+ <i class="iconfont icon-drag drag-widget"></i>
55
+ </div>
56
+ </el-row>
57
+ </template>
58
+ <template v-else>
59
+ <widget-form-item v-if="element && element.key" :key="element.key" :element="element" :select.sync="selectWidget" :index="index" :data="data"></widget-form-item>
60
+ </template>
61
+ </template>
62
+ </transition-group>
63
+ </draggable>
64
+ </el-form>
65
+ </div>
66
+ </template>
67
+
68
+ <script>
69
+ import Draggable from 'vuedraggable'
70
+ import WidgetFormItem from './WidgetFormItem'
71
+
72
+ export default {
73
+ components: {
74
+ Draggable,
75
+ WidgetFormItem
76
+ },
77
+ props: ['data', 'select'],
78
+ data () {
79
+ return {
80
+ selectWidget: this.select
81
+ }
82
+ },
83
+ mounted () {
84
+ document.body.ondrop = function (event) {
85
+ let isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1
86
+ if (isFirefox) {
87
+ event.preventDefault()
88
+ event.stopPropagation()
89
+ }
90
+ }
91
+ },
92
+ methods: {
93
+ handleMoveEnd ({newIndex, oldIndex}) {
94
+ console.log('index', newIndex, oldIndex)
95
+ },
96
+ handleSelectWidget (index) {
97
+ console.log(index, '#####')
98
+ this.selectWidget = this.data.list[index]
99
+ },
100
+ handleWidgetAdd (evt) {
101
+ console.log('add', evt)
102
+ console.log('end', evt)
103
+ const newIndex = evt.newIndex
104
+ const to = evt.to
105
+ console.log(to)
106
+
107
+ //为拖拽到容器的元素添加唯一 key
108
+ const key = Date.parse(new Date()) + '_' + Math.ceil(Math.random() * 99999)
109
+ this.$set(this.data.list, newIndex, {
110
+ ...this.data.list[newIndex],
111
+ options: {
112
+ ...this.data.list[newIndex].options,
113
+ remoteFunc: 'func_' + key
114
+ },
115
+ key,
116
+ // 绑定键值
117
+ model: this.data.list[newIndex].type + '_' + key,
118
+ rules: []
119
+ })
120
+
121
+ if (this.data.list[newIndex].type === 'radio' || this.data.list[newIndex].type === 'checkbox' || this.data.list[newIndex].type === 'select') {
122
+ this.$set(this.data.list, newIndex, {
123
+ ...this.data.list[newIndex],
124
+ options: {
125
+ ...this.data.list[newIndex].options,
126
+ options: this.data.list[newIndex].options.options.map(item => ({
127
+ ...item
128
+ }))
129
+ }
130
+ })
131
+ }
132
+
133
+ if (this.data.list[newIndex].type === 'grid') {
134
+ this.$set(this.data.list, newIndex, {
135
+ ...this.data.list[newIndex],
136
+ columns: this.data.list[newIndex].columns.map(item => ({...item}))
137
+ })
138
+ }
139
+
140
+ this.selectWidget = this.data.list[newIndex]
141
+ },
142
+ handleWidgetColAdd ($event, row, colIndex) {
143
+ console.log('coladd', $event, row, colIndex)
144
+ const newIndex = $event.newIndex
145
+ const oldIndex = $event.oldIndex
146
+ const item = $event.item
147
+
148
+ // 防止布局元素的嵌套拖拽
149
+ if (item.className.indexOf('data-grid') >= 0) {
150
+
151
+ // 如果是列表中拖拽的元素需要还原到原来位置
152
+ item.tagName === 'DIV' && this.data.list.splice(oldIndex, 0, row.columns[colIndex].list[newIndex])
153
+
154
+ row.columns[colIndex].list.splice(newIndex, 1)
155
+
156
+ return false
157
+ }
158
+
159
+ console.log('from', item)
160
+
161
+ const key = Date.parse(new Date()) + '_' + Math.ceil(Math.random() * 99999)
162
+
163
+ this.$set(row.columns[colIndex].list, newIndex, {
164
+ ...row.columns[colIndex].list[newIndex],
165
+ options: {
166
+ ...row.columns[colIndex].list[newIndex].options,
167
+ remoteFunc: 'func_' + key
168
+ },
169
+ key,
170
+ // 绑定键值
171
+ model: row.columns[colIndex].list[newIndex].type + '_' + key,
172
+ rules: []
173
+ })
174
+
175
+ if (row.columns[colIndex].list[newIndex].type === 'radio' || row.columns[colIndex].list[newIndex].type === 'checkbox' || row.columns[colIndex].list[newIndex].type === 'select') {
176
+ this.$set(row.columns[colIndex].list, newIndex, {
177
+ ...row.columns[colIndex].list[newIndex],
178
+ options: {
179
+ ...row.columns[colIndex].list[newIndex].options,
180
+ options: row.columns[colIndex].list[newIndex].options.options.map(item => ({
181
+ ...item
182
+ }))
183
+ }
184
+ })
185
+ }
186
+
187
+ this.selectWidget = row.columns[colIndex].list[newIndex]
188
+ },
189
+ handleWidgetDelete (index) {
190
+ if (this.data.list.length - 1 === index) {
191
+ if (index === 0) {
192
+ this.selectWidget = {}
193
+ } else {
194
+ this.selectWidget = this.data.list[index - 1]
195
+ }
196
+ } else {
197
+ this.selectWidget = this.data.list[index + 1]
198
+ }
199
+
200
+ this.$nextTick(() => {
201
+ this.data.list.splice(index, 1)
202
+ })
203
+ },
204
+ },
205
+ watch: {
206
+ select (val) {
207
+ this.selectWidget = val
208
+ },
209
+ selectWidget: {
210
+ handler (val) {
211
+ this.$emit('update:select', val)
212
+ },
213
+ deep: true
214
+ }
215
+ }
216
+ }
217
+ </script>
@@ -0,0 +1,284 @@
1
+ <template>
2
+ <el-form-item class="widget-view "
3
+ v-if="element && element.key"
4
+ :class="{active: selectWidget.key == element.key, 'is_req': element.options.required}"
5
+ :label="element.name"
6
+ @click.native.stop="handleSelectWidget(index)"
7
+ >
8
+ <template v-if="element.type == 'input'">
9
+ <el-input
10
+ v-model="element.options.defaultValue"
11
+ :style="{width: element.options.width}"
12
+ :placeholder="element.options.placeholder"
13
+ :disabled="element.options.disabled"
14
+ :maxlength="element.options.maxlength"
15
+ :show-word-limit="element.options.showWordLimit"
16
+ ></el-input>
17
+ </template>
18
+
19
+ <template v-if="element.type == 'textarea'">
20
+ <el-input type="textarea" :rows="5"
21
+ v-model="element.options.defaultValue"
22
+ :style="{width: element.options.width}"
23
+ :disabled="element.options.disabled"
24
+ :placeholder="element.options.placeholder"
25
+ :maxlength="element.options.maxlength"
26
+ :show-word-limit="element.options.showWordLimit"
27
+ ></el-input>
28
+ </template>
29
+
30
+ <template v-if="element.type == 'number'">
31
+ <el-input-number
32
+ v-model="element.options.defaultValue"
33
+ :disabled="element.options.disabled"
34
+ :controls-position="element.options.controlsPosition"
35
+ :style="{width: element.options.width}"
36
+ ></el-input-number>
37
+ </template>
38
+
39
+ <template v-if="element.type == 'radio'">
40
+ <el-radio-group v-model="element.options.defaultValue"
41
+ :style="{width: element.options.width}"
42
+ :disabled="element.options.disabled"
43
+ >
44
+ <el-radio
45
+ :style="{display: element.options.inline ? 'inline-block' : 'block'}"
46
+ :label="item.value" v-for="(item, index) in element.options.options" :key="item.value + index"
47
+
48
+ >
49
+ {{element.options.showLabel ? item.label : item.value}}
50
+ </el-radio>
51
+ </el-radio-group>
52
+ </template>
53
+
54
+ <template v-if="element.type == 'checkbox'">
55
+ <el-checkbox-group v-model="element.options.defaultValue"
56
+ :style="{width: element.options.width}"
57
+ :disabled="element.options.disabled"
58
+ >
59
+ <el-checkbox
60
+ :style="{display: element.options.inline ? 'inline-block' : 'block'}"
61
+ :label="item.value" v-for="(item, index) in element.options.options" :key="item.value + index"
62
+ >
63
+ {{element.options.showLabel ? item.label : item.value}}
64
+ </el-checkbox>
65
+ </el-checkbox-group>
66
+ </template>
67
+
68
+ <template v-if="element.type == 'time'">
69
+ <el-time-picker
70
+ v-model="element.options.defaultValue"
71
+ :is-range="element.options.isRange"
72
+ :placeholder="element.options.placeholder"
73
+ :start-placeholder="element.options.startPlaceholder"
74
+ :end-placeholder="element.options.endPlaceholder"
75
+ :readonly="element.options.readonly"
76
+ :disabled="element.options.disabled"
77
+ :editable="element.options.editable"
78
+ :clearable="element.options.clearable"
79
+ :arrowControl="element.options.arrowControl"
80
+ :style="{width: element.options.width}"
81
+ >
82
+ </el-time-picker>
83
+ </template>
84
+
85
+ <template v-if="element.type == 'date'">
86
+ <el-date-picker
87
+ v-model="element.options.defaultValue"
88
+ :type="element.options.type"
89
+ :is-range="element.options.isRange"
90
+ :placeholder="element.options.placeholder"
91
+ :start-placeholder="element.options.startPlaceholder"
92
+ :end-placeholder="element.options.endPlaceholder"
93
+ :readonly="element.options.readonly"
94
+ :disabled="element.options.disabled"
95
+ :editable="element.options.editable"
96
+ :clearable="element.options.clearable"
97
+ :style="{width: element.options.width}"
98
+ >
99
+ </el-date-picker>
100
+ </template>
101
+
102
+ <template v-if="element.type == 'rate'">
103
+ <el-rate v-model="element.options.defaultValue"
104
+ :max="element.options.max"
105
+ :disabled="element.options.disabled"
106
+ :allow-half="element.options.allowHalf"
107
+ ></el-rate>
108
+ </template>
109
+
110
+ <template v-if="element.type == 'color'">
111
+ <el-color-picker
112
+ v-model="element.options.defaultValue"
113
+ :disabled="element.options.disabled"
114
+ :show-alpha="element.options.showAlpha"
115
+ ></el-color-picker>
116
+ </template>
117
+
118
+ <template v-if="element.type == 'select'">
119
+ <el-select
120
+ v-model="element.options.defaultValue"
121
+ :disabled="element.options.disabled"
122
+ :multiple="element.options.multiple"
123
+ :clearable="element.options.clearable"
124
+ :placeholder="element.options.placeholder"
125
+ :style="{width: element.options.width}"
126
+ >
127
+ <el-option v-for="item in element.options.options" :key="item.value" :value="item.value" :label="element.options.showLabel?item.label:item.value"></el-option>
128
+ </el-select>
129
+ </template>
130
+
131
+ <template v-if="element.type=='switch'">
132
+ <el-switch
133
+ v-model="element.options.defaultValue"
134
+ :disabled="element.options.disabled"
135
+ >
136
+ </el-switch>
137
+ </template>
138
+
139
+ <template v-if="element.type=='slider'">
140
+ <el-slider
141
+ v-model="element.options.defaultValue"
142
+ :min="element.options.min"
143
+ :max="element.options.max"
144
+ :disabled="element.options.disabled"
145
+ :step="element.options.step"
146
+ :show-input="element.options.showInput"
147
+ :range="element.options.range"
148
+ :style="{width: element.options.width}"
149
+ ></el-slider>
150
+ </template>
151
+
152
+ <template v-if="element.type=='imgupload'">
153
+ <fm-upload
154
+ v-model="element.options.defaultValue"
155
+ :disabled="element.options.disabled"
156
+ :style="{'width': element.options.width}"
157
+ :width="element.options.size.width"
158
+ :height="element.options.size.height"
159
+ token="xxx"
160
+ domain="xxx"
161
+ >
162
+
163
+ </fm-upload>
164
+ </template>
165
+
166
+ <template v-if="element.type == 'cascader'">
167
+ <el-cascader
168
+ v-model="element.options.defaultValue"
169
+ :disabled="element.options.disabled"
170
+ :clearable="element.options.clearable"
171
+ :placeholder="element.options.placeholder"
172
+ :style="{width: element.options.width}"
173
+ :options="element.options.remoteOptions"
174
+ >
175
+
176
+ </el-cascader>
177
+ </template>
178
+
179
+ <template v-if="element.type == 'editor'">
180
+ <vue-editor
181
+ v-model="element.options.defaultValue"
182
+ :style="{width: element.options.width}"
183
+ >
184
+ </vue-editor>
185
+ </template>
186
+
187
+ <template v-if="element.type=='blank'">
188
+ <div style="height: 50px;color: #999;background: #eee;line-height:50px;text-align:center;">{{$t('fm.components.fields.blank')}}</div>
189
+ </template>
190
+
191
+ <template v-if="element.type == 'text'">
192
+ <span>{{element.options.defaultValue}}</span>
193
+ </template>
194
+
195
+ <div class="widget-view-action" v-if="selectWidget.key == element.key">
196
+ <i class="iconfont icon-icon_clone" @click.stop="handleWidgetClone(index)"></i>
197
+ <i class="iconfont icon-trash" @click.stop="handleWidgetDelete(index)"></i>
198
+ </div>
199
+
200
+ <div class="widget-view-drag" v-if="selectWidget.key == element.key">
201
+ <i class="iconfont icon-drag drag-widget"></i>
202
+ </div>
203
+
204
+ </el-form-item>
205
+ </template>
206
+
207
+ <script>
208
+ import FmUpload from './Upload'
209
+ export default {
210
+ props: ['element', 'select', 'index', 'data'],
211
+ components: {
212
+ FmUpload,
213
+ },
214
+ data () {
215
+ return {
216
+ selectWidget: this.select
217
+ }
218
+ },
219
+ mounted () {
220
+
221
+ },
222
+ methods: {
223
+ handleSelectWidget (index) {
224
+ this.selectWidget = this.data.list[index]
225
+ },
226
+ handleWidgetDelete (index) {
227
+ if (this.data.list.length - 1 === index) {
228
+ if (index === 0) {
229
+ this.selectWidget = {}
230
+ } else {
231
+ this.selectWidget = this.data.list[index - 1]
232
+ }
233
+ } else {
234
+ this.selectWidget = this.data.list[index + 1]
235
+ }
236
+
237
+ this.$nextTick(() => {
238
+ this.data.list.splice(index, 1)
239
+ })
240
+ },
241
+ handleWidgetClone (index) {
242
+ const key = Date.parse(new Date().toString()) + '_' + Math.ceil(Math.random() * 99999)
243
+ let cloneData = {
244
+ ...this.data.list[index],
245
+ options: {
246
+ ...this.data.list[index].options,
247
+ remoteFunc: 'func_' + key
248
+ },
249
+ key,
250
+ model: this.data.list[index].type + '_' + key,
251
+ rules: this.data.list[index].rules || []
252
+ }
253
+
254
+ if (this.data.list[index].type === 'radio' || this.data.list[index].type === 'checkbox' || this.data.list[index].type === 'select') {
255
+
256
+ cloneData = {
257
+ ...cloneData,
258
+ options: {
259
+ ...cloneData.options,
260
+ options: cloneData.options.options.map(item => ({...item}))
261
+ }
262
+ }
263
+ }
264
+
265
+ this.data.list.splice(index, 0, cloneData)
266
+
267
+ this.$nextTick(() => {
268
+ this.selectWidget = this.data.list[index + 1]
269
+ })
270
+ },
271
+ },
272
+ watch: {
273
+ select (val) {
274
+ this.selectWidget = val
275
+ },
276
+ selectWidget: {
277
+ handler (val) {
278
+ this.$emit('update:select', val)
279
+ },
280
+ deep: true
281
+ }
282
+ }
283
+ }
284
+ </script>