Merge branch 'main' of https://github.com/vbenjs/vue-vben-admin
This commit is contained in:
commit
e01bd218b9
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/web-antd",
|
"name": "@vben/web-antd",
|
||||||
"version": "5.3.0",
|
"version": "5.3.1",
|
||||||
"homepage": "https://vben.pro",
|
"homepage": "https://vben.pro",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/web-ele",
|
"name": "@vben/web-ele",
|
||||||
"version": "5.3.0",
|
"version": "5.3.1",
|
||||||
"homepage": "https://vben.pro",
|
"homepage": "https://vben.pro",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/web-naive",
|
"name": "@vben/web-naive",
|
||||||
"version": "5.3.0",
|
"version": "5.3.1",
|
||||||
"homepage": "https://vben.pro",
|
"homepage": "https://vben.pro",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/docs",
|
"name": "@vben/docs",
|
||||||
"version": "5.3.0",
|
"version": "5.3.1",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "vitepress build",
|
"build": "vitepress build",
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/commitlint-config",
|
"name": "@vben/commitlint-config",
|
||||||
"version": "5.3.0",
|
"version": "5.3.1",
|
||||||
"private": true,
|
"private": true,
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
|
@ -15,10 +15,17 @@ const customConfig: Linter.Config[] = [
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
files: ['packages/effects/**/**', 'packages/types/**/**'],
|
files: [
|
||||||
|
'apps/**/**',
|
||||||
|
'packages/effects/**/**',
|
||||||
|
'packages/utils/**/**',
|
||||||
|
'packages/types/**/**',
|
||||||
|
'packages/locales/**/**',
|
||||||
|
],
|
||||||
ignores: restrictedImportIgnores,
|
ignores: restrictedImportIgnores,
|
||||||
rules: {
|
rules: {
|
||||||
'perfectionist/sort-interfaces': 'off',
|
'perfectionist/sort-interfaces': 'off',
|
||||||
|
'perfectionist/sort-objects': 'off',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/stylelint-config",
|
"name": "@vben/stylelint-config",
|
||||||
"version": "5.3.0",
|
"version": "5.3.1",
|
||||||
"private": true,
|
"private": true,
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/node-utils",
|
"name": "@vben/node-utils",
|
||||||
"version": "5.3.0",
|
"version": "5.3.1",
|
||||||
"private": true,
|
"private": true,
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/tailwind-config",
|
"name": "@vben/tailwind-config",
|
||||||
"version": "5.3.0",
|
"version": "5.3.1",
|
||||||
"private": true,
|
"private": true,
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/tsconfig",
|
"name": "@vben/tsconfig",
|
||||||
"version": "5.3.0",
|
"version": "5.3.1",
|
||||||
"private": true,
|
"private": true,
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/vite-config",
|
"name": "@vben/vite-config",
|
||||||
"version": "5.3.0",
|
"version": "5.3.1",
|
||||||
"private": true,
|
"private": true,
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "vben-admin-pro",
|
"name": "vben-admin-pro",
|
||||||
"version": "5.3.0",
|
"version": "5.3.1",
|
||||||
"private": true,
|
"private": true,
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"monorepo",
|
"monorepo",
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben-core/design",
|
"name": "@vben-core/design",
|
||||||
"version": "5.3.0",
|
"version": "5.3.1",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben-core/icons",
|
"name": "@vben-core/icons",
|
||||||
"version": "5.3.0",
|
"version": "5.3.1",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben-core/shared",
|
"name": "@vben-core/shared",
|
||||||
"version": "5.3.0",
|
"version": "5.3.1",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { describe, expect, it } from 'vitest';
|
import { describe, expect, it } from 'vitest';
|
||||||
|
|
||||||
import { bindMethods } from '../util';
|
import { bindMethods, getNestedValue } from '../util';
|
||||||
|
|
||||||
class TestClass {
|
class TestClass {
|
||||||
public value: string;
|
public value: string;
|
||||||
@ -78,3 +78,79 @@ describe('bindMethods', () => {
|
|||||||
expect(value).toBe('test');
|
expect(value).toBe('test');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('getNestedValue', () => {
|
||||||
|
interface UserProfile {
|
||||||
|
age: number;
|
||||||
|
name: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface UserSettings {
|
||||||
|
theme: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Data {
|
||||||
|
user: {
|
||||||
|
profile: UserProfile;
|
||||||
|
settings: UserSettings;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const data: Data = {
|
||||||
|
user: {
|
||||||
|
profile: {
|
||||||
|
age: 25,
|
||||||
|
name: 'Alice',
|
||||||
|
},
|
||||||
|
settings: {
|
||||||
|
theme: 'dark',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
it('should get a nested value when the path is valid', () => {
|
||||||
|
const result = getNestedValue(data, 'user.profile.name');
|
||||||
|
expect(result).toBe('Alice');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return undefined for non-existent property', () => {
|
||||||
|
const result = getNestedValue(data, 'user.profile.gender');
|
||||||
|
expect(result).toBeUndefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return undefined when accessing a non-existent deep path', () => {
|
||||||
|
const result = getNestedValue(data, 'user.nonexistent.field');
|
||||||
|
expect(result).toBeUndefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return undefined if a middle level is undefined', () => {
|
||||||
|
const result = getNestedValue({ user: undefined }, 'user.profile.name');
|
||||||
|
expect(result).toBeUndefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return the correct value for a nested setting', () => {
|
||||||
|
const result = getNestedValue(data, 'user.settings.theme');
|
||||||
|
expect(result).toBe('dark');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should work for a single-level path', () => {
|
||||||
|
const result = getNestedValue({ a: 1, b: 2 }, 'b');
|
||||||
|
expect(result).toBe(2);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return the entire object if path is empty', () => {
|
||||||
|
expect(() => getNestedValue(data, '')()).toThrow();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle paths with array indexes', () => {
|
||||||
|
const complexData = { list: [{ name: 'Item1' }, { name: 'Item2' }] };
|
||||||
|
const result = getNestedValue(complexData, 'list.1.name');
|
||||||
|
expect(result).toBe('Item2');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return undefined when accessing an out-of-bounds array index', () => {
|
||||||
|
const complexData = { list: [{ name: 'Item1' }] };
|
||||||
|
const result = getNestedValue(complexData, 'list.2.name');
|
||||||
|
expect(result).toBeUndefined();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
@ -1 +1,10 @@
|
|||||||
|
import { createDefu } from 'defu';
|
||||||
|
|
||||||
export { createDefu as createMerge, defu as merge } from 'defu';
|
export { createDefu as createMerge, defu as merge } from 'defu';
|
||||||
|
|
||||||
|
export const mergeWithArrayOverride = createDefu((originObj, key, updates) => {
|
||||||
|
if (Array.isArray(originObj[key]) && Array.isArray(updates)) {
|
||||||
|
originObj[key] = updates;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
@ -17,3 +17,28 @@ export function bindMethods<T extends object>(instance: T): void {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取嵌套对象的字段值
|
||||||
|
* @param obj - 要查找的对象
|
||||||
|
* @param path - 用于查找字段的路径,使用小数点分隔
|
||||||
|
* @returns 字段值,或者未找到时返回 undefined
|
||||||
|
*/
|
||||||
|
export function getNestedValue<T>(obj: T, path: string): any {
|
||||||
|
if (typeof path !== 'string' || path.length === 0) {
|
||||||
|
throw new Error('Path must be a non-empty string');
|
||||||
|
}
|
||||||
|
// 把路径字符串按 "." 分割成数组
|
||||||
|
const keys = path.split('.') as (number | string)[];
|
||||||
|
|
||||||
|
let current: any = obj;
|
||||||
|
|
||||||
|
for (const key of keys) {
|
||||||
|
if (current === null || current === undefined) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
current = current[key as keyof typeof current];
|
||||||
|
}
|
||||||
|
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben-core/typings",
|
"name": "@vben-core/typings",
|
||||||
"version": "5.3.0",
|
"version": "5.3.1",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben-core/composables",
|
"name": "@vben-core/composables",
|
||||||
"version": "5.3.0",
|
"version": "5.3.1",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
@ -2,8 +2,8 @@ import { getScrollbarWidth, needsScrollbar } from '@vben-core/shared/utils';
|
|||||||
|
|
||||||
import {
|
import {
|
||||||
useScrollLock as _useScrollLock,
|
useScrollLock as _useScrollLock,
|
||||||
tryOnBeforeMount,
|
|
||||||
tryOnBeforeUnmount,
|
tryOnBeforeUnmount,
|
||||||
|
tryOnMounted,
|
||||||
} from '@vueuse/core';
|
} from '@vueuse/core';
|
||||||
|
|
||||||
export const SCROLL_FIXED_CLASS = `_scroll__fixed_`;
|
export const SCROLL_FIXED_CLASS = `_scroll__fixed_`;
|
||||||
@ -12,7 +12,7 @@ export function useScrollLock() {
|
|||||||
const isLocked = _useScrollLock(document.body);
|
const isLocked = _useScrollLock(document.body);
|
||||||
const scrollbarWidth = getScrollbarWidth();
|
const scrollbarWidth = getScrollbarWidth();
|
||||||
|
|
||||||
tryOnBeforeMount(() => {
|
tryOnMounted(() => {
|
||||||
if (!needsScrollbar()) {
|
if (!needsScrollbar()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben-core/preferences",
|
"name": "@vben-core/preferences",
|
||||||
"version": "5.3.0",
|
"version": "5.3.1",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
@ -1,24 +1,7 @@
|
|||||||
// 假设这个文件为 FormApi.ts
|
|
||||||
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
||||||
|
|
||||||
import { FormApi } from '../src/form-api';
|
import { FormApi } from '../src/form-api';
|
||||||
|
|
||||||
vi.mock('@vben-core/shared/utils', () => ({
|
|
||||||
bindMethods: vi.fn(),
|
|
||||||
createMerge: vi.fn((mergeFn) => {
|
|
||||||
return (stateOrFn: any, prev: any) => {
|
|
||||||
mergeFn(prev, 'key', stateOrFn);
|
|
||||||
return { ...prev, ...stateOrFn };
|
|
||||||
};
|
|
||||||
}),
|
|
||||||
isFunction: (fn: any) => typeof fn === 'function',
|
|
||||||
StateHandler: vi.fn().mockImplementation(() => ({
|
|
||||||
reset: vi.fn(),
|
|
||||||
setConditionTrue: vi.fn(),
|
|
||||||
waitForCondition: vi.fn().mockResolvedValue(true),
|
|
||||||
})),
|
|
||||||
}));
|
|
||||||
|
|
||||||
describe('formApi', () => {
|
describe('formApi', () => {
|
||||||
let formApi: FormApi;
|
let formApi: FormApi;
|
||||||
|
|
||||||
@ -128,7 +111,6 @@ describe('formApi', () => {
|
|||||||
it('should unmount form and reset state', () => {
|
it('should unmount form and reset state', () => {
|
||||||
formApi.unmounted();
|
formApi.unmounted();
|
||||||
expect(formApi.isMounted).toBe(false);
|
expect(formApi.isMounted).toBe(false);
|
||||||
expect(formApi.stateHandler.reset).toHaveBeenCalled();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should validate form', async () => {
|
it('should validate form', async () => {
|
||||||
|
@ -12,20 +12,13 @@ import { toRaw } from 'vue';
|
|||||||
import { Store } from '@vben-core/shared/store';
|
import { Store } from '@vben-core/shared/store';
|
||||||
import {
|
import {
|
||||||
bindMethods,
|
bindMethods,
|
||||||
createMerge,
|
|
||||||
isFunction,
|
isFunction,
|
||||||
|
mergeWithArrayOverride,
|
||||||
StateHandler,
|
StateHandler,
|
||||||
} from '@vben-core/shared/utils';
|
} from '@vben-core/shared/utils';
|
||||||
|
|
||||||
import { objectPick } from '@vueuse/core';
|
import { objectPick } from '@vueuse/core';
|
||||||
|
|
||||||
const merge = createMerge((originObj, key, updates) => {
|
|
||||||
if (Array.isArray(originObj[key]) && Array.isArray(updates)) {
|
|
||||||
originObj[key] = updates;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
function getDefaultState(): VbenFormProps {
|
function getDefaultState(): VbenFormProps {
|
||||||
return {
|
return {
|
||||||
actionWrapperClass: '',
|
actionWrapperClass: '',
|
||||||
@ -218,10 +211,10 @@ export class FormApi {
|
|||||||
) {
|
) {
|
||||||
if (isFunction(stateOrFn)) {
|
if (isFunction(stateOrFn)) {
|
||||||
this.store.setState((prev) => {
|
this.store.setState((prev) => {
|
||||||
return merge(stateOrFn(prev), prev);
|
return mergeWithArrayOverride(stateOrFn(prev), prev);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
this.store.setState((prev) => merge(stateOrFn, prev));
|
this.store.setState((prev) => mergeWithArrayOverride(stateOrFn, prev));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -287,7 +280,10 @@ export class FormApi {
|
|||||||
currentSchema.forEach((schema, index) => {
|
currentSchema.forEach((schema, index) => {
|
||||||
const updatedData = updatedMap[schema.fieldName];
|
const updatedData = updatedMap[schema.fieldName];
|
||||||
if (updatedData) {
|
if (updatedData) {
|
||||||
currentSchema[index] = merge(updatedData, schema) as FormSchema;
|
currentSchema[index] = mergeWithArrayOverride(
|
||||||
|
updatedData,
|
||||||
|
schema,
|
||||||
|
) as FormSchema;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
this.setState({ schema: currentSchema });
|
this.setState({ schema: currentSchema });
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben-core/layout-ui",
|
"name": "@vben-core/layout-ui",
|
||||||
"version": "5.3.0",
|
"version": "5.3.1",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben-core/menu-ui",
|
"name": "@vben-core/menu-ui",
|
||||||
"version": "5.3.0",
|
"version": "5.3.1",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import type { DrawerProps, ExtendedDrawerApi } from './drawer';
|
import type { DrawerProps, ExtendedDrawerApi } from './drawer';
|
||||||
|
|
||||||
import { ref, watch } from 'vue';
|
import { provide, ref, useId, watch } from 'vue';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
useIsMobile,
|
useIsMobile,
|
||||||
@ -33,9 +33,13 @@ const props = withDefaults(defineProps<Props>(), {
|
|||||||
drawerApi: undefined,
|
drawerApi: undefined,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const id = useId();
|
||||||
|
provide('DISMISSABLE_DRAWER_ID', id);
|
||||||
|
|
||||||
const wrapperRef = ref<HTMLElement>();
|
const wrapperRef = ref<HTMLElement>();
|
||||||
const { $t } = useSimpleLocale();
|
const { $t } = useSimpleLocale();
|
||||||
const { isMobile } = useIsMobile();
|
const { isMobile } = useIsMobile();
|
||||||
|
|
||||||
const state = props.drawerApi?.useStore?.();
|
const state = props.drawerApi?.useStore?.();
|
||||||
|
|
||||||
const {
|
const {
|
||||||
@ -83,8 +87,8 @@ function escapeKeyDown(e: KeyboardEvent) {
|
|||||||
// pointer-down-outside
|
// pointer-down-outside
|
||||||
function pointerDownOutside(e: Event) {
|
function pointerDownOutside(e: Event) {
|
||||||
const target = e.target as HTMLElement;
|
const target = e.target as HTMLElement;
|
||||||
const dismissableDrawer = !!target?.dataset.dismissableDrawer;
|
const dismissableDrawer = target?.dataset.dismissableDrawer;
|
||||||
if (!closeOnClickModal.value || !dismissableDrawer) {
|
if (!closeOnClickModal.value || dismissableDrawer !== id) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import type { ExtendedModalApi, ModalProps } from './modal';
|
import type { ExtendedModalApi, ModalProps } from './modal';
|
||||||
|
|
||||||
import { computed, nextTick, ref, watch } from 'vue';
|
import { computed, nextTick, provide, ref, useId, watch } from 'vue';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
useIsMobile,
|
useIsMobile,
|
||||||
@ -40,6 +40,10 @@ const dialogRef = ref();
|
|||||||
const headerRef = ref();
|
const headerRef = ref();
|
||||||
const footerRef = ref();
|
const footerRef = ref();
|
||||||
|
|
||||||
|
const id = useId();
|
||||||
|
|
||||||
|
provide('DISMISSABLE_MODAL_ID', id);
|
||||||
|
|
||||||
const { $t } = useSimpleLocale();
|
const { $t } = useSimpleLocale();
|
||||||
const { isMobile } = useIsMobile();
|
const { isMobile } = useIsMobile();
|
||||||
const state = props.modalApi?.useStore?.();
|
const state = props.modalApi?.useStore?.();
|
||||||
@ -141,8 +145,8 @@ function handerOpenAutoFocus(e: Event) {
|
|||||||
// pointer-down-outside
|
// pointer-down-outside
|
||||||
function pointerDownOutside(e: Event) {
|
function pointerDownOutside(e: Event) {
|
||||||
const target = e.target as HTMLElement;
|
const target = e.target as HTMLElement;
|
||||||
const isDismissableModal = !!target?.dataset.dismissableModal;
|
const isDismissableModal = target?.dataset.dismissableModal;
|
||||||
if (!closeOnClickModal.value || !isDismissableModal) {
|
if (!closeOnClickModal.value || isDismissableModal !== id) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben-core/shadcn-ui",
|
"name": "@vben-core/shadcn-ui",
|
||||||
"version": "5.3.0",
|
"version": "5.3.1",
|
||||||
"#main": "./dist/index.mjs",
|
"#main": "./dist/index.mjs",
|
||||||
"#module": "./dist/index.mjs",
|
"#module": "./dist/index.mjs",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
|
@ -1,11 +1,14 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
import { inject } from 'vue';
|
||||||
|
|
||||||
import { useScrollLock } from '@vben-core/composables';
|
import { useScrollLock } from '@vben-core/composables';
|
||||||
|
|
||||||
useScrollLock();
|
useScrollLock();
|
||||||
|
const id = inject('DISMISSABLE_MODAL_ID');
|
||||||
</script>
|
</script>
|
||||||
<template>
|
<template>
|
||||||
<div
|
<div
|
||||||
|
:data-dismissable-modal="id"
|
||||||
class="bg-overlay fixed inset-0 z-[1000]"
|
class="bg-overlay fixed inset-0 z-[1000]"
|
||||||
data-dismissable-modal="true"
|
|
||||||
></div>
|
></div>
|
||||||
</template>
|
</template>
|
||||||
|
@ -1,11 +1,14 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
import { inject } from 'vue';
|
||||||
|
|
||||||
import { useScrollLock } from '@vben-core/composables';
|
import { useScrollLock } from '@vben-core/composables';
|
||||||
|
|
||||||
useScrollLock();
|
useScrollLock();
|
||||||
|
const id = inject('DISMISSABLE_DRAWER_ID');
|
||||||
</script>
|
</script>
|
||||||
<template>
|
<template>
|
||||||
<div
|
<div
|
||||||
|
:data-dismissable-drawer="id"
|
||||||
class="bg-overlay fixed inset-0 z-[1000]"
|
class="bg-overlay fixed inset-0 z-[1000]"
|
||||||
data-dismissable-drawer="true"
|
|
||||||
></div>
|
></div>
|
||||||
</template>
|
</template>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben-core/tabs-ui",
|
"name": "@vben-core/tabs-ui",
|
||||||
"version": "5.3.0",
|
"version": "5.3.1",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/constants",
|
"name": "@vben/constants",
|
||||||
"version": "5.3.0",
|
"version": "5.3.1",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/access",
|
"name": "@vben/access",
|
||||||
"version": "5.3.0",
|
"version": "5.3.1",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/common-ui",
|
"name": "@vben/common-ui",
|
||||||
"version": "5.3.0",
|
"version": "5.3.1",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/hooks",
|
"name": "@vben/hooks",
|
||||||
"version": "5.3.0",
|
"version": "5.3.1",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/layouts",
|
"name": "@vben/layouts",
|
||||||
"version": "5.3.0",
|
"version": "5.3.1",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
@ -20,6 +20,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@vben-core/composables": "workspace:*",
|
||||||
"@vben-core/form-ui": "workspace:*",
|
"@vben-core/form-ui": "workspace:*",
|
||||||
"@vben-core/layout-ui": "workspace:*",
|
"@vben-core/layout-ui": "workspace:*",
|
||||||
"@vben-core/menu-ui": "workspace:*",
|
"@vben-core/menu-ui": "workspace:*",
|
||||||
|
@ -4,6 +4,7 @@ import { computed, reactive, ref } from 'vue';
|
|||||||
import { LockKeyhole } from '@vben/icons';
|
import { LockKeyhole } from '@vben/icons';
|
||||||
import { $t, useI18n } from '@vben/locales';
|
import { $t, useI18n } from '@vben/locales';
|
||||||
import { storeToRefs, useLockStore } from '@vben/stores';
|
import { storeToRefs, useLockStore } from '@vben/stores';
|
||||||
|
import { useScrollLock } from '@vben-core/composables';
|
||||||
import { useVbenForm, z } from '@vben-core/form-ui';
|
import { useVbenForm, z } from '@vben-core/form-ui';
|
||||||
import { VbenAvatar, VbenButton } from '@vben-core/shadcn-ui';
|
import { VbenAvatar, VbenButton } from '@vben-core/shadcn-ui';
|
||||||
|
|
||||||
@ -74,6 +75,8 @@ async function handleSubmit() {
|
|||||||
function toggleUnlockForm() {
|
function toggleUnlockForm() {
|
||||||
showUnlockForm.value = !showUnlockForm.value;
|
showUnlockForm.value = !showUnlockForm.value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
useScrollLock();
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/plugins",
|
"name": "@vben/plugins",
|
||||||
"version": "5.3.0",
|
"version": "5.3.1",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/request",
|
"name": "@vben/request",
|
||||||
"version": "5.3.0",
|
"version": "5.3.1",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/icons",
|
"name": "@vben/icons",
|
||||||
"version": "5.3.0",
|
"version": "5.3.1",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/locales",
|
"name": "@vben/locales",
|
||||||
"version": "5.3.0",
|
"version": "5.3.1",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/preferences",
|
"name": "@vben/preferences",
|
||||||
"version": "5.3.0",
|
"version": "5.3.1",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/stores",
|
"name": "@vben/stores",
|
||||||
"version": "5.3.0",
|
"version": "5.3.1",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/styles",
|
"name": "@vben/styles",
|
||||||
"version": "5.3.0",
|
"version": "5.3.1",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/types",
|
"name": "@vben/types",
|
||||||
"version": "5.3.0",
|
"version": "5.3.1",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/utils",
|
"name": "@vben/utils",
|
||||||
"version": "5.3.0",
|
"version": "5.3.1",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/playground",
|
"name": "@vben/playground",
|
||||||
"version": "5.3.0",
|
"version": "5.3.1",
|
||||||
"homepage": "https://vben.pro",
|
"homepage": "https://vben.pro",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
@ -1588,6 +1588,9 @@ importers:
|
|||||||
|
|
||||||
packages/effects/layouts:
|
packages/effects/layouts:
|
||||||
dependencies:
|
dependencies:
|
||||||
|
'@vben-core/composables':
|
||||||
|
specifier: workspace:*
|
||||||
|
version: link:../../@core/composables
|
||||||
'@vben-core/form-ui':
|
'@vben-core/form-ui':
|
||||||
specifier: workspace:*
|
specifier: workspace:*
|
||||||
version: link:../../@core/ui-kit/form-ui
|
version: link:../../@core/ui-kit/form-ui
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/turbo-run",
|
"name": "@vben/turbo-run",
|
||||||
"version": "5.3.0",
|
"version": "5.3.1",
|
||||||
"private": true,
|
"private": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/vsh",
|
"name": "@vben/vsh",
|
||||||
"version": "5.3.0",
|
"version": "5.3.1",
|
||||||
"private": true,
|
"private": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
Loading…
Reference in New Issue
Block a user