-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbsTooltip.js
63 lines (56 loc) · 1.88 KB
/
bsTooltip.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/**
* Bootstrap Tooltip for presenting Knockout-Validation errors
*
* Reference: http://getbootstrap.com/javascript/#tooltips
* Based upon https://github.com/tov-Novoseltsev/knockout-validation-bootstrap-tooltip/blob/gh-pages/customBinding.js
*/
;
(function(factory) {
//CommonJS
if (typeof require === "function" && typeof exports === "object" && typeof module === "object") {
factory(require("knockout"), exports);
//AMD
} else if (typeof define === "function" && define.amd) {
define(["knockout", "exports"], factory);
//normal script tag
} else {
factory(ko);
}
}(function(ko) {
"use strict";
ko.bindingHandlers.bsTooltip = {
init: function(element, valueAccessor, allBindings) {
// Definitions
var el = $(element);
var unwrapValueAccessor = ko.unwrap(valueAccessor());
var options = {};
// combine the default options and those provided via the value accessor
ko.utils.extend(options, ko.bindingHandlers.bsTooltip.defaultOptions);
ko.utils.extend(options, unwrapValueAccessor);
// obtain the observable key for the allBindings
var key = ko.utils.arrayFirst(["textInput", "value", "click", "event", "submit", "enable", "disable", "checked", "options", "selectedOptions"], function(item) {
return allBindings()[item];
});
var observable = allBindings()[key];
ko.computed({
read: function() {
if (observable.isModified() && !observable.isValid()) {
el.parents(".form-group").addClass("has-error");
options.title = observable.error;
el.tooltip(options).tooltip("show");
} else {
el.parents(".form-group").removeClass("has-error");
el.tooltip("destroy");
}
},
disposeWhenNodeIsRemoved: element
});
ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
$(element).tooltip("destroy");
});
},
defaultOptions: {
placement: "bottom"
}
};
})); // close module loader