Browse Source

Merge branch 'main' into milletpeak-fontsize

pull/6909/head
milletpeak 2 months ago
committed by GitHub
parent
commit
1f1ba16ead
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 2
      apps/web-antd/src/views/dashboard/analytics/analytics-visits-sales.vue
  2. 2
      apps/web-ele/src/views/dashboard/analytics/analytics-visits-sales.vue
  3. 2
      apps/web-naive/src/views/dashboard/analytics/analytics-visits-sales.vue
  4. 5
      apps/web-tdesign/package.json
  5. 2
      apps/web-tdesign/src/views/dashboard/analytics/analytics-visits-sales.vue
  6. 1
      cspell.json
  7. 2
      docs/.vitepress/config/plugins/demo-preview.ts
  8. 2
      internal/lint-configs/commitlint-config/index.mjs
  9. 1
      internal/lint-configs/eslint-config/src/configs/command.ts
  10. 2
      internal/lint-configs/eslint-config/src/configs/node.ts
  11. 1
      internal/lint-configs/eslint-config/src/configs/perfectionist.ts
  12. 1
      internal/lint-configs/eslint-config/src/configs/turbo.ts
  13. 7
      internal/lint-configs/eslint-config/src/configs/typescript.ts
  14. 1
      internal/lint-configs/eslint-config/src/configs/vue.ts
  15. 3
      internal/lint-configs/eslint-config/tsconfig.json
  16. 1
      internal/tailwind-config/package.json
  17. 2
      internal/vite-config/src/config/application.ts
  18. 10
      package.json
  19. 2
      packages/@core/base/design/src/design-tokens/index.ts
  20. 2
      packages/@core/base/design/src/index.ts
  21. 8
      packages/@core/preferences/src/preferences.ts
  22. 18
      packages/@core/ui-kit/popup-ui/src/alert/AlertBuilder.ts
  23. 11
      packages/@core/ui-kit/popup-ui/src/modal/modal.vue
  24. 8
      packages/@core/ui-kit/popup-ui/src/modal/use-modal-draggable.ts
  25. 9
      packages/@core/ui-kit/shadcn-ui/src/ui/context-menu/ContextMenuSubContent.vue
  26. 9
      packages/@core/ui-kit/shadcn-ui/src/ui/dropdown-menu/DropdownMenuSubContent.vue
  27. 4
      packages/@core/ui-kit/shadcn-ui/src/ui/tree/tree.vue
  28. 10
      packages/effects/common-ui/src/components/icon-picker/icon-picker.vue
  29. 10
      packages/effects/common-ui/src/components/json-viewer/index.vue
  30. 10
      packages/effects/common-ui/src/components/resize/resize.vue
  31. 26
      packages/effects/hooks/src/use-pagination.ts
  32. 4
      packages/effects/layouts/src/basic/header/header.vue
  33. 2
      packages/effects/layouts/src/widgets/theme-toggle/theme-button.vue
  34. 2
      packages/stores/shim-pinia.d.ts
  35. 2
      packages/stores/src/modules/tabbar.ts
  36. 2
      packages/utils/src/helpers/generate-menus.ts
  37. 2
      playground/src/views/dashboard/analytics/analytics-visits-sales.vue
  38. 3
      playground/src/views/system/menu/modules/form.vue
  39. 1646
      pnpm-lock.yaml
  40. 30
      pnpm-workspace.yaml

2
apps/web-antd/src/views/dashboard/analytics/analytics-visits-sales.vue

