diff options
author | Jared Dillard <jdillard@netgate.com> | 2016-03-16 14:19:04 -0500 |
---|---|---|
committer | Jared Dillard <jdillard@netgate.com> | 2016-03-16 14:25:27 -0500 |
commit | 9d1be24ef72c0c27fe7a297bf79ec5e4f552a390 (patch) | |
tree | 47be453db62ee886d797b26efdf3104731b0cce2 /src/usr/local/www/js/pfSense.js | |
parent | 1c9818970fcc994d6599d794047397655f867a12 (diff) | |
download | pfsense-9d1be24ef72c0c27fe7a297bf79ec5e4f552a390.zip pfsense-9d1be24ef72c0c27fe7a297bf79ec5e4f552a390.tar.gz |
organize assets and put 3rd party into vendor folder
Diffstat (limited to 'src/usr/local/www/js/pfSense.js')
-rw-r--r-- | src/usr/local/www/js/pfSense.js | 278 |
1 files changed, 278 insertions, 0 deletions
diff --git a/src/usr/local/www/js/pfSense.js b/src/usr/local/www/js/pfSense.js new file mode 100644 index 0000000..3ca74c4 --- /dev/null +++ b/src/usr/local/www/js/pfSense.js @@ -0,0 +1,278 @@ +/* + * This file should only contain functions that will be used on more than 2 pages + */ + +$(function() { + // Attach collapsable behaviour to select options + (function() + { + var selects = $('select[data-toggle="collapse"]'); + + selects.on('change', function(){ + var options = $(this).find('option'); + var selectedValue = $(this).find(':selected').val(); + + options.each(function(){ + if ($(this).val() == selectedValue) + return; + + targets = $('.toggle-'+ $(this).val() +'.in:not(.toggle-'+ selectedValue +')'); + + // Hide related collapsables which are visible (.in) + targets.collapse('hide'); + + // Disable all invisible inputs + targets.find(':input').prop('disabled', true); + }); + + $('.toggle-' + selectedValue).collapse('show').find(':input').prop('disabled', false); + }); + + // Trigger change to open currently selected item + selects.trigger('change'); + })(); + + + // Add +/- buttons to certain Groups; to allow adding multiple entries + // This time making the buttons col-2 wide so they can fit on the same line as the + // rest of the group (providing the total width of the group is col-8 or less) + (function() + { + var groups = $('div.form-group.user-duplication-horiz'); + var controlsContainer = $('<div class="col-sm-2"></div>'); + var plus = $('<a class="btn btn-sm btn-success"><i class="fa fa-plus icon-embed-btn"></i>Add</a>'); + var minus = $('<a class="btn btn-sm btn-warning"><i class="fa fa-trash icon-embed-btn"></i>Delete</a>'); + + minus.on('click', function(){ + $(this).parents('div.form-group').remove(); + }); + + plus.on('click', function(){ + var group = $(this).parents('div.form-group'); + + var clone = group.clone(true); + clone.find('*').val(''); + clone.appendTo(group.parent()); + }); + + groups.each(function(idx, group){ + var controlsClone = controlsContainer.clone(true).appendTo(group); + minus.clone(true).appendTo(controlsClone); + + if (group == group.parentNode.lastElementChild) + plus.clone(true).appendTo(controlsClone); + }); + })(); + + // Add +/- buttons to certain Groups; to allow adding multiple entries + (function() + { + var groups = $('div.form-group.user-duplication'); + var controlsContainer = $('<div class="col-sm-10 col-sm-offset-2 controls"></div>'); + var plus = $('<a class="btn btn-xs btn-success"><i class="fa fa-plus icon-embed-btn"></i>Add</a>'); + var minus = $('<a class="btn btn-xs btn-warning"><i class="fa fa-trash icon-embed-btn"></i>Delete</a>'); + + minus.on('click', function(){ + $(this).parents('div.form-group').remove(); + }); + + plus.on('click', function(){ + var group = $(this).parents('div.form-group'); + + var clone = group.clone(true); + clone.find('*').removeAttr('value'); + clone.appendTo(group.parent()); + }); + + groups.each(function(idx, group){ + var controlsClone = controlsContainer.clone(true).appendTo(group); + minus.clone(true).appendTo(controlsClone); + + if (group == group.parentNode.lastElementChild) + plus.clone(true).appendTo(controlsClone); + }); + })(); + + // Automatically change IpAddress mask selectors to 128/32 options for IPv6/IPv4 addresses + $('span.pfIpMask + select').each(function (idx, select){ + var input = $(select).prevAll('input[type=text]'); + + input.on('change', function(e){ + var isV6 = (input.val().indexOf(':') != -1), min = 0, max = 128; + if (!isV6) + max = 32; + + if (input.val() == "") + return; + + // Eat all of the options with a value greater than max. We don't want them to be available + while (select.options[0].value > max) + select.remove(0); + + if (select.options.length < max) { + for (var i=select.options.length; i<=max; i++) + select.options.add(new Option(i, i), 0); + } + }); + + // Fire immediately + input.change(); + }); + + // Add confirm to all btn-danger buttons and fa-trash icons + // Use element title in the confirmation message, or if not available + // the element value + $('.btn-danger, .fa-trash').on('click', function(e){ + if(!($(this).hasClass('no-confirm'))) { + var msg = $.trim(this.textContent); + + if(!msg) + var msg = $.trim(this.value).toLowerCase(); + + var q = 'Are you sure you wish to '+ msg +'?'; + + if ($(this).attr('title') != undefined) + q = 'Are you sure you wish to '+ $(this).attr('title').toLowerCase() + '?'; + + if (!confirm(q)) { + e.preventDefault(); + e.stopPropagation(); // Don't leave ancestor(s) selected. + } + } + }); + + // Add toggle-all when there are multiple checkboxes + $('.control-label + .checkbox.multi').each(function() { + var a = $('<a name="btntoggleall" class="btn btn-xs btn-info"><i class="fa fa-check-square-o icon-embed-btn"></i>Toggle All</a>'); + + a.on('click', function() { + var wrap = $(this).parents('.form-group').find('.checkbox.multi'), + all = wrap.find('input[type=checkbox]'), + checked = wrap.find('input[type=checkbox]:checked'); + + all.prop('checked', (all.length != checked.length)); + }); + + a.appendTo($(this)); + }); + + // The need to NOT hide the advanced options if the elements therein are not set to the system + // default values makes it better to handle advanced option hiding in each PHP file so this is being + // disabled for now by changing the class name it acts on to "auto-advanced" + + // Hide advanced inputs by default + if ($('.auto-advanced').length > 0) + { + var advButt = $('<a id="toggle-advanced" class="btn btn-default">toggle advanced options</a>'); + advButt.on('click', function() { + $('.advanced').parents('.form-group').collapse('toggle'); + }); + + advButt.insertAfter($('#save')); + + $('.auto-advanced').parents('.form-group').collapse({toggle: true}); + } + + var originalLeave = $.fn.popover.Constructor.prototype.leave; + $.fn.popover.Constructor.prototype.leave = function(obj){ + var self = obj instanceof this.constructor ? + obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) + var container, timeout; + + originalLeave.call(this, obj); + + if(self.$tip && self.$tip.length) { + container = self.$tip; + timeout = self.timeout; + container.one('mouseenter', function(){ + //We entered the actual popover - call off the dogs + clearTimeout(timeout); + //Let's monitor popover content instead + container.one('mouseleave', function(){ + $.fn.popover.Constructor.prototype.leave.call(self, self); + }); + }) + } + }; + + // Enable popovers globally + $('[data-toggle="popover"]').popover({ delay: {show: 50, hide: 400} }); + + // Force correct initial state for toggleable checkboxes + $('input[type=checkbox][data-toggle="collapse"]:not(:checked)').each(function() { + $( $(this).data('target') ).addClass('collapse'); + }); + + $('input[type=checkbox][data-toggle="disable"]:not(:checked)').each(function() { + $( $(this).data('target') ).prop('disabled', true); + }); + + // Focus first input + $(':input:enabled:visible:first').focus(); + + // Run in-page defined events + while (func = window.events.shift()) + func(); +}); + +// Implement data-toggle=disable +// Source: https://github.com/synergic-cz/synergic-ui/blob/master/src/js/disable.js +;(function($, window, document) { + 'use strict'; + + var Disable = function($element) { + this.$element = $element; + }; + + Disable.prototype.toggle = function() { + this.$element.prop('disabled', !this.$element.prop('disabled')); + }; + + function Plugin(options) { + $(document).trigger('toggle.sui.disable'); + + this.each(function() { + var $this = $(this); + var data = $this.data('sui.disable'); + + if (!data) { + $this.data('sui.disable', (data = new Disable($this))); + } + + if (options === 'toggle') { + data.toggle(); + } + }); + + $(document).trigger('toggled.sui.disable'); + + return this; + } + + var old = $.fn.disable; + + $.fn.disable = Plugin; + $.fn.disable.Constructor = Disable; + + $.fn.disable.noConflict = function() { + $.fn.disable = old; + return this; + }; + + (function(Plugin, $, window) { + $(window).load(function() { + var $controls = $('[data-toggle=disable]'); + + $controls.each(function() { + var $this = $(this); + var eventType = $this.data('disable-event'); + if (!eventType) { + eventType = 'change'; + } + $this.on(eventType + '.sui.disable.data-api', function() { + Plugin.call($($this.data('target')), 'toggle'); + }); + }); + }); + }(Plugin, $, window, document)); +}(jQuery, window, document)); |