(function($){ if(typeof acf === 'undefined') return; /* * Init */ var flexible = acf.getFieldType('flexible_content'); var model = flexible.prototype; /* * Actions */ // Layout: Clone model.events['click [data-acfe-flexible-control-clone]'] = 'acfeCloneLayout'; model.acfeCloneLayout = function(e, $el){ // Get Flexible var flexible = this; // Vars var $layout_original = $el.closest('.layout'); var $layout = $el.closest('.layout').clone(); // Fix TinyMCE attribute value $layout.find('textarea').each(function(){ $(this).html(this.value); }); // Clean Layout flexible.acfeCleanLayouts($layout); // Clone var $layout_added = flexible.acfeDuplicate({ layout: $layout, before: $layout_original }); // Scroll to new layout $('html, body').animate({ scrollTop: parseInt($layout_added.offset().top) - 200 }, 200); } // Layout: Copy model.events['click [data-acfe-flexible-control-copy]'] = 'acfeCopyLayout'; model.acfeCopyLayout = function(e, $el){ // Get Flexible var flexible = this; // Vars var $layout = $el.closest('.layout').clone(); // Fix inputs flexible.acfeFixInputs($layout); // Clean layout flexible.acfeCleanLayouts($layout); // Get layout data var data = JSON.stringify($layout[0].outerHTML); // Append Temp Input var $input = $('').appendTo($el); $input.attr('value', data).select(); // Command: Copy if(document.execCommand('copy')) alert('Layout has been transferred to your clipboard'); // Prompt else prompt('Copy the following layout data to your clipboard', data); // Remove the temp input $input.remove(); } // Flexible: Copy Layouts model.acfeCopyLayouts = function(){ // Get Flexible var flexible = this; // Get layouts var $layouts = flexible.$layoutsWrap().clone(); // Fix inputs flexible.acfeFixInputs($layouts); // Clean layout flexible.acfeCleanLayouts($layouts); // Get layouts data var data = JSON.stringify($layouts.html()); // Append Temp Input var $input = $('').appendTo(flexible.$el); $input.attr('value', data).select(); // Command: Copy if(document.execCommand('copy')) alert('Layouts have been transferred to your clipboard'); // Prompt else prompt('Copy the following layouts data to your clipboard', data); $input.remove(); } // Flexible: Paste Layouts model.acfePasteLayouts = function(){ // Get Flexible var flexible = this; var paste = prompt('Paste layouts data in the following field'); // No input if(paste == null || paste == '') return; try{ // Paste HTML var $html = $(JSON.parse(paste)); // Parsed layouts var $html_layouts = $html.closest('[data-layout]'); if(!$html_layouts.length) return alert('No layouts data available'); // init var validated_layouts = []; // Each first level layouts $html_layouts.each(function(){ var $this = $(this); // Validate layout against available layouts var get_clone_layout = flexible.$clone($this.attr('data-layout')); // Layout is invalid if(!get_clone_layout.length) return; // Add validated layout validated_layouts.push($this); }); // Nothing to add if(!validated_layouts.length) return alert('No corresponding layouts found'); // Add layouts $.each(validated_layouts, function(){ flexible.acfeDuplicate({ layout: $(this), before: false }); }); }catch(e){ console.log(e); alert('Invalid data'); } } // Flexible: Dropdown model.events['click [data-name="acfe-flexible-control-button"]'] = 'acfeControl'; model.acfeControl = function(e, $el){ // Get Flexible var flexible = this; // Vars var $dropdown = $el.next('.tmpl-acfe-flexible-control-popup').html(); // Init Popup var Popup = acf.models.TooltipConfirm.extend({ render: function(){ this.html(this.get('text')); this.$el.addClass('acf-fc-popup'); } }); // New Popup var popup = new Popup({ target: $el, targetConfirm: false, text: $dropdown, context: flexible, confirm: function(e, $el){ if($el.attr('data-acfe-flexible-control-action') == 'paste') flexible.acfePasteLayouts(); else if($el.attr('data-acfe-flexible-control-action') == 'copy') flexible.acfeCopyLayouts(); } }); popup.on('click', 'a', 'onConfirm'); } // Flexible: Duplicate model.acfeDuplicate = function(args){ // Arguments args = acf.parseArgs(args, { layout: '', before: false }); // Validate if(!this.allowAdd()) return false; // Add row var $el = acf.duplicate({ target: args.layout, append: this.proxy(function($el, $el2){ // append before if(args.before){ // Fix clone: Use after() instead of native before() args.before.after($el2); } // append end else{ this.$layoutsWrap().append($el2); } // enable acf.enable($el2, this.cid); // render this.render(); }) }); // trigger change for validation errors this.$input().trigger('change'); // return return $el; } // Flexible: Fix Inputs model.acfeFixInputs = function($layout){ $layout.find('input').each(function(){ $(this).attr('value', this.value); }); $layout.find('textarea').each(function(){ $(this).html(this.value); }); $layout.find('input:radio,input:checkbox').each(function() { if(this.checked) $(this).attr('checked', 'checked'); else $(this).attr('checked', false); }); $layout.find('option').each(function(){ if(this.selected) $(this).attr('selected', 'selected'); else $(this).attr('selected', false); }); } // Flexible: Clean Layout model.acfeCleanLayouts = function($layout){ // Clean WP Editor $layout.find('.acf-editor-wrap').each(function(){ var $input = $(this); $input.find('.wp-editor-container div').remove(); $input.find('.wp-editor-container textarea').css('display', ''); }); // Clean Date $layout.find('.acf-date-picker').each(function(){ var $input = $(this); $input.find('input.input').removeClass('hasDatepicker').removeAttr('id'); }); // Clean Time $layout.find('.acf-time-picker').each(function(){ var $input = $(this); $input.find('input.input').removeClass('hasDatepicker').removeAttr('id'); }); // Clean DateTime $layout.find('.acf-date-time-picker').each(function(){ var $input = $(this); $input.find('input.input').removeClass('hasDatepicker').removeAttr('id'); }); // Clean Color Picker $layout.find('.acf-color-picker').each(function(){ var $input = $(this); var $color_picker = $input.find('> input'); var $color_picker_proxy = $input.find('.wp-picker-container input.wp-color-picker').clone(); $color_picker.after($color_picker_proxy); $input.find('.wp-picker-container').remove(); }); // Clean Post Object $layout.find('.acf-field-post-object').each(function(){ var $input = $(this); $input.find('> .acf-input span').remove(); $input.find('> .acf-input select').removeAttr('tabindex aria-hidden').removeClass(); }); // Clean Page Link $layout.find('.acf-field-page-link').each(function(){ var $input = $(this); $input.find('> .acf-input span').remove(); $input.find('> .acf-input select').removeAttr('tabindex aria-hidden').removeClass(); }); // Clean Tab $layout.find('.acf-tab-wrap').each(function(){ var $wrap = $(this); var $content = $wrap.closest('.acf-fields'); var tabs = [] $.each($wrap.find('li a'), function(){ tabs.push($(this)); }); $content.find('> .acf-field-tab').each(function(){ $current_tab = $(this); $.each(tabs, function(){ var $this = $(this); if($this.attr('data-key') != $current_tab.attr('data-key')) return; $current_tab.find('> .acf-input').append($this); }); }); $wrap.remove(); }); // Clean Accordion $layout.find('.acf-field-accordion').each(function(){ var $input = $(this); $input.find('> .acf-accordion-title > .acf-accordion-icon').remove(); }); } /* * Spawn */ acf.addAction('new_field/type=flexible_content', function(flexible){ /* * Dropdown HTML */ var $dropdown_grey = $('' + '' + ' ' + '' + ''); var $dropdown_blue = $('' + '' + ' ' + '' + ''); // Remove potential duplicated buttons flexible.$el.find('> .acf-input > .acf-flexible-content > .acfe-flexible-stylised-button > .acf-actions > [data-name="acfe-flexible-control-button"]').remove(); flexible.$el.find('> .acf-input > .acf-flexible-content > .acf-actions > [data-name="acfe-flexible-control-button"]').remove(); // Add buttons flexible.$el.find('> .acf-input > .acf-flexible-content > .acfe-flexible-stylised-button > .acf-actions > .acf-button').after($dropdown_grey); flexible.$el.find('> .acf-input > .acf-flexible-content > .acf-actions > .acf-button').after($dropdown_blue); }); acf.addAction('acfe/flexible/layouts', function($layout, flexible){ var $controls = $layout.find('> .acf-fc-layout-controls'); // Remove Duplicated Buttons $controls.find('> .acfe-flexible-icon').remove(); // Add Buttons $controls.prepend('' + '' + ''); }); })(jQuery);