usePage增加许多配置项,另外增加一些回调函数、插槽等等,修改逻辑增强配置灵活性
zk authored at 2023-11-21 17:42:23
3.94 KiB
NewLife.QuickVue
import { inject, ref, Ref, unref, watch } from "vue";
import { ColumnConfig } from "../../form/model/form";
import { TableColumn } from "../../table/type";
import { ColumnIn, UsePageProps, EventSettingRef, ProvidePage } from "../model";
// import providePageKey from "../provide/key";
import { ColumnKind, usePageApi } from "/@/api/page";
import { deepMerge, getInfoFields, getSearchFields, getTableFields, toCamelCase } from "/@/utils/other";
interface Props {
  type?: string;
	searchData?: EmptyObjectType;
}
interface Emits {
	(e: 'update:searchData', val: EmptyObjectType): void;
}

export default function useGetColumnsForm (props: Props, emits: Emits, providePage?: ProvidePage) {  
  // const providePage = inject(providePageKey)
  
  const editConfig = (providePage?.editColumns || ref([])) as Ref<ColumnConfig[]>;
  const addConfig = (providePage?.addColumns || ref([])) as Ref<ColumnConfig[]>;
  const search = (providePage?.searchColumns || ref([])) as Ref<ColumnConfig[]>;
  const columns = (providePage?.tableColumns || ref([])) as Ref<TableColumn[]>;
  
  const editForm = providePage?.infoForm || ref({});
  const searchForm = providePage?.searchForm || ref<EmptyObjectType>(props.searchData || {});
  watch(() => props.searchData, (val) => {
    searchForm.value = val || {}
  })
  watch(searchForm, (val) => {
    emits('update:searchData', val)
  })
    
  // 配置修改
  const setting = (oldSetting: EventSettingRef) => {
    // 当prop配置数组时需要拆分成单个的配置(cascader组件除外),若存在同名配置则合并配置
    let columns = providePage?.pageProps.columns?.reduce((total, item) => {
      if (item.component === 'cascader') {
        total.push(item)
      } else {
        let propArray = Array.isArray(item.prop) ? item.prop : [item.prop]
        propArray.forEach((prop, i) => {
          total.push({ ...item, prop, index: item.index !== undefined ? item.index + i : undefined})
        })
      }
      return total
    }, [] as Array<(ColumnConfig | TableColumn) & ColumnIn>) || []
    let newArr = columns.filter(item => item.in === undefined || item.in === oldSetting.type || (Array.isArray(item.in) && item.in.some(v => v === oldSetting.type)))
    let oldArrVal: Ref<Array<ColumnConfig | TableColumn>> = oldSetting.config
    newArr.forEach((newItem) => {
      if (newItem.component === 'cascader' && Array.isArray(newItem.prop)) {
        oldArrVal.value = oldArrVal.value.filter(oldItem => (newItem.prop as string[]).every(v => v !== oldItem.prop))
        oldArrVal.value.push(newItem)
      } else {
        let oldItem = oldArrVal.value.find(v => v.prop === newItem.prop)
        if (oldItem) {
          // 合并配置
          oldItem = deepMerge(oldItem, newItem)
        } else {
          // 追加配置
          oldArrVal.value.push(newItem)
        }
      }
    })
    // 排序
    let sortArr = oldArrVal.value.filter(item => item.index !== undefined).sort((item1, item2) => item1.index! - item2.index!)
    oldArrVal.value = oldArrVal.value.filter(item => item.index === undefined)
    sortArr.forEach(item => {
      oldArrVal.value.splice(item.index!, 0, item)
    })
  }

  const pageApi = usePageApi()
  pageApi.getColumns(props.type, ColumnKind.SEARCH).then(res => {
    search.value = getSearchFields(res.data)
    setting({ type: ColumnKind.SEARCH, config: search })
  })
  pageApi.getColumns(props.type, ColumnKind.LIST).then(res => {
    columns.value = getTableFields(res.data)
    setting({ type: ColumnKind.LIST, config: columns })
  })
  pageApi.getColumns(props.type, ColumnKind.EDIT).then(res => {
    editConfig.value = getInfoFields(res.data)
    setting({ type: ColumnKind.EDIT, config: editConfig })
    console.log('editConfig', editConfig.value)
  })
  pageApi.getColumns(props.type, ColumnKind.ADD).then(res => {
    addConfig.value = getInfoFields(res.data)
    setting({ type: ColumnKind.ADD, config: addConfig })
  })

  return {
    searchForm,
    editForm,
    editConfig,
    addConfig,
    search,
    columns
  }
}