uniform-ui 2.2.2 → 2.3.2
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.
- checksums.yaml +4 -4
- data/lib/assets/javascripts/uniform/checkbox.js +2 -2
- data/lib/assets/javascripts/uniform/component.js +65 -9
- data/lib/assets/javascripts/uniform/dom-helpers.js +32 -10
- data/lib/assets/javascripts/uniform/dropdown.js +106 -38
- data/lib/assets/javascripts/uniform/floating-label.js +3 -3
- data/lib/assets/javascripts/uniform/modal.js +21 -14
- data/lib/assets/javascripts/uniform/popover.js +186 -0
- data/lib/assets/javascripts/uniform/resizer.js +1 -1
- data/lib/assets/javascripts/uniform/select.js +51 -24
- data/lib/assets/javascripts/uniform/tooltip.js +18 -71
- data/lib/assets/javascripts/uniform.es5.js +1 -1
- data/lib/assets/javascripts/uniform.jquery.js +28 -0
- data/lib/assets/javascripts/uniform.js +3 -1
- data/lib/assets/stylesheets/uniform/components/alert.scss +2 -2
- data/lib/assets/stylesheets/uniform/components/buttons.scss +31 -15
- data/lib/assets/stylesheets/uniform/components/card.scss +3 -3
- data/lib/assets/stylesheets/uniform/components/dropdown.scss +23 -22
- data/lib/assets/stylesheets/uniform/components/form/checkbox-collection.scss +4 -4
- data/lib/assets/stylesheets/uniform/components/form/checkbox.scss +1 -1
- data/lib/assets/stylesheets/uniform/components/form/floating-label.scss +2 -1
- data/lib/assets/stylesheets/uniform/components/form/input-group.scss +2 -2
- data/lib/assets/stylesheets/uniform/components/form/tristate.scss +88 -0
- data/lib/assets/stylesheets/uniform/components/form.scss +12 -6
- data/lib/assets/stylesheets/uniform/components/grid.scss +21 -0
- data/lib/assets/stylesheets/uniform/components/label.scss +9 -7
- data/lib/assets/stylesheets/uniform/components/loaders.scss +39 -39
- data/lib/assets/stylesheets/uniform/components/nav.scss +8 -4
- data/lib/assets/stylesheets/uniform/components/row.scss +18 -10
- data/lib/assets/stylesheets/uniform/components/select.scss +42 -5
- data/lib/assets/stylesheets/uniform/components/table.scss +43 -9
- data/lib/assets/stylesheets/uniform/components/thumb.scss +1 -1
- data/lib/assets/stylesheets/uniform/components/tooltip.scss +8 -30
- data/lib/assets/stylesheets/uniform/defaults.scss +1 -6
- data/lib/assets/stylesheets/uniform/functions.scss +34 -4
- data/lib/assets/stylesheets/uniform/helpers/border.scss +10 -1
- data/lib/assets/stylesheets/uniform/helpers/colors.scss +3 -2
- data/lib/assets/stylesheets/uniform/helpers/position.scss +6 -0
- data/lib/assets/stylesheets/uniform/helpers/text.scss +11 -0
- data/lib/assets/stylesheets/uniform/helpers.scss +9 -3
- data/lib/assets/stylesheets/uniform/variables.scss +8 -6
- data/lib/uniform/version.rb +1 -1
- data/lib/uniform.rb +11 -3
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 67b851ccfc8a78fe881b699982278e0ca0822e5548bc9a13b24d0058439a45e5
|
4
|
+
data.tar.gz: 3775d8521849dd5e05f2198de179c33dc7cb8daa42904420f8997dedbf0c351e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8915a6b1cc20b2d31a99c0d6b2a0f6896d2a412484a00cd8007968e761d09acfda4ed86ef5b8f906e2e5fb1d9c0a7eda416bac2358557956db437520a0033f83
|
7
|
+
data.tar.gz: 6caf4d24608b7bca30c93d2838f8a32a12ad91afe039748155fc0e110e960c92c066c01a2bfe026b329d675a4120b2f49a05b8ced017b86cdfc9a0ab044777f0
|
@@ -3,7 +3,7 @@ import * as Helpers from './dom-helpers';
|
|
3
3
|
|
4
4
|
export default class Checkbox extends Component {
|
5
5
|
initialize (options) {
|
6
|
-
this.el
|
6
|
+
this.listenTo(this.el, 'change', this.change);
|
7
7
|
}
|
8
8
|
|
9
9
|
render () {
|
@@ -15,7 +15,7 @@ export default class Checkbox extends Component {
|
|
15
15
|
Helpers.addClass(this.checkbox, this.el.className.replace(type, ''));
|
16
16
|
Helpers.toggleClass(this.checkbox, 'checked', this.el.checked);
|
17
17
|
this.el.parentNode.insertBefore(this.checkbox, this.el.nextSibling);
|
18
|
-
this.checkbox
|
18
|
+
this.listenTo(this.checkbox, 'click', this.click);
|
19
19
|
return this;
|
20
20
|
}
|
21
21
|
|
@@ -1,10 +1,12 @@
|
|
1
|
+
import {uniqueId, hasClass} from './dom-helpers';
|
2
|
+
|
1
3
|
export default class Component {
|
2
4
|
constructor(options){
|
3
5
|
options = options || {};
|
6
|
+
this.eventListens = new Array();
|
4
7
|
this.eventListeners = new Array();
|
5
|
-
this.el = options.el || document.createElement('div')
|
6
|
-
|
7
|
-
this.$el = $(this.el);//remove
|
8
|
+
this.el = options.el || document.createElement('div');
|
9
|
+
this.cid = uniqueId('c');
|
8
10
|
|
9
11
|
this.on = function (type, handler) {
|
10
12
|
this.eventListeners.push({
|
@@ -12,13 +14,21 @@ export default class Component {
|
|
12
14
|
handler: handler
|
13
15
|
});
|
14
16
|
};
|
17
|
+
|
18
|
+
this.off = function (type, handler) {
|
19
|
+
if(!this.eventListeners) return;
|
20
|
+
this.eventListeners = this.eventListeners.filter(function(listener){
|
21
|
+
return !(listener.type == type && listener.handler)
|
22
|
+
});
|
23
|
+
}.bind(this);
|
15
24
|
|
16
25
|
this.trigger = function (event_key) {
|
17
|
-
|
18
|
-
|
19
|
-
|
26
|
+
if(!this.eventListeners) return;
|
27
|
+
this.eventListeners.forEach(function(listener){
|
28
|
+
if(listener.type == "*" || listener.type == "all" || event_key == listener.type){
|
29
|
+
listener.handler(event_key, this);
|
20
30
|
}
|
21
|
-
}
|
31
|
+
})
|
22
32
|
};
|
23
33
|
|
24
34
|
this.initialize(options);
|
@@ -33,9 +43,55 @@ export default class Component {
|
|
33
43
|
return newObject;
|
34
44
|
}
|
35
45
|
|
36
|
-
|
46
|
+
/*
|
47
|
+
listenTo(el, 'click', '.inner_class', f(), this)
|
48
|
+
listenTo(el, 'click', f(), this)
|
49
|
+
*/
|
50
|
+
listenTo(node, event, scope, callback, context){
|
51
|
+
// scope is optional param
|
52
|
+
if(typeof scope != "string") {
|
53
|
+
context = callback
|
54
|
+
callback = scope
|
55
|
+
scope = false;
|
56
|
+
}
|
57
|
+
context || (context = this);
|
58
|
+
var listen = [
|
59
|
+
node,
|
60
|
+
event,
|
61
|
+
function(e){
|
62
|
+
if(scope && !hasClass(e.target, scope.replace('.', ''))) return;
|
63
|
+
return callback.bind(context)(...arguments);
|
64
|
+
}.bind(context)
|
65
|
+
]
|
66
|
+
this.eventListens.push(listen);
|
67
|
+
node.addEventListener(event, listen[2]);
|
68
|
+
}
|
69
|
+
|
70
|
+
listenToOnce(node, event, callback, context){
|
71
|
+
context || (context = this);
|
72
|
+
var onceCallback = function(e){
|
73
|
+
node.removeEventListener(event, onceCallback);
|
74
|
+
return callback.apply(context, arguments);
|
75
|
+
}
|
76
|
+
var listen = [
|
77
|
+
node,
|
78
|
+
event,
|
79
|
+
onceCallback
|
80
|
+
]
|
81
|
+
this.eventListens.push(listen);
|
82
|
+
node.addEventListener(event, onceCallback);
|
83
|
+
}
|
84
|
+
|
85
|
+
remove () {
|
86
|
+
this.trigger('removed');
|
37
87
|
|
38
|
-
|
88
|
+
if(this.eventListens) this.eventListens.forEach(function(listen){
|
89
|
+
listen[0].removeEventListener(listen[1], listen[2]);
|
90
|
+
});
|
91
|
+
delete this.eventListens;
|
92
|
+
delete this.eventListeners;
|
93
|
+
if(this.el && this.el.parentNode) this.el.parentNode.removeChild(this.el);
|
94
|
+
delete this.el;
|
39
95
|
}
|
40
96
|
|
41
97
|
initialize(){}
|
@@ -19,7 +19,7 @@ export function addClass(el, className) {
|
|
19
19
|
export function removeClass(el, className) {
|
20
20
|
var removeClassFunction = function (el) {
|
21
21
|
if (el.classList)
|
22
|
-
|
22
|
+
className.split(" ").forEach((x) => el.classList.remove(x));
|
23
23
|
else
|
24
24
|
el.className = el.className.replace(new RegExp('(^|\\b)' + className.split(' ').join('|') + '(\\b|$)', 'gi'), ' ');
|
25
25
|
}
|
@@ -92,7 +92,7 @@ export function createElement(html) {
|
|
92
92
|
}
|
93
93
|
|
94
94
|
export function closest(el, selector) {
|
95
|
-
if(el.closest) return el.closest(
|
95
|
+
if(el.closest) return el.closest(selector);
|
96
96
|
while (el) {
|
97
97
|
if (Element.prototype.matches ? el.matches(selector) : el.msMatchesSelector(selector)) {
|
98
98
|
return el;
|
@@ -119,18 +119,40 @@ export function filter(nodes, predicate){
|
|
119
119
|
return filteredNodes;
|
120
120
|
}
|
121
121
|
|
122
|
-
export function once(el, type, callback) {
|
123
|
-
el.addEventListener(type, function fn (e){
|
124
|
-
console.log('fn', type, fn);
|
125
|
-
e.target.removeEventListener(e.type, fn);
|
126
|
-
return callback(e);
|
127
|
-
});
|
128
|
-
}
|
129
|
-
|
130
122
|
export function offset(el){
|
131
123
|
var rect = el.getBoundingClientRect();
|
132
124
|
return {
|
133
125
|
top: rect.top + window.scrollY,
|
134
126
|
left: rect.left + window.scrollX
|
135
127
|
}
|
128
|
+
}
|
129
|
+
|
130
|
+
export function offsetToViewport(el){
|
131
|
+
var rect = el.getBoundingClientRect();
|
132
|
+
return {
|
133
|
+
top: rect.top,
|
134
|
+
left: rect.left
|
135
|
+
}
|
136
|
+
}
|
137
|
+
|
138
|
+
export function outerHeight(el){
|
139
|
+
var height = el.offsetHeight;
|
140
|
+
var style = getComputedStyle(el);
|
141
|
+
|
142
|
+
height += parseInt(style.marginTop) + parseInt(style.marginBottom);
|
143
|
+
return height;
|
144
|
+
}
|
145
|
+
|
146
|
+
export function outerWidth(el){
|
147
|
+
var width = el.offsetWidth;
|
148
|
+
var style = getComputedStyle(el);
|
149
|
+
|
150
|
+
width += parseInt(style.marginLeft) + parseInt(style.marginRight);
|
151
|
+
return width;
|
152
|
+
}
|
153
|
+
|
154
|
+
export function uniqueId(prefix){
|
155
|
+
window.idCounter || (window.idCounter = 0);
|
156
|
+
var id = ++window.idCounter + '';
|
157
|
+
return prefix ? prefix + id : id;
|
136
158
|
}
|
@@ -8,50 +8,53 @@ import * as Helpers from './dom-helpers';
|
|
8
8
|
show_arrow: true\false - show dropdown arrow
|
9
9
|
hide_sm: true|false - don't show dropdown on mobile browsers
|
10
10
|
square: true|false - round corners on dropdown
|
11
|
+
container: node - append dropdown to
|
11
12
|
*/
|
12
13
|
export default class Dropdown extends Component {
|
13
14
|
|
14
15
|
initialize(options){
|
15
16
|
options = options || {}
|
16
17
|
this.options = {
|
17
|
-
align: 'center',
|
18
|
+
align: 'center bottom',
|
18
19
|
trigger: 'click',
|
19
20
|
show_arrow: true,
|
20
21
|
hide_sm: false,
|
21
|
-
square: false
|
22
|
+
square: false,
|
23
|
+
container: document.body,
|
24
|
+
offset: {}
|
22
25
|
};
|
26
|
+
this.options.container = this.options.container || document.body;
|
23
27
|
|
24
28
|
Object.assign(this.options, this.pick(options, Object.keys(this.options)));
|
25
29
|
this.content = options.content;
|
30
|
+
this.dropdown = document.createElement('div');
|
26
31
|
this.el.dropdown = this;
|
27
32
|
|
28
|
-
this.
|
33
|
+
this.listenTo(this.el, this.options.trigger, this.toggle);
|
29
34
|
|
30
|
-
this.el
|
35
|
+
this.listenTo(this.el, 'mousedown', function (){
|
31
36
|
this.mousedown = true;
|
32
|
-
}
|
37
|
+
});
|
33
38
|
|
34
|
-
this.el
|
39
|
+
this.listenTo(this.el, 'mouseup', function (){
|
35
40
|
this.mousedown = false;
|
36
|
-
}
|
41
|
+
});
|
37
42
|
|
38
|
-
this.el
|
43
|
+
this.listenTo(this.el, 'focus', function (){
|
39
44
|
if(this.mousedown) return;
|
40
45
|
this.show();
|
41
|
-
}
|
42
|
-
|
43
|
-
document.addEventListener('focus', this.outsideClick.bind(this));
|
44
|
-
document.addEventListener(this.options.trigger, this.outsideClick.bind(this));
|
45
|
-
document.addEventListener('keyup', this.keyup.bind(this));
|
46
|
+
});
|
46
47
|
|
47
|
-
|
48
|
+
this.listenTo(document, 'focus', this.outsideClick);
|
49
|
+
this.listenTo(document, this.options.trigger, this.outsideClick);
|
50
|
+
this.listenTo(document, 'keyup', this.keyup);
|
51
|
+
this.listenTo(window, 'resize', this.resize);
|
48
52
|
}
|
49
53
|
|
50
54
|
render () {
|
51
|
-
this.dropdown = document.createElement('div');
|
52
55
|
Helpers.addClass(this.dropdown, 'uniformDropdown-dropdown');
|
53
56
|
Helpers.addClass(this.dropdown, 'absolute');
|
54
|
-
this.dropdown.style.minWidth =
|
57
|
+
this.dropdown.style.minWidth = Helpers.outerWidth(this.el);
|
55
58
|
this.dropdown.innerHTML = this.content.innerHTML ? this.content.innerHTML : this.content;
|
56
59
|
if (this.options.show_arrow) {
|
57
60
|
Helpers.addClass(this.dropdown, 'has-pointer');
|
@@ -61,34 +64,96 @@ export default class Dropdown extends Component {
|
|
61
64
|
}
|
62
65
|
Helpers.toggleClass(this.dropdown, 'square', this.options.square);
|
63
66
|
this.dropdown.style.display = 'none';
|
64
|
-
|
67
|
+
this.options.container.appendChild(this.dropdown);
|
65
68
|
Helpers.removeClass(this.dropdown.querySelectorAll('.hidden'), 'hidden');
|
66
69
|
return this;
|
67
70
|
}
|
68
71
|
|
69
72
|
resize () {
|
70
|
-
|
73
|
+
this.setPosition();
|
74
|
+
|
75
|
+
var align = this.options.align.split(" ");
|
76
|
+
var reposition = false;
|
77
|
+
if (Helpers.offset(this.dropdown).top + Helpers.outerHeight(this.dropdown) > Math.max(document.body.offsetHeight, window.innerHeight)) {
|
78
|
+
align[1] = "top";
|
79
|
+
reposition = true;
|
80
|
+
}
|
81
|
+
if (Helpers.offset(this.dropdown).top < 0) {
|
82
|
+
align[1] = "bottom";
|
83
|
+
reposition = true;
|
84
|
+
}
|
85
|
+
if (Helpers.offset(this.dropdown).left < 0) {
|
86
|
+
align[0] = "right";
|
87
|
+
reposition = true;
|
88
|
+
}
|
89
|
+
if (Helpers.offset(this.dropdown).left + Helpers.outerWidth(this.dropdown) > document.body.offsetWidth) {
|
90
|
+
align[0] = "left";
|
91
|
+
reposition = true;
|
92
|
+
}
|
93
|
+
if(reposition) this.setPosition(align.join(" "))
|
94
|
+
}
|
95
|
+
|
96
|
+
|
97
|
+
setPosition(align){
|
98
|
+
align = align || this.options.align;
|
99
|
+
var [leftAlign, topAlign] = align.split(" ");
|
100
|
+
leftAlign = leftAlign || "bottom";
|
101
|
+
topAlign = topAlign || "bottom";
|
102
|
+
|
71
103
|
var offset = Helpers.offset(this.el);
|
72
|
-
|
104
|
+
var container = this.options.container;
|
105
|
+
if(getComputedStyle(container)['position'] == "static") container = container.offsetParent;
|
106
|
+
if(!container) container = document.body;
|
107
|
+
|
108
|
+
var containerOffset = Helpers.offset(container);
|
109
|
+
offset = {
|
110
|
+
top: offset.top - containerOffset.top,
|
111
|
+
left: offset.left - containerOffset.left
|
112
|
+
}
|
73
113
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
114
|
+
var position = {};
|
115
|
+
if(leftAlign == 'left'){
|
116
|
+
position.right = Helpers.outerWidth(container) - offset.left;
|
117
|
+
} else if(leftAlign == 'center'){
|
118
|
+
position.left = offset.left + Helpers.outerWidth(this.el) / 2 - Helpers.outerWidth(this.dropdown) / 2;
|
119
|
+
} else if (leftAlign == 'right'){
|
120
|
+
position.left = offset.left + Helpers.outerWidth(this.el);
|
121
|
+
} else if (leftAlign.includes("%")){
|
122
|
+
position.left = offset.left + Helpers.outerWidth(this.el) * parseInt(leftAlign) / 100;
|
123
|
+
} else if (leftAlign.includes("px")){
|
124
|
+
position.left = offset.left + Helpers.outerWidth(this.el) + parseInt(leftAlign);
|
80
125
|
}
|
81
|
-
|
82
|
-
|
126
|
+
|
127
|
+
if(topAlign == 'top'){
|
128
|
+
position.top = offset.top - Helpers.outerHeight(this.dropdown);
|
129
|
+
} else if(topAlign == 'center'){
|
130
|
+
position.top = offset.top + Helpers.outerHeight(this.el) / 2 - Helpers.outerHeight(this.dropdown) / 2;
|
131
|
+
} else if (topAlign == 'bottom'){
|
132
|
+
position.top = offset.top + Helpers.outerHeight(this.el);
|
133
|
+
} else if (topAlign.includes("%")){
|
134
|
+
position.top = offset.top + Helpers.outerHeight(this.el) * parseInt(topAlign) / 100;
|
135
|
+
} else if (topAlign.includes("px")){
|
136
|
+
position.top = offset.top + Helpers.outerHeight(this.el) + parseInt(topAlign);
|
83
137
|
}
|
138
|
+
|
139
|
+
if(this.options.offset.left) position.left += parseInt(this.options.offset.left);
|
140
|
+
if(this.options.offset.top) position.top += parseInt(this.options.offset.top);
|
141
|
+
if(this.options.offset.left) position.right -= parseInt(this.options.offset.left);
|
142
|
+
|
143
|
+
this.dropdown.style.left = 'auto';
|
144
|
+
this.dropdown.style.right = 'auto';
|
145
|
+
Helpers.removeClass(this.dropdown, 'popover-left popover-right popover-center popover-top popover-bottom');
|
146
|
+
Helpers.addClass(this.dropdown, 'popover-' + topAlign);
|
147
|
+
Helpers.addClass(this.dropdown, 'popover-' + leftAlign);
|
148
|
+
Object.keys(position).forEach(function(key){
|
149
|
+
this.dropdown.style[key] = position[key] + "px";
|
150
|
+
}, this);
|
84
151
|
}
|
85
152
|
|
86
153
|
remove () {
|
87
|
-
|
88
|
-
this.
|
89
|
-
|
90
|
-
document.removeEventListener(this.options.trigger, this.outsideClick.bind(this));
|
91
|
-
document.removeEventListener('keyup', this.keyup.bind(this));
|
154
|
+
Component.prototype.remove.apply(this, arguments);
|
155
|
+
if(this.dropdown.parentNode) this.dropdown.parentNode.removeChild(this.dropdown);
|
156
|
+
delete this.dropdown;
|
92
157
|
}
|
93
158
|
|
94
159
|
toggle (e) {
|
@@ -99,7 +164,8 @@ export default class Dropdown extends Component {
|
|
99
164
|
}
|
100
165
|
}
|
101
166
|
|
102
|
-
show () {
|
167
|
+
show (options) {
|
168
|
+
options || (options = {});
|
103
169
|
if(this.options.hide_sm && window.innerWidth < 720) return;
|
104
170
|
if(!this.dropdown) this.render();
|
105
171
|
|
@@ -117,20 +183,22 @@ export default class Dropdown extends Component {
|
|
117
183
|
Helpers.addClass(document.body, 'uniformModal-hideBody');
|
118
184
|
}
|
119
185
|
|
120
|
-
this.overlay
|
121
|
-
this.trigger('shown');
|
186
|
+
this.listenTo(this.overlay, 'click', this.hide);
|
187
|
+
if(!options.silent) this.trigger('shown');
|
122
188
|
}
|
123
189
|
|
124
|
-
hide () {
|
190
|
+
hide (options) {
|
191
|
+
options || (options = {});
|
125
192
|
if(!this.dropdown) return;
|
193
|
+
if(!Helpers.hasClass(this.el, 'active')) return;
|
126
194
|
this.dropdown.style.display = 'none';
|
127
195
|
Helpers.removeClass(this.el, 'active');
|
128
|
-
if (this.overlay) this.overlay.parentNode.removeChild(this.overlay)
|
196
|
+
if (this.overlay && this.overlay.parentNode) this.overlay.parentNode.removeChild(this.overlay)
|
129
197
|
if (window.innerWidth < 720) {
|
130
198
|
Helpers.removeClass(document.body, 'uniformModal-hideBody');
|
131
199
|
window.scrollTo(0, this.lastScrollPosition);
|
132
200
|
}
|
133
|
-
this.trigger('hidden');
|
201
|
+
if(!options.silent) this.trigger('hidden');
|
134
202
|
}
|
135
203
|
|
136
204
|
outsideClick (e) {
|
@@ -8,9 +8,9 @@ export default class FloatingLabel extends Component {
|
|
8
8
|
this.input = this.el.querySelector("#" + this.label.getAttribute('for'));
|
9
9
|
this.startingHeight;
|
10
10
|
|
11
|
-
this.input
|
12
|
-
this.input
|
13
|
-
this.input
|
11
|
+
this.listenTo(this.input, 'focus', this.activate);
|
12
|
+
this.listenTo(this.input, 'blur', this.deactivate);
|
13
|
+
this.listenTo(this.input, 'revealed', this.render);
|
14
14
|
}
|
15
15
|
|
16
16
|
render () {
|
@@ -5,6 +5,8 @@ import * as Helpers from './dom-helpers';
|
|
5
5
|
Options
|
6
6
|
content: string|$el|function
|
7
7
|
klass: string - classes to append to modal container
|
8
|
+
|
9
|
+
* use blurrable to keep some elements from being blurred ie. <div blurrable="false">...</div>
|
8
10
|
*/
|
9
11
|
export default class Modal extends Component {
|
10
12
|
|
@@ -14,8 +16,8 @@ export default class Modal extends Component {
|
|
14
16
|
this.content = options.content;
|
15
17
|
|
16
18
|
Helpers.addClass(this.el, 'uniformModal');
|
17
|
-
|
18
|
-
this.el
|
19
|
+
this.listenTo(document, 'keyup', this.keyup);
|
20
|
+
this.listenTo(this.el, 'click', this.checkCloseButton);
|
19
21
|
}
|
20
22
|
|
21
23
|
keyup (e) {
|
@@ -46,10 +48,13 @@ export default class Modal extends Component {
|
|
46
48
|
|
47
49
|
this.el.appendChild(this.overlay);
|
48
50
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
51
|
+
let next_element = document.body.children[0]
|
52
|
+
while(next_element){
|
53
|
+
const element = next_element;
|
54
|
+
next_element = element.nextElementSibling;
|
55
|
+
if(!element.matches('[blurrable="false"]')) {
|
56
|
+
this.blur.appendChild(element)
|
57
|
+
}
|
53
58
|
}
|
54
59
|
|
55
60
|
Helpers.addClass(document.body, 'uniformModal-active');
|
@@ -58,14 +63,18 @@ export default class Modal extends Component {
|
|
58
63
|
|
59
64
|
var container = document.createElement('div');
|
60
65
|
Helpers.addClass(container, 'uniformModal-container');
|
61
|
-
|
66
|
+
if (content instanceof Node) {
|
67
|
+
container.appendChild(content);
|
68
|
+
} else {
|
69
|
+
container.innerHTML = content;
|
70
|
+
}
|
62
71
|
|
63
72
|
var closeButton = document.createElement('div');
|
64
73
|
Helpers.addClass(closeButton, 'uniformModal-close');
|
65
74
|
container.appendChild(closeButton);
|
66
75
|
|
67
76
|
this.el.style.top = window.scrollY;
|
68
|
-
this.overlay
|
77
|
+
this.listenTo(this.overlay, 'click', this.close);
|
69
78
|
this.el.appendChild(container);
|
70
79
|
|
71
80
|
if (this.options.klass) Helpers.addClass(container, this.options.klass);
|
@@ -87,17 +96,15 @@ export default class Modal extends Component {
|
|
87
96
|
for(var i=0; i < elementCount; i++){
|
88
97
|
document.body.appendChild(elements[0]);
|
89
98
|
}
|
90
|
-
this.blur.parentNode.removeChild(this.blur);
|
99
|
+
if(this.blur.parentNode) this.blur.parentNode.removeChild(this.blur);
|
91
100
|
window.scrollTo(0, this.original_scroll);
|
92
101
|
this.trigger('closed');
|
93
102
|
this.remove();
|
94
103
|
}
|
95
104
|
|
96
105
|
remove () {
|
97
|
-
|
98
|
-
this.
|
99
|
-
|
100
|
-
this.overlay.removeEventListener('click', this.close.bind(this));
|
101
|
-
document.removeEventListener('keyup', this.keyup.bind(this));
|
106
|
+
Component.prototype.remove.apply(this, arguments);
|
107
|
+
if(this.overlay && this.overlay.parentNode) this.overlay.parentNode.removeChild(this.overlay);
|
108
|
+
delete this.overlay;
|
102
109
|
}
|
103
110
|
}
|