@dile/ui 2.0.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/LICENSE +7 -0
- package/README.md +3 -0
- package/components/app-drawer/app-drawer.js +3 -0
- package/components/app-drawer/index.js +1 -0
- package/components/app-drawer/src/DileAppDrawer.js +153 -0
- package/components/avatar/avatar.js +3 -0
- package/components/avatar/index.js +1 -0
- package/components/avatar/src/DileAvatar.js +78 -0
- package/components/breadcrumbs/breadcrumbs-item.js +3 -0
- package/components/breadcrumbs/breadcrumbs.js +4 -0
- package/components/breadcrumbs/index.js +2 -0
- package/components/breadcrumbs/src/DileBreadcrumbs.js +76 -0
- package/components/breadcrumbs/src/DileBreadcrumbsItem.js +51 -0
- package/components/button/button-icon.js +3 -0
- package/components/button/button.js +3 -0
- package/components/button/index.js +2 -0
- package/components/button/src/DileButton.js +86 -0
- package/components/button/src/DileButtonIcon.js +38 -0
- package/components/card/card.js +3 -0
- package/components/card/index.js +1 -0
- package/components/card/src/DileCard.js +111 -0
- package/components/checkbox/checkbox.js +3 -0
- package/components/checkbox/index.js +1 -0
- package/components/checkbox/src/DileCheckbox.js +154 -0
- package/components/confirm/confirm.js +3 -0
- package/components/confirm/index.js +1 -0
- package/components/confirm/src/DileConfirm.js +121 -0
- package/components/datepicker/calendar.js +3 -0
- package/components/datepicker/datepicker.js +4 -0
- package/components/datepicker/index.js +2 -0
- package/components/datepicker/src/DileCalendar.js +72 -0
- package/components/datepicker/src/DileDatepicker.js +114 -0
- package/components/hamburger/hamburger.js +3 -0
- package/components/hamburger/index.js +1 -0
- package/components/hamburger/src/DileHamburger.js +129 -0
- package/components/icon/icon.js +3 -0
- package/components/icon/index.js +1 -0
- package/components/icon/src/DileIcon.js +40 -0
- package/components/icon-switch/icon-switch-group.js +3 -0
- package/components/icon-switch/icon-switch.js +3 -0
- package/components/icon-switch/index.js +1 -0
- package/components/icon-switch/src/DileIconSwitch.js +54 -0
- package/components/icon-switch/src/DileIconSwitchGroup.js +38 -0
- package/components/info-box/index.js +1 -0
- package/components/info-box/info-box.js +3 -0
- package/components/info-box/src/DileInfoBox.js +118 -0
- package/components/inline-feedback/index.js +1 -0
- package/components/inline-feedback/inline-feedback.js +3 -0
- package/components/inline-feedback/src/DileInlineFeedback.js +96 -0
- package/components/input/index.js +9 -0
- package/components/input/input-integer.js +3 -0
- package/components/input/input-message.js +3 -0
- package/components/input/input-money.js +3 -0
- package/components/input/input-number-mask.js +3 -0
- package/components/input/input-percentage.js +3 -0
- package/components/input/input-search.js +3 -0
- package/components/input/input.js +3 -0
- package/components/input/src/DileInput.js +245 -0
- package/components/input/src/DileInputInteger.js +45 -0
- package/components/input/src/DileInputMessage.js +12 -0
- package/components/input/src/DileInputMoney.js +72 -0
- package/components/input/src/DileInputNumberMask.js +83 -0
- package/components/input/src/DileInputPercentage.js +57 -0
- package/components/input/src/DileInputSearch.js +145 -0
- package/components/input/src/Mask.js +37 -0
- package/components/input/src/message-styles.js +14 -0
- package/components/menu-hamburger/index.js +1 -0
- package/components/menu-hamburger/menu-hamburger.js +3 -0
- package/components/menu-hamburger/src/DileMenuHamburger.js +89 -0
- package/components/menu-overlay/index.js +1 -0
- package/components/menu-overlay/menu-overlay.js +3 -0
- package/components/menu-overlay/src/DileMenuOverlay.js +71 -0
- package/components/message/index.js +1 -0
- package/components/message/message.js +3 -0
- package/components/message/src/DileMessage.js +166 -0
- package/components/modal/index.js +1 -0
- package/components/modal/modal.js +3 -0
- package/components/modal/src/DileModal.js +194 -0
- package/components/nav/index.js +1 -0
- package/components/nav/nav.js +3 -0
- package/components/nav/src/DileNav.js +68 -0
- package/components/order-switch/index.js +1 -0
- package/components/order-switch/order-switch.js +3 -0
- package/components/order-switch/src/DileOrderSwitch.js +74 -0
- package/components/pages/index.js +1 -0
- package/components/pages/pages.js +3 -0
- package/components/pages/src/DilePages.js +178 -0
- package/components/password/index.js +1 -0
- package/components/password/password.js +3 -0
- package/components/password/src/DilePassword.js +34 -0
- package/components/progress-bar/index.js +1 -0
- package/components/progress-bar/progress-bar.js +3 -0
- package/components/progress-bar/src/DileProgressBar.js +89 -0
- package/components/radio-group/index.js +2 -0
- package/components/radio-group/radio-group.js +3 -0
- package/components/radio-group/radio.js +3 -0
- package/components/radio-group/src/DileRadio.js +79 -0
- package/components/radio-group/src/DileRadioGroup.js +102 -0
- package/components/range/index.js +1 -0
- package/components/range/range.js +3 -0
- package/components/range/src/DileRange.js +119 -0
- package/components/rating/index.js +1 -0
- package/components/rating/rating.js +4 -0
- package/components/rating/src/DileRating.js +119 -0
- package/components/rating/src/DileStar.js +63 -0
- package/components/rating/star.js +3 -0
- package/components/rating-scale-question/index.js +2 -0
- package/components/rating-scale-question/rating-scale-option.js +3 -0
- package/components/rating-scale-question/rating-scale-question.js +3 -0
- package/components/rating-scale-question/src/DileRatingScaleOption.js +184 -0
- package/components/rating-scale-question/src/DileRatingScaleQuestion.js +252 -0
- package/components/select/index.js +1 -0
- package/components/select/select-ajax.js +4 -0
- package/components/select/select.js +3 -0
- package/components/select/src/DileSelect.js +172 -0
- package/components/select/src/DileSelectAjax.js +338 -0
- package/components/selector/index.js +2 -0
- package/components/selector/selector-item.js +3 -0
- package/components/selector/selector.js +3 -0
- package/components/selector/src/DileSelector.js +12 -0
- package/components/selector/src/DileSelectorItem.js +94 -0
- package/components/slide-show/index.js +1 -0
- package/components/slide-show/slide-show.js +3 -0
- package/components/slide-show/src/DileSlideShow.js +111 -0
- package/components/social-icon/index.js +1 -0
- package/components/social-icon/social-icon.js +3 -0
- package/components/social-icon/src/DileSocialIcon.js +63 -0
- package/components/social-icon/src/icons.js +103 -0
- package/components/spinner/index.js +1 -0
- package/components/spinner/spinner-horizontal.js +3 -0
- package/components/spinner/spinner-modal.js +4 -0
- package/components/spinner/spinner.js +3 -0
- package/components/spinner/src/DileSpinner.js +116 -0
- package/components/spinner/src/DileSpinnerHorizontal.js +64 -0
- package/components/spinner/src/DileSpinnerMixin.js +13 -0
- package/components/spinner/src/DileSpinnerModal.js +51 -0
- package/components/tabs/index.js +2 -0
- package/components/tabs/src/DileTab.js +60 -0
- package/components/tabs/src/DileTabs.js +12 -0
- package/components/tabs/tab.js +3 -0
- package/components/tabs/tabs.js +4 -0
- package/components/textarea/index.js +1 -0
- package/components/textarea/src/DileTextarea.js +166 -0
- package/components/textarea/textarea.js +3 -0
- package/components/toast/index.js +3 -0
- package/components/toast/src/DileToast.js +95 -0
- package/components/toast/src/DileToastItem.js +92 -0
- package/components/toast/src/DileToastPersistent.js +100 -0
- package/components/toast/toast-item.js +3 -0
- package/components/toast/toast-persistent.js +3 -0
- package/components/toast/toast.js +4 -0
- package/components/tooltip/chip-tooltip.js +3 -0
- package/components/tooltip/index.js +1 -0
- package/components/tooltip/src/DileChipTooltip.js +86 -0
- package/components/tooltip/src/DileTooltip.js +195 -0
- package/components/tooltip/tooltip.js +3 -0
- package/mixins/close-document-click/index.js +1 -0
- package/mixins/close-document-click/src/DileCloseDocumentClick.js +67 -0
- package/mixins/close-on-esc-pressed/index.js +1 -0
- package/mixins/close-on-esc-pressed/src/DileCloseOnEscPressed.js +31 -0
- package/mixins/form/index.js +3 -0
- package/mixins/form/src/DileEmmitChange.js +22 -0
- package/mixins/form/src/DileForm.js +116 -0
- package/mixins/form/src/DileFormChangeDetect.js +34 -0
- package/mixins/overlay/index.js +1 -0
- package/mixins/overlay/src/DileOverlay.js +171 -0
- package/mixins/selectable/index.js +2 -0
- package/mixins/selectable/src/DileSelectable.js +154 -0
- package/mixins/selectable/src/DileSelectableItem.js +30 -0
- package/mixins/slide-down/index.js +1 -0
- package/mixins/slide-down/src/DileSlideDown.js +40 -0
- package/package.json +29 -0
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { html, css, LitElement } from 'lit';
|
|
2
|
+
|
|
3
|
+
export class DileTooltip extends LitElement {
|
|
4
|
+
|
|
5
|
+
static get styles() {
|
|
6
|
+
return css`/* Tooltip container */
|
|
7
|
+
:host {
|
|
8
|
+
display: inline-block;
|
|
9
|
+
}
|
|
10
|
+
.tooltip {
|
|
11
|
+
position: relative;
|
|
12
|
+
display: flex;
|
|
13
|
+
align-items: center;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.tooltiptext {
|
|
17
|
+
visibility: hidden;
|
|
18
|
+
width: var(--dile-tooltip-width, 120px);
|
|
19
|
+
background-color: var(--dile-tooltip-background-color, #e74c3c);
|
|
20
|
+
color: var(--dile-tooltip-color, #fff);
|
|
21
|
+
font-size: var(--dile-tooltip-font-size, 16px);
|
|
22
|
+
text-align: var(--dile-tooltip-text-align, center);
|
|
23
|
+
border-radius: var(--dile-tooltip-border-radius, 6px);;
|
|
24
|
+
padding: var(--dile-tooltip-padding, 5px);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.tooltip-top {
|
|
28
|
+
position: absolute;
|
|
29
|
+
z-index: 1;
|
|
30
|
+
bottom: 150%;
|
|
31
|
+
left: 50%;
|
|
32
|
+
margin-left: -60px;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.arrow-top::after {
|
|
36
|
+
content: "";
|
|
37
|
+
position: absolute;
|
|
38
|
+
top: 100%;
|
|
39
|
+
left: 50%;
|
|
40
|
+
margin-left: -5px;
|
|
41
|
+
border-width: 5px;
|
|
42
|
+
border-style: solid;
|
|
43
|
+
border-color: var(--dile-tooltip-background-color, #e74c3c) transparent transparent transparent;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.tooltip-left {
|
|
47
|
+
position: absolute;
|
|
48
|
+
z-index: 1;
|
|
49
|
+
top: -5px;
|
|
50
|
+
right: 105%;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.arrow-left::after {
|
|
54
|
+
content: " ";
|
|
55
|
+
position: absolute;
|
|
56
|
+
top: 50%;
|
|
57
|
+
left: 100%; /* To the right of the tooltip */
|
|
58
|
+
margin-top: -5px;
|
|
59
|
+
border-width: 5px;
|
|
60
|
+
border-style: solid;
|
|
61
|
+
border-color: transparent transparent transparent var(--dile-tooltip-background-color, #e74c3c);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.tooltip-right {
|
|
65
|
+
position: absolute;
|
|
66
|
+
z-index: 1;
|
|
67
|
+
top: -5px;
|
|
68
|
+
left: 105%;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.arrow-right::after {
|
|
72
|
+
content: " ";
|
|
73
|
+
position: absolute;
|
|
74
|
+
top: 50%;
|
|
75
|
+
right: 100%; /* To the left of the tooltip */
|
|
76
|
+
margin-top: -5px;
|
|
77
|
+
border-width: 5px;
|
|
78
|
+
border-style: solid;
|
|
79
|
+
border-color: transparent var(--dile-tooltip-background-color, #e74c3c) transparent transparent;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.arrow-right::after {
|
|
83
|
+
content: "";
|
|
84
|
+
position: absolute;
|
|
85
|
+
top: 50%;
|
|
86
|
+
right: 100%;
|
|
87
|
+
margin-top: -5px;
|
|
88
|
+
border-width: 5px;
|
|
89
|
+
border-style: solid;
|
|
90
|
+
border-color: transparent var(--dile-tooltip-background-color, #e74c3c) transparent transparent;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.tooltip-bottom {
|
|
94
|
+
position: absolute;
|
|
95
|
+
z-index: 1;
|
|
96
|
+
top: 150%;
|
|
97
|
+
left: 50%;
|
|
98
|
+
margin-left: -60px;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.arrow-bottom::after {
|
|
102
|
+
content: "";
|
|
103
|
+
position: absolute;
|
|
104
|
+
bottom: 100%;
|
|
105
|
+
left: 50%;
|
|
106
|
+
margin-left: -5px;
|
|
107
|
+
border-width: 5px;
|
|
108
|
+
border-style: solid;
|
|
109
|
+
border-color: transparent transparent var(--dile-tooltip-background-color, #e74c3c) transparent;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.animation{
|
|
113
|
+
opacity: 0;
|
|
114
|
+
transition: opacity var(--dile-tooltip-time-transition, 0.5s) ease-in;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
.show {
|
|
118
|
+
visibility: visible !important;
|
|
119
|
+
opacity: 1;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
`;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
static get properties() {
|
|
126
|
+
return {
|
|
127
|
+
/** text will be displayed when the mouse hover text */
|
|
128
|
+
tooltip: { type: String },
|
|
129
|
+
|
|
130
|
+
/** Position where the tooltip where be displayed */
|
|
131
|
+
position: { type: String },
|
|
132
|
+
|
|
133
|
+
/** Adds an arrow design to the tooltip */
|
|
134
|
+
arrow: { type: Boolean },
|
|
135
|
+
|
|
136
|
+
/** Adds a fade in animation */
|
|
137
|
+
fadeIn: { type: Boolean },
|
|
138
|
+
|
|
139
|
+
/** Private property to control mouseovers and mouseouts */
|
|
140
|
+
_isMouseover: { type: Boolean }
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
constructor() {
|
|
145
|
+
super();
|
|
146
|
+
this.tooltip = 'Tooltip text';
|
|
147
|
+
this.position = 'top'
|
|
148
|
+
this.arrow = false;
|
|
149
|
+
this.fadeIn = false;
|
|
150
|
+
this._isMouseover = false;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
classPosition(position) {
|
|
154
|
+
let className = 'tooltip-top';
|
|
155
|
+
if (position == 'left') { return 'tooltip-left' };
|
|
156
|
+
if (position == 'right') { return 'tooltip-right' };
|
|
157
|
+
if (position == 'bottom') { return 'tooltip-bottom' };
|
|
158
|
+
return className;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
arrowPosition(arrow, position) {
|
|
162
|
+
return arrow ? `arrow-${position}` : '';
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
animation(fadeIn) {
|
|
166
|
+
return fadeIn ? 'animation' : '';
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
showOrNot(isMouseover) {
|
|
170
|
+
return isMouseover ? 'show' : '';
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
render() {
|
|
174
|
+
return html`
|
|
175
|
+
<div
|
|
176
|
+
class="tooltip"
|
|
177
|
+
@mouseover="${this.doMouseover}"
|
|
178
|
+
@mouseout="${this.doMouseout}"
|
|
179
|
+
>
|
|
180
|
+
<slot></slot>
|
|
181
|
+
<span
|
|
182
|
+
class="tooltiptext ${this.classPosition(this.position)} ${this.arrowPosition(this.arrow, this.position)} ${this.animation(this.fadeIn)} ${this.showOrNot(this._isMouseover)}"
|
|
183
|
+
>${this.tooltip}</span>
|
|
184
|
+
</div>
|
|
185
|
+
`;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
doMouseover() {
|
|
189
|
+
this._isMouseover = true;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
doMouseout() {
|
|
193
|
+
this._isMouseover = false;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { DileCloseDocumentClick } from "./src/DileCloseDocumentClick.js";
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* # DileCloseDocumentClick
|
|
4
|
+
*
|
|
5
|
+
* Custom Element Mixin offers a way to close elements when the user clicks in any area of the document.
|
|
6
|
+
*
|
|
7
|
+
* To use it you olny need to extend your custom element class with it.
|
|
8
|
+
*
|
|
9
|
+
* Only depends on a close() method in the extended custom element.
|
|
10
|
+
*
|
|
11
|
+
*/
|
|
12
|
+
export const DileCloseDocumentClick = (SuperClass) =>
|
|
13
|
+
class extends SuperClass {
|
|
14
|
+
constructor() {
|
|
15
|
+
super();
|
|
16
|
+
this.closeDocumentHandler = this.closeAll.bind(this);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
connectedCallback() {
|
|
20
|
+
super.connectedCallback();
|
|
21
|
+
if (!DileCloseDocumentClick.elements) {
|
|
22
|
+
DileCloseDocumentClick.elements = [];
|
|
23
|
+
document.addEventListener("click", this.closeDocumentHandler);
|
|
24
|
+
}
|
|
25
|
+
DileCloseDocumentClick.elements.push(this);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
disconnectedCallback() {
|
|
29
|
+
super.disconnectedCallback();
|
|
30
|
+
DileCloseDocumentClick.elements = DileCloseDocumentClick.elements.filter(
|
|
31
|
+
(item) => item != this
|
|
32
|
+
);
|
|
33
|
+
if (DileCloseDocumentClick.elements.length == 0) {
|
|
34
|
+
DileCloseDocumentClick.elements = null;
|
|
35
|
+
document.removeEventListener("click", this.closeDocumentHandler);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Close all the elements of this type
|
|
41
|
+
*/
|
|
42
|
+
closeAll() {
|
|
43
|
+
for (let ele of DileCloseDocumentClick.elements) {
|
|
44
|
+
ele.close();
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Close the other items of this type (distinct to this)
|
|
50
|
+
*/
|
|
51
|
+
closeOthers() {
|
|
52
|
+
DileCloseDocumentClick.elements.forEach((item) => {
|
|
53
|
+
if (item != this) {
|
|
54
|
+
item.close();
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* This method only alerts the developer to create the close() method in his component
|
|
61
|
+
*/
|
|
62
|
+
close() {
|
|
63
|
+
console.log(
|
|
64
|
+
"DileCloseDocumentClick needs a close() method in the component"
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { DileCloseOnEscPressed } from "./src/DileCloseOnEscPressed.js";
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Mixin for close something when the user press the esc key.
|
|
3
|
+
|
|
4
|
+
Needs a close() method implemented on the component you are extend from this mixin.
|
|
5
|
+
*/
|
|
6
|
+
export const DileCloseOnEscPressed = (SuperClass) =>
|
|
7
|
+
class extends SuperClass {
|
|
8
|
+
constructor() {
|
|
9
|
+
super();
|
|
10
|
+
this.closeOnEscHandler = this.escClose.bind(this);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
connectedCallback() {
|
|
14
|
+
super.connectedCallback();
|
|
15
|
+
window.addEventListener("keydown", this.closeOnEscHandler);
|
|
16
|
+
}
|
|
17
|
+
disconnectedCallback() {
|
|
18
|
+
super.disconnectedCallback();
|
|
19
|
+
window.removeEventListener("keydown", this.closeOnEscHandler);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
escClose(e) {
|
|
23
|
+
if (e.key === "Escape" && this.opened) {
|
|
24
|
+
this.close();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
close() {
|
|
29
|
+
console.log('You need to implement a close method!');
|
|
30
|
+
}
|
|
31
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* # DileEmmitChange
|
|
4
|
+
*
|
|
5
|
+
* Mixin to detect changes in form components
|
|
6
|
+
*
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export const DileEmmitChange = (superclass) => class extends superclass {
|
|
10
|
+
|
|
11
|
+
emmitChange() {
|
|
12
|
+
this.dispatchEvent(new CustomEvent('element-changed', {
|
|
13
|
+
bubbles: true,
|
|
14
|
+
composed: true,
|
|
15
|
+
detail: {
|
|
16
|
+
name: this.name,
|
|
17
|
+
value: this.value
|
|
18
|
+
}
|
|
19
|
+
}));
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* # DileForm
|
|
4
|
+
*
|
|
5
|
+
* Mixin to apply functionality to form components
|
|
6
|
+
*
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export const DileForm = (superclass) => class extends superclass {
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
constructor() {
|
|
13
|
+
super();
|
|
14
|
+
this.firstValue = null;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
static get properties() {
|
|
18
|
+
return {
|
|
19
|
+
setOnInit: { type: Object }
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
firstUpdated() {
|
|
24
|
+
super.firstUpdated();
|
|
25
|
+
this.firstValue = this.getData();
|
|
26
|
+
if(this.setOnInit) {
|
|
27
|
+
this.setData(this.setOnInit);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
getData() {
|
|
32
|
+
let data = {};
|
|
33
|
+
this.allNodeElements.forEach(node => {
|
|
34
|
+
data[node.getAttribute('name')] = node.value;
|
|
35
|
+
});
|
|
36
|
+
return data;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
setData(data) {
|
|
40
|
+
this.allNodeElements.forEach(node => {
|
|
41
|
+
if(data[node.getAttribute('name')] !== undefined && data[node.getAttribute('name')] !== null) {
|
|
42
|
+
if (typeof node.set === "function") {
|
|
43
|
+
node.set(data[node.getAttribute('name')]);
|
|
44
|
+
} else {
|
|
45
|
+
node.value = data[node.getAttribute('name')];
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
clearData() {
|
|
53
|
+
this.allNodeElements.forEach(node => {
|
|
54
|
+
if (typeof node.clear === "function") {
|
|
55
|
+
node.clear();
|
|
56
|
+
} else {
|
|
57
|
+
node.value = '';
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
get allNodeElements() {
|
|
63
|
+
return this.shadowRoot.querySelectorAll('[name]');
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
getNodeElement(name) {
|
|
67
|
+
return this.shadowRoot.querySelector('[name="' + name + '"]');
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
resetData() {
|
|
71
|
+
this.setData(this.firstValue);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
resetField(name) {
|
|
75
|
+
if(this.firstValue.hasOwnProperty(name)) {
|
|
76
|
+
let value = this.firstValue[name];
|
|
77
|
+
let node = this.getNodeElement(name);
|
|
78
|
+
node.value = value;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
showError(name, error) {
|
|
83
|
+
let node = this.getNodeElement(name);
|
|
84
|
+
node.errored = true;
|
|
85
|
+
node.message = error;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
showErrors(errors) {
|
|
89
|
+
for(let name in errors) {
|
|
90
|
+
this.showError(name, errors[name]);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
clearErrors() {
|
|
95
|
+
this.allNodeElements.forEach(node => {
|
|
96
|
+
node.errored = false;
|
|
97
|
+
node.message = '';
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
isDirty() {
|
|
102
|
+
const currentData = this.getData();
|
|
103
|
+
const originProperties = Object.keys(this.firstValue);
|
|
104
|
+
const currentProperties = Object.keys(currentData);
|
|
105
|
+
if (originProperties.length !== currentProperties.length) {
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
for (let prop of originProperties) {
|
|
109
|
+
if (this.firstValue[prop] != currentData[prop]) {
|
|
110
|
+
return true; // Si alguna propiedad no coincide, retorna false
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* # DileFormChangeDetect
|
|
4
|
+
*
|
|
5
|
+
* Mixin to detect changes in form components
|
|
6
|
+
*
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export const DileFormChangeDetect = (superclass) => class extends superclass {
|
|
10
|
+
|
|
11
|
+
constructor() {
|
|
12
|
+
super();
|
|
13
|
+
this.changeHandler = this.detectChange.bind(this);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
connectedCallback() {
|
|
17
|
+
super.connectedCallback();
|
|
18
|
+
this.addEventListener('element-changed', this.changeHandler);
|
|
19
|
+
}
|
|
20
|
+
disconnectedCallback() {
|
|
21
|
+
super.disconnectedCallback();
|
|
22
|
+
this.removeEventListener('element-changed', this.changeHandler);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
detectChange(e) {
|
|
26
|
+
this.dispatchEvent(new CustomEvent('dile-form-changed', {
|
|
27
|
+
bubbles: true,
|
|
28
|
+
composed: true,
|
|
29
|
+
detail: {
|
|
30
|
+
data: this.getData()
|
|
31
|
+
}
|
|
32
|
+
}));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { DileOverlay } from "./src/DileOverlay.js";
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
export const DileOverlay = function(superClass) {
|
|
2
|
+
return class extends superClass {
|
|
3
|
+
|
|
4
|
+
static get properties() {
|
|
5
|
+
return {
|
|
6
|
+
_opening: {
|
|
7
|
+
type: Boolean,
|
|
8
|
+
},
|
|
9
|
+
moveTop: {
|
|
10
|
+
type: Number,
|
|
11
|
+
},
|
|
12
|
+
moveLeft: {
|
|
13
|
+
type: Number,
|
|
14
|
+
},
|
|
15
|
+
/**
|
|
16
|
+
* The css class to show or hide the overlay
|
|
17
|
+
* @type {String}
|
|
18
|
+
*/
|
|
19
|
+
_overlayClass: {
|
|
20
|
+
state: true,
|
|
21
|
+
type: String,
|
|
22
|
+
},
|
|
23
|
+
/**
|
|
24
|
+
* The position of the overlay: left, right or center.
|
|
25
|
+
* @type {String}
|
|
26
|
+
*/
|
|
27
|
+
horizontalAlign: {
|
|
28
|
+
type: String,
|
|
29
|
+
},
|
|
30
|
+
/**
|
|
31
|
+
* The position of the overlay: bottom, top or center.
|
|
32
|
+
* @type {String}
|
|
33
|
+
*/
|
|
34
|
+
verticalAlign: {
|
|
35
|
+
type: String,
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
constructor() {
|
|
41
|
+
super();
|
|
42
|
+
this._opening = false;
|
|
43
|
+
this.moveTop = 0;
|
|
44
|
+
this.moveLeft = 0;
|
|
45
|
+
this._overlayClass = '';
|
|
46
|
+
this.horizontalAlign = 'under_left';
|
|
47
|
+
this.verticalAlign = 'bottom';
|
|
48
|
+
this.delayId = null;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
firstUpdated() {
|
|
52
|
+
this.overlay = this.shadowRoot.getElementById('overlay');
|
|
53
|
+
this.trigger = this.shadowRoot.getElementById('trigger');
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* toggles the overlay
|
|
58
|
+
*/
|
|
59
|
+
toggle(e) {
|
|
60
|
+
//e.stopPropagation();
|
|
61
|
+
if(this._overlayClass) {
|
|
62
|
+
this.close()
|
|
63
|
+
} else {
|
|
64
|
+
this.open();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
cancelDelay() {
|
|
68
|
+
if(this.reardo) {
|
|
69
|
+
clearTimeout(this.delayId);
|
|
70
|
+
}
|
|
71
|
+
this.delayId = null;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* closes the overlay
|
|
75
|
+
*/
|
|
76
|
+
close() {
|
|
77
|
+
this.dispatchEvent(new CustomEvent('overlay-closed', {
|
|
78
|
+
bubbles: true,
|
|
79
|
+
composed: true,
|
|
80
|
+
}));
|
|
81
|
+
if(!this._opening && this._overlayClass=='opened') {
|
|
82
|
+
this._overlayClass = '';
|
|
83
|
+
this.cancelDelay();
|
|
84
|
+
this.delayId = setTimeout(() => {
|
|
85
|
+
this.overlay.style.display = 'none'
|
|
86
|
+
}, 500);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* opens the overlay
|
|
91
|
+
*/
|
|
92
|
+
open() {
|
|
93
|
+
this.dispatchEvent(new CustomEvent('overlay-opened', {
|
|
94
|
+
bubbles: true,
|
|
95
|
+
composed: true,
|
|
96
|
+
}));
|
|
97
|
+
if(!this._opening) {
|
|
98
|
+
this._opening = true;
|
|
99
|
+
this.updatePosition();
|
|
100
|
+
if(this.closeAll) {
|
|
101
|
+
this.closeAll();
|
|
102
|
+
};
|
|
103
|
+
this.overlay.style.display = 'block';
|
|
104
|
+
this.cancelDelay();
|
|
105
|
+
this.delayId = setTimeout(() => {
|
|
106
|
+
this._overlayClass = 'opened'
|
|
107
|
+
this._opening = false;
|
|
108
|
+
this.overlay.style.display = 'block';
|
|
109
|
+
}, 50);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
updatePosition() {
|
|
114
|
+
let triggerWidth = parseInt(this.trigger.offsetWidth);
|
|
115
|
+
let triggerHeight = parseInt(this.trigger.offsetHeight);
|
|
116
|
+
let moveTop = parseInt(this.moveTop);
|
|
117
|
+
let moveLeft = parseInt(this.moveLeft);
|
|
118
|
+
|
|
119
|
+
let lastDisplay = this.overlay.style.display;
|
|
120
|
+
this.overlay.style.top = "-1000px";
|
|
121
|
+
this.overlay.style.display = 'block';
|
|
122
|
+
|
|
123
|
+
let overlayWidth = parseInt(this.overlay.offsetWidth);
|
|
124
|
+
let overlayHeight = parseInt(this.overlay.offsetHeight);
|
|
125
|
+
|
|
126
|
+
switch(this.verticalAlign) {
|
|
127
|
+
case 'top':
|
|
128
|
+
this.overlay.style.top = (0 - overlayHeight + moveTop) + 'px';
|
|
129
|
+
break;
|
|
130
|
+
case 'center':
|
|
131
|
+
this.overlay.style.top = '-' + (((overlayHeight - (triggerHeight / 2)) / 2) + moveTop) + 'px';
|
|
132
|
+
break;
|
|
133
|
+
default:
|
|
134
|
+
this.overlay.style.top = (triggerHeight + 10 + moveTop) + 'px';
|
|
135
|
+
}
|
|
136
|
+
switch(this.horizontalAlign) {
|
|
137
|
+
case 'under_left':
|
|
138
|
+
this.setOverlayStyleLeft('0px');
|
|
139
|
+
break;
|
|
140
|
+
case 'under_right':
|
|
141
|
+
this.setOverlayStyleLeft(`-${overlayWidth - triggerWidth}px`);
|
|
142
|
+
break;
|
|
143
|
+
case 'left':
|
|
144
|
+
this.setOverlayStyleLeft('-' + (overlayWidth + moveLeft) + 'px');
|
|
145
|
+
break;
|
|
146
|
+
case 'right':
|
|
147
|
+
this.setOverlayStyleLeft((triggerWidth + moveLeft) + 'px');
|
|
148
|
+
break;
|
|
149
|
+
default:
|
|
150
|
+
this.setOverlayStyleLeft('-' + (((overlayWidth - triggerWidth) / 2) + moveLeft) + 'px');
|
|
151
|
+
}
|
|
152
|
+
this.overlay.style.display = lastDisplay;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
setOverlayStyleLeft(pos) {
|
|
156
|
+
this.overlay.style.left = pos;
|
|
157
|
+
var rect = this.overlay.getBoundingClientRect();
|
|
158
|
+
let posLeft = parseInt(this.overlay.style.left);
|
|
159
|
+
if (rect.left < 0) {
|
|
160
|
+
this.overlay.style.left = (posLeft - rect.left + 10) + 'px';
|
|
161
|
+
}
|
|
162
|
+
let pageWidth = document.querySelector('html').clientWidth;
|
|
163
|
+
if (rect.left + rect.width > pageWidth) {
|
|
164
|
+
let displacement = posLeft - (rect.right - pageWidth) - 15;
|
|
165
|
+
this.overlay.style.left = (displacement ) + 'px';
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
}
|
|
171
|
+
|