{"version":3,"file":"index.mjs","sources":["../../../../../../package/formily/editable/src/index.ts"],"sourcesContent":["import { defineComponent, ref, onBeforeUnmount, Ref, h } from \"vue\";\nimport { observer } from \"@formily/reactive-vue\";\nimport { reaction } from \"@formily/reactive\";\nimport { isVoidField, Field } from \"@formily/core\";\nimport { useField } from \"@formily/vue\";\nimport { ElPopover } from \"element-plus\";\nimport { Edit, ChatDotRound, Close } from \"@element-plus/icons-vue\";\n\nimport { stylePrefix } from \"../../__builtins__/configs\";\nimport { FormBaseItem, FormItemProps } from \"../../form-item\";\nimport { composeExport } from \"../../__builtins__/shared\";\n\nexport type EditableProps = FormItemProps;\nexport type EditablePopoverProps = typeof ElPopover;\n\nconst getParentPattern = (fieldRef: Ref<Field>) => {\n  const field = fieldRef.value;\n  return field?.parent?.pattern || field?.form?.pattern;\n};\n\nconst getFormItemProps = (fieldRef: Ref<Field>): FormItemProps => {\n  const field = fieldRef.value;\n\n  if (isVoidField(field)) return {};\n  if (!field) return {};\n  const takeMessage = () => {\n    if (field.selfErrors.length) return field.selfErrors[0];\n    if (field.selfWarnings.length) return field.selfWarnings[0];\n    if (field.selfSuccesses.length) return field.selfSuccesses[0];\n  };\n\n  return {\n    feedbackStatus: field.validateStatus === \"validating\" ? \"pending\" : field.validateStatus,\n    feedbackText: takeMessage(),\n    extra: field.description\n  };\n};\n\nconst EditableInner = observer(\n  defineComponent({\n    name: \"FEditable\",\n    setup(props, { attrs, slots }) {\n      const fieldRef = useField<Field>();\n      const innerRef = ref(document.body);\n\n      const prefixCls = `${stylePrefix}-editable`;\n      const setEditable = (payload: boolean) => {\n        const pattern = getParentPattern(fieldRef);\n\n        if (pattern !== \"editable\") return;\n        fieldRef.value.setPattern(payload ? \"editable\" : \"readPretty\");\n      };\n\n      const dispose = reaction(\n        () => {\n          const pattern = getParentPattern(fieldRef);\n\n          return pattern;\n        },\n        (pattern) => {\n          if (pattern === \"editable\") {\n            fieldRef.value.setPattern(\"readPretty\");\n          }\n        },\n        {\n          fireImmediately: true\n        }\n      );\n\n      onBeforeUnmount(dispose);\n\n      return () => {\n        const field = fieldRef.value;\n        const editable = field.pattern === \"editable\";\n        const pattern = getParentPattern(fieldRef);\n        const itemProps = getFormItemProps(fieldRef);\n\n        const recover = () => {\n          if (editable && !fieldRef.value?.errors?.length) {\n            setEditable(false);\n          }\n        };\n\n        const onClick = (e: MouseEvent) => {\n          const target = e.target as HTMLElement;\n          const close = innerRef.value.querySelector(`.${prefixCls}-close-btn`);\n\n          if (target?.contains(close) || close?.contains(target)) {\n            recover();\n          } else if (!editable) {\n            setTimeout(() => {\n              setEditable(true);\n              setTimeout(() => {\n                innerRef.value.querySelector(\"input\")?.focus();\n              });\n            });\n          }\n        };\n\n        const renderEditHelper = () => {\n          if (editable) return null;\n\n          return h(\n            FormBaseItem,\n            {\n              hasIcon: true,\n              ...attrs,\n              ...itemProps\n            },\n            {\n              default: () => {\n                return h(\n                  pattern === \"editable\" ? Edit : ChatDotRound,\n                  {\n                    class: [`${prefixCls}-edit-btn`]\n                  },\n                  {}\n                );\n              }\n            }\n          );\n        };\n\n        const renderCloseHelper = () => {\n          if (!editable) return null;\n          return h(\n            FormBaseItem,\n            {\n              hasIcon: true,\n              ...attrs\n            },\n            {\n              default: () => {\n                return h(\n                  Close,\n                  {\n                    class: [`${prefixCls}-close-btn`]\n                  },\n                  {}\n                );\n              }\n            }\n          );\n        };\n\n        return h(\n          \"div\",\n          {\n            class: prefixCls,\n            ref: innerRef,\n            onClick\n          },\n          h(\n            \"div\",\n            {\n              class: `${prefixCls}-content`\n            },\n            [\n              h(\n                FormBaseItem,\n                {\n                  ...attrs,\n                  ...itemProps\n                },\n                slots\n              ),\n              renderEditHelper(),\n              renderCloseHelper()\n            ]\n          )\n        );\n      };\n    }\n  })\n);\n\nconst EditablePopover = observer(\n  defineComponent({\n    name: \"FEditablePopover\",\n    setup(props, { attrs, slots }) {\n      const fieldRef = useField<Field>();\n\n      const prefixCls = `${stylePrefix}-editable`;\n\n      const visible = ref(false);\n\n      return () => {\n        const field = fieldRef.value;\n        const pattern = getParentPattern(fieldRef);\n        return h(\n          ElPopover as any,\n          {\n            ...attrs,\n            class: [prefixCls].concat(attrs.class as string[]),\n            title: attrs.title || field.title,\n            value: visible.value,\n            trigger: \"click\",\n            onInput: (value: any) => {\n              visible.value = value;\n            }\n          },\n          {\n            default: slots.default,\n            reference: () =>\n              h(\n                \"div\",\n                { class: prefixCls },\n                h(\n                  FormBaseItem,\n                  { class: [`${prefixCls}-trigger`] },\n                  {\n                    default: () =>\n                      h(\n                        \"div\",\n                        {\n                          class: [`${prefixCls}-content`]\n                        },\n                        [\n                          h(\n                            \"span\",\n                            {\n                              class: [`${prefixCls}-preview`]\n                            },\n                            attrs.title || field.title\n                          ),\n                          h(\n                            pattern === \"editable\" ? Edit : ChatDotRound,\n                            {\n                              class: [`${prefixCls}-edit-btn`]\n                            },\n                            {}\n                          )\n                        ]\n                      )\n                  }\n                )\n              )\n          }\n        );\n      };\n    }\n  })\n);\n\nexport const Editable = composeExport(EditableInner, {\n  Popover: EditablePopover\n});\n\nexport default Editable;\n"],"names":[],"mappings":"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"}