guardsjs-rails 1.2.1 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/app/assets/javascripts/guards.js +167 -38
- data/lib/guardsjs-rails/version.rb +1 -1
- metadata +3 -3
@@ -1,5 +1,5 @@
|
|
1
1
|
/*!
|
2
|
-
* Guards JavaScript jQuery Plugin v1.
|
2
|
+
* Guards JavaScript jQuery Plugin v1.3.0
|
3
3
|
* https://github.com/on-site/guards.js
|
4
4
|
*
|
5
5
|
* Copyright 2010-2014, On-Site.com, http://www.on-site.com/
|
@@ -8,7 +8,7 @@
|
|
8
8
|
* Includes code for email and phone number validation from the jQuery
|
9
9
|
* Validation plugin. http://docs.jquery.com/Plugins/Validation
|
10
10
|
*
|
11
|
-
* Date: Wed
|
11
|
+
* Date: Wed Apr 9 15:06:00 2014 -0700
|
12
12
|
*/
|
13
13
|
|
14
14
|
/**
|
@@ -48,7 +48,7 @@
|
|
48
48
|
return $.guards.add(selector);
|
49
49
|
};
|
50
50
|
|
51
|
-
$.guard.version = "1.
|
51
|
+
$.guard.version = "1.3.0";
|
52
52
|
|
53
53
|
$.Guards = function() {
|
54
54
|
var self = this;
|
@@ -255,7 +255,7 @@
|
|
255
255
|
* </div>
|
256
256
|
* </div>
|
257
257
|
*/
|
258
|
-
this.name("dateUS").using(this.aggregate(this.isAllValid, this.isValidDateUS)).message("Please use: dd/mm/yyyy.")
|
258
|
+
this.name("dateUS").using(this.aggregate(this.isAllValid, this.isValidDateUS)).message("Please use: dd/mm/yyyy.");
|
259
259
|
|
260
260
|
/**
|
261
261
|
* @page Named Guards
|
@@ -280,7 +280,7 @@
|
|
280
280
|
* </div>
|
281
281
|
* </div>
|
282
282
|
*/
|
283
|
-
this.name("timeUS").using(this.aggregate(this.isAllValid, this.isValidTimeUS)).message("Please use: hh:mm am/pm.")
|
283
|
+
this.name("timeUS").using(this.aggregate(this.isAllValid, this.isValidTimeUS)).message("Please use: hh:mm am/pm.");
|
284
284
|
|
285
285
|
/**
|
286
286
|
* @page Named Guards
|
@@ -674,7 +674,7 @@
|
|
674
674
|
* This version of guards.js library as a string, like <code>"1.0.0"</code>.
|
675
675
|
* </p>
|
676
676
|
*/
|
677
|
-
$.Guards.prototype.version = "1.
|
677
|
+
$.Guards.prototype.version = "1.3.0";
|
678
678
|
|
679
679
|
$.Guards.prototype.parentContext = function(element) {
|
680
680
|
var $element = $(element);
|
@@ -719,7 +719,7 @@
|
|
719
719
|
* </div>
|
720
720
|
*/
|
721
721
|
$.Guards.prototype.name = function(name) {
|
722
|
-
var guard = new $.Guard(
|
722
|
+
var guard = new $.Guard({ guards: this, named: true, name: name });
|
723
723
|
this.named[name] = guard;
|
724
724
|
return guard;
|
725
725
|
};
|
@@ -784,6 +784,11 @@
|
|
784
784
|
};
|
785
785
|
};
|
786
786
|
|
787
|
+
// Check if the name is valid as a data attribute based guard name
|
788
|
+
$.Guards.prototype.isValidDataName = function(name) {
|
789
|
+
return name && /^[a-zA-Z0-9_-]+$/.test(name);
|
790
|
+
};
|
791
|
+
|
787
792
|
// Alias for console.log, but check that such a thing exists.
|
788
793
|
$.Guards.prototype.log = function(message) {
|
789
794
|
if (console && console.log) {
|
@@ -798,10 +803,8 @@
|
|
798
803
|
$(document).on(event, selector, callback);
|
799
804
|
} else if ($.fn.delegate) {
|
800
805
|
$(document).delegate(selector, event, callback);
|
801
|
-
} else if ($.fn.live) {
|
802
|
-
$(selector).live(event, callback);
|
803
806
|
} else {
|
804
|
-
this.log("Could not bind
|
807
|
+
this.log("Could not bind event handlers, probably because jQuery is too old.");
|
805
808
|
}
|
806
809
|
};
|
807
810
|
|
@@ -812,10 +815,8 @@
|
|
812
815
|
$(document).off(event, selector, callback);
|
813
816
|
} else if ($.fn.undelegate) {
|
814
817
|
$(document).undelegate(selector, event, callback);
|
815
|
-
} else if ($.fn.die) {
|
816
|
-
$(selector).die(event, callback);
|
817
818
|
} else {
|
818
|
-
this.log("Could not unbind
|
819
|
+
this.log("Could not unbind event handlers, probably because jQuery is too old.");
|
819
820
|
}
|
820
821
|
};
|
821
822
|
|
@@ -841,6 +842,14 @@
|
|
841
842
|
this.off(selector, "change blur", this.defaults.liveCallback);
|
842
843
|
};
|
843
844
|
|
845
|
+
$.Guards.prototype.camelize = function(word) {
|
846
|
+
// This code is from jQuery, but it is not a public function
|
847
|
+
// so let's juse reuse it.
|
848
|
+
return word.replace(/-([\da-z])/gi, function(all, letter) {
|
849
|
+
return letter.toUpperCase();
|
850
|
+
});
|
851
|
+
};
|
852
|
+
|
844
853
|
/**
|
845
854
|
* Format all arguments into the first argument. This is a
|
846
855
|
* convenience function similar to the C sprintf function, though
|
@@ -1231,7 +1240,7 @@
|
|
1231
1240
|
/**
|
1232
1241
|
* Validates for a valid US date.
|
1233
1242
|
*/
|
1234
|
-
$.Guards.prototype.isValidDateUS = function(value
|
1243
|
+
$.Guards.prototype.isValidDateUS = function(value) {
|
1235
1244
|
value = $.trim(value);
|
1236
1245
|
|
1237
1246
|
if (value === "") {
|
@@ -1244,7 +1253,7 @@
|
|
1244
1253
|
/**
|
1245
1254
|
* Validates for a valid US time.
|
1246
1255
|
*/
|
1247
|
-
$.Guards.prototype.isValidTimeUS = function(value
|
1256
|
+
$.Guards.prototype.isValidTimeUS = function(value) {
|
1248
1257
|
value = $.trim(value);
|
1249
1258
|
|
1250
1259
|
if (value === "") {
|
@@ -1345,7 +1354,7 @@
|
|
1345
1354
|
* .message("Don't use the keyword 'invalid'.");
|
1346
1355
|
*/
|
1347
1356
|
$.Guards.prototype.add = function(selector) {
|
1348
|
-
var guard = new $.Guard(selector, this);
|
1357
|
+
var guard = new $.Guard({ selector: selector, guards: this });
|
1349
1358
|
this._guards.push(guard);
|
1350
1359
|
return guard;
|
1351
1360
|
};
|
@@ -1381,6 +1390,14 @@
|
|
1381
1390
|
}
|
1382
1391
|
});
|
1383
1392
|
|
1393
|
+
$.each(this.named, function(name, guard) {
|
1394
|
+
var fields = callback(guard);
|
1395
|
+
|
1396
|
+
if (fields !== false && !self.test(guard, fields)) {
|
1397
|
+
result = false;
|
1398
|
+
}
|
1399
|
+
});
|
1400
|
+
|
1384
1401
|
return result;
|
1385
1402
|
};
|
1386
1403
|
|
@@ -1404,13 +1421,18 @@
|
|
1404
1421
|
return result;
|
1405
1422
|
};
|
1406
1423
|
|
1407
|
-
$.Guard = function(
|
1408
|
-
this.
|
1409
|
-
this.
|
1410
|
-
this.
|
1424
|
+
$.Guard = function(options) {
|
1425
|
+
this.name = options.name;
|
1426
|
+
this._named = options.named;
|
1427
|
+
this._guards = options.guards || $.guards;
|
1428
|
+
this._selector = options.selector;
|
1411
1429
|
this._guard = null;
|
1412
1430
|
|
1413
|
-
if (!
|
1431
|
+
if (options.named && !options.selector && this._guards.isValidDataName(options.name)) {
|
1432
|
+
this._selector = "[data-guard~='" + options.name + "']";
|
1433
|
+
}
|
1434
|
+
|
1435
|
+
if (!options.named) {
|
1414
1436
|
this.using(this._guards.defaults.guard);
|
1415
1437
|
}
|
1416
1438
|
};
|
@@ -1438,17 +1460,9 @@
|
|
1438
1460
|
copyAttribute("_target");
|
1439
1461
|
copyAttribute("_precondition");
|
1440
1462
|
this._guard = namedGuard._guard;
|
1463
|
+
this._guardArguments = args;
|
1441
1464
|
this.name = guard;
|
1442
|
-
|
1443
|
-
if (this._guard.acceptsArguments) {
|
1444
|
-
this._guard = this._guard.apply(this._guards, args);
|
1445
|
-
}
|
1446
|
-
|
1447
|
-
if ($.isFunction(namedGuard._message)) {
|
1448
|
-
return this.message(namedGuard._message.apply(this._guards, args));
|
1449
|
-
} else {
|
1450
|
-
return this.message(namedGuard._message);
|
1451
|
-
}
|
1465
|
+
return this.message(namedGuard._message);
|
1452
1466
|
};
|
1453
1467
|
|
1454
1468
|
/**
|
@@ -1787,8 +1801,17 @@
|
|
1787
1801
|
|
1788
1802
|
$.Guard.prototype.resetMessageFn = function() {
|
1789
1803
|
var self = this;
|
1790
|
-
return this.messageFn(function() {
|
1791
|
-
|
1804
|
+
return this.messageFn(function(elements) {
|
1805
|
+
var msg = self._message;
|
1806
|
+
var dataMsg = self.getGuardDataArguments(elements, "message", true);
|
1807
|
+
|
1808
|
+
if (dataMsg !== null) {
|
1809
|
+
msg = dataMsg;
|
1810
|
+
} else if ($.isFunction(msg)) {
|
1811
|
+
msg = msg.apply(self, self.getGuardArguments(elements));
|
1812
|
+
}
|
1813
|
+
|
1814
|
+
return $('<' + self.getTag() + ' class="' + self.getMessageClass() + '"/>').html(msg);
|
1792
1815
|
});
|
1793
1816
|
};
|
1794
1817
|
|
@@ -1797,8 +1820,8 @@
|
|
1797
1820
|
return this;
|
1798
1821
|
};
|
1799
1822
|
|
1800
|
-
$.Guard.prototype.errorElement = function() {
|
1801
|
-
var element = this._messageFn();
|
1823
|
+
$.Guard.prototype.errorElement = function(elements) {
|
1824
|
+
var element = this._messageFn(elements);
|
1802
1825
|
element[0].isGuardError = true;
|
1803
1826
|
return element;
|
1804
1827
|
};
|
@@ -1903,11 +1926,107 @@
|
|
1903
1926
|
return $(element).filter(this._selector).size() > 0;
|
1904
1927
|
};
|
1905
1928
|
|
1929
|
+
$.Guard.prototype.getGuardDataArguments = function(elements, attributeName, includeForm) {
|
1930
|
+
if (this._guards.isNullOrUndefined(elements)) {
|
1931
|
+
return null;
|
1932
|
+
}
|
1933
|
+
|
1934
|
+
var $elements = $(elements);
|
1935
|
+
|
1936
|
+
if ($elements.size() === 0 || this._guards.isNullOrUndefined(this.name) || !this._guards.isValidDataName(this.name)) {
|
1937
|
+
return null;
|
1938
|
+
}
|
1939
|
+
|
1940
|
+
var dashedAttrPrefix = "guard-" + this.name + "-";
|
1941
|
+
|
1942
|
+
if (attributeName) {
|
1943
|
+
dashedAttrPrefix = dashedAttrPrefix + attributeName;
|
1944
|
+
}
|
1945
|
+
|
1946
|
+
var result = null;
|
1947
|
+
var attrPrefix = this._guards.camelize(dashedAttrPrefix.replace(/-+$/, ""));
|
1948
|
+
var data = $elements.data() || {};
|
1949
|
+
|
1950
|
+
if (includeForm) {
|
1951
|
+
var formData = $elements.parents("form:first").data() || {};
|
1952
|
+
data = $.extend({}, formData, data);
|
1953
|
+
}
|
1954
|
+
|
1955
|
+
$.each(data, function(key, value) {
|
1956
|
+
var isDashed = key.indexOf(dashedAttrPrefix) === 0;
|
1957
|
+
|
1958
|
+
if (key.indexOf(attrPrefix) !== 0 && !isDashed) {
|
1959
|
+
return;
|
1960
|
+
}
|
1961
|
+
|
1962
|
+
var attrName;
|
1963
|
+
|
1964
|
+
if (isDashed) {
|
1965
|
+
attrName = key.substring(dashedAttrPrefix.length, key.length);
|
1966
|
+
} else {
|
1967
|
+
attrName = key.substring(attrPrefix.length, key.length);
|
1968
|
+
}
|
1969
|
+
|
1970
|
+
if (!isDashed) {
|
1971
|
+
// Un-capitalize the first letter
|
1972
|
+
attrName = attrName.replace(/^(.)/, function(all, letter) {
|
1973
|
+
return letter.toLowerCase();
|
1974
|
+
});
|
1975
|
+
}
|
1976
|
+
|
1977
|
+
if (attributeName) {
|
1978
|
+
// Grabbing just this attribute, so must be an exact
|
1979
|
+
// match, and only 1 result
|
1980
|
+
if (attrName === "") {
|
1981
|
+
result = value;
|
1982
|
+
return false;
|
1983
|
+
} else {
|
1984
|
+
return;
|
1985
|
+
}
|
1986
|
+
}
|
1987
|
+
|
1988
|
+
if (result === null) {
|
1989
|
+
result = {};
|
1990
|
+
}
|
1991
|
+
|
1992
|
+
result[attrName] = value;
|
1993
|
+
});
|
1994
|
+
|
1995
|
+
return result;
|
1996
|
+
};
|
1997
|
+
|
1998
|
+
$.Guard.prototype.getGuardArguments = function(elements) {
|
1999
|
+
var result = this._guardArguments;
|
2000
|
+
|
2001
|
+
if (this._guards.isNullOrUndefined(result)) {
|
2002
|
+
result = [];
|
2003
|
+
}
|
2004
|
+
|
2005
|
+
// Currently only support single argument hash types for data
|
2006
|
+
// attribute arguments overriding javascript arguments
|
2007
|
+
if (result.length > 1 || (result.length === 1 && $.type(result[0]) !== "object")) {
|
2008
|
+
return result;
|
2009
|
+
}
|
2010
|
+
|
2011
|
+
var dataArgs = this.getGuardDataArguments(elements);
|
2012
|
+
|
2013
|
+
if (!this._guards.isNullOrUndefined(dataArgs)) {
|
2014
|
+
if (result.length === 1) {
|
2015
|
+
result[0] = $.extend({}, result[0], dataArgs);
|
2016
|
+
} else {
|
2017
|
+
result.push(dataArgs);
|
2018
|
+
}
|
2019
|
+
}
|
2020
|
+
|
2021
|
+
return result;
|
2022
|
+
};
|
2023
|
+
|
1906
2024
|
// Tests this guard against element(s). Element(s) should be field elements. Returns false
|
1907
2025
|
// but doesn't apply guard if there are already errors detected. Returns true if the selector
|
1908
2026
|
// defined for this guard doesn't apply to this element(s). Otherwise applies and adds an
|
1909
2027
|
// error if it fails.
|
1910
2028
|
$.Guard.prototype.test = function(element) {
|
2029
|
+
var self = this;
|
1911
2030
|
var $elements = $(element).filter(this._selector);
|
1912
2031
|
|
1913
2032
|
if ($elements.size() === 0) {
|
@@ -1927,7 +2046,7 @@
|
|
1927
2046
|
elements = [];
|
1928
2047
|
|
1929
2048
|
$elements.each(function() {
|
1930
|
-
values.push($(this).inputValue(
|
2049
|
+
values.push($(this).inputValue(self._guards));
|
1931
2050
|
elements.push(this);
|
1932
2051
|
});
|
1933
2052
|
} else {
|
@@ -1939,7 +2058,13 @@
|
|
1939
2058
|
result = true;
|
1940
2059
|
} else {
|
1941
2060
|
try {
|
1942
|
-
|
2061
|
+
var guardFn = this._guard;
|
2062
|
+
|
2063
|
+
if (guardFn.acceptsArguments) {
|
2064
|
+
guardFn = this._guard.apply(this._guards, this.getGuardArguments(elements));
|
2065
|
+
}
|
2066
|
+
|
2067
|
+
result = guardFn(values, elements);
|
1943
2068
|
} catch(e) {
|
1944
2069
|
this._guards.log("A guard threw an error: " + e);
|
1945
2070
|
result = false;
|
@@ -2193,7 +2318,7 @@
|
|
2193
2318
|
return this;
|
2194
2319
|
}
|
2195
2320
|
|
2196
|
-
var element = guard.errorElement();
|
2321
|
+
var element = guard.errorElement(this);
|
2197
2322
|
guard.attachError(this, element);
|
2198
2323
|
this.addClass(guard.getInvalidClass());
|
2199
2324
|
var linked = [];
|
@@ -2609,4 +2734,8 @@
|
|
2609
2734
|
$(this).clearErrors();
|
2610
2735
|
}
|
2611
2736
|
});
|
2737
|
+
|
2738
|
+
// Data driven guards
|
2739
|
+
$.liveGuard("[data-live-guarded]");
|
2740
|
+
$.enableGuards("[data-guarded]");
|
2612
2741
|
})(jQuery);
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: guardsjs-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-04-
|
12
|
+
date: 2014-04-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: railties
|
@@ -59,7 +59,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
59
59
|
version: '0'
|
60
60
|
segments:
|
61
61
|
- 0
|
62
|
-
hash:
|
62
|
+
hash: 986596030085484236
|
63
63
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
64
64
|
none: false
|
65
65
|
requirements:
|