diff --git a/src/vitis/client/javascript/externs/formReader/formReaderDrtv.js b/src/vitis/client/javascript/externs/formReader/formReaderDrtv.js
index 48e7a37a22b78e1f1154bcaec9471d51e4a1c3a5..8bfa3d57fc4fdb53f6c9dad257cfbca34eed7c4c 100644
--- a/src/vitis/client/javascript/externs/formReader/formReaderDrtv.js
+++ b/src/vitis/client/javascript/externs/formReader/formReaderDrtv.js
@@ -420,9 +420,21 @@ formReader.formReaderDirective = function ($q, formReaderService, propertiesSrvc
                     if (formReaderService["isFunctionCall"](oField["visible"])) {
                         isVisible = formReaderService["callFunction"](oField["visible"]);
                     } else if(formReaderService["isTernaryString"](oField["visible"])) {
-                        isVisible = scope.$eval(oField["visible"]);
+                        try {
+                            isVisible = scope.$eval(oField["visible"]);
+                        } catch (e) {
+                            isVisible = false;
+                        }
+                    } else if(formReaderService["isCustomTernaryString"](oField["visible"])) {
+                        try {
+                            isVisible = scope.$eval(formReaderService["translateCustomTernaryString"](oField["visible"], scope['oFormValues'], scope['sFormDefinitionName']));
+                        } catch (e) {
+                            isVisible = false;
+                        }
                     } else if (goog.isBoolean(oField["visible"])) {
                         isVisible = oField["visible"];
+                    } else if (oField["visible"] == true || oField["visible"] == false || oField["visible"] == "true" || oField["visible"] == "false") {
+                        isVisible = oField["visible"];
                     } else {
                         isVisible = false;
                     }
@@ -614,6 +626,26 @@ formReader.formReaderDirective = function ($q, formReaderService, propertiesSrvc
                 });
             };
 
+            /**
+             * Transforme en int
+             *
+             * @param  {string} sField
+             * @return {number}
+             */
+            scope['int'] = scope['parseInt'] = function (sField) {
+                return parseInt(sField);
+            }
+
+            /**
+             * Transforme en float
+             *
+             * @param  {string} sField
+             * @return {number}
+             */
+            scope['float'] = scope['parseFloat'] = function (sField) {
+                return parseFloat(sField);
+            }
+
             // Attend la suppression du scope.
             scope.$on("$destroy", function () {
                 // Supprime toutes les données du formulaire.
diff --git a/src/vitis/client/javascript/externs/formReader/formReaderSrvc.js b/src/vitis/client/javascript/externs/formReader/formReaderSrvc.js
index f174cfef86ee19958d0c70f808509c9881e49bae..f3baa43a1fde7180abd8099aeeee8cc80fccfaaf 100644
--- a/src/vitis/client/javascript/externs/formReader/formReaderSrvc.js
+++ b/src/vitis/client/javascript/externs/formReader/formReaderSrvc.js
@@ -642,6 +642,9 @@ formReader.formReaderService = function ($translate, $rootScope, $q, $log, $time
                 bCheckFunction = true;
             var bReturn = false;
             if (typeof (sString) === "string") {
+                if (sString.substr(0, 1) === '=') {
+                    return false;
+                }
                 aMatchResult = sString.match(/(.+)\((.*)\)/);
                 if (aMatchResult !== null) {
                     if (bCheckFunction) {
@@ -678,6 +681,91 @@ formReader.formReaderService = function ($translate, $rootScope, $q, $log, $time
                 return false;
             }
         },
+        /**
+         * isCustomTernaryString function.
+         * La chaine de caractère passée est une expression ternaire définie par l'administrateur
+         * ex : "= {{puissance}} == 500"
+         * @param {string} sString Chaine de caractère.
+         * @return {boolean}
+         */
+        "isCustomTernaryString": function (sString) {
+            if (goog.isDefAndNotNull(this['translateCustomTernaryString'](sString))) {
+                return true;
+            } else {
+                return false;
+            }
+        },
+
+        /**
+         * translateCustomTernaryString function
+         * Traduit une chaine ternaire customisée par une chaine ternaire exploitable
+         * ex : "= {{puissance}} == 500" devient "oFormValues[sFormDefinitionName].puissance == 500 ? true : false"
+         * @param  {string} sString
+         * @param  {object} oFormValues
+         * @param  {string} sFormDefinitionName
+         * @return {string}
+         */
+        "translateCustomTernaryString": function (sString, oFormValues, sFormDefinitionName) {
+
+            // Verif type
+            if (!goog.isString(sString)) {
+                return null;
+            }
+
+            // Vérification chaine
+            if (sString.substr(0, 1) !== '=') {
+                return null;
+            }
+
+            if (!goog.isDefAndNotNull(RegExp('==').exec(sString))) {
+                return null;
+            }
+
+            // Enlève le premier signe "="
+            sString = sString.substr(1);
+
+            // Cherche les attributs
+            var aAttrs = [];
+            var attrRegex = RegExp('{{(\\w*?)}}','g');
+            var attrRegexResult;
+            while ((attrRegexResult = attrRegex.exec(sString)) !== null) {
+                aAttrs.push(attrRegexResult);
+            }
+
+            // Remplace les attributs
+            var sReplacer;
+            for (var i = 0; i < aAttrs.length; i++) {
+                if (goog.isDefAndNotNull(aAttrs[i][0]) && goog.isDefAndNotNull(aAttrs[i][1])) {
+
+                    // Pour les valeurs simples
+                    sReplacer = 'oFormValues[sFormDefinitionName].' + aAttrs[i][1];
+
+                    // Pour valeurs dans les listes déroulantes
+                    if (goog.isDefAndNotNull(oFormValues)) {
+                        if (goog.isDefAndNotNull(oFormValues[sFormDefinitionName])) {
+                            if (goog.isDefAndNotNull(oFormValues[sFormDefinitionName][aAttrs[i][1]])) {
+                                if (goog.isDefAndNotNull(oFormValues[sFormDefinitionName][aAttrs[i][1]]['selectedOption'])) {
+                                    if (goog.isDefAndNotNull(oFormValues[sFormDefinitionName][aAttrs[i][1]]['selectedOption']['value'])) {
+                                        sReplacer = 'oFormValues[sFormDefinitionName].' + aAttrs[i][1] + '.selectedOption.value';
+                                    }
+                                    $log.log(aAttrs[i][0] + ': ' + oFormValues[sFormDefinitionName][aAttrs[i][1]]['selectedOption']['value']);
+                                } else {
+                                    $log.log(aAttrs[i][0] + ': ' + oFormValues[sFormDefinitionName][aAttrs[i][1]]);
+                                }
+                            }
+                        }
+                    }
+
+
+                    sString = sString.replace(aAttrs[i][0], sReplacer);
+                }
+            }
+
+            // Ajoute le retour true/false
+            sString = sString + ' ? true : false';
+
+            return sString;
+        },
         /**
          * selectFirstOption function.
          * Sélectionne la 1ere option d'un <select>.
diff --git a/src/vitis/client/javascript/externs/studio/lang/lang-en.json b/src/vitis/client/javascript/externs/studio/lang/lang-en.json
index 2a8607765144ea740a1a942c6b65707e030622e0..ca2c8719f889d84db5deb53cf801a99adaa8a05b 100755
--- a/src/vitis/client/javascript/externs/studio/lang/lang-en.json
+++ b/src/vitis/client/javascript/externs/studio/lang/lang-en.json
@@ -156,7 +156,9 @@
                 "Required": "Required",
                 "displayOnly": "Display only",
                 "DefaultValue": "Default value",
-                "Value": "Value"
+                "Value": "Value",
+                "Visible": "Visible",
+                "VisibleHelp": "Utilisez le gestionnaire de sources de données (bouton en bas à droite) pour ajouter ou modifier une source données"
             },
             "BusinessObject": {
                 "BusinessObject": "Business object",
diff --git a/src/vitis/client/javascript/externs/studio/lang/lang-fr.json b/src/vitis/client/javascript/externs/studio/lang/lang-fr.json
index bb90dd51670f0baf1ea619c0d44a06a62d86e815..ae9fd62b4e586cd3b7ccd7a6cc3cf5416949567d 100755
--- a/src/vitis/client/javascript/externs/studio/lang/lang-fr.json
+++ b/src/vitis/client/javascript/externs/studio/lang/lang-fr.json
@@ -162,7 +162,9 @@
                 "Required": "Requis",
                 "displayOnly": "Uniquement en consultation",
                 "DefaultValue": "Valeur par défaut",
-                "Value": "Valeur"
+                "Value": "Valeur",
+                "Visible": "Visible",
+                "VisibleHelp": "Pour afficher/cacher le champ utilisez true/false ou une expression complexe utilisant les valeurs du formulaire ex : \"= {{id_com}} == 75000\", ex : \"= int({{puissance}}) + int({{portee}}) == 1000\""
             },
             "BusinessObject": {
                 "BusinessObject": "Objet métier",
diff --git a/src/vitis/client/javascript/externs/studio/templates/ElementForm.html b/src/vitis/client/javascript/externs/studio/templates/ElementForm.html
index bb5dddce2a859473da12dabbef8415a187ef84d0..f1b2cff9fbd997cbec3c37d8323ca9e5553aec30 100755
--- a/src/vitis/client/javascript/externs/studio/templates/ElementForm.html
+++ b/src/vitis/client/javascript/externs/studio/templates/ElementForm.html
@@ -1481,6 +1481,7 @@
                         <textarea ng-disabled="locker" ng-model="model.default_value" id="Element_Form_value_input" type="text" class="form-control" aria-describedby="Element_Form_value_label" rows="5"></textarea>
                     </div>
                 </div>
+                <!-- Codemirror -->
                 <div ng-switch-when="codemirror">
                     <div class="input-group element-margin input-group-xs">
                         <span class="input-group-addon" id="Element_Form_label_label">{{::ctrl.text.Component.General.Label}}</span>
@@ -2175,8 +2176,23 @@
                     -->
                 </div>
                 <!-- Default -->
-                <span ng-switch-default>
-                </span>
+                <div ng-switch-default>
+                </div>
+                <!-- Champ visible -->
+                <div>
+                    <div ng-if="model.type != 'undefined'" class="input-group element-margin input-group-xs">
+                        <span id="Element_Form_visible_label" class="input-group-addon">{{::ctrl.text.Component.General.Visible}}</span>
+                        <textarea ng-disabled="locker"
+                                    ng-model="model.visible"
+                                    id="Element_Form_visible_input"
+                                    type="text"
+                                    class="form-control"
+                                    aria-describedby="Element_Form_visible_label"
+                                    data-app-helper-icon
+                                    data-text="{{::ctrl.text.Component.General.VisibleHelp}}"
+                                    rows="3"></textarea>
+                    </div>
+                </div>
             </div>
         </form>
     </div>