diff --git a/apps/backend-mock/utils/response.ts b/apps/backend-mock/utils/response.ts index aa6d18cc..851f7830 100644 --- a/apps/backend-mock/utils/response.ts +++ b/apps/backend-mock/utils/response.ts @@ -41,12 +41,12 @@ export function useResponseError(message: string, error: any = null) { export function forbiddenResponse(event: H3Event) { setResponseStatus(event, 403); - return useResponseError('ForbiddenException', 'Forbidden Exception'); + return useResponseError('Forbidden Exception', 'Forbidden Exception'); } export function unAuthorizedResponse(event: H3Event) { setResponseStatus(event, 401); - return useResponseError('UnauthorizedException', 'Unauthorized Exception'); + return useResponseError('Unauthorized Exception', 'Unauthorized Exception'); } export function sleep(ms: number) { diff --git a/apps/web-ele/src/api/request.ts b/apps/web-ele/src/api/request.ts index 939735f1..ea85965b 100644 --- a/apps/web-ele/src/api/request.ts +++ b/apps/web-ele/src/api/request.ts @@ -95,9 +95,13 @@ function createRequestClient(baseURL: string) { // 通用的错误处理,如果没有进入上面的错误处理逻辑,就会进入这里 client.addResponseInterceptor( - errorMessageResponseInterceptor((msg: string, _error) => { + errorMessageResponseInterceptor((msg: string, error) => { // 这里可以根据业务进行定制,你可以拿到 error 内的信息进行定制化处理,根据不同的 code 做不同的提示,而不是直接使用 message.error 提示 msg - ElMessage.error(msg); + // 当前mock接口返回的错误字段是 error 或者 message + const responseData = error?.response?.data ?? {}; + const errorMessage = responseData?.error ?? responseData?.message ?? ''; + // 如果没有错误信息,则会根据状态码进行提示 + ElMessage.error(errorMessage || msg); }), ); diff --git a/apps/web-naive/src/api/request.ts b/apps/web-naive/src/api/request.ts index ac0b722c..6d159293 100644 --- a/apps/web-naive/src/api/request.ts +++ b/apps/web-naive/src/api/request.ts @@ -94,9 +94,13 @@ function createRequestClient(baseURL: string) { // 通用的错误处理,如果没有进入上面的错误处理逻辑,就会进入这里 client.addResponseInterceptor( - errorMessageResponseInterceptor((msg: string, _error) => { + errorMessageResponseInterceptor((msg: string, error) => { // 这里可以根据业务进行定制,你可以拿到 error 内的信息进行定制化处理,根据不同的 code 做不同的提示,而不是直接使用 message.error 提示 msg - message.error(msg); + // 当前mock接口返回的错误字段是 error 或者 message + const responseData = error?.response?.data ?? {}; + const errorMessage = responseData?.error ?? responseData?.message ?? ''; + // 如果没有错误信息,则会根据状态码进行提示 + message.error(errorMessage || msg); }), ); diff --git a/docs/src/en/guide/essentials/server.md b/docs/src/en/guide/essentials/server.md index 4a31f936..d9b08011 100644 --- a/docs/src/en/guide/essentials/server.md +++ b/docs/src/en/guide/essentials/server.md @@ -255,9 +255,13 @@ function createRequestClient(baseURL: string) { // Generic error handling; if none of the above error handling logic is triggered, it will fall back to this. client.addResponseInterceptor( - errorMessageResponseInterceptor((msg: string, _error) => { + errorMessageResponseInterceptor((msg: string, error) => { // 这里可以根据业务进行定制,你可以拿到 error 内的信息进行定制化处理,根据不同的 code 做不同的提示,而不是直接使用 message.error 提示 msg - message.error(msg); + // 当前mock接口返回的错误字段是 error 或者 message + const responseData = error?.response?.data ?? {}; + const errorMessage = responseData?.error ?? responseData?.message ?? ''; + // 如果没有错误信息,则会根据状态码进行提示 + message.error(errorMessage || msg); }), ); diff --git a/docs/src/en/guide/essentials/settings.md b/docs/src/en/guide/essentials/settings.md index d09338a4..68fef3e7 100644 --- a/docs/src/en/guide/essentials/settings.md +++ b/docs/src/en/guide/essentials/settings.md @@ -226,7 +226,7 @@ const defaultPreferences: Preferences = { width: 230, }, tabbar: { - dragable: true, + draggable: true, enable: true, height: 36, keepAlive: true, @@ -406,7 +406,7 @@ interface ShortcutKeyPreferences { interface TabbarPreferences { /** Whether dragging of multiple tabs is enabled */ - dragable: boolean; + draggable: boolean; /** Whether multiple tabs are enabled */ enable: boolean; /** Tab height */ diff --git a/docs/src/guide/essentials/server.md b/docs/src/guide/essentials/server.md index aa0767f5..29af40d1 100644 --- a/docs/src/guide/essentials/server.md +++ b/docs/src/guide/essentials/server.md @@ -258,9 +258,13 @@ function createRequestClient(baseURL: string) { // 通用的错误处理,如果没有进入上面的错误处理逻辑,就会进入这里 client.addResponseInterceptor( - errorMessageResponseInterceptor((msg: string, _error) => { + errorMessageResponseInterceptor((msg: string, error) => { // 这里可以根据业务进行定制,你可以拿到 error 内的信息进行定制化处理,根据不同的 code 做不同的提示,而不是直接使用 message.error 提示 msg - message.error(msg); + // 当前mock接口返回的错误字段是 error 或者 message + const responseData = error?.response?.data ?? {}; + const errorMessage = responseData?.error ?? responseData?.message ?? ''; + // 如果没有错误信息,则会根据状态码进行提示 + message.error(errorMessage || msg); }), ); diff --git a/docs/src/guide/essentials/settings.md b/docs/src/guide/essentials/settings.md index 15ac5c3d..9a64065a 100644 --- a/docs/src/guide/essentials/settings.md +++ b/docs/src/guide/essentials/settings.md @@ -248,7 +248,7 @@ const defaultPreferences: Preferences = { width: 230, }, tabbar: { - dragable: true, + draggable: true, enable: true, height: 36, keepAlive: true, @@ -430,7 +430,7 @@ interface ShortcutKeyPreferences { interface TabbarPreferences { /** 是否开启多标签页拖拽 */ - dragable: boolean; + draggable: boolean; /** 是否开启多标签页 */ enable: boolean; /** 标签页高度 */ diff --git a/docs/src/guide/introduction/thin.md b/docs/src/guide/introduction/thin.md index a2c41e12..4db0e3b3 100644 --- a/docs/src/guide/introduction/thin.md +++ b/docs/src/guide/introduction/thin.md @@ -12,7 +12,7 @@ outline: deep ```bash apps/web-ele -apps/web-native +apps/web-naive ``` diff --git a/internal/tailwind-config/src/index.ts b/internal/tailwind-config/src/index.ts index 528998cb..caee73e7 100644 --- a/internal/tailwind-config/src/index.ts +++ b/internal/tailwind-config/src/index.ts @@ -1,6 +1,5 @@ import type { Config } from 'tailwindcss'; -import fs from 'node:fs'; import path from 'node:path'; import { getPackagesSync } from '@vben/node-utils'; @@ -19,9 +18,9 @@ const tailwindPackages: string[] = []; packages.forEach((pkg) => { // apps目录下和 @vben-core/tailwind-ui 包需要使用到 tailwindcss ui - if (fs.existsSync(path.join(pkg.dir, 'tailwind.config.mjs'))) { - tailwindPackages.push(pkg.dir); - } + // if (fs.existsSync(path.join(pkg.dir, 'tailwind.config.mjs'))) { + tailwindPackages.push(pkg.dir); + // } }); const shadcnUiColors = { diff --git a/internal/vite-config/package.json b/internal/vite-config/package.json index 7c43ff0b..0f1e4c49 100644 --- a/internal/vite-config/package.json +++ b/internal/vite-config/package.json @@ -40,6 +40,7 @@ "vite-plugin-vue-devtools": "catalog:" }, "devDependencies": { + "@pnpm/workspace.read-manifest": "catalog:", "@types/archiver": "catalog:", "@types/html-minifier-terser": "catalog:", "@vben/node-utils": "workspace:*", diff --git a/internal/vite-config/src/plugins/inject-metadata.ts b/internal/vite-config/src/plugins/inject-metadata.ts index 2731412f..41c4db40 100644 --- a/internal/vite-config/src/plugins/inject-metadata.ts +++ b/internal/vite-config/src/plugins/inject-metadata.ts @@ -1,20 +1,35 @@ import type { PluginOption } from 'vite'; -import { dateUtil, getPackages, readPackageJSON } from '@vben/node-utils'; +import { + dateUtil, + findMonorepoRoot, + getPackages, + readPackageJSON, +} from '@vben/node-utils'; + +import { readWorkspaceManifest } from '@pnpm/workspace.read-manifest'; function resolvePackageVersion( pkgsMeta: Record, name: string, value: string, + catalog: Record, ) { + if (value.includes('catalog:')) { + return catalog[name]; + } + if (value.includes('workspace')) { return pkgsMeta[name]; } + return value; } async function resolveMonorepoDependencies() { const { packages } = await getPackages(); + const manifest = await readWorkspaceManifest(findMonorepoRoot()); + const catalog = manifest?.catalog || {}; const resultDevDependencies: Record = {}; const resultDependencies: Record = {}; @@ -27,10 +42,20 @@ async function resolveMonorepoDependencies() { for (const { packageJson } of packages) { const { dependencies = {}, devDependencies = {} } = packageJson; for (const [key, value] of Object.entries(dependencies)) { - resultDependencies[key] = resolvePackageVersion(pkgsMeta, key, value); + resultDependencies[key] = resolvePackageVersion( + pkgsMeta, + key, + value, + catalog, + ); } for (const [key, value] of Object.entries(devDependencies)) { - resultDevDependencies[key] = resolvePackageVersion(pkgsMeta, key, value); + resultDevDependencies[key] = resolvePackageVersion( + pkgsMeta, + key, + value, + catalog, + ); } } return { diff --git a/packages/@core/preferences/__tests__/__snapshots__/config.test.ts.snap b/packages/@core/preferences/__tests__/__snapshots__/config.test.ts.snap index 1f860f35..70868234 100644 --- a/packages/@core/preferences/__tests__/__snapshots__/config.test.ts.snap +++ b/packages/@core/preferences/__tests__/__snapshots__/config.test.ts.snap @@ -37,6 +37,7 @@ exports[`defaultPreferences immutability test > should not modify the config obj "enable": true, "icp": "", "icpLink": "", + "settingShow": true, }, "footer": { "enable": false, @@ -73,7 +74,7 @@ exports[`defaultPreferences immutability test > should not modify the config obj "width": 224, }, "tabbar": { - "dragable": true, + "draggable": true, "enable": true, "height": 38, "keepAlive": true, diff --git a/packages/@core/preferences/src/config.ts b/packages/@core/preferences/src/config.ts index 1e15403c..42fd8d4e 100644 --- a/packages/@core/preferences/src/config.ts +++ b/packages/@core/preferences/src/config.ts @@ -37,6 +37,7 @@ const defaultPreferences: Preferences = { enable: true, icp: '', icpLink: '', + settingShow: true, }, footer: { enable: false, @@ -73,7 +74,7 @@ const defaultPreferences: Preferences = { width: 224, }, tabbar: { - dragable: true, + draggable: true, enable: true, height: 38, keepAlive: true, diff --git a/packages/@core/preferences/src/types.ts b/packages/@core/preferences/src/types.ts index 59341af2..2b536b85 100644 --- a/packages/@core/preferences/src/types.ts +++ b/packages/@core/preferences/src/types.ts @@ -88,6 +88,8 @@ interface CopyrightPreferences { icp: string; /** 备案号链接 */ icpLink: string; + /** 设置面板是否显示*/ + settingShow?: boolean; } interface FooterPreferences { @@ -154,7 +156,7 @@ interface ShortcutKeyPreferences { interface TabbarPreferences { /** 是否开启多标签页拖拽 */ - dragable: boolean; + draggable: boolean; /** 是否开启多标签页 */ enable: boolean; /** 标签页高度 */ diff --git a/packages/@core/ui-kit/tabs-ui/src/components/tabs-chrome/tabs.vue b/packages/@core/ui-kit/tabs-ui/src/components/tabs-chrome/tabs.vue index 86d1955b..f64e13d8 100644 --- a/packages/@core/ui-kit/tabs-ui/src/components/tabs-chrome/tabs.vue +++ b/packages/@core/ui-kit/tabs-ui/src/components/tabs-chrome/tabs.vue @@ -69,7 +69,7 @@ const tabsView = computed((): TabConfig[] => { v-for="(tab, i) in tabsView" :key="tab.key" ref="tabRef" - :class="[{ 'is-active': tab.key === active, dragable: !tab.affixTab }]" + :class="[{ 'is-active': tab.key === active, draggable: !tab.affixTab }]" :data-active-tab="active" :data-index="i" class="tabs-chrome__item draggable translate-all group relative -mr-3 flex h-full select-none items-center" diff --git a/packages/@core/ui-kit/tabs-ui/src/components/tabs/tabs.vue b/packages/@core/ui-kit/tabs-ui/src/components/tabs/tabs.vue index 96326e8d..67480f56 100644 --- a/packages/@core/ui-kit/tabs-ui/src/components/tabs/tabs.vue +++ b/packages/@core/ui-kit/tabs-ui/src/components/tabs/tabs.vue @@ -75,7 +75,7 @@ const tabsView = computed((): TabConfig[] => { :class="[ { 'is-active dark:bg-accent bg-primary/15': tab.key === active, - dragable: !tab.affixTab, + draggable: !tab.affixTab, }, typeWithClass.content, ]" diff --git a/packages/@core/ui-kit/tabs-ui/src/tabs-view.vue b/packages/@core/ui-kit/tabs-ui/src/tabs-view.vue index 1040a548..7656e489 100644 --- a/packages/@core/ui-kit/tabs-ui/src/tabs-view.vue +++ b/packages/@core/ui-kit/tabs-ui/src/tabs-view.vue @@ -17,7 +17,7 @@ defineOptions({ const props = withDefaults(defineProps(), { contentClass: 'vben-tabs-content', - dragable: true, + draggable: true, styleType: 'chrome', }); diff --git a/packages/@core/ui-kit/tabs-ui/src/types.ts b/packages/@core/ui-kit/tabs-ui/src/types.ts index 670d17bc..ce0ac474 100644 --- a/packages/@core/ui-kit/tabs-ui/src/types.ts +++ b/packages/@core/ui-kit/tabs-ui/src/types.ts @@ -21,7 +21,7 @@ export interface TabsProps { /** * @zh_CN 是否可以拖拽 */ - dragable?: boolean; + draggable?: boolean; /** * @zh_CN 间隙 * @default 7 diff --git a/packages/@core/ui-kit/tabs-ui/src/use-tabs-drag.ts b/packages/@core/ui-kit/tabs-ui/src/use-tabs-drag.ts index acefbfea..f76becaf 100644 --- a/packages/@core/ui-kit/tabs-ui/src/use-tabs-drag.ts +++ b/packages/@core/ui-kit/tabs-ui/src/use-tabs-drag.ts @@ -42,8 +42,8 @@ export function useTabsDrag(props: TabsProps, emit: EmitType) { const { initializeSortable } = useSortable(el, { filter: (_evt, target: HTMLElement) => { const parent = findParentElement(target); - const dragable = parent?.classList.contains('dragable'); - return !dragable || !props.dragable; + const draggable = parent?.classList.contains('draggable'); + return !draggable || !props.draggable; }, onEnd(evt) { const { newIndex, oldIndex } = evt; @@ -62,7 +62,7 @@ export function useTabsDrag(props: TabsProps, emit: EmitType) { return; } - if (!srcParent.classList.contains('dragable')) { + if (!srcParent.classList.contains('draggable')) { resetElState(); return; @@ -81,7 +81,7 @@ export function useTabsDrag(props: TabsProps, emit: EmitType) { }, onMove(evt) { const parent = findParentElement(evt.related); - return parent?.classList.contains('dragable') && props.dragable; + return parent?.classList.contains('draggable') && props.draggable; }, onStart: () => { el.style.cursor = 'grabbing'; diff --git a/packages/effects/access/postcss.config.mjs b/packages/effects/access/postcss.config.mjs deleted file mode 100644 index 3d807045..00000000 --- a/packages/effects/access/postcss.config.mjs +++ /dev/null @@ -1 +0,0 @@ -export { default } from '@vben/tailwind-config/postcss'; diff --git a/packages/effects/access/tailwind.config.mjs b/packages/effects/access/tailwind.config.mjs deleted file mode 100644 index f17f556f..00000000 --- a/packages/effects/access/tailwind.config.mjs +++ /dev/null @@ -1 +0,0 @@ -export { default } from '@vben/tailwind-config'; diff --git a/packages/effects/common-ui/postcss.config.mjs b/packages/effects/common-ui/postcss.config.mjs deleted file mode 100644 index 3d807045..00000000 --- a/packages/effects/common-ui/postcss.config.mjs +++ /dev/null @@ -1 +0,0 @@ -export { default } from '@vben/tailwind-config/postcss'; diff --git a/packages/effects/common-ui/tailwind.config.mjs b/packages/effects/common-ui/tailwind.config.mjs deleted file mode 100644 index f17f556f..00000000 --- a/packages/effects/common-ui/tailwind.config.mjs +++ /dev/null @@ -1 +0,0 @@ -export { default } from '@vben/tailwind-config'; diff --git a/packages/effects/layouts/postcss.config.mjs b/packages/effects/layouts/postcss.config.mjs deleted file mode 100644 index 3d807045..00000000 --- a/packages/effects/layouts/postcss.config.mjs +++ /dev/null @@ -1 +0,0 @@ -export { default } from '@vben/tailwind-config/postcss'; diff --git a/packages/effects/layouts/src/basic/header/header.vue b/packages/effects/layouts/src/basic/header/header.vue index 787fe28f..546342bf 100644 --- a/packages/effects/layouts/src/basic/header/header.vue +++ b/packages/effects/layouts/src/basic/header/header.vue @@ -118,7 +118,7 @@ function clearPreferencesAndLogout() { > diff --git a/packages/effects/layouts/src/basic/tabbar/tabbar.vue b/packages/effects/layouts/src/basic/tabbar/tabbar.vue index 2897cf6a..f932364e 100644 --- a/packages/effects/layouts/src/basic/tabbar/tabbar.vue +++ b/packages/effects/layouts/src/basic/tabbar/tabbar.vue @@ -51,7 +51,7 @@ if (!preferences.tabbar.persist) { :active="currentActive" :class="theme" :context-menus="createContextMenus" - :dragable="preferences.tabbar.dragable" + :draggable="preferences.tabbar.draggable" :show-icon="showIcon" :style-type="preferences.tabbar.styleType" :tabs="currentTabs" diff --git a/packages/effects/layouts/src/widgets/preferences/blocks/layout/copyright.vue b/packages/effects/layouts/src/widgets/preferences/blocks/layout/copyright.vue index 484eece1..93890297 100644 --- a/packages/effects/layouts/src/widgets/preferences/blocks/layout/copyright.vue +++ b/packages/effects/layouts/src/widgets/preferences/blocks/layout/copyright.vue @@ -6,10 +6,6 @@ import { $t } from '@vben/locales'; import InputItem from '../input-item.vue'; import SwitchItem from '../switch-item.vue'; -defineOptions({ - name: 'PreferenceBreadcrumbConfig', -}); - const props = defineProps<{ disabled: boolean }>(); const copyrightEnable = defineModel('copyrightEnable'); diff --git a/packages/effects/layouts/src/widgets/preferences/blocks/layout/footer.vue b/packages/effects/layouts/src/widgets/preferences/blocks/layout/footer.vue index be161743..8a77920e 100644 --- a/packages/effects/layouts/src/widgets/preferences/blocks/layout/footer.vue +++ b/packages/effects/layouts/src/widgets/preferences/blocks/layout/footer.vue @@ -3,10 +3,6 @@ import { $t } from '@vben/locales'; import SwitchItem from '../switch-item.vue'; -defineOptions({ - name: 'PreferenceBreadcrumbConfig', -}); - const footerEnable = defineModel('footerEnable'); const footerFixed = defineModel('footerFixed'); diff --git a/packages/effects/layouts/src/widgets/preferences/blocks/layout/header.vue b/packages/effects/layouts/src/widgets/preferences/blocks/layout/header.vue index 07fdaf29..cdb236cf 100644 --- a/packages/effects/layouts/src/widgets/preferences/blocks/layout/header.vue +++ b/packages/effects/layouts/src/widgets/preferences/blocks/layout/header.vue @@ -6,10 +6,6 @@ import { $t } from '@vben/locales'; import SelectItem from '../select-item.vue'; import SwitchItem from '../switch-item.vue'; -defineOptions({ - name: 'PreferenceBreadcrumbConfig', -}); - defineProps<{ disabled: boolean }>(); const headerEnable = defineModel('headerEnable'); diff --git a/packages/effects/layouts/src/widgets/preferences/blocks/layout/sidebar.vue b/packages/effects/layouts/src/widgets/preferences/blocks/layout/sidebar.vue index 36925f85..3c9efd69 100644 --- a/packages/effects/layouts/src/widgets/preferences/blocks/layout/sidebar.vue +++ b/packages/effects/layouts/src/widgets/preferences/blocks/layout/sidebar.vue @@ -4,10 +4,6 @@ import { $t } from '@vben/locales'; import NumberFieldItem from '../number-field-item.vue'; import SwitchItem from '../switch-item.vue'; -defineOptions({ - name: 'PreferenceBreadcrumbConfig', -}); - defineProps<{ disabled: boolean }>(); const sidebarEnable = defineModel('sidebarEnable'); diff --git a/packages/effects/layouts/src/widgets/preferences/blocks/layout/tabbar.vue b/packages/effects/layouts/src/widgets/preferences/blocks/layout/tabbar.vue index ef2245bd..5a3824a6 100644 --- a/packages/effects/layouts/src/widgets/preferences/blocks/layout/tabbar.vue +++ b/packages/effects/layouts/src/widgets/preferences/blocks/layout/tabbar.vue @@ -17,7 +17,7 @@ defineProps<{ disabled?: boolean }>(); const tabbarEnable = defineModel('tabbarEnable'); const tabbarShowIcon = defineModel('tabbarShowIcon'); const tabbarPersist = defineModel('tabbarPersist'); -const tabbarDragable = defineModel('tabbarDragable'); +const tabbarDraggable = defineModel('tabbarDraggable'); const tabbarStyleType = defineModel('tabbarStyleType'); const tabbarShowMore = defineModel('tabbarShowMore'); const tabbarShowMaximize = defineModel('tabbarShowMaximize'); @@ -50,8 +50,8 @@ const styleItems = computed((): SelectOption[] => [ {{ $t('preferences.tabbar.persist') }} - - {{ $t('preferences.tabbar.dragable') }} + + {{ $t('preferences.tabbar.draggable') }} {{ $t('preferences.tabbar.icon') }} diff --git a/packages/effects/layouts/src/widgets/preferences/preferences-drawer.vue b/packages/effects/layouts/src/widgets/preferences/preferences-drawer.vue index 60cca274..1cece3c1 100644 --- a/packages/effects/layouts/src/widgets/preferences/preferences-drawer.vue +++ b/packages/effects/layouts/src/widgets/preferences/preferences-drawer.vue @@ -102,7 +102,7 @@ const tabbarShowIcon = defineModel('tabbarShowIcon'); const tabbarShowMore = defineModel('tabbarShowMore'); const tabbarShowMaximize = defineModel('tabbarShowMaximize'); const tabbarPersist = defineModel('tabbarPersist'); -const tabbarDragable = defineModel('tabbarDragable'); +const tabbarDraggable = defineModel('tabbarDraggable'); const tabbarStyleType = defineModel('tabbarStyleType'); const navigationStyleType = defineModel( @@ -116,6 +116,7 @@ const navigationAccordion = defineModel('navigationAccordion'); const footerEnable = defineModel('footerEnable'); const footerFixed = defineModel('footerFixed'); +const copyrightSettingShow = defineModel('copyrightSettingShow'); const copyrightEnable = defineModel('copyrightEnable'); const copyrightCompanyName = defineModel('copyrightCompanyName'); const copyrightCompanySiteLink = defineModel( @@ -339,7 +340,7 @@ async function handleReset() { - + Record, +) { + [ + 'query', + 'querySuccess', + 'queryError', + 'queryAll', + 'queryAllSuccess', + 'queryAllError', + ].forEach((key) => { + extendProxyOption(key, api, options, getFormValues); + }); +} + +function extendProxyOption( + key: string, + api: VxeGridApi, + options: VxeGridProps, + getFormValues: () => Record, +) { + const { proxyConfig } = options; + const configFn = (proxyConfig?.ajax as any)?.[key]; + if (!isFunction(configFn)) { + return options; + } + + const wrapperFn = async (params: any, _formValues: any, ...args: any[]) => { + const formValues = getFormValues(); + const data = await configFn(params, formValues, ...args); + return data; + }; + api.setState({ + gridOptions: { + proxyConfig: { + ajax: { + [key]: wrapperFn, + }, + }, + }, + }); +} diff --git a/packages/effects/plugins/src/vxe-table/use-vxe-grid.vue b/packages/effects/plugins/src/vxe-table/use-vxe-grid.vue index 2f869424..239eb7bc 100644 --- a/packages/effects/plugins/src/vxe-table/use-vxe-grid.vue +++ b/packages/effects/plugins/src/vxe-table/use-vxe-grid.vue @@ -26,6 +26,7 @@ import { VbenLoading } from '@vben-core/shadcn-ui'; import { VxeGrid, VxeUI } from 'vxe-table'; +import { extendProxyOptions } from './extends'; import { useTableForm } from './init'; import 'vxe-table/styles/cssvar.scss'; @@ -38,6 +39,8 @@ interface Props extends VxeGridProps { const props = withDefaults(defineProps(), {}); +const FORM_SLOT_PREFIX = 'form-'; + const gridRef = useTemplateRef('gridRef'); const state = props.api?.useStore?.(); @@ -172,11 +175,11 @@ const delegatedFormSlots = computed(() => { const resultSlots: string[] = []; for (const key of Object.keys(slots)) { - if (key.startsWith('form-')) { + if (key.startsWith(FORM_SLOT_PREFIX)) { resultSlots.push(key); } } - return resultSlots; + return resultSlots.map((key) => key.replace(FORM_SLOT_PREFIX, '')); }); async function init() { @@ -191,7 +194,7 @@ async function init() { const autoLoad = defaultGridOptions.proxyConfig?.autoLoad; const enableProxyConfig = options.value.proxyConfig?.enabled; if (enableProxyConfig && autoLoad) { - props.api.reload(formApi.form.values); + props.api.reload(formApi.form?.values ?? {}); } // form 由 vben-form代替,所以不适配formConfig,这里给出警告 @@ -201,6 +204,9 @@ async function init() { '[Vben Vxe Table]: The formConfig in the grid is not supported, please use the `formOptions` props', ); } + + // form 由 vben-form 代替,所以需要保证query相关事件可以拿到参数 + extendProxyOptions(props.api, defaultGridOptions, () => formApi.form.values); } watch( diff --git a/packages/effects/plugins/tailwind.config.mjs b/packages/effects/plugins/tailwind.config.mjs deleted file mode 100644 index f17f556f..00000000 --- a/packages/effects/plugins/tailwind.config.mjs +++ /dev/null @@ -1 +0,0 @@ -export { default } from '@vben/tailwind-config'; diff --git a/packages/effects/request/src/request-client/preset-interceptors.ts b/packages/effects/request/src/request-client/preset-interceptors.ts index a03fec4b..89970161 100644 --- a/packages/effects/request/src/request-client/preset-interceptors.ts +++ b/packages/effects/request/src/request-client/preset-interceptors.ts @@ -91,7 +91,7 @@ export const errorMessageResponseInterceptor = ( return Promise.reject(error); } - let errorMessage = error?.response?.data?.error?.message ?? ''; + let errorMessage = ''; const status = error?.response?.status; switch (status) { diff --git a/packages/locales/src/langs/en-US.json b/packages/locales/src/langs/en-US.json index 0a701210..d620160d 100644 --- a/packages/locales/src/langs/en-US.json +++ b/packages/locales/src/langs/en-US.json @@ -215,7 +215,7 @@ "showMore": "Show More Button", "showMaximize": "Show Maximize Button", "persist": "Persist Tabs", - "dragable": "Enable Dragable Sort", + "draggable": "Enable Draggable Sort", "styleType": { "title": "Tabs Style", "chrome": "Chrome", diff --git a/packages/locales/src/langs/zh-CN.json b/packages/locales/src/langs/zh-CN.json index 008b24ac..d7812e6b 100644 --- a/packages/locales/src/langs/zh-CN.json +++ b/packages/locales/src/langs/zh-CN.json @@ -215,7 +215,7 @@ "showMore": "显示更多按钮", "showMaximize": "显示最大化按钮", "persist": "持久化标签页", - "dragable": "启动拖拽排序", + "draggable": "启动拖拽排序", "styleType": { "title": "标签页风格", "chrome": "谷歌", diff --git a/playground/src/api/request.ts b/playground/src/api/request.ts index 09be6a9a..72617d1f 100644 --- a/playground/src/api/request.ts +++ b/playground/src/api/request.ts @@ -96,9 +96,13 @@ function createRequestClient(baseURL: string) { // 通用的错误处理,如果没有进入上面的错误处理逻辑,就会进入这里 client.addResponseInterceptor( - errorMessageResponseInterceptor((msg: string, _error) => { + errorMessageResponseInterceptor((msg: string, error) => { // 这里可以根据业务进行定制,你可以拿到 error 内的信息进行定制化处理,根据不同的 code 做不同的提示,而不是直接使用 message.error 提示 msg - message.error(msg); + // 当前mock接口返回的错误字段是 error 或者 message + const responseData = error?.response?.data ?? {}; + const errorMessage = responseData?.error ?? responseData?.message ?? ''; + // 如果没有错误信息,则会根据状态码进行提示 + message.error(errorMessage || msg); }), ); diff --git a/playground/src/views/examples/vxe-table/basic.vue b/playground/src/views/examples/vxe-table/basic.vue index 75c034c1..ef8509be 100644 --- a/playground/src/views/examples/vxe-table/basic.vue +++ b/playground/src/views/examples/vxe-table/basic.vue @@ -29,6 +29,9 @@ const gridOptions: VxeGridProps = { { field: 'address', showOverflow: true, title: 'Address' }, ], data: MOCK_TABLE_DATA, + pagerConfig: { + enabled: false, + }, sortConfig: { multiple: true, }, diff --git a/playground/src/views/examples/vxe-table/fixed.vue b/playground/src/views/examples/vxe-table/fixed.vue index dfeb01ee..7c3b9610 100644 --- a/playground/src/views/examples/vxe-table/fixed.vue +++ b/playground/src/views/examples/vxe-table/fixed.vue @@ -30,12 +30,6 @@ const gridOptions: VxeGridProps = { title: 'DateTime', width: 500, }, - { - field: 'releaseDate', - formatter: 'formatDate', - title: 'Date', - width: 300, - }, { field: 'action', fixed: 'right', diff --git a/playground/src/views/examples/vxe-table/form.vue b/playground/src/views/examples/vxe-table/form.vue index e753c803..238523fc 100644 --- a/playground/src/views/examples/vxe-table/form.vue +++ b/playground/src/views/examples/vxe-table/form.vue @@ -3,7 +3,7 @@ import type { VbenFormProps, VxeGridProps } from '#/adapter'; import { Page } from '@vben/common-ui'; -import { Button, message } from 'ant-design-vue'; +import { message } from 'ant-design-vue'; import { useVbenVxeGrid } from '#/adapter'; import { getExampleTableApi } from '#/api'; @@ -60,6 +60,8 @@ const formOptions: VbenFormProps = { label: 'Date', }, ], + // 控制表单是否显示折叠按钮 + showCollapseButton: true, }; const gridOptions: VxeGridProps = { @@ -93,26 +95,11 @@ const gridOptions: VxeGridProps = { }, }; -const [Grid, gridApi] = useVbenVxeGrid({ formOptions, gridOptions }); - -function toggleFormCollspae() { - gridApi.formApi.setState((prev) => { - return { - ...prev, - showCollapseButton: !prev.showCollapseButton, - }; - }); -} +const [Grid] = useVbenVxeGrid({ formOptions, gridOptions }); diff --git a/playground/src/views/examples/vxe-table/remote.vue b/playground/src/views/examples/vxe-table/remote.vue index e42ae8a7..2b9572d6 100644 --- a/playground/src/views/examples/vxe-table/remote.vue +++ b/playground/src/views/examples/vxe-table/remote.vue @@ -30,7 +30,6 @@ const gridOptions: VxeGridProps = { { field: 'productName', title: 'Product Name' }, { field: 'price', title: 'Price' }, { field: 'releaseDate', formatter: 'formatDateTime', title: 'DateTime' }, - { field: 'releaseDate', formatter: 'formatDate', title: 'Date' }, ], height: 'auto', keepSource: true, diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 153bb262..dcbc850d 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -22,19 +22,20 @@ catalog: '@ctrl/tinycolor': ^4.1.0 '@eslint/js': ^9.12.0 '@faker-js/faker': ^9.0.3 - '@iconify/json': ^2.2.257 + '@iconify/json': ^2.2.258 '@iconify/tailwind': ^1.1.3 '@iconify/vue': ^4.1.2 '@intlify/core-base': ^10.0.4 '@intlify/unplugin-vue-i18n': ^5.2.0 '@jspm/generator': ^2.3.1 '@manypkg/get-packages': ^2.2.2 - '@nolebase/vitepress-plugin-git-changelog': ^2.5.0 + '@nolebase/vitepress-plugin-git-changelog': ^2.6.0 '@playwright/test': ^1.48.0 + '@pnpm/workspace.read-manifest': ^2.2.1 '@stylistic/stylelint-plugin': ^3.1.1 '@tailwindcss/nesting': 0.0.0-insiders.565cd3e '@tailwindcss/typography': ^0.5.15 - '@tanstack/vue-query': ^5.59.1 + '@tanstack/vue-query': ^5.59.6 '@tanstack/vue-store': ^0.5.5 '@types/archiver': ^6.0.2 '@types/chalk': ^2.2.0 @@ -62,7 +63,7 @@ catalog: archiver: ^7.0.1 autoprefixer: ^10.4.20 axios: ^1.7.7 - axios-mock-adapter: ^2.0.0 + axios-mock-adapter: ^2.1.0 cac: ^6.7.14 chalk: ^5.3.0 cheerio: 1.0.0 @@ -89,7 +90,7 @@ catalog: eslint-plugin-import-x: ^4.3.1 eslint-plugin-jsdoc: ^50.3.1 eslint-plugin-jsonc: ^2.16.0 - eslint-plugin-n: ^17.10.3 + eslint-plugin-n: ^17.11.1 eslint-plugin-no-only-tests: ^3.3.0 eslint-plugin-perfectionist: ^3.8.0 eslint-plugin-prettier: ^5.2.1 @@ -101,7 +102,7 @@ catalog: execa: ^9.4.0 find-up: ^7.0.0 get-port: ^7.1.0 - globals: ^15.10.0 + globals: ^15.11.0 h3: ^1.13.0 happy-dom: ^15.7.4 html-minifier-terser: ^7.2.0 @@ -126,7 +127,7 @@ catalog: postcss-antd-fixes: ^0.2.0 postcss-html: ^1.7.0 postcss-import: ^16.1.0 - postcss-preset-env: ^10.0.6 + postcss-preset-env: ^10.0.7 postcss-scss: ^4.0.9 prettier: ^3.3.3 prettier-plugin-tailwindcss: ^0.6.8 @@ -153,7 +154,7 @@ catalog: tailwindcss-animate: ^1.0.7 theme-colors: ^0.1.0 turbo: ^2.1.3 - typescript: ^5.6.2 + typescript: ^5.6.3 unbuild: ^2.0.0 unplugin-element-plus: ^0.8.0 vee-validate: ^4.13.2 @@ -173,7 +174,7 @@ catalog: vue-i18n: ^10.0.4 vue-router: ^4.4.5 vue-tsc: ^2.1.6 - vxe-pc-ui: ^4.2.18 + vxe-pc-ui: ^4.2.19 vxe-table: ^4.7.86 watermark-js-plus: ^1.5.7 zod: ^3.23.8