fl-web-component 0.1.0 → 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 (85) hide show
  1. package/README.md +35 -24
  2. package/dist/fl-web-component.common.js +27308 -65
  3. package/dist/fl-web-component.common.js.map +1 -1
  4. package/dist/fl-web-component.css +1 -1
  5. package/dist/fl-web-component.umd.js +27308 -65
  6. package/dist/fl-web-component.umd.js.map +1 -1
  7. package/dist/fl-web-component.umd.min.js +13 -1
  8. package/dist/fl-web-component.umd.min.js.map +1 -1
  9. package/package.json +80 -47
  10. package/packages/components/button/index.vue +16 -12
  11. package/packages/components/com-card/card-page.vue +102 -0
  12. package/packages/components/com-card/index.vue +53 -0
  13. package/packages/components/com-dialogWrapper/Readme.md +53 -0
  14. package/packages/components/com-dialogWrapper/index.vue +98 -0
  15. package/packages/components/com-flcanvas/components/bspline.js +91 -0
  16. package/packages/components/com-flcanvas/components/entityFormatting.js +503 -0
  17. package/packages/components/com-flcanvas/components/round10.js +24 -0
  18. package/packages/components/com-flcanvas/index.vue +259 -0
  19. package/packages/components/com-formDialog/Readme.md +409 -0
  20. package/packages/components/com-formDialog/index.vue +471 -0
  21. package/packages/components/com-graphics/index.vue +1073 -0
  22. package/packages/components/com-graphics/per-control.vue +109 -0
  23. package/packages/components/com-graphics/pid.vue +168 -0
  24. package/packages/components/com-page/index.vue +101 -0
  25. package/packages/components/com-selectTree/Readme.md +17 -0
  26. package/packages/components/com-selectTree/index.vue +236 -0
  27. package/packages/components/com-table/column-default.vue +71 -0
  28. package/packages/components/com-table/column-dynamic.vue +36 -0
  29. package/packages/components/com-table/column-menu.vue +71 -0
  30. package/packages/components/com-table/column-slot.vue +53 -0
  31. package/packages/components/com-table/column.vue +41 -0
  32. package/packages/components/com-table/config.js +21 -0
  33. package/packages/components/com-table/index.vue +281 -0
  34. package/packages/components/com-table/table-page.vue +106 -0
  35. package/packages/components/com-tabs/index.vue +50 -0
  36. package/packages/components/com-treeDynamic/Readme.md +271 -0
  37. package/packages/components/com-treeDynamic/index.vue +207 -0
  38. package/packages/components/model/api/index.js +59 -67
  39. package/packages/components/model/api/mock/detecttree.js +38 -38
  40. package/packages/components/model/api/mock/getmodel-line.js +15830 -79332
  41. package/packages/components/model/api/mock/init.js +1 -1
  42. package/packages/components/model/api/mock/pbstree.js +486 -495
  43. package/packages/components/model/components/TextOverTooltip/index.vue +3 -3
  44. package/packages/components/model/components/annotation-toolbar.vue +4 -19
  45. package/packages/components/model/components/check-proofing-model.vue +26 -29
  46. package/packages/components/model/components/clipping-type.vue +22 -14
  47. package/packages/components/model/components/com-dialogWrapper/index.vue +22 -25
  48. package/packages/components/model/components/detect-panel.vue +38 -26
  49. package/packages/components/model/components/detect-tree.vue +9 -24
  50. package/packages/components/model/components/firstPer-panel.vue +23 -25
  51. package/packages/components/model/components/header-button.vue +31 -107
  52. package/packages/components/model/components/imageViewer/index.vue +34 -35
  53. package/packages/components/model/components/import-model.vue +127 -127
  54. package/packages/components/model/components/location-panel.vue +25 -29
  55. package/packages/components/model/components/measure-type.vue +15 -15
  56. package/packages/components/model/components/pbs-tree.vue +139 -144
  57. package/packages/components/model/components/proof-config.vue +2 -10
  58. package/packages/components/model/components/proof-for-pc.vue +35 -32
  59. package/packages/components/model/components/proof-history.vue +136 -154
  60. package/packages/components/model/components/proof-panel-detail.vue +166 -165
  61. package/packages/components/model/components/proof-panel.vue +281 -205
  62. package/packages/components/model/components/proof-project-user.vue +13 -50
  63. package/packages/components/model/components/proof-publish.vue +130 -130
  64. package/packages/components/model/components/proof-role.vue +93 -124
  65. package/packages/components/model/components/props-panel.vue +63 -54
  66. package/packages/components/model/index.vue +3225 -3213
  67. package/packages/components/model/utils/annotation-tool.js +75 -82
  68. package/packages/components/model/utils/cursor.js +15 -10
  69. package/packages/components/model/utils/detect-v1.js +23 -35
  70. package/packages/components/model/utils/index.js +25 -25
  71. package/packages/components/model/utils/threejs/measure-angle.js +180 -180
  72. package/packages/components/model/utils/threejs/measure-area.js +196 -184
  73. package/packages/components/model/utils/threejs/measure-distance.js +154 -152
  74. package/packages/components/model/utils/threejs/measure-volume.js +64 -61
  75. package/patches/camera-controls+2.9.0.patch +63 -0
  76. package/src/assets/test.png +0 -0
  77. package/src/assets/worker.glb +0 -0
  78. package/src/main.js +27 -0
  79. package/src/utils/flgltf-parser.js +141 -0
  80. package/src/utils/instance-parser.js +402 -0
  81. package/src/utils/mock.js +84746 -0
  82. package/src/utils/threejs/measure-angle.js +240 -0
  83. package/src/utils/threejs/measure-area.js +249 -0
  84. package/src/utils/threejs/measure-distance.js +195 -0
  85. package/packages/index.js +0 -24
