in packages/element/src/editable/index.ts [43:189]
setup(props, { attrs, slots, refs }) {
const fieldRef = useField<Field>()
const { elRef: innerRef, elRefBinder } = useCompatRef(refs)
const prefixCls = `${stylePrefix}-editable`
const setEditable = (payload: boolean) => {
const pattern = getParentPattern(fieldRef)
if (pattern !== 'editable') return
fieldRef.value.setPattern(payload ? 'editable' : 'readPretty')
}
const dispose = reaction(
() => {
const pattern = getParentPattern(fieldRef)
return pattern
},
(pattern) => {
if (pattern === 'editable') {
fieldRef.value.setPattern('readPretty')
}
},
{
fireImmediately: true,
}
)
onBeforeUnmount(dispose)
return () => {
const field = fieldRef.value
const editable = field.pattern === 'editable'
const pattern = getParentPattern(fieldRef)
const itemProps = getFormItemProps(fieldRef)
const recover = () => {
if (editable && !fieldRef.value?.errors?.length) {
setEditable(false)
}
}
const onClick = (e: MouseEvent) => {
const target = e.target as HTMLElement
const close = innerRef.value.querySelector(`.${prefixCls}-close-btn`)
if (target?.contains(close) || close?.contains(target)) {
recover()
} else if (!editable) {
setTimeout(() => {
setEditable(true)
setTimeout(() => {
innerRef.value.querySelector('input')?.focus()
})
})
}
}
const renderEditHelper = () => {
if (editable) return null
return h(
FormBaseItem,
{
attrs: {
...attrs,
...itemProps,
},
},
{
default: () => {
return h(
'i',
{
class: [
`${prefixCls}-edit-btn`,
pattern === 'editable'
? 'el-icon-edit'
: 'el-icon-chat-dot-round',
],
},
{}
)
},
}
)
}
const renderCloseHelper = () => {
if (!editable) return null
return h(
FormBaseItem,
{
attrs: {
...attrs,
},
},
{
default: () => {
return h(
'i',
{
class: [`${prefixCls}-close-btn`, 'el-icon-close'],
},
{}
)
},
}
)
}
return h(
'div',
{
class: prefixCls,
ref: elRefBinder,
on: {
click: onClick,
},
},
{
default: () =>
h(
'div',
{
class: `${prefixCls}-content`,
},
{
default: () => [
h(
FormBaseItem,
{
attrs: {
...attrs,
...itemProps,
},
},
slots
),
renderEditHelper(),
renderCloseHelper(),
],
}
),
}
)
}
},