@ -24,7 +24,7 @@ onMounted(() => {
{ name: '定制', value: 310 },
{ name: '技术支持', value: 274 },
{ name: '远程', value: 400 },
].sort((a, b) => {
].toSorted((a, b) => {
return a.value - b.value;
}),
name: '商业占比',

2
apps/web-ele/src/views/dashboard/analytics/analytics-visits-sales.vue

@ -24,7 +24,7 @@ onMounted(() => {
{ name: '定制', value: 310 },
{ name: '技术支持', value: 274 },
{ name: '远程', value: 400 },
].sort((a, b) => {
].toSorted((a, b) => {
return a.value - b.value;
}),
name: '商业占比',

2
apps/web-naive/src/views/dashboard/analytics/analytics-visits-sales.vue

@ -24,7 +24,7 @@ onMounted(() => {
{ name: '定制', value: 310 },
{ name: '技术支持', value: 274 },
{ name: '远程', value: 400 },
].sort((a, b) => {
].toSorted((a, b) => {
return a.value - b.value;
}),
name: '商业占比',

5
apps/web-tdesign/package.json

@ -44,11 +44,8 @@
"dayjs": "catalog:",
"es-toolkit": "catalog:",
"pinia": "catalog:",
"tdesign-vue-next": "^1.17.1",
"tdesign-vue-next": "catalog:",
"vue": "catalog:",
"vue-router": "catalog:"
},
"devDependencies": {
"@types/lodash-es": "^4.17.12"
}
}

2
apps/web-tdesign/src/views/dashboard/analytics/analytics-visits-sales.vue

@ -24,7 +24,7 @@ onMounted(() => {
{ name: '定制', value: 310 },
{ name: '技术支持', value: 274 },
{ name: '远程', value: 400 },
].sort((a, b) => {
].toSorted((a, b) => {
return a.value - b.value;
}),
name: '商业占比',

1
cspell.json

@ -42,6 +42,7 @@
"sortablejs",
"styl",
"taze",
"tdesign",
"ui-kit",
"uicons",
"unplugin",

2
docs/.vitepress/config/plugins/demo-preview.ts

@ -84,7 +84,7 @@ export const demoPreviewPlugin = (md: MarkdownRenderer) => {
return '';
}
const firstString = 'index.vue';
childFiles = childFiles.sort((a, b) => {
childFiles = childFiles.toSorted((a, b) => {
if (a === firstString) return -1;
if (b === firstString) return 1;
return a.localeCompare(b, 'en', { sensitivity: 'base' });

2
internal/lint-configs/commitlint-config/index.mjs

@ -21,7 +21,7 @@ const scopeComplete = execSync('git status --porcelain || true')
.trim()
.split('\n')
.find((r) => ~r.indexOf('M src'))
?.replace(/(\/)/g, '%%')
?.replaceAll(/(\/)/g, '%%')
?.match(/src%%((\w|-)*)/)?.[1]
?.replace(/s$/, '');

1
internal/lint-configs/eslint-config/src/configs/command.ts

@ -3,7 +3,6 @@ import createCommand from 'eslint-plugin-command/config';
export async function command() {
return [
{
// @ts-expect-error - no types
...createCommand(),
},
];

2
internal/lint-configs/eslint-config/src/configs/node.ts

@ -35,7 +35,7 @@ export async function node(): Promise<Linter.Config[]> {
'error',
{
ignores: [],
version: '>=18.0.0',
version: '>=20.12.0',
},
],
'n/prefer-global/buffer': ['error', 'never'],

1
internal/lint-configs/eslint-config/src/configs/perfectionist.ts

@ -4,7 +4,6 @@ import { interopDefault } from '../util';
export async function perfectionist(): Promise<Linter.Config[]> {
const perfectionistPlugin = await interopDefault(
// @ts-expect-error - no types
import('eslint-plugin-perfectionist'),
);

1
internal/lint-configs/eslint-config/src/configs/turbo.ts

@ -4,7 +4,6 @@ import { interopDefault } from '../util';
export async function turbo(): Promise<Linter.Config[]> {
const [pluginTurbo] = await Promise.all([
// @ts-expect-error - no types
interopDefault(import('eslint-config-turbo')),
] as const);

7
internal/lint-configs/eslint-config/src/configs/typescript.ts

@ -5,7 +5,6 @@ import { interopDefault } from '../util';
export async function typescript(): Promise<Linter.Config[]> {
const [pluginTs, parserTs] = await Promise.all([
interopDefault(import('@typescript-eslint/eslint-plugin')),
// @ts-expect-error missing types
interopDefault(import('@typescript-eslint/parser')),
] as const);
@ -27,11 +26,11 @@ export async function typescript(): Promise<Linter.Config[]> {
},
},
plugins: {
'@typescript-eslint': pluginTs,
'@typescript-eslint': pluginTs as any,
},
rules: {
...pluginTs.configs['eslint-recommended'].overrides?.[0].rules,
...pluginTs.configs.strict.rules,
...pluginTs.configs['eslint-recommended']?.overrides?.[0]?.rules,
...pluginTs.configs.strict?.rules,
'@typescript-eslint/ban-ts-comment': [
'error',
{

1
internal/lint-configs/eslint-config/src/configs/vue.ts

@ -6,7 +6,6 @@ export async function vue(): Promise<Linter.Config[]> {
const [pluginVue, parserVue, parserTs] = await Promise.all([
interopDefault(import('eslint-plugin-vue')),
interopDefault(import('vue-eslint-parser')),
// @ts-expect-error missing types
interopDefault(import('@typescript-eslint/parser')),
] as const);

3
internal/lint-configs/eslint-config/tsconfig.json

@ -1,6 +1,9 @@
{
"$schema": "https://json.schemastore.org/tsconfig",
"extends": "@vben/tsconfig/node.json",
"compilerOptions": {
"moduleResolution": "bundler"
},
"include": ["src"],
"exclude": ["node_modules"]
}

1
internal/tailwind-config/package.json

@ -53,6 +53,7 @@
"@tailwindcss/typography": "catalog:",
"autoprefixer": "catalog:",
"cssnano": "catalog:",
"jiti": "catalog:",
"postcss": "catalog:",
"postcss-antd-fixes": "catalog:",
"postcss-import": "catalog:",

2
internal/vite-config/src/config/application.ts

@ -114,7 +114,7 @@ function createCssOptions(injectGlobalScss = true): CSSOptions {
}
return content;
},
api: 'modern',
// api: 'modern',
importers: [new NodePackageImporter()],
},
}

10
package.json

@ -93,14 +93,14 @@
"unbuild": "catalog:",
"vite": "catalog:",
"vitest": "catalog:",
"vue": "^3.5.24",
"vue": "catalog:",
"vue-tsc": "catalog:"
},
"engines": {
"node": ">=20.10.0",
"pnpm": ">=9.12.0"
"node": ">=20.12.0",
"pnpm": ">=10.0.0"
},
"packageManager": "pnpm@10.21.0",
"packageManager": "pnpm@10.22.0",
"pnpm": {
"peerDependencyRules": {
"allowedVersions": {
@ -112,7 +112,7 @@
"@ctrl/tinycolor": "catalog:",
"clsx": "catalog:",
"esbuild": "0.25.3",
"jiti": "^2.6.1",
"jiti": "catalog:",
"pinia": "catalog:",
"vue": "catalog:"
},

2
packages/@core/base/design/src/design-tokens/index.ts

@ -1,4 +1,2 @@
import './default.css';
import './dark.css';
export {};

2
packages/@core/base/design/src/index.ts

@ -4,5 +4,3 @@ import './css/global.css';
import './css/transition.css';
import './css/nprogress.css';
import './css/ui.css';
export {};

8
packages/@core/preferences/src/preferences.ts

@ -224,12 +224,8 @@ class PreferenceManager {
const dom = document.documentElement;
const COLOR_WEAK = 'invert-mode';
const COLOR_GRAY = 'grayscale-mode';
colorWeakMode
? dom.classList.add(COLOR_WEAK)
: dom.classList.remove(COLOR_WEAK);
colorGrayMode
? dom.classList.add(COLOR_GRAY)
: dom.classList.remove(COLOR_GRAY);
dom.classList.toggle(COLOR_WEAK, colorWeakMode);
dom.classList.toggle(COLOR_GRAY, colorGrayMode);
}
}
}

18
packages/@core/ui-kit/popup-ui/src/alert/AlertBuilder.ts

@ -144,24 +144,26 @@ export async function vbenPrompt<T = any>(
const modelValue = ref<T | undefined>(defaultValue);
const inputComponentRef = ref<null | VNode>(null);
const staticContents: Component[] = [];
staticContents.push(h(VbenRenderContent, { content, renderBr: true }));
const staticContents: Component[] = [
h(VbenRenderContent, { content, renderBr: true }),
];
const modelPropName = _modelPropName || 'modelValue';
const componentProps = { ..._componentProps };
// 每次渲染时都会重新计算的内容函数
const contentRenderer = () => {
const currentProps = { ...componentProps };
const currentProps = {
...componentProps,
[modelPropName]: modelValue.value,
[`onUpdate:${modelPropName}`]: (val: T) => {
modelValue.value = val;
},
};
// 设置当前值
currentProps[modelPropName] = modelValue.value;
// 设置更新处理函数
currentProps[`onUpdate:${modelPropName}`] = (val: T) => {
modelValue.value = val;
};
// 创建输入组件
inputComponentRef.value = h(

11
packages/@core/ui-kit/popup-ui/src/modal/modal.vue

@ -104,6 +104,10 @@ const shouldDraggable = computed(
() => draggable.value && !shouldFullscreen.value && header.value,
);
const shouldCentered = computed(
() => centered.value && !shouldFullscreen.value,
);
const getAppendTo = computed(() => {
return appendToMain.value
? `#${ELEMENT_ID_MAIN_CONTENT}>div:not(.absolute)>div`
@ -115,6 +119,7 @@ const { dragging, transform } = useModalDraggable(
headerRef,
shouldDraggable,
getAppendTo,
shouldCentered,
);
const firstOpened = ref(false);
@ -132,7 +137,9 @@ watch(
dialogRef.value = innerContentRef.$el;
// reopen modal reassign value
const { offsetX, offsetY } = transform;
dialogRef.value.style.transform = `translate(${offsetX}px, ${offsetY}px)`;
dialogRef.value.style.transform = shouldCentered.value
? `translate(${offsetX}px, calc(-50% + ${offsetY}px))`
: `translate(${offsetX}px, ${offsetY}px)`;
}
},
{ immediate: true },
@ -239,7 +246,7 @@ function handleClosed() {
'shadow-3xl': !bordered,
'left-0 top-0 size-full max-h-full !translate-x-0 !translate-y-0':
shouldFullscreen,
'top-1/2 !-translate-y-1/2': centered && !shouldFullscreen,
'top-1/2': centered && !shouldFullscreen,
'duration-300': !dragging,
hidden: isClosed,
},

8
packages/@core/ui-kit/popup-ui/src/modal/use-modal-draggable.ts

@ -14,6 +14,7 @@ export function useModalDraggable(
dragRef: Ref<HTMLElement | undefined>,
draggable: ComputedRef<boolean>,
containerSelector?: ComputedRef<string | undefined>,
centered?: ComputedRef<boolean>,
) {
const transform = reactive({
offsetX: 0,
@ -73,7 +74,10 @@ export function useModalDraggable(
transform.offsetY = moveY;
if (targetRef.value) {
targetRef.value.style.transform = `translate(${moveX}px, ${moveY}px)`;
const isCentered = centered?.value;
targetRef.value.style.transform = isCentered
? `translate(${moveX}px, calc(-50% + ${moveY}px))`
: `translate(${moveX}px, ${moveY}px)`;
dragging.value = true;
}
};
@ -108,7 +112,7 @@ export function useModalDraggable(
const target = unrefElement(targetRef);
if (target) {
target.style.transform = 'none';
target.style.transform = '';
}
};

9
packages/@core/ui-kit/shadcn-ui/src/ui/context-menu/ContextMenuSubContent.vue

@ -27,7 +27,14 @@ const forwarded = useForwardPropsEmits(delegatedProps, emits);
v-bind="forwarded"
:class="
cn(
'z-50 min-w-32 overflow-hidden rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
'z-50 min-w-32 overflow-hidden rounded-md',
'border border-border',
'bg-popover p-1 text-popover-foreground shadow-lg',
'data-[state=open]:animate-in data-[state=closed]:animate-out',
'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',
'data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',
'data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2',
'data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
props.class,
)
"

9
packages/@core/ui-kit/shadcn-ui/src/ui/dropdown-menu/DropdownMenuSubContent.vue

@ -27,7 +27,14 @@ const forwarded = useForwardPropsEmits(delegatedProps, emits);
v-bind="forwarded"
:class="
cn(
'z-50 min-w-32 overflow-hidden rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
'z-50 min-w-32 overflow-hidden rounded-md',
'border border-border',
'bg-popover p-1 text-popover-foreground shadow-lg',
'data-[state=open]:animate-in data-[state=closed]:animate-out',
'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',
'data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',
'data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2',
'data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
props.class,
)
"

4
packages/@core/ui-kit/shadcn-ui/src/ui/tree/tree.vue

@ -220,7 +220,7 @@ function onSelect(item: FlattenedItem<Recordable<any>>, isSelected: boolean) {
);
})
?.parents?.filter((item) => !get(item, props.disabledField))
?.reverse()
?.toReversed()
.forEach((p) => {
const children = flattenData.value.filter((i) => {
return (
@ -380,7 +380,7 @@ defineExpose({
<div class="flex items-center gap-1">
<Checkbox
v-if="multiple"
:checked="isSelected && !isNodeDisabled(item)"
:model-value="isSelected && !isNodeDisabled(item)"
:disabled="isNodeDisabled(item)"
:indeterminate="isIndeterminate && !isNodeDisabled(item)"
@click="

10
packages/effects/common-ui/src/components/icon-picker/icon-picker.vue

@ -71,17 +71,10 @@ const modelValue = defineModel({ default: '', type: String });
const visible = ref(false);
const currentSelect = ref('');
const currentPage = ref(1);
const keyword = ref('');
const keywordDebounce = refDebounced(keyword, 300);
const innerIcons = ref<string[]>([]);
/* 当检索关键词变化时,重置分页 */
watch(keywordDebounce, () => {
currentPage.value = 1;
setCurrentPage(1);
});
watchDebounced(
() => props.prefix,
async (prefix) => {
@ -122,7 +115,7 @@ const showList = computed(() => {
);
});
const { paginationList, total, setCurrentPage } = usePagination(
const { paginationList, total, setCurrentPage, currentPage } = usePagination(
showList,
props.pageSize,
);
@ -145,7 +138,6 @@ const handleClick = (icon: string) => {
};
const handlePageChange = (page: number) => {
currentPage.value = page;
setCurrentPage(page);
};

10
packages/effects/common-ui/src/components/json-viewer/index.vue

@ -55,16 +55,12 @@ function handleClick(event: MouseEvent) {
return;
}
const param: JsonViewerValue = {
path: '',
value: '',
depth: 0,
el: event.target,
path: pathNode.getAttribute('path') || '',
depth: Number(pathNode.getAttribute('depth')) || 0,
value: event.target.textContent || undefined,
};
param.path = pathNode.getAttribute('path') || '';
param.depth = Number(pathNode.getAttribute('depth')) || 0;
param.value = event.target.textContent || undefined;
param.value = JSON.parse(param.value);
emit('valueClick', param);
}

10
packages/effects/common-ui/src/components/resize/resize.vue

@ -618,13 +618,11 @@ const stickStyles = computed(() => (stick: string) => {
const stickStyle = {
width: `${stickSize.value / parentScaleX.value}px`,
height: `${stickSize.value / parentScaleY.value}px`,
[styleMapping.y[stick[0] as 'b' | 'm' | 't'] as 'height' | 'width']:
`${stickSize.value / parentScaleX.value / -2}px`,
[styleMapping.x[stick[1] as 'l' | 'm' | 'r'] as 'height' | 'width']:
`${stickSize.value / parentScaleX.value / -2}px`,
};
stickStyle[
styleMapping.y[stick[0] as 'b' | 'm' | 't'] as 'height' | 'width'
] = `${stickSize.value / parentScaleX.value / -2}px`;
stickStyle[
styleMapping.x[stick[1] as 'l' | 'm' | 'r'] as 'height' | 'width'
] = `${stickSize.value / parentScaleX.value / -2}px`;
return stickStyle;
});

26
packages/effects/hooks/src/use-pagination.ts

@ -1,6 +1,6 @@
import type { Ref } from 'vue';
import { computed, ref, unref } from 'vue';
import { computed, ref, unref, watch } from 'vue';
/**
* Paginates an array of items
@ -22,7 +22,11 @@ function pagination<T = any>(list: T[], pageNo: number, pageSize: number): T[] {
return ret;
}
export function usePagination<T = any>(list: Ref<T[]>, pageSize: number) {
export function usePagination<T = any>(
list: Ref<T[]>,
pageSize: number,
totalChangeToFirstPage = true,
) {
const currentPage = ref(1);
const pageSizeRef = ref(pageSize);
@ -38,11 +42,21 @@ export function usePagination<T = any>(list: Ref<T[]>, pageSize: number) {
return unref(list).length;
});
if (totalChangeToFirstPage) {
watch(total, () => {
setCurrentPage(1);
});
}
function setCurrentPage(page: number) {
if (page < 1 || page > unref(totalPages)) {
throw new Error('Invalid page number');
if (page === 1 && unref(totalPages) === 0) {
currentPage.value = 1;
} else {
if (page < 1 || page > unref(totalPages)) {
throw new Error('Invalid page number');
}
currentPage.value = page;
}
currentPage.value = page;
}
function setPageSize(pageSize: number) {
@ -54,5 +68,5 @@ export function usePagination<T = any>(list: Ref<T[]>, pageSize: number) {
currentPage.value = 1;
}
return { setCurrentPage, total, setPageSize, paginationList };
return { setCurrentPage, total, setPageSize, paginationList, currentPage };
}

4
packages/effects/layouts/src/basic/header/header.vue

@ -92,7 +92,7 @@ const rightSlots = computed(() => {
list.push({ index: Number(name[2]), name: key });
}
});
return list.sort((a, b) => a.index - b.index);
return list.toSorted((a, b) => a.index - b.index);
});
const leftSlots = computed(() => {
@ -111,7 +111,7 @@ const leftSlots = computed(() => {
list.push({ index: Number(name[2]), name: key });
}
});
return list.sort((a, b) => a.index - b.index);
return list.toSorted((a, b) => a.index - b.index);
});
function clearPreferencesAndLogout() {

2
packages/effects/layouts/src/widgets/theme-toggle/theme-button.vue

@ -66,7 +66,7 @@ function toggleTheme(event: MouseEvent) {
];
const animate = document.documentElement.animate(
{
clipPath: isDark.value ? [...clipPath].reverse() : clipPath,
clipPath: isDark.value ? [...clipPath].toReversed() : clipPath,
},
{
duration: 450,

2
packages/stores/shim-pinia.d.ts

@ -6,4 +6,4 @@ declare module 'pinia' {
): (newModule: any) => any;
}
export {};
export { acceptHMRUpdate };

2
packages/stores/src/modules/tabbar.ts

@ -504,7 +504,7 @@ export const useTabbarStore = defineStore('core-tabbar', {
affixTabs(): TabDefinition[] {
const affixTabs = this.tabs.filter((tab) => isAffixTab(tab));
return affixTabs.sort((a, b) => {
return affixTabs.toSorted((a, b) => {
const orderA = (a.meta?.affixTabOrder ?? 0) as number;
const orderB = (b.meta?.affixTabOrder ?? 0) as number;
return orderA - orderB;

2
packages/utils/src/helpers/generate-menus.ts

@ -81,7 +81,7 @@ function generateMenus(
});
// 对菜单进行排序,避免order=0时被替换成999的问题
menus = menus.sort((a, b) => (a?.order ?? 999) - (b?.order ?? 999));
menus = menus.toSorted((a, b) => (a?.order ?? 999) - (b?.order ?? 999));
// 过滤掉隐藏的菜单项
return filterTree(menus, (menu) => !!menu.show);

2
playground/src/views/dashboard/analytics/analytics-visits-sales.vue

@ -24,7 +24,7 @@ onMounted(() => {
{ name: '定制', value: 310 },
{ name: '技术支持', value: 274 },
{ name: '远程', value: 400 },
].sort((a, b) => {
].toSorted((a, b) => {
return a.value - b.value;
}),
name: '商业占比',

3
playground/src/views/system/menu/modules/form.vue

@ -107,7 +107,7 @@ const schema: VbenFormSchema[] = [
componentProps() {
//
return {
addonAfter: titleSuffix.value,
...(titleSuffix.value && { addonAfter: titleSuffix.value }),
onChange({ target: { value } }: ChangeEvent) {
titleSuffix.value = value && $te(value) ? $t(value) : undefined;
},
@ -442,7 +442,6 @@ const [Form, formApi] = useVbenForm({
showDefaultActions: false,
wrapperClass: 'grid-cols-2 gap-x-4',
});
const [Drawer, drawerApi] = useVbenDrawer({
onConfirm: onSubmit,
onOpenChange(isOpen) {

1646
pnpm-lock.yaml

File diff suppressed because it is too large

30
pnpm-workspace.yaml

@ -22,7 +22,7 @@ catalog:
'@commitlint/cli': ^19.8.1
'@commitlint/config-conventional': ^19.8.1
'@ctrl/tinycolor': ^4.1.0
'@eslint/js': ^9.30.1
'@eslint/js': ^9.39.1
'@faker-js/faker': ^9.9.0
'@iconify/json': ^2.2.406
'@iconify/tailwind': ^1.2.0
@ -90,22 +90,22 @@ catalog:
dotenv: ^16.6.1
echarts: ^6.0.0
element-plus: ^2.10.2
eslint: ^9.30.1
eslint: ^9.39.1
eslint-config-turbo: ^2.6.1
eslint-plugin-command: ^3.3.1
eslint-plugin-eslint-comments: ^3.2.0
eslint-plugin-import-x: ^4.16.1
eslint-plugin-jsdoc: ^50.8.0
eslint-plugin-jsonc: ^2.20.1
eslint-plugin-n: ^17.20.0
eslint-plugin-jsdoc: ^61.2.1
eslint-plugin-jsonc: ^2.21.0
eslint-plugin-n: ^17.23.1
eslint-plugin-no-only-tests: ^3.3.0
eslint-plugin-perfectionist: ^4.15.0
eslint-plugin-prettier: ^5.5.1
eslint-plugin-regexp: ^2.9.0
eslint-plugin-unicorn: ^59.0.1
eslint-plugin-unused-imports: ^4.1.4
eslint-plugin-perfectionist: ^4.15.1
eslint-plugin-prettier: ^5.5.4
eslint-plugin-regexp: ^2.10.0
eslint-plugin-unicorn: ^62.0.0
eslint-plugin-unused-imports: ^4.3.0
eslint-plugin-vitest: ^0.5.4
eslint-plugin-vue: ^10.2.0
eslint-plugin-vue: ^10.5.1
execa: ^9.6.0
find-up: ^7.0.0
get-port: ^7.1.0
@ -114,8 +114,9 @@ catalog:
happy-dom: ^17.6.3
html-minifier-terser: ^7.2.0
is-ci: ^4.1.0
jiti: ^2.6.1
json-bigint: ^1.0.0
jsonc-eslint-parser: ^2.4.0
jsonc-eslint-parser: ^2.4.1
jsonwebtoken: ^9.0.2
lefthook: ^1.13.6
lodash.clonedeep: ^4.5.0
@ -163,6 +164,7 @@ catalog:
tailwind-merge: ^2.6.0
tailwindcss: ^3.4.18
tailwindcss-animate: ^1.0.7
tdesign-vue-next: ^1.17.1
theme-colors: ^0.1.0
tippy.js: ^6.3.7
turbo: ^2.6.1
@ -176,7 +178,7 @@ catalog:
vite-plugin-html: ^3.2.2
vite-plugin-lazy-import: ^1.0.7
vite-plugin-pwa: ^1.0.1
vite-plugin-vue-devtools: ^7.7.7
vite-plugin-vue-devtools: ^8.0.3
vitepress: ^1.6.3
vitepress-plugin-group-icons: ^1.6.1
vitest: ^3.2.4
@ -186,7 +188,7 @@ catalog:
vue-json-viewer: ^3.0.4
vue-router: ^4.5.1
vue-tippy: ^6.7.1
vue-tsc: 2.2.10
vue-tsc: ^3.1.4
vxe-pc-ui: ^4.10.22
vxe-table: ^4.17.14
watermark-js-plus: ^1.6.2

Loading…
Cancel
Save