{"version":3,"file":"form2.mjs","sources":["../../../../../../../packages/components/form/src/form.vue"],"sourcesContent":["<script lang=\"ts\" setup>\r\nimport { computed, ref, useSlots, watch } from 'vue'\r\nimport { cloneDeep, get, set } from 'lodash-unified'\r\nimport { useGlobalConfig } from '@m-eleplus-crud/components'\r\nimport { debugWarn } from '@m-eleplus-crud/utils'\r\nimport { formEmits, formProps } from './form'\r\nimport type { IDictValue } from '@m-eleplus-crud/components/common'\r\nimport type { FormInstance } from 'element-plus'\r\nimport type { IFormColumn, IFormOption } from './form'\r\n\r\nconst COMPONENT_NAME = 'MForm'\r\ndefineOptions({\r\n  name: COMPONENT_NAME,\r\n})\r\n\r\nconst props = defineProps(formProps)\r\ndefineEmits(formEmits)\r\n\r\n// 插槽信息\r\nconst slots = useSlots() as any\r\n\r\n// 全局配置\r\nconst globalConfig = useGlobalConfig()\r\n\r\n// 表单实例\r\nconst formRef = ref<FormInstance>()\r\n\r\n// 表单输入类型\r\nconst INPUT_TYPES = [\r\n  'input',\r\n  'textarea',\r\n  'number',\r\n  'password',\r\n  'qrcode',\r\n  'barcode',\r\n]\r\n\r\n// 日期类型\r\nconst DATE_TYPES = [\r\n  'year',\r\n  'month',\r\n  'date',\r\n  'datetime',\r\n  'week',\r\n  'datetimerange',\r\n  'daterange',\r\n  'monthrange',\r\n  'yearrange',\r\n  'time',\r\n  'timerange',\r\n]\r\n\r\n// 需要字典显示处理\r\nconst NEED_DIC_TYPE = ['select', 'checkbox', 'radio', 'switch']\r\n\r\n// 表单配置\r\nconst formOption = ref<IFormOption>({\r\n  // 默认标签宽度80px\r\n  labelWidth: '80px',\r\n  column: [],\r\n})\r\n\r\n/**\r\n * @description 计算详情模式下的表格行\r\n */\r\nconst detailTableRows = computed(() => {\r\n  const rows = []\r\n  let currentRow = []\r\n  let currentTotal = 0\r\n  for (const item of formOption.value.column || []) {\r\n    const req = item.span || 12\r\n    // 若当前行加入该项超过总列数，则开启新行\r\n    if (currentTotal + req > 24) {\r\n      rows.push(currentRow)\r\n      currentRow = []\r\n      currentTotal = 0\r\n    }\r\n    currentRow.push(item)\r\n    currentTotal += req\r\n  }\r\n  if (currentRow.length) rows.push(currentRow)\r\n  return rows\r\n})\r\n\r\n// 表单model\r\nconst proxys = new Proxy(props.model as any, {\r\n  get(target, property) {\r\n    return get(target, property)\r\n  },\r\n  set(target, property, value) {\r\n    set(target, property, value)\r\n    return true\r\n  },\r\n})\r\n\r\n/**\r\n * @description 初始化表单的值\r\n */\r\nconst initValue = () => {\r\n  // 初始化搜索表单的值\r\n  if (formOption.value && formOption.value.column) {\r\n    for (let i = 0; i < formOption.value.column?.length; i++) {\r\n      const column = formOption.value.column[i]\r\n      if (column.prop && proxys[column.prop] === undefined) {\r\n        if (column.value) {\r\n          proxys[column.prop] = column.value\r\n        } else {\r\n          const ARR_TYPES = [\r\n            'checkbox',\r\n            'datetimerange',\r\n            'daterange',\r\n            'monthrange',\r\n            'yearrange',\r\n            'timerange',\r\n          ]\r\n          if (\r\n            (column.type === 'select' && column.multiple) ||\r\n            ARR_TYPES.includes(column.type || '')\r\n          ) {\r\n            proxys[column.prop] = []\r\n          } else {\r\n            proxys[column.prop] = ''\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\n/**\r\n * 根据类型获取默认时间格式\r\n * @param type 类型\r\n */\r\nconst getValueFormatByType = (type: string) => {\r\n  let format = ''\r\n  switch (type) {\r\n    case 'yearrange':\r\n    case 'year':\r\n      format = 'YYYY'\r\n      break\r\n    case 'monthrange':\r\n    case 'month':\r\n      format = 'YYYY-MM'\r\n      break\r\n    case 'daterange':\r\n    case 'week':\r\n    case 'date':\r\n      format = 'YYYY-MM-DD'\r\n      break\r\n    case 'datetimerange':\r\n    case 'datetime':\r\n      format = 'YYYY-MM-DD HH:mm:ss'\r\n      break\r\n    case 'time':\r\n      format = 'HH:mm:ss'\r\n      break\r\n  }\r\n  return format\r\n}\r\n\r\n/**\r\n * 处理需要远程获取字典的配置\r\n */\r\nconst getAllRemoteDics = () => {\r\n  const hasDicUrl = formOption.value?.column?.some((column) => column.dicUrl)\r\n  if (hasDicUrl && !globalConfig.value?.httpGet) {\r\n    debugWarn('MForm', 'global config httpGet is null')\r\n    return\r\n  }\r\n  /**\r\n   * 调用接口设置到dicData\r\n   * @param column 列配置\r\n   */\r\n  const updateRemoteDic = (column: IFormColumn) => {\r\n    return new Promise((resolve) => {\r\n      let isSuccess = false\r\n      // @ts-ignore\r\n      globalConfig.value\r\n        .httpGet(column.dicUrl, column.dicQuery, column.dicHeaders)\r\n        .then((e: any) => {\r\n          // @ts-ignore\r\n          const { list, label, value } = column.dicFormatter(e)\r\n          if (list && Array.isArray(list)) {\r\n            column['dicData'] = list.map((item) => {\r\n              const lastLabel = label.replace(/\\{(\\w+)\\}/g, (match, key) => {\r\n                return item[key] || match\r\n              })\r\n              return {\r\n                label: lastLabel,\r\n                value: item[value],\r\n              }\r\n            })\r\n            isSuccess = true\r\n          }\r\n        })\r\n        .finally(() => {\r\n          if (!isSuccess) {\r\n            column['dicData'] = []\r\n          }\r\n          resolve(null)\r\n        })\r\n    })\r\n  }\r\n  for (let i = 0; i < (formOption.value?.column || []).length; i++) {\r\n    // @ts-ignore\r\n    const column = formOption.value.column[i]\r\n    if (column.dicUrl) {\r\n      if (!column.dicFormatter) {\r\n        debugWarn('MForm', 'dicUrl and dicFormatter must be used together')\r\n        continue\r\n      }\r\n      updateRemoteDic(column)\r\n    }\r\n  }\r\n}\r\n\r\n/**\r\n * 根据配置获取表单项的绑定事件\r\n * @param column\r\n */\r\nconst getFormItemEventBind = (column: IFormColumn): object => {\r\n  const result: any = {}\r\n  for (const key in column) {\r\n    if (key.startsWith('event')) {\r\n      let funName = key.replace('event', '')\r\n      funName = funName.charAt(0).toLowerCase() + funName.slice(1)\r\n      // @ts-ignore\r\n      result[funName] = column[key]\r\n    }\r\n  }\r\n  return result\r\n}\r\n\r\n/**\r\n * 解析字典并展示\r\n * @param row 行数据\r\n * @param column 列配置\r\n */\r\nconst formatDicValue = (row: any, column: IFormColumn) => {\r\n  // 未拿到字典值的placeholder\r\n  let dictLabel: string | undefined = ''\r\n  // 查找\r\n  const findLabelByValue = (dicData: IDictValue[], value: any) => {\r\n    const dictItem = (dicData || []).find((dict) => dict.value === value)\r\n    if (dictItem === undefined) {\r\n      return dictLabel\r\n    }\r\n    return dictItem.label\r\n  }\r\n  if (\r\n    (column.type === 'select' && column.multiple) ||\r\n    column.type === 'checkbox'\r\n  ) {\r\n    // select下拉且开启多选/多选模式\r\n    let values: any = []\r\n\r\n    if (\r\n      row[column.prop || ''] != null &&\r\n      row[column.prop || ''] != undefined &&\r\n      row[column.prop || ''] !== ''\r\n    ) {\r\n      if (Array.isArray(row[column.prop || ''])) {\r\n        // 数据就是数组\r\n        values = row[column.prop || '']\r\n      } else if (typeof row[column.prop || ''] === 'string') {\r\n        // 数据是字符串，启动字符分割，后续需要弄成从配置读取\r\n        values = row[column.prop || ''].split(',')\r\n      } else {\r\n        // 最后情况变成数组\r\n        values = [row[column.prop || '']]\r\n      }\r\n    }\r\n    // 结果集合\r\n    const result: string[] = []\r\n    for (const value of values) {\r\n      dictLabel = findLabelByValue(column.dicData || [], value)\r\n      if (dictLabel === undefined) {\r\n        break\r\n      }\r\n      result.push(dictLabel)\r\n    }\r\n    return result.join(',')\r\n  }\r\n  // 单模式\r\n  dictLabel = findLabelByValue(column.dicData || [], row[column.prop || ''])\r\n  return dictLabel\r\n}\r\n\r\n/**\r\n * 拿到详情模式下的图片集合\r\n * @param row\r\n * @param column\r\n */\r\nconst getDetailPic = (row: any, column: IFormColumn) => {\r\n  if (!row || !row[column.prop || '']) {\r\n    return []\r\n  }\r\n  const pics: string[] = row[column.prop || '']\r\n    .split(column.imgSuffix || ';')\r\n    .map((pic: string) => (column.imgPrefix || '') + pic)\r\n  return pics\r\n}\r\n\r\nconst getValueColspan = (\r\n  item: IFormColumn,\r\n  rows: IFormColumn[],\r\n  index: number\r\n) => {\r\n  const getRemaining = (row: IFormColumn[]) => {\r\n    const used = row.reduce((acc, item) => acc + (item.span || 12), 0)\r\n    return 24 - used\r\n  }\r\n  if (index === rows.length - 1) {\r\n    return (item.span || 12) + getRemaining(rows) - 1\r\n  }\r\n  return (item.span || 12) - 1\r\n}\r\n\r\n/**\r\n * @description 校验表单\r\n */\r\nconst validForm = (): Promise<boolean> => {\r\n  return new Promise((resolve) => {\r\n    formRef.value!.validate((valid) => {\r\n      resolve(valid)\r\n    })\r\n  })\r\n}\r\n\r\n/**\r\n * @description 清空数据和校验规则\r\n */\r\nconst clear = () => {\r\n  // 清空校验规则\r\n  formRef.value?.clearValidate()\r\n  // 清空表单数据\r\n  formRef.value?.resetFields()\r\n}\r\n\r\nwatch(\r\n  () => props.option as IFormOption,\r\n  (newVal: IFormOption) => {\r\n    if (newVal) {\r\n      formOption.value = Object.assign({}, formOption.value, newVal)\r\n      if (newVal.column) {\r\n        formOption.value.column = cloneDeep(\r\n          newVal.column\r\n            .filter(\r\n              (column) => !(props.permission[column.prop || ''] === false)\r\n            )\r\n            .sort((a, b) => (b.order || 0) - (a.order || 0))\r\n        )\r\n        // 处理远程字典的配置\r\n        getAllRemoteDics()\r\n        if (!props.readonly) {\r\n          // 初始化表单的值\r\n          initValue()\r\n        }\r\n      }\r\n    }\r\n  },\r\n  {\r\n    immediate: true,\r\n    deep: true,\r\n  }\r\n)\r\n\r\ndefineExpose({\r\n  /**\r\n   * @description 校验表单\r\n   */\r\n  validForm,\r\n  /**\r\n   * @description 清空表单\r\n   */\r\n  clear,\r\n})\r\n</script>\r\n\r\n<template>\r\n  <div class=\"m-form\">\r\n    <!--编辑模式-->\r\n    <el-form\r\n      v-if=\"!readonly\"\r\n      ref=\"formRef\"\r\n      :model=\"proxys\"\r\n      :disabled=\"loading\"\r\n      :size=\"size || globalConfig.size\"\r\n      :label-width=\"formOption.labelWidth\"\r\n      style=\"width: 100%\"\r\n      @submit.prevent\r\n    >\r\n      <el-row :gutter=\"0\">\r\n        <el-col\r\n          v-for=\"(column, columnIndex) in formOption.column\"\r\n          :key=\"columnIndex\"\r\n          :span=\"column.span || 12\"\r\n        >\r\n          <el-form-item\r\n            style=\"width: 100%\"\r\n            :label=\"column.label + ':'\"\r\n            :prop=\"column.prop\"\r\n            :rules=\"column.rules\"\r\n            :label-width=\"column.labelWidth || formOption.labelWidth\"\r\n          >\r\n            <!--插槽信息-->\r\n            <slot\r\n              v-if=\"slots[column.prop || '']\"\r\n              :name=\"column.prop\"\r\n              v-bind=\"{ size: size || globalConfig.size, loading: loading }\"\r\n            />\r\n            <!---->\r\n            <!--输入框-->\r\n            <el-input\r\n              v-else-if=\"!column.type || INPUT_TYPES.includes(column.type)\"\r\n              v-model.trim=\"proxys[column.prop || '']\"\r\n              style=\"width: 100%\"\r\n              :placeholder=\"column.placeholder\"\r\n              :maxlength=\"column.maxlength\"\r\n              :show-word-limit=\"column.showWordLimit\"\r\n              :show-password=\"column.showPassword\"\r\n              :disabled=\"column.disabled || false\"\r\n              :type=\"\r\n                !column.type || column.type === 'input' ? 'text' : column.type\r\n              \"\r\n              v-on=\"getFormItemEventBind(column)\"\r\n            />\r\n            <!---->\r\n            <!--下拉框-->\r\n            <el-select\r\n              v-else-if=\"column.type === 'select'\"\r\n              v-model.trim=\"proxys[column.prop || '']\"\r\n              style=\"width: 100%\"\r\n              :disabled=\"column.disabled || false\"\r\n              :placeholder=\"column.placeholder\"\r\n              :multiple=\"column.multiple\"\r\n              :clearable=\"column.clearable\"\r\n              :filterable=\"column.filterable\"\r\n              :filter-method=\"column.filterMethod\"\r\n              :remote=\"column.remote\"\r\n              :remote-method=\"column.remoteMethod\"\r\n              :loading=\"column.loading\"\r\n              v-on=\"getFormItemEventBind(column)\"\r\n            >\r\n              <el-option\r\n                v-for=\"(dicItem, dicIndex) in column.dicData || []\"\r\n                :key=\"dicIndex\"\r\n                :label=\"dicItem.label\"\r\n                :value=\"dicItem.value\"\r\n              />\r\n            </el-select>\r\n            <!---->\r\n            <!--radio-->\r\n            <el-radio-group\r\n              v-else-if=\"column.type === 'radio'\"\r\n              v-model=\"proxys[column.prop || '']\"\r\n              :disabled=\"column.disabled || false\"\r\n              style=\"width: 100%\"\r\n              v-on=\"getFormItemEventBind(column)\"\r\n            >\r\n              <el-radio\r\n                v-for=\"(dicItem, dicIndex) in column.dicData || []\"\r\n                :key=\"dicIndex\"\r\n                :value=\"dicItem.value\"\r\n                :label=\"dicItem.value\"\r\n              >\r\n                {{ dicItem.label }}\r\n              </el-radio>\r\n            </el-radio-group>\r\n            <!---->\r\n            <!--checkbox-->\r\n            <el-checkbox-group\r\n              v-else-if=\"column.type === 'checkbox'\"\r\n              v-model=\"proxys[column.prop || '']\"\r\n              style=\"width: 100%\"\r\n              :disabled=\"column.disabled || false\"\r\n              v-on=\"getFormItemEventBind(column)\"\r\n            >\r\n              <el-checkbox\r\n                v-for=\"(dicItem, dicIndex) in column.dicData || []\"\r\n                :key=\"dicIndex\"\r\n                :label=\"dicItem.label\"\r\n                :value=\"dicItem.value\"\r\n              />\r\n            </el-checkbox-group>\r\n            <!---->\r\n            <!--switch-->\r\n            <template v-else-if=\"column.type === 'switch'\">\r\n              <span\r\n                v-if=\"!column.dicData || column.dicData.length != 2\"\r\n                style=\"\r\n                  color: var(--el-text-color-placeholder);\r\n                  line-height: 32px;\r\n                  height: 32px;\r\n                \"\r\n                >\"dicData/dicUrl的结果\"未设置或长度不等于2</span\r\n              >\r\n              <template v-else>\r\n                <el-switch\r\n                  v-model=\"proxys[column.prop || '']\"\r\n                  :disabled=\"column.disabled || false\"\r\n                  :active-value=\"column.dicData[0].value\"\r\n                  :inactive-value=\"column.dicData[1].value\"\r\n                  v-on=\"getFormItemEventBind(column)\"\r\n                />\r\n                <span\r\n                  style=\"\r\n                    font-size: var(--el-font-size-base);\r\n                    color: var(--el-text-color-regular);\r\n                    margin-left: 6px;\r\n                  \"\r\n                  >{{\r\n                    proxys[column.prop || ''] === column.dicData[0].value\r\n                      ? column.dicData[0].label\r\n                      : column.dicData[1].label\r\n                  }}</span\r\n                >\r\n              </template>\r\n            </template>\r\n            <!---->\r\n            <!--时间-->\r\n            <template v-else-if=\"DATE_TYPES.includes(column.type)\">\r\n              <el-date-picker\r\n                v-if=\"column.type !== 'time' && column.type !== 'timerange'\"\r\n                v-model=\"proxys[column.prop || '']\"\r\n                :type=\"column.type\"\r\n                :clearable=\"column.clearable\"\r\n                :disabled=\"column.disabled || false\"\r\n                :start-placeholder=\"column.startPlaceholder\"\r\n                :end-placeholder=\"column.endPlaceholder\"\r\n                :format=\"column.format\"\r\n                :value-format=\"\r\n                  column.valueFormat || getValueFormatByType(column.type)\r\n                \"\r\n                v-on=\"getFormItemEventBind(column)\"\r\n              />\r\n              <el-time-picker\r\n                v-else\r\n                v-model=\"proxys[column.prop || '']\"\r\n                :disabled=\"column.disabled || false\"\r\n                :is-range=\"column.type === 'timerange'\"\r\n                :clearable=\"column.clearable\"\r\n                :start-placeholder=\"column.startPlaceholder\"\r\n                :end-placeholder=\"column.endPlaceholder\"\r\n                :value-format=\"\r\n                  column.valueFormat || getValueFormatByType(column.type)\r\n                \"\r\n                v-on=\"getFormItemEventBind(column)\"\r\n              />\r\n            </template>\r\n            <!---->\r\n            <!--picture-->\r\n            <span\r\n              v-else-if=\"column.type === 'picture'\"\r\n              style=\"\r\n                color: var(--el-text-color-regular);\r\n                line-height: 32px;\r\n                height: 32px;\r\n              \"\r\n            >\r\n              暂不支持picture，请使用插槽自行实现\r\n            </span>\r\n            <!---->\r\n          </el-form-item>\r\n        </el-col>\r\n      </el-row>\r\n    </el-form>\r\n    <!---->\r\n    <!--详情模式-->\r\n    <template v-else>\r\n      <table class=\"detail-desc\">\r\n        <tbody>\r\n          <tr v-for=\"(row, rowIndex) in detailTableRows\" :key=\"rowIndex\">\r\n            <template v-for=\"(column, index) in row\" :key=\"index\">\r\n              <td\r\n                :style=\"{ width: column.labelWidth || formOption.labelWidth }\"\r\n                colspan=\"1\"\r\n                class=\"label\"\r\n              >\r\n                {{ column.label }}\r\n              </td>\r\n              <td :colspan=\"getValueColspan(column, row, index)\">\r\n                <!--插槽信息-->\r\n                <slot\r\n                  v-if=\"slots[column.prop || '']\"\r\n                  :name=\"column.prop\"\r\n                  v-bind=\"{ size: size || globalConfig.size, loading: loading }\"\r\n                />\r\n                <template v-else-if=\"column.type === 'picture'\">\r\n                  <MPicture\r\n                    :src=\"getDetailPic(proxys, column)[0]\"\r\n                    :preview-src-list=\"getDetailPic(proxys, column)\"\r\n                    img-width=\"100px\"\r\n                    img-height=\"100px\"\r\n                  />\r\n                </template>\r\n                <template v-else-if=\"NEED_DIC_TYPE.includes(column.type || '')\">\r\n                  {{ formatDicValue(proxys, column) }}\r\n                </template>\r\n                <template v-else-if=\"column.type === 'qrcode'\">\r\n                  <MQrcode\r\n                    v-if=\"proxys[column.prop || '']\"\r\n                    :text=\"proxys[column.prop || '']\"\r\n                    align=\"center\"\r\n                  />\r\n                </template>\r\n                <template v-else-if=\"column.type === 'barcode'\">\r\n                  <MBarcode\r\n                    v-if=\"proxys[column.prop || '']\"\r\n                    :text=\"proxys[column.prop || '']\"\r\n                    align=\"center\"\r\n                  />\r\n                </template>\r\n                <template v-else>\r\n                  {{ proxys[column.prop || ''] }}\r\n                </template>\r\n              </td>\r\n            </template>\r\n          </tr>\r\n        </tbody>\r\n      </table>\r\n    </template>\r\n  </div>\r\n</template>\r\n"],"names":["DO_defineComponent","item"],"mappings":"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"}