@antdv-vue/pro-utils 0.0.0-stage → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +123 -0
- package/README.md +80 -2
- package/dist/autoFocusToFirstChild/index.d.ts +9 -0
- package/dist/autoFocusToFirstChild/index.js +36 -0
- package/dist/childrenToArray/index.d.ts +7 -0
- package/dist/childrenToArray/index.js +8 -0
- package/dist/components/CopyToClipboard/copy/index.d.ts +10 -0
- package/dist/components/CopyToClipboard/copy/index.js +84 -0
- package/dist/components/CopyToClipboard/copy/toggle-selection.d.ts +4 -0
- package/dist/components/CopyToClipboard/copy/toggle-selection.js +27 -0
- package/dist/components/CopyToClipboard/index.d.ts +14 -0
- package/dist/components/CopyToClipboard/index.js +13 -0
- package/dist/components/Draggable/Draggable.d.ts +62 -0
- package/dist/components/Draggable/Draggable.js +162 -0
- package/dist/components/Draggable/DraggableCore.d.ts +40 -0
- package/dist/components/Draggable/DraggableCore.js +149 -0
- package/dist/components/Draggable/index.d.ts +4 -0
- package/dist/components/Draggable/index.js +3 -0
- package/dist/components/Draggable/types.d.ts +30 -0
- package/dist/components/Draggable/types.js +1 -0
- package/dist/components/Draggable/utils/domFns.d.ts +36 -0
- package/dist/components/Draggable/utils/domFns.js +165 -0
- package/dist/components/Draggable/utils/getPrefix.d.ts +6 -0
- package/dist/components/Draggable/utils/getPrefix.js +31 -0
- package/dist/components/Draggable/utils/positionFns.d.ts +13 -0
- package/dist/components/Draggable/utils/positionFns.js +96 -0
- package/dist/components/Draggable/utils/shims.d.ts +7 -0
- package/dist/components/Draggable/utils/shims.js +19 -0
- package/dist/components/DropdownFooter/index.d.ts +20 -0
- package/dist/components/DropdownFooter/index.js +80 -0
- package/dist/components/DropdownFooter/style/index.d.ts +8 -0
- package/dist/components/DropdownFooter/style/index.js +18 -0
- package/dist/components/ErrorBoundary/index.d.ts +25 -0
- package/dist/components/ErrorBoundary/index.js +65 -0
- package/dist/components/FieldLabel/index.d.ts +31 -0
- package/dist/components/FieldLabel/index.js +212 -0
- package/dist/components/FieldLabel/style/index.d.ts +8 -0
- package/dist/components/FieldLabel/style/index.js +146 -0
- package/dist/components/FilterDropdown/index.d.ts +38 -0
- package/dist/components/FilterDropdown/index.js +91 -0
- package/dist/components/FilterDropdown/style/index.d.ts +8 -0
- package/dist/components/FilterDropdown/style/index.js +21 -0
- package/dist/components/FormItem/FormItemInput.d.ts +34 -0
- package/dist/components/FormItem/FormItemInput.js +163 -0
- package/dist/components/FormItem/ItemHolder.d.ts +58 -0
- package/dist/components/FormItem/ItemHolder.js +289 -0
- package/dist/components/FormItem/index.d.ts +64 -0
- package/dist/components/FormItem/index.js +591 -0
- package/dist/components/FormList/Field.d.ts +29 -0
- package/dist/components/FormList/Field.js +106 -0
- package/dist/components/FormList/FieldContext.d.ts +15 -0
- package/dist/components/FormList/FieldContext.js +11 -0
- package/dist/components/FormList/InternalField.d.ts +51 -0
- package/dist/components/FormList/InternalField.js +149 -0
- package/dist/components/FormList/ListContext.d.ts +12 -0
- package/dist/components/FormList/ListContext.js +11 -0
- package/dist/components/FormList/index.d.ts +36 -0
- package/dist/components/FormList/index.js +145 -0
- package/dist/components/FormList/interface.d.ts +9 -0
- package/dist/components/FormList/interface.js +1 -0
- package/dist/components/FormList/namePathType.d.ts +9 -0
- package/dist/components/FormList/namePathType.js +1 -0
- package/dist/components/FormList/utils/index.d.ts +15 -0
- package/dist/components/FormList/utils/index.js +37 -0
- package/dist/components/InlineErrorFormItem/InlineErrorFormItemPopover.d.ts +21 -0
- package/dist/components/InlineErrorFormItem/InlineErrorFormItemPopover.js +95 -0
- package/dist/components/InlineErrorFormItem/index.d.ts +14 -0
- package/dist/components/InlineErrorFormItem/index.js +44 -0
- package/dist/components/InlineErrorFormItem/style/index.d.ts +8 -0
- package/dist/components/InlineErrorFormItem/style/index.js +46 -0
- package/dist/components/LabelIconTip/index.d.ts +16 -0
- package/dist/components/LabelIconTip/index.js +79 -0
- package/dist/components/LabelIconTip/style/index.d.ts +8 -0
- package/dist/components/LabelIconTip/style/index.js +38 -0
- package/dist/components/ProFormContext/index.d.ts +51 -0
- package/dist/components/ProFormContext/index.js +11 -0
- package/dist/conversionMomentValue/index.d.ts +48 -0
- package/dist/conversionMomentValue/index.js +103 -0
- package/dist/dateArrayFormatter/index.d.ts +14 -0
- package/dist/dateArrayFormatter/index.js +38 -0
- package/dist/deepMerge/index.d.ts +4 -0
- package/dist/deepMerge/index.js +17 -0
- package/dist/genCopyable/index.d.ts +27 -0
- package/dist/genCopyable/index.js +82 -0
- package/dist/getFieldPropsOrFormItemProps/index.d.ts +18 -0
- package/dist/getFieldPropsOrFormItemProps/index.js +15 -0
- package/dist/getSlot/index.d.ts +8 -0
- package/dist/getSlot/index.js +11 -0
- package/dist/hooks/index.d.ts +9 -0
- package/dist/hooks/index.js +9 -0
- package/dist/hooks/useDebounceFn/index.d.ts +12 -0
- package/dist/hooks/useDebounceFn/index.js +34 -0
- package/dist/hooks/useDebounceValue/index.d.ts +12 -0
- package/dist/hooks/useDebounceValue/index.js +21 -0
- package/dist/hooks/useDocumentTitle/index.d.ts +10 -0
- package/dist/hooks/useDocumentTitle/index.js +12 -0
- package/dist/hooks/useEffect/index.d.ts +6 -0
- package/dist/hooks/useEffect/index.js +17 -0
- package/dist/hooks/useFetchData/index.d.ts +12 -0
- package/dist/hooks/useFetchData/index.js +35 -0
- package/dist/hooks/useLayoutEffect/index.d.ts +6 -0
- package/dist/hooks/useLayoutEffect/index.js +21 -0
- package/dist/hooks/useMemo/index.d.ts +6 -0
- package/dist/hooks/useMemo/index.js +13 -0
- package/dist/hooks/useState/index.d.ts +6 -0
- package/dist/hooks/useState/index.js +11 -0
- package/dist/index.d.ts +61 -0
- package/dist/index.js +58 -0
- package/dist/isBrowser/index.d.ts +4 -0
- package/dist/isBrowser/index.js +8 -0
- package/dist/isDropdownValueType/index.d.ts +4 -0
- package/dist/isDropdownValueType/index.js +8 -0
- package/dist/isImg/index.d.ts +5 -0
- package/dist/isImg/index.js +7 -0
- package/dist/isNil/index.d.ts +4 -0
- package/dist/isNil/index.js +6 -0
- package/dist/isUrl/index.d.ts +9 -0
- package/dist/isUrl/index.js +17 -0
- package/dist/merge/index.d.ts +9 -0
- package/dist/merge/index.js +20 -0
- package/dist/nanoid/index.d.ts +9 -0
- package/dist/nanoid/index.js +25 -0
- package/dist/normalizeProps/index.d.ts +6 -0
- package/dist/normalizeProps/index.js +6 -0
- package/dist/omitBoolean/index.d.ts +9 -0
- package/dist/omitBoolean/index.js +11 -0
- package/dist/omitUndefined/index.d.ts +5 -0
- package/dist/omitUndefined/index.js +11 -0
- package/dist/omitUndefinedAndEmptyArr/index.d.ts +4 -0
- package/dist/omitUndefinedAndEmptyArr/index.js +12 -0
- package/dist/parseValueToDay/index.d.ts +7 -0
- package/dist/parseValueToDay/index.js +21 -0
- package/dist/pickProFormItemProps/index.d.ts +34 -0
- package/dist/pickProFormItemProps/index.js +42 -0
- package/dist/pickProProps/index.d.ts +4 -0
- package/dist/pickProProps/index.js +14 -0
- package/dist/pro-utils.esm.js +3672 -0
- package/dist/proFieldParsingText/index.d.ts +25 -0
- package/dist/proFieldParsingText/index.js +100 -0
- package/dist/runFunction/index.d.ts +5 -0
- package/dist/runFunction/index.js +8 -0
- package/dist/stringify/index.d.ts +7 -0
- package/dist/stringify/index.js +10 -0
- package/dist/transformBooleanProps/index.d.ts +4 -0
- package/dist/transformBooleanProps/index.js +9 -0
- package/dist/transformKeySubmitValue/index.d.ts +24 -0
- package/dist/transformKeySubmitValue/index.js +200 -0
- package/dist/transformVueNodeType/index.d.ts +14 -0
- package/dist/transformVueNodeType/index.js +14 -0
- package/dist/typing.d.ts +562 -0
- package/dist/typing.js +1 -0
- package/dist/useEditableArray/components/CancelEditableAction.d.ts +47 -0
- package/dist/useEditableArray/components/CancelEditableAction.js +90 -0
- package/dist/useEditableArray/components/DeleteEditableAction.d.ts +33 -0
- package/dist/useEditableArray/components/DeleteEditableAction.js +63 -0
- package/dist/useEditableArray/components/SaveEditableAction.d.ts +33 -0
- package/dist/useEditableArray/components/SaveEditableAction.js +79 -0
- package/dist/useEditableArray/index.d.ts +66 -0
- package/dist/useEditableArray/index.js +584 -0
- package/dist/useEditableArray/typing.d.ts +130 -0
- package/dist/useEditableArray/typing.js +1 -0
- package/dist/useEditableMap/index.d.ts +32 -0
- package/dist/useEditableMap/index.js +147 -0
- package/dist/useMediaQuery/index.d.ts +44 -0
- package/dist/useMediaQuery/index.js +99 -0
- package/dist/useMediaQuery/query.d.ts +6 -0
- package/dist/useMediaQuery/query.js +17 -0
- package/dist/useMountMergeState/index.d.ts +11 -0
- package/dist/useMountMergeState/index.js +26 -0
- package/dist/usePrevious/index.d.ts +6 -0
- package/dist/usePrevious/index.js +11 -0
- package/dist/useRefFunction/index.d.ts +4 -0
- package/dist/useRefFunction/index.js +11 -0
- package/package.json +69 -3
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { Key, VueNode as VueNode$1 } from "../typing.js";
|
|
2
|
+
import { ComputedRef, ShallowRef } from "vue";
|
|
3
|
+
import { FormInstance, FormProps } from "antdv-next";
|
|
4
|
+
import { VueNode } from "antdv-next/dist/_util/type";
|
|
5
|
+
import { NamePath } from "antdv-next/dist/form/types";
|
|
6
|
+
|
|
7
|
+
//#region src/useEditableArray/typing.d.ts
|
|
8
|
+
type RowEditableType = 'single' | 'multiple';
|
|
9
|
+
type RecordKey = Key | Key[];
|
|
10
|
+
interface ActionTypeText<T> {
|
|
11
|
+
deleteText?: VueNode$1;
|
|
12
|
+
cancelText?: VueNode$1;
|
|
13
|
+
saveText?: VueNode$1;
|
|
14
|
+
editorType?: 'Array' | 'Map';
|
|
15
|
+
addEditRecord?: (row: T, options?: AddLineOptions) => Promise<boolean>;
|
|
16
|
+
}
|
|
17
|
+
interface SaveEditableActionRef<T = any> {
|
|
18
|
+
/**
|
|
19
|
+
* 直接触发保存动作
|
|
20
|
+
* @throws 如果校验失败,会抛出异常
|
|
21
|
+
*/
|
|
22
|
+
save: () => ReturnType<NonNullable<RowEditableConfig<T>['onSave']>> | Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
interface AddLineOptions {
|
|
25
|
+
position?: 'top' | 'bottom';
|
|
26
|
+
recordKey?: RecordKey;
|
|
27
|
+
newRecordType?: 'dataSource' | 'cache';
|
|
28
|
+
/** 要增加到哪个节点下,一般用于多重嵌套表格 */
|
|
29
|
+
parentKey?: RecordKey | (() => RecordKey);
|
|
30
|
+
}
|
|
31
|
+
interface NewLineConfig<T> {
|
|
32
|
+
defaultValue?: T;
|
|
33
|
+
options: AddLineOptions;
|
|
34
|
+
}
|
|
35
|
+
type ActionRenderFunction<T> = (row: T | undefined, config: ActionRenderConfig<T, NewLineConfig<T>>, defaultDoms: {
|
|
36
|
+
save: VueNode$1;
|
|
37
|
+
delete: VueNode$1;
|
|
38
|
+
cancel: VueNode$1;
|
|
39
|
+
}) => VueNode$1[];
|
|
40
|
+
interface RowEditableConfig<DataType> {
|
|
41
|
+
/** @name formProps 控制可编辑表格的 From的设置 */
|
|
42
|
+
formProps?: Omit<FormProps & {
|
|
43
|
+
formRef?: ShallowRef<FormInstance | undefined>;
|
|
44
|
+
onInit?: (values: DataType, form: FormInstance) => void;
|
|
45
|
+
}, 'onFinish'>;
|
|
46
|
+
form?: FormInstance;
|
|
47
|
+
/**
|
|
48
|
+
* @name type 编辑的类型,支持单选和多选
|
|
49
|
+
*/
|
|
50
|
+
type?: RowEditableType;
|
|
51
|
+
/** @name editableKeys 正在编辑的列 */
|
|
52
|
+
editableKeys?: Key[];
|
|
53
|
+
/** 正在编辑的列修改的时候 */
|
|
54
|
+
onChange?: (editableKeys: Key[], editableRows?: DataType[] | DataType) => void;
|
|
55
|
+
/** 正在编辑的列修改的时候 */
|
|
56
|
+
onValuesChange?: (record: DataType | undefined, dataSource: DataType[]) => void;
|
|
57
|
+
/** @name actionRender 自定义编辑的操作 */
|
|
58
|
+
actionRender?: ActionRenderFunction<DataType>;
|
|
59
|
+
/** 行保存的时候 */
|
|
60
|
+
onSave?: (/** 行 id,一般是唯一id */
|
|
61
|
+
|
|
62
|
+
key: RecordKey, /** 当前修改的行的值,只有 form 在内的会被设置 */
|
|
63
|
+
|
|
64
|
+
record: DataType & {
|
|
65
|
+
index?: number;
|
|
66
|
+
}, /** 原始值,可以用于判断是否修改 */
|
|
67
|
+
|
|
68
|
+
originRow: DataType & {
|
|
69
|
+
index?: number;
|
|
70
|
+
}, /** 新建一行的配置,一般无用 */
|
|
71
|
+
|
|
72
|
+
newLineConfig?: NewLineConfig<DataType>) => Promise<any>;
|
|
73
|
+
/** 行取消编辑的时候 */
|
|
74
|
+
onCancel?: (/** 行 id,一般是唯一id */
|
|
75
|
+
|
|
76
|
+
key: RecordKey, /** 当前修改的行的值,只有 form 在内的会被设置 */
|
|
77
|
+
|
|
78
|
+
record: DataType & {
|
|
79
|
+
index?: number;
|
|
80
|
+
}, /** 原始值,可以用于判断是否修改 */
|
|
81
|
+
|
|
82
|
+
originRow: DataType & {
|
|
83
|
+
index?: number;
|
|
84
|
+
} | undefined, /** 新建一行的配置,一般无用 */
|
|
85
|
+
|
|
86
|
+
newLineConfig?: NewLineConfig<DataType>) => Promise<any>;
|
|
87
|
+
/** 行删除的时候 */
|
|
88
|
+
onDelete?: (key: RecordKey, row: DataType & {
|
|
89
|
+
index?: number;
|
|
90
|
+
} | undefined) => Promise<any>;
|
|
91
|
+
/** 删除行时的确认消息 */
|
|
92
|
+
deletePopconfirmMessage?: VueNode;
|
|
93
|
+
/** 只能编辑一行的的提示 */
|
|
94
|
+
onlyOneLineEditorAlertMessage?: VueNode;
|
|
95
|
+
/** 同时只能新增一行的提示 */
|
|
96
|
+
onlyAddOneLineAlertMessage?: VueNode;
|
|
97
|
+
/** Table 上设置的name,用于拼接name来获取数据 */
|
|
98
|
+
tableName?: ComputedRef<NamePath<string | number | boolean> | undefined>;
|
|
99
|
+
/** 保存一行的文字 */
|
|
100
|
+
saveText?: VueNode$1;
|
|
101
|
+
/** 取消编辑一行的文字 */
|
|
102
|
+
cancelText?: VueNode$1;
|
|
103
|
+
/** 删除一行的文字 */
|
|
104
|
+
deleteText?: VueNode$1;
|
|
105
|
+
getRealIndex?: (record: DataType) => number;
|
|
106
|
+
}
|
|
107
|
+
type ActionRenderConfig<T, LineConfig = NewLineConfig<T>> = {
|
|
108
|
+
editableKeys?: RowEditableConfig<T>['editableKeys'];
|
|
109
|
+
recordKey: RecordKey; /** Form list 中的行路径;name 模式下通常是数组索引,区别于业务 recordKey。 */
|
|
110
|
+
formRecordKey?: RecordKey;
|
|
111
|
+
preEditRow: T | null;
|
|
112
|
+
/**
|
|
113
|
+
* 多行编辑场景下,按 recordKey 缓存每一行进入编辑前的快照(允许为 null,用于标记“新建行”)
|
|
114
|
+
* 用于避免 preEditRow(单引用)在多行编辑时被覆盖导致取消误删/误还原的问题
|
|
115
|
+
*/
|
|
116
|
+
preEditRows?: Map<string, T | null>;
|
|
117
|
+
'onUpdate:preEditRow': (preEditRow: T | null) => void;
|
|
118
|
+
index?: number;
|
|
119
|
+
cancelEditable: (key: RecordKey) => Promise<boolean | void>; /** 仅结束编辑状态,不触发取消回调或恢复编辑前数据。 */
|
|
120
|
+
finishEditable?: (key: RecordKey) => Promise<boolean | void>;
|
|
121
|
+
onSave: RowEditableConfig<T>['onSave'];
|
|
122
|
+
onCancel: RowEditableConfig<T>['onCancel'];
|
|
123
|
+
onDelete?: RowEditableConfig<T>['onDelete'];
|
|
124
|
+
deletePopconfirmMessage: RowEditableConfig<T>['deletePopconfirmMessage'];
|
|
125
|
+
setEditableRowKeys: (value: Key[]) => void;
|
|
126
|
+
newLineConfig?: LineConfig;
|
|
127
|
+
tableName?: NamePath<string | number | boolean>;
|
|
128
|
+
} & ActionTypeText<T>;
|
|
129
|
+
//#endregion
|
|
130
|
+
export { ActionRenderConfig, ActionRenderFunction, ActionTypeText, AddLineOptions, NewLineConfig, RecordKey, RowEditableConfig, RowEditableType, SaveEditableActionRef };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { ActionTypeText, RecordKey, RowEditableConfig } from "../useEditableArray/typing.js";
|
|
2
|
+
import { Key } from "../typing.js";
|
|
3
|
+
import { ComputedRef, Ref } from "vue";
|
|
4
|
+
import * as _$_v_c_util0 from "@v-c/util";
|
|
5
|
+
import { AnyObject } from "antdv-next/dist/_util/type";
|
|
6
|
+
import * as _$vue_jsx_runtime0 from "vue/jsx-runtime";
|
|
7
|
+
|
|
8
|
+
//#region src/useEditableMap/index.d.ts
|
|
9
|
+
/**
|
|
10
|
+
* 一个方便的hooks 用于维护编辑的状态
|
|
11
|
+
*
|
|
12
|
+
* @param props
|
|
13
|
+
*/
|
|
14
|
+
declare function useEditableMap<RecordType extends AnyObject>(props: Omit<RowEditableConfig<RecordType>, 'editableKeys' | 'type'> & {
|
|
15
|
+
type?: ComputedRef<RowEditableConfig<RecordType>['type']>;
|
|
16
|
+
editableKeys: ComputedRef<RowEditableConfig<RecordType>['editableKeys']>;
|
|
17
|
+
dataSource?: Ref<RecordType | undefined>;
|
|
18
|
+
childrenColumnName?: string;
|
|
19
|
+
setDataSource: (dataSource?: RecordType) => void;
|
|
20
|
+
}): {
|
|
21
|
+
messageContextHolder: () => _$vue_jsx_runtime0.JSX.Element;
|
|
22
|
+
editableKeys: Ref<Key[], Key[]>;
|
|
23
|
+
setEditableRowKeys: (val: Key[]) => void;
|
|
24
|
+
isEditable: (recordKey: RecordKey) => boolean;
|
|
25
|
+
actionRender: (key: RecordKey, config?: ActionTypeText<RecordType>) => _$_v_c_util0.VueNode[];
|
|
26
|
+
startEditable: (recordKey: RecordKey, recordValue?: any) => boolean;
|
|
27
|
+
cancelEditable: (recordKey: RecordKey) => Promise<boolean>;
|
|
28
|
+
};
|
|
29
|
+
type UseEditableMapType = typeof useEditableMap;
|
|
30
|
+
type UseEditableMapUtilType = ReturnType<UseEditableMapType>;
|
|
31
|
+
//#endregion
|
|
32
|
+
export { UseEditableMapType, UseEditableMapUtilType, useEditableMap };
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { useMemo } from "../hooks/useMemo/index.js";
|
|
2
|
+
import { recordKeyToString } from "../useEditableArray/components/CancelEditableAction.js";
|
|
3
|
+
import { defaultActionRender } from "../useEditableArray/index.js";
|
|
4
|
+
import { computed, shallowRef } from "vue";
|
|
5
|
+
import { get, useMergedState } from "@v-c/util";
|
|
6
|
+
import { message } from "antdv-next";
|
|
7
|
+
import { useIntl } from "@antdv-vue/pro-provider";
|
|
8
|
+
//#region src/useEditableMap/index.tsx
|
|
9
|
+
/**
|
|
10
|
+
* 使用map 来删除数据,性能一般 但是准确率比较高
|
|
11
|
+
*
|
|
12
|
+
*/
|
|
13
|
+
function editableRowByKey({ data, row }) {
|
|
14
|
+
return {
|
|
15
|
+
...data,
|
|
16
|
+
...row
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 一个方便的hooks 用于维护编辑的状态
|
|
21
|
+
*
|
|
22
|
+
* @param props
|
|
23
|
+
*/
|
|
24
|
+
function useEditableMap(props) {
|
|
25
|
+
/**
|
|
26
|
+
* 点击开始编辑之前的保存数据用的
|
|
27
|
+
*/
|
|
28
|
+
const preEditRow = shallowRef(null);
|
|
29
|
+
const editableType = computed(() => props.type?.value || "single");
|
|
30
|
+
const intl = useIntl();
|
|
31
|
+
const [messageApi, ContextHolder] = message.useMessage();
|
|
32
|
+
const [editableKeys, setEditableRowKeys] = useMergedState([], {
|
|
33
|
+
value: computed(() => props.editableKeys.value),
|
|
34
|
+
onChange: props.onChange ? (keys) => {
|
|
35
|
+
props?.onChange?.(keys, props.dataSource?.value);
|
|
36
|
+
} : void 0
|
|
37
|
+
});
|
|
38
|
+
/** 一个用来标志的set 提供了方便的 api 来去重什么的 */
|
|
39
|
+
const editableKeysSet = useMemo(() => {
|
|
40
|
+
const keys = editableType.value === "single" ? editableKeys.value?.slice(0, 1) : editableKeys.value;
|
|
41
|
+
return new Set(keys);
|
|
42
|
+
}, [() => (editableKeys.value || []).join(","), () => editableType.value]);
|
|
43
|
+
/** 这行是不是编辑状态 */
|
|
44
|
+
const isEditable = (recordKey) => {
|
|
45
|
+
if (editableKeys.value?.includes(recordKeyToString(recordKey))) return true;
|
|
46
|
+
return false;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* 进入编辑状态
|
|
50
|
+
*
|
|
51
|
+
* @param recordKey
|
|
52
|
+
*/
|
|
53
|
+
const startEditable = (recordKey, recordValue) => {
|
|
54
|
+
if (editableKeysSet.value.size > 0 && editableType.value === "single") {
|
|
55
|
+
messageApi.warning(props.onlyOneLineEditorAlertMessage || intl.value.getMessage({
|
|
56
|
+
id: "editableTable.onlyOneLineEditor",
|
|
57
|
+
defaultMessage: "只能同时编辑一行"
|
|
58
|
+
}));
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
preEditRow.value = recordValue ?? get(props.dataSource?.value, Array.isArray(recordKey) ? recordKey : [recordKey]) ?? null;
|
|
62
|
+
editableKeysSet.value.add(recordKeyToString(recordKey));
|
|
63
|
+
setEditableRowKeys(Array.from(editableKeysSet.value));
|
|
64
|
+
return true;
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* 退出编辑状态
|
|
68
|
+
*
|
|
69
|
+
* @param recordKey
|
|
70
|
+
*/
|
|
71
|
+
const cancelEditable = async (recordKey) => {
|
|
72
|
+
editableKeysSet.value.delete(recordKeyToString(recordKey));
|
|
73
|
+
setEditableRowKeys(Array.from(editableKeysSet.value));
|
|
74
|
+
return true;
|
|
75
|
+
};
|
|
76
|
+
const onCancel = async (recordKey, editRow, originRow, newLine) => {
|
|
77
|
+
if (await props?.onCancel?.(recordKey, editRow, originRow, newLine) === false) return false;
|
|
78
|
+
return true;
|
|
79
|
+
};
|
|
80
|
+
const onSave = async (recordKey, editRow, originRow) => {
|
|
81
|
+
if (await props?.onSave?.(recordKey, editRow, originRow) === false) return false;
|
|
82
|
+
await cancelEditable(recordKey);
|
|
83
|
+
const actionProps = {
|
|
84
|
+
data: props.dataSource?.value,
|
|
85
|
+
row: editRow,
|
|
86
|
+
key: recordKey,
|
|
87
|
+
childrenColumnName: props.childrenColumnName || "children"
|
|
88
|
+
};
|
|
89
|
+
props.setDataSource(editableRowByKey(actionProps));
|
|
90
|
+
return true;
|
|
91
|
+
};
|
|
92
|
+
const saveText = intl.value.getMessage({
|
|
93
|
+
id: "editableTable.action.save",
|
|
94
|
+
defaultMessage: "保存"
|
|
95
|
+
});
|
|
96
|
+
const deleteText = intl.value.getMessage({
|
|
97
|
+
id: "editableTable.action.delete",
|
|
98
|
+
defaultMessage: "删除"
|
|
99
|
+
});
|
|
100
|
+
const cancelText = intl.value.getMessage({
|
|
101
|
+
id: "editableTable.action.cancel",
|
|
102
|
+
defaultMessage: "取消"
|
|
103
|
+
});
|
|
104
|
+
const actionRender = (key, config) => {
|
|
105
|
+
const renderConfig = {
|
|
106
|
+
recordKey: key,
|
|
107
|
+
cancelEditable,
|
|
108
|
+
onCancel,
|
|
109
|
+
onSave,
|
|
110
|
+
editableKeys: editableKeys.value,
|
|
111
|
+
setEditableRowKeys,
|
|
112
|
+
saveText,
|
|
113
|
+
cancelText,
|
|
114
|
+
preEditRow: preEditRow.value,
|
|
115
|
+
"onUpdate:preEditRow": (_preEditRow) => preEditRow.value = _preEditRow,
|
|
116
|
+
deleteText,
|
|
117
|
+
deletePopconfirmMessage: `${intl.value.getMessage({
|
|
118
|
+
id: "deleteThisLine",
|
|
119
|
+
defaultMessage: "删除此项"
|
|
120
|
+
})}?`,
|
|
121
|
+
editorType: "Map",
|
|
122
|
+
...config
|
|
123
|
+
};
|
|
124
|
+
const renderResult = defaultActionRender(props.dataSource?.value, renderConfig);
|
|
125
|
+
if (props.actionRender) return props.actionRender(props.dataSource?.value, renderConfig, {
|
|
126
|
+
save: renderResult.save,
|
|
127
|
+
delete: renderResult.delete,
|
|
128
|
+
cancel: renderResult.cancel
|
|
129
|
+
});
|
|
130
|
+
return [
|
|
131
|
+
renderResult.save,
|
|
132
|
+
renderResult.delete,
|
|
133
|
+
renderResult.cancel
|
|
134
|
+
];
|
|
135
|
+
};
|
|
136
|
+
return {
|
|
137
|
+
messageContextHolder: ContextHolder,
|
|
138
|
+
editableKeys,
|
|
139
|
+
setEditableRowKeys,
|
|
140
|
+
isEditable,
|
|
141
|
+
actionRender,
|
|
142
|
+
startEditable,
|
|
143
|
+
cancelEditable
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
//#endregion
|
|
147
|
+
export { useEditableMap };
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import * as _$vue from "vue";
|
|
2
|
+
|
|
3
|
+
//#region src/useMediaQuery/index.d.ts
|
|
4
|
+
declare const MediaQueryEnum: {
|
|
5
|
+
xs: {
|
|
6
|
+
maxWidth: number;
|
|
7
|
+
matchMedia: string;
|
|
8
|
+
};
|
|
9
|
+
sm: {
|
|
10
|
+
minWidth: number;
|
|
11
|
+
maxWidth: number;
|
|
12
|
+
matchMedia: string;
|
|
13
|
+
};
|
|
14
|
+
md: {
|
|
15
|
+
minWidth: number;
|
|
16
|
+
maxWidth: number;
|
|
17
|
+
matchMedia: string;
|
|
18
|
+
};
|
|
19
|
+
lg: {
|
|
20
|
+
minWidth: number;
|
|
21
|
+
maxWidth: number;
|
|
22
|
+
matchMedia: string;
|
|
23
|
+
};
|
|
24
|
+
xl: {
|
|
25
|
+
minWidth: number;
|
|
26
|
+
maxWidth: number;
|
|
27
|
+
matchMedia: string;
|
|
28
|
+
};
|
|
29
|
+
xxl: {
|
|
30
|
+
minWidth: number;
|
|
31
|
+
matchMedia: string;
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
type MediaQueryKey = keyof typeof MediaQueryEnum;
|
|
35
|
+
/**
|
|
36
|
+
* loop query screen className
|
|
37
|
+
* Array.find will throw a error
|
|
38
|
+
* `Rendered more hooks than during the previous render.`
|
|
39
|
+
* So should use Array.forEach
|
|
40
|
+
*/
|
|
41
|
+
declare function getScreenClassName(): "xs" | "sm" | "md" | "lg" | "xl" | "xxl";
|
|
42
|
+
declare function useMedia(): _$vue.Ref<"xs" | "sm" | "md" | "lg" | "xl" | "xxl", "xs" | "sm" | "md" | "lg" | "xl" | "xxl">;
|
|
43
|
+
//#endregion
|
|
44
|
+
export { MediaQueryEnum, MediaQueryKey, getScreenClassName, useMedia };
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { useEffect } from "../hooks/useEffect/index.js";
|
|
2
|
+
import { useState } from "../hooks/useState/index.js";
|
|
3
|
+
import { useMediaQuery } from "./query.js";
|
|
4
|
+
//#region src/useMediaQuery/index.ts
|
|
5
|
+
const MediaQueryEnum = {
|
|
6
|
+
xs: {
|
|
7
|
+
maxWidth: 575,
|
|
8
|
+
matchMedia: "(max-width: 575px)"
|
|
9
|
+
},
|
|
10
|
+
sm: {
|
|
11
|
+
minWidth: 576,
|
|
12
|
+
maxWidth: 767,
|
|
13
|
+
matchMedia: "(min-width: 576px) and (max-width: 767px)"
|
|
14
|
+
},
|
|
15
|
+
md: {
|
|
16
|
+
minWidth: 768,
|
|
17
|
+
maxWidth: 991,
|
|
18
|
+
matchMedia: "(min-width: 768px) and (max-width: 991px)"
|
|
19
|
+
},
|
|
20
|
+
lg: {
|
|
21
|
+
minWidth: 992,
|
|
22
|
+
maxWidth: 1199,
|
|
23
|
+
matchMedia: "(min-width: 992px) and (max-width: 1199px)"
|
|
24
|
+
},
|
|
25
|
+
xl: {
|
|
26
|
+
minWidth: 1200,
|
|
27
|
+
maxWidth: 1599,
|
|
28
|
+
matchMedia: "(min-width: 1200px) and (max-width: 1599px)"
|
|
29
|
+
},
|
|
30
|
+
xxl: {
|
|
31
|
+
minWidth: 1600,
|
|
32
|
+
matchMedia: "(min-width: 1600px)"
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* loop query screen className
|
|
37
|
+
* Array.find will throw a error
|
|
38
|
+
* `Rendered more hooks than during the previous render.`
|
|
39
|
+
* So should use Array.forEach
|
|
40
|
+
*/
|
|
41
|
+
function getScreenClassName() {
|
|
42
|
+
let className = "md";
|
|
43
|
+
if (typeof window === "undefined") return className;
|
|
44
|
+
className = Object.keys(MediaQueryEnum).find((key) => {
|
|
45
|
+
const { matchMedia } = MediaQueryEnum[key];
|
|
46
|
+
return window.matchMedia(matchMedia).matches;
|
|
47
|
+
});
|
|
48
|
+
return className;
|
|
49
|
+
}
|
|
50
|
+
function useMedia() {
|
|
51
|
+
const isMd = useMediaQuery(MediaQueryEnum.md.matchMedia);
|
|
52
|
+
const isLg = useMediaQuery(MediaQueryEnum.lg.matchMedia);
|
|
53
|
+
const isXxl = useMediaQuery(MediaQueryEnum.xxl.matchMedia);
|
|
54
|
+
const isXl = useMediaQuery(MediaQueryEnum.xl.matchMedia);
|
|
55
|
+
const isSm = useMediaQuery(MediaQueryEnum.sm.matchMedia);
|
|
56
|
+
const isXs = useMediaQuery(MediaQueryEnum.xs.matchMedia);
|
|
57
|
+
const [colSpan, setColSpan] = useState(getScreenClassName());
|
|
58
|
+
useEffect(() => {
|
|
59
|
+
if (process.env.NODE_ENV === "TEST") {
|
|
60
|
+
setColSpan(process.env.USE_MEDIA || "md");
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (isXxl.value) {
|
|
64
|
+
setColSpan("xxl");
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
if (isXl.value) {
|
|
68
|
+
setColSpan("xl");
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (isLg.value) {
|
|
72
|
+
setColSpan("lg");
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (isMd.value) {
|
|
76
|
+
setColSpan("md");
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (isSm.value) {
|
|
80
|
+
setColSpan("sm");
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
if (isXs.value) {
|
|
84
|
+
setColSpan("xs");
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
setColSpan("md");
|
|
88
|
+
}, [
|
|
89
|
+
() => isMd.value,
|
|
90
|
+
() => isLg.value,
|
|
91
|
+
() => isXxl.value,
|
|
92
|
+
() => isXl.value,
|
|
93
|
+
() => isSm.value,
|
|
94
|
+
() => isXs.value
|
|
95
|
+
]);
|
|
96
|
+
return colSpan;
|
|
97
|
+
}
|
|
98
|
+
//#endregion
|
|
99
|
+
export { MediaQueryEnum, getScreenClassName, useMedia };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { useLayoutEffect } from "../hooks/useLayoutEffect/index.js";
|
|
2
|
+
import { useState } from "../hooks/useState/index.js";
|
|
3
|
+
//#region src/useMediaQuery/query.ts
|
|
4
|
+
function useMediaQuery(mediaQuery) {
|
|
5
|
+
const isSsr = typeof window === "undefined";
|
|
6
|
+
const [matches, setMatches] = useState(() => isSsr ? false : window.matchMedia(mediaQuery).matches);
|
|
7
|
+
useLayoutEffect(() => {
|
|
8
|
+
if (isSsr) return;
|
|
9
|
+
const mediaQueryList = window.matchMedia(mediaQuery);
|
|
10
|
+
const listener = (e) => setMatches(e.matches);
|
|
11
|
+
mediaQueryList.addEventListener("change", listener);
|
|
12
|
+
return () => mediaQueryList.removeEventListener("change", listener);
|
|
13
|
+
}, [() => mediaQuery]);
|
|
14
|
+
return matches;
|
|
15
|
+
}
|
|
16
|
+
//#endregion
|
|
17
|
+
export { useMediaQuery };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Ref, UnwrapRef } from "vue";
|
|
2
|
+
|
|
3
|
+
//#region src/useMountMergeState/index.d.ts
|
|
4
|
+
declare function useMountMergeState<T, R = Ref<T>>(defaultStateValue: T | (() => T), option?: {
|
|
5
|
+
defaultValue?: T | (() => T);
|
|
6
|
+
value?: Ref<T> | Ref<UnwrapRef<T>>;
|
|
7
|
+
onChange?: (val: T, prevValue: T) => void;
|
|
8
|
+
postState?: (val: T) => T;
|
|
9
|
+
}): [R, (val: T) => void];
|
|
10
|
+
//#endregion
|
|
11
|
+
export { useMountMergeState };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ref, toRaw, unref, watch, watchEffect } from "vue";
|
|
2
|
+
//#region src/useMountMergeState/index.ts
|
|
3
|
+
function useMountMergeState(defaultStateValue, option) {
|
|
4
|
+
const { defaultValue, value = ref() } = option || {};
|
|
5
|
+
let initValue = typeof defaultStateValue === "function" ? defaultStateValue() : defaultStateValue;
|
|
6
|
+
if (value.value !== void 0) initValue = unref(value);
|
|
7
|
+
if (defaultValue !== void 0) initValue = typeof defaultValue === "function" ? defaultValue() : defaultValue;
|
|
8
|
+
const innerValue = ref(initValue);
|
|
9
|
+
const mergedValue = ref(initValue);
|
|
10
|
+
watchEffect(() => {
|
|
11
|
+
let val = value.value !== void 0 ? value.value : innerValue.value;
|
|
12
|
+
if (option?.postState) val = option.postState(val);
|
|
13
|
+
mergedValue.value = val;
|
|
14
|
+
});
|
|
15
|
+
function triggerChange(newValue) {
|
|
16
|
+
const preVal = mergedValue.value;
|
|
17
|
+
innerValue.value = newValue;
|
|
18
|
+
if (toRaw(mergedValue.value) !== newValue && option?.onChange) option.onChange(newValue, preVal);
|
|
19
|
+
}
|
|
20
|
+
watch(value, () => {
|
|
21
|
+
innerValue.value = value.value;
|
|
22
|
+
});
|
|
23
|
+
return [mergedValue, triggerChange];
|
|
24
|
+
}
|
|
25
|
+
//#endregion
|
|
26
|
+
export { useMountMergeState };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ref, watch } from "vue";
|
|
2
|
+
//#region src/usePrevious/index.ts
|
|
3
|
+
function usePrevious(state) {
|
|
4
|
+
const previous = ref();
|
|
5
|
+
watch(state, (_, oldValue) => {
|
|
6
|
+
previous.value = oldValue;
|
|
7
|
+
}, { immediate: false });
|
|
8
|
+
return previous;
|
|
9
|
+
}
|
|
10
|
+
//#endregion
|
|
11
|
+
export { usePrevious };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ref } from "vue";
|
|
2
|
+
//#region src/useRefFunction/index.ts
|
|
3
|
+
function useRefFunction(reFunction) {
|
|
4
|
+
const refValue = ref(null);
|
|
5
|
+
refValue.value = reFunction;
|
|
6
|
+
return (...rest) => {
|
|
7
|
+
return refValue.value?.(...rest);
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
//#endregion
|
|
11
|
+
export { useRefFunction };
|
package/package.json
CHANGED
|
@@ -1,6 +1,72 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@antdv-vue/pro-utils",
|
|
3
|
-
"
|
|
4
|
-
"
|
|
5
|
-
"description": "
|
|
3
|
+
"type": "module",
|
|
4
|
+
"version": "2.1.1",
|
|
5
|
+
"description": "@antdv-vue/pro-utils",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/bunnyblueair/pro-components.git",
|
|
9
|
+
"directory": "packages/utils"
|
|
10
|
+
},
|
|
11
|
+
"sideEffects": [
|
|
12
|
+
"./dist/pro-utils.esm.js"
|
|
13
|
+
],
|
|
14
|
+
"exports": {
|
|
15
|
+
".": {
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"import": "./dist/index.js",
|
|
18
|
+
"default": "./dist/index.js"
|
|
19
|
+
},
|
|
20
|
+
"./dist/*": {
|
|
21
|
+
"types": "./dist/*.d.ts",
|
|
22
|
+
"import": "./dist/*.js",
|
|
23
|
+
"default": "./dist/*.js"
|
|
24
|
+
},
|
|
25
|
+
"./dist/pro-utils.esm.js": "./dist/pro-utils.esm.js"
|
|
26
|
+
},
|
|
27
|
+
"main": "./dist/index.js",
|
|
28
|
+
"module": "./dist/index.js",
|
|
29
|
+
"types": "./dist/index.d.ts",
|
|
30
|
+
"files": [
|
|
31
|
+
"CHANGELOG.md",
|
|
32
|
+
"LICENSE",
|
|
33
|
+
"README.md",
|
|
34
|
+
"dist",
|
|
35
|
+
"package.json"
|
|
36
|
+
],
|
|
37
|
+
"scripts": {
|
|
38
|
+
"build": "run-s build:esm build:full-esm",
|
|
39
|
+
"build:esm": "tsdown --config-loader unrun",
|
|
40
|
+
"build:full-esm": "vite build"
|
|
41
|
+
},
|
|
42
|
+
"browserslist": [
|
|
43
|
+
"last 2 versions",
|
|
44
|
+
"Firefox ESR",
|
|
45
|
+
"> 1%",
|
|
46
|
+
"ie >= 11"
|
|
47
|
+
],
|
|
48
|
+
"peerDependencies": {
|
|
49
|
+
"antdv-next": ">=1.8.0",
|
|
50
|
+
"vue": ">=3.5.30"
|
|
51
|
+
},
|
|
52
|
+
"dependencies": {
|
|
53
|
+
"@antdv-next/cssinjs": "^1.0.6",
|
|
54
|
+
"@antdv-next/icons": "^1.1.1",
|
|
55
|
+
"@antdv-vue/pro-provider": "2.0.0",
|
|
56
|
+
"@v-c/util": "^1.0.21",
|
|
57
|
+
"dayjs": "^1.11.20",
|
|
58
|
+
"es-toolkit": "^1.45.1",
|
|
59
|
+
"safe-stable-stringify": "^2.5.0",
|
|
60
|
+
"swrv": "^1.2.0"
|
|
61
|
+
},
|
|
62
|
+
"devDependencies": {
|
|
63
|
+
"csstype": "^3.2.3",
|
|
64
|
+
"typescript": "~5.9.3"
|
|
65
|
+
},
|
|
66
|
+
"publishConfig": {
|
|
67
|
+
"access": "public"
|
|
68
|
+
},
|
|
69
|
+
"authors": [
|
|
70
|
+
"lucasjeke <lucasjekeqd@gmail.com> (https://github.com/lucasjeke)"
|
|
71
|
+
]
|
|
6
72
|
}
|