// Evaluate a condition function dfEvalCondition(el, args, on_change) { if(args.fn) { if(args.fn && window[args.fn]) return !window[args.fn](el); else console.log('Warning - activeadmin_dynamic_fields: ' + args.fn + '() not available [1]'); } else if(args.if == 'checked') { return el.is(':checked'); } else if(args.if == 'not_checked') { return !el.is(':checked'); } else if(args.if == 'blank') { return el.val().length === 0 || !el.val().trim(); } else if(args.if == 'not_blank') { return el.val().length !== 0 && el.val().trim(); } else if(args.if == 'changed') { return on_change; } else if(args.eq) { return el.val() == args.eq; } else if(args.not) { return el.val() != args.not; } return undefined; } // Prepare a field function dfSetupField(el) { var action = el.data('action'); var target, args = {}; args.if = el.data('if'); args.eq = el.data('eq'); args.not = el.data('not'); args.fn = el.data('function'); if(el.data('target')) target = el.closest('fieldset').find(el.data('target')); // closest find for has many associations else if(el.data('gtarget')) target = $(el.data('gtarget')); if(action == 'hide') { if(dfEvalCondition(el, args, false)) target.hide(); else target.show(); el.on('change', function(event) { if(dfEvalCondition($(this), args, true)) target.hide(); else target.show(); }); } else if(action == 'slide') { if(dfEvalCondition(el, args, false)) target.slideDown(); else target.slideUp(); el.on('change', function(event) { if(dfEvalCondition($(this), args, true)) target.slideDown(); else target.slideUp(); }); } else if(action == 'fade') { if(dfEvalCondition(el, args, false)) target.fadeIn(); else target.fadeOut(); el.on('change', function(event) { if(dfEvalCondition($(this), args, true)) target.fadeIn(); else target.fadeOut(); }); } else if(action.substr(0, 8) == 'setValue') { var val = action.substr(8).trim(); if(dfEvalCondition(el, args, false)) dfSetValue(target, val); el.on('change', function(event) { if(dfEvalCondition($(this), args, true)) dfSetValue(target, val); }); } else if(action.substr(0, 8) == 'callback') { var cb = action.substr(8).trim(); if(cb && window[cb]) { if(dfEvalCondition(el, args, false)) window[cb](el.data('args')); el.on('change', function(event) { if(dfEvalCondition($(this), args, true)) window[cb](el.data('args')); }); } else console.log('Warning - activeadmin_dynamic_fields: ' + cb + '() not available [2]'); } else if(action.substr(0, 8) == 'addClass') { var classes = action.substr(8).trim(); if(dfEvalCondition(el, args, false)) target.removeClass(classes); else target.addClass(classes); el.on('change', function(event) { if(dfEvalCondition($(this), args, true)) target.removeClass(classes); else target.addClass(classes); }); } else if(args.fn) { // function without action dfEvalCondition(el, args, false); el.on('change', function(event) { dfEvalCondition(el, args, true); }); } } // Set the value of an element function dfSetValue(el, val) { if(el.attr('type') != 'checkbox') el.val(val); else el.prop('checked', val == '1'); el.trigger('change'); } // Inline update - must be called binded on the editing element function dfUpdateField() { if($(this).data('loading') != '1') { $(this).data('loading', '1'); var _this = $(this); var type = $(this).data('field-type'); var new_value; if(type == 'boolean') new_value = !$(this).data('field-value'); else if(type == 'select') new_value = $(this).val(); else new_value = $(this).text(); var data = {}; data[$(this).data('field')] = new_value; $.ajax({ context: _this, data: { data: data }, method: 'POST', url: $(this).data('save-url'), complete: function(req, status) { $(this).data('loading', '0'); }, success: function(data, status, req) { if(data.status == 'error') { if($(this).data('show-errors')) { var result = ''; var message = data.message; for(var key in message) { if(typeof(message[key]) === 'object') { if(result) result += ' - '; result += key + ': ' + message[key].join('; '); } } if(result) alert(result); } } else { $(this).data('field-value', new_value); if($(this).data('content')) { var old_text = $(this).text(); var old_class = $(this).attr('class'); var content = $($(this).data('content')); $(this).text(content.text()); $(this).attr('class', content.attr('class')); content.text(old_text); content.attr('class', old_class); $(this).data('content', content); } } } }); } } // Init $(document).ready(function() { // Setup dynamic fields $('.active_admin .input [data-if], .active_admin .input [data-function], .active_admin .input [data-eq], .active_admin .input [data-not]').each(function() { dfSetupField($(this)); }); // Setup dynamic fields for has many associations $('.active_admin .has_many_container').on('has_many_add:after', function(e, fieldset, container) { $('.active_admin .input [data-if], .active_admin .input [data-function], .active_admin .input [data-eq], .active_admin .input [data-not]').each(function() { dfSetupField($(this)); }); }); // Set dialog icon link $('.active_admin [data-df-icon]').each(function() { $(this).append(' »'); // ' •' }); // Open content in dialog $('.active_admin [data-df-dialog]').on('click', function(event) { event.preventDefault(); $(this).blur(); if($('#df-dialog').data('loading') != '1') { $('#df-dialog').data('loading', '1'); if($('#df-dialog').length == 0) $('body').append('
'); var title = $(this).attr('title'); $.ajax({ url: $(this).attr('href'), complete: function(req, status) { $('#df-dialog').data('loading', '0'); }, success: function(data, status, req) { if(title) $('#df-dialog').attr('title', title); $('#df-dialog').html(data); $('#df-dialog').dialog({ modal: true }); }, }); } }); // Inline editing $('[data-field][data-field-type="boolean"][data-save-url]').each(function() { $(this).on('click', $.proxy(dfUpdateField, $(this))); }); $('[data-field][data-field-type="string"][data-save-url]').each(function() { $(this).data('field-value', $(this).text()); var fnUpdate = $.proxy(dfUpdateField, $(this)); $(this).on('blur', function() { if($(this).data('field-value') != $(this).text()) fnUpdate(); }); }); $('[data-field][data-field-type="select"][data-save-url]').each(function() { $(this).on('change', $.proxy(dfUpdateField, $(this))); }); });