romo 0.13.0 → 0.14.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.
- data/assets/js/romo/base.js +61 -0
- data/assets/js/romo/datepicker.js +9 -0
- data/assets/js/romo/dropdown.js +40 -28
- data/assets/js/romo/modal.js +25 -16
- data/assets/js/romo/select.js +4 -0
- data/assets/js/romo/tooltip.js +28 -18
- data/lib/romo/version.rb +1 -1
- metadata +4 -4
data/assets/js/romo/base.js
CHANGED
@@ -4,6 +4,8 @@
|
|
4
4
|
}
|
5
5
|
|
6
6
|
Romo.prototype.doInit = function() {
|
7
|
+
this.parentChildElems = new RomoParentChildElems();
|
8
|
+
|
7
9
|
$.each(this._eventCallbacks, function(idx, eventCallback) {
|
8
10
|
$('body').on(eventCallback.eventName, eventCallback.callback);
|
9
11
|
});
|
@@ -181,3 +183,62 @@ $(function() {
|
|
181
183
|
Romo.doInit();
|
182
184
|
|
183
185
|
})
|
186
|
+
|
187
|
+
var RomoParentChildElems = function() {
|
188
|
+
this.attrName = 'romo-parent-elem-id';
|
189
|
+
this.elemId = 0;
|
190
|
+
this.elems = {};
|
191
|
+
|
192
|
+
var childRemovedObserver = new MutationObserver($.proxy(function(mutationRecords) {
|
193
|
+
mutationRecords.forEach($.proxy(function(mutationRecord) {
|
194
|
+
if (mutationRecord.type === 'childList' && mutationRecord.removedNodes.length > 0) {
|
195
|
+
$.each($(mutationRecord.removedNodes), $.proxy(function(idx, node) {
|
196
|
+
this.remove($(node));
|
197
|
+
}, this));
|
198
|
+
}
|
199
|
+
}, this));
|
200
|
+
}, this));
|
201
|
+
|
202
|
+
childRemovedObserver.observe($('body')[0], {
|
203
|
+
childList: true,
|
204
|
+
subtree: true
|
205
|
+
});
|
206
|
+
}
|
207
|
+
|
208
|
+
RomoParentChildElems.prototype.add = function(parentElem, childElems) {
|
209
|
+
parentElem.attr('data-'+this.attrName, this._push(childElems, parentElem.data(this.attrName)));
|
210
|
+
}
|
211
|
+
|
212
|
+
RomoParentChildElems.prototype.remove = function(nodeElem) {
|
213
|
+
if(nodeElem.data(this.attrName) !== undefined) {
|
214
|
+
this._removeChildElems(nodeElem); // node is a parent elem itself
|
215
|
+
}
|
216
|
+
$.each(nodeElem.find('[data-'+this.attrName+']'), $.proxy(function(idx, parent) {
|
217
|
+
this._removeChildElems($(parent));
|
218
|
+
}, this));
|
219
|
+
}
|
220
|
+
|
221
|
+
// private
|
222
|
+
|
223
|
+
RomoParentChildElems.prototype._removeChildElems = function(parentElem) {
|
224
|
+
$.each(this._pop(parentElem.data(this.attrName)), function(idx, elem) {
|
225
|
+
$(elem).remove();
|
226
|
+
});
|
227
|
+
};
|
228
|
+
|
229
|
+
RomoParentChildElems.prototype._push = function(items, id) {
|
230
|
+
if (id === undefined) {
|
231
|
+
id = String(this.elemId++);
|
232
|
+
}
|
233
|
+
if (this.elems[id] === undefined) {
|
234
|
+
this.elems[id] = []
|
235
|
+
}
|
236
|
+
items.forEach($.proxy(function(item){ this.elems[id].push(item) }, this));
|
237
|
+
return id;
|
238
|
+
};
|
239
|
+
|
240
|
+
RomoParentChildElems.prototype._pop = function(id) {
|
241
|
+
var items = this.elems[id];
|
242
|
+
delete this.elems[id];
|
243
|
+
return items || [];
|
244
|
+
}
|
@@ -43,6 +43,15 @@ RomoDatepicker.prototype.doBindElem = function() {
|
|
43
43
|
this.elem.before(elemWrapper);
|
44
44
|
elemWrapper.append(this.elem);
|
45
45
|
|
46
|
+
// the elem wrapper should be treated like a child elem. add it to Romo's
|
47
|
+
// parent-child elems so it will be removed when the elem (input) is removed.
|
48
|
+
// delay adding it b/c the `append` statement above is not a "move", it is
|
49
|
+
// a "remove" and "add" so if added immediately the "remove" part will
|
50
|
+
// incorrectly remove the wrapper. Any value will do - I chose 100 arbitrarily.
|
51
|
+
setTimeout($.proxy(function() {
|
52
|
+
Romo.parentChildElems.add(this.elem, [elemWrapper]);
|
53
|
+
}, this), 100);
|
54
|
+
|
46
55
|
this.elem.attr('autocomplete', 'off');
|
47
56
|
|
48
57
|
this.indicatorElem = $();
|
data/assets/js/romo/dropdown.js
CHANGED
@@ -6,31 +6,9 @@ $.fn.romoDropdown = function() {
|
|
6
6
|
|
7
7
|
var RomoDropdown = function(element) {
|
8
8
|
this.elem = $(element);
|
9
|
-
this.
|
10
|
-
this.popupElem.appendTo(this.elem.closest(this.elem.data('romo-dropdown-append-to-closest') || 'body'));
|
11
|
-
this.doSetPopupZIndex(this.elem);
|
12
|
-
this.bodyElem = this.popupElem.find('> .romo-dropdown-body');
|
13
|
-
this.contentElem = $();
|
9
|
+
this.doInitPopup();
|
14
10
|
this.romoInvoke = this.elem.romoInvoke()[0];
|
15
11
|
|
16
|
-
var positionData = this._parsePositionData(this.elem.data('romo-dropdown-position'));
|
17
|
-
this.popupPosition = positionData.position || 'bottom';
|
18
|
-
this.popupAlignment = positionData.alignment || 'left';
|
19
|
-
this.popupElem.attr('data-romo-dropdown-position', this.popupPosition);
|
20
|
-
this.popupElem.attr('data-romo-dropdown-alignment', this.popupAlignment);
|
21
|
-
this.popupElem.attr('data-romo-dropdown-fixed', this.elem.data('romo-dropdown-fixed'));
|
22
|
-
// don't propagate click events on the popup elem. this prevents the popup
|
23
|
-
// from closing when clicked (see body click event bind on popup open)
|
24
|
-
this.popupElem.on('click', function(e) {
|
25
|
-
if (e !== undefined) {
|
26
|
-
e.stopPropagation();
|
27
|
-
}
|
28
|
-
})
|
29
|
-
|
30
|
-
if (this.elem.data('romo-dropdown-style-class') !== undefined) {
|
31
|
-
this.bodyElem.addClass(this.elem.data('romo-dropdown-style-class'));
|
32
|
-
}
|
33
|
-
|
34
12
|
this.elem.unbind('click');
|
35
13
|
this.elem.on('click', $.proxy(this.onToggleClick, this));
|
36
14
|
this.elem.on('dropdown:triggerToggle', $.proxy(this.onToggleClick, this));
|
@@ -58,8 +36,9 @@ RomoDropdown.prototype.doInit = function() {
|
|
58
36
|
// override as needed
|
59
37
|
}
|
60
38
|
|
61
|
-
RomoDropdown.prototype.
|
62
|
-
this.
|
39
|
+
RomoDropdown.prototype.doInitPopup = function() {
|
40
|
+
this.popupElem = $('<div class="romo-dropdown-popup"><div class="romo-dropdown-body"></div></div>');
|
41
|
+
this.popupElem.appendTo(this.elem.closest(this.elem.data('romo-dropdown-append-to-closest') || 'body'));
|
63
42
|
|
64
43
|
this.popupElem.on('modal:popupOpen', $.proxy(function(e) {
|
65
44
|
this.doUnBindWindowBodyClick();
|
@@ -71,11 +50,47 @@ RomoDropdown.prototype.doInitBody = function() {
|
|
71
50
|
this.doBindWindowBodyKeyUp();
|
72
51
|
this.doBindElemKeyUp();
|
73
52
|
}, this));
|
53
|
+
|
54
|
+
this.bodyElem = this.popupElem.find('> .romo-dropdown-body');
|
55
|
+
if (this.elem.data('romo-dropdown-style-class') !== undefined) {
|
56
|
+
this.bodyElem.addClass(this.elem.data('romo-dropdown-style-class'));
|
57
|
+
}
|
58
|
+
|
59
|
+
this.contentElem = $();
|
60
|
+
|
61
|
+
var positionData = this._parsePositionData(this.elem.data('romo-dropdown-position'));
|
62
|
+
this.popupPosition = positionData.position || 'bottom';
|
63
|
+
this.popupAlignment = positionData.alignment || 'left';
|
64
|
+
this.popupElem.attr('data-romo-dropdown-position', this.popupPosition);
|
65
|
+
this.popupElem.attr('data-romo-dropdown-alignment', this.popupAlignment);
|
66
|
+
this.popupElem.attr('data-romo-dropdown-fixed', this.elem.data('romo-dropdown-fixed'));
|
67
|
+
|
68
|
+
this.doSetPopupZIndex(this.elem);
|
69
|
+
|
70
|
+
// don't propagate click events on the popup elem. this prevents the popup
|
71
|
+
// from closing when clicked (see body click event bind on popup open)
|
72
|
+
this.popupElem.on('click', function(e) {
|
73
|
+
if (e !== undefined) {
|
74
|
+
e.stopPropagation();
|
75
|
+
}
|
76
|
+
})
|
77
|
+
|
78
|
+
// the popup should be treated like a child elem. add it to Romo's
|
79
|
+
// parent-child elems so it will be removed when the elem is removed.
|
80
|
+
Romo.parentChildElems.add(this.elem, [this.popupElem]);
|
81
|
+
}
|
82
|
+
|
83
|
+
RomoDropdown.prototype.doInitBody = function() {
|
84
|
+
this.doResetBody();
|
85
|
+
|
74
86
|
this.contentElem = this.bodyElem.find('.romo-dropdown-content').last();
|
75
87
|
if (this.contentElem.size() === 0) {
|
76
88
|
this.contentElem = this.bodyElem;
|
77
89
|
}
|
90
|
+
|
78
91
|
this.closeElem = this.popupElem.find('[data-romo-dropdown-close="true"]');
|
92
|
+
this.closeElem.unbind('click');
|
93
|
+
this.closeElem.on('click', $.proxy(this.onPopupClose, this));
|
79
94
|
|
80
95
|
this.contentElem.css({
|
81
96
|
'min-height': this.elem.data('romo-dropdown-min-height'),
|
@@ -104,9 +119,6 @@ RomoDropdown.prototype.doInitBody = function() {
|
|
104
119
|
'width': this.elem.data('romo-dropdown-width')
|
105
120
|
});
|
106
121
|
}
|
107
|
-
|
108
|
-
this.closeElem.unbind('click');
|
109
|
-
this.closeElem.on('click', $.proxy(this.onPopupClose, this));
|
110
122
|
}
|
111
123
|
|
112
124
|
RomoDropdown.prototype.doResetBody = function() {
|
data/assets/js/romo/modal.js
CHANGED
@@ -6,18 +6,9 @@ $.fn.romoModal = function() {
|
|
6
6
|
|
7
7
|
var RomoModal = function(element) {
|
8
8
|
this.elem = $(element);
|
9
|
-
this.
|
10
|
-
this.popupElem.appendTo(this.elem.closest(this.elem.data('romo-modal-append-to-closest') || 'body'));
|
11
|
-
this.bodyElem = this.popupElem.find('> .romo-modal-body');
|
12
|
-
this.contentElem = $();
|
13
|
-
this.closeElem = $();
|
14
|
-
this.dragElem = $();
|
9
|
+
this.doInitPopup();
|
15
10
|
this.romoInvoke = this.elem.romoInvoke()[0];
|
16
11
|
|
17
|
-
if (this.elem.data('romo-modal-style-class') !== undefined) {
|
18
|
-
this.bodyElem.addClass(this.elem.data('romo-modal-style-class'));
|
19
|
-
}
|
20
|
-
|
21
12
|
this.elem.unbind('click');
|
22
13
|
this.elem.on('click', $.proxy(this.onToggleClick, this));
|
23
14
|
this.elem.on('modal:triggerToggle', $.proxy(this.onToggleClick, this));
|
@@ -45,6 +36,24 @@ RomoModal.prototype.doInit = function() {
|
|
45
36
|
// override as needed
|
46
37
|
}
|
47
38
|
|
39
|
+
RomoModal.prototype.doInitPopup = function() {
|
40
|
+
this.popupElem = $('<div class="romo-modal-popup"><div class="romo-modal-body"></div></div>');
|
41
|
+
this.popupElem.appendTo(this.elem.closest(this.elem.data('romo-modal-append-to-closest') || 'body'));
|
42
|
+
|
43
|
+
this.bodyElem = this.popupElem.find('> .romo-modal-body');
|
44
|
+
if (this.elem.data('romo-modal-style-class') !== undefined) {
|
45
|
+
this.bodyElem.addClass(this.elem.data('romo-modal-style-class'));
|
46
|
+
}
|
47
|
+
|
48
|
+
this.contentElem = $();
|
49
|
+
this.closeElem = $();
|
50
|
+
this.dragElem = $();
|
51
|
+
|
52
|
+
// the popup should be treated like a child elem. add it to Romo's
|
53
|
+
// parent-child elems so it will be removed when the elem is removed.
|
54
|
+
Romo.parentChildElems.add(this.elem, [this.popupElem]);
|
55
|
+
}
|
56
|
+
|
48
57
|
RomoModal.prototype.doInitBody = function() {
|
49
58
|
this.doResetBody();
|
50
59
|
|
@@ -52,8 +61,14 @@ RomoModal.prototype.doInitBody = function() {
|
|
52
61
|
if (this.contentElem.size() === 0) {
|
53
62
|
this.contentElem = this.bodyElem;
|
54
63
|
}
|
64
|
+
|
55
65
|
this.closeElem = this.popupElem.find('[data-romo-modal-close="true"]');
|
66
|
+
this.closeElem.unbind('click');
|
67
|
+
this.closeElem.on('click', $.proxy(this.onPopupClose, this));
|
68
|
+
|
56
69
|
this.dragElem = this.popupElem.find('[data-romo-modal-drag="true"]');
|
70
|
+
this.dragElem.addClass('romo-modal-grab');
|
71
|
+
this.dragElem.on('mousedown', $.proxy(this.onMouseDown, this));
|
57
72
|
|
58
73
|
var css = {
|
59
74
|
'min-width': this.elem.data('romo-modal-min-width'),
|
@@ -73,12 +88,6 @@ RomoModal.prototype.doInitBody = function() {
|
|
73
88
|
}
|
74
89
|
|
75
90
|
this.contentElem.css(css);
|
76
|
-
|
77
|
-
this.closeElem.unbind('click');
|
78
|
-
this.closeElem.on('click', $.proxy(this.onPopupClose, this));
|
79
|
-
|
80
|
-
this.dragElem.addClass('romo-modal-grab');
|
81
|
-
this.dragElem.on('mousedown', $.proxy(this.onMouseDown, this));
|
82
91
|
}
|
83
92
|
|
84
93
|
RomoModal.prototype.doResetBody = function() {
|
data/assets/js/romo/select.js
CHANGED
@@ -130,6 +130,10 @@ RomoSelect.prototype._buildSelectDropdownElem = function() {
|
|
130
130
|
romoSelectDropdownElem.before(this.elemWrapper);
|
131
131
|
this.elemWrapper.append(romoSelectDropdownElem);
|
132
132
|
|
133
|
+
// the elem wrapper should be treated like a child elem. add it to Romo's
|
134
|
+
// parent-child elems so it will be removed when the elem (select) is removed.
|
135
|
+
Romo.parentChildElems.add(this.elem, [this.elemWrapper]);
|
136
|
+
|
133
137
|
var caretClass = this.elem.data('romo-select-caret') || this.defaultCaretClass;
|
134
138
|
if (caretClass !== undefined && caretClass !== 'none') {
|
135
139
|
var caret = $('<i class="romo-select-caret '+caretClass+'"></i>');
|
data/assets/js/romo/tooltip.js
CHANGED
@@ -6,11 +6,7 @@ $.fn.romoTooltip = function() {
|
|
6
6
|
|
7
7
|
var RomoTooltip = function(element) {
|
8
8
|
this.elem = $(element);
|
9
|
-
this.
|
10
|
-
this.popupElem.appendTo(this.elem.closest(this.elem.data('romo-tooltip-append-to-closest') || 'body'));
|
11
|
-
this.doSetPopupZIndex(this.elem);
|
12
|
-
this.arrowElem = this.popupElem.find('> .romo-tooltip-arrow');
|
13
|
-
this.bodyElem = this.popupElem.find('> .romo-tooltip-body');
|
9
|
+
this.doInitPopup();
|
14
10
|
|
15
11
|
this.hoverState = 'out';
|
16
12
|
this.delayEnter = 0;
|
@@ -26,19 +22,6 @@ var RomoTooltip = function(element) {
|
|
26
22
|
this.delayLeave = this.elem.data('romo-tooltip-delay-leave');
|
27
23
|
}
|
28
24
|
|
29
|
-
this.popupPosition = this.elem.data('romo-tooltip-position') || 'top';
|
30
|
-
this.popupElem.attr('data-romo-tooltip-position', this.popupPosition);
|
31
|
-
this.popupAlignment = this.elem.data('romo-tooltip-alignment') || 'center';
|
32
|
-
this.popupElem.attr('data-romo-tooltip-alignment', this.popupAlignment);
|
33
|
-
|
34
|
-
// don't propagate click events on the popup elem. this prevents the popup
|
35
|
-
// from closing when clicked (see body click event bind on popup open)
|
36
|
-
this.popupElem.on('click', function(e) {
|
37
|
-
if (e !== undefined) {
|
38
|
-
e.stopPropagation();
|
39
|
-
}
|
40
|
-
})
|
41
|
-
|
42
25
|
if (this.elem.data('romo-tooltip-style-class') !== undefined) {
|
43
26
|
this.bodyElem.addClass(this.elem.data('romo-tooltip-style-class'));
|
44
27
|
}
|
@@ -63,6 +46,33 @@ RomoTooltip.prototype.doInit = function() {
|
|
63
46
|
// override as needed
|
64
47
|
}
|
65
48
|
|
49
|
+
RomoTooltip.prototype.doInitPopup = function() {
|
50
|
+
this.popupElem = $('<div class="romo-tooltip-popup"><div class="romo-tooltip-arrow"></div><div class="romo-tooltip-body"></div></div>');
|
51
|
+
this.popupElem.appendTo(this.elem.closest(this.elem.data('romo-tooltip-append-to-closest') || 'body'));
|
52
|
+
|
53
|
+
this.bodyElem = this.popupElem.find('> .romo-tooltip-body');
|
54
|
+
|
55
|
+
this.popupPosition = this.elem.data('romo-tooltip-position') || 'top';
|
56
|
+
this.popupElem.attr('data-romo-tooltip-position', this.popupPosition);
|
57
|
+
|
58
|
+
this.popupAlignment = this.elem.data('romo-tooltip-alignment') || 'center';
|
59
|
+
this.popupElem.attr('data-romo-tooltip-alignment', this.popupAlignment);
|
60
|
+
|
61
|
+
this.doSetPopupZIndex(this.elem);
|
62
|
+
|
63
|
+
// don't propagate click events on the popup elem. this prevents the popup
|
64
|
+
// from closing when clicked (see body click event bind on popup open)
|
65
|
+
this.popupElem.on('click', function(e) {
|
66
|
+
if (e !== undefined) {
|
67
|
+
e.stopPropagation();
|
68
|
+
}
|
69
|
+
})
|
70
|
+
|
71
|
+
// the popup should be treated like a child elem. add it to Romo's
|
72
|
+
// parent-child elems so it will be removed when the elem is removed.
|
73
|
+
Romo.parentChildElems.add(this.elem, [this.popupElem]);
|
74
|
+
}
|
75
|
+
|
66
76
|
RomoTooltip.prototype.doInitBody = function() {
|
67
77
|
this.doResetBody();
|
68
78
|
|
data/lib/romo/version.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: romo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 39
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 14
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.14.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Kelly Redding
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2015-
|
19
|
+
date: 2015-11-03 00:00:00 Z
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
22
|
requirement: &id001 !ruby/object:Gem::Requirement
|