@@ -0,0 +1,471 @@
1
+ <!--
2
+ * @Author: fengyang9326@163.com
3
+ * @Date: 2024-05-13 10:36:07
4
+ * @LastEditors: fengyang9326@163.com
5
+ * @LastEditTime: 2024-05-20 09:18:31
6
+ * @FilePath: /web/framework/src/views/system/temporary/form-dialog.vue
7
+ * @Description: 表单
8
+ -->
9
+ <template>
10
+ <div v-loading="loadingForm" class="inline_false">
11
+ <el-form ref="form" :model="formInline" :label-width="labelWidth" class="form_inline_false">
12
+ <!-- 表单循环 -->
13
+ <el-form-item
14
+ v-for="(item, index) in formItemConfigArr"
15
+ :key="item.id + index"
16
+ :label="item.label"
17
+ :prop="item.prop"
18
+ :rules="item.deliveryLevel === 'ESS' ? rulesForm[item.prop] : {}"
19
+ >
20
+ <template id="formItemTemp">
21
+ <!-- 表单左侧 label 与 校验 * 号图标 -->
22
+ <span slot="label" class="label_title" :title="item.label">
23
+ <!-- <i v-if="item.deliveryLevel === 'ESS'" class="red_must">*</i> -->
24
+ <!-- <span class="item_label" :title="item.label">{{ item.label }}</span> -->
25
+ {{ item.label }}
26
+ </span>
27
+
28
+ <!-- 1. 选择器_单选 SelectorSingleSelection -->
29
+ <el-select
30
+ v-if="item.itemType === 'SelectorSingleSelection' || item.itemType === '选择器_单选'"
31
+ v-model="valueSelectorSingle"
32
+ class="form_select"
33
+ :placeholder="`请选择${item.label}`"
34
+ @focus="setMinWidth"
35
+ @change="handleSelectorSingle($event, item.prop, index)"
36
+ >
37
+ <el-option
38
+ v-for="(optionItem, optionIndex) in item.optionArr"
39
+ :key="optionItem.optionValue + optionIndex"
40
+ :label="optionItem.optionLabel"
41
+ :value="optionItem.optionValue"
42
+ :style="{ width: minWidth + 2 + 'px' }"
43
+ />
44
+ </el-select>
45
+
46
+ <!-- 2. 选择器_多选 SelectorMultipleSelection -->
47
+ <el-cascader
48
+ v-if="item.itemType === 'SelectorMultipleSelection' || item.itemType === '选择器_多选'"
49
+ ref="formCascader"
50
+ class="form_cascader"
51
+ :options="item.optionArr"
52
+ :placeholder="`请选择${item.label}`"
53
+ :props="{
54
+ checkStrictly: false,
55
+ multiple: true,
56
+ emitPath: false,
57
+ label: 'optionLabel',
58
+ value: 'optionValue',
59
+ }"
60
+ clearable
61
+ @input="handleSelectorMultiple($event, item.prop)"
62
+ />
63
+
64
+ <!-- 3. 选择器_树结构 SelectorTreeStructure -->
65
+ <SelectTree
66
+ v-if="item.itemType === 'SelectorTreeStructure' || item.itemType === '选择器_树结构'"
67
+ ref="SelectTree"
68
+ :filterable="true"
69
+ :value-key="`deptId`"
70
+ :select-key="`deptId`"
71
+ :value-name="`deptName`"
72
+ :tree-data="item.optionArr"
73
+ :tree-props="{
74
+ id: 'deptId',
75
+ label: 'deptName',
76
+ children: 'children',
77
+ }"
78
+ :tree-node-key="`deptId`"
79
+ :placeholder-title="`请选择${item.label}`"
80
+ @nodeClickTree="nodeClickTree"
81
+ />
82
+
83
+ <!-- 4. 选择器_单时间 SelectorSingleTime -->
84
+ <el-date-picker
85
+ v-if="item.itemType === 'SelectorSingleTime' || item.itemType === '选择器_单时间'"
86
+ v-model="formInline[item.prop]"
87
+ type="datetime"
88
+ class="form_dataTime"
89
+ format="yyyy-MM-dd HH:mm:ss"
90
+ value-format="yyyy-MM-dd HH:mm:ss"
91
+ :placeholder="`请选择${item.label}日期时间`"
92
+ @input="handleInputValue($event, item.prop)"
93
+ />
94
+
95
+ <!-- 5. 选择器_单日期 SelectorSingleDate -->
96
+ <el-date-picker
97
+ v-if="item.itemType === 'SelectorSingleDate' || item.itemType === '选择器_单日期'"
98
+ v-model="formInline[item.prop]"
99
+ type="date"
100
+ class="form_picker"
101
+ :placeholder="`请选择${item.label}日期`"
102
+ format="yyyy-MM-dd"
103
+ value-format="yyyy-MM-dd"
104
+ @input="handleInputValue($event, item.prop)"
105
+ />
106
+
107
+ <!-- 6. 选择器_日期范围 SelectorDateRange -->
108
+ <el-date-picker
109
+ v-if="item.itemType === 'SelectorDateRange' || item.itemType === '选择器_日期范围'"
110
+ v-model="formInline[item.prop]"
111
+ type="daterange"
112
+ class="form_daterange"
113
+ format="yyyy-MM-dd"
114
+ value-format="yyyy-MM-dd"
115
+ start-placeholder="开始日期"
116
+ end-placeholder="结束日期"
117
+ @input="handleSelectorDateRange($event, item.prop)"
118
+ />
119
+
120
+ <!-- 7. 多行文本 MultilineText -->
121
+ <el-input
122
+ v-if="item.itemType === 'MultilineText' || item.itemType === '多行文本'"
123
+ v-model="formInline[item.prop]"
124
+ type="textarea"
125
+ class="form_multiline"
126
+ :autosize="{ minRows: 2, maxRows: 4 }"
127
+ placeholder="请输入内容"
128
+ @input="handleInputValue($event, item.prop)"
129
+ />
130
+
131
+ <!-- 8. 单选框 RadioBox -->
132
+ <el-radio-group
133
+ v-if="item.itemType === 'RadioBox' || item.itemType === '单选框'"
134
+ v-model="formInline[item.prop]"
135
+ class="form_radio"
136
+ @input="handleInputValue($event, item.prop)"
137
+ >
138
+ <el-radio
139
+ v-for="(optionItem, optionIndex) in item.optionArr"
140
+ :key="optionItem.optionValue + optionIndex"
141
+ :label="optionItem"
142
+ >{{ optionItem.optionLabel }}</el-radio
143
+ >
144
+ </el-radio-group>
145
+
146
+ <!-- 9. 多选框 MultipleCheckbox -->
147
+ <el-checkbox-group
148
+ v-if="item.itemType === 'MultipleCheckbox' || item.itemType === '多选框'"
149
+ v-model="formInline[item.prop]"
150
+ class="form_checkbox"
151
+ @input="handleInputValue($event, item.prop)"
152
+ >
153
+ <el-checkbox
154
+ v-for="(optionItem, optionIndex) in item.optionArr"
155
+ :key="optionItem.optionValue + optionIndex"
156
+ :label="optionItem"
157
+ >{{ optionItem.optionLabel }}</el-checkbox
158
+ >
159
+ </el-checkbox-group>
160
+
161
+ <!-- 10. 输入框 InputString InputInteger InputDecimals -->
162
+ <el-input
163
+ v-if="item.itemType === 'InputString' || item.itemType === '字符型'"
164
+ v-model="formInline[item.prop]"
165
+ class="form_input"
166
+ :placeholder="`请选择${item.label}`"
167
+ @input="handleInputValue($event, item.prop)"
168
+ />
169
+ <el-input
170
+ v-if="item.itemType === 'InputDecimals' || item.itemType === '小数型'"
171
+ v-model="formInline[item.prop]"
172
+ class="form_input"
173
+ :placeholder="`请选择${item.label}`"
174
+ oninput="value=value.replace(/[^\d^\.]+/g, '').replace(/^0+(\d)/, '$1').replace(/^\./, '0.').match(/^\d*(\.?\d{0,3})/g)[0]"
175
+ @input="handleInputValue($event, item.prop)"
176
+ />
177
+ <el-input
178
+ v-if="item.itemType === 'InputInteger' || item.itemType === '整数型'"
179
+ v-model="formInline[item.prop]"
180
+ class="form_input"
181
+ :placeholder="`请选择${item.label}`"
182
+ oninput="value=value.replace(/[^\d]/g,'')"
183
+ @input="handleInputValue($event, item.prop)"
184
+ />
185
+
186
+ <!-- 11. 计数器 CounterFrame -->
187
+ <el-input-number
188
+ v-if="item.itemType === 'CounterFrame' || item.itemType === '计数器'"
189
+ v-model="formInline[item.prop]"
190
+ :min="0"
191
+ :max="10000"
192
+ class="form_number"
193
+ label="描述文字"
194
+ @input="handleInputValue($event, item.prop)"
195
+ />
196
+
197
+ <!-- 12. 文件上传 FileUpload -->
198
+
199
+ <!-- 13. 富文本 RichText -->
200
+
201
+ <!-- 备用校验方法 -->
202
+ <!-- <div class="input_error" v-if="item.isRulesType"> <span class="input_error_label" :title="item.label">{{item.label}}</span>不能为空 </div> -->
203
+ </template>
204
+ </el-form-item>
205
+ </el-form>
206
+ </div>
207
+ </template>
208
+
209
+ <script>
210
+ export default {
211
+ name: 'FormDialog',
212
+ components: {
213
+ SelectTree: () =>
214
+ import('./components/SelectTree') /* 3. 选择器_树结构 SelectorTreeStructure */,
215
+ },
216
+ props: {
217
+ /* el-form-item表单循环项 */
218
+ formItemConfigArr: {
219
+ type: Array,
220
+ default: () => [],
221
+ },
222
+ /* 表单label宽度 */
223
+ labelWidth: {
224
+ type: String,
225
+ default: '120px',
226
+ },
227
+ },
228
+ data() {
229
+ return {
230
+ /* 表单加载状态 */
231
+ loadingForm: false,
232
+ /* 表单model绑定对象 */
233
+ formInline: {},
234
+ /* 下拉框最小宽度样式 */
235
+ minWidth: undefined,
236
+ /* 1. 选择器_单选 SelectorSingleSelection 绑定的值 */
237
+ valueSelectorSingle: '',
238
+ /* 表单校验 */
239
+ rulesForm: {},
240
+ };
241
+ },
242
+ computed: {},
243
+ watch: {},
244
+ created() {
245
+ this.initialization();
246
+ },
247
+ mounted() {},
248
+ methods: {
249
+ /* 初始化数据 */
250
+ initialization() {
251
+ for (let i = 1; i < this.formItemConfigArr.length; i++) {
252
+ const item = this.formItemConfigArr[i];
253
+ this.rulesForm[item.prop] = {
254
+ required: true,
255
+ validator: this.validateRules(),
256
+ trigger: 'blur',
257
+ };
258
+ switch (item.itemType) {
259
+ /* 1. 选择器_单选 SelectorSingleSelection */
260
+ case 'SelectorSingleSelection':
261
+ this.formInline[item.prop] = {};
262
+ break;
263
+
264
+ /* 2. 选择器_多选 SelectorMultipleSelection */
265
+ case 'SelectorMultipleSelection':
266
+ this.formInline[item.prop] = [];
267
+ break;
268
+
269
+ /* 3. 选择器_树结构 SelectorTreeStructure */
270
+ case 'SelectorTreeStructure':
271
+ this.formInline[item.prop] = {};
272
+ break;
273
+
274
+ /* 8. 单选框 RadioBox */
275
+ case 'RadioBox':
276
+ this.formInline[item.prop] = {};
277
+ break;
278
+
279
+ /* 9. 多选框 MultipleCheckbox */
280
+ case 'MultipleCheckbox':
281
+ this.formInline[item.prop] = [];
282
+ break;
283
+
284
+ /* 11. 计数器 CounterFrame */
285
+ case 'CounterFrame':
286
+ this.formInline[item.prop] = 0;
287
+ break;
288
+
289
+ /**
290
+ * 4. 选择器_单时间 SelectorSingleTime
291
+ * 5. 选择器_单日期 SelectorSingleDate
292
+ * 6. 选择器_日期范围 SelectorDateRange
293
+ * 7. 多行文本 MultilineText
294
+ * 10. 输入框 InputString InputInteger InputDecimals
295
+ * 12. 文件上传 FileUpload
296
+ * 13. 富文本 RichText
297
+ **/
298
+ default:
299
+ this.formInline[item.prop] = '';
300
+ }
301
+ }
302
+ },
303
+ /* 下拉框样式 无数据的情况下,给请选择提示设置最小宽度*/
304
+ setMinWidth(val) {
305
+ this.minWidth = val.srcElement.clientWidth;
306
+ },
307
+ validateRules(value, prop) {
308
+ console.log('validateRules', value, prop);
309
+ if (!value) {
310
+ return `${prop}不能为空`;
311
+ } else if (this.isNameType(value)) {
312
+ return `${prop}只包含中文、英文、空格、数字、中划线、下划线`;
313
+ }
314
+ },
315
+ /**
316
+ * 只包含英文、数字、空格、中划线、下划线
317
+ * true 符合 false 不符合
318
+ **/
319
+ isCodeType(str, prop) {
320
+ if (str.length === 0) {
321
+ return `${prop}不能为空`;
322
+ }
323
+ const reg =
324
+ /[`~!@#$%^&*()+=<>?:"{}|,.;'·~!@#¥%……&*()——+={}|《》?:“”【】、;‘',。、]/im;
325
+ const regOne = /^[^\u4e00-\u9fa5]+$/;
326
+ const regTwo = /\\/;
327
+ if (!reg.test(str) && regOne.test(str) && !regTwo.test(str)) {
328
+ return `${prop}只包含中文、英文、空格、数字、中划线、下划线`;
329
+ }
330
+ return true;
331
+ },
332
+ /**
333
+ * 可输入英文、中文、空格、数字、中划线、下划线,特殊字符可以排除
334
+ * true 符合 false 不符合
335
+ **/
336
+ isNameType(str, prop) {
337
+ if (str.length === 0) {
338
+ return `${prop}不能为空`;
339
+ }
340
+ const reg =
341
+ /[`~!@#$%^&*()+=<>?:"{}|,.;'·~!@#¥%……&*()——+={}|《》?:“”【】、;‘',。、]/im;
342
+ const regTwo = /\\/;
343
+ if (!reg.test(str) && !regTwo.test(str)) {
344
+ return `${prop}只包含英文、数字、空格、中划线、下划线`;
345
+ }
346
+ return true;
347
+ },
348
+
349
+ /* 1. 选择器_单选 SelectorSingleSelection */
350
+ handleSelectorSingle(e, prop, index) {
351
+ this.formInline[prop] = {};
352
+ const arr = this.formItemConfigArr[index].optionArr;
353
+ const objIndex = arr.find((item) => {
354
+ if (item.optionValue === e) return item;
355
+ });
356
+ this.handleInputValue(objIndex, prop);
357
+ },
358
+ /* 2. 选择器_多选 SelectorMultipleSelection */
359
+ handleSelectorMultiple(e, prop) {
360
+ this.formInline[prop] = [];
361
+ const nodesObj = this.$refs['formCascader'][0].getCheckedNodes();
362
+ const selectorMultipleSelectionArr = [];
363
+ nodesObj.forEach((item) => {
364
+ selectorMultipleSelectionArr.push(item.data);
365
+ });
366
+ this.handleInputValue(selectorMultipleSelectionArr, prop);
367
+ },
368
+
369
+ /* 3. 选择器_树结构 SelectorTreeStructure */
370
+ nodeClickTree(data) {
371
+ this.handleInputValue(data, 'SelectorTreeStructure');
372
+ },
373
+
374
+ /* 6. 选择器_日期范围 SelectorDateRange */
375
+ handleSelectorDateRange(e, prop) {
376
+ this.formInline[prop] = [];
377
+ this.handleInputValue(e, prop);
378
+ },
379
+
380
+ /* 12. 文件上传 FileUpload */
381
+ /* 13. 富文本 RichText */
382
+
383
+ /**
384
+ * 4. 选择器_单时间 SelectorSingleTime
385
+ * 5. 选择器_单日期 SelectorSingleDate
386
+ * 7. 多行文本 MultilineText
387
+ * 8. 单选框 RadioBox
388
+ * 9. 多选框 MultipleCheckbox
389
+ * 10. 输入框 InputString InputInteger InputDecimals
390
+ * 11. 计数器 CounterFrame
391
+ **/
392
+ handleInputValue(e, prop) {
393
+ this.formInline[prop] = e;
394
+ this.$forceUpdate();
395
+ const data = { data: e, prop: prop };
396
+ this.$emit('handleInputValue', data);
397
+ },
398
+ },
399
+ };
400
+ </script>
401
+ <style lang="scss" scoped>
402
+ // 1. 选择器_单选 form_select
403
+ .form_select {
404
+ width: 100%;
405
+ }
406
+
407
+ // 2. 选择器_多选 form_cascader
408
+ .form_cascader {
409
+ width: 100%;
410
+ }
411
+
412
+ // 3. 选择器_树结构 SelectorTreeStructure
413
+
414
+ // 4. 选择器_单时间 form_dataTime
415
+ .form_dataTime {
416
+ width: 100%;
417
+ }
418
+
419
+ // 5. 选择器_单日期 form_picker
420
+ .form_picker {
421
+ width: 100%;
422
+ }
423
+
424
+ // 6. 选择器_日期范围 form_daterange
425
+ .form_daterange {
426
+ width: 100%;
427
+ }
428
+
429
+ // 7. 多行文本 form_multiline
430
+ .form_multiline {
431
+ width: 100%;
432
+ }
433
+
434
+ // 8. 单选框 form_radio
435
+ .form_radio {
436
+ width: 100%;
437
+ }
438
+
439
+ // 9. 多选框 form_checkbox
440
+ .form_checkbox {
441
+ width: 100%;
442
+ }
443
+
444
+ // 10. 输入框 form_input
445
+ .form_input {
446
+ width: 100%;
447
+ }
448
+
449
+ // 11. 计数器 form_number
450
+ .form_number {
451
+ width: 100%;
452
+ }
453
+
454
+ // 12. 文件上传 FileUpload
455
+ // 13. 富文本 RichText
456
+
457
+ /* 表单 label 宽度样式 */
458
+ .label_title {
459
+ display: inline-block;
460
+ max-width: calc(100% - 10px);
461
+ box-sizing: border-box;
462
+ // padding-right: 10px;
463
+ /*让长段文本不换行*/
464
+ white-space: nowrap;
465
+ /*设置文本超出元素宽度部分隐藏*/
466
+ overflow-x: hidden;
467
+ /*设置文本超出部分用省略号显示*/
468
+ text-overflow: ellipsis;
469
+ vertical-align: middle;
470
+ }
471
+ </style>