/************************************* * SPDX-FileCopyrightText: 2009-2020 Vtenext S.r.l. * SPDX-License-Identifier: AGPL-3.0-only ************************************/ /* crmv@64542 crmv@69398 crmv@102879 crmv@105127 */ var ModuleMaker = { busy: false, // I know this is a bad idea, but the Unicode support in javascript regex sucks! allowedSpecialChars: 'àèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇߨøÅ寿œ', showBusy: function() { var me = this; me.busy = true; jQuery('#mmaker_busy').show(); }, hideBusy: function() { var me = this; me.busy = false; jQuery('#mmaker_busy').hide(); }, createNew: function() { if (this.busy) return; this.showBusy(); location.href = 'index.php?module=Settings&action=ModuleMaker&parentTab=Settings&mode=create&module_maker_step=1'; }, importNew: function() { if (this.busy) return; this.showBusy(); location.href = 'index.php?module=Settings&action=ModuleMaker&parentTab=Settings&mode=import&module_maker_step=1'; }, editModule: function(modid) { if (this.busy) return; this.showBusy(); location.href = 'index.php?module=Settings&action=ModuleMaker&parentTab=Settings&mode=edit&module_maker_step=1&moduleid='+modid; }, deleteModule: function(modid) { var me = this; if (me.busy) return; if (confirm(alert_arr.SURE_TO_DELETE)) { me.ajaxCall('delete_module', {moduleid:modid}, function(data) { me.gotoList(); }); } }, installModule: function(modid) { var me = this; if (me.busy) return; me.showPopupMessage('mmaker_message_installing'); me.ajaxCall('install_module', {moduleid:modid}, function(data) { me.gotoList(); }, { jsonData: true, callbackOnError: true, hidePopupMessage: true, }); }, uninstallModule: function(modid) { var me = this; if (me.busy) return; if (confirm(alert_arr.LBL_SURE_TO_UNINSTALL_MODULE)) { me.showPopupMessage('mmaker_message_uninstalling'); me.ajaxCall('uninstall_module', {moduleid:modid}, function(data) { me.gotoList(); }, { jsonData: true, callbackOnError: true, hidePopupMessage: true, }); } }, hidePopupMessage: function() { ModuleMakerFields.hideFloatingDiv('mmaker_div_message'); }, showPopupMessage: function(msg) { jQuery('.mmaker_message_text').hide(); jQuery('#'+msg).show(); ModuleMakerFields.showFloatingDiv('mmaker_div_message'); }, ajaxCall: function(action, params, callback, options) { var me = this; // return if busy if (me.busy) return; options = options || { includeForm: false, jsonData: true, callbackOnError: false, hidePopupMessage: true, }; params = params || {}; var url = "index.php?module=Settings&action=SettingsAjax&file=ModuleMaker&ajax=1&subaction="+action; if (options.includeForm) { var form = jQuery('#module_maker_form').serialize(); params = jQuery.param(params) + '&' + form; } me.showBusy(); jQuery.ajax({ url: url, type: 'POST', async: true, data: params, success: function(data) { me.hideBusy(); if (options.hidePopupMessage) me.hidePopupMessage(); if (options.jsonData) { // data should be json with a success property try { data = JSON.parse(data); } catch (e) { data = null; } if (data && data.success) { if (typeof callback == 'function') callback(data); } else if (data && data.error) { alert(data.error); } else { console.log('Unknown error'); console.log(data); } } else { if (typeof callback == 'function') callback(data); } }, error: function() { me.hideBusy(); if (options.hidePopupMessage) me.hidePopupMessage(); if (options.callbackOnError) { if (typeof callback == 'function') callback(); } } }); }, exportModule: function(modid, callback) { var me = this; me.ajaxCall('export', {moduleid: modid}, function(data) { if (data && data.url) { location.href = data.url; } }); }, gotoList: function() { var me = this; if (me.busy) return; me.showBusy(); location.href = 'index.php?module=Settings&action=ModuleMaker&parentTab=Settings'; }, openLogsPopup: function(modid) { var me = this; jQuery('#mmaker_logs_moduleid').val(modid); jQuery('#mmaker_select_log').val(''); jQuery('#mmaker_log_text').val(''); ModuleMakerFields.showFloatingDiv('mmaker_div_logs'); }, selectLog: function(callback) { var me = this; var modid = jQuery('#mmaker_logs_moduleid').val(); var logname = jQuery('#mmaker_select_log').val(); if (!logname) return; me.ajaxCall('getlog', {moduleid: modid, logname: logname}, function(data) { if (data && data.log) { jQuery('#mmaker_log_text').val(data.log); } }); }, gotoStep: function(step) { // set the inputs jQuery('#module_maker_step').val(step); // get the form and submit var form = document.getElementById('module_maker_form'); if (form) form.submit(); //location.href = 'index.php?module=Settings&action=ModuleMaker&parentTab=Settings&mode=create&step='+step+'&prevstep='+prevstep; }, getCurrentStep: function() { var step = parseInt(jQuery('#module_maker_prev_step').val()); return step; }, gotoNextStep: function() { var me = this, step = me.getCurrentStep(), nstep = step+1; if (!me.validateStep(step)) return false; me.hideError(); me.gotoStep(nstep); }, gotoPrevStep: function() { var me = this, step = me.getCurrentStep(), pstep = step-1; if (!me.validateStep(step)) return false; me.hideError(); me.gotoStep(pstep); }, hideNavigationButtons: function() { jQuery('#mmaker_div_navigation').hide(); }, showNavigationButtons: function() { jQuery('#mmaker_div_navigation').show(); }, validateStep: function(step) { var me = this, fname = 'validateStep'+step; if (typeof me[fname] == 'function') { return me[fname](); } return true; }, saveModule: function() { var me = this; jQuery('#module_maker_savedata').val('1'); me.gotoNextStep(); }, displayError: function(text) { var me = this; var div = jQuery('#mmaker_error_box'); var oldbg = div.css('background-color') || '#ffffff'; // set the text and show it div.text(text).show(); // don't animate if already doing it if (me.displayErrorAnimation) return false; // animate the background me.displayErrorAnimation = true; div.css({ 'background-color': '#ff7070', }); jQuery('#mmaker_error_box').animate({ 'background-color': oldbg, }, { duration: 600, complete: function() { me.displayErrorAnimation = false; } }); return false; }, hideError: function() { jQuery('#mmaker_error_box').hide().text(''); }, step1_getFieldLabel: function(fname) { var obj = jQuery('#'+fname).closest('tr').children('td').first().find('span').text() || fname; return obj }, step1_onModuleLabelKey: function(self) { var me = this, value = self.value; var slabel = me.step1_calculateSingleModuleLabel(value); jQuery('#mmaker_single_modlabel').val(slabel); var modname = me.step1_calculateModuleName(value); jQuery('#mmaker_modname').val(modname); var mainfield = alert_arr.LBL_NAME_S.replace('%s', slabel); jQuery('#mmaker_mainfield').val(mainfield); }, step1_calculateSingleModuleLabel: function(value) { var me = this; // :( there's no easy way to transform plural to singular, and in several languages // for now, just remove bad characters and keep latin chars var re = new RegExp('[^A-Za-z0-9_ '+me.allowedSpecialChars+'-]', "g"); value = value.replace(re, ''); return value; }, step1_calculateModuleName: function(value) { var me = this; if (!value) return ''; // the module name consists only of alphabetic chars, pure ASCII, no spaces or any other special symbols, camel case if possible var modname = value.replace(/_/g, ' ').replace(/[^a-zA-Z ]/g, '').toLowerCase(); modname = modname.replace(/ +(.)/g, function(match, group) { return group.toUpperCase(); }); modname = modname.charAt(0).toUpperCase() + modname.slice(1); modname = modname.substr(0, 20); return modname; }, validateStep1: function() { var me = this; var mlabel = jQuery('#mmaker_modlabel').val(); var mslabel = jQuery('#mmaker_single_modlabel').val(); var modname = jQuery('#mmaker_modname').val(); var mainfield = jQuery('#mmaker_mainfield').val(); // check emptyness if (!mlabel) return me.displayError(alert_arr.CANNOT_BE_EMPTY.replace('%s', me.step1_getFieldLabel('mmaker_modlabel'))); if (!mslabel) return me.displayError(alert_arr.CANNOT_BE_EMPTY.replace('%s', me.step1_getFieldLabel('mmaker_single_modlabel'))); if (!modname) return me.displayError(alert_arr.CANNOT_BE_EMPTY.replace('%s', me.step1_getFieldLabel('mmaker_modname'))); if (!mainfield) return me.displayError(alert_arr.CANNOT_BE_EMPTY.replace('%s', me.step1_getFieldLabel('mmaker_mainfield'))); // check length if (mlabel.length > 40) return me.displayError(alert_arr.LBL_TOO_LONG.replace('%s', me.step1_getFieldLabel('mmaker_modlabel'))); if (mslabel.length > 40) return me.displayError(alert_arr.LBL_TOO_LONG.replace('%s', me.step1_getFieldLabel('mmaker_single_modlabel'))); if (modname.length > 20) return me.displayError(alert_arr.LBL_TOO_LONG.replace('%s', me.step1_getFieldLabel('mmaker_modname'))); if (mainfield.length > 40) return me.displayError(alert_arr.LBL_TOO_LONG.replace('%s', me.step1_getFieldLabel('mmaker_mainfield'))); // check bad chars var re = new RegExp('[^A-Za-z0-9_ '+me.allowedSpecialChars+'-]'); var re2 = new RegExp('[^A-Za-z0-9]'); if (re.test(mlabel)) return me.displayError(alert_arr.NO_SPECIAL_CHARS_DOCS); if (re.test(mslabel)) return me.displayError(alert_arr.NO_SPECIAL_CHARS_DOCS); if (re2.test(modname)) return me.displayError(alert_arr.NO_SPECIAL_CHARS_DOCS); if (re.test(mainfield)) return me.displayError(alert_arr.NO_SPECIAL_CHARS_DOCS); return true; }, validateStep2: function() { var me = this; var uitype4Count = 0; var uitype10Mods = []; var block_count = jQuery('.blockheaderrow').length; for (var i=0; i 1) { alert(alert_arr.LBL_TOO_MANY_UITYPE4); return false; } // check for multiple uitype10 related mods } else if (field.uitype == 10) { var relmods = jQuery('#field_'+i+'_'+j+'_relatedmods').val().split(',') || []; for (var k=0; k= 0) { // already present alert(alert_arr.LBL_SAMEMODULERELATED.replace('%s', relmods[k])); return false; } else { uitype10Mods.push(relmods[k]); } } } } } return true; }, validateStep3: function() { var me = this; var maxFields = parseInt(jQuery('#filter_tot_columns').val()) || 9; var filternos = [ parseInt(jQuery('#filter_no').val()), parseInt(jQuery('#relfilter_no').val()), ]; // check the fields for uniqueness and emptyness for (var j=0; j= 0) { alert(alert_arr.LBL_FILTER_FIELD_MORE_THAN_ONCE); return false; } else { cols.push(col); } } } if (cols.length == 0) { alert(alert_arr.LBL_SELECT_AT_LEAST_ONE_FIELD); return false; } } return true; }, validateStep4: function() { var me = this; // nothing to validate here return true; }, validateStep5: function() { var me = this; return true; }, validateStep6: function() { var me = this; return true; }, }; // handles the fields/blocks var ModuleMakerFields = { busy: false, activeFloatingDiv: null, newFieldSelected: null, newFieldProperties: ['label', 'length', 'decimals', 'picklistvalues', 'relatedmods', 'autoprefix', 'onclick', 'code', 'users', 'columns', 'newline'], //crmv@98570 crmv@101683 crmv@102879 crmv@106857 newFieldsDefaults: null, // this is populted from the tpl newTableFieldsDefaults: null, centerFloatingDiv: function(div) { var me = this; var divobj = me.getJQueryObject(div); divobj.css("top", Math.max(0, ((jQuery(window).height() - divobj.outerHeight()) / 2)) + "px"); divobj.css("left", Math.max(0, ((jQuery(window).width() - divobj.outerWidth()) / 2)) + "px"); }, getJQueryObject: function(ref) { if (typeof ref == 'string') { ref = '#'+ref; } return jQuery(ref); }, showFloatingDiv: function(div, center) { var me = this; if (me.activeFloatingDiv) return; if (typeof center == 'undefined') center = true; var divobj = me.getJQueryObject(div); divobj.show(); if (center) me.centerFloatingDiv(div); divobj.css({ 'z-index': findZMax()+1, }); }, hideFloatingDiv: function(div) { var me = this; var divobj = me.getJQueryObject(div); divobj.hide(); me.activeFloatingDiv = null; }, isBusy: function() { return this.busy; }, showBusy: function() { var me = this; me.busy = true; jQuery('#mmaker_busy').show(); }, hideBusy: function() { var me = this; me.busy = false; jQuery('#mmaker_busy').hide(); }, ajaxCall: function(action, params, callback, options) { var me = this; // return if busy if (me.isBusy()) return; options = options || {}; params = params || {}; var url = "index.php?module=Settings&action=SettingsAjax&file=ModuleMaker&ajax=1&subaction="+action; if (options.processMakerMode) url += '&processMakerMode=yes'; //crmv@96450 if (options.includeForm) { var form = jQuery('#module_maker_form').serialize(); params = jQuery.param(params) + '&' + form; } me.showBusy(); jQuery.ajax({ url: url, type: 'POST', async: true, data: params, success: function(data) { me.hideBusy(); jQuery('#mmaker_div_allblocks').hide().html(''); jQuery('#mmaker_div_allblocks').html(data).show(); if (typeof callback == 'function') callback(); }, error: function() { if (typeof callback == 'function') callback(); } }); }, changePanel: function(panelno, self) { var me = this; panelno = parseInt(panelno); // change inputs jQuery('#mmaker_currentpanelno').val(panelno); // change blocks jQuery('div.layoutBlock').each(function(idx, el) { var blockno = parseInt(el.id.replace('block_', '')); var blockpanel = parseInt(jQuery('#block_'+blockno+'_panelno').val()); if (blockpanel == panelno) { // show it! jQuery(el).show(); } else { // hide it! jQuery(el).hide(); } }); // change tabs var cell = jQuery(self).closest('td'); jQuery('#LayoutEditTabs .dvtSelectedCell').removeClass('dvtSelectedCell').addClass('dvtUnSelectedCell'); cell.removeClass('dvtUnSelectedCell').addClass('dvtSelectedCell'); }, openAddPanelPopup: function() { var me = this; // prepare values jQuery('#mmaker_addpanelname').val(''); me.showFloatingDiv('mmaker_div_addpanel'); }, savePanelsOrder: function() { var me = this, list = []; jQuery('#LayoutEditTabs input[name$=_panelno]').each(function(idx, el) { list.push(parseInt(jQuery(el).val())); }); me.ajaxCall('reorderpanels', { panelsorder: JSON.stringify(list), }, null, { includeForm: true, }); }, openRemovePanelPopup: function(panelno) { var me = this; jQuery('#delpanelno').val(panelno); jQuery('#delpanellist').val(''); // show all options jQuery('#delpanellist option').show(); // hide the one i want to remove jQuery('#delpanellist option[value='+panelno+']').hide(); me.showFloatingDiv('mmaker_div_delpanel'); // select the first visible jQuery('#delpanellist option:not(:hidden):eq(0)').prop('selected', true); }, delPanel: function() { var me = this; var delpanelno = jQuery('#delpanelno').val(); var movepanelno = jQuery('#delpanellist').val(); if (movepanelno === undefined || movepanelno === null || movepanelno === '') { return false; } me.ajaxCall('delpanel', { delpanelno: delpanelno, moveblocksno: parseInt(movepanelno), }, null, { includeForm: true, }); }, openMoveBlockPanelPopup: function(blockno) { var me = this, currpanel = jQuery('#mmaker_currentpanelno').val(); jQuery('#moveblockno').val(blockno); jQuery('#moveblockpanellist').val(''); // show all options jQuery('#moveblockpanellist option').show(); // hide the one i want to remove jQuery('#moveblockpanellist option[value='+currpanel+']').hide(); me.showFloatingDiv('mmaker_div_moveblockpanel'); // select the first visible jQuery('#moveblockpanellist option:not(:hidden):eq(0)').prop('selected', true); }, moveBlockToPanel: function() { var me = this, blockno = jQuery('#moveblockno').val(), panelno = jQuery('#moveblockpanellist').val(); me.ajaxCall('moveblockpanel', { moveblockno: blockno, movepanelno: panelno, }, null, { includeForm: true, }); }, getBlocksForPanel: function(panelno) { var me = this, blocks = []; jQuery('div.layoutBlock').each(function(idx, el) { if (jQuery(el).data('panelno') == panelno) { var blockno = parseInt(el.id.replace('block_', '')); blocks.push(blockno); } }); return blocks; }, openAddBlockPopup: function() { var me = this, currpanel = jQuery('#mmaker_currentpanelno').val(), blocks = me.getBlocksForPanel(currpanel); // prepare values jQuery('#mmaker_addblockname').val(''); var first = null; jQuery('#addafterblock option').each(function(idx, el) { var bno = parseInt(el.value); if (blocks.indexOf(bno) >= 0) { jQuery(el).show(); if (!first) first = el; } else { jQuery(el).hide(); } }); if (first) { jQuery(first).prop('selected', true); } else { jQuery('#addafterblock').val(''); } me.showFloatingDiv('mmaker_div_addblock'); }, openAddFieldPopup: function(blockno) { var me = this; // unselect the previous field if (me.newFieldSelected) jQuery(me.newFieldSelected).removeClass('newFieldMnuSelected'); me.newFieldSelected = null; // hide all the properties jQuery('#mmaker_newfield_props').find('.newfieldprop').hide(); // set the block number jQuery('#mmaker_newfield_blockno').val(blockno); // show div me.showFloatingDiv('mmaker_div_addfield'); }, openAddTableFieldPopup: function(blockno, newfieldno, editno) { var me = this; // set the block number jQuery('#mmaker_newtablefield_blockno').val(blockno); jQuery('#mmaker_newtablefield_editfieldno').val(editno || ''); // show div me.showFloatingDiv('mmaker_div_addtablefield'); // fix the position and size function fixPosition() { var top = jQuery('#vte_menu').height() - 1; jQuery('#mmaker_div_addtablefield').css({ 'top' : top + 'px', 'height' : (jQuery(document).height() - top) + 'px', }); jQuery('#selectedcolumns').css({ 'height' : (jQuery(document).height() - top - 400) + 'px', }); } fixPosition(); // and do it also on resizing jQuery(window).resize(fixPosition); TableFieldConfig.removeAllBoxes(); var cont = jQuery('#selectedcolumns'); // initialize the sortable cont.sortable({ axis: 'x', containment: 'parent', distance: 10, opacity: 0.8, }); }, openEditTableFieldPopup: function(blockno, fieldno) { var me = this, fieldinfo = {}; jQuery('input[name^=field_'+blockno+'_'+fieldno+'_]').each(function(idx, el) { var pname = el.name.replace(/field_[0-9]+_[0-9]+_/, ''); fieldinfo[pname] = el.value; }); if (fieldinfo.columns) fieldinfo.columns = JSON.parse(fieldinfo.columns); me.openAddTableFieldPopup(blockno, null, fieldno); TableFieldConfig.setValues(fieldinfo); }, openAddRelatedField: function(blockno) { var me = this, fieldno = parseInt(jQuery('#newrelfieldno').val()); me.openAddFieldPopup(blockno); var link = jQuery('#newfield_'+fieldno), linkEl = link.get(0); if (linkEl && linkEl.onclick) { // click the item linkEl.onclick(); // scroll the div var div = link.closest('div'), divEl = div.get(0); if (divEl) { var divTop = div.position().top; trTop = link.closest('tr').position().top; div.scrollTop(trTop-divTop-20); } } }, openMoveFieldsPopup: function(blockno) { var me = this; // set the block number jQuery('#mmaker_movefields_blockno').val(blockno); // hide both divs jQuery('#mmaker_div_nomovefields').hide(); jQuery('#mmaker_div_selmovefields').hide(); var fieldCount = 0; // clean the values jQuery('#movefields_select').val(''); var opts = jQuery('#movefields_select').find('option'); opts.each(function(index, opt) { if (opt && opt.value) { var pieces = opt.value.split('_'), fblock = pieces[1]; if (fblock == blockno) { // hide the field jQuery(opt).hide(); } else { // show the field jQuery(opt).show(); ++fieldCount; } } }); var ogroups = jQuery('#movefields_select').find('optgroup'); ogroups.each(function(index, opt) { var name = jQuery(opt).attr('name'); if (name) { var bid = name.replace('movefield_group_', ''); if (bid == blockno) { jQuery(opt).hide(); } else { jQuery(opt).show(); } } }); // show the select if there are fields if (fieldCount > 0) { jQuery('#mmaker_div_selmovefields').show(); } else { jQuery('#mmaker_div_nomovefields').show(); } // show div me.showFloatingDiv('mmaker_div_movefields'); }, openEditFieldPopup: function(blockno, fieldno, uitype) { var me = this; // if it's a table field, open the special form if (uitype == 220) { return me.openEditTableFieldPopup(blockno, fieldno); } // set the block and field number jQuery('#mmaker_editfield_blockno').val(blockno); jQuery('#mmaker_editfield_fieldno').val(fieldno); // now check the values var mand = parseInt(jQuery('#field_'+blockno+'_'+fieldno+'_mandatory').val()); var massed = parseInt(jQuery('#field_'+blockno+'_'+fieldno+'_masseditable').val()); var uitype = parseInt(jQuery('#field_'+blockno+'_'+fieldno+'_uitype').val()); jQuery('#fieldprop_mandatory').prop('checked', mand); jQuery('#fieldprop_masseditable').prop('checked', massed); //crmv@96450 crmv@98570 jQuery('#fieldprop_readonly').val(jQuery('#field_'+blockno+'_'+fieldno+'_readonly').val()); jQuery('.fieldprop_picklistvalues').hide(); if (jQuery('#field_'+blockno+'_'+fieldno+'_picklistvalues').length > 0) { jQuery('.fieldprop_picklistvalues').show(); jQuery('#fieldprop_picklistvalues').val(jQuery('#field_'+blockno+'_'+fieldno+'_picklistvalues').val()); } jQuery('.fieldprop_default').hide(); if (uitype == 213) { jQuery('.fieldprop_onclick').show(); jQuery('.fieldprop_code').show(); jQuery('#fieldprop_onclick').val(jQuery('#field_'+blockno+'_'+fieldno+'_onclick').val()); jQuery('#fieldprop_code').html(jQuery('#field_'+blockno+'_'+fieldno+'_code').val().replace('\"','"')); } else { jQuery('.fieldprop_onclick').hide(); jQuery('.fieldprop_code').hide(); if (jQuery('#defaultValueContainer').length > 0) { jQuery('.fieldprop_default').show(); var fieldinfo = {}; jQuery("[id^='field_"+blockno+"_"+fieldno+"_']").each(function(k,v){ //crmv@110058 fieldinfo[v.name.replace("field_"+blockno+"_"+fieldno+"_",'')] = v.value; }); ProcessHelperScript.loadPopulateField(fieldinfo); } } //crmv@96450e crmv@98570e //crmv@101683 jQuery('.fieldprop_users').hide(); if (jQuery('#field_'+blockno+'_'+fieldno+'_users').length > 0) { jQuery('#fieldprop_users option').prop('selected',false); var users = jQuery('#field_'+blockno+'_'+fieldno+'_users').val().split(','); jQuery.each(users,function(k,v){ jQuery('#fieldprop_users option[value="'+v+'"]').prop('selected',true); }); jQuery('.fieldprop_users').show(); } //crmv@101683e //crmv@160837 if (jQuery('#fieldprop_fieldlabel').length > 0) { jQuery('#fieldprop_fieldlabel').val(jQuery('#field_'+blockno+'_'+fieldno+'_fieldlabel').val()); } //crmv@160837e // show div me.showFloatingDiv('mmaker_div_editfield'); }, //crmv@160837 openEditBlockPopup: function(blockno) { var me = this; jQuery('#mmaker_editblock_blockno').val(blockno); if (jQuery('#editlabel').length > 0) jQuery('#editlabel').val(jQuery('#block_'+blockno+'_label').val()); //if (jQuery('#editblocklabel').length > 0) jQuery('#editblocklabel').val(jQuery('#block_'+blockno+'_blocklabel').val()); // show div me.showFloatingDiv('mmaker_div_editblock'); }, editBlock: function(blockno) { var me = this; var blockno = jQuery('#mmaker_editblock_blockno').val(); var blockname = jQuery('#editlabel').val(); if (!blockname) { console.log('Block name is empty'); return; } me.ajaxCall('editblock', { editblockno: blockno, editlabel: jQuery('#editlabel').val(), //editblocklabel: jQuery('#editblocklabel').val(), }, function() { me.hideFloatingDiv('mmaker_div_editblock'); }, { includeForm: true, }); }, //crmv@160837e addPanel: function(panelname) { var me = this; var panelname = jQuery('#addpanelname').val(); if (!panelname) { console.log('Panel name is empty'); return; } me.ajaxCall('addpanel', { addpanelname: panelname, }, function() { me.hideFloatingDiv('mmaker_div_addpanel'); }, { includeForm: true, }); }, addBlock: function(blockname, after) { var me = this; var blockname = jQuery('#addblockname').val(); if (!blockname) { console.log('Block name is empty'); return; } me.ajaxCall('addblock', { addblockname: blockname, addafterblock: jQuery('#addafterblock').val(), }, function() { me.hideFloatingDiv('mmaker_div_addblock'); }, { includeForm: true, }); }, delBlock: function(blockno) { var me = this; me.ajaxCall('delblock', { delblockno: blockno, }, null, { includeForm: true, }); }, moveBlock: function(blockno, direction) { var me = this; me.ajaxCall('moveblock', { moveblockno: blockno, direction: direction, }, null, { includeForm: true, }); }, addField: function() { var me = this; var props = me.checkNewFieldProps(); if (!props) return; var fieldno = me.newFieldSelected.attr('id').replace('newfield_', ''); var blockno = jQuery('#mmaker_newfield_blockno').val(); me.ajaxCall('addfield', { blockno: blockno, addfieldno: fieldno, properties: JSON.stringify(props), }, null, { includeForm: true, }); }, moveField: function(blockno, fieldno, direction) { var me = this; me.ajaxCall('movefield', { blockno: blockno, movefieldno: fieldno, direction: direction, }, null, { includeForm: true, }); }, delField: function(blockno, fieldno) { var me = this; me.ajaxCall('delfield', { blockno: blockno, delfieldno: fieldno, }, null, { includeForm: true, }); }, checkNewFieldProps: function(baseid) { var me = this, props = {}; if (!baseid) baseid = 'newfield'; if (!me.newFieldSelected) { alert(alert_arr.FIELD_TYPE_NOT_SELECTED); return false; } for (var i=0; i 0 && row.is(':visible')) { var cont1 = row.find('input'), cont2 = row.find('textarea'), cont3 = row.find('select'); var cont = null; if (cont1.length > 0) cont = cont1.val(); else if (cont2.length > 0) cont = cont2.val(); else if (cont3.length > 0) cont = cont3.val(); if (!cont) { alert(alert_arr.LBL_FILL_ALL_FIELDS); return false; } else { props[me.newFieldProperties[i]] = cont; } } } // crmv@70622 // now check some numeric values var fieldno = me.newFieldSelected.attr('id').replace(baseid+'_', ''); if (fieldno == 2 && 'length' in props) { // TODO: don't use the raw number here if (parseInt(props.length) > 9) { var label = jQuery('#'+baseid+'prop_length').find('.dataLabel').text().replace(':', '').trim(); alert(label + alert_arr.SHOULDBE_LESS_EQUAL + '9'); return false; } } // crmv@70622e //crmv@106857 if (typeof(fieldcont) != 'undefined') { var fldname = fieldcont.find('input[name=fldname]').val(); props.fldname = fldname; } //crmv@106857e // TODO: check numeric values return props; }, checkNewTableFieldProps: function(baseid, index) { var me = this, props = {}; if (!baseid) baseid = 'newtablefield'; if (baseid == 'newtablefield') { var fieldcont = jQuery('#selectedcolumns div.selectedField').eq(index); } var allProps = me.newFieldProperties; allProps.push('readonly'); allProps.push('mandatory'); for (var i=0; i 0 && row.is(':visible')) { var cont1 = row.find('input[type=checkbox]'), cont2 = row.find('input'), cont3 = row.find('textarea'), cont4 = row.find('select'); var cont = null; if (cont1.length > 0) cont = cont1.prop('checked'); else if (cont2.length > 0) cont = cont2.val(); else if (cont3.length > 0) cont = cont3.val(); else if (cont4.length > 0) cont = cont4.val(); if (cont === null) { alert(alert_arr.LBL_FILL_ALL_FIELDS); return false; } else { props[propname] = cont; } } } // crmv@70622 // now check some numeric values var fieldno = fieldcont.find('input[name=fldno]').val(); props.fieldno = fieldno; if (fieldno == 2 && 'length' in props) { // TODO: don't use the raw number here if (parseInt(props.length) > 9) { var label = jQuery('#'+baseid+'prop_length').find('.dataLabel').text().replace(':', '').trim(); alert(label + alert_arr.SHOULDBE_LESS_EQUAL + '9'); return false; } } // crmv@70622e //crmv@106857 if (typeof(fieldcont) != 'undefined') { var fldname = fieldcont.find('input[name=fldname]').val(); props.fldname = fldname; } //crmv@106857e // TODO: check numeric values return props; }, getNewFieldDefault: function(fieldno, property) { var me = this, value = ''; if (me.newFieldsDefaults && me.newFieldsDefaults[fieldno]) { if (typeof me.newFieldsDefaults[fieldno][property] != 'undefined') { value = me.newFieldsDefaults[fieldno][property]; } } return value; }, getNewTableFieldsDefaults: function(fieldno, property) { var me = this, value = ''; if (me.newTableFieldsDefaults && me.newTableFieldsDefaults[fieldno]) { if (typeof me.newTableFieldsDefaults[fieldno][property] != 'undefined') { value = me.newTableFieldsDefaults[fieldno][property]; } } return value; }, selectNewField: function(newfieldno, props, uitype) { // crmv@102879 var me = this; if (uitype == 220) { var blockno = jQuery('#mmaker_newfield_blockno').val(); me.hideFloatingDiv('mmaker_div_addfield'); return me.openAddTableFieldPopup(blockno, newfieldno); } if (typeof props == 'string') { props = props.split(','); } else { props = []; } // unselect the previous field if (me.newFieldSelected) jQuery(me.newFieldSelected).removeClass('newFieldMnuSelected'); me.newFieldSelected = null; // hide all the properties jQuery('#mmaker_newfield_props').find('.newfieldprop').hide(); // select the field var fldobj = jQuery('#newfield_'+newfieldno); fldobj.addClass('newFieldMnuSelected'); me.newFieldSelected = fldobj; // show field properties for (var i=0; i 0) { var defaultValue = me.getNewFieldDefault(newfieldno, props[i]); row.find('input').val(defaultValue); row.find('select').val(defaultValue); row.find('textarea').val(defaultValue); row.show(); if (props[i] == 'label') { // set the focus for the title var el = row.find('input').get(0); if (el && el.focus) el.focus(); } } } }, moveFieldsToBlock: function() { var me = this, fieldstruct = {}; var blockno = jQuery('#mmaker_movefields_blockno').val(); var fields = jQuery('#movefields_select').val(); for (var i=0; i 0) props.masseditable = (jQuery('#fieldprop_masseditable').get(0).checked ? 1 : 0); if (jQuery('#fieldprop_readonly').length > 0) props.readonly = jQuery('#fieldprop_readonly').val(); if (jQuery('#fieldprop_picklistvalues').length > 0 && jQuery('#fieldprop_picklistvalues').is(':visible')) props.picklistvalues = jQuery('#fieldprop_picklistvalues').val(); if (jQuery('#fieldprop_default').length > 0 && jQuery('#fieldprop_default').is(':visible')) props.default = jQuery('#fieldprop_default').val(); //crmv@96450e //crmv@98570 if (jQuery('#fieldprop_onclick').length > 0 && jQuery('#fieldprop_onclick').is(':visible')) props.onclick = jQuery('#fieldprop_onclick').val(); if (jQuery('#fieldprop_code').length > 0 && jQuery('#fieldprop_code').is(':visible')) props.code = jQuery('#fieldprop_code').val(); //crmv@98570e if (jQuery('#fieldprop_users').length > 0 && jQuery('#fieldprop_users').is(':visible')) props.users = jQuery('#fieldprop_users').val().join(); //crmv@101683 //crmv@160837 if (jQuery('#fieldprop_fieldlabel').length > 0) { props.fieldlabel = jQuery('#fieldprop_fieldlabel').val(); props.label = jQuery('#fieldprop_fieldlabel').val(); } //crmv@160837e me.ajaxCall('editfield', { blockno: blockno, editfieldno: fieldno, properties: JSON.stringify(props), }, null, { includeForm: true, }); } } var TableFieldConfig = { addBox: function(fieldno, value, element, props, uitype) { var me = this, cont = jQuery('#selectedcolumns'), tpl = jQuery('#selectColumnTemplate'), box = tpl.clone(); if (typeof props == 'string') { props = props.split(','); } else { props = []; } var fieldCont = jQuery(element).closest('td'); var iconEl = fieldCont.find('i.vteicon'); if (iconEl.length == 0) { iconEl = fieldCont.find('i.vteicon2'); } if (iconEl.length > 0) { var boxIcon = box.find('i[name=fieldIcon]'); boxIcon.text(iconEl.text()); boxIcon.get(0).className = iconEl.get(0).className; } var labelEl = fieldCont.find('span.newFieldLabel'); if (labelEl.length > 0) { var boxName = box.find('span[name=fieldModuleName]'); boxName.text(labelEl.text()); } box.find('input[name=fldno]').val(fieldno); if (value != null && typeof(value.fieldname) != 'undefined') box.find('input[name=fldname]').val(value.fieldname); //crmv@106857 box.removeAttr('id'); box.show().removeAttr('style'); // show field properties for (var i=0; i 0) { if (props[i] == 'label') { // set the focus for the title var el = box.find('input[name=fieldLabel]').get(0); if (el && el.focus) { // set the default if (value && value.label) { jQuery(el).val(value.label); } else { // wait until the box is added to the dom setTimeout(function() { el.focus(); }, 100); } } } else { if (value && props[i] in value) { var defaultValue = value[props[i]]; } else { var defaultValue = ModuleMakerFields.getNewTableFieldsDefaults(fieldno, props[i]); } //crmv@131239 if (props[i] == 'relatedmods') { if (typeof(defaultValue) == 'string') defaultValue = defaultValue.split(','); } //crmv@131239e row.find('input').val(defaultValue); row.find('input[type=checkbox]').prop('checked', !!defaultValue); row.find('select').val(defaultValue); row.find('textarea').val(defaultValue); if (props[i] == 'readonly') { var readSelect = row.find('select').get(0); setTimeout(function() { me.changePermission(readSelect); }, 100); } //crmv@106857 if (props[i] == 'users') { if (value != null && typeof(value.selected_values) == 'undefined' && typeof(value.users) != 'undefined') value.selected_values = (value.users).split(','); //crmv@155093 if (value != null && typeof(value.selected_values) != 'undefined') { jQuery.each(value.selected_values,function(k,v){ row.find('select').find('option[value="'+v+'"]').prop('selected',true); }); } } //crmv@106857e //crmv@131239 if (props[i] == 'relatedmods_selected') { if (defaultValue != null && typeof(defaultValue) != 'undefined') { if (typeof(defaultValue) == 'string') defaultValue = defaultValue.split(','); if (jQuery(defaultValue).length > 0) { jQuery.each(defaultValue,function(k,v){ box.find('[name=newtablefieldprop_relatedmods]').find('select').find('option[value="'+v+'"]').prop('selected',true); }); } } } //crmv@131239e row.show(); } } } cont.append(box); }, removeBox: function(self) { var me = this, target = jQuery(self).closest('.selectedField'); target.remove(); }, removeAllBoxes: function() { jQuery('#selectedcolumns').html(''); }, setValues: function(info) { var me = this, cont = jQuery('#selectedcolumns'); // field info jQuery('#newtablefieldprop_val_label').val(info.label); // crmv@190916 if (info.readonly == '0') info.readonly = '1'; jQuery('#newtablefieldprop_val_readonly').val(info.readonly); if ((typeof(info.mandatory) == 'boolean' && info.mandatory) || (typeof(info.mandatory) == 'string' && info.mandatory == '1')) jQuery('#newtablefieldprop_val_mandatory').prop('checked', true); TableFieldConfig.changePermission(jQuery('#newtablefieldprop_val_readonly')); // crmv@190916e // columns jQuery.each(info.columns, function(idx, col) { //crmv@131239 if (typeof(col.decimals) != 'undefined' && col.decimals > 0) var el = me.getElementByUitype(col.uitype, 'decimals'); else if (col.uitype == 300) // TODO var el = me.getElementByUitype(15); else var el = me.getElementByUitype(col.uitype); //crmv@131239e if (el) { me.addBox(el.dataset.fieldno, col, el, el.dataset.props, col.uitype); } }); }, getElementByUitype: function(uitype, prop) { //crmv@131239 var me = this, list = jQuery('#newtablefields .newFieldMnu'); for (var i=0; i -1) return list[i]; } else { if (list[i].dataset.uitype == uitype) return list[i]; } //crmv@131239e } return false; }, cancelConfig: function() { var me = this; me.closeConfig(); }, saveConfig: function() { var me = this, cont = jQuery('#selectedcolumns'), cols = cont.find('.selectedField'); if (!me.validateConfig()) return false; var fieldno = jQuery('#mmaker_newtablefield_fieldno').val(); var editno = jQuery('#mmaker_newtablefield_editfieldno').val(); var blockno = jQuery('#mmaker_newtablefield_blockno').val(); var props = { label: jQuery('#newtablefieldprop_val_label').val(), columns: [], // crmv@190916 readonly: jQuery('#newtablefieldprop_val_readonly').val(), mandatory: (jQuery('#newtablefieldprop_val_mandatory:checked').length > 0)?true:false, // crmv@190916e }; cols.each(function(idx, el) { var fprops = ModuleMakerFields.checkNewTableFieldProps('newtablefield', idx); if (!fprops) { props = false; return false; } props.columns.push(fprops); }); if (!props) return false; props.columns = JSON.stringify(props.columns); ModuleMakerFields.ajaxCall(editno ? 'editfield' : 'addfield', { blockno: blockno, addfieldno: fieldno, editfieldno: editno, properties: JSON.stringify(props), }, null, { includeForm: true, }); me.closeConfig(); }, closeConfig: function() { ModuleMakerFields.hideFloatingDiv('mmaker_div_addtablefield'); }, validateConfig: function() { var me = this, cont = jQuery('#selectedcolumns'), cols = cont.find('.selectedField'); // check table name var tname = jQuery('#newtablefieldprop_val_label').val(); if (!tname) { vtealert(alert_arr.LBL_PLEASE_CHOOSE_FIELDNAME); return false; } // check if no columns if (cols.length == 0) { vtealert(alert_arr.LBL_PLEASE_ADD_COLUMNS); return false; } // check column names for (var i=0; i\:\'\"\,\_]/ if (re2.test(label)) { vtealert(alert_arr.SPECIAL_CHARACTERS+" & < > ' \" : , _ "+alert_arr.NOT_ALLOWED); return false; } // crmv@167159e } return true; }, addSelectedFields: function() { var me = this; jQuery('#newtablefields .newFieldMnu.newFieldMnuSelected').each(function(idx, el) { var data = jQuery(el).data(); me.addBox(data.fieldno, null, el, data.props, data.uitype); }); }, toggleField: function(newfieldno, quickinsert) { var me = this; // unselect the previous field if (me.newFieldSelected) jQuery(me.newFieldSelected).removeClass('newFieldMnuSelected'); me.newFieldSelected = null; // select the field var fldobj = jQuery('#newtablefield_'+newfieldno); if (fldobj.hasClass('newFieldMnuSelected')) { fldobj.removeClass('newFieldMnuSelected'); } else { fldobj.addClass('newFieldMnuSelected'); } me.newFieldSelected = fldobj; if (quickinsert) { me.addSelectedFields(); } }, changePermission: function(self) { var me = this, readonly = jQuery(self).val(), cont = jQuery(self).closest('table'), contMand = cont.find('tr[name=newtablefieldprop_mandatory]'); if (readonly == 1) { contMand.show(); } else { contMand.hide(); contMand.find('input[type=checkbox]').prop('checked', false); } } } var ModuleMakerRelations = { busy: false, isBusy: function() { return this.busy; }, showBusy: function() { var me = this; me.busy = true; jQuery('#mmaker_busy').show(); }, hideBusy: function() { var me = this; me.busy = false; jQuery('#mmaker_busy').hide(); }, ajaxCall: function(action, params, callback, options) { var me = this; // return if busy if (me.isBusy()) return; options = options || {}; params = params || {}; var url = "index.php?module=Settings&action=SettingsAjax&file=ModuleMaker&ajax=1&subaction="+action; if (options.includeForm) { var form = jQuery('#module_maker_form').serialize(); params = jQuery.param(params) + '&' + form; } me.showBusy(); jQuery.ajax({ url: url, type: 'POST', async: true, data: params, success: function(data) { me.hideBusy(); /*jQuery('#mmaker_div_allblocks').hide().html(''); jQuery('#mmaker_div_allblocks').html(data).show();*/ if (options.reloadList) { jQuery('#mmaker_div_relations').hide().html(''); jQuery('#mmaker_div_relations').html(data).show(); } if (typeof callback == 'function') callback(data); }, error: function() { if (typeof callback == 'function') callback(); } }); }, hideAddButton: function() { jQuery('#mmaker_div_addrelation_button').hide(); }, showAddButton: function() { jQuery('#mmaker_div_addrelation_button').show(); }, showCreateRelation: function() { var me = this; me.hideAddButton(); ModuleMaker.hideNavigationButtons(); jQuery('#mmaker_div_relations').hide(); jQuery('#mmaker_div_addrelation').show(); // reset fields jQuery('#relation_type').val('1ton'); jQuery('#relation_module').val(''); jQuery('#relation_block').find('option').remove(); jQuery('#relation_field').val(''); var cont = jQuery('#mmaker_div_addrelation'); cont.find('.add_relation_field_1ton').show(); cont.find('.add_relation_field_nton').hide(); }, hideCreateRelation: function() { var me = this; jQuery('#mmaker_div_addrelation').hide(); jQuery('#mmaker_div_relations').show(); ModuleMaker.showNavigationButtons(); me.showAddButton(); }, changeFirstModule: function() { var me = this, types = ['1ton', 'nton'], myself = jQuery('#new_module_name').val(), mysingle = jQuery('#new_module_single_name').val(), firstmod = jQuery('#relation_first_module').val(), type = jQuery('#relation_type').val(), othertype = types[1-types.indexOf(type)]; var cont = jQuery('#mmaker_div_addrelation'); if (!firstmod) { jQuery('#relation_module').val(''); jQuery('#relation_module option').show(); jQuery('#relation_module').attr('disabled', true); } else if (firstmod == myself) { jQuery('#relation_module').val(''); jQuery('#relation_module option').show(); jQuery('#relation_module option[value='+firstmod+']').hide(); jQuery('#relation_module').attr('disabled', false); } else { jQuery('#relation_module option[value!='+myself+']').hide(); jQuery('#relation_module').val(myself); jQuery('#relation_module').attr('disabled', false); } me.changeModule(); }, changeRelationType: function() { var me = this, types = ['1ton', 'nton'], firstmod = jQuery('#relation_first_module').val(), type = jQuery('#relation_type').val(), othertype = types[1-types.indexOf(type)]; var cont = jQuery('#mmaker_div_addrelation'); cont.find('.add_relation_field_'+type).show(); cont.find('.add_relation_field_'+othertype).hide(); if (type == '1ton') { me.changeModule(); } }, changeModule: function() { var me = this, myself = jQuery('#new_module_name').val(), mysingle = jQuery('#new_module_single_name').val(), firstmod = jQuery('#relation_first_module').val(), module = jQuery('#relation_module').val(), type = jQuery('#relation_type').val(); if (type == '1ton') { // update blocks // remove the old options jQuery('#relation_block').find('option').remove(); // get the new ones if (module) { me.ajaxCall('getmoduleblocks', { blockmodule: module, firstmodule: firstmod, }, function(data) { if (data) { try { data = JSON.parse(data); var blocks = data.blocks; } catch (e) { var blocks = []; } var opts = ''; for (var i=0; i'+blocks[i].label+''; } jQuery('#relation_block').append(opts); if (data.singlename) { jQuery('#relation_field').val(data.singlename); } else if (module != myself) { jQuery('#relation_field').val(mysingle); } else { jQuery('#relation_field').val(''); } } }); } else { jQuery('#relation_block').find('option').remove(); jQuery('#relation_field').val(''); } } }, validateFields: function() { var me = this; var type = jQuery('#relation_type').val(); var module = jQuery('#relation_module').val(); var block = jQuery('#relation_block').val(); var field = jQuery('#relation_field').val(); if (!module || !type) { alert(alert_arr.LBL_FILL_ALL_FIELDS); return false; } if (type == '1ton') { if (!block || !field) { alert(alert_arr.LBL_FILL_ALL_FIELDS); return false; } } return true; }, createRelation: function() { var me = this; // validate the fields if (!me.validateFields()) return false; // save it! var type = jQuery('#relation_type').val(); var firstmodule = jQuery('#relation_first_module').val(); var module = jQuery('#relation_module').val(); var block = jQuery('#relation_block').val(); var field = jQuery('#relation_field').val(); me.ajaxCall('addrelation', { type: type, firstrelationmod: firstmodule, relationmod: module, blockname: block, fieldname: field, }, function(data) { me.hideCreateRelation(); }, { reloadList: true, includeForm: true, }); }, delRelation: function(relno) { var me = this; me.ajaxCall('delrelation', { delrelationno: relno, }, null, { reloadList: true, includeForm: true, }); }, delRelationN1: function(fieldname) { var me = this; me.ajaxCall('delrelation', { rel_n1: 1, delrelationfield: fieldname, }, null, { reloadList: true, includeForm: true, }); } } var ModuleMakerLanguages = { baseUrl: 'index.php?module=Settings&action=SettingsAjax&file=ModuleMaker&ajax=1', init: function(mode) { var me = this; var module = jQuery('#module_select').val(); var language = jQuery('#language_select').val(); var filter = jQuery('#filter_select').val(); var colNames = new Array(); var colModel = new Array(); var moduleoptions = {} var prop = ''; var propval = ''; jQuery('#module_select option').each(function(){ prop = jQuery(this).val(); propval = jQuery(this).text(); if (prop != ''){ moduleoptions[prop] = propval; } }); var grid = jQuery("#trans_table"), lastSel; var myEditOptions = { //beforeShowForm:me.before_show_edit, beforeSubmit:me.before, afterSubmit:me.after, bottominfo: ModuleMakerTrans.LBL_TRANS_MANDATORY }; // action column colNames.push(ModuleMakerTrans.LBL_TRANS_ACTIONS); colModel.push({name:'act',index:'act',width:25,align:'center',sortable:false,search:false,formatter:'actions', formatoptions:{ keys: true, delbutton: false, editbutton: true, editformbutton: true, editOptions:myEditOptions, }}); // module column colNames.push(ModuleMakerTrans.LBL_TRANS_MODULE+' *'); colModel.push({ name:'modulename', index:'modulename', editable: false, editrules:{required:true}, edittype:'select', editoptions:{value:moduleoptions}, search: false }); // label column /*colNames.push(ModuleMakerTrans.LBL_TRANS_LABEL+' *'); colModel.push({ name:'label', index:'label', editable:true, editrules:{required:true} });*/ // language columns var val = ''; var txt = ''; if (jQuery('#language_select').val() == '') { jQuery('#language_select option').each(function(){ if (jQuery(this).val() != ''){ colNames.push(jQuery(this).text()); val = jQuery(this).val(); colModel.push({ name: val, index: val, editable: true, edittype: 'textarea', editoptions: {size:"20"}, search: true }); } }); } else { val = jQuery('#language_select :selected').val(); colNames.push(jQuery('#language_select :selected').text()); colModel.push({name:val,index:val,editable:true,edittype:'textarea',editoptions:{size:"20"}}); } // urls var list_url = me.baseUrl+'&subaction=labels_list&module_select='+module+'&language_select='+language+'&filter_select='+filter; var edit_url = me.baseUrl+'&subaction=labels_edit'; var edit_cell_url = me.baseUrl+'&subaction=labels_edit_cell'; // reload all if (mode == 'reload') { jQuery("#trans_table").jqGrid("setGridParam",{'url':list_url}).trigger("reloadGrid"); return; // rebuild (columns are different) } else if (mode == 'rebuild') { jQuery("#trans_table").jqGrid("GridUnload"); me.init(); return; } // init the grid grid.jqGrid({ url: list_url, editurl: edit_url, cellurl: edit_cell_url, cellEdit: true, // SUPER BUGGED, but with the handler on before selection, we can avoid the bug datatype: "json", colNames: colNames, colModel: colModel, repeatitems: false, autowidth: true, pager: '#trans_table_nav', gridview: true, rownumbers: true, viewrecords: true, rowNum: 20, rowList: [20,40,60,ModuleMakerTrans.LBL_TRANS_ALL], caption: '', multiselect: false, toppager:true, drag:true, height: '480px', //height:jQuery(document).height() - jQuery('#trans_table').offset().top - jQuery('#vte_footer').height()-85, jqModal:true, // BUGFIX: avoid selection bug with cellEdit enabled beforeSelectRow: function (rowid, e) { return false; }, }); // init the navigation bar grid.navGrid('#trans_table_nav', { refresh:false, search:false, edit:false, del: false, add: false, cloneToTop:true }); }, /*before_show_edit: function(formid) { jQuery('#modulename',formid).attr('disabled',true); jQuery('#label',formid).attr('readonly',true); },*/ /* before_show_add: function before_show_add(formid) { if (jQuery('#module_select').val() != ''){ jQuery('#modulename',formid).val(jQuery('#module_select').val()); } jQuery('#modulename',formid).attr('disabled',false); jQuery('#label',formid).attr('readonly',false); }, */ before: function(postdata, formid) { return [true,"",""]; }, after: function(response, postdata) { var response = response.responseText; response = eval('('+response+')'); if (response['confirm']){ if (confirm(response['msg'])){ response['success'] = true; } else{ response['success'] = false; response['msg'] = ''; } } return [response['success'],response['msg'],""]; }, } var ModuleMakerCodeEditor = { busy: false, openFile: '', pendingChanges: false, showBusy: function() { var me = this; me.busy = true; jQuery('#mmaker_busy').show(); jQuery('#mmaker_code_editor').attr('disabled', true); if (me.codeMirror) me.codeMirror.setOption('readOnly', true); }, hideBusy: function() { var me = this; me.busy = false; jQuery('#mmaker_busy').hide(); jQuery('#mmaker_code_editor').attr('disabled', false); if (me.codeMirror) me.codeMirror.setOption('readOnly', false); }, initEditor: function() { var me = this; var ta = document.getElementById('mmaker_code_editor'); if (ta) { // first set the size var w = jQuery(ta).width(); jQuery(ta).parent().css({width: w+'px'}); // then transform me.codeMirror = CodeMirror.fromTextArea(ta, { theme: 'eclipse', lineWrapping: false, indentUnit: 4, tabSize: 4, indentWithTabs: true, }); me.codeMirror.on("change", function() { me.changeCode(); }); } else { console.log('Textarea not found'); } }, fixEditorSize: function() { var me = this; if (me.codeMirror) { var ta = jQuery('#mmaker_code_editor').parent(); w = ta.width(), doch = jQuery(window).height(), pos = ta.position(); me.codeMirror.setSize(w, Math.max(300, doch-pos.top-80)); } }, getEditorText: function() { var me = this, text; if (me.codeMirror) { text = me.codeMirror.getDoc().getValue(); } else { // fallback on standard textarea text = jQuery('#mmaker_code_editor').val(); } return text; }, setEditorText: function(text, mode) { var me = this; if (!mode) mode = 'php'; if (me.codeMirror) { me.codeMirror.getDoc().setValue(''); me.codeMirror.setOption('mode', mode); me.fixEditorSize(); me.codeMirror.getDoc().setValue(text); } else { // fallback on standard textarea jQuery('#mmaker_code_editor').val(text); } }, ajaxCall: function(action, params, callback, options) { var me = this; // return if busy if (me.busy) return; options = options || {}; params = params || {}; var url = "index.php?module=Settings&action=SettingsAjax&file=ModuleMaker&ajax=1&subaction="+action; if (options.includeForm) { var form = jQuery('#module_maker_form').serialize(); params = jQuery.param(params) + '&' + form; } me.showBusy(); jQuery.ajax({ url: url, type: 'POST', async: true, data: params, success: function(data) { me.hideBusy(); if (typeof callback == 'function') callback(data); }, error: function() { me.hideBusy(); if (typeof callback == 'function') callback(); } }); }, openScriptEditor: function() { var me = this; ModuleMaker.hideNavigationButtons(); jQuery('#mmaker_step6_properties').hide(); jQuery('#mmaker_div_code_editor').show(); }, closeScriptEditor: function() { var me = this; jQuery('#mmaker_step6_properties').show(); jQuery('#mmaker_div_code_editor').hide(); ModuleMaker.showNavigationButtons(); }, loadEditableScript: function(moduleid) { var me = this, file = jQuery('#mmaker_code_select').val(); if (!file) return; if (me.pendingChanges) { if (confirm(alert_arr.LBL_WANT_TO_SAVE_PENDING_CHANGES)) { me.saveEditableScript(moduleid, function() { me.loadEditableScript(moduleid); }); return; } } me.openFile = false; me.ajaxCall('load_script', { moduleid: moduleid, script_file: file, }, function(data) { // load the script var mode = ''; // try to guess the mode if (file.match(/\.php$/i)) { mode = 'php'; } else if (file.match(/\.js$/i)) { mode = 'javascript'; } else if (file.match(/\.css$/i)) { mode = 'css'; } me.setEditorText(data, mode); me.pendingChanges = false; jQuery('#mmaker_code_save_btn').css({visibility: 'hidden'}); me.openFile = file; }); }, saveEditableScript: function(moduleid, callback) { var me = this, useredit = parseInt(jQuery('#mmaker_useredit').val()), file = me.openFile; if (!file) return; me.ajaxCall('save_script', { moduleid: moduleid, script_file: file, script_data: me.getEditorText(), }, function(data) { try { data = JSON.parse(data); } catch (e) { } if (data && data.success) { me.pendingChanges = false; jQuery('#mmaker_code_save_btn').css({visibility: 'hidden'}); if (useredit) { // already modified } else { // new modification jQuery('#mmaker_code_cancel_btn').hide(); window.location.reload(); } if (typeof callback == 'function') callback(); } else if (data.error) { alert(data.error); } else { console.log('Unknown error'); console.log(data); } }); }, resetEditableScripts: function(moduleid) { var me = this; if (!confirm(alert_arr.LBL_MMAKER_CONFIRM_RESET)) { return; } me.ajaxCall('reset_scripts', { moduleid: moduleid, }, function(data) { try { data = JSON.parse(data); } catch (e) { } if (data && data.success) { location.href = 'index.php?module=Settings&action=ModuleMaker&parentTab=Settings&mode=edit&module_maker_step=6&moduleid='+moduleid; } else if (data.error) { alert(data.error); } else { console.log('Unknown error'); console.log(data); } }); }, changeCode: function() { var me = this; if (me.openFile) { me.pendingChanges = true; jQuery('#mmaker_code_save_btn').css({visibility: 'visible'}); } }, }