cloud-web-corejs 1.0.54-dev.780 → 1.0.54-dev.782

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 (34) hide show
  1. package/package.json +1 -1
  2. package/src/components/VabUpload/index.vue +242 -239
  3. package/src/components/VabUpload/mixins.js +1971 -1888
  4. package/src/components/obsUpload/index.vue +234 -231
  5. package/src/components/obsUpload/mixins.js +1542 -1476
  6. package/src/components/vb-tabs/x-tabs.vue +7 -3
  7. package/src/components/xform/docs//346/240/221/350/241/250rowField/346/224/266/346/225/233-/350/220/275/345/234/260/346/226/207/346/241/243.md +1427 -0
  8. package/src/components/xform/form-designer/form-widget/dialog/formDialog.vue +2 -2
  9. package/src/components/xform/form-designer/form-widget/dialog/formDrawer.vue +2 -2
  10. package/src/components/xform/form-designer/form-widget/dialog/searchFormDialog.vue +2 -2
  11. package/src/components/xform/form-designer/form-widget/field-widget/baseAttachment-widget.vue +1 -0
  12. package/src/components/xform/form-designer/form-widget/field-widget/copy_button-widget.vue +11 -2
  13. package/src/components/xform/form-designer/form-widget/field-widget/vabUpload-widget.vue +369 -368
  14. package/src/components/xform/form-designer/setting-panel/property-editor/field-baseAttachment/baseAttachment-fileTypes-editor.vue +23 -0
  15. package/src/components/xform/form-designer/setting-panel/property-editor/field-vabUpload/vabUpload-fileTypes-editor.vue +23 -0
  16. package/src/components/xform/form-designer/setting-panel/property-editor/fileTypesEditorMixin.js +116 -0
  17. package/src/components/xform/form-designer/setting-panel/property-editor/fileTypesSelect.vue +176 -0
  18. package/src/components/xform/form-designer/widget-panel/widgetsConfig.js +7 -3
  19. package/src/components/xform/form-render/container-item/data-table-item.vue +1 -1
  20. package/src/components/xform/form-render/container-item/data-table-mixin.js +1469 -428
  21. package/src/components/xform/form-render/indexMixin.js +379 -240
  22. package/src/components/xform/lang/en-US.js +13 -0
  23. package/src/components/xform/lang/zh-CN.js +13 -0
  24. package/src/components/xform/mixins/defaultHandle.js +234 -28
  25. package/src/components/xform/mixins/scriptHttp.js +4 -4
  26. package/src/components/xform/utils/treeTableUtil.js +1265 -0
  27. package/src/components/xform/utils/util.js +29 -14
  28. package/src/microRouter/index.js +3 -0
  29. package/src/mixins/tableTree/index.js +77 -14
  30. package/src/utils/menuAdapter.js +277 -277
  31. package/src/utils/resolveViewComponent.js +203 -198
  32. package/src/utils/vab.js +6 -3
  33. package/src/views/user/form/vform/render.vue +17 -2
  34. package/src/views/user/form/view/list.vue +11 -10
