From 0867417929c66ef4da6621838b431fc5d46ffcf1 Mon Sep 17 00:00:00 2001 From: xdrm-brackets Date: Mon, 19 Sep 2016 10:24:34 +0200 Subject: [PATCH] =?UTF-8?q?Gestion=20de=20la=20modification=20par=20r?= =?UTF-8?q?=C3=A9f=C3=A9rence=20fonctionnelle=20[FCT]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- js/lib/form-builder-min.js | 22 ++++++------- js/lib/form-builder.js | 58 +++++++++++++++++++++++++++------ js/lib/form-builder/main-min.js | 4 +-- js/lib/form-builder/main.js | 2 +- 4 files changed, 62 insertions(+), 24 deletions(-) diff --git a/js/lib/form-builder-min.js b/js/lib/form-builder-min.js index 91d1f59..900111e 100644 --- a/js/lib/form-builder-min.js +++ b/js/lib/form-builder-min.js @@ -1,12 +1,12 @@ -var ref=function(a,c){for(var e=null;null==e||a.hasOwnProperty(e);)e="$"+(1048576+Math.floor(15728639*Math.random())).toString(16)+"$";a[e]=c;return e},FormBuilder=function(a){this.form_object=a};FormBuilder.prototype={form_object:this.form_object,defs_object:{},parent_element:null,built_form:null,root_element:null,ref_table:{}}; +var ref=function(a,b){for(var e=null;null==e||a.hasOwnProperty(e);)e="$"+(1048576+Math.floor(15728639*Math.random())).toString(16)+"$";a[e]=b;return e},FormBuilder=function(a){this.form_object=a};FormBuilder.prototype={form_object:this.form_object,defs_object:{},parent_element:null,built_form:null,root_element:null,ref_table:{},ref_assoc:{}}; FormBuilder.regex={reg_in_key:/^\/\^(.+)\$\/$/,reg_out_val:/\{(\$[1-9])\}/,pri_out_val:/\{([a-z-]+)\}/g,pri_in_key:/^\$([a-z-]+)$/,arr_out_set:/^\{\{([a-z-]+)\}\}$/,arr_out_val:/\{([a-z-]+)\.([a-z-]+)\}/g,arr_in_key:/^\$\$([a-z-]+)$/,ref_pri:/^\$[a-f0-9]{6}\$$/};FormBuilder.spread_attr=["children","next_nodes","prev_nodes","attributes","node_link"];FormBuilder.allowed_attr="node node_type next_nodes prev_nodes attributes children text repeat".split(" "); -FormBuilder.prototype.add_definition=function(a){for(var c in a)this.defs_object[c]=a[c]};FormBuilder.prototype.build=function(a){a=null==a?{}:a;for(var c in a)a[c]=ref(this.ref_table,a[c]);this.built_form=JSON.parse(JSON.stringify(this.form_object));this.built_form=FormBuilder.formatFormObject(this.built_form,this.defs_object);this.built_form=FormBuilder.replaceStatements(this.built_form,a,this.defs_object,this.ref_table)}; -FormBuilder.prototype.attach=function(a){if(!(a instanceof Element)&&null==this.parent_element)return!1;this.parent_element=a instanceof Element?a:this.parent_element};FormBuilder.formatFormObject=function(a,c){if(a.hasOwnProperty("children"))for(var e in a.children)a.children[e].parent=a,FormBuilder.formatFormObject(a.children[e],c);return a}; -FormBuilder.fetchNodeDefinition=function(a,c){var e,d;r=FormBuilder.regex.reg_in_key;if("undefined"!=typeof c&&c.hasOwnProperty(a))return{def:c[a]};for(e in c)if(r.test(e)&&(d=new RegExp(e.slice(1,-1)),d.test(a))){matches={};for(d=1;dd;d++)matches["$"+d]=RegExp["$"+d];return{def:c[e],scope:matches}}return{}}; -FormBuilder.replaceStatements=function(a,c,e,d){a=a instanceof Object?a:{};c=c instanceof Object?JSON.parse(JSON.stringify(c)):{};var b,f;if(a.hasOwnProperty("scope")&&a.scope instanceof Object)for(b in a.scope)c[b]=a.scope[b];if(a.hasOwnProperty("node")&&"string"==typeof a.node&&(f=FormBuilder.fetchNodeDefinition(a.node,e),f.hasOwnProperty("def")&&(a.node_link=JSON.parse(JSON.stringify(f.def)),f.hasOwnProperty("scope"))))for(b in f.scope)c[b]=f.scope[b];for(b in a)"string"==typeof a[b]&&(a[b]=[a[b]], -f=FormBuilder.replaceStatementsArray(a[b][0],c),!1!==f?a[b]=f:(a[b]=FormBuilder.replaceStatementsRegex(a[b],c),a[b]=FormBuilder.replaceStatementsPrimary(a[b],c),a[b]=FormBuilder.replaceStatementsArrayValue(a[b],c)));for(b in a)FormBuilder.regex.pri_in_key.test(b)?c[b.substring(1)]=ref(d,a[b]):FormBuilder.regex.arr_in_key.test(b)&&(c[b.substring(2)]=ref(d,a[b]));c=JSON.parse(JSON.stringify(c));for(b in a)if(-1=e.lastIndex);)f=e.lastIndex,b.push(d);for(d=f=0;dd;d++)matches["$"+d]=RegExp["$"+d];return{def:b[e],scope:matches}}return{}}; +FormBuilder.replaceStatements=function(a,b,e,d){a=a instanceof Object?a:{};b=b instanceof Object?JSON.parse(JSON.stringify(b)):{};var c,f;if(a.hasOwnProperty("scope")&&a.scope instanceof Object)for(c in a.scope)b[c]=a.scope[c];if(a.hasOwnProperty("node")&&"string"==typeof a.node&&(f=FormBuilder.fetchNodeDefinition(a.node,e),f.hasOwnProperty("def")&&(a.node_link=JSON.parse(JSON.stringify(f.def)),f.hasOwnProperty("scope"))))for(c in f.scope)b[c]=f.scope[c];for(c in a)"string"==typeof a[c]&&(a[c]=[a[c]], +f=FormBuilder.replaceStatementsArray(a[c][0],b),!1!==f?a[c]=f:(a[c]=FormBuilder.replaceStatementsRegex(a[c],b),a[c]=FormBuilder.replaceStatementsPrimary(a[c],b),a[c]=FormBuilder.replaceStatementsArrayValue(a[c],b)));for(c in a)FormBuilder.regex.pri_in_key.test(c)?b[c.substring(1)]=ref(d,a[c]):FormBuilder.regex.arr_in_key.test(c)&&(b[c.substring(2)]=ref(d,a[c]));b=JSON.parse(JSON.stringify(b));for(c in a)if(-1=e.lastIndex);)f=e.lastIndex,c.push(d);for(d=f=0;d for( key in object ){ - [OPT] Objet contenant les variables à passer +* @scope [OPT] Objet contenant les variables à passer * */ FormBuilder.prototype.build = function(scope){ @@ -147,9 +147,14 @@ FormBuilder.prototype.build = function(scope){ scope = (scope == null) ? {} : scope; /* (2) On transforme toutes les variables en références */ - for( var key in scope ) + for( var key in scope ){ + // On enregistre la référence scope[key] = ref(this.ref_table, scope[key]); + // On enregistre l'association, pour modifier plus tard + this.ref_assoc[key] = scope[key]; + } + /* [1] On clone l'object =========================================================*/ this.built_form = JSON.parse(JSON.stringify(this.form_object)); @@ -167,6 +172,33 @@ FormBuilder.prototype.build = function(scope){ }; +/* ON MODIFIE L'OBJET (scope uniquement) +* +* @scope [OPT] Objet contenant les variables à modifier +* +*/ +FormBuilder.prototype.update = function(scope){ + /* [0] Gestion du paramètres + ==================================================================*/ + /* (1) On initialise le scope vide s'il n'est pas donné */ + scope = (scope == null) ? {} : scope; + + /* (2) On récupère toutes les références des variables */ + for( var key in scope ){ + + // si on trouve l'association + if( this.ref_assoc.hasOwnProperty(key) ){ + + // On modifie la valeur + this.ref_table[ this.ref_assoc[key] ] = scope[key]; + + } + + } +}; + + + /* CONSTRUIT LES DOM ASSOCIE A L'OBJET CONSTRUIT * * @parent Element auquel rattacher le formulaire @@ -180,7 +212,7 @@ FormBuilder.prototype.attach = function(parent){ return false; this.parent_element = (parent instanceof Element) ? parent : this.parent_element; - + // TODO: Gestion de la création des éléments HTML /* [1] Chapter Title =========================================================*/ @@ -700,7 +732,7 @@ FormBuilder.replaceStatementsArrayValue = function(statements, scope){ * @return built Chaine recomposée * */ -FormBuilder.buildString = function(ref_table, parts){ +FormBuilder.readRef = function(ref_table, parts){ /* [0] Initialisation =========================================================*/ var i, built = ""; @@ -708,8 +740,14 @@ FormBuilder.buildString = function(ref_table, parts){ /* [1] Si c'est un tableau, on le retourne =========================================================*/ - if( typeof parts == 'string' && FormBuilder.regex.ref_pri.test(parts) ) - return ref_table[parts]; + if( typeof parts == 'string' && FormBuilder.regex.ref_pri.test(parts) ){ + + // tant qu'on a une référence + while( typeof parts == 'string' && FormBuilder.regex.ref_pri.test(parts) ) + parts = ref_table[parts]; + + return parts; + } /* [2] Sinon, on remplace par les valeurs @@ -721,7 +759,7 @@ FormBuilder.buildString = function(ref_table, parts){ // si le résultat est un tableau, on lance récursivement if( ref_table[parts[i]] instanceof Array ) - built += ''+ FormBuilder.buildString(ref_table, ref_table[parts[i]]); + built += ''+ FormBuilder.readRef(ref_table, ref_table[parts[i]]); // sinon else diff --git a/js/lib/form-builder/main-min.js b/js/lib/form-builder/main-min.js index c137778..37bcee5 100644 --- a/js/lib/form-builder/main-min.js +++ b/js/lib/form-builder/main-min.js @@ -1,4 +1,4 @@ document.body.innerHTML="";"use strict"; -var default_definition={input:{node_type:"input"},"/^h([1-6])$/":{node_type:"h{$1}"},br:{node_type:"br"},option:{node_type:"option"},select:{node_type:"select"},span:{node_type:"span"}},custom_definition={"/^input.([a-z]+)$/":{node:"input",attributes:{type:"{$1}","data-name":"{name}",value:"{value}",placeholder:":{placeholder}:"},next_nodes:[{node:"br"}]},"custom-select":{node:"span",attributes:{"class":"select-container nobold"},children:[{node:"select",attributes:{"data-name":"{name}"},children:[{node:"option", +var default_definition={input:{node_type:"input"},"/^h([1-6])$/":{node_type:"h{$1}"},br:{node_type:"br"},option:{node_type:"option"},select:{node_type:"select"},span:{node_type:"span"}},custom_definition={"/^input.([a-z]+)$/":{node:"input",attributes:{type:"{$1}","data-name":"{name}",value:"{value}",placeholder:"{placeholder}"},next_nodes:[{node:"br"}]},"custom-select":{node:"span",attributes:{"class":"select-container nobold"},children:[{node:"select",attributes:{"data-name":"{name}"},children:[{node:"option", attribute:{value:"{options.value}"},text:"{options.value}",repeat:"{{options}}"}]}],next_nodes:[{node:"br"}]}},form={node:"h4",attributes:{"data-icon":"o","class":"new-contact color2"},children:[{node:"input.hidden",$name:"uid",$value:"{uid}"},{node:"input.hidden",$name:"call",$value:"{call}"},{node:"input.hidden",$name:"sms",$value:"{sms}"},{node:"input.hidden",$name:"countcall",$value:"{countcall}"},{node:"input.hidden",$name:"countsms",$value:"{countsms}"},{node:"input.hidden",$name:"total",$value:"xx{countcall} calls + {countsms} sms to {number}xx"}, -{node:"input.text",$name:"number",$value:"{number}"},{node:"custom-select",$name:"existing",$$options:"{{options}}"}]},fb=new FormBuilder(form);fb.add_definition(default_definition);fb.add_definition(custom_definition);fb.build({uid:1,call:2,sms:3,countcall:4,countsms:5,number:"01 02 03 04 05",options:["a","b","c","d"]});console.log(fb.built_form);var str=function(a){return FormBuilder.buildString(fb.ref_table,a)}; +{node:"input.text",$name:"number",$value:"{number}"},{node:"custom-select",$name:"existing",$$options:"{{options}}"}]},fb=new FormBuilder(form);fb.add_definition(default_definition);fb.add_definition(custom_definition);fb.build({uid:1,call:2,sms:3,countcall:4,countsms:5,number:"01 02 03 04 05",options:["a","b","c","d"]});console.log(fb.built_form);var str=function(a){return FormBuilder.readRef(fb.ref_table,a)}; diff --git a/js/lib/form-builder/main.js b/js/lib/form-builder/main.js index 55f4215..fded33f 100644 --- a/js/lib/form-builder/main.js +++ b/js/lib/form-builder/main.js @@ -86,4 +86,4 @@ fb.build({ }); console.log(fb.built_form); -var str = function(attr){ return FormBuilder.buildString(fb.ref_table, attr); }; +var str = function(attr){ return FormBuilder.readRef(fb.ref_table, attr); };