@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
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# @antdv-vue/pro-utils
|
|
2
|
+
|
|
3
|
+
## 2.1.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- ef5cfb6: fix: preserve user-select protection when a new drag starts before deferred cleanup completes.
|
|
8
|
+
|
|
9
|
+
## 2.1.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- 244f208: feat: export Draggable utilities and add draggable and fullscreen ModalForm modes.
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- fix: stop cancelled touch drags and retain user-select protection until every active drag ends.
|
|
18
|
+
|
|
19
|
+
## 2.0.0
|
|
20
|
+
|
|
21
|
+
### Major Changes
|
|
22
|
+
|
|
23
|
+
- feat!: remove the UMD bundle target from package builds.
|
|
24
|
+
- docs: sync structured changelog pages for every package.
|
|
25
|
+
|
|
26
|
+
### Patch Changes
|
|
27
|
+
|
|
28
|
+
- Updated dependencies
|
|
29
|
+
- @antdv-vue/pro-provider@2.0.0
|
|
30
|
+
|
|
31
|
+
## 1.0.23
|
|
32
|
+
|
|
33
|
+
### Patch Changes
|
|
34
|
+
|
|
35
|
+
- fix card, form bugs
|
|
36
|
+
|
|
37
|
+
## 1.0.22
|
|
38
|
+
|
|
39
|
+
### Patch Changes
|
|
40
|
+
|
|
41
|
+
- Updated dependencies
|
|
42
|
+
- @antdv-vue/pro-provider@1.0.14
|
|
43
|
+
|
|
44
|
+
## 1.0.21
|
|
45
|
+
|
|
46
|
+
### Patch Changes
|
|
47
|
+
|
|
48
|
+
- fix layout filed form card bugs
|
|
49
|
+
- Updated dependencies
|
|
50
|
+
- @antdv-vue/pro-provider@1.0.13
|
|
51
|
+
|
|
52
|
+
## 1.0.20
|
|
53
|
+
|
|
54
|
+
### Patch Changes
|
|
55
|
+
|
|
56
|
+
- Updated dependencies
|
|
57
|
+
- @antdv-vue/pro-provider@1.0.12
|
|
58
|
+
|
|
59
|
+
## 1.0.19
|
|
60
|
+
|
|
61
|
+
### Patch Changes
|
|
62
|
+
|
|
63
|
+
- Updated dependencies
|
|
64
|
+
- @antdv-vue/pro-provider@1.0.11
|
|
65
|
+
|
|
66
|
+
## 1.0.18
|
|
67
|
+
|
|
68
|
+
### Patch Changes
|
|
69
|
+
|
|
70
|
+
- fix shared utility component styles
|
|
71
|
+
- Updated dependencies
|
|
72
|
+
- @antdv-vue/pro-provider@1.0.10
|
|
73
|
+
|
|
74
|
+
## 1.0.16
|
|
75
|
+
|
|
76
|
+
### Patch Changes
|
|
77
|
+
|
|
78
|
+
- fix bugs
|
|
79
|
+
|
|
80
|
+
## 1.0.16
|
|
81
|
+
|
|
82
|
+
### Patch Changes
|
|
83
|
+
|
|
84
|
+
- fix css-in-js style Transition bugs
|
|
85
|
+
|
|
86
|
+
## 1.0.15
|
|
87
|
+
|
|
88
|
+
### Patch Changes
|
|
89
|
+
|
|
90
|
+
- fix bugs
|
|
91
|
+
- Updated dependencies
|
|
92
|
+
- @antdv-vue/pro-provider@1.0.9
|
|
93
|
+
|
|
94
|
+
## 1.0.14
|
|
95
|
+
|
|
96
|
+
### Patch Changes
|
|
97
|
+
|
|
98
|
+
- create listy card mode
|
|
99
|
+
- Updated dependencies
|
|
100
|
+
- @antdv-vue/pro-provider@1.0.8
|
|
101
|
+
|
|
102
|
+
## 1.0.13
|
|
103
|
+
|
|
104
|
+
### Patch Changes
|
|
105
|
+
|
|
106
|
+
- change version
|
|
107
|
+
- Updated dependencies
|
|
108
|
+
- @antdv-vue/pro-provider@1.0.7
|
|
109
|
+
|
|
110
|
+
## 1.0.12
|
|
111
|
+
|
|
112
|
+
### Patch Changes
|
|
113
|
+
|
|
114
|
+
- Updated dependencies
|
|
115
|
+
- @antdv-vue/pro-provider@1.0.6
|
|
116
|
+
|
|
117
|
+
## 1.0.11
|
|
118
|
+
|
|
119
|
+
### Patch Changes
|
|
120
|
+
|
|
121
|
+
- fix ProForm bugs
|
|
122
|
+
- Updated dependencies
|
|
123
|
+
- @antdv-vue/pro-provider@1.0.5
|
package/README.md
CHANGED
|
@@ -1,3 +1,81 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @antdv-vue/pro-utils
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Shared utility functions, composables, and common components for the Pro Components ecosystem.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @antdv-vue/pro-utils
|
|
9
|
+
# or
|
|
10
|
+
pnpm add @antdv-vue/pro-utils
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Peer Dependencies
|
|
14
|
+
|
|
15
|
+
- `vue` >= 3.5.30
|
|
16
|
+
- `antdv-next` >= 1.3.6
|
|
17
|
+
|
|
18
|
+
## What's Included
|
|
19
|
+
|
|
20
|
+
### Utility Functions
|
|
21
|
+
|
|
22
|
+
| Function | Description |
|
|
23
|
+
|----------|-------------|
|
|
24
|
+
| `isBrowser` | Check if running in browser environment |
|
|
25
|
+
| `isImg` | Check if a value is an image URL |
|
|
26
|
+
| `isNil` | Check if value is `null` or `undefined` |
|
|
27
|
+
| `isUrl` | Check if a value is a valid URL |
|
|
28
|
+
| `isDropdownValueType` | Check if value type is dropdown |
|
|
29
|
+
| `omitUndefined` | Remove `undefined` values from object |
|
|
30
|
+
| `omitBoolean` | Remove boolean values from object |
|
|
31
|
+
| `omitUndefinedAndEmptyArr` | Remove `undefined` and empty array values |
|
|
32
|
+
| `deepMerge` | Deep merge objects |
|
|
33
|
+
| `merge` | Merge objects |
|
|
34
|
+
| `nanoid` | Generate unique ID |
|
|
35
|
+
| `stringify` | Safe JSON stringify |
|
|
36
|
+
| `transformKeySubmitValue` | Transform form key submit values |
|
|
37
|
+
| `transformBooleanProps` | Transform boolean props |
|
|
38
|
+
| `runFunction` | Safely run a function |
|
|
39
|
+
| `normalizeProps` | Normalize component props |
|
|
40
|
+
| `pickProProps` | Pick pro-specific props |
|
|
41
|
+
| `pickProFormItemProps` | Pick pro form item props |
|
|
42
|
+
| `getFieldPropsOrFormItemProps` | Get field or form item props |
|
|
43
|
+
| `proFieldParsingText` | Parse pro field text values |
|
|
44
|
+
|
|
45
|
+
### Composables (Hooks)
|
|
46
|
+
|
|
47
|
+
| Hook | Description |
|
|
48
|
+
|------|-------------|
|
|
49
|
+
| `useMountMergeState` | State that merges on mount |
|
|
50
|
+
| `useEditableArray` | Manage editable array data |
|
|
51
|
+
| `usePrevious` | Track previous value |
|
|
52
|
+
| `useRefFunction` | Ref-based callback function |
|
|
53
|
+
| `useBreakpoint` | Responsive breakpoint detection (via `useMedia`) |
|
|
54
|
+
| `useFormFieldContextInject` / `useFormFieldContextProvider` | Form field context utilities |
|
|
55
|
+
| `useProFormContextInject` / `useProFormContextProvider` | Pro form context utilities |
|
|
56
|
+
|
|
57
|
+
### Components
|
|
58
|
+
|
|
59
|
+
| Component | Description |
|
|
60
|
+
|-----------|-------------|
|
|
61
|
+
| `ErrorBoundary` | Error boundary wrapper component |
|
|
62
|
+
| `CopyToClipboard` | Copy content to clipboard |
|
|
63
|
+
| `FieldLabel` | Field label component |
|
|
64
|
+
| `LabelIconTip` | Label with icon tooltip |
|
|
65
|
+
| `FormList` | Dynamic form list component |
|
|
66
|
+
| `FormItem` | Enhanced form item component |
|
|
67
|
+
| `FilterDropdown` | Filter dropdown component |
|
|
68
|
+
| `DropdownFooter` | Dropdown footer component |
|
|
69
|
+
| `InlineErrorFormItem` | Inline error form item |
|
|
70
|
+
|
|
71
|
+
### Date Utilities
|
|
72
|
+
|
|
73
|
+
| Function | Description |
|
|
74
|
+
|----------|-------------|
|
|
75
|
+
| `parseValueToDay` | Parse value to Day.js object |
|
|
76
|
+
| `conversionMomentValue` | Convert moment-compatible values |
|
|
77
|
+
| `dateArrayFormatter` | Format date arrays |
|
|
78
|
+
|
|
79
|
+
## License
|
|
80
|
+
|
|
81
|
+
[MIT](../../LICENSE)
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Fragment, Text, cloneVNode, isVNode } from "vue";
|
|
2
|
+
//#region src/autoFocusToFirstChild/index.ts
|
|
3
|
+
function supportsAutoFocus(node) {
|
|
4
|
+
if (typeof node.type !== "object" || node.type === null) return false;
|
|
5
|
+
const props = "props" in node.type ? node.type.props : void 0;
|
|
6
|
+
if (!props) return false;
|
|
7
|
+
if (Array.isArray(props)) return props.includes("autoFocus");
|
|
8
|
+
return "autoFocus" in props;
|
|
9
|
+
}
|
|
10
|
+
function walk(nodes, autoFocus, found) {
|
|
11
|
+
return nodes.map((node) => {
|
|
12
|
+
if (!isVNode(node)) return node;
|
|
13
|
+
if (node.type === Fragment || node.type === Comment || node.type === Text) {
|
|
14
|
+
if (Array.isArray(node.children)) return cloneVNode(node, { children: walk(node.children, autoFocus, found) });
|
|
15
|
+
return node;
|
|
16
|
+
}
|
|
17
|
+
if (found.value) return node;
|
|
18
|
+
if (supportsAutoFocus(node)) {
|
|
19
|
+
found.value = true;
|
|
20
|
+
return cloneVNode(node, {
|
|
21
|
+
...node.props,
|
|
22
|
+
autoFocus
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
return node;
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 将 autoFocus 应用到第一个子节点
|
|
30
|
+
*/
|
|
31
|
+
function autoFocusToFirstChild(nodes, autoFocus) {
|
|
32
|
+
if (!autoFocus || !nodes?.length) return nodes ?? [];
|
|
33
|
+
return walk(nodes, autoFocus, { value: false });
|
|
34
|
+
}
|
|
35
|
+
//#endregion
|
|
36
|
+
export { autoFocusToFirstChild };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { VNode } from "vue";
|
|
2
|
+
import { flattenChildren as childrenToArray } from "@v-c/util/dist/props-util";
|
|
3
|
+
|
|
4
|
+
//#region src/childrenToArray/index.d.ts
|
|
5
|
+
declare function isSpecialNode(node: VNode): boolean;
|
|
6
|
+
//#endregion
|
|
7
|
+
export { childrenToArray, isSpecialNode };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Comment, Fragment, Text } from "vue";
|
|
2
|
+
import { flattenChildren as childrenToArray } from "@v-c/util/dist/props-util";
|
|
3
|
+
//#region src/childrenToArray/index.ts
|
|
4
|
+
function isSpecialNode(node) {
|
|
5
|
+
return node.type === Fragment || node.type === Comment || node.type === Text;
|
|
6
|
+
}
|
|
7
|
+
//#endregion
|
|
8
|
+
export { childrenToArray, isSpecialNode };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
//#region src/components/CopyToClipboard/copy/index.d.ts
|
|
2
|
+
interface Options {
|
|
3
|
+
debug?: boolean;
|
|
4
|
+
message?: string;
|
|
5
|
+
format?: string;
|
|
6
|
+
onCopy?: (clipboardData: object) => void;
|
|
7
|
+
}
|
|
8
|
+
declare function copy(text: string, options?: Options): boolean;
|
|
9
|
+
//#endregion
|
|
10
|
+
export { copy as default };
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import deselectCurrent from "./toggle-selection.js";
|
|
2
|
+
//#region src/components/CopyToClipboard/copy/index.ts
|
|
3
|
+
const clipboardToIE11Formatting = {
|
|
4
|
+
"text/plain": "Text",
|
|
5
|
+
"text/html": "Url",
|
|
6
|
+
default: "Text"
|
|
7
|
+
};
|
|
8
|
+
const defaultMessage = "Copy to clipboard: #{key}, Enter";
|
|
9
|
+
function format(message) {
|
|
10
|
+
const copyKey = `${/mac os x/i.test(navigator.userAgent) ? "⌘" : "Ctrl"}+C`;
|
|
11
|
+
return message.replace(/#\{\s*key\s*\}/g, copyKey);
|
|
12
|
+
}
|
|
13
|
+
function copy(text, options) {
|
|
14
|
+
let message;
|
|
15
|
+
let reselectPrevious;
|
|
16
|
+
let range;
|
|
17
|
+
let selection;
|
|
18
|
+
let mark;
|
|
19
|
+
let success = false;
|
|
20
|
+
if (!options) options = {};
|
|
21
|
+
const debug = options.debug || false;
|
|
22
|
+
try {
|
|
23
|
+
reselectPrevious = deselectCurrent();
|
|
24
|
+
range = document.createRange();
|
|
25
|
+
selection = document.getSelection();
|
|
26
|
+
mark = document.createElement("span");
|
|
27
|
+
mark.textContent = text;
|
|
28
|
+
mark.style.all = "unset";
|
|
29
|
+
mark.style.position = "fixed";
|
|
30
|
+
mark.style.top = "0";
|
|
31
|
+
mark.style.clip = "rect(0, 0, 0, 0)";
|
|
32
|
+
mark.style.whiteSpace = "pre";
|
|
33
|
+
mark.style.webkitUserSelect = "text";
|
|
34
|
+
mark.style.setProperty("MozUserSelect", "text");
|
|
35
|
+
mark.style.setProperty("msUserSelect", "text");
|
|
36
|
+
mark.style.userSelect = "text";
|
|
37
|
+
mark.addEventListener("copy", (e) => {
|
|
38
|
+
e.stopPropagation();
|
|
39
|
+
if (options.format) {
|
|
40
|
+
e.preventDefault();
|
|
41
|
+
if (typeof e.clipboardData === "undefined") {
|
|
42
|
+
debug && console.warn("unable to use e.clipboardData");
|
|
43
|
+
debug && console.warn("trying IE specific stuff");
|
|
44
|
+
window.clipboardData.clearData();
|
|
45
|
+
const format = clipboardToIE11Formatting[options.format] || clipboardToIE11Formatting.default;
|
|
46
|
+
window.clipboardData.setData(format, text);
|
|
47
|
+
} else {
|
|
48
|
+
e.clipboardData?.clearData();
|
|
49
|
+
e.clipboardData?.setData(options.format, text);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (options.onCopy) {
|
|
53
|
+
e.preventDefault();
|
|
54
|
+
options.onCopy(e.clipboardData);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
document.body.appendChild(mark);
|
|
58
|
+
range.selectNodeContents(mark);
|
|
59
|
+
selection?.addRange(range);
|
|
60
|
+
if (!document.execCommand("copy")) throw new Error("copy command was unsuccessful");
|
|
61
|
+
success = true;
|
|
62
|
+
} catch (err) {
|
|
63
|
+
debug && console.error("unable to copy using execCommand: ", err);
|
|
64
|
+
debug && console.warn("trying IE specific stuff");
|
|
65
|
+
try {
|
|
66
|
+
window.clipboardData.setData(options.format || "text", text);
|
|
67
|
+
options.onCopy && options.onCopy(window.clipboardData);
|
|
68
|
+
success = true;
|
|
69
|
+
} catch (err) {
|
|
70
|
+
debug && console.error("unable to copy using clipboardData: ", err);
|
|
71
|
+
debug && console.error("falling back to prompt");
|
|
72
|
+
message = format("message" in options ? options.message : defaultMessage);
|
|
73
|
+
window.prompt(message, text);
|
|
74
|
+
}
|
|
75
|
+
} finally {
|
|
76
|
+
if (selection) if (typeof selection.removeRange == "function") selection.removeRange(range);
|
|
77
|
+
else selection.removeAllRanges();
|
|
78
|
+
if (mark) document.body.removeChild(mark);
|
|
79
|
+
reselectPrevious?.();
|
|
80
|
+
}
|
|
81
|
+
return success;
|
|
82
|
+
}
|
|
83
|
+
//#endregion
|
|
84
|
+
export { copy as default };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
//#region src/components/CopyToClipboard/copy/toggle-selection.ts
|
|
2
|
+
function deselectCurrent() {
|
|
3
|
+
const selection = document.getSelection();
|
|
4
|
+
if (!selection?.rangeCount) return function() {};
|
|
5
|
+
let active = document.activeElement;
|
|
6
|
+
const ranges = [];
|
|
7
|
+
for (let i = 0; i < selection.rangeCount; i++) ranges.push(selection.getRangeAt(i));
|
|
8
|
+
switch (active.tagName.toUpperCase()) {
|
|
9
|
+
case "INPUT":
|
|
10
|
+
case "TEXTAREA":
|
|
11
|
+
active.blur();
|
|
12
|
+
break;
|
|
13
|
+
default:
|
|
14
|
+
active = null;
|
|
15
|
+
break;
|
|
16
|
+
}
|
|
17
|
+
selection.removeAllRanges();
|
|
18
|
+
return function() {
|
|
19
|
+
selection.type === "Caret" && selection.removeAllRanges();
|
|
20
|
+
if (!selection.rangeCount) ranges.forEach((range) => {
|
|
21
|
+
selection.addRange(range);
|
|
22
|
+
});
|
|
23
|
+
active && active.focus();
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
//#endregion
|
|
27
|
+
export { deselectCurrent as default };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { FunctionalComponent } from "vue";
|
|
2
|
+
|
|
3
|
+
//#region src/components/CopyToClipboard/index.d.ts
|
|
4
|
+
declare const CopyToClipboard: FunctionalComponent<{
|
|
5
|
+
text?: string;
|
|
6
|
+
onCopy?: (text?: string, copied?: boolean) => void;
|
|
7
|
+
options?: {
|
|
8
|
+
debug?: boolean;
|
|
9
|
+
format?: 'text/plain' | 'text/html' | 'default';
|
|
10
|
+
message?: string;
|
|
11
|
+
};
|
|
12
|
+
}>;
|
|
13
|
+
//#endregion
|
|
14
|
+
export { CopyToClipboard as default };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import copy from "./copy/index.js";
|
|
2
|
+
import { createVNode } from "vue";
|
|
3
|
+
//#region src/components/CopyToClipboard/index.tsx
|
|
4
|
+
const CopyToClipboard = ({ text, onCopy, options }, { slots }) => createVNode("span", { "onClick": (e) => {
|
|
5
|
+
e.preventDefault();
|
|
6
|
+
e.stopPropagation();
|
|
7
|
+
const copied = copy(text, options);
|
|
8
|
+
if (onCopy) onCopy(text, copied);
|
|
9
|
+
} }, [slots.default?.()]);
|
|
10
|
+
CopyToClipboard.inheritAttrs = false;
|
|
11
|
+
CopyToClipboard.displayName = "CopyToClipboard";
|
|
12
|
+
//#endregion
|
|
13
|
+
export { CopyToClipboard as default };
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { Bounds, ControlPosition, DraggableEventHandler, PositionOffsetControlPosition } from "./types.js";
|
|
2
|
+
import { DraggableCoreDefaultProps, DraggableCoreProps } from "./DraggableCore.js";
|
|
3
|
+
import * as _$vue from "vue";
|
|
4
|
+
import { Plugin } from "vue";
|
|
5
|
+
import { CustomSlotsType, VueNode } from "@v-c/util/dist/type";
|
|
6
|
+
|
|
7
|
+
//#region src/components/Draggable/Draggable.d.ts
|
|
8
|
+
interface DraggableState {
|
|
9
|
+
dragging: boolean;
|
|
10
|
+
dragged: boolean;
|
|
11
|
+
x: number;
|
|
12
|
+
y: number;
|
|
13
|
+
slackX: number;
|
|
14
|
+
slackY: number;
|
|
15
|
+
isElementSVG: boolean;
|
|
16
|
+
prevPropsPosition: ControlPosition | null;
|
|
17
|
+
}
|
|
18
|
+
type DraggableDefaultProps = DraggableCoreDefaultProps & {
|
|
19
|
+
axis?: 'both' | 'x' | 'y' | 'none';
|
|
20
|
+
bounds?: Bounds | string | false;
|
|
21
|
+
defaultClass?: string;
|
|
22
|
+
defaultClassDragging?: string;
|
|
23
|
+
defaultClassDragged?: string;
|
|
24
|
+
defaultPosition?: ControlPosition;
|
|
25
|
+
scale?: number;
|
|
26
|
+
};
|
|
27
|
+
type DraggableProps = DraggableCoreProps & DraggableDefaultProps & {
|
|
28
|
+
positionOffset?: PositionOffsetControlPosition;
|
|
29
|
+
position?: ControlPosition;
|
|
30
|
+
};
|
|
31
|
+
interface DraggableEmits {
|
|
32
|
+
drag: DraggableEventHandler;
|
|
33
|
+
mousedown: (e: MouseEvent) => void;
|
|
34
|
+
start: DraggableEventHandler;
|
|
35
|
+
stop: DraggableEventHandler;
|
|
36
|
+
[key: string]: (...args: any[]) => void;
|
|
37
|
+
}
|
|
38
|
+
declare const _Draggable: _$vue.DefineSetupFnComponent<DraggableProps, DraggableEmits, CustomSlotsType<{
|
|
39
|
+
default?: () => VueNode[];
|
|
40
|
+
}>, DraggableCoreDefaultProps & {
|
|
41
|
+
cancel?: string;
|
|
42
|
+
offsetParent?: HTMLElement;
|
|
43
|
+
grid?: [number, number];
|
|
44
|
+
nodeRef?: _$vue.ShallowRef<HTMLElement | null> | null;
|
|
45
|
+
handle?: string;
|
|
46
|
+
} & {
|
|
47
|
+
axis?: "both" | "x" | "y" | "none";
|
|
48
|
+
bounds?: Bounds | string | false;
|
|
49
|
+
defaultClass?: string;
|
|
50
|
+
defaultClassDragging?: string;
|
|
51
|
+
defaultClassDragged?: string;
|
|
52
|
+
defaultPosition?: ControlPosition;
|
|
53
|
+
scale?: number;
|
|
54
|
+
} & {
|
|
55
|
+
positionOffset?: PositionOffsetControlPosition;
|
|
56
|
+
position?: ControlPosition;
|
|
57
|
+
} & {
|
|
58
|
+
[x: `on${Capitalize<string>}`]: ((...args: any[]) => any) | undefined;
|
|
59
|
+
}, _$vue.PublicProps>;
|
|
60
|
+
declare const Draggable: typeof _Draggable & Plugin;
|
|
61
|
+
//#endregion
|
|
62
|
+
export { DraggableDefaultProps, DraggableEmits, DraggableProps, DraggableState, Draggable as default };
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { useState } from "../../hooks/useState/index.js";
|
|
2
|
+
import { createCSSTransform, createSVGTransform } from "./utils/domFns.js";
|
|
3
|
+
import { canDragX, canDragY, createDraggableData, getBoundPosition } from "./utils/positionFns.js";
|
|
4
|
+
import DraggableCore from "./DraggableCore.js";
|
|
5
|
+
import { cloneVNode, createVNode, defineComponent, getCurrentInstance, isVNode, mergeProps, onMounted, onUnmounted, watch } from "vue";
|
|
6
|
+
import { classNames } from "@v-c/util";
|
|
7
|
+
//#region src/components/Draggable/Draggable.tsx
|
|
8
|
+
function _isSlot(s) {
|
|
9
|
+
return typeof s === "function" || Object.prototype.toString.call(s) === "[object Object]" && !isVNode(s);
|
|
10
|
+
}
|
|
11
|
+
const Draggable = /* @__PURE__ */ defineComponent((props, { slots, expose, emit }) => {
|
|
12
|
+
const [dragging, setDragging] = useState(false);
|
|
13
|
+
const [dragged, setDragged] = useState(false);
|
|
14
|
+
const [isElementSVG, setIsElementSVG] = useState(false);
|
|
15
|
+
const ctx = getCurrentInstance();
|
|
16
|
+
const [slackX, setSlackX] = useState(0);
|
|
17
|
+
const [slackY, setSlackY] = useState(0);
|
|
18
|
+
const [x, setX] = useState(() => {
|
|
19
|
+
return props.position?.x ?? props.defaultPosition?.x ?? 0;
|
|
20
|
+
});
|
|
21
|
+
const [y, setY] = useState(() => {
|
|
22
|
+
return props.position?.y ?? props.defaultPosition?.y ?? 0;
|
|
23
|
+
});
|
|
24
|
+
watch(() => props.position, (position) => {
|
|
25
|
+
if (position) {
|
|
26
|
+
setX(position.x);
|
|
27
|
+
setY(position.y);
|
|
28
|
+
}
|
|
29
|
+
}, { deep: true });
|
|
30
|
+
onMounted(() => {
|
|
31
|
+
if (typeof window.SVGElement !== "undefined" && props.nodeRef?.value instanceof window.SVGElement) setIsElementSVG(true);
|
|
32
|
+
});
|
|
33
|
+
onUnmounted(() => {
|
|
34
|
+
if (dragging.value) setDragging(false);
|
|
35
|
+
});
|
|
36
|
+
expose({
|
|
37
|
+
x,
|
|
38
|
+
y
|
|
39
|
+
});
|
|
40
|
+
return () => {
|
|
41
|
+
let _slot;
|
|
42
|
+
const [children] = slots.default?.();
|
|
43
|
+
const { axis = "both", bounds = false, defaultClass = "vue-draggable", defaultClassDragging = "vue-draggable-dragging", defaultClassDragged = "vue-draggable-dragged", defaultPosition = {
|
|
44
|
+
x: 0,
|
|
45
|
+
y: 0
|
|
46
|
+
}, scale = 1, position, positionOffset, ...draggableCoreProps } = props;
|
|
47
|
+
let style = {};
|
|
48
|
+
let svgTransform = null;
|
|
49
|
+
const draggable = !Boolean(position) || dragging.value;
|
|
50
|
+
const validPosition = position || defaultPosition;
|
|
51
|
+
const transformOpts = {
|
|
52
|
+
x: canDragX(axis) && draggable ? x.value : validPosition.x,
|
|
53
|
+
y: canDragY(axis) && draggable ? y.value : validPosition.y
|
|
54
|
+
};
|
|
55
|
+
if (isElementSVG.value) svgTransform = createSVGTransform(transformOpts, positionOffset);
|
|
56
|
+
else style = createCSSTransform(transformOpts, positionOffset);
|
|
57
|
+
return createVNode(DraggableCore, mergeProps(draggableCoreProps, {
|
|
58
|
+
"scale": scale,
|
|
59
|
+
"onStart": (e, coreData) => {
|
|
60
|
+
emit("start", e, createDraggableData(ctx, coreData));
|
|
61
|
+
setDragging(true);
|
|
62
|
+
setDragged(true);
|
|
63
|
+
},
|
|
64
|
+
"onDrag": (e, coreData) => {
|
|
65
|
+
if (!dragging.value) return false;
|
|
66
|
+
const uiData = createDraggableData(ctx, coreData);
|
|
67
|
+
const newState = {
|
|
68
|
+
x: uiData.x,
|
|
69
|
+
y: uiData.y,
|
|
70
|
+
slackX: 0,
|
|
71
|
+
slackY: 0
|
|
72
|
+
};
|
|
73
|
+
if (props.bounds) {
|
|
74
|
+
const { x: prevX, y: prevY } = newState;
|
|
75
|
+
newState.x += slackX.value;
|
|
76
|
+
newState.y += slackY.value;
|
|
77
|
+
const [newStateX, newStateY] = getBoundPosition(ctx, newState.x, newState.y);
|
|
78
|
+
newState.x = newStateX;
|
|
79
|
+
newState.y = newStateY;
|
|
80
|
+
newState.slackX = slackX.value + (prevX - newState.x);
|
|
81
|
+
newState.slackY = slackY.value + (prevY - newState.y);
|
|
82
|
+
uiData.x = newState.x;
|
|
83
|
+
uiData.y = newState.y;
|
|
84
|
+
uiData.deltaX = newState.x - x.value;
|
|
85
|
+
uiData.deltaY = newState.y - y.value;
|
|
86
|
+
}
|
|
87
|
+
emit("drag", e, uiData);
|
|
88
|
+
setX(newState.x);
|
|
89
|
+
setY(newState.y);
|
|
90
|
+
setSlackX(newState.slackX);
|
|
91
|
+
setSlackY(newState.slackY);
|
|
92
|
+
},
|
|
93
|
+
"onStop": (e, coreData) => {
|
|
94
|
+
if (!dragging.value) return false;
|
|
95
|
+
emit("stop", e, createDraggableData(ctx, coreData));
|
|
96
|
+
const newState = {
|
|
97
|
+
dragging: false,
|
|
98
|
+
slackX: 0,
|
|
99
|
+
slackY: 0
|
|
100
|
+
};
|
|
101
|
+
const controlled = Boolean(props.position);
|
|
102
|
+
if (controlled) {
|
|
103
|
+
const { x, y } = props.position;
|
|
104
|
+
newState.x = x;
|
|
105
|
+
newState.y = y;
|
|
106
|
+
}
|
|
107
|
+
setDragging(newState.dragging);
|
|
108
|
+
setSlackX(newState.slackX);
|
|
109
|
+
setSlackY(newState.slackY);
|
|
110
|
+
if (controlled) {
|
|
111
|
+
setX(newState.x);
|
|
112
|
+
setY(newState.y);
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
"onMousedown": (e) => emit("mousedown", e)
|
|
116
|
+
}), _isSlot(_slot = cloneVNode(children, {
|
|
117
|
+
class: classNames(children.props?.class, defaultClass, {
|
|
118
|
+
[defaultClassDragging]: dragging.value,
|
|
119
|
+
[defaultClassDragged]: dragged.value
|
|
120
|
+
}),
|
|
121
|
+
style: {
|
|
122
|
+
...children.props?.style,
|
|
123
|
+
...style
|
|
124
|
+
},
|
|
125
|
+
transform: svgTransform
|
|
126
|
+
})) ? _slot : { default: () => [_slot] });
|
|
127
|
+
};
|
|
128
|
+
}, {
|
|
129
|
+
name: "Draggable",
|
|
130
|
+
inheritAttrs: false,
|
|
131
|
+
props: [
|
|
132
|
+
"allowAnyClick",
|
|
133
|
+
"allowMobileScroll",
|
|
134
|
+
"axis",
|
|
135
|
+
"bounds",
|
|
136
|
+
"cancel",
|
|
137
|
+
"defaultClass",
|
|
138
|
+
"defaultClassDragged",
|
|
139
|
+
"defaultClassDragging",
|
|
140
|
+
"defaultPosition",
|
|
141
|
+
"disabled",
|
|
142
|
+
"enableUserSelectHack",
|
|
143
|
+
"grid",
|
|
144
|
+
"handle",
|
|
145
|
+
"nodeRef",
|
|
146
|
+
"offsetParent",
|
|
147
|
+
"position",
|
|
148
|
+
"positionOffset",
|
|
149
|
+
"scale"
|
|
150
|
+
],
|
|
151
|
+
emits: [
|
|
152
|
+
"drag",
|
|
153
|
+
"mousedown",
|
|
154
|
+
"start",
|
|
155
|
+
"stop"
|
|
156
|
+
]
|
|
157
|
+
});
|
|
158
|
+
Draggable.install = (app) => {
|
|
159
|
+
app.component(Draggable.name, Draggable);
|
|
160
|
+
};
|
|
161
|
+
//#endregion
|
|
162
|
+
export { Draggable as default };
|