@@ -0,0 +1,23 @@
1
+ <template>
2
+ <file-types-select :option-model="optionModel"></file-types-select>
3
+ </template>
4
+
5
+ <script>
6
+ import FileTypesSelect from "../fileTypesSelect.vue"
7
+
8
+ export default {
9
+ name: "baseAttachment-fileTypes-editor",
10
+ components: {
11
+ FileTypesSelect,
12
+ },
13
+ props: {
14
+ designer: Object,
15
+ selectedWidget: Object,
16
+ optionModel: Object,
17
+ },
18
+ }
19
+ </script>
20
+
21
+ <style scoped>
22
+
23
+ </style>
@@ -0,0 +1,23 @@
1
+ <template>
2
+ <file-types-select :option-model="optionModel"></file-types-select>
3
+ </template>
4
+
5
+ <script>
6
+ import FileTypesSelect from "../fileTypesSelect.vue"
7
+
8
+ export default {
9
+ name: "vabUpload-fileTypes-editor",
10
+ components: {
11
+ FileTypesSelect,
12
+ },
13
+ props: {
14
+ designer: Object,
15
+ selectedWidget: Object,
16
+ optionModel: Object,
17
+ },
18
+ }
19
+ </script>
20
+
21
+ <style scoped>
22
+
23
+ </style>
@@ -0,0 +1,116 @@
1
+ /**
2
+ * 上传格式属性编辑器的共用逻辑。
3
+ *
4
+ * 存储格式仍是扁平的后缀数组(如 ['jpg','png','mp4']),分类只是勾选时的快捷方式:
5
+ * 勾"图片"等于把该分类下的后缀一次性并入,取消勾选则整组移除。这样运行期的格式
6
+ * 校验与 accept 生成都不必感知分类,已保存的老表单里的后缀数组也能原样沿用。
7
+ */
8
+
9
+ /* 每个分类内的后缀顺序即下拉分组里的展示顺序 */
10
+ export const FILE_TYPE_CATEGORIES = [
11
+ {
12
+ value: "image",
13
+ labelKey: "designer.setting.fileTypeCategory.image",
14
+ types: ["jpg", "jpeg", "png", "gif", "bmp", "webp", "svg"],
15
+ },
16
+ {
17
+ value: "video",
18
+ labelKey: "designer.setting.fileTypeCategory.video",
19
+ types: ["mp4", "avi", "mov", "wmv", "flv", "mkv", "rmvb"],
20
+ },
21
+ {
22
+ value: "audio",
23
+ labelKey: "designer.setting.fileTypeCategory.audio",
24
+ types: ["mp3", "wav", "wma", "aac", "flac"],
25
+ },
26
+ {
27
+ value: "word",
28
+ labelKey: "designer.setting.fileTypeCategory.word",
29
+ types: ["doc", "docx"],
30
+ },
31
+ {
32
+ value: "excel",
33
+ labelKey: "designer.setting.fileTypeCategory.excel",
34
+ types: ["xls", "xlsx", "csv"],
35
+ },
36
+ {
37
+ value: "ppt",
38
+ labelKey: "designer.setting.fileTypeCategory.ppt",
39
+ types: ["ppt", "pptx"],
40
+ },
41
+ {
42
+ value: "pdf",
43
+ labelKey: "designer.setting.fileTypeCategory.pdf",
44
+ types: ["pdf"],
45
+ },
46
+ {
47
+ value: "text",
48
+ labelKey: "designer.setting.fileTypeCategory.text",
49
+ types: ["txt"],
50
+ },
51
+ {
52
+ value: "archive",
53
+ labelKey: "designer.setting.fileTypeCategory.archive",
54
+ types: ["zip", "rar", "7z", "tar", "gz"],
55
+ },
56
+ ];
57
+
58
+ export default {
59
+ computed: {
60
+ fileTypeCategories() {
61
+ return FILE_TYPE_CATEGORIES.map((category) => {
62
+ return {
63
+ ...category,
64
+ label: this.i18nt(category.labelKey),
65
+ };
66
+ });
67
+ },
68
+ selectedFileTypes: {
69
+ get() {
70
+ return this.optionModel.fileTypes || [];
71
+ },
72
+ set(value) {
73
+ /* 老表单可能没有 fileTypes 键,用 $set 保证可响应 */
74
+ this.$set(this.optionModel, "fileTypes", this.normalizeFileTypes(value));
75
+ },
76
+ },
77
+ },
78
+ methods: {
79
+ /* 允许手工输入,统一成小写、去点号、去重的后缀 */
80
+ normalizeFileTypes(value) {
81
+ let result = [];
82
+ (value || []).forEach((item) => {
83
+ let fileType = String(item).trim().replace(/^\./, "").toLowerCase();
84
+ if (!!fileType && result.indexOf(fileType) < 0) {
85
+ result.push(fileType);
86
+ }
87
+ });
88
+ return result;
89
+ },
90
+ isCategoryChecked(category) {
91
+ let selected = this.selectedFileTypes;
92
+ return category.types.every((fileType) => {
93
+ return selected.indexOf(fileType) > -1;
94
+ });
95
+ },
96
+ isCategoryIndeterminate(category) {
97
+ if (this.isCategoryChecked(category)) {
98
+ return false;
99
+ }
100
+ let selected = this.selectedFileTypes;
101
+ return category.types.some((fileType) => {
102
+ return selected.indexOf(fileType) > -1;
103
+ });
104
+ },
105
+ toggleCategory(category, checked) {
106
+ let selected = this.selectedFileTypes;
107
+ if (checked) {
108
+ this.selectedFileTypes = [...selected, ...category.types];
109
+ } else {
110
+ this.selectedFileTypes = selected.filter((fileType) => {
111
+ return category.types.indexOf(fileType) < 0;
112
+ });
113
+ }
114
+ },
115
+ },
116
+ };
@@ -0,0 +1,176 @@
1
+ <template>
2
+ <!-- 分类勾选行放不进 120px 标签剩下的宽度里,故整块用 label-width="0" 占满属性面板 -->
3
+ <el-form-item class="file-types-item" label-width="0">
4
+ <div class="file-types-title">{{i18nt('designer.setting.fileTypes')}}
5
+ <el-tooltip effect="light" :content="i18nt('designer.setting.fileTypesCategoryHelp')">
6
+ <i class="el-icon-info"></i></el-tooltip>
7
+ </div>
8
+ <div class="file-types-category">
9
+ <el-checkbox v-for="category in fileTypeCategories"
10
+ :key="category.value"
11
+ :value="isCategoryChecked(category)"
12
+ :indeterminate="isCategoryIndeterminate(category)"
13
+ @change="toggleCategory(category, $event)">{{ category.label }}</el-checkbox>
14
+ </div>
15
+ <div class="file-types-select">
16
+ <el-select ref="fileTypesSelect" multiple allow-create filterable default-first-option clearable
17
+ popper-class="file-types-select-dropdown"
18
+ :placeholder="i18nt('designer.setting.fileTypesPlaceholder')"
19
+ v-model="selectedFileTypes" style="width: 100%">
20
+ <el-option-group v-for="category in fileTypeCategories"
21
+ :key="category.value"
22
+ :label="category.label">
23
+ <el-option v-for="fileType in category.types"
24
+ :key="fileType"
25
+ :label="fileType"
26
+ :value="fileType">
27
+ </el-option>
28
+ </el-option-group>
29
+ </el-select>
30
+ </div>
31
+ </el-form-item>
32
+ </template>
33
+
34
+ <script>
35
+ import i18n from "../../../../../components/xform/utils/i18n"
36
+ import fileTypesEditorMixin from "./fileTypesEditorMixin"
37
+
38
+ export default {
39
+ name: "file-types-select",
40
+ mixins: [i18n, fileTypesEditorMixin],
41
+ props: {
42
+ optionModel: Object,
43
+ },
44
+ mounted() {
45
+ this.syncSelectLayout()
46
+ },
47
+ watch: {
48
+ selectedFileTypes() {
49
+ this.syncSelectLayout()
50
+ },
51
+ },
52
+ methods: {
53
+ /*
54
+ * 两处都是 element 用 JS 量出来再写成内联样式的尺寸,在这里都不成立:
55
+ * 1. 标签区的 max-width 按挂载那一刻的控件宽度算,而本编辑器挂载在还没完成
56
+ * 布局的属性弹窗里,量到的值偏小;
57
+ * 2. 输入框高度由 resetInputHeight() 写成内联样式,但全局样式表里
58
+ * body .el-input .el-input__inner 把 height 写死成 28px !important,
59
+ * 内联样式压不过它,标签一换行就溢出到框外,展开的下拉面板还会盖住溢出部分。
60
+ * 所以这里等布局稳定后让宽度重算,并用同等优先级把高度补回去。
61
+ */
62
+ syncSelectLayout() {
63
+ this.$nextTick(() => {
64
+ let select = this.$refs.fileTypesSelect
65
+ if (!select || !select.$refs.reference) {
66
+ return
67
+ }
68
+ if (!!select.resetInputWidth) {
69
+ select.resetInputWidth()
70
+ }
71
+ let input = select.$refs.reference.$el.querySelector("input.el-input__inner")
72
+ let tags = select.$refs.tags
73
+ if (!input || !tags) {
74
+ return
75
+ }
76
+ let minHeight = select.initialInputHeight || input.offsetHeight
77
+ let tagsHeight = Math.round(tags.getBoundingClientRect().height)
78
+ let height = Math.max(tagsHeight > minHeight ? tagsHeight + 6 : tagsHeight, minHeight)
79
+ input.style.setProperty("height", height + "px", "important")
80
+ /* 高度变了要让下拉面板重新定位,否则还是按旧高度贴在原处 */
81
+ if (!!select.broadcast) {
82
+ select.broadcast("ElSelectDropdown", "updatePopper")
83
+ }
84
+ })
85
+ },
86
+ },
87
+ }
88
+ </script>
89
+
90
+ <style scoped>
91
+ .file-types-title {
92
+ color: #606266;
93
+ line-height: 22px;
94
+ }
95
+
96
+ .file-types-category {
97
+ margin-bottom: 4px;
98
+ line-height: 22px;
99
+ }
100
+
101
+ /* 独立的 el-checkbox 默认没有间距,且标签会跟着换行错位 */
102
+ .file-types-category .el-checkbox {
103
+ margin-right: 10px;
104
+ }
105
+
106
+ /*
107
+ * 全局样式表 src/resources/css/style.scss 在 body 作用域下写了
108
+ * .el-input{width:148px !important},画边框的 .el-input__inner 也跟着只有 148px,
109
+ * 所以这里必须从内容区一路 !important 压到最内层的 input 才能铺满。
110
+ */
111
+ .file-types-item ::v-deep .el-form-item__content {
112
+ display: block !important;
113
+ width: auto !important;
114
+ margin-left: 0 !important;
115
+ float: none;
116
+ }
117
+
118
+ .file-types-select {
119
+ display: block;
120
+ width: auto;
121
+ }
122
+
123
+ .file-types-select ::v-deep .el-select {
124
+ display: block !important;
125
+ width: 100% !important;
126
+ }
127
+
128
+ .file-types-select ::v-deep .el-select .el-input,
129
+ .file-types-select ::v-deep .el-select .el-input__inner {
130
+ width: 100% !important;
131
+ }
132
+
133
+ /*
134
+ * 标签区是绝对定位盖在输入框上的兄弟节点:
135
+ * max-width 是挂载时按控件宽度算出的内联值,弹窗里量到的偏小,用 !important 盖掉,
136
+ * 并和 element 一样留出右侧 32px 的图标位;
137
+ * pointer-events 置空则是因为清空按钮的显隐挂在 el-input 的 mouseenter/mouseleave 上,
138
+ * 标签层盖住的地方 hover 都算不到 el-input 头上,按钮就只在图标区才出现。
139
+ */
140
+ .file-types-select ::v-deep .el-select__tags {
141
+ max-width: calc(100% - 32px) !important;
142
+ pointer-events: none;
143
+ }
144
+
145
+ /* 标签上的删除按钮和手工输入框仍要能点 */
146
+ .file-types-select ::v-deep .el-select__tags .el-tag__close,
147
+ .file-types-select ::v-deep .el-select__input {
148
+ pointer-events: auto;
149
+ }
150
+
151
+ /* 手工输入用的内联 input 同样带着按旧宽度算出的内联 max-width,同样留出图标区 */
152
+ .file-types-select ::v-deep .el-select__input {
153
+ max-width: calc(100% - 42px) !important;
154
+ }
155
+
156
+ /*
157
+ * 全局样式表有 :focus-visible{outline:2px solid 主题色},展开下拉时焦点落在这个
158
+ * 内联输入框上,Chrome 对文本框恒判定 focus-visible,于是框里又套出一圈蓝边。
159
+ * 外层输入框自己已有聚焦态边框,这圈去掉。
160
+ */
161
+ .file-types-select ::v-deep .el-select__input:focus,
162
+ .file-types-select ::v-deep .el-select__input:focus-visible {
163
+ outline: none;
164
+ }
165
+ </style>
166
+
167
+ <style>
168
+ /*
169
+ * 下拉面板是挂到 body 上的,scoped 样式够不到,只能靠 popper-class 做全局约束。
170
+ * 全局样式表把 .el-select-dropdown__wrap 的 max-height 放大到了 474px,
171
+ * 而这里有 9 个分组共 27 个后缀,面板会高到底部放不下、翻上来盖住整块属性面板。
172
+ */
173
+ .file-types-select-dropdown .el-select-dropdown__wrap {
174
+ max-height: 320px;
175
+ }
176
+ </style>
@@ -2942,6 +2942,7 @@ export const advancedFields = [
2942
2942
  labelWidth: null,
2943
2943
  labelHidden: !0,
2944
2944
  limit: null,
2945
+ fileTypes: [],
2945
2946
  hideRemoveButton: false,
2946
2947
  accessType: "1",
2947
2948
  entityTableCode: null,
@@ -2960,12 +2961,14 @@ export const advancedFields = [
2960
2961
  showRuleEnabled: 1,
2961
2962
  showRules: [],
2962
2963
 
2963
- hiddenFileInfo: false,
2964
- hiddenFileName: false,
2964
+ /* 键名须与 field-vabUpload-editor、vabUpload-widget 读取的一致;
2965
+ 早期的 hiddenFileInfo/hiddenFileName/widgetSize 无处读取,已改名 */
2966
+ hideFileInfo: false,
2967
+ hideFileName: false,
2965
2968
  showFileSize: false,
2966
2969
  showFileCreateBy: false,
2967
2970
  showFileCreateDate: false,
2968
- widgetSize: 2,
2971
+ fileShowImageSize: 2,
2969
2972
 
2970
2973
  customUploadEnabled: false,
2971
2974
  uploadUrl: null,
@@ -3468,6 +3471,7 @@ export const advancedFields = [
3468
3471
  labelWidth: null,
3469
3472
  labelHidden: !0,
3470
3473
  limit: null,
3474
+ fileTypes: [],
3471
3475
  showViewButton: true,
3472
3476
  accessType: "1",
3473
3477
  entityTableCode: null,
@@ -74,7 +74,7 @@
74
74
  type="text"
75
75
  status="primary"
76
76
  plain
77
- >{{ $t2("重置") }}
77
+ >{{ $t1("刷新") }}
78
78
  </vxe-button>
79
79
  <vxe-button
80
80
  status="warning"