cnhis-design-vue 0.3.3-beta → 0.3.6-beta
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.
- package/env.d.ts +2 -0
- package/es/big-table/index.css +1 -0
- package/es/big-table/index.js +116 -74
- package/es/button-print/index.css +1 -0
- package/es/drag-layout/index.css +2 -1
- package/es/drag-layout/index.js +33 -58
- package/es/grid/index.css +2 -1
- package/es/grid/index.js +2 -3
- package/es/index.css +2 -1
- package/es/index.js +152 -135
- package/package.json +5 -2
- package/packages/big-table/index.ts +17 -0
- package/packages/big-table/src/BigTable.vue +2511 -0
- package/packages/big-table/src/assets/iconfont/iconfont.less +21 -0
- package/packages/big-table/src/assets/iconfont/iconfont.ttf +0 -0
- package/packages/big-table/src/assets/img/failure.png +0 -0
- package/packages/big-table/src/assets/img/icon-asc.png +0 -0
- package/packages/big-table/src/assets/img/icon-desc.png +0 -0
- package/packages/big-table/src/assets/img/no-permission.png +0 -0
- package/packages/big-table/src/assets/img/nodata.png +0 -0
- package/packages/big-table/src/assets/img/notfound.png +0 -0
- package/packages/big-table/src/assets/img/qr.png +0 -0
- package/packages/big-table/src/assets/img/video_default_cover.png +0 -0
- package/packages/big-table/src/assets/img/xb_big.png +0 -0
- package/packages/big-table/src/assets/img/xb_small.png +0 -0
- package/packages/big-table/src/assets/style/table-base.less +275 -0
- package/packages/big-table/src/assets/style/table-global.less +167 -0
- package/packages/big-table/src/bigTableEmits.ts +46 -0
- package/packages/big-table/src/bigTableProps.ts +125 -0
- package/packages/big-table/src/bigTableState.ts +62 -0
- package/packages/big-table/src/components/NoData.vue +90 -0
- package/packages/big-table/src/components/SvgIcon.vue +49 -0
- package/packages/big-table/src/components/TextOverTooltip.vue +110 -0
- package/packages/big-table/src/components/edit-form/EditForm.vue +426 -0
- package/packages/big-table/src/components/edit-form/edit-component/edit-date-picker/edit-date-picker.vue +66 -0
- package/packages/big-table/src/components/edit-form/edit-component/edit-digital/edit-digital.vue +60 -0
- package/packages/big-table/src/components/edit-form/edit-component/edit-input/edit-input.vue +38 -0
- package/packages/big-table/src/components/edit-form/edit-component/edit-input-password/edit-input-password.vue +89 -0
- package/packages/big-table/src/components/edit-form/edit-component/edit-month-picker/edit-month-picker.vue +38 -0
- package/packages/big-table/src/components/edit-form/edit-component/edit-search/edit-search.vue +63 -0
- package/packages/big-table/src/components/edit-form/edit-component/edit-search-more/edit-search-more.vue +69 -0
- package/packages/big-table/src/components/edit-form/edit-component/edit-select/edit-select.vue +51 -0
- package/packages/big-table/src/components/edit-form/edit-component/edit-select-multiple/edit-select-multiple.vue +60 -0
- package/packages/big-table/src/components/edit-form/edit-component/edit-textarea/edit-textarea.vue +34 -0
- package/packages/big-table/src/components/edit-form/edit-component/edit-time-picker/edit-time-picker.vue +42 -0
- package/packages/big-table/src/components/edit-form/edit-component/editFormProps.ts +91 -0
- package/packages/big-table/src/components/edit-form/edit-component/register-com.ts +18 -0
- package/packages/big-table/src/components/edit-form/hooks/useConfigData.ts +79 -0
- package/packages/big-table/src/components/edit-form/hooks/useDateType.ts +184 -0
- package/packages/big-table/src/components/edit-form/hooks/useFormCommon.ts +373 -0
- package/packages/big-table/src/components/edit-form/hooks/useItemDefault.ts +638 -0
- package/packages/big-table/src/components/edit-form/hooks/useSearch.ts +910 -0
- package/packages/big-table/src/components/edit-form/hooks/useValidateRules.ts +387 -0
- package/packages/big-table/src/components/edit-form/interface.ts +53 -0
- package/packages/big-table/src/components/edit-form/types.ts +3 -0
- package/packages/big-table/src/components/edit-form/utils.ts +247 -0
- package/packages/big-table/src/hooks/useBatchEditing.ts +574 -0
- package/packages/big-table/src/hooks/useFormat.ts +612 -0
- package/packages/big-table/src/hooks/useNestTable.ts +109 -0
- package/packages/big-table/src/hooks/useTableParse.ts +169 -0
- package/packages/big-table/src/utils.ts +705 -0
- package/packages/button-print/index.ts +15 -0
- package/packages/button-print/src/ButtonPrint.vue +697 -0
- package/packages/button-print/src/components/IdentityVerification.vue +149 -0
- package/packages/button-print/src/interfaces.ts +19 -0
- package/packages/button-print/src/utils/crypto.js +25 -0
- package/packages/button-print/src/utils/print.es.min.js +1 -0
- package/packages/drag-layout/index.ts +15 -0
- package/packages/drag-layout/src/DragFormLeftItem.vue +131 -0
- package/packages/drag-layout/src/DragFormRightItem.vue +277 -0
- package/packages/drag-layout/src/DragLayout.vue +712 -0
- package/packages/grid/index.ts +17 -0
- package/packages/grid/src/Grid.tsx +22 -0
- package/packages/grid/src/hooks.ts +168 -0
- package/packages/index.ts +36 -0
- package/src/component/svg/index.vue +49 -0
- package/src/core/create.ts +5 -0
- package/src/global/variable.ts +2 -0
- package/src/utils/clickoutside.ts +80 -0
- package/src/utils/crypto.js +25 -0
- package/src/utils/vexutils.ts +811 -0
|
@@ -0,0 +1,426 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="editForm-page">
|
|
3
|
+
<NForm ref="editForm" :model="state.editForm" :rules="state.editRules">
|
|
4
|
+
<NFormItem
|
|
5
|
+
v-for="(item, index) in state.editForm.formFieldList"
|
|
6
|
+
:key="index"
|
|
7
|
+
label=""
|
|
8
|
+
:path="`formFieldList.${index}.useFormValue`"
|
|
9
|
+
:rule="handleGetRules(item)"
|
|
10
|
+
:class="'editeForm-item-' + item.html_type"
|
|
11
|
+
>
|
|
12
|
+
<component
|
|
13
|
+
v-if="item.isShowComponent"
|
|
14
|
+
:key="item.RandomId"
|
|
15
|
+
v-bind:is="item.com_name"
|
|
16
|
+
:class="item.html_type"
|
|
17
|
+
:ref="item.html_type + item.val_key"
|
|
18
|
+
:item="item"
|
|
19
|
+
:defaultValue="state.defaultValue"
|
|
20
|
+
v-bind="$attrs"
|
|
21
|
+
:form="editForm"
|
|
22
|
+
@valueOnChange="getValueChange"
|
|
23
|
+
/>
|
|
24
|
+
</NFormItem>
|
|
25
|
+
</NForm>
|
|
26
|
+
</div>
|
|
27
|
+
</template>
|
|
28
|
+
<script lang="ts">
|
|
29
|
+
import registerCom from './edit-component/register-com';
|
|
30
|
+
export default {
|
|
31
|
+
name: 'EditForm',
|
|
32
|
+
mixins: [registerCom]
|
|
33
|
+
}
|
|
34
|
+
</script>
|
|
35
|
+
<script setup lang="ts">
|
|
36
|
+
import { ref, reactive, provide, computed, watch } from 'vue'
|
|
37
|
+
import { NGrid, NGridItem, NFormItemGi, NButton, NModal, NForm, NFormItem, NInput, NSelect, NCheckbox, NInputNumber } from 'naive-ui'
|
|
38
|
+
import type { FormRules, FormInst } from 'naive-ui'
|
|
39
|
+
import { useMessage } from 'naive-ui'
|
|
40
|
+
import type { defaultFormProp, FieldListProp } from './interface'
|
|
41
|
+
import useConfigData from './hooks/useConfigData'
|
|
42
|
+
import { useFormCommon } from "./hooks/useFormCommon"
|
|
43
|
+
import { useValidateRules } from './hooks/useValidateRules'
|
|
44
|
+
import { handleSysParams, handlerGetDateType } from './utils'
|
|
45
|
+
import vexutils from '@/utils/vexutils';
|
|
46
|
+
|
|
47
|
+
interface EditFormProps {
|
|
48
|
+
defaultForm: defaultFormProp
|
|
49
|
+
isPure: boolean
|
|
50
|
+
cacheUniqueKey?: any
|
|
51
|
+
banRequest?: boolean
|
|
52
|
+
propsDelSetting?: boolean
|
|
53
|
+
propsFormBtn?: boolean
|
|
54
|
+
parentConfig?: any
|
|
55
|
+
configuration?: any
|
|
56
|
+
isOpenShortcut?: boolean
|
|
57
|
+
formPrimaryKey: number | string
|
|
58
|
+
styleSetting?: any
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
(window as any).$message = useMessage()
|
|
62
|
+
|
|
63
|
+
const props = withDefaults(defineProps<EditFormProps>(), {
|
|
64
|
+
cacheUniqueKey: {},
|
|
65
|
+
banRequest: false,
|
|
66
|
+
propsDelSetting: false,
|
|
67
|
+
propsFormBtn: false,
|
|
68
|
+
parentConfig: {},
|
|
69
|
+
configuration: {},
|
|
70
|
+
isOpenShortcut: true
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
const emit = defineEmits(['banSubmit', 'handleSubmit'])
|
|
74
|
+
|
|
75
|
+
const state = reactive({
|
|
76
|
+
defaultValue: {},
|
|
77
|
+
editForm: {
|
|
78
|
+
formFieldList: [] as any[]
|
|
79
|
+
},
|
|
80
|
+
editRules: {},
|
|
81
|
+
formFieldList: [],
|
|
82
|
+
theUniqueKeyListObj: {},
|
|
83
|
+
formType: {} as null | any,
|
|
84
|
+
defaultFieldList: [] as any[],
|
|
85
|
+
dbParams: {},
|
|
86
|
+
searchObj: {}, // 存下来搜索框数据
|
|
87
|
+
searchAddObj: {},
|
|
88
|
+
multipleSelected: {}, // 已选的多选值
|
|
89
|
+
formFieldObj: {}, // 表单数据
|
|
90
|
+
selectedDefValueObj: {},
|
|
91
|
+
fieldTypeList: [] as any[]
|
|
92
|
+
})
|
|
93
|
+
const editForm = ref<FormInst | null>(null)
|
|
94
|
+
|
|
95
|
+
const userInfo = computed(() => {
|
|
96
|
+
const { userInfo } = props.configuration || {};
|
|
97
|
+
return userInfo || {};
|
|
98
|
+
})
|
|
99
|
+
const showLable = computed(() => !props.isPure)
|
|
100
|
+
|
|
101
|
+
const { RandomId, handleGetdef}: any = useFormCommon(props, state, userInfo.value);
|
|
102
|
+
const { handleGetRules } = useValidateRules()
|
|
103
|
+
|
|
104
|
+
provide('state', state)
|
|
105
|
+
provide('userInfo', userInfo)
|
|
106
|
+
|
|
107
|
+
// 方法
|
|
108
|
+
// 默认值转换
|
|
109
|
+
const handleConvertData = (target: any) => {
|
|
110
|
+
let transmitParams: any = {};
|
|
111
|
+
let transmitKeys = Object.keys(target || {});
|
|
112
|
+
if (transmitKeys && transmitKeys.length) {
|
|
113
|
+
transmitKeys.forEach(v => {
|
|
114
|
+
if (typeof target[v] == 'object') {
|
|
115
|
+
transmitParams[v] = JSON.stringify(target[v]);
|
|
116
|
+
} else {
|
|
117
|
+
transmitParams[v] = target[v];
|
|
118
|
+
}
|
|
119
|
+
if (vexutils.isString(target[v])) {
|
|
120
|
+
if (target[v] && target[v].includes('###{')) {
|
|
121
|
+
let temp = JSON.parse(target[v].replace('###', ''));
|
|
122
|
+
transmitParams[v] = temp.value;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return transmitParams;
|
|
129
|
+
}
|
|
130
|
+
const handleGetformType = (list: any[]) => {
|
|
131
|
+
state.theUniqueKeyListObj = {};
|
|
132
|
+
let myformType: any = {};
|
|
133
|
+
let mySearchObj: any = {};
|
|
134
|
+
let searchAddObj: any = {};
|
|
135
|
+
state.formType = null;
|
|
136
|
+
|
|
137
|
+
let fieldObj = Object.create(null);
|
|
138
|
+
let defaList = Object.keys(state.defaultValue);
|
|
139
|
+
|
|
140
|
+
list?.forEach(item => {
|
|
141
|
+
myformType[item.val_key] = item;
|
|
142
|
+
let curKey = `${item.val_key}_${item.name}`;
|
|
143
|
+
let NOWORDBOOK = item.wordbook && (item?.wordbook?.type || '') != 'WORDBOOK';
|
|
144
|
+
item.selectOptions = [];
|
|
145
|
+
item.popoverVisible = false;
|
|
146
|
+
item.otherval = '';
|
|
147
|
+
item.otherFlag = false;
|
|
148
|
+
if (item.html_type == 'SEARCH') {
|
|
149
|
+
mySearchObj[curKey] = [];
|
|
150
|
+
searchAddObj[curKey] = false;
|
|
151
|
+
if (defaList.includes(item.name)) {
|
|
152
|
+
mySearchObj[curKey] = [
|
|
153
|
+
{
|
|
154
|
+
[item.wordbook.value_key]: state.defaultValue[item.name]
|
|
155
|
+
}
|
|
156
|
+
];
|
|
157
|
+
}
|
|
158
|
+
} else if (item.html_type == 'SEARCH_MORE') {
|
|
159
|
+
mySearchObj[curKey] = [];
|
|
160
|
+
searchAddObj[curKey] = false;
|
|
161
|
+
if (!(state.multipleSelected as any)[curKey]) {
|
|
162
|
+
state.multipleSelected[curKey] = []
|
|
163
|
+
}
|
|
164
|
+
} else {
|
|
165
|
+
const { validate } = item;
|
|
166
|
+
let n = state.defaultValue[item.name] || item.default_val;
|
|
167
|
+
// // 身份证
|
|
168
|
+
// if (n && validate && validate.obj_type == 'id_card') {
|
|
169
|
+
// setTimeout(() => {
|
|
170
|
+
// this.handlerSetIdCarInfo(item, true);
|
|
171
|
+
// }, 300);
|
|
172
|
+
// }
|
|
173
|
+
}
|
|
174
|
+
if (item.val_key) {
|
|
175
|
+
fieldObj[item.val_key] = {
|
|
176
|
+
...item
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
state.formType = myformType;
|
|
181
|
+
state.searchObj = mySearchObj;
|
|
182
|
+
state.searchAddObj = searchAddObj;
|
|
183
|
+
state.formFieldObj = fieldObj;
|
|
184
|
+
}
|
|
185
|
+
const getSelecteddefValueObj = () => {
|
|
186
|
+
let obj = {
|
|
187
|
+
multipleSelected: {
|
|
188
|
+
...state.multipleSelected
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
state.selectedDefValueObj = obj
|
|
192
|
+
}
|
|
193
|
+
const hanlderInitFieldList = (fieldList: any[] = []) => {
|
|
194
|
+
if (!fieldList.length) return;
|
|
195
|
+
handleGetformType(fieldList);
|
|
196
|
+
getSelecteddefValueObj();
|
|
197
|
+
|
|
198
|
+
let fieldTypeList = [];
|
|
199
|
+
for (let index = 0; index < fieldList.length; index++) {
|
|
200
|
+
const element: any = fieldList[index];
|
|
201
|
+
element.isPure = props.isPure;
|
|
202
|
+
// 获取组件名称
|
|
203
|
+
let randomId = RandomId();
|
|
204
|
+
let com_name = useConfigData.getComName(element);
|
|
205
|
+
// console.log(element.name, com_name, element.html_type);
|
|
206
|
+
element['com_name'] = com_name
|
|
207
|
+
element['RandomId'] = randomId
|
|
208
|
+
let useFormValue = handleGetdef(element);
|
|
209
|
+
// console.log(useFormValue, "---useFormValue");
|
|
210
|
+
element['useFormValue'] = useFormValue
|
|
211
|
+
element['isVisible'] = false
|
|
212
|
+
// 如果中台设置(mid_is_edit)有值那就去中台的,没有取后台(is_edit)的;
|
|
213
|
+
let mid_is_edit = [0, 1, '0', '1'].includes(element.mid_is_edit) ? element.mid_is_edit : element.is_edit;
|
|
214
|
+
element.is_edit = mid_is_edit;
|
|
215
|
+
|
|
216
|
+
if (element.html_type.includes('CHECKBOX')) {
|
|
217
|
+
element['indeterminate'] = false
|
|
218
|
+
element['checkAll'] = false
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// 兼容处理,
|
|
222
|
+
if (element.html_type.includes('CHECKBOX') || element.html_type.includes('RADIO')) {
|
|
223
|
+
let imgFlag = element?.option?.some((v: any) => v.imageBase64);
|
|
224
|
+
element.is_contain_images = imgFlag ? 1 : 0;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
fieldTypeList.push({
|
|
228
|
+
columnName: element.val_key,
|
|
229
|
+
fieldType: 'TEXT'
|
|
230
|
+
});
|
|
231
|
+
element['isShowComponent'] = true
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
state.defaultFieldList = fieldList;
|
|
235
|
+
state.fieldTypeList = fieldTypeList;
|
|
236
|
+
state.editForm.formFieldList = fieldList
|
|
237
|
+
}
|
|
238
|
+
const initForm = (m: defaultFormProp = {}) => {
|
|
239
|
+
let { defaultCombinationForm = {}, fieldList = [] } = m;
|
|
240
|
+
let tempForm = {};
|
|
241
|
+
if (Object.keys(defaultCombinationForm).length) {
|
|
242
|
+
tempForm = { ...defaultCombinationForm };
|
|
243
|
+
}
|
|
244
|
+
let transmitParams = handleConvertData(tempForm);
|
|
245
|
+
state.defaultValue = { ...transmitParams };
|
|
246
|
+
// console.log(this.defaultValue, "---defaultValue");
|
|
247
|
+
hanlderInitFieldList(fieldList);
|
|
248
|
+
|
|
249
|
+
}
|
|
250
|
+
// 设置身份证的信息
|
|
251
|
+
const handlerSetIdCarInfo = (data = {}, init = false) => {}
|
|
252
|
+
const hanldegetUniqueKey = (id: string) => {
|
|
253
|
+
return props.cacheUniqueKey && props.cacheUniqueKey[id];
|
|
254
|
+
}
|
|
255
|
+
const getValueChange = (v: any, i:any) => {
|
|
256
|
+
// SEARCH_CASCADE SEARCH_MORE LABEL
|
|
257
|
+
let cacheKey = `${i.val_key}_${i.name}`;
|
|
258
|
+
if (i.html_type == 'SEARCH_MORE') {
|
|
259
|
+
state.multipleSelected[cacheKey] = [...v]
|
|
260
|
+
}
|
|
261
|
+
getSelecteddefValueObj();
|
|
262
|
+
}
|
|
263
|
+
const getObjs = (str: string): string => {
|
|
264
|
+
/**
|
|
265
|
+
* 处理:{type: "jsonb", value: ""}
|
|
266
|
+
* */
|
|
267
|
+
let resObj = null;
|
|
268
|
+
if (vexutils.isJSON(str)) {
|
|
269
|
+
resObj = JSON.parse(str);
|
|
270
|
+
if (resObj.type === 'jsonb') {
|
|
271
|
+
resObj = resObj.value;
|
|
272
|
+
if (resObj.includes('jsonb')) {
|
|
273
|
+
resObj = getObjs(resObj);
|
|
274
|
+
}
|
|
275
|
+
return resObj;
|
|
276
|
+
} else {
|
|
277
|
+
return str;
|
|
278
|
+
}
|
|
279
|
+
} else {
|
|
280
|
+
return str;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
const handleGetSearMoreSubmit = (item: any, formdata: any) => {
|
|
284
|
+
const { formType, multipleSelected } = state;
|
|
285
|
+
const curItem = formType[item];
|
|
286
|
+
const defaultVal = JSON.stringify({ objs: [], objStr: '' });
|
|
287
|
+
let valueList: any[] = [];
|
|
288
|
+
let showList: any[] = [];
|
|
289
|
+
let keyName = `${curItem.val_key}_${curItem.name}`;
|
|
290
|
+
if (!curItem.wordbook) return defaultVal;
|
|
291
|
+
let value_key = curItem.wordbook.value_key;
|
|
292
|
+
let render_key = curItem.wordbook.render_key || [];
|
|
293
|
+
let defVal = state.defaultValue[curItem.name] || curItem.default_val;
|
|
294
|
+
// 修改时没有改变值,直接提交回填的值;
|
|
295
|
+
if (curItem.isOnchange !== '00' && defVal) {
|
|
296
|
+
defVal = curItem.filtration_val || handleSysParams(defVal, { defaultValue: state.defaultValue, userInfo: userInfo.value, dbParams: state.dbParams });
|
|
297
|
+
defVal = getObjs(defVal);
|
|
298
|
+
return defVal || defaultVal;
|
|
299
|
+
}
|
|
300
|
+
const targetList = JSON.parse(JSON.stringify(multipleSelected[keyName] || []));
|
|
301
|
+
if (Array.isArray(formdata[item]) && formdata[item].length) {
|
|
302
|
+
formdata[item].forEach((ele: any) => {
|
|
303
|
+
targetList.forEach((v: any) => {
|
|
304
|
+
let [curValue_key] = typeof ele.key === 'string' ? ele.key.split('-') : [''];
|
|
305
|
+
if (`${v[value_key]}-${v['myUniqueKey']}` == ele.key || curValue_key == v[value_key]) {
|
|
306
|
+
// 删除 前端添加的关联信息
|
|
307
|
+
delete v.setting;
|
|
308
|
+
delete v.showLabel;
|
|
309
|
+
// v.myUniqueLabel != "theUniqueKey"
|
|
310
|
+
|
|
311
|
+
if (v['myUniqueKey'] && v.myUniqueLabel) {
|
|
312
|
+
var item = {
|
|
313
|
+
[v.myUniqueLabel]: v['myUniqueKey'],
|
|
314
|
+
[value_key]: v[value_key]
|
|
315
|
+
};
|
|
316
|
+
render_key.forEach((k: string) => {
|
|
317
|
+
item[k] = v[k];
|
|
318
|
+
});
|
|
319
|
+
valueList.push(item);
|
|
320
|
+
} else {
|
|
321
|
+
let { myUniqueKey, myUniqueLabel, ...rest } = v;
|
|
322
|
+
valueList.push(rest);
|
|
323
|
+
}
|
|
324
|
+
showList.push(v[value_key]);
|
|
325
|
+
}
|
|
326
|
+
});
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
return JSON.stringify({
|
|
330
|
+
objs: valueList,
|
|
331
|
+
objStr: showList.join(',')
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
const handleFormatSubmit = (copy: any) => {
|
|
335
|
+
// Moment 对象不能用 JSON 方式复制
|
|
336
|
+
// let formdata = JSON.parse(JSON.stringify(copy));
|
|
337
|
+
let formdata = vexutils.clone(copy, true);
|
|
338
|
+
|
|
339
|
+
// 表格数据格式化符合接口
|
|
340
|
+
Object.keys(formdata).forEach(item => {
|
|
341
|
+
switch (state.formType[item]?.html_type) {
|
|
342
|
+
case 'INPUT':
|
|
343
|
+
case 'TEXTAREA':
|
|
344
|
+
if (state.formType[item]?.delete_before_after_spaces == 1) {
|
|
345
|
+
formdata[item] = vexutils.handleClearStrBlank(formdata[item]);
|
|
346
|
+
}
|
|
347
|
+
break;
|
|
348
|
+
case 'DIGITAL':
|
|
349
|
+
case 'SELECT':
|
|
350
|
+
case 'RADIO':
|
|
351
|
+
case 'RADIO_BLOCK':
|
|
352
|
+
break;
|
|
353
|
+
case 'SEARCH':
|
|
354
|
+
formdata[item] = typeof formdata[item] === 'string' ? formdata[item].split('>>>')[0] : formdata[item] && formdata[item].label && formdata[item].label.trim();
|
|
355
|
+
break;
|
|
356
|
+
case 'SEARCH_MORE':
|
|
357
|
+
formdata[item] = handleGetSearMoreSubmit(item, formdata);
|
|
358
|
+
break;
|
|
359
|
+
case 'CHECKBOX':
|
|
360
|
+
case 'CHECKBOX_BLOCK':
|
|
361
|
+
formdata[item] = Array.isArray(formdata[item]) ? formdata[item].join(',') : formdata[item];
|
|
362
|
+
break;
|
|
363
|
+
case 'DATETIME-INPUT':
|
|
364
|
+
case 'DATE-INPUT':
|
|
365
|
+
case 'TIME-INPUT':
|
|
366
|
+
case 'DATE':
|
|
367
|
+
if (typeof formdata[item] == 'string') {
|
|
368
|
+
formdata[item] = formdata[item] || null;
|
|
369
|
+
} else {
|
|
370
|
+
formdata[item] = formdata[item] ? formdata[item].format(handlerGetDateType(state.formType[item])) : null;
|
|
371
|
+
}
|
|
372
|
+
break;
|
|
373
|
+
default:
|
|
374
|
+
break;
|
|
375
|
+
}
|
|
376
|
+
});
|
|
377
|
+
return formdata;
|
|
378
|
+
}
|
|
379
|
+
const handleSubmitForm = () => {
|
|
380
|
+
editForm.value?.validate((errors) => {
|
|
381
|
+
if (errors) {
|
|
382
|
+
emit('banSubmit', {
|
|
383
|
+
rowKey: props.formPrimaryKey
|
|
384
|
+
});
|
|
385
|
+
let message = (errors[0] as any).message || ''
|
|
386
|
+
message && (window as any).$message.error(message);
|
|
387
|
+
} else {
|
|
388
|
+
let submData = {};
|
|
389
|
+
state.editForm.formFieldList.forEach(item => {
|
|
390
|
+
submData[item.val_key] = item.useFormValue;
|
|
391
|
+
});
|
|
392
|
+
submData = handleFormatSubmit(submData);
|
|
393
|
+
if (submData) {
|
|
394
|
+
submData = JSON.parse(JSON.stringify(submData));
|
|
395
|
+
}
|
|
396
|
+
let formObj = {
|
|
397
|
+
rowKey: props.formPrimaryKey,
|
|
398
|
+
formData: submData
|
|
399
|
+
};
|
|
400
|
+
emit('handleSubmit', formObj);
|
|
401
|
+
}
|
|
402
|
+
})
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
watch(() => props.defaultForm,
|
|
406
|
+
(val: any) => {
|
|
407
|
+
if (!val || !Object.keys(val).length) return;
|
|
408
|
+
// 行编辑 formmat 触发多次 深拷贝 避免引用地址
|
|
409
|
+
let tempVal = JSON.parse(JSON.stringify(val));
|
|
410
|
+
initForm(tempVal);
|
|
411
|
+
},
|
|
412
|
+
{ deep: true, immediate: true }
|
|
413
|
+
)
|
|
414
|
+
|
|
415
|
+
defineExpose({
|
|
416
|
+
handleSubmitForm
|
|
417
|
+
})
|
|
418
|
+
</script>
|
|
419
|
+
<style lang="less" scoped>
|
|
420
|
+
.editForm-page {
|
|
421
|
+
height: 100%;
|
|
422
|
+
width: 100%;
|
|
423
|
+
display: flex;
|
|
424
|
+
align-items: center;
|
|
425
|
+
}
|
|
426
|
+
</style>
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<NDatePicker
|
|
3
|
+
class="edit-date-picker"
|
|
4
|
+
type="datetime"
|
|
5
|
+
v-model:value="item.useFormValue"
|
|
6
|
+
ref="dataPickerRef"
|
|
7
|
+
:placeholder="item.placeholder || ''"
|
|
8
|
+
:disabled="item.is_edit == 0"
|
|
9
|
+
:is-date-disabled="(current: number) => disabledDatePicker(current, item)"
|
|
10
|
+
:is-time-disabled="(current: number) => disabledTimePicker(current, item)"
|
|
11
|
+
:actions="handlerGetDateType(item) !== 'yyyy-MM-dd HH:mm:ss' ? ['clear', 'now', 'confirm'] : ['clear', 'confirm']"
|
|
12
|
+
:clearable="item.is_empty == 0"
|
|
13
|
+
:time-picker-props="{ disabled: timeIsDisabled, format: timeIsFormat }"
|
|
14
|
+
:format="handlerGetDateType(item)"
|
|
15
|
+
/>
|
|
16
|
+
</template>
|
|
17
|
+
|
|
18
|
+
<script lang="ts">
|
|
19
|
+
import { defineComponent, ref } from 'vue'
|
|
20
|
+
import { NDatePicker } from 'naive-ui'
|
|
21
|
+
import editFormProps from '../editFormProps'
|
|
22
|
+
import { handlerGetDateType } from '../../utils'
|
|
23
|
+
import { useItemDefault } from '../../hooks/useItemDefault'
|
|
24
|
+
import { useDateType } from '../../hooks/useDateType'
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
export default defineComponent({
|
|
28
|
+
name: 'editDatePicker',
|
|
29
|
+
components: {
|
|
30
|
+
NDatePicker
|
|
31
|
+
},
|
|
32
|
+
props: {
|
|
33
|
+
...editFormProps
|
|
34
|
+
},
|
|
35
|
+
emits: ['hanldeFromBlur'],
|
|
36
|
+
setup (props, { attrs, slots, emit }) {
|
|
37
|
+
const { open } = useItemDefault(props, emit)
|
|
38
|
+
// const { disabledDatePicker, disabledTimePicker } = useDateType(open)
|
|
39
|
+
let timeIsDisabled = ref(false)
|
|
40
|
+
let timeIsFormat = ref('HH:mm:ss')
|
|
41
|
+
|
|
42
|
+
const setTimePickerProps = () => {
|
|
43
|
+
let type = handlerGetDateType(props.item);
|
|
44
|
+
let flag = type.includes('HH');
|
|
45
|
+
let [, timeType] = type.split(' ');
|
|
46
|
+
timeType = typeof timeType === 'string' ? timeType.trim() : '';
|
|
47
|
+
if (flag) {
|
|
48
|
+
if (/(Y)|(M)|(D)/g.test(timeType) || !timeType) {
|
|
49
|
+
// return { format: 'HH:mm:ss' };
|
|
50
|
+
} else {
|
|
51
|
+
timeIsFormat.value = timeType
|
|
52
|
+
}
|
|
53
|
+
timeIsDisabled.value = true
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
setTimePickerProps()
|
|
57
|
+
|
|
58
|
+
return {
|
|
59
|
+
timeIsDisabled,
|
|
60
|
+
timeIsFormat,
|
|
61
|
+
handlerGetDateType,
|
|
62
|
+
...useDateType(open)
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
})
|
|
66
|
+
</script>
|
package/packages/big-table/src/components/edit-form/edit-component/edit-digital/edit-digital.vue
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="ant-input-group">
|
|
3
|
+
<NInputGroup>
|
|
4
|
+
<NInputGroupLabel>{{item.before}}</NInputGroupLabel>
|
|
5
|
+
<NInputNumber
|
|
6
|
+
v-model:value="item.useFormValue"
|
|
7
|
+
:ref="'a-input-number-' + item.val_key"
|
|
8
|
+
:disabled="item.is_edit == 0"
|
|
9
|
+
:placeholder="item.placeholder || ''"
|
|
10
|
+
:clearable="item.is_empty == 0"
|
|
11
|
+
>
|
|
12
|
+
<template #suffix>
|
|
13
|
+
<span v-if="item.suffix" class="digital-suffix">
|
|
14
|
+
{{ item.suffix }}
|
|
15
|
+
</span>
|
|
16
|
+
</template>
|
|
17
|
+
</NInputNumber>
|
|
18
|
+
<NInputGroupLabel>{{item.suffix}}</NInputGroupLabel>
|
|
19
|
+
</NInputGroup>
|
|
20
|
+
</div>
|
|
21
|
+
</template>
|
|
22
|
+
|
|
23
|
+
<script lang="ts">
|
|
24
|
+
import { defineComponent, ref } from 'vue'
|
|
25
|
+
import { NInputNumber, NInputGroup, NInputGroupLabel } from 'naive-ui'
|
|
26
|
+
import editFormProps from '../editFormProps'
|
|
27
|
+
|
|
28
|
+
export default defineComponent({
|
|
29
|
+
name: 'editDigital',
|
|
30
|
+
components: {
|
|
31
|
+
NInputNumber,
|
|
32
|
+
NInputGroup,
|
|
33
|
+
NInputGroupLabel
|
|
34
|
+
},
|
|
35
|
+
props: {
|
|
36
|
+
...editFormProps
|
|
37
|
+
},
|
|
38
|
+
setup (props, { attrs, slots, emit }) {
|
|
39
|
+
|
|
40
|
+
}
|
|
41
|
+
})
|
|
42
|
+
</script>
|
|
43
|
+
|
|
44
|
+
<style lang="less" scoped>
|
|
45
|
+
.digital-suffix {
|
|
46
|
+
display: inline-block;
|
|
47
|
+
height: 32px;
|
|
48
|
+
line-height: 32px;
|
|
49
|
+
padding: 0 11px;
|
|
50
|
+
font-weight: 400;
|
|
51
|
+
font-size: 14px;
|
|
52
|
+
text-align: center;
|
|
53
|
+
color: rgba(0, 0, 0, 0.65);
|
|
54
|
+
background-color: #fafafa;
|
|
55
|
+
border: 1px solid #d9d9d9;
|
|
56
|
+
border-radius: 4px;
|
|
57
|
+
box-sizing: border-box;
|
|
58
|
+
vertical-align: top;
|
|
59
|
+
}
|
|
60
|
+
</style>
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<NInputGroup>
|
|
3
|
+
<NInputGroupLabel>{{item.before}}</NInputGroupLabel>
|
|
4
|
+
<NInput
|
|
5
|
+
v-model:value="item.useFormValue"
|
|
6
|
+
:ref="`input-${item.val_key}`"
|
|
7
|
+
autocomplete="off"
|
|
8
|
+
:disabled="item.is_edit == 0"
|
|
9
|
+
:clearable="item.is_empty == 0"
|
|
10
|
+
:placeholder="item.placeholder || ''"
|
|
11
|
+
:maxlength="item.validate && item.validate.max_length ? +item.validate.max_length : 300"
|
|
12
|
+
>
|
|
13
|
+
</NInput>
|
|
14
|
+
<NInputGroupLabel>{{item.suffix}}</NInputGroupLabel>
|
|
15
|
+
</NInputGroup>
|
|
16
|
+
</template>
|
|
17
|
+
|
|
18
|
+
<script lang="ts">
|
|
19
|
+
import { defineComponent, ref } from 'vue'
|
|
20
|
+
import { NInput, NInputGroup, NInputGroupLabel } from 'naive-ui'
|
|
21
|
+
import editFormProps from '../editFormProps'
|
|
22
|
+
|
|
23
|
+
export default defineComponent({
|
|
24
|
+
name: 'editInput',
|
|
25
|
+
components: {
|
|
26
|
+
NInput,
|
|
27
|
+
NInputGroup,
|
|
28
|
+
NInputGroupLabel
|
|
29
|
+
},
|
|
30
|
+
props: {
|
|
31
|
+
...editFormProps
|
|
32
|
+
},
|
|
33
|
+
setup (props, { attrs, slots, emit }) {
|
|
34
|
+
|
|
35
|
+
}
|
|
36
|
+
})
|
|
37
|
+
</script>
|
|
38
|
+
<style lang="less" scoped></style>
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div
|
|
3
|
+
:class="{
|
|
4
|
+
'is-show-psw': !isReadOnly
|
|
5
|
+
}"
|
|
6
|
+
>
|
|
7
|
+
<NInputGroup>
|
|
8
|
+
<NInputGroupLabel>{{item.before}}</NInputGroupLabel>
|
|
9
|
+
<NInput
|
|
10
|
+
:ref="`input-password-${item.val_key}`"
|
|
11
|
+
:type="inputType"
|
|
12
|
+
v-model:value="item.useFormValue"
|
|
13
|
+
autocomplete="off"
|
|
14
|
+
autocorrect="off"
|
|
15
|
+
autocapitalize="off"
|
|
16
|
+
spellcheck="false"
|
|
17
|
+
:disabled="item.is_edit == 0"
|
|
18
|
+
:clearable="item.is_empty == 0"
|
|
19
|
+
:placeholder="item.placeholder || ''"
|
|
20
|
+
:maxlength="item.validate && item.validate.max_length ? +item.validate.max_length : 300"
|
|
21
|
+
>
|
|
22
|
+
<template #suffix>
|
|
23
|
+
<svg-icon @click="handleTogglePsw" :icon-class="isReadOnly ? 'chakan' : 'anniuyincang'" style="font-size: 1em;" :style="{ color: isReadOnly ? styleSetting.themeColor : undefined }" />
|
|
24
|
+
</template>
|
|
25
|
+
</NInput>
|
|
26
|
+
<NInputGroupLabel>{{item.suffix}}</NInputGroupLabel>
|
|
27
|
+
</NInputGroup>
|
|
28
|
+
</div>
|
|
29
|
+
</template>
|
|
30
|
+
|
|
31
|
+
<script lang="ts">
|
|
32
|
+
import { defineComponent, ref } from 'vue'
|
|
33
|
+
import { NInput, NInputGroup, NInputGroupLabel } from 'naive-ui'
|
|
34
|
+
import SvgIcon from '@/component/svg/index.vue';
|
|
35
|
+
import editFormProps from '../editFormProps'
|
|
36
|
+
|
|
37
|
+
type InputType = 'text' | 'password' | 'textarea'
|
|
38
|
+
|
|
39
|
+
export default defineComponent({
|
|
40
|
+
name: 'editInputPassword',
|
|
41
|
+
components: {
|
|
42
|
+
NInput,
|
|
43
|
+
NInputGroup,
|
|
44
|
+
NInputGroupLabel,
|
|
45
|
+
SvgIcon
|
|
46
|
+
},
|
|
47
|
+
props: {
|
|
48
|
+
...editFormProps
|
|
49
|
+
},
|
|
50
|
+
setup (props, { attrs, slots, emit }) {
|
|
51
|
+
let inputType = ref('text' as InputType)
|
|
52
|
+
let isReadOnly = ref(false)
|
|
53
|
+
|
|
54
|
+
const handleTogglePsw = () => {
|
|
55
|
+
isReadOnly.value = !isReadOnly.value
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return {
|
|
59
|
+
inputType,
|
|
60
|
+
isReadOnly,
|
|
61
|
+
handleTogglePsw
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
})
|
|
65
|
+
</script>
|
|
66
|
+
<style lang="less" scoped>
|
|
67
|
+
.is-show-psw {
|
|
68
|
+
&:deep(.n-input) {
|
|
69
|
+
font-family: text-security-disc;
|
|
70
|
+
-webkit-text-security: disc;
|
|
71
|
+
text-security: disc; /*使用指定形状代替文字显示 circle圆圈 disc 圆形 square 正方形*/
|
|
72
|
+
ime-mode: disabled;
|
|
73
|
+
}
|
|
74
|
+
::-webkit-input-placeholder {
|
|
75
|
+
/* WebKit browsers */
|
|
76
|
+
font-family: 'Avenir', Helvetica, Arial, sans-serif;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
::-moz-placeholder {
|
|
80
|
+
/* Mozilla Firefox 19+ */
|
|
81
|
+
font-family: 'Avenir', Helvetica, Arial, sans-serif;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
:-ms-input-placeholder {
|
|
85
|
+
/* Internet Explorer 10+ */
|
|
86
|
+
font-family: 'Avenir', Helvetica, Arial, sans-serif;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
</style>
|