@zohodesk/components 1.2.4 → 1.2.6
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 +8 -0
- package/coverage/Button/Button.js.html +1 -1
- package/coverage/Button/css/Button.module.css.html +1 -1
- package/coverage/Button/css/cssJSLogic.js.html +1 -1
- package/coverage/Button/css/index.html +1 -1
- package/coverage/Button/index.html +1 -1
- package/coverage/Button/props/defaultProps.js.html +1 -1
- package/coverage/Button/props/index.html +1 -1
- package/coverage/Button/props/propTypes.js.html +1 -1
- package/coverage/Buttongroup/Buttongroup.js.html +1 -1
- package/coverage/Buttongroup/Buttongroup.module.css.html +1 -1
- package/coverage/Buttongroup/index.html +1 -1
- package/coverage/Buttongroup/props/defaultProps.js.html +1 -1
- package/coverage/Buttongroup/props/index.html +1 -1
- package/coverage/Buttongroup/props/propTypes.js.html +1 -1
- package/coverage/index.html +1 -1
- package/coverage/utils/dummyFunction.js.html +1 -1
- package/coverage/utils/index.html +1 -1
- package/es/AppContainer/AppContainer.js +3 -0
- package/es/v1/Accordion/Accordion.js +65 -0
- package/es/v1/Accordion/AccordionItem.js +57 -0
- package/es/v1/Accordion/index.js +2 -0
- package/es/v1/Animation/Animation.js +127 -0
- package/es/v1/AppContainer/AppContainer.js +137 -0
- package/es/v1/Avatar/Avatar.js +189 -0
- package/es/v1/AvatarTeam/AvatarTeam.js +70 -0
- package/es/v1/Button/Button.js +68 -0
- package/es/v1/Buttongroup/Buttongroup.js +31 -0
- package/es/v1/Card/Card.js +271 -0
- package/es/v1/CheckBox/CheckBox.js +155 -0
- package/es/v1/DateTime/CalendarView.js +218 -0
- package/es/v1/DateTime/DateTime.js +783 -0
- package/es/v1/DateTime/DateTimePopupFooter.js +47 -0
- package/es/v1/DateTime/DateTimePopupHeader.js +105 -0
- package/es/v1/DateTime/DateWidget.js +1098 -0
- package/es/v1/DateTime/DaysRow.js +31 -0
- package/es/v1/DateTime/Time.js +166 -0
- package/es/v1/DateTime/YearView.js +264 -0
- package/es/v1/DateTime/index.js +1 -0
- package/es/v1/DropBox/DropBox.js +91 -0
- package/es/v1/DropBox/DropBoxElement/DropBoxElement.js +132 -0
- package/es/v1/DropDown/DropDown.js +73 -0
- package/es/v1/DropDown/DropDownHeading.js +44 -0
- package/es/v1/DropDown/DropDownItem.js +76 -0
- package/es/v1/DropDown/DropDownSearch.js +63 -0
- package/es/v1/DropDown/DropDownSeparator.js +15 -0
- package/es/v1/Heading/Heading.js +32 -0
- package/es/v1/Label/Label.js +40 -0
- package/es/v1/Layout/Box.js +115 -0
- package/es/v1/Layout/Container.js +132 -0
- package/es/v1/Layout/index.js +2 -0
- package/es/v1/ListItem/ListContainer.js +102 -0
- package/es/v1/ListItem/ListItem.js +124 -0
- package/es/v1/ListItem/ListItemWithAvatar.js +145 -0
- package/es/v1/ListItem/ListItemWithCheckBox.js +104 -0
- package/es/v1/ListItem/ListItemWithIcon.js +127 -0
- package/es/v1/ListItem/ListItemWithRadio.js +105 -0
- package/es/v1/ListItem/index.js +6 -0
- package/es/v1/Modal/Modal.js +154 -0
- package/es/v1/MultiSelect/AdvancedGroupMultiSelect.js +1079 -0
- package/es/v1/MultiSelect/AdvancedMultiSelect.js +568 -0
- package/es/v1/MultiSelect/EmptyState.js +64 -0
- package/es/v1/MultiSelect/MobileHeader/MobileHeader.js +50 -0
- package/es/v1/MultiSelect/MultiSelect.js +1120 -0
- package/es/v1/MultiSelect/MultiSelectHeader.js +32 -0
- package/es/v1/MultiSelect/MultiSelectWithAvatar.js +216 -0
- package/es/v1/MultiSelect/SelectedOptions.js +82 -0
- package/es/v1/MultiSelect/Suggestions.js +142 -0
- package/es/v1/MultiSelect/index.js +4 -0
- package/es/v1/PopOver/PopOver.js +211 -0
- package/es/v1/Popup/Popup.js +645 -0
- package/es/v1/Radio/Radio.js +115 -0
- package/es/v1/Responsive/CustomResponsive.js +195 -0
- package/es/v1/Responsive/RefWrapper.js +39 -0
- package/es/v1/Responsive/ResizeComponent.js +197 -0
- package/es/v1/Responsive/ResizeObserver.js +140 -0
- package/es/v1/Responsive/Responsive.js +194 -0
- package/es/v1/Responsive/index.js +9 -0
- package/es/v1/ResponsiveDropBox/ResponsiveDropBox.js +58 -0
- package/es/v1/Ribbon/Ribbon.js +33 -0
- package/es/v1/RippleEffect/RippleEffect.js +24 -0
- package/es/v1/Select/GroupSelect.js +803 -0
- package/es/v1/Select/Select.js +969 -0
- package/es/v1/Select/SelectWithAvatar.js +344 -0
- package/es/v1/Select/SelectWithIcon.js +535 -0
- package/es/v1/Select/index.js +4 -0
- package/es/v1/Stencils/Stencils.js +26 -0
- package/es/v1/Switch/Switch.js +94 -0
- package/es/v1/Tab/Tab.js +108 -0
- package/es/v1/Tab/TabContent.js +30 -0
- package/es/v1/Tab/TabContentWrapper.js +29 -0
- package/es/v1/Tab/TabWrapper.js +57 -0
- package/es/v1/Tab/Tabs.js +612 -0
- package/es/v1/Tab/index.js +5 -0
- package/es/v1/Tag/Tag.js +134 -0
- package/es/v1/TextBox/TextBox.js +154 -0
- package/es/v1/TextBoxIcon/TextBoxIcon.js +158 -0
- package/es/v1/Textarea/Textarea.js +102 -0
- package/es/v1/Tooltip/Tooltip.js +518 -0
- package/es/v1/Typography/Typography.js +38 -0
- package/es/v1/Typography/css/Typography.module.css +376 -0
- package/es/v1/Typography/css/cssJSLogic.js +46 -0
- package/es/v1/Typography/css/letterSpacingMap.js +12 -0
- package/es/v1/Typography/props/defaultProps.js +8 -0
- package/es/v1/Typography/props/propTypes.js +24 -0
- package/es/v1/VelocityAnimation/VelocityAnimation/VelocityAnimation.js +69 -0
- package/es/v1/VelocityAnimation/VelocityAnimationGroup/VelocityAnimationGroup.js +100 -0
- package/es/v1/semantic/Button/Button.js +53 -0
- package/es/v1/semantic/index.js +1 -0
- package/lib/AppContainer/AppContainer.js +5 -0
- package/lib/v1/Accordion/Accordion.js +96 -0
- package/lib/v1/Accordion/AccordionItem.js +68 -0
- package/lib/v1/Accordion/index.js +23 -0
- package/lib/v1/Animation/Animation.js +143 -0
- package/lib/v1/AppContainer/AppContainer.js +209 -0
- package/lib/v1/Avatar/Avatar.js +246 -0
- package/lib/v1/AvatarTeam/AvatarTeam.js +81 -0
- package/lib/v1/Button/Button.js +82 -0
- package/lib/v1/Buttongroup/Buttongroup.js +44 -0
- package/lib/v1/Card/Card.js +365 -0
- package/lib/v1/CheckBox/CheckBox.js +166 -0
- package/lib/v1/DateTime/CalendarView.js +285 -0
- package/lib/v1/DateTime/DateTime.js +872 -0
- package/lib/v1/DateTime/DateTimePopupFooter.js +96 -0
- package/lib/v1/DateTime/DateTimePopupHeader.js +166 -0
- package/lib/v1/DateTime/DateWidget.js +1125 -0
- package/lib/v1/DateTime/DaysRow.js +80 -0
- package/lib/v1/DateTime/Time.js +254 -0
- package/lib/v1/DateTime/YearView.js +325 -0
- package/lib/v1/DateTime/index.js +15 -0
- package/lib/v1/DropBox/DropBox.js +119 -0
- package/lib/v1/DropBox/DropBoxElement/DropBoxElement.js +145 -0
- package/lib/v1/DropDown/DropDown.js +170 -0
- package/lib/v1/DropDown/DropDownHeading.js +93 -0
- package/lib/v1/DropDown/DropDownItem.js +127 -0
- package/lib/v1/DropDown/DropDownSearch.js +113 -0
- package/lib/v1/DropDown/DropDownSeparator.js +64 -0
- package/lib/v1/Heading/Heading.js +49 -0
- package/lib/v1/Label/Label.js +51 -0
- package/lib/v1/Layout/Box.js +128 -0
- package/lib/v1/Layout/Container.js +145 -0
- package/lib/v1/Layout/index.js +23 -0
- package/lib/v1/ListItem/ListContainer.js +120 -0
- package/lib/v1/ListItem/ListItem.js +138 -0
- package/lib/v1/ListItem/ListItemWithAvatar.js +162 -0
- package/lib/v1/ListItem/ListItemWithCheckBox.js +125 -0
- package/lib/v1/ListItem/ListItemWithIcon.js +143 -0
- package/lib/v1/ListItem/ListItemWithRadio.js +126 -0
- package/lib/v1/ListItem/index.js +55 -0
- package/lib/v1/Modal/Modal.js +212 -0
- package/lib/v1/MultiSelect/AdvancedGroupMultiSelect.js +1167 -0
- package/lib/v1/MultiSelect/AdvancedMultiSelect.js +634 -0
- package/lib/v1/MultiSelect/EmptyState.js +112 -0
- package/lib/v1/MultiSelect/MobileHeader/MobileHeader.js +62 -0
- package/lib/v1/MultiSelect/MultiSelect.js +1201 -0
- package/lib/v1/MultiSelect/MultiSelectHeader.js +78 -0
- package/lib/v1/MultiSelect/MultiSelectWithAvatar.js +270 -0
- package/lib/v1/MultiSelect/SelectedOptions.js +126 -0
- package/lib/v1/MultiSelect/Suggestions.js +195 -0
- package/lib/v1/MultiSelect/index.js +39 -0
- package/lib/v1/PopOver/PopOver.js +293 -0
- package/lib/v1/Popup/Popup.js +715 -0
- package/lib/v1/Radio/Radio.js +126 -0
- package/lib/v1/Responsive/CustomResponsive.js +242 -0
- package/lib/v1/Responsive/RefWrapper.js +57 -0
- package/lib/v1/Responsive/ResizeComponent.js +268 -0
- package/lib/v1/Responsive/ResizeObserver.js +168 -0
- package/lib/v1/Responsive/Responsive.js +274 -0
- package/lib/v1/Responsive/index.js +55 -0
- package/lib/v1/ResponsiveDropBox/ResponsiveDropBox.js +79 -0
- package/lib/v1/Ribbon/Ribbon.js +44 -0
- package/lib/v1/RippleEffect/RippleEffect.js +39 -0
- package/lib/v1/Select/GroupSelect.js +877 -0
- package/lib/v1/Select/Select.js +1013 -0
- package/lib/v1/Select/SelectWithAvatar.js +394 -0
- package/lib/v1/Select/SelectWithIcon.js +597 -0
- package/lib/v1/Select/index.js +39 -0
- package/lib/v1/Stencils/Stencils.js +43 -0
- package/lib/v1/Switch/Switch.js +108 -0
- package/lib/v1/Tab/Tab.js +132 -0
- package/lib/v1/Tab/TabContent.js +42 -0
- package/lib/v1/Tab/TabContentWrapper.js +42 -0
- package/lib/v1/Tab/TabWrapper.js +89 -0
- package/lib/v1/Tab/Tabs.js +680 -0
- package/lib/v1/Tab/index.js +47 -0
- package/lib/v1/Tag/Tag.js +154 -0
- package/lib/v1/TextBox/TextBox.js +168 -0
- package/lib/v1/TextBoxIcon/TextBoxIcon.js +196 -0
- package/lib/v1/Textarea/Textarea.js +118 -0
- package/lib/v1/Tooltip/Tooltip.js +586 -0
- package/lib/v1/Typography/Typography.js +56 -0
- package/lib/v1/Typography/css/Typography.module.css +376 -0
- package/lib/v1/Typography/css/cssJSLogic.js +41 -0
- package/lib/v1/Typography/css/letterSpacingMap.js +20 -0
- package/lib/v1/Typography/props/defaultProps.js +15 -0
- package/lib/v1/Typography/props/propTypes.js +35 -0
- package/lib/v1/VelocityAnimation/VelocityAnimation/VelocityAnimation.js +90 -0
- package/lib/v1/VelocityAnimation/VelocityAnimationGroup/VelocityAnimationGroup.js +126 -0
- package/lib/v1/semantic/Button/Button.js +63 -0
- package/lib/v1/semantic/index.js +15 -0
- package/package.json +1 -1
- package/result.json +1 -1
|
@@ -0,0 +1,518 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { defaultProps } from '../../Tooltip/props/defaultProps';
|
|
3
|
+
import { propTypes } from '../../Tooltip/props/propTypes';
|
|
4
|
+
import { getLibraryConfig } from '../../Provider/Config';
|
|
5
|
+
import style from '../../Tooltip/Tooltip.module.css';
|
|
6
|
+
import ResizeObserver from '../Responsive/ResizeObserver';
|
|
7
|
+
import selectn from 'selectn';
|
|
8
|
+
export default class Tooltip extends React.Component {
|
|
9
|
+
constructor(props) {
|
|
10
|
+
super(props);
|
|
11
|
+
this.state = {
|
|
12
|
+
title: null,
|
|
13
|
+
left: 0,
|
|
14
|
+
top: 0,
|
|
15
|
+
arrowLeft: 0,
|
|
16
|
+
isArrowRight: null,
|
|
17
|
+
isHtml: false
|
|
18
|
+
};
|
|
19
|
+
this.handleOver = this.handleOver.bind(this);
|
|
20
|
+
this.getToolTipDOM = this.getToolTipDOM.bind(this);
|
|
21
|
+
this.reset = this.reset.bind(this);
|
|
22
|
+
this.getDirection = document.getElementsByTagName('html')[0];
|
|
23
|
+
this.leftRightScreenEdge = this.leftRightScreenEdge.bind(this);
|
|
24
|
+
this.topBottomScreenEdge = this.topBottomScreenEdge.bind(this);
|
|
25
|
+
this.observer = new ResizeObserver(this.onResize);
|
|
26
|
+
this.isResized = true;
|
|
27
|
+
this.tooltipContainerClientRect = {};
|
|
28
|
+
this.tooltipContainerEl = {};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
onResize(sizeOfObservedEl, observedEl) {
|
|
32
|
+
this.isResized = true;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
observeElement() {
|
|
36
|
+
this.tooltipContainerEl = this.getToolTipContainerEl();
|
|
37
|
+
this.observer.observe(this.tooltipContainerEl);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
unObserveElement() {
|
|
41
|
+
this.observer.disconnect();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
getClientRectOfContEl(el) {
|
|
45
|
+
if (this.isResized) {
|
|
46
|
+
return this.setClientRectOfContEl(el);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return this.tooltipContainerClientRect;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
setClientRectOfContEl(containerEl) {
|
|
53
|
+
this.isResized = false;
|
|
54
|
+
this.tooltipContainerClientRect = containerEl.getBoundingClientRect();
|
|
55
|
+
return this.tooltipContainerClientRect;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
getToolTipContainerEl() {
|
|
59
|
+
const getTooltipContainer = getLibraryConfig('getTooltipContainer');
|
|
60
|
+
const tooltipContainer = typeof getTooltipContainer === 'function' ? getTooltipContainer() : null;
|
|
61
|
+
return tooltipContainer ? tooltipContainer : document.body;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
getToolTipDOM(el) {
|
|
65
|
+
this.toolTip = el;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
reset() {
|
|
69
|
+
let {
|
|
70
|
+
title
|
|
71
|
+
} = this.state;
|
|
72
|
+
|
|
73
|
+
if (title !== null) {
|
|
74
|
+
this.setState({
|
|
75
|
+
title: null,
|
|
76
|
+
top: 0,
|
|
77
|
+
left: 0
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/* left and right screen edge check for top and bottom tooltip position */
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
leftRightScreenEdge(tLeft, toolTipArrowLeft, thisLeft, thisWidth, tooltipoffsetWidth, bodyWidth, rightEdge, bodyLeft) {
|
|
85
|
+
if (tLeft - bodyLeft <= 1) {
|
|
86
|
+
// top & bottom position left side screen edge case
|
|
87
|
+
tLeft = bodyLeft + 2;
|
|
88
|
+
toolTipArrowLeft = parseInt(thisLeft - bodyLeft + thisWidth / 2 - 6);
|
|
89
|
+
} else if (tLeft - bodyLeft + tooltipoffsetWidth > bodyWidth) {
|
|
90
|
+
// top & bottom position right side screen edge case
|
|
91
|
+
rightEdge = tLeft + tooltipoffsetWidth - bodyWidth + 2;
|
|
92
|
+
tLeft = tLeft + bodyLeft - rightEdge;
|
|
93
|
+
toolTipArrowLeft = toolTipArrowLeft - bodyLeft + rightEdge;
|
|
94
|
+
} else if (tLeft + tooltipoffsetWidth + tooltipoffsetWidth >= bodyWidth - 2) {
|
|
95
|
+
// top & bottom center screen tooltip collide with right edge screen
|
|
96
|
+
tLeft = parseInt(thisLeft - (tooltipoffsetWidth - thisWidth) / 2);
|
|
97
|
+
toolTipArrowLeft = parseInt(tooltipoffsetWidth / 2 - 4);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return {
|
|
101
|
+
tLeft,
|
|
102
|
+
toolTipArrowLeft,
|
|
103
|
+
thisLeft,
|
|
104
|
+
thisWidth,
|
|
105
|
+
tooltipoffsetWidth,
|
|
106
|
+
bodyWidth,
|
|
107
|
+
rightEdge
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
/* top and bottom screen edge check for left and right tooltip position */
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
topBottomScreenEdge(tTop, toolTipArrowTop, thisTop, thisHeight, tooltipoffsetHeight, bodyHeight, bottomEdge) {
|
|
114
|
+
if (tTop <= 1) {
|
|
115
|
+
tTop = 2;
|
|
116
|
+
toolTipArrowTop = parseInt(thisTop + thisHeight / 2);
|
|
117
|
+
} else if (tTop + tooltipoffsetHeight > bodyHeight) {
|
|
118
|
+
bottomEdge = tTop + tooltipoffsetHeight - bodyHeight + 2;
|
|
119
|
+
tTop -= bottomEdge;
|
|
120
|
+
toolTipArrowTop += bottomEdge;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return {
|
|
124
|
+
tTop,
|
|
125
|
+
toolTipArrowTop,
|
|
126
|
+
thisTop,
|
|
127
|
+
thisHeight,
|
|
128
|
+
tooltipoffsetHeight,
|
|
129
|
+
bodyHeight,
|
|
130
|
+
bottomEdge
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
handleOver(e, targetElement) {
|
|
135
|
+
let containerElement = this.tooltipContainerEl;
|
|
136
|
+
let element = e.target;
|
|
137
|
+
let titleDiv = element.hasAttribute('data-title') || element.hasAttribute('title') ? element : element.closest('[data-title]') || element.closest('[title]');
|
|
138
|
+
|
|
139
|
+
if (titleDiv) {
|
|
140
|
+
let title = titleDiv.getAttribute('data-title') || titleDiv.getAttribute('title');
|
|
141
|
+
/* if data-title-position is left or right change right and left in rtl case */
|
|
142
|
+
|
|
143
|
+
let isPosition = titleDiv.getAttribute('data-title-position');
|
|
144
|
+
let elem = this.getDirection;
|
|
145
|
+
|
|
146
|
+
if (elem.getAttribute('dir') == 'rtl') {
|
|
147
|
+
if (isPosition == 'left') {
|
|
148
|
+
isPosition = 'right';
|
|
149
|
+
} else if (isPosition == 'right') {
|
|
150
|
+
isPosition = 'left';
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
if (title !== '' && title) {
|
|
155
|
+
titleDiv.setAttribute('data-title', title);
|
|
156
|
+
titleDiv.removeAttribute('title');
|
|
157
|
+
|
|
158
|
+
if (element.nodeName !== 'I' && element.innerText && element.innerText.trim() !== '') {
|
|
159
|
+
let isContentDotted = '';
|
|
160
|
+
|
|
161
|
+
if (element.scrollWidth !== 0) {
|
|
162
|
+
isContentDotted = element.offsetWidth < element.scrollWidth;
|
|
163
|
+
|
|
164
|
+
if (!isContentDotted) {
|
|
165
|
+
isContentDotted = element.offsetHeight < element.scrollHeight;
|
|
166
|
+
} // if (!isContentDotted) {Need to check the code Sivanesh
|
|
167
|
+
// isContentDotted = element.offsetHeight < element.scrollHeight;
|
|
168
|
+
// }
|
|
169
|
+
|
|
170
|
+
} else {
|
|
171
|
+
const offWidth = selectn('parentElement.offsetWidth', element) || 0;
|
|
172
|
+
const scrollWidth = selectn('parentElement.scrollWidth', element) || 0;
|
|
173
|
+
isContentDotted = offWidth < scrollWidth;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
let originText = element.innerText.replace(/\s/g, '').toLowerCase();
|
|
177
|
+
let tooltipText = title.replace(/\s/g, '').toLowerCase();
|
|
178
|
+
let isDefaultTooltip = element.hasAttribute('data-istitle') || element.hasAttribute('istitle') ? element.getAttribute('data-istitle') || element.getAttribute('istitle') : 'false';
|
|
179
|
+
isDefaultTooltip = isDefaultTooltip === 'true';
|
|
180
|
+
let isSameText = originText.indexOf(tooltipText) !== -1 ? true : false;
|
|
181
|
+
|
|
182
|
+
if (!isContentDotted && isSameText && !isDefaultTooltip) {
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
if (isContentDotted && titleDiv.getAttribute('data-dottedTitle')) {
|
|
187
|
+
title = titleDiv.getAttribute('data-dottedTitle');
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
let isHtml = titleDiv.getAttribute('data-ishtml');
|
|
192
|
+
let dataTooltipnoArrow = titleDiv.getAttribute('data-tooltip-noarrow') === 'true' ? true : false;
|
|
193
|
+
let dataTooltipWrap = titleDiv.getAttribute('data-title-wrap') === 'true' ? true : false;
|
|
194
|
+
let clientRect = titleDiv.getBoundingClientRect();
|
|
195
|
+
let boxLayout = this.getClientRectOfContEl(containerElement);
|
|
196
|
+
this.setState({
|
|
197
|
+
title,
|
|
198
|
+
isHtml,
|
|
199
|
+
dataTooltipnoArrow,
|
|
200
|
+
dataTooltipWrap
|
|
201
|
+
}, () => {
|
|
202
|
+
let tooltip = this.toolTip;
|
|
203
|
+
|
|
204
|
+
if (tooltip) {
|
|
205
|
+
/* element top, left, height, width */
|
|
206
|
+
let thisTop = clientRect.top;
|
|
207
|
+
let thisLeft = clientRect.left;
|
|
208
|
+
let thisHeight = clientRect.height;
|
|
209
|
+
let thisWidth = clientRect.width;
|
|
210
|
+
/* box layout left spacing */
|
|
211
|
+
|
|
212
|
+
let bodyLeft = boxLayout.left; // let checkTop = thisTop + thisHeight;
|
|
213
|
+
|
|
214
|
+
/* element left plus element width */
|
|
215
|
+
|
|
216
|
+
let checkLeft = thisLeft + thisWidth;
|
|
217
|
+
let tTop;
|
|
218
|
+
let tLeft;
|
|
219
|
+
let toolTipArrowTop;
|
|
220
|
+
let toolTipArrowLeft;
|
|
221
|
+
let rightEdge;
|
|
222
|
+
let bottomEdge;
|
|
223
|
+
let tooltipLeft;
|
|
224
|
+
/* offset width, height of body */
|
|
225
|
+
|
|
226
|
+
let bodyWidth = containerElement.offsetWidth;
|
|
227
|
+
let bodyHeight = containerElement.offsetHeight;
|
|
228
|
+
let isArrowHorizontal = false;
|
|
229
|
+
let isArrowDown = false;
|
|
230
|
+
let isArrowRight = false;
|
|
231
|
+
let tWidth = '';
|
|
232
|
+
/* overall body height minus element top + element height */
|
|
233
|
+
|
|
234
|
+
let thisBottom = bodyHeight - (thisTop + thisHeight);
|
|
235
|
+
/* overall body width minus element left + element width */
|
|
236
|
+
|
|
237
|
+
let thisRight = bodyWidth - (thisLeft + thisWidth);
|
|
238
|
+
/* tooltip width and height */
|
|
239
|
+
|
|
240
|
+
let tooltipoffsetWidth = tooltip.offsetWidth;
|
|
241
|
+
let tooltipoffsetHeight = tooltip.offsetHeight;
|
|
242
|
+
|
|
243
|
+
if (isPosition) {
|
|
244
|
+
if (isPosition == 'top') {
|
|
245
|
+
/* if top does not have enough space show tooltip in bottom area */
|
|
246
|
+
if (thisTop <= tooltipoffsetHeight + 5) {
|
|
247
|
+
/* if top space is larger than bottom space show tooltip in top area */
|
|
248
|
+
if (thisTop > thisBottom) {
|
|
249
|
+
tTop = parseInt(thisTop - (tooltipoffsetHeight + 10));
|
|
250
|
+
tLeft = parseInt(thisLeft - (tooltipoffsetWidth - thisWidth) / 2 + 2);
|
|
251
|
+
toolTipArrowTop = parseInt(tooltipoffsetHeight - 4);
|
|
252
|
+
toolTipArrowLeft = parseInt(tooltipoffsetWidth / 2 - 6);
|
|
253
|
+
isArrowDown = true;
|
|
254
|
+
} else {
|
|
255
|
+
/* bottom position */
|
|
256
|
+
tTop = parseInt(thisTop + (thisHeight + 10));
|
|
257
|
+
tLeft = parseInt(thisLeft - (tooltipoffsetWidth - thisWidth) / 2 + 2);
|
|
258
|
+
toolTipArrowTop = -4;
|
|
259
|
+
toolTipArrowLeft = parseInt(tooltipoffsetWidth / 2 - 6);
|
|
260
|
+
isArrowDown = false;
|
|
261
|
+
}
|
|
262
|
+
} else {
|
|
263
|
+
/* if top have enough space show tooltip in top area */
|
|
264
|
+
tTop = parseInt(thisTop - (tooltipoffsetHeight + 10));
|
|
265
|
+
tLeft = parseInt(thisLeft - (tooltipoffsetWidth - thisWidth) / 2 + 2);
|
|
266
|
+
toolTipArrowTop = parseInt(tooltipoffsetHeight - 4);
|
|
267
|
+
toolTipArrowLeft = parseInt(tooltipoffsetWidth / 2 - 6);
|
|
268
|
+
isArrowDown = true;
|
|
269
|
+
}
|
|
270
|
+
/* top tooltip left and right corner edge case */
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
let values = this.leftRightScreenEdge(tLeft, toolTipArrowLeft, thisLeft, thisWidth, tooltipoffsetWidth, bodyWidth, rightEdge, bodyLeft);
|
|
274
|
+
tLeft = values.tLeft, toolTipArrowLeft = values.toolTipArrowLeft, thisLeft = values.thisLeft, thisWidth = values.thisWidth, tooltipoffsetWidth = values.tooltipoffsetWidth, bodyWidth = values.bodyWidth, rightEdge = values.rightEdge;
|
|
275
|
+
} else if (isPosition == 'bottom') {
|
|
276
|
+
/* if bottom does not have enough space show tooltip in top area */
|
|
277
|
+
if (thisBottom <= tooltipoffsetHeight + 5) {
|
|
278
|
+
/* if bottom space is larger than top space show tooltip in bottom area */
|
|
279
|
+
if (thisTop > thisBottom) {
|
|
280
|
+
tTop = parseInt(thisTop - (tooltipoffsetHeight + 10));
|
|
281
|
+
tLeft = parseInt(thisLeft - (tooltipoffsetWidth - thisWidth) / 2 + 2);
|
|
282
|
+
toolTipArrowTop = parseInt(tooltipoffsetHeight - 4);
|
|
283
|
+
toolTipArrowLeft = parseInt(tooltipoffsetWidth / 2 - 6);
|
|
284
|
+
isArrowDown = true;
|
|
285
|
+
} else {
|
|
286
|
+
/* top position */
|
|
287
|
+
tTop = parseInt(thisTop + (thisHeight + 10));
|
|
288
|
+
tLeft = parseInt(thisLeft - (tooltipoffsetWidth - thisWidth) / 2 + 2);
|
|
289
|
+
toolTipArrowTop = -4;
|
|
290
|
+
toolTipArrowLeft = parseInt(tooltipoffsetWidth / 2 - 6);
|
|
291
|
+
isArrowDown = false;
|
|
292
|
+
}
|
|
293
|
+
} else {
|
|
294
|
+
/* if bottom have enough space show tooltip in bottom area */
|
|
295
|
+
tTop = parseInt(thisTop + (thisHeight + 10));
|
|
296
|
+
tLeft = parseInt(thisLeft - (tooltipoffsetWidth - thisWidth) / 2 + 2);
|
|
297
|
+
toolTipArrowTop = -4;
|
|
298
|
+
toolTipArrowLeft = parseInt(tooltipoffsetWidth / 2 - 6);
|
|
299
|
+
isArrowDown = false;
|
|
300
|
+
}
|
|
301
|
+
/* bottom tooltip left and right corner edge case */
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
let values = this.leftRightScreenEdge(tLeft, toolTipArrowLeft, thisLeft, thisWidth, tooltipoffsetWidth, bodyWidth, rightEdge, bodyLeft);
|
|
305
|
+
tLeft = values.tLeft, toolTipArrowLeft = values.toolTipArrowLeft, thisLeft = values.thisLeft, thisWidth = values.thisWidth, tooltipoffsetWidth = values.tooltipoffsetWidth, bodyWidth = values.bodyWidth, rightEdge = values.rightEdge;
|
|
306
|
+
} else if (isPosition == 'left') {
|
|
307
|
+
isArrowHorizontal = true;
|
|
308
|
+
|
|
309
|
+
if (thisLeft - bodyLeft <= tooltipoffsetWidth) {
|
|
310
|
+
if (thisLeft - bodyLeft <= thisRight) {
|
|
311
|
+
/* if left does not have enough space show tooltip in right area */
|
|
312
|
+
tTop = parseInt(thisTop + (thisHeight / 2 - tooltipoffsetHeight / 2));
|
|
313
|
+
tLeft = parseInt(thisLeft + thisWidth + 10);
|
|
314
|
+
toolTipArrowTop = parseInt(tooltipoffsetHeight / 2 - 1);
|
|
315
|
+
toolTipArrowLeft = -1;
|
|
316
|
+
isArrowRight = false;
|
|
317
|
+
} else {
|
|
318
|
+
/* if left space is larger than right space show tooltip in left (default) area */
|
|
319
|
+
if (bodyLeft + tooltipoffsetWidth >= thisLeft) {
|
|
320
|
+
/* if tooltip width is greater than left space, set left space width to tooltip */
|
|
321
|
+
tWidth = thisLeft;
|
|
322
|
+
tTop = parseInt(thisTop + (thisHeight / 2 - tooltipoffsetHeight / 2));
|
|
323
|
+
tLeft = parseInt(thisLeft - tWidth - 7);
|
|
324
|
+
toolTipArrowTop = parseInt(tooltipoffsetHeight / 2 - 1);
|
|
325
|
+
toolTipArrowLeft = parseInt(tWidth - 2);
|
|
326
|
+
isArrowRight = true;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
} else {
|
|
330
|
+
/* if left have enough space show tooltip in left area */
|
|
331
|
+
tTop = parseInt(thisTop + (thisHeight / 2 - tooltipoffsetHeight / 2));
|
|
332
|
+
tLeft = parseInt(thisLeft - tooltipoffsetWidth - 7);
|
|
333
|
+
toolTipArrowTop = parseInt(tooltipoffsetHeight / 2 - 1);
|
|
334
|
+
toolTipArrowLeft = parseInt(tooltipoffsetWidth - 2);
|
|
335
|
+
isArrowRight = true;
|
|
336
|
+
}
|
|
337
|
+
/* left tooltip top and bottom corner edge case */
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
let values = this.topBottomScreenEdge(tTop, toolTipArrowTop, thisTop, thisHeight, tooltipoffsetHeight, bodyHeight, bottomEdge);
|
|
341
|
+
tTop = values.tTop, toolTipArrowTop = values.toolTipArrowTop, thisTop = values.thisTop, thisHeight = values.thisHeight, tooltipoffsetHeight = values.tooltipoffsetHeight, bodyHeight = values.bodyHeight, bottomEdge = values.bottomEdge;
|
|
342
|
+
} else if (isPosition == 'right') {
|
|
343
|
+
isArrowHorizontal = true;
|
|
344
|
+
|
|
345
|
+
if (thisRight + bodyLeft <= tooltipoffsetWidth) {
|
|
346
|
+
if (thisLeft + bodyLeft <= thisRight) {
|
|
347
|
+
/* if right space is larger than left space show tooltip in right (default) area */
|
|
348
|
+
tTop = parseInt(thisTop + (thisHeight / 2 - tooltipoffsetHeight / 2));
|
|
349
|
+
tLeft = parseInt(thisLeft + thisWidth + 7);
|
|
350
|
+
toolTipArrowTop = parseInt(tooltipoffsetHeight / 2 - 1);
|
|
351
|
+
toolTipArrowLeft = -1;
|
|
352
|
+
isArrowRight = false;
|
|
353
|
+
} else {
|
|
354
|
+
/* if right does not have enough space show tooltip in left area */
|
|
355
|
+
if (tooltipoffsetWidth >= thisLeft) {
|
|
356
|
+
/* if tooltip width is greater than left space, set left space width to tooltip */
|
|
357
|
+
tWidth = thisLeft;
|
|
358
|
+
tTop = parseInt(thisTop + (thisHeight / 2 - tooltipoffsetHeight / 2));
|
|
359
|
+
tLeft = parseInt(thisLeft - tWidth - 7);
|
|
360
|
+
toolTipArrowTop = parseInt(tooltipoffsetHeight / 2 - 1);
|
|
361
|
+
toolTipArrowLeft = parseInt(tWidth - 2);
|
|
362
|
+
isArrowRight = true;
|
|
363
|
+
} else {
|
|
364
|
+
/* show tooltip in left area without setting left space width to tooltip */
|
|
365
|
+
tTop = parseInt(thisTop + (thisHeight / 2 - tooltipoffsetHeight / 2));
|
|
366
|
+
tLeft = parseInt(thisLeft - tooltipoffsetWidth - 7);
|
|
367
|
+
toolTipArrowTop = parseInt(tooltipoffsetHeight / 2 - 1);
|
|
368
|
+
toolTipArrowLeft = parseInt(tooltipoffsetWidth - 2);
|
|
369
|
+
isArrowRight = true;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
} else {
|
|
373
|
+
/* if right have enough space show tooltip in right area */
|
|
374
|
+
tTop = parseInt(thisTop + (thisHeight / 2 - tooltipoffsetHeight / 2));
|
|
375
|
+
tLeft = parseInt(thisLeft + thisWidth + 7);
|
|
376
|
+
toolTipArrowTop = parseInt(tooltipoffsetHeight / 2 - 1);
|
|
377
|
+
toolTipArrowLeft = -1;
|
|
378
|
+
isArrowRight = false;
|
|
379
|
+
}
|
|
380
|
+
/* right tooltip left and right corner edge case */
|
|
381
|
+
|
|
382
|
+
|
|
383
|
+
let values = this.topBottomScreenEdge(tTop, toolTipArrowTop, thisTop, thisHeight, tooltipoffsetHeight, bodyHeight, bottomEdge);
|
|
384
|
+
tTop = values.tTop, toolTipArrowTop = values.toolTipArrowTop, thisTop = values.thisTop, thisHeight = values.thisHeight, tooltipoffsetHeight = values.tooltipoffsetHeight, bodyHeight = values.bodyHeight, bottomEdge = values.bottomEdge;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
this.setState({
|
|
388
|
+
top: tTop,
|
|
389
|
+
left: tLeft,
|
|
390
|
+
arrowTop: toolTipArrowTop,
|
|
391
|
+
arrowLeft: toolTipArrowLeft,
|
|
392
|
+
isArrowHorizontal: isArrowHorizontal,
|
|
393
|
+
isArrowDown: isArrowDown,
|
|
394
|
+
isArrowRight: isArrowRight,
|
|
395
|
+
width: tWidth
|
|
396
|
+
});
|
|
397
|
+
} else {
|
|
398
|
+
this.setState({
|
|
399
|
+
isArrowRight: null
|
|
400
|
+
});
|
|
401
|
+
tTop = parseInt(thisTop + thisHeight + 10);
|
|
402
|
+
tLeft = parseInt(thisLeft - (tooltipoffsetWidth / 2 - thisWidth / 2) + 2);
|
|
403
|
+
tooltipLeft = parseInt(tooltipoffsetWidth / 2 - 6);
|
|
404
|
+
|
|
405
|
+
if (tLeft - bodyLeft <= 1) {
|
|
406
|
+
// default left side screen edge case
|
|
407
|
+
tooltipLeft = parseInt(thisLeft - bodyLeft + thisWidth / 2 - 6);
|
|
408
|
+
tLeft = bodyLeft + 2;
|
|
409
|
+
} else if (tLeft - bodyLeft + tooltipoffsetWidth > bodyWidth) {
|
|
410
|
+
checkLeft = tLeft + tooltipoffsetWidth - bodyWidth + 2;
|
|
411
|
+
tooltipLeft = tooltipLeft - bodyLeft + checkLeft;
|
|
412
|
+
tLeft = tLeft + bodyLeft - checkLeft;
|
|
413
|
+
} else if (tLeft + tooltipoffsetWidth >= bodyWidth - 2) {
|
|
414
|
+
// default center screen tooltip collide with right edge screen
|
|
415
|
+
tLeft = parseInt(thisLeft - (tooltipoffsetWidth - thisWidth) / 2);
|
|
416
|
+
tooltipLeft = parseInt(tooltipoffsetWidth / 2 - 4);
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
isArrowDown = false;
|
|
420
|
+
|
|
421
|
+
if (tTop + tooltipoffsetHeight > bodyHeight) {
|
|
422
|
+
/* if bottom does not have enough space show tooltip in top area */
|
|
423
|
+
if (thisTop > thisBottom) {
|
|
424
|
+
isArrowDown = true;
|
|
425
|
+
tTop -= tooltipoffsetHeight + thisHeight + 20;
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
if (isArrowDown) {
|
|
430
|
+
let arrowTop = tooltipoffsetHeight - 4;
|
|
431
|
+
this.setState({
|
|
432
|
+
top: tTop,
|
|
433
|
+
left: tLeft,
|
|
434
|
+
arrowLeft: tooltipLeft,
|
|
435
|
+
arrowTop,
|
|
436
|
+
isArrowDown: true,
|
|
437
|
+
isArrowHorizontal: isArrowHorizontal
|
|
438
|
+
});
|
|
439
|
+
} else {
|
|
440
|
+
this.setState({
|
|
441
|
+
top: tTop,
|
|
442
|
+
left: tLeft,
|
|
443
|
+
arrowLeft: tooltipLeft,
|
|
444
|
+
arrowTop: -4,
|
|
445
|
+
isArrowDown: false,
|
|
446
|
+
isArrowHorizontal: isArrowHorizontal
|
|
447
|
+
});
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
});
|
|
452
|
+
titleDiv.addEventListener('click', this.reset);
|
|
453
|
+
titleDiv.addEventListener('mouseup', this.reset);
|
|
454
|
+
titleDiv.addEventListener('mouseleave', this.reset);
|
|
455
|
+
}
|
|
456
|
+
} else {
|
|
457
|
+
this.reset();
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
render() {
|
|
462
|
+
let {
|
|
463
|
+
title,
|
|
464
|
+
left,
|
|
465
|
+
top,
|
|
466
|
+
arrowLeft,
|
|
467
|
+
arrowTop,
|
|
468
|
+
isArrowDown,
|
|
469
|
+
isArrowRight,
|
|
470
|
+
isArrowHorizontal,
|
|
471
|
+
width,
|
|
472
|
+
isHtml,
|
|
473
|
+
dataTooltipnoArrow,
|
|
474
|
+
dataTooltipWrap
|
|
475
|
+
} = this.state;
|
|
476
|
+
let {
|
|
477
|
+
dataId,
|
|
478
|
+
customClass
|
|
479
|
+
} = this.props;
|
|
480
|
+
let arrowStyle = isArrowHorizontal ? isArrowRight ? style.arrowRight : style.arrowLeft : isArrowDown ? style.arrowDown : style.arrowUp;
|
|
481
|
+
title = title ? title.trim() : null;
|
|
482
|
+
let tooltipCss = `${style.tooltipcont} ${dataTooltipWrap ? style.tooltipWrapCont : style.tooltipNormalCont}`;
|
|
483
|
+
return title ? /*#__PURE__*/React.createElement("div", {
|
|
484
|
+
className: `${customClass} ${style.tooltiptext}`,
|
|
485
|
+
style: {
|
|
486
|
+
left,
|
|
487
|
+
top,
|
|
488
|
+
width
|
|
489
|
+
},
|
|
490
|
+
ref: this.getToolTipDOM,
|
|
491
|
+
"data-id": dataId,
|
|
492
|
+
"data-test-id": dataId
|
|
493
|
+
}, !dataTooltipnoArrow ? /*#__PURE__*/React.createElement("span", {
|
|
494
|
+
className: `${style.tooltiparrow} ${arrowStyle}`,
|
|
495
|
+
style: {
|
|
496
|
+
left: arrowLeft,
|
|
497
|
+
top: arrowTop
|
|
498
|
+
}
|
|
499
|
+
}) : null, isHtml ? /*#__PURE__*/React.createElement("div", {
|
|
500
|
+
className: tooltipCss,
|
|
501
|
+
dangerouslySetInnerHTML: {
|
|
502
|
+
__html: title
|
|
503
|
+
}
|
|
504
|
+
}) : /*#__PURE__*/React.createElement("div", {
|
|
505
|
+
className: tooltipCss
|
|
506
|
+
}, title)) : null;
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
}
|
|
510
|
+
Tooltip.propTypes = propTypes;
|
|
511
|
+
Tooltip.defaultProps = defaultProps; // if (__DOCS__) {
|
|
512
|
+
// Tooltip.docs = {
|
|
513
|
+
// componentGroup: 'Atom',
|
|
514
|
+
// folderName: 'Style Guide',
|
|
515
|
+
// description: ' ',
|
|
516
|
+
// external: true
|
|
517
|
+
// };
|
|
518
|
+
// }
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { defaultProps } from './props/defaultProps';
|
|
3
|
+
import { propTypes } from './props/propTypes';
|
|
4
|
+
import cssJSLogic from './css/cssJSLogic';
|
|
5
|
+
import { mergeStyle } from '@zohodesk/utils';
|
|
6
|
+
import defaultStyle from './css/Typography.module.css';
|
|
7
|
+
|
|
8
|
+
const Typography = props => {
|
|
9
|
+
const {
|
|
10
|
+
children,
|
|
11
|
+
$ui_tagName,
|
|
12
|
+
$i18n_dataTitle,
|
|
13
|
+
testId,
|
|
14
|
+
customId,
|
|
15
|
+
tagAttributes,
|
|
16
|
+
a11yAttributes,
|
|
17
|
+
customStyle
|
|
18
|
+
} = props;
|
|
19
|
+
const style = mergeStyle(defaultStyle, customStyle);
|
|
20
|
+
const {
|
|
21
|
+
typographyClass
|
|
22
|
+
} = cssJSLogic({
|
|
23
|
+
props,
|
|
24
|
+
style
|
|
25
|
+
});
|
|
26
|
+
return /*#__PURE__*/React.createElement($ui_tagName, {
|
|
27
|
+
className: typographyClass,
|
|
28
|
+
'data-title': $i18n_dataTitle,
|
|
29
|
+
'data-id': customId,
|
|
30
|
+
'data-test-id': testId,
|
|
31
|
+
...tagAttributes,
|
|
32
|
+
...a11yAttributes
|
|
33
|
+
}, children);
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
Typography.propTypes = propTypes;
|
|
37
|
+
Typography.defaultProps = defaultProps;
|
|
38
|
+
export default Typography;
|