@fjyueke/arco-mcp 1.0.0
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/README.md +85 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +244 -0
- package/metaData/components/action-sheet/doc.md +102 -0
- package/metaData/components/action-sheet/example/index.tsx +199 -0
- package/metaData/components/action-sheet/example/methods.tsx +6 -0
- package/metaData/components/avatar/doc.md +57 -0
- package/metaData/components/avatar/example/group.tsx +69 -0
- package/metaData/components/avatar/example/index.tsx +196 -0
- package/metaData/components/badge/doc.md +28 -0
- package/metaData/components/badge/example/index.tsx +128 -0
- package/metaData/components/button/doc.md +45 -0
- package/metaData/components/button/example/index.tsx +264 -0
- package/metaData/components/carousel/doc.md +89 -0
- package/metaData/components/carousel/example/index.tsx +1481 -0
- package/metaData/components/cell/doc.md +68 -0
- package/metaData/components/cell/example/arrow.tsx +13 -0
- package/metaData/components/cell/example/cell.tsx +71 -0
- package/metaData/components/cell/example/group.tsx +63 -0
- package/metaData/components/cell/example/index.tsx +19 -0
- package/metaData/components/checkbox/doc.md +91 -0
- package/metaData/components/checkbox/example/checkbox.tsx +158 -0
- package/metaData/components/checkbox/example/group.tsx +103 -0
- package/metaData/components/checkbox/example/index.tsx +25 -0
- package/metaData/components/circle-progress/doc.md +40 -0
- package/metaData/components/circle-progress/example/index.tsx +323 -0
- package/metaData/components/collapse/doc.md +74 -0
- package/metaData/components/collapse/example/collapse.tsx +183 -0
- package/metaData/components/collapse/example/group.tsx +136 -0
- package/metaData/components/collapse/example/index.tsx +16 -0
- package/metaData/components/collapse/example/utils.tsx +20 -0
- package/metaData/components/context-provider/doc.md +44 -0
- package/metaData/components/context-provider/example/index.tsx +208 -0
- package/metaData/components/count-down/doc.md +40 -0
- package/metaData/components/count-down/example/hooks.tsx +118 -0
- package/metaData/components/count-down/example/index.tsx +63 -0
- package/metaData/components/date-picker/doc.md +102 -0
- package/metaData/components/date-picker/example/index.tsx +545 -0
- package/metaData/components/dialog/doc.md +200 -0
- package/metaData/components/dialog/example/index.tsx +328 -0
- package/metaData/components/dialog/example/methods.tsx +56 -0
- package/metaData/components/divider/doc.md +25 -0
- package/metaData/components/divider/example/index.tsx +87 -0
- package/metaData/components/dropdown/doc.md +80 -0
- package/metaData/components/dropdown/example/dropdown.tsx +308 -0
- package/metaData/components/dropdown/example/index.tsx +19 -0
- package/metaData/components/dropdown/example/options.tsx +103 -0
- package/metaData/components/dropdown-menu/doc.md +91 -0
- package/metaData/components/dropdown-menu/example/dropdown-menu.tsx +270 -0
- package/metaData/components/dropdown-menu/example/index.tsx +16 -0
- package/metaData/components/ellipsis/doc.md +33 -0
- package/metaData/components/ellipsis/example/index.tsx +93 -0
- package/metaData/components/ellipsis/example/js-ellipsis.tsx +229 -0
- package/metaData/components/ellipsis/example/native-ellipsis.tsx +48 -0
- package/metaData/components/form/doc.md +90 -0
- package/metaData/components/form/example/form-item-context.tsx +8 -0
- package/metaData/components/form/example/form-item.tsx +378 -0
- package/metaData/components/form/example/index.tsx +87 -0
- package/metaData/components/form/example/linked-container.tsx +66 -0
- package/metaData/components/grid/doc.md +39 -0
- package/metaData/components/grid/example/index.tsx +252 -0
- package/metaData/components/icon/doc.md +15 -0
- package/metaData/components/icon/example/index.tsx +32 -0
- package/metaData/components/image/doc.md +62 -0
- package/metaData/components/image/example/index.tsx +528 -0
- package/metaData/components/image-picker/doc.md +116 -0
- package/metaData/components/image-picker/example/add-icon.tsx +14 -0
- package/metaData/components/image-picker/example/index.tsx +175 -0
- package/metaData/components/image-preview/doc.md +119 -0
- package/metaData/components/image-preview/example/index.tsx +1290 -0
- package/metaData/components/image-preview/example/methods.tsx +72 -0
- package/metaData/components/index-bar/doc.md +83 -0
- package/metaData/components/index-bar/example/group.tsx +93 -0
- package/metaData/components/index-bar/example/index.tsx +271 -0
- package/metaData/components/index-bar/example/side-bar.tsx +82 -0
- package/metaData/components/input/doc.md +60 -0
- package/metaData/components/input/example/hooks.tsx +259 -0
- package/metaData/components/input/example/index.tsx +134 -0
- package/metaData/components/input/example/props.tsx +183 -0
- package/metaData/components/keyboard/doc.md +73 -0
- package/metaData/components/keyboard/example/index.tsx +238 -0
- package/metaData/components/load-more/doc.md +48 -0
- package/metaData/components/load-more/example/index.tsx +395 -0
- package/metaData/components/loading/doc.md +34 -0
- package/metaData/components/loading/example/index.tsx +312 -0
- package/metaData/components/masking/doc.md +93 -0
- package/metaData/components/masking/example/index.tsx +410 -0
- package/metaData/components/masking/example/methods.tsx +88 -0
- package/metaData/components/nav-bar/doc.md +40 -0
- package/metaData/components/nav-bar/example/back-icon.tsx +28 -0
- package/metaData/components/nav-bar/example/index.tsx +305 -0
- package/metaData/components/notice-bar/doc.md +34 -0
- package/metaData/components/notice-bar/example/index.tsx +294 -0
- package/metaData/components/notify/doc.md +81 -0
- package/metaData/components/notify/example/index.tsx +171 -0
- package/metaData/components/notify/example/methods.tsx +83 -0
- package/metaData/components/pagination/doc.md +41 -0
- package/metaData/components/pagination/example/arrow.tsx +14 -0
- package/metaData/components/pagination/example/index.tsx +292 -0
- package/metaData/components/picker/doc.md +89 -0
- package/metaData/components/picker/example/index.tsx +217 -0
- package/metaData/components/picker-view/doc.md +57 -0
- package/metaData/components/picker-view/example/cascader.tsx +141 -0
- package/metaData/components/picker-view/example/index.tsx +297 -0
- package/metaData/components/picker-view/example/multi-picker.tsx +66 -0
- package/metaData/components/picker-view/example/picker-cell.tsx +416 -0
- package/metaData/components/popover/doc.md +144 -0
- package/metaData/components/popover/example/index.tsx +23 -0
- package/metaData/components/popover/example/menu.tsx +145 -0
- package/metaData/components/popover/example/popover-inner.tsx +147 -0
- package/metaData/components/popover/example/popover.tsx +268 -0
- package/metaData/components/popup/doc.md +101 -0
- package/metaData/components/popup/example/index.tsx +125 -0
- package/metaData/components/popup/example/methods.tsx +6 -0
- package/metaData/components/popup-swiper/doc.md +108 -0
- package/metaData/components/popup-swiper/example/index.tsx +332 -0
- package/metaData/components/popup-swiper/example/methods.tsx +6 -0
- package/metaData/components/portal/doc.md +14 -0
- package/metaData/components/portal/example/index.tsx +35 -0
- package/metaData/components/progress/doc.md +42 -0
- package/metaData/components/progress/example/index.tsx +256 -0
- package/metaData/components/pull-refresh/doc.md +37 -0
- package/metaData/components/pull-refresh/example/android-pull-refresh.tsx +260 -0
- package/metaData/components/pull-refresh/example/index.tsx +44 -0
- package/metaData/components/pull-refresh/example/ios-pull-refresh.tsx +216 -0
- package/metaData/components/radio/doc.md +89 -0
- package/metaData/components/radio/example/group.tsx +92 -0
- package/metaData/components/radio/example/index.tsx +25 -0
- package/metaData/components/radio/example/radio.tsx +22 -0
- package/metaData/components/rate/doc.md +33 -0
- package/metaData/components/rate/example/index.tsx +281 -0
- package/metaData/components/search-bar/doc.md +97 -0
- package/metaData/components/search-bar/example/association.tsx +89 -0
- package/metaData/components/search-bar/example/cancel-button.tsx +34 -0
- package/metaData/components/search-bar/example/highlight.tsx +66 -0
- package/metaData/components/search-bar/example/index.tsx +251 -0
- package/metaData/components/show-monitor/doc.md +34 -0
- package/metaData/components/show-monitor/example/index.tsx +646 -0
- package/metaData/components/skeleton/doc.md +101 -0
- package/metaData/components/skeleton/example/elements.tsx +290 -0
- package/metaData/components/skeleton/example/index.tsx +96 -0
- package/metaData/components/skeleton/example/skeleton-context.tsx +7 -0
- package/metaData/components/slider/doc.md +42 -0
- package/metaData/components/slider/example/index.tsx +326 -0
- package/metaData/components/slider/example/marks.tsx +50 -0
- package/metaData/components/slider/example/popover.tsx +38 -0
- package/metaData/components/slider/example/thumb.tsx +48 -0
- package/metaData/components/slider/example/useSliderIcon.tsx +38 -0
- package/metaData/components/slider/example/useSliderInit.tsx +170 -0
- package/metaData/components/stepper/doc.md +46 -0
- package/metaData/components/stepper/example/index.tsx +166 -0
- package/metaData/components/stepper/example/useButtonClick.tsx +74 -0
- package/metaData/components/stepper/example/useInputEvent.tsx +65 -0
- package/metaData/components/stepper/example/useValue.tsx +43 -0
- package/metaData/components/steps/doc.md +57 -0
- package/metaData/components/steps/example/index.tsx +123 -0
- package/metaData/components/steps/example/step.tsx +126 -0
- package/metaData/components/sticky/doc.md +45 -0
- package/metaData/components/sticky/example/index.tsx +430 -0
- package/metaData/components/swipe-action/doc.md +44 -0
- package/metaData/components/swipe-action/example/index.tsx +338 -0
- package/metaData/components/swipe-action/example/item.tsx +40 -0
- package/metaData/components/swipe-load/doc.md +43 -0
- package/metaData/components/swipe-load/example/index.tsx +339 -0
- package/metaData/components/swipe-load/example/type.tsx +153 -0
- package/metaData/components/switch/doc.md +38 -0
- package/metaData/components/switch/example/index.tsx +237 -0
- package/metaData/components/tab-bar/doc.md +57 -0
- package/metaData/components/tab-bar/example/index.tsx +18 -0
- package/metaData/components/tab-bar/example/item.tsx +74 -0
- package/metaData/components/tab-bar/example/tab-bar.tsx +105 -0
- package/metaData/components/tabs/doc.md +187 -0
- package/metaData/components/tabs/example/index.tsx +514 -0
- package/metaData/components/tabs/example/tab-cell-underline.tsx +320 -0
- package/metaData/components/tabs/example/tab-cell.tsx +433 -0
- package/metaData/components/tabs/example/tab-pane.tsx +349 -0
- package/metaData/components/tag/doc.md +80 -0
- package/metaData/components/tag/example/index.tsx +23 -0
- package/metaData/components/tag/example/list.tsx +97 -0
- package/metaData/components/tag/example/tag.tsx +85 -0
- package/metaData/components/textarea/doc.md +67 -0
- package/metaData/components/textarea/example/index.tsx +258 -0
- package/metaData/components/toast/doc.md +90 -0
- package/metaData/components/toast/example/index.tsx +335 -0
- package/metaData/components/toast/example/methods.tsx +87 -0
- package/metaData/components/transition/doc.md +19 -0
- package/metaData/components/transition/example/index.tsx +113 -0
- package/metaData/components/uploader/doc.md +82 -0
- package/metaData/components/uploader/example/index.tsx +208 -0
- package/metaData/components-index.json +242 -0
- package/package.json +56 -0
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import React, { Ref, useEffect, useRef, forwardRef, useImperativeHandle, useCallback } from 'react';
|
|
2
|
+
import ResizeObserver from 'resize-observer-polyfill';
|
|
3
|
+
|
|
4
|
+
import { JsEllipsisProps, JsEllipsisRef } from '../type';
|
|
5
|
+
import { getLineHeight, wrapTextChildNodesWithSpan } from '../utils/dom';
|
|
6
|
+
import { useLatestRef } from '../../_helpers';
|
|
7
|
+
|
|
8
|
+
const JsEllipsis = forwardRef((props: JsEllipsisProps, ref: Ref<JsEllipsisRef>) => {
|
|
9
|
+
const {
|
|
10
|
+
prefixCls,
|
|
11
|
+
text,
|
|
12
|
+
ellipsis,
|
|
13
|
+
dangerouslyUseInnerHTML,
|
|
14
|
+
maxLine = 1,
|
|
15
|
+
maxHeight,
|
|
16
|
+
ellipsisNode,
|
|
17
|
+
collapseNode,
|
|
18
|
+
endExcludes,
|
|
19
|
+
reflowOnResize,
|
|
20
|
+
onReflow,
|
|
21
|
+
onEllipsisNodeClick,
|
|
22
|
+
onCollapseNodeClick,
|
|
23
|
+
} = props;
|
|
24
|
+
const truncating = useRef(false);
|
|
25
|
+
const domRef = useRef<HTMLDivElement>(null);
|
|
26
|
+
const textRef = useRef<HTMLSpanElement>(null);
|
|
27
|
+
const ellipsisRef = useRef<HTMLSpanElement>(null);
|
|
28
|
+
const ellipsisValueRef = useLatestRef(ellipsis);
|
|
29
|
+
|
|
30
|
+
const lineHeightRef = useRef(0);
|
|
31
|
+
const setCurLineHeight = useCallback(() => {
|
|
32
|
+
if (domRef.current) {
|
|
33
|
+
lineHeightRef.current = Math.round(getLineHeight(domRef.current));
|
|
34
|
+
}
|
|
35
|
+
}, []);
|
|
36
|
+
useEffect(() => {
|
|
37
|
+
setCurLineHeight();
|
|
38
|
+
}, []);
|
|
39
|
+
|
|
40
|
+
function handleOnReflow(isEllipsis: boolean, result: string) {
|
|
41
|
+
if (onReflow && typeof onReflow === 'function') {
|
|
42
|
+
onReflow(isEllipsis, result);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function getActualHeight(container: HTMLElement) {
|
|
46
|
+
const { height } = container.getBoundingClientRect();
|
|
47
|
+
return Math.round(height);
|
|
48
|
+
}
|
|
49
|
+
function truncateText(container: HTMLElement, textContainer: HTMLElement, max: number) {
|
|
50
|
+
const content = textContainer.textContent || '';
|
|
51
|
+
let currentText = '';
|
|
52
|
+
let l = 0;
|
|
53
|
+
let r = content.length - 1;
|
|
54
|
+
// Binary truncate text until get the max limit fragment of text.
|
|
55
|
+
while (l < r) {
|
|
56
|
+
const m = Math.floor((l + r) / 2);
|
|
57
|
+
if (l === m) {
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
const temp = content.slice(l, m);
|
|
61
|
+
textContainer.innerText = currentText + temp;
|
|
62
|
+
const actualHeight = getActualHeight(container);
|
|
63
|
+
if (actualHeight > max) {
|
|
64
|
+
r = m;
|
|
65
|
+
} else {
|
|
66
|
+
currentText += temp;
|
|
67
|
+
l = m;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Remove the last character if it is orphaned high-surrogate characters (indicative of incomplete emoji).
|
|
71
|
+
currentText = currentText.replace(/[\uD800-\uDBFF]+$/, '');
|
|
72
|
+
// Remove the exclude char at the end of the content.
|
|
73
|
+
while (endExcludes && endExcludes.includes(currentText[currentText.length - 1])) {
|
|
74
|
+
currentText = currentText.slice(0, -1);
|
|
75
|
+
}
|
|
76
|
+
// Callback after reflow.
|
|
77
|
+
handleOnReflow(true, currentText);
|
|
78
|
+
textContainer.innerText = currentText;
|
|
79
|
+
}
|
|
80
|
+
function truncateHTML(container: HTMLElement, textContainer: HTMLElement, max: number) {
|
|
81
|
+
// only enter this function when container overflow.
|
|
82
|
+
const children = textContainer.childNodes;
|
|
83
|
+
if (children.length === 1) {
|
|
84
|
+
const node = children[0] as HTMLElement;
|
|
85
|
+
if (node.nodeType === Node.TEXT_NODE) {
|
|
86
|
+
truncateText(container, textContainer, max);
|
|
87
|
+
} else {
|
|
88
|
+
const html = node.innerHTML;
|
|
89
|
+
// clear content to determine whether the empty node can be placed.
|
|
90
|
+
node.innerHTML = '';
|
|
91
|
+
const actualHeight = getActualHeight(container);
|
|
92
|
+
if (actualHeight > max) {
|
|
93
|
+
// return after remove the node, if overflow with empty node.
|
|
94
|
+
textContainer.removeChild(node);
|
|
95
|
+
handleOnReflow(true, textContainer.innerHTML);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
node.innerHTML = html;
|
|
99
|
+
// recursive truncate node
|
|
100
|
+
truncateHTML(container, node, max);
|
|
101
|
+
}
|
|
102
|
+
} else {
|
|
103
|
+
const nodes = [].slice.call(children);
|
|
104
|
+
textContainer.innerHTML = '';
|
|
105
|
+
let i = 0;
|
|
106
|
+
// find the critical node
|
|
107
|
+
while (i < nodes.length) {
|
|
108
|
+
textContainer.appendChild(nodes[i]);
|
|
109
|
+
const actualHeight = getActualHeight(container);
|
|
110
|
+
if (actualHeight > max) {
|
|
111
|
+
if (nodes[i].childNodes && nodes[i].childNodes.length) {
|
|
112
|
+
break;
|
|
113
|
+
} else {
|
|
114
|
+
textContainer.removeChild(nodes[i]);
|
|
115
|
+
handleOnReflow(true, textContainer.innerHTML);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
i++;
|
|
120
|
+
}
|
|
121
|
+
if (textContainer.childNodes[i]) {
|
|
122
|
+
// truncate the critical node
|
|
123
|
+
truncateHTML(container, textContainer.childNodes[i] as HTMLElement, max);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// reflow when the main props change.
|
|
128
|
+
const reflow = useCallback(() => {
|
|
129
|
+
if (!domRef.current || !textRef.current || !ellipsisRef.current || truncating.current) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
ellipsisRef.current.style.display = 'none';
|
|
133
|
+
if (dangerouslyUseInnerHTML) {
|
|
134
|
+
textRef.current.innerHTML = text;
|
|
135
|
+
textRef.current.classList.add(`${prefixCls}-js-content-text-pre`);
|
|
136
|
+
} else {
|
|
137
|
+
textRef.current.innerText = text;
|
|
138
|
+
}
|
|
139
|
+
if (!ellipsisValueRef.current) {
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
textRef.current.classList.remove(`${prefixCls}-js-content-text-pre`);
|
|
143
|
+
const actualHeight = getActualHeight(domRef.current);
|
|
144
|
+
const max = isNaN(Number(maxHeight)) ? lineHeightRef.current * maxLine : Number(maxHeight);
|
|
145
|
+
if (actualHeight <= max) {
|
|
146
|
+
handleOnReflow(false, text);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
truncating.current = true;
|
|
150
|
+
ellipsisRef.current.style.display = 'inline';
|
|
151
|
+
if (dangerouslyUseInnerHTML) {
|
|
152
|
+
// wrap the text children node with span element.
|
|
153
|
+
wrapTextChildNodesWithSpan(textRef.current, `${prefixCls}-js-content-text`);
|
|
154
|
+
truncateHTML(domRef.current, textRef.current, max);
|
|
155
|
+
} else {
|
|
156
|
+
truncateText(domRef.current, textRef.current, max);
|
|
157
|
+
}
|
|
158
|
+
truncating.current = false;
|
|
159
|
+
}, [text, ellipsis, dangerouslyUseInnerHTML, maxLine, maxHeight, ellipsisNode, endExcludes]);
|
|
160
|
+
|
|
161
|
+
useEffect(() => {
|
|
162
|
+
reflow();
|
|
163
|
+
}, [reflow]);
|
|
164
|
+
|
|
165
|
+
const observerRef = useRef<ResizeObserver | null>(null);
|
|
166
|
+
// Observe resize event of container if reflowOnResize is true.
|
|
167
|
+
useEffect(() => {
|
|
168
|
+
if (domRef.current && reflowOnResize) {
|
|
169
|
+
if (!observerRef.current && ellipsis) {
|
|
170
|
+
observerRef.current = new ResizeObserver(reflow);
|
|
171
|
+
observerRef.current.observe(domRef.current);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return () => {
|
|
175
|
+
// Remove observer when component unmounted.
|
|
176
|
+
if (observerRef.current && domRef.current) {
|
|
177
|
+
observerRef.current.unobserve(domRef.current);
|
|
178
|
+
observerRef.current = null;
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
}, [ellipsis]);
|
|
182
|
+
|
|
183
|
+
useImperativeHandle(
|
|
184
|
+
ref,
|
|
185
|
+
() => ({
|
|
186
|
+
dom: domRef.current,
|
|
187
|
+
reflow,
|
|
188
|
+
}),
|
|
189
|
+
[reflow],
|
|
190
|
+
);
|
|
191
|
+
|
|
192
|
+
return (
|
|
193
|
+
<div ref={domRef} className={`${prefixCls}-js`}>
|
|
194
|
+
<span ref={textRef} className={`${prefixCls}-js-content`}>
|
|
195
|
+
{dangerouslyUseInnerHTML ? (
|
|
196
|
+
<span
|
|
197
|
+
className={`${prefixCls}-js-content-initial`}
|
|
198
|
+
style={{
|
|
199
|
+
WebkitLineClamp: maxLine,
|
|
200
|
+
}}
|
|
201
|
+
dangerouslySetInnerHTML={{ __html: text }}
|
|
202
|
+
/>
|
|
203
|
+
) : (
|
|
204
|
+
<span
|
|
205
|
+
className={`${prefixCls}-js-content-initial`}
|
|
206
|
+
style={{
|
|
207
|
+
WebkitLineClamp: maxLine,
|
|
208
|
+
}}
|
|
209
|
+
>
|
|
210
|
+
{text}
|
|
211
|
+
</span>
|
|
212
|
+
)}
|
|
213
|
+
</span>
|
|
214
|
+
<span
|
|
215
|
+
ref={ellipsisRef}
|
|
216
|
+
className={`${prefixCls}-js-content-ellipsis`}
|
|
217
|
+
onClick={onEllipsisNodeClick}
|
|
218
|
+
>
|
|
219
|
+
{ellipsisNode}
|
|
220
|
+
</span>
|
|
221
|
+
{!ellipsis && collapseNode && (
|
|
222
|
+
<span className={`${prefixCls}-js-content-collapse`} onClick={onCollapseNodeClick}>
|
|
223
|
+
{collapseNode}
|
|
224
|
+
</span>
|
|
225
|
+
)}
|
|
226
|
+
</div>
|
|
227
|
+
);
|
|
228
|
+
});
|
|
229
|
+
export default React.memo(JsEllipsis);
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { cls } from '@arco-design/mobile-utils';
|
|
3
|
+
|
|
4
|
+
import { NativeEllipsisProps } from '../type';
|
|
5
|
+
|
|
6
|
+
function NativeEllipsis({
|
|
7
|
+
prefixCls,
|
|
8
|
+
ellipsis,
|
|
9
|
+
dangerouslyUseInnerHTML,
|
|
10
|
+
text,
|
|
11
|
+
maxLine,
|
|
12
|
+
ellipsisNode,
|
|
13
|
+
collapseNode = '',
|
|
14
|
+
onEllipsisNodeClick,
|
|
15
|
+
onCollapseNodeClick,
|
|
16
|
+
}: NativeEllipsisProps) {
|
|
17
|
+
return (
|
|
18
|
+
<div
|
|
19
|
+
className={cls(`${prefixCls}-native`, {
|
|
20
|
+
ellipsis,
|
|
21
|
+
})}
|
|
22
|
+
style={{
|
|
23
|
+
WebkitLineClamp: maxLine,
|
|
24
|
+
}}
|
|
25
|
+
>
|
|
26
|
+
{dangerouslyUseInnerHTML ? (
|
|
27
|
+
// eslint-disable-next-line react/no-danger,@typescript-eslint/naming-convention
|
|
28
|
+
<span dangerouslySetInnerHTML={{ __html: text }} />
|
|
29
|
+
) : (
|
|
30
|
+
<span>{text}</span>
|
|
31
|
+
)}
|
|
32
|
+
{!ellipsis && collapseNode && (
|
|
33
|
+
<span onClick={onCollapseNodeClick} className={cls(`${prefixCls}-native-collapse`)}>
|
|
34
|
+
{collapseNode}
|
|
35
|
+
</span>
|
|
36
|
+
)}
|
|
37
|
+
{ellipsis && (ellipsisNode !== '...' || onEllipsisNodeClick) ? (
|
|
38
|
+
<span
|
|
39
|
+
onClick={onEllipsisNodeClick}
|
|
40
|
+
className={cls(`${prefixCls}-native-ellipsis-node`)}
|
|
41
|
+
>
|
|
42
|
+
{ellipsisNode}
|
|
43
|
+
</span>
|
|
44
|
+
) : null}
|
|
45
|
+
</div>
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
export default NativeEllipsis;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
### 数据录入
|
|
2
|
+
|
|
3
|
+
# 表单 Form
|
|
4
|
+
|
|
5
|
+
表单组件用于集合数据录入
|
|
6
|
+
|
|
7
|
+
======
|
|
8
|
+
|
|
9
|
+
> 属性/Props
|
|
10
|
+
|
|
11
|
+
|参数|描述|类型|默认值|
|
|
12
|
+
|----------|-------------|------|------|
|
|
13
|
+
|className|自定义类名|string|-|
|
|
14
|
+
|style|自定义样式|CSSProperties|-|
|
|
15
|
+
|layout|表单项布局|"horizontal" \| "vertical" \| "inline"|"horizontal"|
|
|
16
|
+
|form|表单实例|IFormInstance|-|
|
|
17
|
+
|initialValues|表单初始数据|Record\<string, any\>|-|
|
|
18
|
+
|onValuesChange|表单项数据变化时的回调|(changedValues: any, values: any) =\> void|-|
|
|
19
|
+
|onChange|表单项数据变化时的回调(仅用户操作表单时触发)|(changedValues: any, values: any) =\> void|-|
|
|
20
|
+
|onSubmit|表单项数据变化时的回调|(values: any, otherInfo?: IFieldError\[\]) =\> void|-|
|
|
21
|
+
|onSubmitFailed|表单项数据变化时的回调|(values: any, errorInfo: IFieldError\[\] \| Error) =\> void|-|
|
|
22
|
+
|disabled|表单禁止输入|boolean|-|
|
|
23
|
+
|
|
24
|
+
> 引用/Refs
|
|
25
|
+
|
|
26
|
+
|参数|描述|类型|
|
|
27
|
+
|----------|-------------|------|
|
|
28
|
+
|dom|最外层元素 DOM|HTMLFormElement|
|
|
29
|
+
|form|Form对象实例|IFormInstance|
|
|
30
|
+
|
|
31
|
+
> Form.Item
|
|
32
|
+
|
|
33
|
+
|参数|描述|类型|默认值|
|
|
34
|
+
|----------|-------------|------|------|
|
|
35
|
+
|label|表单项名|ReactNode|必填|
|
|
36
|
+
|style|表单项Stylesheet|CSSProperties|-|
|
|
37
|
+
|className|表单项样式|string|-|
|
|
38
|
+
|field|表单项字段|string|必填|
|
|
39
|
+
|required|表单项是否必填|boolean|-|
|
|
40
|
+
|disabled|表单项是否禁用|boolean|-|
|
|
41
|
+
|layout|表单项布局|"horizontal" \| "vertical" \| "inline"|"horizontal"|
|
|
42
|
+
|children|表单项子节点|ReactElement\<any, string \| ((props: any) =\> ReactElement\<any, any\>) \| (new (props: any) =\> Component\<any, any, any\>)\>|必填|
|
|
43
|
+
|shouldUpdate|表单项是否刷新|IShouldUpdateFunc|-|
|
|
44
|
+
|rules|表单项规则|IRules\[\]|-|
|
|
45
|
+
|extra|表单项下方节点|ReactElement\<any, string \| ((props: any) =\> ReactElement\<any, any\>) \| (new (props: any) =\> Component\<any, any, any\>)\>|-|
|
|
46
|
+
|trigger|触发事件更新事件名称|string|"onChange"|
|
|
47
|
+
|requiredIcon|自定义必填标识|ReactNode|-|
|
|
48
|
+
|initialValue|表单项初始数据|any|-|
|
|
49
|
+
|displayType|手动指定为内置组件的类型|"Input" \| "Textarea" \| "Checkbox" \| "CheckboxGroup" \| "DatePicker" \| "Picker" \| "Radio" \| "RadioGroup" \| "Slider" \| "Switch" \| "ImagePicker" \| "Rate" \| "Stepper"|-|
|
|
50
|
+
|
|
51
|
+
> IFormInstance
|
|
52
|
+
|
|
53
|
+
|参数|描述|类型|
|
|
54
|
+
|----------|-------------|------|
|
|
55
|
+
|getFieldValue|获取单个表单项值|(name: string) =\> any|
|
|
56
|
+
|getFieldsValue|获取多个表单项值|(name?: string\[\]) =\> Record\<string, any\>|
|
|
57
|
+
|getFieldError|获取单个表单项的错误|(name: string) =\> ReactNode\[\]|
|
|
58
|
+
|resetFields|重置表单项|() =\> void|
|
|
59
|
+
|setFieldValue|设置单个表单项值|(name: string, value: any) =\> boolean|
|
|
60
|
+
|setFieldsValue|设置多个表单项值|(value: Record\<string, any\>) =\> void|
|
|
61
|
+
|validateFields|校验所有表单项|() =\> Promise\<IFieldError\[\]\>|
|
|
62
|
+
|submit|提交表单|() =\> void|
|
|
63
|
+
|
|
64
|
+
> IFieldError
|
|
65
|
+
|
|
66
|
+
|参数|描述|类型|
|
|
67
|
+
|----------|-------------|------|
|
|
68
|
+
|value|-|any|
|
|
69
|
+
|errors|-|ReactNode\[\]|
|
|
70
|
+
|warnings|-|ReactNode\[\]|
|
|
71
|
+
|field|-|string|
|
|
72
|
+
|dom|-|HTMLDivElement|
|
|
73
|
+
|
|
74
|
+
> IRules
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
ITypeRules<ValidatorType.Number> | ITypeRules<ValidatorType.String> | ITypeRules<ValidatorType.Array> | ITypeRules<ValidatorType.Boolean> | ITypeRules<ValidatorType.Object> | ITypeRules<ValidatorType.Custom>
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
> FormInternalComponentType
|
|
81
|
+
|
|
82
|
+
```
|
|
83
|
+
"Input" | "Textarea" | "Checkbox" | "CheckboxGroup" | "DatePicker" | "Picker" | "Radio" | "RadioGroup" | "Slider" | "Switch" | "ImagePicker" | "Rate" | "Stepper"
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
> FormItemRef
|
|
87
|
+
|
|
88
|
+
|参数|描述|类型|
|
|
89
|
+
|----------|-------------|------|
|
|
90
|
+
|dom|最外层元素 DOM|HTMLDivElement|
|