From 11cd1e7eb5e2e405083d4682c9bd0852880d7bdc Mon Sep 17 00:00:00 2001 From: cKey <35512826+colinin@users.noreply.github.com> Date: Mon, 10 Oct 2022 10:07:13 +0800 Subject: [PATCH] optimizing advanced queries --- .../src/components/Form/src/componentMap.ts | 3 ++ .../src/components/Form/src/types/index.ts | 3 +- .../src/components/Table/src/BasicTable.vue | 27 +++++++++++---- .../Table/src/components/AdvancedSearch.vue | 18 ++++++++-- .../Table/src/hooks/useDataSource.ts | 34 +++++++++++-------- .../Table/src/hooks/useTableForm.ts | 31 ++++++++++++----- 6 files changed, 84 insertions(+), 32 deletions(-) diff --git a/apps/vue/src/components/Form/src/componentMap.ts b/apps/vue/src/components/Form/src/componentMap.ts index a6e292354..f2d909b8c 100644 --- a/apps/vue/src/components/Form/src/componentMap.ts +++ b/apps/vue/src/components/Form/src/componentMap.ts @@ -33,9 +33,12 @@ import { StrengthMeter } from '/@/components/StrengthMeter'; import { IconPicker } from '/@/components/Icon'; import { CountdownInput } from '/@/components/CountDown'; import { Input as BInput } from '/@/components/Input'; +import { CodeEditorX } from '/@/components/CodeEditor'; const componentMap = new Map(); +componentMap.set('CodeEditorX', CodeEditorX); + componentMap.set('Input', BInput); componentMap.set('InputGroup', Input.Group); componentMap.set('InputPassword', Input.Password); diff --git a/apps/vue/src/components/Form/src/types/index.ts b/apps/vue/src/components/Form/src/types/index.ts index 294b0805e..9ea4997bf 100644 --- a/apps/vue/src/components/Form/src/types/index.ts +++ b/apps/vue/src/components/Form/src/types/index.ts @@ -114,4 +114,5 @@ export type ComponentType = | 'Slider' | 'Rate' | 'Divider' - | 'ApiTransfer'; + | 'ApiTransfer' + | 'CodeEditorX'; diff --git a/apps/vue/src/components/Table/src/BasicTable.vue b/apps/vue/src/components/Table/src/BasicTable.vue index f5b8c8ff3..c425d7d27 100644 --- a/apps/vue/src/components/Table/src/BasicTable.vue +++ b/apps/vue/src/components/Table/src/BasicTable.vue @@ -8,6 +8,7 @@ :tableAction="tableAction" @register="registerForm" @submit="handleSearchInfoChange" + @reset="handleSearchInfoReset" @advanced-change="redoHeight" > + \ No newline at end of file diff --git a/apps/vue/src/components/Table/src/hooks/useDataSource.ts b/apps/vue/src/components/Table/src/hooks/useDataSource.ts index 3a82c07ed..f86511b18 100644 --- a/apps/vue/src/components/Table/src/hooks/useDataSource.ts +++ b/apps/vue/src/components/Table/src/hooks/useDataSource.ts @@ -239,25 +239,30 @@ export function useDataSource( return findRow(dataSourceRef.value); } - async function fetch(opt?: FetchParams, api?: (...arg: any) => Promise, request?: any) { - const { api: apiFunc, useSearchForm } = unref(propsRef); - api = api || apiFunc; - if (!api || !isFunction(api)) return; - request = request || useSearchForm ? getFieldsValue() : {}; - _fetch(opt, api, request); - } - - async function _fetch(opt?: FetchParams, api?: (...arg: any) => Promise, request?: any) { + async function fetch(opt?: FetchParams) { const { + api, searchInfo, defSort, fetchSetting, + useSearchForm, beforeFetch, beforeResponse, afterFetch, pagination, + advancedSearchConfig, } = unref(propsRef); - if (!api || !isFunction(api)) return; + let fetchApi = api; + // 高级查询条件支持 + if (advancedSearchConfig?.useAdvancedSearch) { + const searchInput = getFieldsValue(); + console.log(searchInput); + if (Reflect.has(searchInput, 'queryable') && + Array.isArray(searchInput.queryable?.paramters) && + searchInput.queryable.paramters.length > 0) + fetchApi = advancedSearchConfig?.fetchApi; + } + if (!fetchApi || !isFunction(fetchApi)) return; try { setLoading(true); const { pageField, sizeField, listField, totalField } = Object.assign( @@ -280,7 +285,7 @@ export function useDataSource( let params: Recordable = merge( pageParams, - request, + useSearchForm ? getFieldsValue() : {}, searchInfo, opt?.searchInfo ?? {}, defSort, @@ -289,11 +294,12 @@ export function useDataSource( opt?.sortInfo ?? {}, opt?.filterInfo ?? {}, ); + console.log(params); if (beforeFetch && isFunction(beforeFetch)) { params = (await beforeFetch(params)) || params; } - let res = await api(params); + let res = await fetchApi(params); // 增加用户自定义的返回数据处理函数 if (beforeResponse && isFunction(beforeResponse)) { @@ -314,7 +320,7 @@ export function useDataSource( setPagination({ current: currentTotalPage, }); - return await _fetch(opt, api, request); + return await fetch(opt); } } @@ -346,7 +352,7 @@ export function useDataSource( } } - function setTableData(values: T[]) { + function setTableData(values: any[]) { dataSourceRef.value = values; } diff --git a/apps/vue/src/components/Table/src/hooks/useTableForm.ts b/apps/vue/src/components/Table/src/hooks/useTableForm.ts index f89e28e89..697621f48 100644 --- a/apps/vue/src/components/Table/src/hooks/useTableForm.ts +++ b/apps/vue/src/components/Table/src/hooks/useTableForm.ts @@ -1,18 +1,33 @@ import type { ComputedRef, Slots } from 'vue'; import type { BasicTableProps, FetchParams } from '../types/table'; +import type { FormProps } from '/@/components/Form'; import type { DynamicQueryable } from '../types/advancedSearch'; + import { unref, computed } from 'vue'; -import type { FormProps } from '/@/components/Form'; import { isFunction } from '/@/utils/is'; export function useTableForm( propsRef: ComputedRef, slots: Slots, - fetch: (opt?: FetchParams | undefined, api?: (...arg: any) => Promise, request?: any) => Promise, + fetch: (opt?: FetchParams | undefined) => Promise, getLoading: ComputedRef, + setFieldsValue: (values: T) => Promise, ) { const getFormProps = computed((): Partial => { - const { formConfig } = unref(propsRef); + const { formConfig, advancedSearchConfig } = unref(propsRef); + if (advancedSearchConfig?.useAdvancedSearch && formConfig?.schemas) { + const advIndex = formConfig.schemas.findIndex(s => s.field === 'queryable'); + if (advIndex < 0) { + // 加入高级条件的隐藏字段 + formConfig.schemas.push({ + label: 'queryable', + field: 'queryable', + component: 'CodeEditorX', + show: false, + colProps: { span: 24 }, + }); + } + } const { submitButtonOptions } = formConfig || {}; return { showAdvancedButton: true, @@ -49,17 +64,17 @@ export function useTableForm( } function handleAdvanceSearchChange(queryable: DynamicQueryable) { - const { advancedSearchConfig } = unref(propsRef); - if (!advancedSearchConfig) return; - const { fetchApi } = advancedSearchConfig; - fetch({ searchInfo: { queryable: queryable }, page: 1 }, fetchApi, {}); + setFieldsValue({ queryable: queryable }); + setTimeout(() => { + fetch({ page: 1 }); + }, 300); } return { getFormProps, - getAdvancedSearchProps, replaceFormSlotKey, getFormSlotKeys, + getAdvancedSearchProps, handleSearchInfoChange, handleAdvanceSearchChange, };