Commit 0d4827a0 authored by 田翔's avatar 田翔

fix: 内部字段不允许编辑配置

parent a9aae132
{
"name": "panda-xform",
"version": "2.8.5",
"description": "2.8.5: 初始化的时候必填校验问题",
"version": "2.8.6",
"description": "2.8.6: 内部字段不允许编辑配置",
"keywords": [
"panda-xform"
],
......
......@@ -92,15 +92,18 @@ const globalSettings = {
widget: 'TableNames',
required: true,
},
tableType: {
title: '表类型',
type: 'string',
disabled: true,
},
alias: {
title: '展示名称',
type: 'string',
// widget: 'htmlInput',
},
interfaceName: {
title: '接口',
type: 'string',
// widget: 'htmlInput',
},
column: {
title: '整体布局',
......
......@@ -3,6 +3,8 @@ import { commonSettings, switchSettings, elementSettings } from './otherSettings
import { GroupOutlined } from '@ant-design/icons'
import IconPack from '../../widgets/IconPack'
const disabled = '{{formData.tableTypeParent === "物联设备表" && formData.IsSystemField}}'
const groupStyle = {
groupStyle: {
title: '控件样式',
......@@ -71,44 +73,58 @@ const textWidgets = [
type: 'string',
widget: 'FieldNames',
required: true,
disabled: disabled,
dependencies: ['tableTypeParent', 'IsSystemField'],
},
title: {
title: '展示名称',
required: true,
type: 'string',
widget: 'htmlInput',
dependencies: ['widget']
disabled: disabled,
dependencies: ['tableTypeParent', 'IsSystemField'],
},
placeholder: {
title: '提示语',
type: 'string',
disabled: disabled,
dependencies: ['tableTypeParent', 'IsSystemField'],
},
description: {
title: '字段说明',
type: 'string',
disabled: disabled,
dependencies: ['tableTypeParent', 'IsSystemField'],
},
hiddenCondition: {
title: '隐藏条件',
type: 'string',
description: '所有形态默认显示',
widget: 'HiddenCondition'
widget: 'HiddenCondition',
disabled: disabled,
dependencies: ['tableTypeParent', 'IsSystemField'],
},
presetValue: {
title: '默认值',
type: 'string',
widget: 'InputDefault',
disabled: disabled,
dependencies: ['tableTypeParent', 'IsSystemField'],
},
maxLength: {
title: '最大长度',
type: 'number',
widget: 'number',
default: 200,
disabled: disabled,
dependencies: ['tableTypeParent', 'IsSystemField'],
},
rules: {
title: '正则校验',
type: 'array',
default: [],
widget: 'VerifyTextInput',
disabled: disabled,
dependencies: ['tableTypeParent', 'IsSystemField'],
},
uniqueVerify: {
title: '唯一值校验',
......@@ -117,23 +133,25 @@ const textWidgets = [
enum: ['表名/字段名'],
default: null,
enumNames: ['表名/字段名'],
// displayType: 'row',
// labelWidth: 100,
props: {
allowClear: true
}
},
disabled: disabled,
dependencies: ['tableTypeParent', 'IsSystemField'],
},
tableName: {
title: '表名',
type: 'string',
hidden: "{{formData.uniqueVerify !== '表名/字段名'}}",
dependencies: ['uniqueVerify'],
disabled: disabled,
dependencies: ['uniqueVerify', 'tableTypeParent', 'IsSystemField'],
},
fieldName: {
title: '字段名',
type: 'string',
hidden: "{{formData.uniqueVerify !== '表名/字段名'}}",
dependencies: ['uniqueVerify'],
disabled: disabled,
dependencies: ['uniqueVerify', 'tableTypeParent', 'IsSystemField'],
},
required: {
title: '必填',
......@@ -144,7 +162,9 @@ const textWidgets = [
style: {
marginLeft: '10px',
}
}
},
disabled: disabled,
dependencies: ['tableTypeParent', 'IsSystemField'],
},
disabled: {
title: '只读',
......@@ -152,13 +172,16 @@ const textWidgets = [
widget: 'checkbox',
default: false,
width: '33%',
disabled: disabled,
dependencies: ['tableTypeParent', 'IsSystemField'],
},
isStoreID: {
title: '是否存储ID',
type: 'boolean',
default: false,
hidden: "{{!['【本人姓名】','【本人部门】'].includes(rootValue.presetValue) }}",
dependencies: ['presetValue'],
disabled: disabled,
dependencies: ['presetValue', 'tableTypeParent', 'IsSystemField'],
},
isQRCode: {
title: '设备二维码',
......@@ -168,6 +191,8 @@ const textWidgets = [
displayType: 'row',
labelWidth: 120,
description: '是否解析为二维码格式(手持端专用)',
disabled: disabled,
dependencies: ['presetValue', 'tableTypeParent', 'IsSystemField'],
},
groupStyle: {
title: '控件样式',
......@@ -180,6 +205,8 @@ const textWidgets = [
widget: 'InputAddon',
displayType: 'row',
labelWidth: 80,
disabled: disabled,
dependencies: ['presetValue', 'tableTypeParent', 'IsSystemField'],
},
addonAfter: {
title: '后置标签',
......@@ -187,11 +214,15 @@ const textWidgets = [
widget: 'InputAddon',
displayType: 'row',
labelWidth: 80,
disabled: disabled,
dependencies: ['tableTypeParent', 'IsSystemField'],
},
width: {
title: '元素宽度',
type: 'string',
widget: 'percentSlider',
disabled: disabled,
dependencies: ['tableTypeParent', 'IsSystemField'],
},
labelWidth: {
title: '标签宽度',
......@@ -203,6 +234,8 @@ const textWidgets = [
props: {
hideNumber: true,
},
disabled: disabled,
dependencies: ['tableTypeParent', 'IsSystemField'],
},
},
},
......@@ -559,11 +592,6 @@ const textWidgets = [
widget: 'Coding',
},
setting: {
groupBase: {
title: '基础信息',
type: 'object',
properties: {}
},
widget: {
title: '控件类型',
type: 'string',
......@@ -576,22 +604,30 @@ const textWidgets = [
type: 'string',
widget: 'FieldNames',
required: true,
disabled: disabled,
dependencies: ['tableTypeParent', 'IsSystemField'],
},
title: {
title: '展示名称',
required: true,
type: 'string',
widget: 'htmlInput',
disabled: disabled,
dependencies: ['tableTypeParent', 'IsSystemField'],
},
description: {
title: '字段说明',
type: 'string',
disabled: disabled,
dependencies: ['tableTypeParent', 'IsSystemField'],
},
hiddenCondition: {
title: '隐藏条件',
type: 'string',
description: '所有形态默认显示',
widget: 'HiddenCondition'
widget: 'HiddenCondition',
disabled: disabled,
dependencies: ['tableTypeParent', 'IsSystemField'],
},
required: {
title: '必填',
......@@ -602,7 +638,9 @@ const textWidgets = [
style: {
marginLeft: '10px'
}
}
},
disabled: disabled,
dependencies: ['tableTypeParent', 'IsSystemField'],
},
disabled: {
title: '只读',
......@@ -610,23 +648,25 @@ const textWidgets = [
widget: 'checkbox',
default: true,
width: '30%',
disabled: disabled,
dependencies: ['tableTypeParent', 'IsSystemField'],
},
prefixion: {
title: '前缀',
type: 'string',
displayType: 'row',
labelWidth: 90,
disabled: disabled,
dependencies: ['tableTypeParent', 'IsSystemField'],
},
codingType: {
title: '编码方式',
type: 'string',
displayType: 'row',
labelWidth: 90,
widget: 'select',
enum: ['1', '2', '3'],
default: '3',
enumNames: ['前缀-年份-六位编码', '前缀-年份月份-六位编码', '前缀 -八位编码'],
description: '{{rootValue.codingType === "1" ?"示例:XJ-2019-000001" : (rootValue.codingType === "2" ? "示例: XJ-201909-000001" : "示例: XJ00000001")}}'
enumNames: ['前缀-年份-六位编码', '前缀-年份月份-六位编码', '前缀-八位编码'],
description: '{{rootValue.codingType === "1" ?"示例:XJ-2019-000001" : (rootValue.codingType === "2" ? "示例: XJ-201909-000001" : "示例: XJ00000001")}}',
disabled: disabled,
dependencies: ['tableTypeParent', 'IsSystemField'],
},
groupStyle: {
title: '控件样式',
......@@ -637,6 +677,8 @@ const textWidgets = [
title: '元素宽度',
type: 'string',
widget: 'percentSlider',
disabled: disabled,
dependencies: ['tableTypeParent', 'IsSystemField'],
},
labelWidth: {
title: '标签宽度',
......@@ -648,6 +690,8 @@ const textWidgets = [
props: {
hideNumber: true,
},
disabled: disabled,
dependencies: ['tableTypeParent', 'IsSystemField'],
},
},
}
......@@ -721,10 +765,10 @@ const selectWidgets = [
type: 'object',
properties: {
value: {
title: '选项值',
title: '',
type: 'string',
displayType: 'row',
labelWidth: 75,
labelWidth: 10,
required: true,
default: '',
props: {
......@@ -919,10 +963,10 @@ const selectWidgets = [
type: 'object',
properties: {
value: {
title: '选项值',
title: '',
type: 'string',
displayType: 'row',
labelWidth: 75,
labelWidth: 10,
// required: true,
default: '',
props: {
......@@ -1057,11 +1101,10 @@ const selectWidgets = [
type: 'object',
properties: {
value: {
title: '选项值',
title: '',
type: 'string',
displayType: 'row',
labelWidth: 75,
// required: true,
labelWidth: 10,
default: '',
props: {
style: {
......
......@@ -4,7 +4,7 @@ import { ExclamationCircleOutlined } from '@ant-design/icons'
import Generator, { defaultSettings, defaultCommonSettings, defaultGlobalSettings } from 'fr-generator'
import { settings, baseSettings, globalSettings } from './config'
import widgets from '../widgets'
import { saveTableConfig, GetTableConfigJson } from '../../apis/process'
import { saveTableConfig, GetTableConfigJson, ReloadTableFields } from '../../apis/process'
import FormRender from '../FormRender'
import { isObject } from '../../utils'
import Drag from '../components/Drag'
......@@ -27,6 +27,7 @@ const FormDesigner = (props, ref) => {
const prefixClsPandaXform = getPrefixCls()
const [visible, setVisible] = useState(false)
const [schema, setSchema] = useState({})
const [fieldName, setFieldName] = useState([])
const designerRef = useRef(null)
const formRenderRef = useRef(null)
......@@ -41,8 +42,7 @@ const FormDesigner = (props, ref) => {
return settingsParent
}, [settings, tableName])
const getJSON = (json, tableName) => {
json.tableName = tableName
const getJSON = (json, fieldName) => {
let properties = json?.properties
let parent = {}
let paths = []
......@@ -60,7 +60,15 @@ const FormDesigner = (props, ref) => {
let child = properties[v]?.properties
if (isObject(child)) {
for (let s in child) {
let IsSystemField = false
fieldName.forEach(j => {
if (j.name === s) {
IsSystemField = j.IsSystemField
}
})
child[s].tableNameParent = tableName
child[s].tableTypeParent = json.tableType
child[s].IsSystemField = IsSystemField
if (v === '(未分组)') {
ungroupedChild[s] = child[s]
}
......@@ -95,10 +103,12 @@ const FormDesigner = (props, ref) => {
const getTableConfig = async (tableName) => {
const { code, data, msg } = await GetTableConfigJson({ tableName })
if (code === 0) {
if (data && typeof data === 'string') {
let json = JSON.parse(data)
designerRef?.current?.setValue(getJSON(json, tableName))
const res = await ReloadTableFields({ tableName })
if (code === 0 && res.data && res.data.root) {
if (data && typeof data === 'string' && Array.isArray(res.data.root)) {
setFieldName(res.data.root)
let json = getJSON(JSON.parse(data), res.data.root)
designerRef?.current?.setValue(json)
setSchema(json)
}
} else {
......@@ -141,7 +151,7 @@ const FormDesigner = (props, ref) => {
return message.error('请按照提示完善表单内容')
}
setVisible(true)
let json = getJSON(designerRef.current.getValue(), tableName)
let json = getJSON(designerRef.current.getValue(), fieldName)
setSchema(json)
designerRef.current.setValue(json)
}
......@@ -151,7 +161,7 @@ const FormDesigner = (props, ref) => {
if (errors.length) {
return message.error('请按照提示完善表单内容')
}
let json = getJSON(designerRef.current.getValue(), tableName)
let json = getJSON(designerRef.current.getValue(), fieldName)
designerRef.current.setValue(json)
const { code, data, msg } = await saveTableConfig(json)
if (code === 0) {
......@@ -184,7 +194,7 @@ const FormDesigner = (props, ref) => {
]
}
return [false, false, false, false]
}, [extra])
}, [extra, fieldName])
const getFields = (schema) => {
let array = []
......@@ -214,6 +224,17 @@ const FormDesigner = (props, ref) => {
}
}
const canDelete = (values) => {
const { $id, tableTypeParent, IsSystemField } = values
if (tableTypeParent === '物联设备表' && IsSystemField) {
if (fieldName.some(v => v.name === $id)) {
message.info(`表类型为:【${tableTypeParent}】,内部字段【${$id}】不允许删除!`)
return false
}
}
return true
}
if (!tableName) {
return null
}
......@@ -223,6 +244,7 @@ const FormDesigner = (props, ref) => {
<div style={{ height: '100%' }}>
<Generator
// configProvider={{ prefixCls: prefixClsPandaXform }}
canDelete={canDelete}
mapping={{
object: 'Header',
}}
......
......@@ -20,6 +20,7 @@ const BooleanSwitch = (props) => {
return (
<Switch
disabled={disabled}
checked={value}
checkedChildren='是'
unCheckedChildren='否'
......
......@@ -9,7 +9,7 @@ const iconList = Object.keys(icons).filter((item) => typeof icons[item] === 'obj
const InputAddon = (props) => {
const { value, onChange } = props
const { value, onChange, disabled } = props
const [visible, setVisible] = useState(false)
const [icon, setIcon] = useState()
......@@ -33,8 +33,8 @@ const InputAddon = (props) => {
return (
<div className={styles.inputAddon}>
<Input value={value} onChange={inputChange} />
<div className={styles.addon}><PlusOutlined onClick={iconClick} /></div>
<Input disabled={disabled} value={value} onChange={inputChange} />
{!disabled ? <div className={styles.addon}><PlusOutlined onClick={iconClick} /></div> : null}
<Drag
width={'50%'}
getContainer={false}
......
......@@ -7,9 +7,9 @@ import styles from './index.less'
import { widgetData, getStyles } from '../../../../../constant/constant'
const FieldNames = (props) => {
let fields = window.designer || []
const { value, onChange, addons } = props
const { value, onChange, addons, disabled } = props
const { tableNameParent, widget } = addons.formData
const [fieldName, setFieldName] = useState([])
const [visible, setVisible] = useState(false)
......@@ -90,6 +90,7 @@ const FieldNames = (props) => {
return (
<div className={styles.fieldNames}>
<Select
disabled={disabled}
onFocus={onFocus}
onChange={selectChange}
style={{ width: '100%' }}
......@@ -109,7 +110,7 @@ const FieldNames = (props) => {
}
</Select>
{
plusShow ? (
plusShow && !disabled ? (
<div className={styles.plus}>
<PlusOutlined onClick={iconClick} />
</div>
......
import React, { useState, useRef } from 'react'
import React, { useState, useRef, useMemo } from 'react'
import { Modal, Input, message, Dropdown, Menu, Tree } from 'antd'
import styles from './index.less'
import { ReloadTableFields, ruleValidation, getFormFieldHideDtos } from '../../../../../apis/process'
......@@ -13,7 +13,7 @@ const fnList = [
const HiddenCondition = (props) => {
const { value, onChange, addons } = props
const { value, onChange, addons, disabled } = props
const { tableNameParent } = addons.formData
const [visible, setVisible] = useState(false)
const [fieldList, setFieldList] = useState([])
......@@ -101,6 +101,7 @@ const HiddenCondition = (props) => {
return (
<div>
<Input
disabled={disabled}
value={value}
onClick={inputClick}
/>
......
import React, { useMemo, useState } from 'react'
import { Input, Modal, Popover, Select, Dropdown, Menu } from 'antd'
import { PlusOutlined } from '@ant-design/icons'
import styles from './index.less'
const options = [
{ label: '本人姓名', key: '【本人姓名】' },
......@@ -9,7 +10,7 @@ const options = [
const InputDefault = (props) => {
const { value, onChange } = props
const { value, onChange, addons, disabled } = props
const style = useMemo(() => {
let paths = ['【本人姓名】', '【本人部门】']
......@@ -28,25 +29,26 @@ const InputDefault = (props) => {
}
return (
<div className='InputDefault'>
<div className={styles.inputDefault}>
<Input
disabled={disabled}
allowClear
value={value}
onChange={inputChange}
style={style}
addonAfter={
<Dropdown
overlay={(
<Menu
onClick={menuClick}
items={options}
/>
)}
>
<PlusOutlined />
</Dropdown>
}
/>
{!disabled ? (
<Dropdown
overlay={(
<Menu
onClick={menuClick}
items={options}
/>
)}
>
<div className={styles.addon}><PlusOutlined /></div>
</Dropdown>
) : null}
</div>
)
......
@import '~antd/es/style/themes/default.less';
.inputDefault {
position: relative;
.@{ant-prefix}-input-affix-wrapper-disabled {
background-color: #f8fafc;
border: none;
}
.@{ant-prefix}-input {
padding-right: 30px;
}
.addon {
position: absolute;
right: 10px;
top: 5px;
&:hover {
color: #4096ff;
}
}
}
\ No newline at end of file
......@@ -30,7 +30,7 @@ const options = [
const VerifyTextInput = (props) => {
const { value, onChange } = props
const { value, onChange, disabled } = props
const valueShow = useMemo(() => {
return Array.isArray(value) && value.length ? value[0].pattern : null
......@@ -47,6 +47,7 @@ const VerifyTextInput = (props) => {
return (
<Select
disabled={disabled}
allowClear
value={valueShow}
options={options}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment