{"version":3,"file":"search.mjs","sources":["../../../../../../../packages/components/search/src/search.vue"],"sourcesContent":["<script lang=\"ts\" setup>\r\nimport { ref, useSlots, watch } from 'vue'\r\nimport { cloneDeep, get, set } from 'lodash-unified'\r\nimport { useLocale } from '@m-eleplus-crud/hooks'\r\nimport { useGlobalConfig } from '@m-eleplus-crud/components'\r\nimport { debugWarn } from '@m-eleplus-crud/utils'\r\nimport { searchEmits, searchProps } from './search'\r\nimport type { ISearchColumn, ISearchOption } from './search'\r\n\r\nimport type { FormInstance } from 'element-plus'\r\n\r\nconst COMPONENT_NAME = 'MSearch'\r\ndefineOptions({\r\n  name: COMPONENT_NAME,\r\n})\r\n\r\nconst props = defineProps(searchProps)\r\nconst emit = defineEmits(searchEmits)\r\n\r\n// 插槽信息\r\nconst slots = useSlots() as any\r\n\r\n// 国际化\r\nconst { t } = useLocale()\r\n\r\n// 输入框类型\r\nconst INPUT_TYPES = ['input', 'textarea', 'number', 'password']\r\n\r\n// 下拉选择类型\r\nconst SELECT_TYPES = ['select', 'checkbox', 'radio', 'switch']\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\nconst searchOption = ref<ISearchOption>({\r\n  searchBtnText: t('m.search.searchBtnText'),\r\n  resetBtnText: t('m.search.resetBtnText'),\r\n  // 搜索按钮默认Search图标\r\n  searchBtnIcon: 'Search',\r\n  // 重置按钮默认Delete图标\r\n  resetBtnIcon: 'Delete',\r\n  // 默认label宽度80px\r\n  labelWidth: '80px',\r\n  // 默认展示3个\r\n  colIndex: 3,\r\n  // 默认不折叠\r\n  col: false,\r\n  // 搜索列配置\r\n  column: [],\r\n})\r\n\r\n// 表单ref\r\nconst formRef = ref<FormInstance>()\r\n\r\n// 全局配置\r\nconst globalConfig = useGlobalConfig()\r\n\r\n// 搜索选项折叠\r\nconst searchCol = ref(true)\r\n\r\n// 代理model\r\nconst proxys: any = 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 * 初始化搜索表单的值\r\n */\r\nconst initValue = () => {\r\n  // 初始化搜索表单的值\r\n  if (searchOption.value && searchOption.value.column) {\r\n    for (let i = 0; i < searchOption.value.column?.length; i++) {\r\n      const column = searchOption.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 * @param page 第一页\r\n */\r\nconst search = (page = 1) => {\r\n  if (searchOption.value.column && searchOption.value.column.length) {\r\n    formRef.value?.validate((valid) => {\r\n      if (valid) {\r\n        // 搜索从第一页开始搜索，也支持传入页码\r\n        if (proxys.page) {\r\n          proxys.page = page\r\n        }\r\n        // emit搜索事件 如果非第一页，自动重置第一页\r\n        emit('search', proxys)\r\n      }\r\n    })\r\n  } else {\r\n    // 搜索从第一页开始搜索，也支持传入页码\r\n    if (proxys.page) {\r\n      proxys.page = page\r\n    }\r\n    // emit搜索事件 如果非第一页，自动重置第一页\r\n    emit('search', proxys)\r\n  }\r\n}\r\n\r\n/**\r\n * 重置搜索\r\n */\r\nconst reset = () => {\r\n  // 重置分页参数\r\n  if (proxys.page) {\r\n    proxys.page = 1\r\n  }\r\n  if (proxys.limit) {\r\n    proxys.limit = 10\r\n  }\r\n  // 清空搜索表单的字段\r\n  formRef.value?.resetFields()\r\n  // emit重置事件\r\n  emit('reset')\r\n}\r\n\r\n/**\r\n * 展开/折叠搜索\r\n */\r\nconst toggleCol = () => {\r\n  searchCol.value = !searchCol.value\r\n}\r\n\r\n/**\r\n * 处理需要远程获取字典的配置\r\n */\r\nconst getAllRemoteDics = () => {\r\n  const hasDicUrl = searchOption.value?.column?.some((column) => column.dicUrl)\r\n  if (hasDicUrl && !globalConfig.value?.httpGet) {\r\n    debugWarn('MSearch', '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: ISearchColumn) => {\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 < (searchOption.value?.column || []).length; i++) {\r\n    // @ts-ignore\r\n    const column = searchOption.value.column[i]\r\n    if (column.dicUrl) {\r\n      if (!column.dicFormatter) {\r\n        debugWarn('MSearch', '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 arr 下拉框数据\r\n */\r\nconst wrapSelectData = (arr: any) => {\r\n  if (!arr) {\r\n    return []\r\n  }\r\n  return [{ label: '全部', value: '' }, ...arr]\r\n}\r\n\r\n\r\n/**\r\n * @description 监听搜索列的变化\r\n */\r\nwatch(\r\n  () => props.option as ISearchOption,\r\n  (newVal: ISearchOption) => {\r\n    if (newVal) {\r\n      searchOption.value = Object.assign({}, searchOption.value, newVal)\r\n      if (newVal.column) {\r\n        searchOption.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      // 处理远程字典的配置\r\n      getAllRemoteDics()\r\n      // 初始化搜索表单的值\r\n      initValue()\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  search,\r\n  /**\r\n   * @description 重置方法\r\n   */\r\n  reset,\r\n})\r\n</script>\r\n\r\n<template>\r\n  <div\r\n    v-if=\"searchOption.column && searchOption.column.length\"\r\n    class=\"m-search\"\r\n  >\r\n    <el-form\r\n      ref=\"formRef\"\r\n      :inline=\"true\"\r\n      :model=\"proxys\"\r\n      :size=\"size || globalConfig.size\"\r\n      :disabled=\"loading\"\r\n      :label-width=\"searchOption.labelWidth\"\r\n      @submit.prevent\r\n    >\r\n      <el-row :gutter=\"0\">\r\n        <template\r\n          v-for=\"(column, columnIndex) in searchOption.column\"\r\n          :key=\"columnIndex\"\r\n        >\r\n          <el-col\r\n            v-if=\"\r\n              !searchOption.col ||\r\n              !searchCol ||\r\n              columnIndex < (searchOption.colIndex || 3)\r\n            \"\r\n            :span=\"column.span || 6\"\r\n          >\r\n            <el-form-item\r\n              style=\"width: 100%\"\r\n              :label-width=\"column.labelWidth || searchOption.labelWidth\"\r\n              :label=\"column.label + ':'\"\r\n              :prop=\"column.prop\"\r\n              :rules=\"column.rules\"\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              <template\r\n                v-else-if=\"!column.type || INPUT_TYPES.includes(column.type)\"\r\n              >\r\n                <el-input\r\n                  v-model.trim=\"proxys[column.prop || '']\"\r\n                  :placeholder=\"column.placeholder\"\r\n                  style=\"width: 100%\"\r\n                  type=\"text\"\r\n                  @keyup.enter=\"search(1)\"\r\n                />\r\n              </template>\r\n              <!---->\r\n              <!--单选/多选-->\r\n              <template\r\n                v-else-if=\"SELECT_TYPES.includes(column.type as string)\"\r\n              >\r\n                <el-select\r\n                  v-model=\"proxys[column.prop || '']\"\r\n                  style=\"width: 100%\"\r\n                  :placeholder=\"column.placeholder\"\r\n                  :multiple=\"column.multiple || column.type === 'checkbox'\"\r\n                  :clearable=\"column.clearable === undefined ? true : column.clearable\"\r\n                  :empty-values=\"[null, undefined]\"\r\n                >\r\n                  <el-option\r\n                    v-for=\"(dicItem, dicIndex) in wrapSelectData(column.dicData)\"\r\n                    :key=\"dicIndex\"\r\n                    :label=\"dicItem.label\"\r\n                    :value=\"dicItem.value\"\r\n                  />\r\n                </el-select>\r\n              </template>\r\n              <!---->\r\n              <!--时间选择-->\r\n              <template v-else-if=\"DATE_TYPES.includes(column.type as string)\">\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                  :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                />\r\n                <el-time-picker\r\n                  v-else\r\n                  v-model=\"proxys[column.prop || '']\"\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                />\r\n              </template>\r\n            </el-form-item>\r\n          </el-col>\r\n        </template>\r\n        <el-col :span=\"6\">\r\n          <el-form-item class=\"m-search-btns\" style=\"width: 100%\">\r\n            <el-button\r\n              type=\"primary\"\r\n              :icon=\"searchOption.searchBtnIcon\"\r\n              :loading=\"loading\"\r\n              @click=\"search(1)\"\r\n            >\r\n              {{ searchOption.searchBtnText }}\r\n            </el-button>\r\n            <el-button\r\n              type=\"default\"\r\n              :icon=\"searchOption.resetBtnIcon\"\r\n              :loading=\"loading\"\r\n              @click=\"reset\"\r\n            >\r\n              {{ searchOption.resetBtnText }}\r\n            </el-button>\r\n            <el-link\r\n              v-if=\"searchOption.col\"\r\n              style=\"width: 54px; margin-left: 12px\"\r\n              underline=\"never\"\r\n              :disabled=\"loading\"\r\n              type=\"default\"\r\n              @click=\"toggleCol\"\r\n            >\r\n              <el-icon style=\"margin-right: 6px\">\r\n                <ArrowDown v-if=\"searchCol\" />\r\n                <ArrowUp v-else />\r\n              </el-icon>\r\n              {{ searchCol ? t('m.search.expandBtn') : t('m.search.colBtn') }}\r\n            </el-link>\r\n          </el-form-item>\r\n        </el-col>\r\n      </el-row>\r\n    </el-form>\r\n  </div>\r\n</template>\r\n"],"names":["DO_defineComponent"],"mappings":"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"}