Commit b2ad4d171a23135cc939234a14e19a363ca54f95
Merge branch 'dev-fix-ww' into 'main_dev'
fix: 修复teambition中BUG See merge request yunteng/thingskit-front!569
Showing
8 changed files
with
41 additions
and
33 deletions
| @@ -27,30 +27,14 @@ export const step1Schemas: FormSchema[] = [ | @@ -27,30 +27,14 @@ export const step1Schemas: FormSchema[] = [ | ||
| 27 | component: 'Input', | 27 | component: 'Input', |
| 28 | componentProps: { | 28 | componentProps: { |
| 29 | maxLength: 255, | 29 | maxLength: 255, |
| 30 | + placeholder: '请输入别名', | ||
| 30 | }, | 31 | }, |
| 31 | }, | 32 | }, |
| 32 | { | 33 | { |
| 33 | field: 'name', | 34 | field: 'name', |
| 34 | label: '设备名称', | 35 | label: '设备名称', |
| 35 | component: 'Input', | 36 | component: 'Input', |
| 36 | - dynamicRules: () => { | ||
| 37 | - return [ | ||
| 38 | - { | ||
| 39 | - required: true, | ||
| 40 | - validator: (_, value) => { | ||
| 41 | - // 支持英文字母、数字、下划线(_)、中划线(-)、点号(.)、半角冒号(:)和特殊字符@,长度限制为4~32个字符 | ||
| 42 | - const reg = /^[A-Za-z0-9_\( \)\-\@\:\.]+$/; | ||
| 43 | - const strLength = String(value).length as number; | ||
| 44 | - if (!reg.test(value) || strLength > 32 || strLength < 4) { | ||
| 45 | - return Promise.reject( | ||
| 46 | - '请输入支持英文字母、数字、下划线(_)、中划线(-)、点号(.)、半角冒号(:)和特殊字符@,长度限制为4~32个字符' | ||
| 47 | - ); | ||
| 48 | - } | ||
| 49 | - return Promise.resolve(); | ||
| 50 | - }, | ||
| 51 | - }, | ||
| 52 | - ]; | ||
| 53 | - }, | 37 | + rules: [{ required: true, message: '设备名称为必填项' }], |
| 54 | slot: 'snCode', | 38 | slot: 'snCode', |
| 55 | }, | 39 | }, |
| 56 | { | 40 | { |
| @@ -97,6 +81,7 @@ export const step1Schemas: FormSchema[] = [ | @@ -97,6 +81,7 @@ export const step1Schemas: FormSchema[] = [ | ||
| 97 | }); | 81 | }); |
| 98 | }, | 82 | }, |
| 99 | showSearch: true, | 83 | showSearch: true, |
| 84 | + placeholder: '请选择产品', | ||
| 100 | filterOption: (inputValue: string, option: Record<'label' | 'value', string>) => | 85 | filterOption: (inputValue: string, option: Record<'label' | 'value', string>) => |
| 101 | option.label.includes(inputValue), | 86 | option.label.includes(inputValue), |
| 102 | }; | 87 | }; |
| @@ -120,6 +105,17 @@ export const step1Schemas: FormSchema[] = [ | @@ -120,6 +105,17 @@ export const step1Schemas: FormSchema[] = [ | ||
| 120 | }, | 105 | }, |
| 121 | }, | 106 | }, |
| 122 | { | 107 | { |
| 108 | + field: 'code', | ||
| 109 | + label: '设备标识', | ||
| 110 | + required: true, | ||
| 111 | + component: 'Input', | ||
| 112 | + componentProps: { | ||
| 113 | + maxLength: 255, | ||
| 114 | + placeholder: '请输入设备标识', | ||
| 115 | + }, | ||
| 116 | + ifShow: ({ values }) => values?.transportType === TransportTypeEnum.TCP, | ||
| 117 | + }, | ||
| 118 | + { | ||
| 123 | field: 'brand', | 119 | field: 'brand', |
| 124 | component: 'ApiRadioGroup', | 120 | component: 'ApiRadioGroup', |
| 125 | label: '选择厂家', | 121 | label: '选择厂家', |
| @@ -28,15 +28,16 @@ export const columns: BasicColumn[] = [ | @@ -28,15 +28,16 @@ export const columns: BasicColumn[] = [ | ||
| 28 | slots: { customRender: 'name', title: 'deviceTitle' }, | 28 | slots: { customRender: 'name', title: 'deviceTitle' }, |
| 29 | customRender: ({ record }) => { | 29 | customRender: ({ record }) => { |
| 30 | return h('div', { style: 'display:flex;flex-direction:column' }, [ | 30 | return h('div', { style: 'display:flex;flex-direction:column' }, [ |
| 31 | + record.alias && | ||
| 32 | + h( | ||
| 33 | + 'div', | ||
| 34 | + { | ||
| 35 | + class: 'cursor-pointer', | ||
| 36 | + }, | ||
| 37 | + `${record.alias}` | ||
| 38 | + ), | ||
| 31 | h( | 39 | h( |
| 32 | - 'p', | ||
| 33 | - { | ||
| 34 | - class: 'cursor-pointer', | ||
| 35 | - }, | ||
| 36 | - `${record.alias}` | ||
| 37 | - ), | ||
| 38 | - h( | ||
| 39 | - 'p', | 40 | + 'div', |
| 40 | { | 41 | { |
| 41 | class: 'cursor-pointer text-blue-500', | 42 | class: 'cursor-pointer text-blue-500', |
| 42 | onClick: () => { | 43 | onClick: () => { |
| @@ -40,7 +40,7 @@ | @@ -40,7 +40,7 @@ | ||
| 40 | </template> | 40 | </template> |
| 41 | <template #snCode="{ model, field }"> | 41 | <template #snCode="{ model, field }"> |
| 42 | <div class="flex"> | 42 | <div class="flex"> |
| 43 | - <Input v-model:value="model[field]" /> | 43 | + <Input v-model:value="model[field]" placeholder="请输入设备名称" /> |
| 44 | <a-button type="link" @click="generateSN">自动生成</a-button> | 44 | <a-button type="link" @click="generateSN">自动生成</a-button> |
| 45 | </div> | 45 | </div> |
| 46 | </template> | 46 | </template> |
| @@ -428,7 +428,7 @@ | @@ -428,7 +428,7 @@ | ||
| 428 | createMessage.success('删除成功'); | 428 | createMessage.success('删除成功'); |
| 429 | handleReload(); | 429 | handleReload(); |
| 430 | } catch (error) { | 430 | } catch (error) { |
| 431 | - createMessage.error('删除失败'); | 431 | + throw error; |
| 432 | } finally { | 432 | } finally { |
| 433 | setLoading(false); | 433 | setLoading(false); |
| 434 | } | 434 | } |
| @@ -138,7 +138,7 @@ const deviceTableColumn: BasicColumn[] = [ | @@ -138,7 +138,7 @@ const deviceTableColumn: BasicColumn[] = [ | ||
| 138 | }, | 138 | }, |
| 139 | }, | 139 | }, |
| 140 | [ | 140 | [ |
| 141 | - h('div', { class: 'truncate' }, record.alias), | 141 | + record.alias && h('div', { class: 'truncate' }, record.alias), |
| 142 | h('div', { class: 'text-blue-400 truncate' }, record.name), | 142 | h('div', { class: 'text-blue-400 truncate' }, record.name), |
| 143 | ] | 143 | ] |
| 144 | ), | 144 | ), |
| @@ -294,8 +294,9 @@ | @@ -294,8 +294,9 @@ | ||
| 294 | watch( | 294 | watch( |
| 295 | () => props.frontId, | 295 | () => props.frontId, |
| 296 | async (target, oldTarget) => { | 296 | async (target, oldTarget) => { |
| 297 | - if (isControlComponent(oldTarget!) && isControlComponent(target!)) return; | ||
| 298 | - await resetFormFields(); | 297 | + if ([isControlComponent(oldTarget!), isControlComponent(target!)].some(Boolean)) { |
| 298 | + await resetFormFields(); | ||
| 299 | + } | ||
| 299 | } | 300 | } |
| 300 | ); | 301 | ); |
| 301 | 302 |
| @@ -14,6 +14,7 @@ | @@ -14,6 +14,7 @@ | ||
| 14 | import { useCalcGridLayout } from '../../hook/useCalcGridLayout'; | 14 | import { useCalcGridLayout } from '../../hook/useCalcGridLayout'; |
| 15 | import { FrontComponent } from '../../const/const'; | 15 | import { FrontComponent } from '../../const/const'; |
| 16 | import { frontComponentMap } from '../../components/help'; | 16 | import { frontComponentMap } from '../../components/help'; |
| 17 | + import { ValidateErrorEntity } from 'ant-design-vue/es/form/interface'; | ||
| 17 | 18 | ||
| 18 | interface DataComponentRouteParams extends RouteParams { | 19 | interface DataComponentRouteParams extends RouteParams { |
| 19 | id: string; | 20 | id: string; |
| @@ -75,7 +76,14 @@ | @@ -75,7 +76,14 @@ | ||
| 75 | unref(isEdit) ? handleUpdateComponent(value) : handleAddComponent(value); | 76 | unref(isEdit) ? handleUpdateComponent(value) : handleAddComponent(value); |
| 76 | resetForm(); | 77 | resetForm(); |
| 77 | } catch (error: unknown) { | 78 | } catch (error: unknown) { |
| 78 | - window.console.error(error); | 79 | + if ( |
| 80 | + ((error || {}) as ValidateErrorEntity).errorFields && | ||
| 81 | + ((error || {}) as ValidateErrorEntity).errorFields.length | ||
| 82 | + ) { | ||
| 83 | + const tooltip = ((error || {}) as ValidateErrorEntity).errorFields[0]; | ||
| 84 | + createMessage.warning(tooltip.errors[0]); | ||
| 85 | + } | ||
| 86 | + throw error; | ||
| 79 | } | 87 | } |
| 80 | }; | 88 | }; |
| 81 | 89 | ||
| @@ -97,7 +105,7 @@ | @@ -97,7 +105,7 @@ | ||
| 97 | closeModal(); | 105 | closeModal(); |
| 98 | emit('create'); | 106 | emit('create'); |
| 99 | } catch (error) { | 107 | } catch (error) { |
| 100 | - console.log(error); | 108 | + throw error; |
| 101 | // createMessage.error('创建失败'); | 109 | // createMessage.error('创建失败'); |
| 102 | } finally { | 110 | } finally { |
| 103 | changeOkLoading(false); | 111 | changeOkLoading(false); |
| @@ -289,6 +289,7 @@ export const dataSourceSchema = (isEdit: boolean, frontId?: FrontComponent): For | @@ -289,6 +289,7 @@ export const dataSourceSchema = (isEdit: boolean, frontId?: FrontComponent): For | ||
| 289 | component: 'ApiSelect', | 289 | component: 'ApiSelect', |
| 290 | label: '命令类型', | 290 | label: '命令类型', |
| 291 | defaultValue: CommandTypeEnum.CUSTOM.toString(), | 291 | defaultValue: CommandTypeEnum.CUSTOM.toString(), |
| 292 | + rules: [{ required: true, message: '请选择命令类型' }], | ||
| 292 | colProps: { span: 8 }, | 293 | colProps: { span: 8 }, |
| 293 | ifShow: ({ model }) => | 294 | ifShow: ({ model }) => |
| 294 | isControlComponent(frontId!) && isTcpProfile(model[DataSourceField.TRANSPORT_TYPE]), | 295 | isControlComponent(frontId!) && isTcpProfile(model[DataSourceField.TRANSPORT_TYPE]), |
| @@ -347,6 +348,7 @@ export const dataSourceSchema = (isEdit: boolean, frontId?: FrontComponent): For | @@ -347,6 +348,7 @@ export const dataSourceSchema = (isEdit: boolean, frontId?: FrontComponent): For | ||
| 347 | component: 'Input', | 348 | component: 'Input', |
| 348 | label: '命令', | 349 | label: '命令', |
| 349 | colProps: { span: 8 }, | 350 | colProps: { span: 8 }, |
| 351 | + rules: [{ required: true, message: '请输入下发命令' }], | ||
| 350 | // 是控制组件 && 自定义命令 && 传输协议为TCP | 352 | // 是控制组件 && 自定义命令 && 传输协议为TCP |
| 351 | ifShow: ({ model }) => | 353 | ifShow: ({ model }) => |
| 352 | isControlComponent(frontId!) && | 354 | isControlComponent(frontId!) && |