summaryrefslogtreecommitdiffstats
path: root/src/usr/local
diff options
context:
space:
mode:
authorStephen Beaver <sbeaver@netgate.com>2015-11-23 10:02:54 -0500
committerStephen Beaver <sbeaver@netgate.com>2015-11-23 10:04:07 -0500
commitde038a277ba3887340fe31b95fae86fa6f0568f5 (patch)
tree714edd1fea56d0feb1172b48ae3833e949794d85 /src/usr/local
parent97433447b5e047afab23f916cbe6bb89c8c3c398 (diff)
downloadpfsense-de038a277ba3887340fe31b95fae86fa6f0568f5.zip
pfsense-de038a277ba3887340fe31b95fae86fa6f0568f5.tar.gz
Completed #5407
Diffstat (limited to 'src/usr/local')
-rwxr-xr-xsrc/usr/local/www/foot.inc2
-rw-r--r--src/usr/local/www/services_unbound.php2
-rwxr-xr-xsrc/usr/local/www/sortable/sortable.js381
-rwxr-xr-xsrc/usr/local/www/sortable/sortable.min.js2
4 files changed, 383 insertions, 4 deletions
diff --git a/src/usr/local/www/foot.inc b/src/usr/local/www/foot.inc
index baacb82..ca1c633 100755
--- a/src/usr/local/www/foot.inc
+++ b/src/usr/local/www/foot.inc
@@ -26,7 +26,7 @@
<script src="/bootstrap/js/bootstrap.min.js"></script>
<script src="/jquery/pfSense.js"></script>
<script src="/jquery/pfSenseHelpers.js"></script>
- <script src="sortable/sortable.min.js"></script>
+ <script src="sortable/sortable.js"></script>
<script>
// Un-hide the "Top of page" icons if the page is larger than the window
diff --git a/src/usr/local/www/services_unbound.php b/src/usr/local/www/services_unbound.php
index bf6d8e4..f6f4a16 100644
--- a/src/usr/local/www/services_unbound.php
+++ b/src/usr/local/www/services_unbound.php
@@ -429,7 +429,7 @@ foreach ($a_hosts as $hostent):
<?=strtolower($hostent['domain'])?>
</td>
<td>
- <?=$hostent['ip']?>&nbsp;
+ <?=$hostent['ip']?>
</td>
<td>
<?=htmlspecialchars($hostent['descr'])?>
diff --git a/src/usr/local/www/sortable/sortable.js b/src/usr/local/www/sortable/sortable.js
new file mode 100755
index 0000000..031d6f7
--- /dev/null
+++ b/src/usr/local/www/sortable/sortable.js
@@ -0,0 +1,381 @@
+(function() {
+ var SELECTOR, addEventListener, clickEvents, numberRegExp, sortable, touchDevice, trimRegExp;
+
+ SELECTOR = 'table[data-sortable]';
+
+ numberRegExp = /^-?[£$¤]?[\d,.]+%?$/;
+
+ trimRegExp = /^\s+|\s+$/g;
+
+ clickEvents = ['click'];
+
+ touchDevice = 'ontouchstart' in document.documentElement;
+
+ if (touchDevice) {
+ clickEvents.push('touchstart');
+ }
+
+ addEventListener = function(el, event, handler) {
+ if (el.addEventListener != null) {
+ return el.addEventListener(event, handler, false);
+ } else {
+ return el.attachEvent("on" + event, handler);
+ }
+ };
+
+ sortable = {
+ init: function(options) {
+ var table, tables, _i, _len, _results;
+ if (options == null) {
+ options = {};
+ }
+
+ if (options.selector == null) {
+ options.selector = SELECTOR;
+ }
+
+ tables = document.querySelectorAll(options.selector);
+ _results = [];
+
+ for (_i = 0, _len = tables.length; _i < _len; _i++) {
+ table = tables[_i];
+ _results.push(sortable.initTable(table));
+ }
+
+ return _results;
+ },
+
+ initTable: function(table) {
+ var i, th, ths, _i, _len, _ref;
+
+ if (((_ref = table.tHead) != null ? _ref.rows.length : void 0) !== 1) {
+ return;
+ }
+
+ if (table.getAttribute('data-sortable-initialized') === 'true') {
+ return;
+ }
+
+ table.setAttribute('data-sortable-initialized', 'true');
+ ths = table.querySelectorAll('th');
+
+ for (i = _i = 0, _len = ths.length; _i < _len; i = ++_i) {
+ th = ths[i];
+
+ if (th.getAttribute('data-sortable') !== 'false') {
+ sortable.setupClickableTH(table, th, i);
+ }
+ }
+
+ return table;
+ },
+
+ setupClickableTH: function(table, th, i) {
+ var eventName, onClick, type, _i, _len, _results;
+ type = sortable.getColumnType(table, i);
+ onClick = function(e) {
+ var compare, item, newSortedDirection, position, row, rowArray, sorted, sortedDirection, tBody, ths, value, _compare, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _m, _ref, _ref1;
+
+ if (e.handled !== true) {
+ e.handled = true;
+ } else {
+ return false;
+ }
+
+ sorted = this.getAttribute('data-sorted') === 'true';
+ sortedDirection = this.getAttribute('data-sorted-direction');
+
+ if (sorted) {
+ newSortedDirection = sortedDirection === 'ascending' ? 'descending' : 'ascending';
+ } else {
+ newSortedDirection = type.defaultSortDirection;
+ }
+
+ ths = this.parentNode.querySelectorAll('th');
+
+ for (_i = 0, _len = ths.length; _i < _len; _i++) {
+ th = ths[_i];
+ th.setAttribute('data-sorted', 'false');
+ th.removeAttribute('data-sorted-direction');
+ }
+
+ this.setAttribute('data-sorted', 'true');
+ this.setAttribute('data-sorted-direction', newSortedDirection);
+ tBody = table.tBodies[0];
+ rowArray = [];
+
+ if (!sorted) {
+ if (type.compare != null) {
+ _compare = type.compare;
+ } else {
+ _compare = function(a, b) {
+ return b - a;
+ };
+ }
+
+ compare = function(a, b) {
+ if (a[0] === b[0]) {
+ return a[2] - b[2];
+ }
+
+ if (type.reverse) {
+ return _compare(b[0], a[0]);
+ } else {
+ return _compare(a[0], b[0]);
+ }
+ };
+
+ _ref = tBody.rows;
+
+ for (position = _j = 0, _len1 = _ref.length; _j < _len1; position = ++_j) {
+ row = _ref[position];
+ value = sortable.getNodeValue(row.cells[i]);
+
+ if (type.comparator != null) {
+ value = type.comparator(value);
+ }
+
+ rowArray.push([value, row, position]);
+ }
+
+ rowArray.sort(compare);
+
+ for (_k = 0, _len2 = rowArray.length; _k < _len2; _k++) {
+ row = rowArray[_k];
+ tBody.appendChild(row[1]);
+ }
+ } else {
+ _ref1 = tBody.rows;
+
+ for (_l = 0, _len3 = _ref1.length; _l < _len3; _l++) {
+ item = _ref1[_l];
+ rowArray.push(item);
+ }
+
+ rowArray.reverse();
+
+ for (_m = 0, _len4 = rowArray.length; _m < _len4; _m++) {
+ row = rowArray[_m];
+ tBody.appendChild(row);
+ }
+ }
+
+ if (typeof window['CustomEvent'] === 'function') {
+ return typeof table.dispatchEvent === "function" ? table.dispatchEvent(new CustomEvent('Sortable.sorted', {
+ bubbles: true
+ })) : void 0;
+ }
+ };
+
+ _results = [];
+
+ for (_i = 0, _len = clickEvents.length; _i < _len; _i++) {
+ eventName = clickEvents[_i];
+ _results.push(addEventListener(th, eventName, onClick));
+ }
+
+ return _results;
+ },
+
+ getColumnType: function(table, i) {
+ var row, specified, text, type, _i, _j, _len, _len1, _ref, _ref1, _ref2;
+ specified = (_ref = table.querySelectorAll('th')[i]) != null ? _ref.getAttribute('data-sortable-type') : void 0;
+
+ if (specified != null) {
+ return sortable.typesObject[specified];
+ }
+
+ _ref1 = table.tBodies[0].rows;
+
+ for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
+ row = _ref1[_i];
+ text = sortable.getNodeValue(row.cells[i]);
+ _ref2 = sortable.types;
+
+ for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) {
+ type = _ref2[_j];
+ if (type.match(text)) {
+ return type;
+ }
+ }
+ }
+
+ return sortable.typesObject.alpha;
+ },
+
+ getNodeValue: function(node) {
+ var dataValue;
+
+ if (!node) {
+ return '';
+ }
+
+ dataValue = node.getAttribute('data-value');
+ if (dataValue !== null) {
+ return dataValue;
+ }
+
+ if (typeof node.innerText !== 'undefined') {
+ return node.innerText.replace(trimRegExp, '');
+ }
+
+ return node.textContent.replace(trimRegExp, '');
+ },
+
+ setupTypes: function(types) {
+ var type, _i, _len, _results;
+ sortable.types = types;
+ sortable.typesObject = {};
+ _results = [];
+
+ for (_i = 0, _len = types.length; _i < _len; _i++) {
+ type = types[_i];
+ _results.push(sortable.typesObject[type.name] = type);
+ }
+
+ return _results;
+ }
+ };
+
+ // ip type needs to go first to prevent 'numeric" from catching it
+ // 3 dots = IPv4
+ // 2 colons = IPv6
+ // Crude but sufficient here
+ sortable.setupTypes([
+ {
+ name: 'ip',
+ defaultSortDirection: 'ascending',
+ match: function(a) {
+ v4 = a.split(".").length;
+ v6 = a.split(":").length;
+ return ((v4 == 4) || (v6 > 2));
+ },
+ compare: function(a, b) {
+ a = padip(a);
+ b = padip(b);
+ return ((a < b) ? -1 : ((a > b) ? 1 : 0));
+ }
+ }, {
+ name: 'numeric',
+ defaultSortDirection: 'descending',
+
+ match: function(a) {
+ return a.match(numberRegExp);
+ },
+
+ comparator: function(a) {
+ return parseFloat(a.replace(/[^0-9.-]/g, ''), 10) || 0;
+ }
+ }, {
+ name: 'date',
+ defaultSortDirection: 'ascending',
+ reverse: true,
+ match: function(a) {
+ return !isNaN(Date.parse(a));
+ },
+
+ comparator: function(a) {
+ return Date.parse(a) || 0;
+ }
+ }, {
+ name: 'alpha',
+ defaultSortDirection: 'ascending',
+ match: function() {
+ return true;
+ },
+
+ compare: function(a, b) {
+ return a.localeCompare(b);
+ }
+ }
+ ]);
+
+ setTimeout(sortable.init, 0);
+
+ if (typeof define === 'function' && define.amd) {
+ define(function() {
+ return sortable;
+ });
+ } else if (typeof exports !== 'undefined') {
+ module.exports = sortable;
+ } else {
+ window.Sortable = sortable;
+ }
+}).call(this);
+
+// pad function is based on work by Dominique Fournier
+// https://www.datatables.net/plug-ins/sorting/ip-address
+function padip ( a ) {
+ var i, item;
+ var m = a.split("."),
+ n = a.split(":"),
+ x = "",
+ xa = "";
+
+ if (m.length == 4) {
+ // IPV4
+ for(i = 0; i < m.length; i++) {
+ item = m[i];
+
+ if(item.length == 1) {
+ x += "00" + item;
+ }
+ else if(item.length == 2) {
+ x += "0" + item;
+ }
+ else {
+ x += item;
+ }
+ }
+ } else if (n.length > 0) {
+ // IPV6
+ var count = 0;
+ for(i = 0; i < n.length; i++) {
+ item = n[i];
+
+ if (i > 0) {
+ xa += ":";
+ }
+
+ if(item.length === 0) {
+ count += 0;
+ }
+ else if(item.length == 1) {
+ xa += "000" + item;
+ count += 4;
+ }
+ else if(item.length == 2) {
+ xa += "00" + item;
+ count += 4;
+ }
+ else if(item.length == 3) {
+ xa += "0" + item;
+ count += 4;
+ }
+ else {
+ xa += item;
+ count += 4;
+ }
+ }
+
+ // Padding the ::
+ n = xa.split(":");
+ var paddDone = 0;
+
+ for (i = 0; i < n.length; i++) {
+ item = n[i];
+
+ if (item.length === 0 && paddDone === 0) {
+ for (var padding = 0 ; padding < (32-count) ; padding++) {
+ x += "0";
+ paddDone = 1;
+ }
+ }
+ else {
+ x += item;
+ }
+ }
+ }
+
+ return x;
+} \ No newline at end of file
diff --git a/src/usr/local/www/sortable/sortable.min.js b/src/usr/local/www/sortable/sortable.min.js
deleted file mode 100755
index 8278f50..0000000
--- a/src/usr/local/www/sortable/sortable.min.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/*! sortable.js 0.8.0 */
-(function(){var a,b,c,d,e,f,g;a="table[data-sortable]",d=/^-?[£$¤]?[\d,.]+%?$/,g=/^\s+|\s+$/g,c=["click"],f="ontouchstart"in document.documentElement,f&&c.push("touchstart"),b=function(a,b,c){return null!=a.addEventListener?a.addEventListener(b,c,!1):a.attachEvent("on"+b,c)},e={init:function(b){var c,d,f,g,h;for(null==b&&(b={}),null==b.selector&&(b.selector=a),d=document.querySelectorAll(b.selector),h=[],f=0,g=d.length;g>f;f++)c=d[f],h.push(e.initTable(c));return h},initTable:function(a){var b,c,d,f,g,h;if(1===(null!=(h=a.tHead)?h.rows.length:void 0)&&"true"!==a.getAttribute("data-sortable-initialized")){for(a.setAttribute("data-sortable-initialized","true"),d=a.querySelectorAll("th"),b=f=0,g=d.length;g>f;b=++f)c=d[b],"false"!==c.getAttribute("data-sortable")&&e.setupClickableTH(a,c,b);return a}},setupClickableTH:function(a,d,f){var g,h,i,j,k,l;for(i=e.getColumnType(a,f),h=function(b){var c,g,h,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D;if(b.handled===!0)return!1;for(b.handled=!0,m="true"===this.getAttribute("data-sorted"),n=this.getAttribute("data-sorted-direction"),h=m?"ascending"===n?"descending":"ascending":i.defaultSortDirection,p=this.parentNode.querySelectorAll("th"),s=0,w=p.length;w>s;s++)d=p[s],d.setAttribute("data-sorted","false"),d.removeAttribute("data-sorted-direction");if(this.setAttribute("data-sorted","true"),this.setAttribute("data-sorted-direction",h),o=a.tBodies[0],l=[],m){for(D=o.rows,v=0,z=D.length;z>v;v++)g=D[v],l.push(g);for(l.reverse(),B=0,A=l.length;A>B;B++)k=l[B],o.appendChild(k)}else{for(r=null!=i.compare?i.compare:function(a,b){return b-a},c=function(a,b){return a[0]===b[0]?a[2]-b[2]:i.reverse?r(b[0],a[0]):r(a[0],b[0])},C=o.rows,j=t=0,x=C.length;x>t;j=++t)k=C[j],q=e.getNodeValue(k.cells[f]),null!=i.comparator&&(q=i.comparator(q)),l.push([q,k,j]);for(l.sort(c),u=0,y=l.length;y>u;u++)k=l[u],o.appendChild(k[1])}return"function"==typeof window.CustomEvent&&"function"==typeof a.dispatchEvent?a.dispatchEvent(new CustomEvent("Sortable.sorted",{bubbles:!0})):void 0},l=[],j=0,k=c.length;k>j;j++)g=c[j],l.push(b(d,g,h));return l},getColumnType:function(a,b){var c,d,f,g,h,i,j,k,l,m,n;if(d=null!=(l=a.querySelectorAll("th")[b])?l.getAttribute("data-sortable-type"):void 0,null!=d)return e.typesObject[d];for(m=a.tBodies[0].rows,h=0,j=m.length;j>h;h++)for(c=m[h],f=e.getNodeValue(c.cells[b]),n=e.types,i=0,k=n.length;k>i;i++)if(g=n[i],g.match(f))return g;return e.typesObject.alpha},getNodeValue:function(a){var b;return a?(b=a.getAttribute("data-value"),null!==b?b:"undefined"!=typeof a.innerText?a.innerText.replace(g,""):a.textContent.replace(g,"")):""},setupTypes:function(a){var b,c,d,f;for(e.types=a,e.typesObject={},f=[],c=0,d=a.length;d>c;c++)b=a[c],f.push(e.typesObject[b.name]=b);return f}},e.setupTypes([{name:"numeric",defaultSortDirection:"descending",match:function(a){return a.match(d)},comparator:function(a){return parseFloat(a.replace(/[^0-9.-]/g,""),10)||0}},{name:"date",defaultSortDirection:"ascending",reverse:!0,match:function(a){return!isNaN(Date.parse(a))},comparator:function(a){return Date.parse(a)||0}},{name:"alpha",defaultSortDirection:"ascending",match:function(){return!0},compare:function(a,b){return a.localeCompare(b)}}]),setTimeout(e.init,0),"function"==typeof define&&define.amd?define(function(){return e}):"undefined"!=typeof exports?module.exports=e:window.Sortable=e}).call(this); \ No newline at end of file
OpenPOWER on IntegriCloud