(function( $, cme, jscme, csscme ) { 'use strict'; /** @since 4.2.0 manage editor loading errors */ const $codemirror = $('#cf7-codemirror'), $formEditor = $('#contact-form-editor'), $wpcf7Editor = $('textarea#wpcf7-form-hidden'), $editorTabs = $('#form-editor-tabs'), $optionals= $('#optional-editors'), $topTags =$('#top-tags').addClass('click-disabled'), $bottomTags =$('#bottom-tags').addClass('click-disabled'); let eh = $formEditor.height(), ew =$formEditor.width(); $('.loading-screen',$formEditor).css('padding','250px 5px '+(eh-100)+'px 5px'); $('#publish').prop('disabled', true); window.onerror= function(msg, source, lineno, colno, error){ let $loadScreen = $('.loading-screen',$formEditor); if($loadScreen.is(':visible')){ $loadScreen.html('

'+cf7sgeditor.jserror+'
'+msg+'
(file: '+source+', line: '+lineno+'
'+error+')

'); if($codemirror.children('.CodeMirror')){ let load = window.confirm(cf7sgeditor.fixhtmlform); if(load){ $loadScreen.hide(); $editorTabs.children('ul').hide(); $optionals.hide(); $topTags.hide(); $bottomTags.hide(); $('#publish').prop('disabled', false); } } } } CodeMirror.defineMode("shortcode", function(config, parserConfig) { let scOverlay = { token: function(stream, state) { let ch; if (stream.match(/^\[([a-zA-Z0-9_]+)\*?\s?/)) { while ((ch = stream.next()) != null){ if (ch == "]" ) { //stream.eat("]"); return "shortcode"; } } }else if(stream.match(/data-([a-z0-9_]+)/)){ while ((ch = stream.next()) != null){ if (ch == '=' ) { //stream.eat("]"); return "cf7sg-attr"; } } } while (stream.next() != null && !stream.match(/^\[([a-zA-Z0-9_]+)\*?\s?/, false) && !stream.match(/data-([a-z0-9_]+)/,false) ) {} return null; } }; return CodeMirror.overlayMode(CodeMirror.getMode(config, parserConfig.backdrop || "htmlmixed"), scOverlay); }); if(cf7sgeditor.mode.length>0) cme.setOption('mode',cf7sgeditor.mode); if(cf7sgeditor.theme.user.length>0) cme.setOption('theme',cf7sgeditor.theme.user); /** @since 4.4.4 enable tag matching in text editor, set after addon script is loaded */ cme.setOption('matchTags', {bothTags: true}); /** @since 4.0.0 manage user theme pref */ let $themeRadio = $('.codemirror-theme', $codemirror); if($(':input:checked', $themeRadio).length>0){ $themeRadio.on('change',':input',function(e){ cme.setOption("theme",cf7sgeditor.theme[e.target.value]); }); }else $(':input',$themeRadio).prop('disabled',true); $(document).ready( function(){ let codemirrorUpdated = false, formFields={}, $grid = $('#grid-form'), $jsTags = $('#js-tags'), gridTab = '#cf7-editor-grid', //default at load time. $jsCodemirror = $('#cf7-js-codemirror'), $cssCodemirror = $('#cf7-css-codemirror'), $jstext = $('textarea#cf7-form-js'), $csstext = $('textarea#cf7-form-css'), jscmUpdated = false, jsInsertAtLine = false, csscmUpdated = false, cssInsertAtLine = false, $jsThemeRadio = $('.codemirror-theme', $jsCodemirror), $cssThemeRadio = $('.codemirror-theme', $cssCodemirror), $cf7Tabs = $('#contact-form-editor-tabs'); /** @since 4.11 update the hidden cf7 textarea when the cf7 tabs are achanged.*/ $cf7Tabs.on('mousedown', 'li',function(e){ let active = e.delegateTarget.querySelector('.ui-state-active'); if( active && 'form-panel-tab' == active.id){ $wpcf7Editor.text(cme.getValue()); } }) const $cf7key = $('#post_name'); $.fn.beautify = function(cursor){ let cm = cme, $this=$(this); if($this.is('#cf7-js-codemirror')) cm = jscme; else if($this.is('#cf7-css-codemirror')) cm = csscme; cm.setSelection({ 'line':cm.firstLine(), 'ch':0, 'sticky':null },{ 'line':cm.lastLine(), 'ch':0, 'sticky':null }, {scroll: false}); cm.indentSelection("smart"); cm.setCursor(cm.firstLine(),0,{scroll: false}); if('undefined' != typeof cursor && cursor.find(false)){ const from = cursor.from(), to = cursor.to(); cm.setSelection(CodeMirror.Pos(from.line, 0), to); cm.scrollIntoView({from: from, to: CodeMirror.Pos(to.line + 10, 0)}); } } //set codemirror editor value; cme.setValue($wpcf7Editor.text()); cme.setSize("100%"); // cme.setOption('viewportMargin',Infinity); $wpcf7Editor.on('grid-ready', function(){ //------ setup the codemirror editor //codemirror editor $codemirror.beautify(); cme.on('changes', function(){ codemirrorUpdated = true; const disabled = $editorTabs.tabs('option','disabled'); if(true===disabled){ const changes = $('
').append(cme.getValue()); if(0===changes.children().length || changes.children('.container').length>0){ $editorTabs.tabs('option',{disabled:false}); /** * @since 1.2.3 disable cf7sg styling/js for non-cf7sg forms. */ $('#is-cf7sg-form').val('true'); } } $formEditor.trigger('cf7sg-form-change'); }); //toogle body scroll off/on function disableBodyScroll(){ let $post = $('form#post'); $post.css('width',$post.width()+'px'); $('body').addClass('disable-scroll') } function enableBodyScroll(){ $('form#post').css('width','auto'); $('body').removeClass('disable-scroll') } //create tabs $editorTabs.tabs({ beforeActivate: function (event, ui){ enableBodyScroll(); //update the codemirror panel let panel = ''; if(ui.newPanel instanceof jQuery) panel = '#'+ui.newPanel.attr('id'); else if('undefined' != typeof ui.newPanel.selector) panel = ui.newPanel.selector; else console.log('CF7 GRID EDITOR: unknown tab ui panel object'); if('#cf7-codemirror' == panel){ //finalise any changes in the grid form editor $grid.on('cf7grid-form-ready', function(){ let code = $grid.CF7FormHTML(); if($grid.children('.container').length > 0){ //beautify. code = html_beautify(code , { 'indent_size': 2, 'wrap_line_length': 0 }); } cme.setValue(code); // cme.refresh(); //reset the codemirror change flag codemirrorUpdated = false; //remove id from textarea $('textarea#wpcf7-form').attr('id', ''); //change the wpcf7 textarea $('textarea.codemirror-cf7-update', $codemirror).attr('id', 'wpcf7-form'); //setup the form code in the hidden textarea $wpcf7Editor.html(code); }); /** @since 2.8.3 clear the codemirror textarea##wpcf7-form */ $('textarea.codemirror-cf7-update', $codemirror).val(''); $grid.trigger('cf7grid-form-finalise'); }else{ //remove id from textarea $('textarea#wpcf7-form').attr('id', ''); } }, activate: function( event, ui ) { if(ui.newPanel instanceof jQuery) gridTab = '#'+ui.newPanel.attr('id'); else if('undefined' != typeof ui.newPanel.selector) gridTab = ui.newPanel.selector; else console.log('CF7 GRID EDITOR: unknown tab ui panel object'); $topTags.show().addClass('click-disabled'); $bottomTags.show().addClass('click-disabled'); $jsTags.hide(); $optionals.hide(); $(window).scrollTop($('#form-panel').offset().top); switch(gridTab){ case '#cf7-editor-grid': //grid editor. $optionals.show(); if(codemirrorUpdated){ //update the hidden textarea $wpcf7Editor.text(cme.getValue()); //trigger rebuild grid event $grid.trigger('build-grid'); }else{ //try to set the focus on the 'cf7sgfocus element' const $focus = $('.cf7sgfocus', $grid); if($focus.length>0){ const scrollPos = $focus.offset().top - $(window).height()/2 + $focus.height()/2; //console.log(scrollPos); $(window).scrollTop(scrollPos); $focus.removeClass('cf7sgfocus'); } } break; case '#cf7-codemirror': //HTML editor. const cursor = cme.getSearchCursor('cf7sgfocus', CodeMirror.Pos(cme.firstLine(), 0), {caseFold: true, multiline: true}); $topTags.removeClass('click-disabled'); $bottomTags.removeClass('click-disabled'); $codemirror.beautify(cursor); cme.refresh(); break; case '#cf7-js-codemirror': //js editor. $topTags.hide(); $bottomTags.hide(); $jsTags.show(); let $form = $('
').html($grid.CF7FormHTML()); $('.display-none', $jsTags).removeClass('show-events'); if( $('div.container.cf7-sg-table', $form).length > 0){ $('#table-events', $jsTags).addClass('show-events'); } if( $('.container.cf7sg-collapsible', $form).not('.cf7sg-slider-section > .cf7sg-collapsible').length > 0){ $('#collapsible-events', $jsTags).addClass('show-events'); } if( $('div.container.cf7-sg-tabs-panel', $form).length > 0){ $('#tab-events', $jsTags).addClass('show-events'); } if( $('.cf7sg-slider-section', $form).length > 0){ $('#slider-events', $jsTags).addClass('show-events'); } //scan all fields. let cf7TagRegexp = /\[(.[^\s]*)\s*(.[^\s\]]*)[\s\[]*(.[^\[]*\"source:([^\s]*)\"[\s^\[]*|[.^\[]*(?!\"source:)[^\[]*)\]/img; //reset form fields. formFields={}; $('.field', $form).each(function(){ let $field = $(this), search = $field.text(), match = cf7TagRegexp.exec(search); while(null != match && match.length>2){ switch(match[1].replace('*','')){ case 'recaptcha': case 'recaptch': case 'acceptance': case 'submit': case 'save': match=null; break;//tags with no fields of interest. default: formFields[match[2]] = [match[2],match[0]]; if($field.is('.cf7-sg-tabs .field')) formFields[match[2]][0] += '_tab'; if($field.is('.container.cf7-sg-table .field')) formFields[match[2]][0] += '_row'; if(match[0].indexOf('class:select2')>0){ $('#field-events li.select2', $jsTags).addClass('show-events'); } if(match[1]==='dynamic_checkbox'){ $('#field-events li.hybriddd', $jsTags).addClass('show-events'); } match = cf7TagRegexp.exec(search); //search next. break; } } }); break; case '#cf7-css-codemirror': //css editor. $topTags.hide(); $bottomTags.hide(); break; } }, create: function(e){ //console.info("Created tab"); $('.ui-tabs-panel:not(#cf7-editor-grid)',$editorTabs).hover(disableBodyScroll, enableBodyScroll); $('.loading-screen',$formEditor).hide(); $('#publish').prop('disabled', false); } }); /** @since 4.0 js cm editor */ $.fn.createNewCMEditor = function(activate=false){ let $this = $(this); $this.each(function(activate){ let $this = $(this), ref, $theme, $text, cm, theme, $cm, mode,regex; if(!$this.is('a.button.cf7sg-cmtab')) return $this; ref = '#'+$this.next('div.display-none').attr('id'); $this.attr('href',ref); switch(ref){ case '#cf7-js-codemirror': $theme = $jsThemeRadio; $text = $jstext; cm = jscme; theme = cf7sgeditor.jstheme; $cm = $jsCodemirror; mode={name: "javascript", json: true}; $this.text('JS'); //enable helper popups. // regex = /(?<=\/\*)(.*?)(?=\s?\*\/)/im; regex = /^.*(\/\*)(.*?)(?=\s?\*\/)/im; $('a.helper', $jsTags).each(function(){ let $helper = $(this), text = regex.exec($helper.data('cf72post')); if('undefined' != typeof text[2]){ $helper.parent().append(''); } }); break; case '#cf7-css-codemirror': $theme = $cssThemeRadio; $text = $csstext; cm = csscme; theme = cf7sgeditor.csstheme; $cm = $cssCodemirror; mode = "css"; $this.text('CSS'); break; } $theme.append(''+$text.data('file')+''); //convert to css editor. $editorTabs.append($this.next('div.display-none').remove()); $text.data('form', $cf7key.val()); $this = $this.remove().wrap('
  • '); $editorTabs.children('ul').append($this.closest('li')); //set codemirror editor value; cm.setValue($text.text()); cm.setOption("mode", mode); cm.setSize("100%"); $cm.on('cf7sg-screen-resize',function(){cm.refresh()}); $cm.hover(disableBodyScroll, enableBodyScroll); $cm.removeClass('display-none').beautify(); if(theme.user.length>0) cm.setOption('theme',theme.user); if($(':input:checked', $theme).length>0){ $theme.on('change',':input',function(e){ cm.setOption("theme",theme[e.target.value]); }); }else $(':input',$theme).prop('disabled',true); $editorTabs.tabs('refresh'); // if(activate) $this.delay(300).click(); }); return $this; } //add requried cm editors. $('a.cf7sg-cmtab.required', $optionals).createNewCMEditor(); //else listen for user requirement. $optionals.click('a.cf7sg-cmtab',function(e){ $(e.target).createNewCMEditor(true) }); jscme.on('changes', function(e, changes){ jsInsertAtLine = false; let last = jscme.getLine(changes[changes.length-1].to.line); if(isEmpty(last) || ""==last.trim()) jsInsertAtLine = true; jscmUpdated = false; if(jscme.getValue().length>0){ jscmUpdated = true; $jstext.attr('data-form', $cf7key.val()); //set current form slug. } }); csscme.on('changes', function(e, changes){ cssInsertAtLine = false; let last = csscme.getLine(changes[changes.length-1].to.line); if(isEmpty(last) || ""==last.trim()) cssInsertAtLine = true; csscmUpdated = false; if(csscme.getValue().length>0){ csscmUpdated = true; $csstext.attr('data-form', $cf7key.val()); //set current form slug. } }); $cf7key.on('change',function(e){ let oldkey = $jstext.data('form'), newkey = $(this).val(), filepath; if( oldkey.length > 0 && oldkey != $cf7key.val() ){ /* update editor js */ jscme.setValue( jscme.getValue().replace('#'+oldkey, '#'+$cf7key.val()) ); $jstext.attr('data-form', newkey); jscmUpdated = true; } //update the file name. oldkey = $('.file',$jsThemeRadio).text(); oldkey = oldkey.substring(oldkey.indexOf('js/')+3, oldkey.indexOf('.js')); $('.file',$jsThemeRadio).text( $jstext.data('file').replace(oldkey, newkey) ); filepath = $jstext.data('file'); filepath = filepath.substring(filepath.indexOf('>>')+3); $('.prev-file:input', $jsThemeRadio).val(filepath); //css cm update. $('.file',$cssThemeRadio).text( $csstext.data('file').replace(oldkey, newkey) ); filepath = $csstext.data('file'); filepath = filepath.substring(filepath.indexOf('>>')+3); $('.prev-file:input', $cssThemeRadio).val(filepath); oldkey = $csstext.data('form'); if( oldkey.length > 0 && oldkey != $cf7key.val() ){ /* update editor js */ csscme.setValue( csscme.getValue().replace('#'+oldkey, '#'+$cf7key.val()) ); $csstext.data('form', newkey); csscmUpdated = true; } }); $('#js-tags').on('click','a.helper',function(e){ let $this = $(this), helper = $this.data('cf72post').replace('{$cf7_key}', $cf7key.val() ), enableArrayFields = false, line = jscme.getCursor().line; if(!$('#cf7sg-jstags-comments').is(':checked')){ helper = helper.replace(/^\n?\s*?\/\/.*\n?/gmi,''); } if($this.is('.all-fields')){ let fieldsText = '\n'; $.each(formFields, function(field, ftag){ fieldsText += " case '"+field+"': //"+field+" updated"; switch(ftag[0]){ case field+'_tab': fieldsText +=", tIdx is tab index.\n"; enableArrayFields=true; break; case field+'_row': fieldsText +=", rIdx is row index.\n"; enableArrayFields=true; break; case field+'_tab_row': fieldsText +=", tIdx is tab index / rIdx is row index.\n"; enableArrayFields=true; break; default: fieldsText +=".\n //do something\n"; break; } fieldsText +=" break;\n" }); let arrayFields = ''; if(enableArrayFields){ arrayFields = "//-----code to extract field name and tab/row index -----------\n"; arrayFields += "let search='', tIdx=0, rIdx=0;\n"; arrayFields += "if( $field.is('.cf7sgtab-field') || $field.is('.cf7sgrow-field') ){\n"; arrayFields += " $.each($field.attr('class').split(/\\s+/), function(idx, clss){\n"; arrayFields += " if(0==clss.indexOf('cf7sg-')){\n"; arrayFields += " clss = clss.replace('cf7sg-','');\n"; arrayFields += " search = new RegExp( '(?<='+clss+')(_tab-(\\\\d))?(_row-(\\\\d))?','gi' ).exec(fieldName);\n"; arrayFields += " switch(true){\n"; arrayFields += " case /\\d+/.test(search[2]*search[4]): //table within a tab.\n"; arrayFields += " tIdx = parseInt(search[2]);\n"; arrayFields += " rIdx = parseInt(search[4]);\n"; arrayFields += " break;\n"; arrayFields += " case /\\d+/.test(search[2]): //tab.\n"; arrayFields += " tIdx = parseInt(search[2]);\n"; arrayFields += " break;\n"; arrayFields += " case /\\d+/.test(search[4]): //row.\n"; arrayFields += " rIdx = parseInt(search[4]);\n"; arrayFields += " break;\n"; arrayFields += " }\n"; arrayFields += " fieldName = clss;\n"; arrayFields += " return false; //break out of each loop.\n"; arrayFields += " }\n });\n"; arrayFields += "}\n//------ end of code for field extraction ---------\n"; } helper = helper.replace('{$array_field_extraction}', arrayFields); helper = helper.replace('{$list_of_fields}', fieldsText); }else if($this.is('.select2 > a')){ let s='',g=''; $.each(formFields, function(field, ftag){ if(ftag[1].indexOf('class:select2') > 0){ s+= `${g}ccs2t['${ftag[0]}']={\n'placeholder':'',\n'dir':'ltr'\n};` g='\n'; } }); helper = helper.replace('{$select2_fields}', s); }else if($this.is('.hybriddd > a')){ let s='',g=''; $.each(formFields, function(field, ftag){ if(ftag[1].indexOf('dynamic_checkbox') > 0){ s+= `${g}cchddt['${ftag[0]}']={\n'placeholder':'',\n'checkboxes':true\n};` g='\n'; } }); helper = helper.replace('{$hybriddd_fields}', s); } if($this.data('insert')=='end'){ line = jscme.lastLine(); jscme.setCursor({'line':line,'ch':line.length}); } switch(line){ case 0: let il = jscme.lastLine(); if(il>1 && jscme.getLine(il).indexOf('(jQuery)')<0){ if(jscme.getLine(il-1).indexOf('(jQuery)')>0) il-=1; } jscme.setCursor({'line':il,'ch':0}); helper += "\n"; break; default: helper += "\n"; break; } jscme.replaceSelection(helper); line = jscme.getCursor().line; $jsCodemirror.beautify(); jscme.setCursor({'line':line,'ch':line.length}); }); /*@since 1.1.1 disable grid editor for existing cf7 forms*/ if(0==$grid.children('.container').length){ $editorTabs.tabs('option',{ active:1, disabled:[0]}); $topTags.removeClass('click-disabled'); $bottomTags.removeClass('click-disabled'); /** @since 1.2.3 disable cf7sg styling/js for non-cf7sg forms.*/ $('#is-cf7sg-form').val('false'); } //update the codemirror when tags are inserted $('form.tag-generator-panel .button.insert-tag').on('click', function(){ const $textarea = $('textarea#wpcf7-form'); if($textarea.is('.codemirror-cf7-update')){ const tag = $textarea.delay(100).val(); cme.replaceSelection(tag); $textarea.val(''); //clear. } }); /** @since 4.8.1 ensure latest HTML form is available to other tabs */ $grid.on('cf7sg-cf7tag-update', function(e){ //update HTML code to ensure latest UI form changes available to other tabs. $wpcf7Editor.html($grid.CF7FormHTML()); }) }); //-----------end codemirror editor setup $('form#post').submit(function(event) { const $this = $(this); $( window ).off( 'beforeunload' ); //remove event to stop cf7 script from warning on save event.preventDefault(); //this will prevent the default submit //close any open UI fields. $('.cf7-field-inner :input:visible').closeUIfield(); let $embdedForms = '',$formNoEmbeds = '', codeMirror =''; if('#cf7-editor-grid' == gridTab){ //set up the code in the cf7 textarea const $txta = $('textarea#wpcf7-form'); $txta.html($txta.val()+'\n'); codeMirror = html_beautify( $grid.CF7FormHTML(), { 'indent_size': 2, 'wrap_line_length': 0 } ); $('textarea#wpcf7-form-hidden').html(codeMirror); $formNoEmbeds = $('
    ').append(codeMirror); }else{//we are in text mode. codeMirror = cme.getValue(); $('textarea#wpcf7-form-hidden').html(codeMirror).val(codeMirror); $formNoEmbeds = $('
    ').append(codeMirror); } //since 1.8 remove cf7sgfocus class if present. $('.cf7sgfocus', $formNoEmbeds).removeClass('cf7sgfocus'); $embdedForms = $formNoEmbeds.find('.cf7sg-external-form').remove(); //setup sub-forms hidden field. const embeds = []; let hasTables = false, hasTabs = false, hasToggles=false; if($embdedForms.length>0){ $embdedForms.each(function(){ embeds[embeds.length] = $(this).data('form'); }); } $('#cf7sg-embeded-forms').val(JSON.stringify(embeds)); const cf7TagRegexp = /\[(.[^\s]*)\s*(.[^\s]*)(|\s*(.[^\[]*))\]/img; /** @since 3.0.0 determine scripts required */ let scriptClass =""; if(codeMirror.indexOf("class:sgv-")>0) scriptClass += "has-validation,"; if(codeMirror.indexOf("class:select2")>0) scriptClass += "has-select2,"; if(codeMirror.indexOf("class:nice-select")>0) scriptClass += "has-nice-select,"; /** @since 4.0 enable grouping of collapsible sections as slider */ if($('.cf7sg-collapsible', $formNoEmbeds).not('.cf7sg-slider-section > .cf7sg-collapsible').length>0){ scriptClass += "has-accordion,"; } if($('.cf7sg-slider-section', $formNoEmbeds).length>0) scriptClass += "has-slider,"; if(codeMirror.indexOf("[benchmark")>0) scriptClass += "has-benchmark,"; if(codeMirror.indexOf("[date")>0 || 00){ if('undefined' == typeof groupedToggles[group] ) groupedToggles[group] = []; groupedToggles[group].push(unique); } let match = cf7TagRegexp.exec(search); while (match != null) { fields[unique].push(match[2]); match = cf7TagRegexp.exec(search); //get the next match. } toggledFields.push(fields); /** @since 4.0.0 differentiate toggles in tabed sections.*/ if($toggle.is('.cf7-sg-tabs .cf7sg-collapsible')) tabbedToggles.push(unique); hasToggles = true; }); //append hidden fields $this.append(' '); $this.append(' '); $this.append(' '); const disabled = $editorTabs.tabs('option','disabled'); $this.append(' '); //update script classes since v3. if(hasTabs) scriptClass+="has-tabs,"; if(hasTables) scriptClass+="has-table,"; if(hasToggles) scriptClass+="has-toggles,"; if(!disabled) scriptClass+="has-grid,"; $this.append(''); $('#cf7sg-tabs-fields').val(JSON.stringify(tabFields)); $('#cf7sg-table-fields').val(JSON.stringify(tableFields)); $('#cf7sg-toggle-fields').val(JSON.stringify(toggledFields)); $('#cf7sg-tabbed-toggles').val(JSON.stringify(tabbedToggles)); $('#cf7sg-grouped-toggles').val(JSON.stringify(groupedToggles)); /** @since 4.0 enable js/css */ $jstext.text('');//empty. codeMirror = jscme.getValue(); if(jscmUpdated){ if(codeMirror.length>2) $jstext.html(codeMirror); }else if(codeMirror.length>1) $jstext.prop('disabled',true); $csstext.text('');//empty. codeMirror = csscme.getValue(); if(csscmUpdated){ if(codeMirror.length>2) $csstext.html(csscme.getValue()); }else if(codeMirror.length>1) $csstext.prop('disabled',true); // continue the submit unbind preventDefault. /** @since 4.4.3 conditional cf7 plugin hack.*/ if ('undefined' != typeof wpcf7cf && wpcf7cf.currentMode == 'normal' && wpcf7cf.getnumberOfFieldEntries() > 0) { wpcf7cf.copyFieldsToText(); } $this.unbind('submit').submit(); }); /* Function to convert the UI form into its html final form for editing in the codemirror and/or saving to the CF7 plugin. */ $.fn.CF7FormHTML = function(){ const $this = $(this); if( !$this.is('#grid-form') ){ return ''; } const $form = $('
    ').append( $this.html() ); let text=''; //remove the external forms const external = {}; $('.cf7sg-external-form', $form).each(function(){ const $exform = $(this), id = $exform.data('form'); external[id] = $exform.children('.cf7sg-external-form-content').remove(); $exform.children('.form-controls').remove(); }); //remove the row controls $('.row', $form).removeClass('ui-sortable').children('.row-controls').remove(); //remove the collapsible input $('.container.cf7sg-collapsible', $form).each(function(){ const $this = $(this),cid = $this.attr('id'), $title = $this.children('.cf7sg-collapsible-title'); let text = $title.children('label').children('input[type="hidden"]').val(); $title.children('label').remove(); let toggle = ''; if($this.is('.with-toggle')){ toggle=' toggled'; } text = ''+text+''; $title.html(text + $title.html()); }); //remove tabs inputs $('ul.cf7-sg-tabs-list li label', $form).remove(); const cf7TagRegexp = /\[(.[^\s]*)\s*(.[^\s]*)(|\s*(.[^\[]*))\]/img, cf7sgToggleRegex = /class:cf7sg-toggle-(.[^\s]+)/i; //remove textarea and embed its content $('.columns', $form).each(function(){ const $this = $(this), $gridCol = $this.children('.grid-column'), $text = $('textarea.grid-input', $gridCol); $this.removeClass('ui-sortable'); if($text.length>0){ let text = $text.text(); //verify if this column is within a toggled section. const $toggle = $this.closest('.container.cf7sg-collapsible.with-toggle'); if($toggle.length>0){ const cid = $toggle.attr('id'); /** * track toggled checkbox/radio fields, because they are not submitted when not filled. *@since 2.1.5 */ const $field = $text.siblings('div.cf7-field-type'); let isToggled = false; if($field.length>0){ if($field.is('.checkbox.required') || $field.is('.radio') || $field.is('.file.required')) isToggled = true; }else isToggled = true; //custom column, needs checking. if(isToggled){ let search = text, match = cf7TagRegexp.exec(search); while (match != null) { switch(match[1]){ case 'checkbox*': case 'radio': case 'file*': let options = ''; if(match.length>4){ const tglmatch = cf7sgToggleRegex.exec(match[4]); if(tglmatch != null){ if(tglmatch[1] == cid) break; options =match[4].replace(tglmatch[0],'class:cf7sg-toggle-'+cid); }else{ options = 'class:cf7sg-toggle-'+cid+' '+match[4]; } }else{ options = 'class:cf7sg-toggle-'+cid; } text = text.replace(match[0], '['+match[1]+' '+match[2]+' '+options+']'); //hasRadios = true; break; } //console.log('match'+match[2]); match = cf7TagRegexp.exec(search); //get the next match. } }//end isToggled. } $this.html('\n'+text); }//else this column is a grid. $gridCol.remove(); }); //reinsert the external forms $('.cf7sg-external-form', $form).each(function(){ const $this = $(this); let id = $this.data('form'); $this.append( external[id] ); }); text = $form.html(); if($grid.children('.container').length > 0){ //strip tabs/newlines text = text.replace(/^(?:[\t ]*(?:\r?\n|\r))+/gm, ""); } return text; } });//document ready end //empty checks for undefined, null, false, NaN, '' function isEmpty(v){ if('undefined' === typeof v || null===v) return true; return typeof v === 'number' ? isNaN(v) : !Boolean(v); } })( jQuery, codeMirror_5_32, jsCodeMirror_5_32, cssCodeMirror_5_32);