wok-ui-ext 0.1.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/LICENSE +21 -0
- package/README.en.md +75 -0
- package/README.md +75 -0
- package/dist/alert/index.d.ts +10 -0
- package/dist/alert/index.js +48 -0
- package/dist/alert/style.css +116 -0
- package/dist/avatar/index.d.ts +9 -0
- package/dist/avatar/index.js +30 -0
- package/dist/avatar/style.css +32 -0
- package/dist/badge/index.d.ts +32 -0
- package/dist/badge/index.js +61 -0
- package/dist/badge/style.css +68 -0
- package/dist/breadcrumb/index.d.ts +25 -0
- package/dist/breadcrumb/index.js +47 -0
- package/dist/breadcrumb/style.css +35 -0
- package/dist/button/index.d.ts +34 -0
- package/dist/button/index.js +57 -0
- package/dist/button/style.css +133 -0
- package/dist/card/index.d.ts +25 -0
- package/dist/card/index.js +29 -0
- package/dist/card/style.css +23 -0
- package/dist/collapse/index.d.ts +89 -0
- package/dist/collapse/index.js +213 -0
- package/dist/collapse/style.css +76 -0
- package/dist/context-menu/context-menu.d.ts +113 -0
- package/dist/context-menu/context-menu.js +150 -0
- package/dist/context-menu/index.d.ts +30 -0
- package/dist/context-menu/index.js +42 -0
- package/dist/context-menu/style.css +46 -0
- package/dist/date-picker/calendar-panel.d.ts +44 -0
- package/dist/date-picker/calendar-panel.js +180 -0
- package/dist/date-picker/date-picker.d.ts +29 -0
- package/dist/date-picker/date-picker.js +81 -0
- package/dist/date-picker/date-utils.d.ts +63 -0
- package/dist/date-picker/date-utils.js +130 -0
- package/dist/date-picker/index.d.ts +7 -0
- package/dist/date-picker/index.js +5 -0
- package/dist/date-picker/layer.d.ts +19 -0
- package/dist/date-picker/layer.js +36 -0
- package/dist/date-picker/range-picker.d.ts +30 -0
- package/dist/date-picker/range-picker.js +117 -0
- package/dist/date-picker/style.css +161 -0
- package/dist/description-list/index.d.ts +37 -0
- package/dist/description-list/index.js +145 -0
- package/dist/description-list/style.css +63 -0
- package/dist/divider/index.d.ts +29 -0
- package/dist/divider/index.js +29 -0
- package/dist/divider/style.css +50 -0
- package/dist/drawer/index.d.ts +51 -0
- package/dist/drawer/index.js +183 -0
- package/dist/drawer/style.css +100 -0
- package/dist/dropdown/index.d.ts +38 -0
- package/dist/dropdown/index.js +97 -0
- package/dist/dropdown/style.css +39 -0
- package/dist/empty/index.d.ts +11 -0
- package/dist/empty/index.js +20 -0
- package/dist/empty/style.css +19 -0
- package/dist/floating-layer/index.d.ts +109 -0
- package/dist/floating-layer/index.js +337 -0
- package/dist/floating-layer/style.css +5 -0
- package/dist/form/form-item/index.d.ts +26 -0
- package/dist/form/form-item/index.js +21 -0
- package/dist/form/form-item/style.css +33 -0
- package/dist/form/form-modal/index.d.ts +18 -0
- package/dist/form/form-modal/index.js +38 -0
- package/dist/form/form.d.ts +21 -0
- package/dist/form/form.js +28 -0
- package/dist/form/index.d.ts +4 -0
- package/dist/form/index.js +4 -0
- package/dist/form/select/index.d.ts +48 -0
- package/dist/form/select/index.js +94 -0
- package/dist/form/select/style.css +29 -0
- package/dist/global.css +71 -0
- package/dist/i18n/de-DE.d.ts +2 -0
- package/dist/i18n/de-DE.js +36 -0
- package/dist/i18n/en-US.d.ts +2 -0
- package/dist/i18n/en-US.js +36 -0
- package/dist/i18n/es-ES.d.ts +2 -0
- package/dist/i18n/es-ES.js +36 -0
- package/dist/i18n/fr-FR.d.ts +2 -0
- package/dist/i18n/fr-FR.js +36 -0
- package/dist/i18n/index.d.ts +12 -0
- package/dist/i18n/index.js +39 -0
- package/dist/i18n/ja-JP.d.ts +2 -0
- package/dist/i18n/ja-JP.js +36 -0
- package/dist/i18n/ko-KR.d.ts +2 -0
- package/dist/i18n/ko-KR.js +36 -0
- package/dist/i18n/messages.d.ts +40 -0
- package/dist/i18n/messages.js +1 -0
- package/dist/i18n/wok-ui/de-DE.d.ts +2 -0
- package/dist/i18n/wok-ui/de-DE.js +20 -0
- package/dist/i18n/wok-ui/es-ES.d.ts +2 -0
- package/dist/i18n/wok-ui/es-ES.js +20 -0
- package/dist/i18n/wok-ui/fr-FR.d.ts +2 -0
- package/dist/i18n/wok-ui/fr-FR.js +20 -0
- package/dist/i18n/wok-ui/ja-JP.d.ts +2 -0
- package/dist/i18n/wok-ui/ja-JP.js +20 -0
- package/dist/i18n/wok-ui/ko-KR.d.ts +2 -0
- package/dist/i18n/wok-ui/ko-KR.js +20 -0
- package/dist/i18n/wok-ui/zh-TW.d.ts +2 -0
- package/dist/i18n/wok-ui/zh-TW.js +20 -0
- package/dist/i18n/zh-CN.d.ts +2 -0
- package/dist/i18n/zh-CN.js +36 -0
- package/dist/i18n/zh-TW.d.ts +2 -0
- package/dist/i18n/zh-TW.js +36 -0
- package/dist/icons.d.ts +88 -0
- package/dist/icons.js +176 -0
- package/dist/image/index.d.ts +38 -0
- package/dist/image/index.js +97 -0
- package/dist/image/style.css +72 -0
- package/dist/image-preview/index.d.ts +26 -0
- package/dist/image-preview/index.js +134 -0
- package/dist/image-preview/style.css +96 -0
- package/dist/index.d.ts +46 -0
- package/dist/index.js +45 -0
- package/dist/list/index.d.ts +32 -0
- package/dist/list/index.js +42 -0
- package/dist/list/list-item.d.ts +27 -0
- package/dist/list/list-item.js +51 -0
- package/dist/list/style.css +20 -0
- package/dist/loading/index.d.ts +10 -0
- package/dist/loading/index.js +46 -0
- package/dist/loading/style.css +48 -0
- package/dist/menu/index.d.ts +38 -0
- package/dist/menu/index.js +62 -0
- package/dist/menu/leaf-item.d.ts +12 -0
- package/dist/menu/leaf-item.js +41 -0
- package/dist/menu/style.css +117 -0
- package/dist/menu/sub-menu.d.ts +21 -0
- package/dist/menu/sub-menu.js +85 -0
- package/dist/menu/types.d.ts +36 -0
- package/dist/menu/types.js +1 -0
- package/dist/menu/utils.d.ts +11 -0
- package/dist/menu/utils.js +24 -0
- package/dist/modal/index.d.ts +23 -0
- package/dist/modal/index.js +79 -0
- package/dist/modal/modal.d.ts +76 -0
- package/dist/modal/modal.js +188 -0
- package/dist/modal/style.css +90 -0
- package/dist/pagination/index.d.ts +31 -0
- package/dist/pagination/index.js +215 -0
- package/dist/pagination/style.css +50 -0
- package/dist/popconfirm/api.d.ts +43 -0
- package/dist/popconfirm/api.js +77 -0
- package/dist/popconfirm/component.d.ts +47 -0
- package/dist/popconfirm/component.js +48 -0
- package/dist/popconfirm/index.d.ts +3 -0
- package/dist/popconfirm/index.js +3 -0
- package/dist/popconfirm/style.css +22 -0
- package/dist/popover/api.d.ts +36 -0
- package/dist/popover/api.js +61 -0
- package/dist/popover/component.d.ts +38 -0
- package/dist/popover/component.js +51 -0
- package/dist/popover/index.d.ts +3 -0
- package/dist/popover/index.js +3 -0
- package/dist/popover/style.css +102 -0
- package/dist/progress/index.d.ts +34 -0
- package/dist/progress/index.js +70 -0
- package/dist/progress/style.css +37 -0
- package/dist/quick-input/index.d.ts +2 -0
- package/dist/quick-input/index.js +2 -0
- package/dist/quick-input/number.d.ts +35 -0
- package/dist/quick-input/number.js +68 -0
- package/dist/quick-input/text.d.ts +20 -0
- package/dist/quick-input/text.js +61 -0
- package/dist/result/index.d.ts +39 -0
- package/dist/result/index.js +71 -0
- package/dist/result/style.css +41 -0
- package/dist/search-box/index.d.ts +26 -0
- package/dist/search-box/index.js +60 -0
- package/dist/search-box/style.css +22 -0
- package/dist/segmented/index.d.ts +42 -0
- package/dist/segmented/index.js +61 -0
- package/dist/segmented/style.css +28 -0
- package/dist/skeleton/index.d.ts +22 -0
- package/dist/skeleton/index.js +68 -0
- package/dist/skeleton/style.css +31 -0
- package/dist/steps/index.d.ts +46 -0
- package/dist/steps/index.js +95 -0
- package/dist/steps/style.css +181 -0
- package/dist/switch/index.d.ts +32 -0
- package/dist/switch/index.js +74 -0
- package/dist/switch/style.css +52 -0
- package/dist/table/body.d.ts +21 -0
- package/dist/table/body.js +35 -0
- package/dist/table/column.d.ts +78 -0
- package/dist/table/column.js +113 -0
- package/dist/table/header.d.ts +13 -0
- package/dist/table/header.js +15 -0
- package/dist/table/index.d.ts +41 -0
- package/dist/table/index.js +84 -0
- package/dist/table/row.d.ts +25 -0
- package/dist/table/row.js +74 -0
- package/dist/table/style.css +98 -0
- package/dist/tabs/index.d.ts +49 -0
- package/dist/tabs/index.js +76 -0
- package/dist/tabs/style.css +41 -0
- package/dist/tag/index.d.ts +53 -0
- package/dist/tag/index.js +100 -0
- package/dist/tag/style.css +134 -0
- package/dist/text/index.d.ts +104 -0
- package/dist/text/index.js +143 -0
- package/dist/text/style.css +113 -0
- package/dist/theme/index.d.ts +14 -0
- package/dist/theme/index.js +94 -0
- package/dist/theme/themes.d.ts +3 -0
- package/dist/theme/themes.js +323 -0
- package/dist/theme/types.d.ts +58 -0
- package/dist/theme/types.js +1 -0
- package/dist/timeline/index.d.ts +28 -0
- package/dist/timeline/index.js +35 -0
- package/dist/timeline/style.css +53 -0
- package/dist/toast/index.d.ts +53 -0
- package/dist/toast/index.js +131 -0
- package/dist/toast/style.css +76 -0
- package/dist/tooltip/api.d.ts +44 -0
- package/dist/tooltip/api.js +103 -0
- package/dist/tooltip/component.d.ts +28 -0
- package/dist/tooltip/component.js +35 -0
- package/dist/tooltip/index.d.ts +3 -0
- package/dist/tooltip/index.js +3 -0
- package/dist/tooltip/style.css +46 -0
- package/dist/tree/dragging-img.d.ts +13 -0
- package/dist/tree/dragging-img.js +23 -0
- package/dist/tree/index.d.ts +180 -0
- package/dist/tree/index.js +385 -0
- package/dist/tree/node-info.d.ts +63 -0
- package/dist/tree/node-info.js +128 -0
- package/dist/tree/node.d.ts +132 -0
- package/dist/tree/node.js +264 -0
- package/dist/tree/style.css +99 -0
- package/dist/upload/index.d.ts +48 -0
- package/dist/upload/index.js +141 -0
- package/dist/upload/style.css +41 -0
- package/package.json +51 -0
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { DivModule } from 'wok-ui';
|
|
2
|
+
import { IconCheckCircle, IconExclamationTriangle, IconTimesCircle, IconInfoCircle, IconTimes } from '../icons';
|
|
3
|
+
import './style.css';
|
|
4
|
+
class Item extends DivModule {
|
|
5
|
+
constructor(opts) {
|
|
6
|
+
super('wok-ui-ext-toast-item');
|
|
7
|
+
this.timer = 0;
|
|
8
|
+
this.el.classList.add(opts.type);
|
|
9
|
+
// 图标
|
|
10
|
+
switch (opts.type) {
|
|
11
|
+
case 'success':
|
|
12
|
+
this.addChild(new IconCheckCircle());
|
|
13
|
+
break;
|
|
14
|
+
case 'warning':
|
|
15
|
+
this.addChild(new IconExclamationTriangle());
|
|
16
|
+
break;
|
|
17
|
+
case 'error':
|
|
18
|
+
this.addChild(new IconTimesCircle());
|
|
19
|
+
break;
|
|
20
|
+
case 'info':
|
|
21
|
+
this.addChild(new IconInfoCircle());
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
this.addChild({
|
|
25
|
+
tag: 'span',
|
|
26
|
+
style: {
|
|
27
|
+
flex: '1'
|
|
28
|
+
},
|
|
29
|
+
innerText: opts.text
|
|
30
|
+
}, {
|
|
31
|
+
tag: 'span',
|
|
32
|
+
classNames: 'wok-ui-ext-toast-close',
|
|
33
|
+
children: new IconTimes(),
|
|
34
|
+
onClick: () => this.destroy()
|
|
35
|
+
});
|
|
36
|
+
const duration = opts.duration ?? 3000;
|
|
37
|
+
// 自动关闭
|
|
38
|
+
this.timer = setTimeout(() => this.destroy(), opts.duration ?? 3000);
|
|
39
|
+
// 实现鼠标悬停不会自动关闭
|
|
40
|
+
this.el.addEventListener('mouseenter', () => clearTimeout(this.timer));
|
|
41
|
+
// 鼠标离开后重新开始倒计时
|
|
42
|
+
this.el.addEventListener('mouseleave', () => {
|
|
43
|
+
this.timer = setTimeout(() => this.destroy(), duration);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
destroy() {
|
|
47
|
+
clearTimeout(this.timer);
|
|
48
|
+
super.destroy();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
class Container extends DivModule {
|
|
52
|
+
constructor() {
|
|
53
|
+
super('wok-ui-ext-toast-container');
|
|
54
|
+
}
|
|
55
|
+
addChild(child) {
|
|
56
|
+
super.addChild(child);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
let container;
|
|
60
|
+
/**
|
|
61
|
+
* 获取弹出式消息容器
|
|
62
|
+
* @returns
|
|
63
|
+
*/
|
|
64
|
+
function getContainer() {
|
|
65
|
+
if (!container) {
|
|
66
|
+
container = new Container();
|
|
67
|
+
container.mount(document.body);
|
|
68
|
+
}
|
|
69
|
+
return container;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* 显示弹出式消息
|
|
73
|
+
* @param opts
|
|
74
|
+
*/
|
|
75
|
+
export function showToast(opts) {
|
|
76
|
+
getContainer().addChild(new Item(opts));
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* 显示信息消息
|
|
80
|
+
* @param text 消息内容
|
|
81
|
+
*/
|
|
82
|
+
export function showInfo(text) {
|
|
83
|
+
showToast({
|
|
84
|
+
type: 'info',
|
|
85
|
+
text
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
function processErrMsg(errMsg) {
|
|
89
|
+
let message = '';
|
|
90
|
+
if (typeof errMsg === 'string') {
|
|
91
|
+
message = errMsg;
|
|
92
|
+
}
|
|
93
|
+
else if (errMsg instanceof Error) {
|
|
94
|
+
message = errMsg.message;
|
|
95
|
+
console.error(errMsg);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
message = JSON.stringify(errMsg);
|
|
99
|
+
}
|
|
100
|
+
return message;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* 显示错误消息
|
|
104
|
+
* @param errMsg 错误消息内容
|
|
105
|
+
*/
|
|
106
|
+
export function showError(errMsg) {
|
|
107
|
+
showToast({
|
|
108
|
+
type: 'error',
|
|
109
|
+
text: processErrMsg(errMsg)
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* 显示警告消息
|
|
114
|
+
* @param errMsg 警告消息内容
|
|
115
|
+
*/
|
|
116
|
+
export function showWarning(errMsg) {
|
|
117
|
+
showToast({
|
|
118
|
+
type: 'warning',
|
|
119
|
+
text: processErrMsg(errMsg)
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* 显示成功消息
|
|
124
|
+
* @param text 成功消息内容
|
|
125
|
+
*/
|
|
126
|
+
export function showSuccess(text) {
|
|
127
|
+
showToast({
|
|
128
|
+
type: 'success',
|
|
129
|
+
text
|
|
130
|
+
});
|
|
131
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/* Toast */
|
|
2
|
+
.wok-ui-ext-toast-container {
|
|
3
|
+
position: fixed;
|
|
4
|
+
top: 30px;
|
|
5
|
+
right: 30px;
|
|
6
|
+
z-index: 1001;
|
|
7
|
+
display: flex;
|
|
8
|
+
flex-direction: column;
|
|
9
|
+
gap: 12px;
|
|
10
|
+
max-width: 320px;
|
|
11
|
+
}
|
|
12
|
+
.wok-ui-ext-toast-container .wok-ui-ext-toast-item {
|
|
13
|
+
background: var(--bg-card);
|
|
14
|
+
border-radius: var(--radius-full);
|
|
15
|
+
padding: 14px 22px;
|
|
16
|
+
box-shadow: var(--shadow-sm);
|
|
17
|
+
display: flex;
|
|
18
|
+
align-items: center;
|
|
19
|
+
gap: 12px;
|
|
20
|
+
font-size: 15px;
|
|
21
|
+
font-weight: 500;
|
|
22
|
+
color: var(--text-secondary);
|
|
23
|
+
border-left: 4px solid;
|
|
24
|
+
animation: toastSlideInRight 0.2s ease;
|
|
25
|
+
border: 1px solid #eef3fc;
|
|
26
|
+
backdrop-filter: blur(4px);
|
|
27
|
+
word-break: break-all;
|
|
28
|
+
}
|
|
29
|
+
.wok-ui-ext-toast-container .wok-ui-ext-toast-item i {
|
|
30
|
+
font-size: 20px;
|
|
31
|
+
}
|
|
32
|
+
.wok-ui-ext-toast-container .wok-ui-ext-toast-item.success {
|
|
33
|
+
border-left-color: var(--color-success);
|
|
34
|
+
background: #f0faf4;
|
|
35
|
+
}
|
|
36
|
+
.wok-ui-ext-toast-container .wok-ui-ext-toast-item.success i {
|
|
37
|
+
color: var(--color-success);
|
|
38
|
+
}
|
|
39
|
+
.wok-ui-ext-toast-container .wok-ui-ext-toast-item.warning {
|
|
40
|
+
border-left-color: var(--color-warning);
|
|
41
|
+
background: #fff7e8;
|
|
42
|
+
}
|
|
43
|
+
.wok-ui-ext-toast-container .wok-ui-ext-toast-item.warning i {
|
|
44
|
+
color: var(--color-warning);
|
|
45
|
+
}
|
|
46
|
+
.wok-ui-ext-toast-container .wok-ui-ext-toast-item.error {
|
|
47
|
+
border-left-color: var(--color-danger);
|
|
48
|
+
background: var(--color-danger-light);
|
|
49
|
+
}
|
|
50
|
+
.wok-ui-ext-toast-container .wok-ui-ext-toast-item.error i {
|
|
51
|
+
color: var(--color-danger);
|
|
52
|
+
}
|
|
53
|
+
.wok-ui-ext-toast-container .wok-ui-ext-toast-item.info {
|
|
54
|
+
border-left-color: var(--color-primary);
|
|
55
|
+
background: var(--color-primary-light);
|
|
56
|
+
}
|
|
57
|
+
.wok-ui-ext-toast-container .wok-ui-ext-toast-item.info i {
|
|
58
|
+
color: var(--color-primary);
|
|
59
|
+
}
|
|
60
|
+
.wok-ui-ext-toast-container .wok-ui-ext-toast-item .wok-ui-ext-toast-close {
|
|
61
|
+
margin-left: auto;
|
|
62
|
+
cursor: pointer;
|
|
63
|
+
color: var(--text-placeholder);
|
|
64
|
+
font-size: 18px;
|
|
65
|
+
padding: 0 4px;
|
|
66
|
+
}
|
|
67
|
+
@keyframes toastSlideInRight {
|
|
68
|
+
from {
|
|
69
|
+
opacity: 0;
|
|
70
|
+
transform: translateX(40px);
|
|
71
|
+
}
|
|
72
|
+
to {
|
|
73
|
+
opacity: 1;
|
|
74
|
+
transform: translateX(0);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { SubModulesOpt } from 'wok-ui';
|
|
2
|
+
import './style.less';
|
|
3
|
+
export type TooltipPlacement = 'top' | 'bottom' | 'left' | 'right';
|
|
4
|
+
export interface AttachTooltipOptions {
|
|
5
|
+
/** 要绑定的目标元素 */
|
|
6
|
+
target: HTMLElement;
|
|
7
|
+
/** 提示内容 */
|
|
8
|
+
content: SubModulesOpt;
|
|
9
|
+
/** 提示位置,默认 top */
|
|
10
|
+
placement?: TooltipPlacement;
|
|
11
|
+
/** 显示延迟,默认 0ms */
|
|
12
|
+
delay?: number;
|
|
13
|
+
/** 隐藏延迟,默认 0ms */
|
|
14
|
+
leaveDelay?: number;
|
|
15
|
+
/** 是否禁用,默认 false */
|
|
16
|
+
disabled?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare class TooltipBinding {
|
|
19
|
+
private tooltip?;
|
|
20
|
+
private target;
|
|
21
|
+
private content;
|
|
22
|
+
private placement;
|
|
23
|
+
private delay;
|
|
24
|
+
private leaveDelay;
|
|
25
|
+
private disabled;
|
|
26
|
+
private showTimer?;
|
|
27
|
+
private hideTimer?;
|
|
28
|
+
private handleMouseEnter;
|
|
29
|
+
private handleMouseLeave;
|
|
30
|
+
constructor(opts: AttachTooltipOptions);
|
|
31
|
+
private show;
|
|
32
|
+
private hide;
|
|
33
|
+
private clearShowTimer;
|
|
34
|
+
private clearHideTimer;
|
|
35
|
+
update(opts: Partial<AttachTooltipOptions>): void;
|
|
36
|
+
destroy(): void;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* 给 DOM 元素附加 tooltip。
|
|
40
|
+
* 鼠标进入时创建 tooltip 浮层并挂载到 body,鼠标离开时销毁。
|
|
41
|
+
* @param opts 配置选项
|
|
42
|
+
* @returns 绑定实例,调用 destroy 可解绑
|
|
43
|
+
*/
|
|
44
|
+
export declare function attachTooltip(opts: AttachTooltipOptions): TooltipBinding;
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { FloatingLayer } from '../floating-layer';
|
|
2
|
+
import './style.css';
|
|
3
|
+
/**
|
|
4
|
+
* 提示浮层。挂载到 body,由 FloatingLayer 提供定位、滚动跟随、自动关闭。
|
|
5
|
+
*/
|
|
6
|
+
class TooltipLayer extends FloatingLayer {
|
|
7
|
+
constructor(opts) {
|
|
8
|
+
super({ target: opts.target, placement: opts.placement, offset: 10, onClose: opts.onClose });
|
|
9
|
+
this.el.classList.add('wok-ui-ext-tooltip-layer');
|
|
10
|
+
this.el.classList.add(opts.placement);
|
|
11
|
+
this.content = opts.content;
|
|
12
|
+
}
|
|
13
|
+
buildContent() {
|
|
14
|
+
this.addChild(this.content);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export class TooltipBinding {
|
|
18
|
+
constructor(opts) {
|
|
19
|
+
this.handleMouseEnter = () => {
|
|
20
|
+
if (this.disabled)
|
|
21
|
+
return;
|
|
22
|
+
this.clearHideTimer();
|
|
23
|
+
this.showTimer = window.setTimeout(() => {
|
|
24
|
+
this.show();
|
|
25
|
+
}, this.delay);
|
|
26
|
+
};
|
|
27
|
+
this.handleMouseLeave = () => {
|
|
28
|
+
this.clearShowTimer();
|
|
29
|
+
this.hideTimer = window.setTimeout(() => {
|
|
30
|
+
this.hide();
|
|
31
|
+
}, this.leaveDelay);
|
|
32
|
+
};
|
|
33
|
+
this.target = opts.target;
|
|
34
|
+
this.content = opts.content;
|
|
35
|
+
this.placement = opts.placement || 'top';
|
|
36
|
+
this.delay = opts.delay ?? 0;
|
|
37
|
+
this.leaveDelay = opts.leaveDelay ?? 0;
|
|
38
|
+
this.disabled = opts.disabled ?? false;
|
|
39
|
+
this.target.addEventListener('mouseenter', this.handleMouseEnter);
|
|
40
|
+
this.target.addEventListener('mouseleave', this.handleMouseLeave);
|
|
41
|
+
}
|
|
42
|
+
show() {
|
|
43
|
+
if (this.tooltip)
|
|
44
|
+
return;
|
|
45
|
+
const layer = new TooltipLayer({
|
|
46
|
+
target: this.target,
|
|
47
|
+
placement: this.placement,
|
|
48
|
+
content: this.content,
|
|
49
|
+
onClose: () => {
|
|
50
|
+
// 浮层可能被外部点击/Esc/目标滚出视口自动销毁,这里同步清理引用
|
|
51
|
+
if (this.tooltip === layer) {
|
|
52
|
+
this.tooltip = undefined;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
this.tooltip = layer;
|
|
57
|
+
layer.mount(document.body);
|
|
58
|
+
}
|
|
59
|
+
hide() {
|
|
60
|
+
this.tooltip?.destroy();
|
|
61
|
+
this.tooltip = undefined;
|
|
62
|
+
}
|
|
63
|
+
clearShowTimer() {
|
|
64
|
+
if (this.showTimer) {
|
|
65
|
+
clearTimeout(this.showTimer);
|
|
66
|
+
this.showTimer = undefined;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
clearHideTimer() {
|
|
70
|
+
if (this.hideTimer) {
|
|
71
|
+
clearTimeout(this.hideTimer);
|
|
72
|
+
this.hideTimer = undefined;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
update(opts) {
|
|
76
|
+
if (opts.content !== undefined)
|
|
77
|
+
this.content = opts.content;
|
|
78
|
+
if (opts.placement !== undefined)
|
|
79
|
+
this.placement = opts.placement;
|
|
80
|
+
if (opts.delay !== undefined)
|
|
81
|
+
this.delay = opts.delay;
|
|
82
|
+
if (opts.leaveDelay !== undefined)
|
|
83
|
+
this.leaveDelay = opts.leaveDelay;
|
|
84
|
+
if (opts.disabled !== undefined)
|
|
85
|
+
this.disabled = opts.disabled;
|
|
86
|
+
}
|
|
87
|
+
destroy() {
|
|
88
|
+
this.clearShowTimer();
|
|
89
|
+
this.clearHideTimer();
|
|
90
|
+
this.target.removeEventListener('mouseenter', this.handleMouseEnter);
|
|
91
|
+
this.target.removeEventListener('mouseleave', this.handleMouseLeave);
|
|
92
|
+
this.hide();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* 给 DOM 元素附加 tooltip。
|
|
97
|
+
* 鼠标进入时创建 tooltip 浮层并挂载到 body,鼠标离开时销毁。
|
|
98
|
+
* @param opts 配置选项
|
|
99
|
+
* @returns 绑定实例,调用 destroy 可解绑
|
|
100
|
+
*/
|
|
101
|
+
export function attachTooltip(opts) {
|
|
102
|
+
return new TooltipBinding(opts);
|
|
103
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { DivModule, SubModulesOpt } from 'wok-ui';
|
|
2
|
+
import { TooltipPlacement } from './api';
|
|
3
|
+
import './style.less';
|
|
4
|
+
/**
|
|
5
|
+
* 提示框组件
|
|
6
|
+
*/
|
|
7
|
+
export declare class Tooltip extends DivModule {
|
|
8
|
+
private binding?;
|
|
9
|
+
/**
|
|
10
|
+
* 提示框组件,鼠标悬停时显示提示信息。
|
|
11
|
+
* @param opts
|
|
12
|
+
* @param opts.children 触发元素
|
|
13
|
+
* @param opts.content 提示内容
|
|
14
|
+
* @param opts.placement 提示位置,默认 top
|
|
15
|
+
* @param opts.delay 显示延迟,默认 0ms
|
|
16
|
+
* @param opts.leaveDelay 隐藏延迟,默认 0ms
|
|
17
|
+
* @param opts.disabled 是否禁用,默认 false
|
|
18
|
+
*/
|
|
19
|
+
constructor(opts: {
|
|
20
|
+
children: SubModulesOpt;
|
|
21
|
+
content: SubModulesOpt;
|
|
22
|
+
placement?: TooltipPlacement;
|
|
23
|
+
delay?: number;
|
|
24
|
+
leaveDelay?: number;
|
|
25
|
+
disabled?: boolean;
|
|
26
|
+
});
|
|
27
|
+
destroy(): void;
|
|
28
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { DivModule } from 'wok-ui';
|
|
2
|
+
import { attachTooltip } from './api';
|
|
3
|
+
import './style.css';
|
|
4
|
+
/**
|
|
5
|
+
* 提示框组件
|
|
6
|
+
*/
|
|
7
|
+
export class Tooltip extends DivModule {
|
|
8
|
+
/**
|
|
9
|
+
* 提示框组件,鼠标悬停时显示提示信息。
|
|
10
|
+
* @param opts
|
|
11
|
+
* @param opts.children 触发元素
|
|
12
|
+
* @param opts.content 提示内容
|
|
13
|
+
* @param opts.placement 提示位置,默认 top
|
|
14
|
+
* @param opts.delay 显示延迟,默认 0ms
|
|
15
|
+
* @param opts.leaveDelay 隐藏延迟,默认 0ms
|
|
16
|
+
* @param opts.disabled 是否禁用,默认 false
|
|
17
|
+
*/
|
|
18
|
+
constructor(opts) {
|
|
19
|
+
super('wok-ui-ext-tooltip-trigger');
|
|
20
|
+
this.addChild(opts.children);
|
|
21
|
+
this.binding = attachTooltip({
|
|
22
|
+
target: this.el,
|
|
23
|
+
content: opts.content,
|
|
24
|
+
placement: opts.placement,
|
|
25
|
+
delay: opts.delay,
|
|
26
|
+
leaveDelay: opts.leaveDelay,
|
|
27
|
+
disabled: opts.disabled
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
destroy() {
|
|
31
|
+
this.binding?.destroy();
|
|
32
|
+
this.binding = undefined;
|
|
33
|
+
super.destroy();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
.wok-ui-ext-tooltip-trigger {
|
|
2
|
+
display: inline-block;
|
|
3
|
+
}
|
|
4
|
+
.wok-ui-ext-tooltip-layer {
|
|
5
|
+
max-width: 280px;
|
|
6
|
+
padding: 8px 14px;
|
|
7
|
+
border-radius: var(--radius-md);
|
|
8
|
+
background-color: var(--color-primary-dark);
|
|
9
|
+
color: #fff;
|
|
10
|
+
font-size: var(--font-size-small);
|
|
11
|
+
line-height: 1.4;
|
|
12
|
+
word-break: break-word;
|
|
13
|
+
box-shadow: var(--shadow-md);
|
|
14
|
+
pointer-events: none;
|
|
15
|
+
}
|
|
16
|
+
.wok-ui-ext-tooltip-layer::after {
|
|
17
|
+
content: '';
|
|
18
|
+
position: absolute;
|
|
19
|
+
width: 0;
|
|
20
|
+
height: 0;
|
|
21
|
+
border: 5px solid transparent;
|
|
22
|
+
}
|
|
23
|
+
.wok-ui-ext-tooltip-layer.top::after {
|
|
24
|
+
top: 100%;
|
|
25
|
+
left: 50%;
|
|
26
|
+
transform: translateX(-50%);
|
|
27
|
+
border-top-color: var(--color-primary-dark);
|
|
28
|
+
}
|
|
29
|
+
.wok-ui-ext-tooltip-layer.bottom::after {
|
|
30
|
+
bottom: 100%;
|
|
31
|
+
left: 50%;
|
|
32
|
+
transform: translateX(-50%);
|
|
33
|
+
border-bottom-color: var(--color-primary-dark);
|
|
34
|
+
}
|
|
35
|
+
.wok-ui-ext-tooltip-layer.left::after {
|
|
36
|
+
top: 50%;
|
|
37
|
+
left: 100%;
|
|
38
|
+
transform: translateY(-50%);
|
|
39
|
+
border-left-color: var(--color-primary-dark);
|
|
40
|
+
}
|
|
41
|
+
.wok-ui-ext-tooltip-layer.right::after {
|
|
42
|
+
top: 50%;
|
|
43
|
+
right: 100%;
|
|
44
|
+
transform: translateY(-50%);
|
|
45
|
+
border-right-color: var(--color-primary-dark);
|
|
46
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { DivModule } from 'wok-ui';
|
|
2
|
+
import { TreeNodeData } from '.';
|
|
3
|
+
/**
|
|
4
|
+
* 拖动图标
|
|
5
|
+
*/
|
|
6
|
+
export declare class DraggingImg extends DivModule {
|
|
7
|
+
/**
|
|
8
|
+
*
|
|
9
|
+
* @param title 标题
|
|
10
|
+
*/
|
|
11
|
+
constructor(title: TreeNodeData['title']);
|
|
12
|
+
updateCoord(x: number, y: number): void;
|
|
13
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { DivModule } from 'wok-ui';
|
|
2
|
+
/**
|
|
3
|
+
* 拖动图标
|
|
4
|
+
*/
|
|
5
|
+
export class DraggingImg extends DivModule {
|
|
6
|
+
/**
|
|
7
|
+
*
|
|
8
|
+
* @param title 标题
|
|
9
|
+
*/
|
|
10
|
+
constructor(title) {
|
|
11
|
+
super('wok-ui-ext-tree-node-dragging-img');
|
|
12
|
+
if (typeof title === 'string') {
|
|
13
|
+
this.el.innerText = title;
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
this.addChild(title);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
updateCoord(x, y) {
|
|
20
|
+
this.el.style.top = y + 'px';
|
|
21
|
+
this.el.style.left = x + 'px';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { ConvertibleModule, FullRenderingModule } from 'wok-ui';
|
|
2
|
+
import { ShowContextMenuOpts } from '../context-menu';
|
|
3
|
+
import './style.less';
|
|
4
|
+
/**
|
|
5
|
+
* 树节点数据
|
|
6
|
+
*/
|
|
7
|
+
export interface TreeNodeData {
|
|
8
|
+
/**
|
|
9
|
+
* id,唯一标识
|
|
10
|
+
*/
|
|
11
|
+
id: string;
|
|
12
|
+
/**
|
|
13
|
+
* 节点名称
|
|
14
|
+
*/
|
|
15
|
+
title: string;
|
|
16
|
+
/**
|
|
17
|
+
* 子节点信息
|
|
18
|
+
*/
|
|
19
|
+
children?: this[];
|
|
20
|
+
/**
|
|
21
|
+
* 是否展开
|
|
22
|
+
*/
|
|
23
|
+
unfolded?: boolean;
|
|
24
|
+
/**
|
|
25
|
+
* 不可移动的,设置为 true 的节点不能被拖动调整顺序
|
|
26
|
+
* self 仅仅对当前节点有效
|
|
27
|
+
* all-descendants 所有的后代节点都不能移动
|
|
28
|
+
*/
|
|
29
|
+
unmoveable?: 'self' | 'all-descendants';
|
|
30
|
+
/**
|
|
31
|
+
* 不能被选择的,默认可以被选择
|
|
32
|
+
*/
|
|
33
|
+
unselectable?: boolean;
|
|
34
|
+
}
|
|
35
|
+
export /**
|
|
36
|
+
* 移动位置
|
|
37
|
+
*/ type MovePlacement = 'before' | 'after' | 'in';
|
|
38
|
+
/**
|
|
39
|
+
* 树
|
|
40
|
+
*/
|
|
41
|
+
export declare class Tree<T extends TreeNodeData> extends FullRenderingModule {
|
|
42
|
+
private opts;
|
|
43
|
+
/**
|
|
44
|
+
* 已选id列表
|
|
45
|
+
*/
|
|
46
|
+
private selectedIds;
|
|
47
|
+
/**
|
|
48
|
+
* 事件处理器
|
|
49
|
+
*/
|
|
50
|
+
private eventHandler;
|
|
51
|
+
/**
|
|
52
|
+
* 拖动的目标
|
|
53
|
+
*/
|
|
54
|
+
private dragTarget?;
|
|
55
|
+
/**
|
|
56
|
+
* 拖动图标
|
|
57
|
+
*/
|
|
58
|
+
private draggingImg?;
|
|
59
|
+
/**
|
|
60
|
+
* 数据
|
|
61
|
+
*/
|
|
62
|
+
private data;
|
|
63
|
+
constructor(opts: {
|
|
64
|
+
/**
|
|
65
|
+
* 数据
|
|
66
|
+
*/
|
|
67
|
+
data: T[];
|
|
68
|
+
/**
|
|
69
|
+
* 最大可选中数量,默认为 1,节点被选中后会有高亮显示,并且触发回调 onSelect
|
|
70
|
+
*/
|
|
71
|
+
maxSelected?: number;
|
|
72
|
+
/**
|
|
73
|
+
* 最大层级,默认 10
|
|
74
|
+
*/
|
|
75
|
+
maxLevel?: number;
|
|
76
|
+
/**
|
|
77
|
+
* 节点选中变化回调,每当选中节点发生变化时触发
|
|
78
|
+
* @param nodes 选中的节点的数据,带有层级信息
|
|
79
|
+
* @returns
|
|
80
|
+
*/
|
|
81
|
+
onSelectChange?: (nodes: Array<T & {
|
|
82
|
+
level: number;
|
|
83
|
+
}>) => void;
|
|
84
|
+
/**
|
|
85
|
+
* 默认已选节点的 id 列表
|
|
86
|
+
*/
|
|
87
|
+
selectedIds?: string[];
|
|
88
|
+
/**
|
|
89
|
+
* 启动移动功能,启动后支持拖动节点来改变节点的位置
|
|
90
|
+
*/
|
|
91
|
+
enableMove?: boolean;
|
|
92
|
+
/**
|
|
93
|
+
* 移动钩子,当钩子调用成功,节点的位置才会发生变化
|
|
94
|
+
* @param sourceNode 被移动的节点
|
|
95
|
+
* @param targetNode 目标节点
|
|
96
|
+
* @param placement 相对目标节点的位置
|
|
97
|
+
* @returns
|
|
98
|
+
*/
|
|
99
|
+
moveHook?: (sourceNode: T, targetNode: T, placement: MovePlacement) => Promise<void>;
|
|
100
|
+
/**
|
|
101
|
+
* 变化回调,每当数据发生变化时触发
|
|
102
|
+
* @param data 最新数据
|
|
103
|
+
* @returns
|
|
104
|
+
*/
|
|
105
|
+
onChange?: (data: T[]) => void;
|
|
106
|
+
/**
|
|
107
|
+
* 构造节点的操作项,如果未定义,或返回的空数组,都不会显示出菜单项
|
|
108
|
+
*/
|
|
109
|
+
buildActions?: (data: T, level: number) => ShowContextMenuOpts['menu'];
|
|
110
|
+
/**
|
|
111
|
+
* 构造节点的标题模块,默认显示 title 属性文本
|
|
112
|
+
* @returns
|
|
113
|
+
*/
|
|
114
|
+
buildTitleModule?: (data: T) => ConvertibleModule;
|
|
115
|
+
});
|
|
116
|
+
protected buildContent(): void;
|
|
117
|
+
private triggerChange;
|
|
118
|
+
private triggerSelectChange;
|
|
119
|
+
private handleSelect;
|
|
120
|
+
/**
|
|
121
|
+
* 对节点取消选择
|
|
122
|
+
* @param id 节点数据的 id
|
|
123
|
+
* @returns
|
|
124
|
+
*/
|
|
125
|
+
unselectNode(id: string): void;
|
|
126
|
+
/**
|
|
127
|
+
* 处理拖动开始事件,生成拖动图标
|
|
128
|
+
* @param sourceNode 被拖动的原始节点
|
|
129
|
+
* @param coord 事件坐标
|
|
130
|
+
*/
|
|
131
|
+
private handleDragStart;
|
|
132
|
+
/**
|
|
133
|
+
* 获取所有当前可见的节点
|
|
134
|
+
*/
|
|
135
|
+
private getVisibleNodes;
|
|
136
|
+
/**
|
|
137
|
+
* 移动节点
|
|
138
|
+
* @param sourceNodeId
|
|
139
|
+
* @param targetNodeId
|
|
140
|
+
* @param placement
|
|
141
|
+
*/
|
|
142
|
+
moveNode(sourceNodeId: string, targetNodeId: string, placement: MovePlacement): void;
|
|
143
|
+
/**
|
|
144
|
+
* 删除一个节点
|
|
145
|
+
* @param id
|
|
146
|
+
*/
|
|
147
|
+
deleteNode(id: string): void;
|
|
148
|
+
/**
|
|
149
|
+
* 内部的删除方法,仅删除节点数据,不触发任何行为
|
|
150
|
+
*/
|
|
151
|
+
private internalDeleteNode;
|
|
152
|
+
/**
|
|
153
|
+
* 更新节点
|
|
154
|
+
* @param data
|
|
155
|
+
*/
|
|
156
|
+
updateNode(data: {
|
|
157
|
+
id: string;
|
|
158
|
+
title: TreeNodeData['title'];
|
|
159
|
+
}): void;
|
|
160
|
+
/**
|
|
161
|
+
* 添加一个节点
|
|
162
|
+
*/
|
|
163
|
+
addNode(data: T, parentId?: string): void;
|
|
164
|
+
private getNodeModule;
|
|
165
|
+
/**
|
|
166
|
+
* 获取节点信息
|
|
167
|
+
* @param id 节点id
|
|
168
|
+
*/
|
|
169
|
+
getNode(id: string): T | undefined;
|
|
170
|
+
/**
|
|
171
|
+
* 获取一个节点的父节点信息,如果找不到节点,或者节点是根节点不存在父节点,则返回 undefined
|
|
172
|
+
* @param id
|
|
173
|
+
*/
|
|
174
|
+
getParentNode(id: string): T | undefined;
|
|
175
|
+
/**
|
|
176
|
+
* 解绑事件
|
|
177
|
+
*/
|
|
178
|
+
private unbindEvents;
|
|
179
|
+
destroy(): void;
|
|
180
|
+
}
|