196 lines
6.1 KiB
JavaScript
196 lines
6.1 KiB
JavaScript
/*
|
|
* The trigger API
|
|
*
|
|
* - Documentation: ../docs/input-trigger.md
|
|
*/
|
|
+function ($) { "use strict";
|
|
|
|
var TriggerOn = function (element, options) {
|
|
|
|
var $el = this.$el = $(element);
|
|
|
|
this.options = options || {};
|
|
|
|
if (this.options.triggerCondition === false)
|
|
throw new Error('Trigger condition is not specified.')
|
|
|
|
if (this.options.trigger === false)
|
|
throw new Error('Trigger selector is not specified.')
|
|
|
|
if (this.options.triggerAction === false)
|
|
throw new Error('Trigger action is not specified.')
|
|
|
|
this.triggerCondition = this.options.triggerCondition
|
|
|
|
if (this.options.triggerCondition.indexOf('value') == 0) {
|
|
var match = this.options.triggerCondition.match(/[^[\]]+(?=])/g)
|
|
this.triggerCondition = 'value'
|
|
this.triggerConditionValue = (match) ? match : [""]
|
|
}
|
|
|
|
this.triggerParent = undefined
|
|
if (this.options.triggerClosestParent !== undefined) {
|
|
var closestParentElements = this.options.triggerClosestParent.split(',')
|
|
for (var i = 0; i < closestParentElements.length; i++) {
|
|
var $triggerElement = $el.closest(closestParentElements[i])
|
|
if ($triggerElement.length) {
|
|
this.triggerParent = $triggerElement
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
if (
|
|
this.triggerCondition == 'checked' ||
|
|
this.triggerCondition == 'unchecked' ||
|
|
this.triggerCondition == 'value'
|
|
) {
|
|
$(document).on('change', this.options.trigger, $.proxy(this.onConditionChanged, this))
|
|
}
|
|
|
|
var self = this
|
|
$el.on('oc.triggerOn.update', function(e){
|
|
e.stopPropagation()
|
|
self.onConditionChanged()
|
|
})
|
|
|
|
self.onConditionChanged()
|
|
}
|
|
|
|
TriggerOn.prototype.onConditionChanged = function() {
|
|
if (this.triggerCondition == 'checked') {
|
|
this.updateTarget(!!$(this.options.trigger + ':checked', this.triggerParent).length)
|
|
}
|
|
else if (this.triggerCondition == 'unchecked') {
|
|
this.updateTarget(!$(this.options.trigger + ':checked', this.triggerParent).length)
|
|
}
|
|
else if (this.triggerCondition == 'value') {
|
|
var trigger, triggered = false
|
|
|
|
trigger = $(this.options.trigger, this.triggerParent)
|
|
.not('input[type=checkbox], input[type=radio], input[type=button], input[type=submit]')
|
|
|
|
if (!trigger.length) {
|
|
trigger = $(this.options.trigger, this.triggerParent)
|
|
.not(':not(input[type=checkbox]:checked, input[type=radio]:checked)')
|
|
}
|
|
|
|
var self = this
|
|
trigger.each(function() {
|
|
var triggerValue = $(this).val();
|
|
|
|
$.each($.isArray(triggerValue) ? triggerValue : [triggerValue], function(key, val) {
|
|
triggered = $.inArray(val, self.triggerConditionValue) != -1
|
|
return !triggered
|
|
})
|
|
|
|
return !triggered
|
|
})
|
|
|
|
this.updateTarget(triggered)
|
|
}
|
|
}
|
|
|
|
TriggerOn.prototype.updateTarget = function(status) {
|
|
var self = this,
|
|
actions = this.options.triggerAction.split('|')
|
|
|
|
$.each(actions, function(index, action) {
|
|
self.updateTargetAction(action, status)
|
|
})
|
|
|
|
$(window).trigger('resize')
|
|
|
|
this.$el.trigger('oc.triggerOn.afterUpdate', status)
|
|
}
|
|
|
|
TriggerOn.prototype.updateTargetAction = function(action, status) {
|
|
if (action == 'show') {
|
|
this.$el
|
|
.toggleClass('hide', !status)
|
|
.trigger('hide.oc.triggerapi', [!status])
|
|
}
|
|
else if (action == 'hide') {
|
|
this.$el
|
|
.toggleClass('hide', status)
|
|
.trigger('hide.oc.triggerapi', [status])
|
|
}
|
|
else if (action == 'enable') {
|
|
this.$el
|
|
.prop('disabled', !status)
|
|
.toggleClass('control-disabled', !status)
|
|
.trigger('disable.oc.triggerapi', [!status])
|
|
}
|
|
else if (action == 'disable') {
|
|
this.$el
|
|
.prop('disabled', status)
|
|
.toggleClass('control-disabled', status)
|
|
.trigger('disable.oc.triggerapi', [status])
|
|
}
|
|
else if (action == 'empty' && status) {
|
|
this.$el
|
|
.not('input[type=checkbox], input[type=radio], input[type=button], input[type=submit]')
|
|
.val('')
|
|
|
|
this.$el
|
|
.not(':not(input[type=checkbox], input[type=radio])')
|
|
.prop('checked', false)
|
|
|
|
this.$el
|
|
.trigger('empty.oc.triggerapi')
|
|
.trigger('change')
|
|
}
|
|
|
|
if (action == 'show' || action == 'hide') {
|
|
this.fixButtonClasses()
|
|
}
|
|
}
|
|
|
|
TriggerOn.prototype.fixButtonClasses = function() {
|
|
var group = this.$el.closest('.btn-group')
|
|
|
|
if (group.length > 0 && this.$el.is(':last-child'))
|
|
this.$el.prev().toggleClass('last', this.$el.hasClass('hide'))
|
|
}
|
|
|
|
TriggerOn.DEFAULTS = {
|
|
triggerAction: false,
|
|
triggerCondition: false,
|
|
triggerClosestParent: undefined,
|
|
trigger: false
|
|
}
|
|
|
|
// TRIGGERON PLUGIN DEFINITION
|
|
// ============================
|
|
|
|
var old = $.fn.triggerOn
|
|
|
|
$.fn.triggerOn = function (option) {
|
|
return this.each(function () {
|
|
var $this = $(this)
|
|
var data = $this.data('oc.triggerOn')
|
|
var options = $.extend({}, TriggerOn.DEFAULTS, $this.data(), typeof option == 'object' && option)
|
|
|
|
if (!data) $this.data('oc.triggerOn', (data = new TriggerOn(this, options)))
|
|
})
|
|
}
|
|
|
|
$.fn.triggerOn.Constructor = TriggerOn
|
|
|
|
// TRIGGERON NO CONFLICT
|
|
// =================
|
|
|
|
$.fn.triggerOn.noConflict = function () {
|
|
$.fn.triggerOn = old
|
|
return this
|
|
}
|
|
|
|
// TRIGGERON DATA-API
|
|
// ===============
|
|
|
|
$(document).render(function(){
|
|
$('[data-trigger]').triggerOn()
|
|
})
|
|
|
|
}(window.jQuery);
|