diff --git a/.hgtags b/.hgtags
index 8b8413ec0b2009b8c386a73b95414f68f9dc1c3d_LmhndGFncw==..bea2d255368c74fbae5a91e426bbd7eebe665e22_LmhndGFncw== 100644
--- a/.hgtags
+++ b/.hgtags
@@ -38,3 +38,4 @@
 f4028ddaf01b66f895d74ddf1d0dac95635f5b5e 17.0.1.4.1
 1ee5e8b99e8a2b52f3877d3a8394bd2514b5ff05 17.0.1.4.1.1
 26ba3f1cae7afe29f496435ac1ad714f73b0e5c5 17.0.1.4.1.2
+5f6c4cb70c0e0e89f7adaa7063a4ca16841ed490 17.0.1.5.0
diff --git a/NEWS.rst b/NEWS.rst
index 8b8413ec0b2009b8c386a73b95414f68f9dc1c3d_TkVXUy5yc3Q=..bea2d255368c74fbae5a91e426bbd7eebe665e22_TkVXUy5yc3Q= 100644
--- a/NEWS.rst
+++ b/NEWS.rst
@@ -2,6 +2,11 @@
 Changelog
 =========
 
+17.0.1.5.0
+----------
+
+Fix prop validation and refactor placeholder logic.
+
 17.0.1.4.1
 ----------
 
diff --git a/__manifest__.py b/__manifest__.py
index 8b8413ec0b2009b8c386a73b95414f68f9dc1c3d_X19tYW5pZmVzdF9fLnB5..bea2d255368c74fbae5a91e426bbd7eebe665e22_X19tYW5pZmVzdF9fLnB5 100644
--- a/__manifest__.py
+++ b/__manifest__.py
@@ -21,7 +21,7 @@
 {
     "name": "Redner",
     "license": "AGPL-3",
-    "version": "17.0.1.4.1",
+    "version": "17.0.1.5.0",
     "category": "Reporting",
     "author": "XCG Consulting",
     "website": "https://orbeet.io/",
diff --git a/i18n/fr.po b/i18n/fr.po
index 8b8413ec0b2009b8c386a73b95414f68f9dc1c3d_aTE4bi9mci5wbw==..bea2d255368c74fbae5a91e426bbd7eebe665e22_aTE4bi9mci5wbw== 100644
--- a/i18n/fr.po
+++ b/i18n/fr.po
@@ -6,8 +6,8 @@
 msgstr ""
 "Project-Id-Version: Odoo Server 17.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-12-18 16:34+0000\n"
-"PO-Revision-Date: 2024-12-18 16:36+0000\n"
+"POT-Creation-Date: 2025-01-29 20:00+0000\n"
+"PO-Revision-Date: 2025-01-29 20:03+0000\n"
 "Last-Translator: Axel PREL <axel.prel@xcg-consulting.fr>\n"
 "Language-Team: XCG Consulting\n"
 "Language: fr\n"
@@ -20,9 +20,10 @@
 #. module: redner
 #. odoo-python
 #: code:addons/redner/models/redner_template.py:0
+#, python-format
 msgid "%s (copy)"
 msgstr "%s (copie)"
 
 #. module: redner
 #. odoo-python
 #: code:addons/redner/models/ir_actions_report.py:0
@@ -23,9 +24,10 @@
 msgid "%s (copy)"
 msgstr "%s (copie)"
 
 #. module: redner
 #. odoo-python
 #: code:addons/redner/models/ir_actions_report.py:0
+#, python-format
 msgid "(Native)"
 msgstr "(Natif)"
 
@@ -45,21 +47,5 @@
 msgstr "Archivé"
 
 #. module: redner
-#: model_terms:ir.ui.view,arch_db:redner.view_expression_builder_wizard_form
-msgid "Build Expression"
-msgstr "Construire l'expression"
-
-#. module: redner
-#: model_terms:ir.ui.view,arch_db:redner.redner_report_view
-#: model_terms:ir.ui.view,arch_db:redner.view_email_template_form
-msgid "Build expression"
-msgstr "Construire l'expression"
-
-#. module: redner
-#: model_terms:ir.ui.view,arch_db:redner.view_expression_builder_wizard_form
-msgid "Cancel"
-msgstr "Annuler"
-
-#. module: redner
 #. odoo-python
 #: code:addons/redner/redner.py:0
@@ -64,8 +50,9 @@
 #. odoo-python
 #: code:addons/redner/redner.py:0
+#, python-format
 msgid "Cannot Establish a connection to server"
 msgstr "La connexion au serveur ne peut pas être établie"
 
 #. module: redner
 #. odoo-python
 #: code:addons/redner/redner.py:0
@@ -66,9 +53,10 @@
 msgid "Cannot Establish a connection to server"
 msgstr "La connexion au serveur ne peut pas être établie"
 
 #. module: redner
 #. odoo-python
 #: code:addons/redner/redner.py:0
+#, python-format
 msgid ""
 "Cannot find redner config url. Please add it in odoo.conf or in ir."
 "config_parameter"
@@ -82,11 +70,6 @@
 msgstr "Le code pour le template redner mjml doit être ajouté ici"
 
 #. module: redner
-#: model:ir.model.fields,field_description:redner.field_expression_builder_field__field_comodel_name
-msgid "Comodel Name"
-msgstr "Nom du modèle relié"
-
-#. module: redner
 #: model:ir.model.fields.selection,name:redner.selection__redner_substitution__converter__constant
 msgid "Constant value"
 msgstr "Valeur constante"
@@ -97,8 +80,6 @@
 msgstr "Convertisseur"
 
 #. module: redner
-#: model:ir.model.fields,field_description:redner.field_expression_builder_field__create_uid
-#: model:ir.model.fields,field_description:redner.field_expression_builder_wizard__create_uid
 #: model:ir.model.fields,field_description:redner.field_redner_report__create_uid
 #: model:ir.model.fields,field_description:redner.field_redner_substitution__create_uid
 #: model:ir.model.fields,field_description:redner.field_redner_template__create_uid
@@ -107,8 +88,6 @@
 msgstr "Créé par"
 
 #. module: redner
-#: model:ir.model.fields,field_description:redner.field_expression_builder_field__create_date
-#: model:ir.model.fields,field_description:redner.field_expression_builder_wizard__create_date
 #: model:ir.model.fields,field_description:redner.field_redner_report__create_date
 #: model:ir.model.fields,field_description:redner.field_redner_substitution__create_date
 #: model:ir.model.fields,field_description:redner.field_redner_template__create_date
@@ -134,8 +113,6 @@
 msgstr "Description du modèle"
 
 #. module: redner
-#: model:ir.model.fields,field_description:redner.field_expression_builder_field__display_name
-#: model:ir.model.fields,field_description:redner.field_expression_builder_wizard__display_name
 #: model:ir.model.fields,field_description:redner.field_redner_report__display_name
 #: model:ir.model.fields,field_description:redner.field_redner_substitution__display_name
 #: model:ir.model.fields,field_description:redner.field_redner_template__display_name
@@ -144,11 +121,6 @@
 msgstr "Nom à afficher"
 
 #. module: redner
-#: model:ir.model.fields,field_description:redner.field_redner_substitution__dynamic_placeholder_button_hidden
-msgid "Dynamic Placeholder Button Hidden"
-msgstr "Dynamic Placeholder Button Hidden"
-
-#. module: redner
 #: model:ir.model.fields,field_description:redner.field_redner_substitution__template_id
 msgid "Email Template"
 msgstr "Modèle de courriel"
@@ -169,21 +141,6 @@
 msgstr "Expression"
 
 #. module: redner
-#: model:ir.model,name:redner.model_expression_builder_field
-msgid "Expression Builder Field"
-msgstr "Champ du constructeur d'expression"
-
-#. module: redner
-#: model:ir.model,name:redner.model_expression_builder_wizard
-msgid "Expression Builder Wizard"
-msgstr "Constructeur d'expression"
-
-#. module: redner
-#: model:ir.model.fields,field_description:redner.field_expression_builder_field__wizard_id
-msgid "Expression builder"
-msgstr "Constructeur d'expression"
-
-#. module: redner
 #: model_terms:ir.ui.view,arch_db:redner.view_template_list_wizard_tree
 msgid "External Templates"
 msgstr "Modèles externes"
@@ -191,6 +148,7 @@
 #. module: redner
 #. odoo-python
 #: code:addons/redner/models/redner_template.py:0
+#, python-format
 msgid "Failed to update Redner template, %s"
 msgstr "Échec de la mise à jour du modèle redner, %s"
 
@@ -202,7 +160,8 @@
 #. module: redner
 #. odoo-python
 #: code:addons/redner/models/ir_actions_report.py:0
+#, python-format
 msgid "Field 'Output Format' is required for Redner report"
 msgstr "Le champ 'Format de sortie' est requis pour le rapport Redner"
 
 #. module: redner
@@ -205,22 +164,7 @@
 msgid "Field 'Output Format' is required for Redner report"
 msgstr "Le champ 'Format de sortie' est requis pour le rapport Redner"
 
 #. module: redner
-#: model:ir.model.fields,field_description:redner.field_expression_builder_field__field_technical_name
-msgid "Field Technical Name"
-msgstr "Nom technique du champ"
-
-#. module: redner
-#: model:ir.model.fields,field_description:redner.field_expression_builder_field__field_type
-msgid "Field Type"
-msgstr "Type de champ"
-
-#. module: redner
-#: model:ir.model.fields,field_description:redner.field_expression_builder_field__field_name
-msgid "Field name"
-msgstr "Nom du champ"
-
-#. module: redner
 #: model_terms:ir.ui.view,arch_db:redner.view_email_template_form
 msgid "Get Substitutions from Redner Template"
 msgstr "Obtenir les substitutions à partir du modèle Redner"
@@ -236,8 +180,11 @@
 msgstr "HTML + mustache"
 
 #. module: redner
-#: model:ir.model.fields,field_description:redner.field_expression_builder_field__id
-#: model:ir.model.fields,field_description:redner.field_expression_builder_wizard__id
+#: model:ir.model.fields,field_description:redner.field_redner_substitution__hide_placeholder_button
+msgid "Hide Placeholder Button"
+msgstr "Masquer le bouton placeholder"
+
+#. module: redner
 #: model:ir.model.fields,field_description:redner.field_redner_report__id
 #: model:ir.model.fields,field_description:redner.field_redner_substitution__id
 #: model:ir.model.fields,field_description:redner.field_redner_template__id
@@ -257,11 +204,6 @@
 "cochée si la source est \"Odoo\"."
 
 #. module: redner
-#: model:ir.model.fields,help:redner.field_expression_builder_field__field_comodel_name
-msgid "If the field is relational, store the comodel name here"
-msgstr "Si le champ est relationnel, contient le nom du modèle relié"
-
-#. module: redner
 #: model:ir.model.fields,help:redner.field_redner_template__active
 msgid ""
 "If unchecked, it will allow you to hide the template without removing it."
@@ -324,8 +266,6 @@
 msgstr "Langage"
 
 #. module: redner
-#: model:ir.model.fields,field_description:redner.field_expression_builder_field__write_uid
-#: model:ir.model.fields,field_description:redner.field_expression_builder_wizard__write_uid
 #: model:ir.model.fields,field_description:redner.field_redner_report__write_uid
 #: model:ir.model.fields,field_description:redner.field_redner_substitution__write_uid
 #: model:ir.model.fields,field_description:redner.field_redner_template__write_uid
@@ -334,8 +274,6 @@
 msgstr "Dernière mise à jour par"
 
 #. module: redner
-#: model:ir.model.fields,field_description:redner.field_expression_builder_field__write_date
-#: model:ir.model.fields,field_description:redner.field_expression_builder_wizard__write_date
 #: model:ir.model.fields,field_description:redner.field_redner_report__write_date
 #: model:ir.model.fields,field_description:redner.field_redner_substitution__write_date
 #: model:ir.model.fields,field_description:redner.field_redner_template__write_date
@@ -364,6 +302,13 @@
 msgstr "MJML + mustache"
 
 #. module: redner
+#. odoo-javascript
+#: code:addons/redner/static/src/components/dynamic_placeholder_char_field/dynamic_placeholder_char_field.xml:0
+#, python-format
+msgid "Magic"
+msgstr ""
+
+#. module: redner
 #: model:ir.model.fields,field_description:redner.field_ir_actions_report__redner_multi_in_one
 msgid "Multiple Records in a Single Redner Report"
 msgstr "Plusieurs enregistrements dans un seul rapport Redner"
@@ -371,6 +316,7 @@
 #. module: redner
 #. odoo-python
 #: code:addons/redner/models/redner_substitution.py:0
+#, python-format
 msgid "N/A"
 msgstr "N/A"
 
@@ -420,6 +366,11 @@
 msgstr "Langue de traduction facultative (code ISO)."
 
 #. module: redner
+#: model:ir.model.fields,field_description:redner.field_redner_substitution__value_placeholder
+msgid "Placeholder Text"
+msgstr "Texte placeholder"
+
+#. module: redner
 #: model:ir.model.fields,field_description:redner.field_redner_template__preview
 #: model:ir.model.fields,field_description:redner.field_template_list_wizard__preview
 #: model_terms:ir.ui.view,arch_db:redner.redner_template_view_form
@@ -462,12 +413,6 @@
 msgstr "Modèles Redner"
 
 #. module: redner
-#. odoo-python
-#: code:addons/redner/controllers/main.py:0
-msgid "Redner action report not found for report_name %s"
-msgstr "Action du rapport redner introuvable pour le rapport %s"
-
-#. module: redner
 #: model:ir.model.fields,field_description:redner.field_redner_substitution__model
 msgid "Related Report Model"
 msgstr "Modèle de Rapport Associé"
@@ -514,13 +459,8 @@
 msgstr "Type de rapport"
 
 #. module: redner
-#: model_terms:ir.ui.view,arch_db:redner.view_expression_builder_wizard_form
-msgid "Save"
-msgstr "Enregistrer"
-
-#. module: redner
 #: model_terms:ir.ui.view,arch_db:redner.view_template_list_wizard_tree
 msgid "Select"
 msgstr "Sélectionner"
 
 #. module: redner
@@ -522,13 +462,8 @@
 #: model_terms:ir.ui.view,arch_db:redner.view_template_list_wizard_tree
 msgid "Select"
 msgstr "Sélectionner"
 
 #. module: redner
-#: model:ir.model.fields,field_description:redner.field_expression_builder_field__selected
-msgid "Selected"
-msgstr "Sélectionné"
-
-#. module: redner
 #: model_terms:ir.ui.view,arch_db:redner.redner_template_view_form
 msgid "Settings"
 msgstr "Paramètres"
@@ -550,15 +485,6 @@
 "La source du modèle, si il a été créé dans Odoo ou importé depuis Redner."
 
 #. module: redner
-#: model:ir.model.fields,help:redner.field_expression_builder_wizard__expression
-msgid ""
-"Stores the substitution value the builder is working on. (example: "
-"'partner_id.name')"
-msgstr "L'expression qui sera ajoutée (exemple: 'partner_id.name')"
-
-#. module: redner
-#: model:ir.model.fields,field_description:redner.field_expression_builder_wizard__expression
-#: model:ir.model.fields,field_description:redner.field_expression_builder_wizard__substitution_id
 #: model:ir.model.fields,field_description:redner.field_ir_actions_report__substitution_ids
 msgid "Substitution"
 msgstr "Substitution"
@@ -571,11 +497,6 @@
 msgstr "Substitutions"
 
 #. module: redner
-#: model:ir.model.fields,field_description:redner.field_expression_builder_wizard__suggested_fields
-msgid "Suggested Fields"
-msgstr "Champs suggérés"
-
-#. module: redner
 #: model_terms:ir.ui.view,arch_db:redner.redner_template_view_form
 msgid "Template Body"
 msgstr "Corps du modèle"
@@ -611,26 +532,6 @@
 msgstr "La prévisualisation en PNG du modèle"
 
 #. module: redner
-#: model:ir.model.fields,help:redner.field_expression_builder_wizard__substitution_id
-msgid "The Redner Substitution on which we assign the value"
-msgstr "La substitution de variable redner à laquelle on assigne la valeur"
-
-#. module: redner
-#: model:ir.model.fields,help:redner.field_expression_builder_field__field_name
-msgid "The field's comprehensible name"
-msgstr "Le nom du champ"
-
-#. module: redner
-#: model:ir.model.fields,help:redner.field_expression_builder_field__field_technical_name
-msgid "The field's technical name"
-msgstr "Le nom technique du champ"
-
-#. module: redner
-#: model:ir.model.fields,help:redner.field_expression_builder_field__field_type
-msgid "The field's type (boolean, text, ...)"
-msgstr "Le type de champ (booléen, texte, ...)"
-
-#. module: redner
 #: model:ir.model.fields,help:redner.field_redner_template__name
 msgid ""
 "The name of the template. Once the template is created, updating the name is "
@@ -642,6 +543,7 @@
 #. module: redner
 #. odoo-python
 #: code:addons/redner/models/ir_actions_report.py:0
+#, python-format
 msgid ""
 "The output format cannot be different from the extension defined in \"Save "
 "as attachment prefix\"."
@@ -650,18 +552,6 @@
 "\"Enregistrer comme préfixe de pièce jointe\"."
 
 #. module: redner
-#: model:ir.model.fields,help:redner.field_expression_builder_wizard__suggested_fields
-msgid "The suggested fields, based on the substitution converter value"
-msgstr ""
-"Les champs suggérés, basés sur le type de convertisseur utilisé dans la "
-"substitution"
-
-#. module: redner
-#: model:ir.model.fields,help:redner.field_expression_builder_wizard__expression
-msgid "The temporary expression (example: 'partner_id.name')"
-msgstr "L'expression qui sera ajoutée (exemple: 'partner_id.name')"
-
-#. module: redner
 #: model:ir.model.fields,help:redner.field_ir_actions_report__report_type
 msgid ""
 "The type of the report that will be rendered, each one having its own "
@@ -680,13 +570,5 @@
 msgstr "Il s'agit d'une prévisualisation du template"
 
 #. module: redner
-#: model_terms:ir.ui.view,arch_db:redner.redner_report_view
-#: model_terms:ir.ui.view,arch_db:redner.view_email_template_form
-msgid "This will delete the current substitution value. Continue anyway ?"
-msgstr ""
-"Ceci va supprimer la valeur de substitution actuelle. Continuer malgré "
-"tout ?"
-
-#. module: redner
 #. odoo-python
 #: code:addons/redner/models/redner_template.py:0
@@ -691,5 +573,6 @@
 #. odoo-python
 #: code:addons/redner/models/redner_template.py:0
+#, python-format
 msgid ""
 "Unable to update the template data. Please check the logs for more details."
 msgstr ""
@@ -698,7 +581,8 @@
 #. module: redner
 #. odoo-python
 #: code:addons/redner/redner.py:0
+#, python-format
 msgid "Unexpected redner error: %r"
 msgstr "Erreur redner : %r"
 
 #. module: redner
@@ -701,12 +585,7 @@
 msgid "Unexpected redner error: %r"
 msgstr "Erreur redner : %r"
 
 #. module: redner
-#: model:ir.model.fields,field_description:redner.field_redner_substitution__value_placeholder
-msgid "Value Placeholder"
-msgstr "Placeholder de l'expresion"
-
-#. module: redner
 #: model:ir.model.fields,field_description:redner.field_redner_substitution__keyword
 msgid "Variable"
 msgstr "Variable"
@@ -726,6 +605,7 @@
 #. odoo-python
 #: code:addons/redner/models/mail_template.py:0
 #: code:addons/redner/models/redner_report.py:0
+#, python-format
 msgid ""
 "We received an unexpected error from redner server. Please contact your "
 "administrator"
@@ -734,16 +614,5 @@
 "votre administrateur"
 
 #. module: redner
-#: model:ir.model.fields,help:redner.field_expression_builder_field__selected
-msgid "When selected, it will me added to the substitution value"
-msgstr ""
-"Si l'option est cochée, ce champ sera ajouté à la valeur de la substitution"
-
-#. module: redner
-#: model:ir.model.fields,help:redner.field_expression_builder_field__field_comodel_name
-msgid "if the field is relationnal, store the comodel name here"
-msgstr "si le champ est relationnel, contient le nom du modèle relié"
-
-#. module: redner
 #. odoo-python
 #: code:addons/redner/models/redner_substitution.py:0
@@ -748,8 +617,9 @@
 #. odoo-python
 #: code:addons/redner/models/redner_substitution.py:0
+#, python-format
 msgid "e.g: name or partner_id.name"
 msgstr "par ex. name or partner_id.name"
 
 #. module: redner
 #. odoo-python
 #: code:addons/redner/models/redner_substitution.py:0
@@ -750,12 +620,13 @@
 msgid "e.g: name or partner_id.name"
 msgstr "par ex. name or partner_id.name"
 
 #. module: redner
 #. odoo-python
 #: code:addons/redner/models/redner_substitution.py:0
+#, python-format
 msgid "e.g: partner_id/category_id/name ou partner_id/child_ids[]"
 msgstr "par ex. partner_id/category_id/name ou partner_id/child_ids[]"
 
 #. module: redner
 #. odoo-python
 #: code:addons/redner/models/redner_substitution.py:0
@@ -756,12 +627,13 @@
 msgid "e.g: partner_id/category_id/name ou partner_id/child_ids[]"
 msgstr "par ex. partner_id/category_id/name ou partner_id/child_ids[]"
 
 #. module: redner
 #. odoo-python
 #: code:addons/redner/models/redner_substitution.py:0
+#, python-format
 msgid "e.g: tax_ids"
 msgstr "par ex. tax_ids"
 
 #. module: redner
 #. odoo-python
 #: code:addons/redner/models/redner_substitution.py:0
@@ -762,12 +634,20 @@
 msgid "e.g: tax_ids"
 msgstr "par ex. tax_ids"
 
 #. module: redner
 #. odoo-python
 #: code:addons/redner/models/redner_substitution.py:0
+#, python-format
+msgid "e.g: www.orbeet.io"
+msgstr "par ex. www.orbeet.io"
+
+#. module: redner
+#. odoo-python
+#: code:addons/redner/models/redner_substitution.py:0
+#, python-format
 msgid "e.g: {{ object.get_partner_info() | safe }}"
 msgstr "par ex. {{ object.get_partner_info() | safe }}"
 
 #. module: redner
 #. odoo-python
 #: code:addons/redner/models/redner_substitution.py:0
@@ -768,12 +648,13 @@
 msgid "e.g: {{ object.get_partner_info() | safe }}"
 msgstr "par ex. {{ object.get_partner_info() | safe }}"
 
 #. module: redner
 #. odoo-python
 #: code:addons/redner/models/redner_substitution.py:0
+#, python-format
 msgid "e.g: {{object.partner_id.name}}"
 msgstr "par ex. {{object.partner_id.name}}"
 
 #. module: redner
 #. odoo-python
 #: code:addons/redner/models/redner_substitution.py:0
@@ -774,15 +655,10 @@
 msgid "e.g: {{object.partner_id.name}}"
 msgstr "par ex. {{object.partner_id.name}}"
 
 #. module: redner
 #. odoo-python
 #: code:addons/redner/models/redner_substitution.py:0
-msgid "e.g: www.orbeet.io"
-msgstr "par ex. www.orbeet.io"
-
-#. module: redner
-#. odoo-python
-#: code:addons/redner/models/redner_substitution.py:0
+#, python-format
 msgid "invalid converter type: %s"
 msgstr "type de convertisseur invalide : %s"
 
@@ -799,18 +675,4 @@
 #. module: redner
 #: model:ir.model.fields,help:redner.field_redner_template__language
 msgid "templating language"
-msgstr "langage du modèle"
-
-#. module: redner
-#: model_terms:ir.ui.view,arch_db:redner.redner_report_view
-msgid "this will delete the current substitution value. Continue anyway ?"
-msgstr ""
-"ceci va supprimer la valeur de substitution actuelle. Continuer malgré "
-"tout ?"
-
-#. module: redner
-#: model:ir.model.fields,field_description:redner.field_redner_report____last_update
-#: model:ir.model.fields,field_description:redner.field_redner_substitution____last_update
-#: model:ir.model.fields,field_description:redner.field_redner_template____last_update
-msgid "Last Modified on"
-msgstr "Dernière modification le"
+msgstr "langage du modèle"
\ No newline at end of file
diff --git a/models/redner_substitution.py b/models/redner_substitution.py
index 8b8413ec0b2009b8c386a73b95414f68f9dc1c3d_bW9kZWxzL3JlZG5lcl9zdWJzdGl0dXRpb24ucHk=..bea2d255368c74fbae5a91e426bbd7eebe665e22_bW9kZWxzL3JlZG5lcl9zdWJzdGl0dXRpb24ucHk= 100644
--- a/models/redner_substitution.py
+++ b/models/redner_substitution.py
@@ -81,5 +81,7 @@
 
     depth = fields.Integer(string="Depth", compute="_compute_depth", store=True)
 
-    value_placeholder = fields.Char(compute="_compute_value_placeholder")
+    value_placeholder = fields.Char(
+        compute="_compute_value_placeholder", string="Placeholder Text"
+    )
 
@@ -85,5 +87,5 @@
 
-    dynamic_placeholder_button_hidden = fields.Boolean(
-        compute="_compute_dynamic_placeholder_button_hidden"
+    hide_placeholder_button = fields.Boolean(
+        compute="_compute_hide_placeholder_button", string="Hide Placeholder Button"
     )
 
@@ -88,4 +90,9 @@
     )
 
+    @api.onchange("converter")
+    def _onchange_converter(self):
+        if self.converter:
+            self.value = False
+
     @api.depends("converter")
     def _compute_value_placeholder(self):
@@ -90,25 +97,18 @@
     @api.depends("converter")
     def _compute_value_placeholder(self):
-        """Computes a dynamic placeholder that depends on the selected type
-        to help the user inputs their data.
-        """
-        for subsitution in self:
-            placeholder = _("N/A")
-            if subsitution.converter == FIELD:
-                placeholder = _("e.g: name or partner_id.name")
-            elif subsitution.converter == MAIL_TEMPLATE:
-                placeholder = _("e.g: {{object.partner_id.name}}")
-            elif subsitution.converter == MAIL_TEMPLATE_DESERIALIZE:
-                placeholder = _("e.g: {{ object.get_partner_info() | safe }}")
-            elif subsitution.converter == RELATION_2MANY:
-                placeholder = _("e.g: tax_ids")
-            elif subsitution.converter == RELATION_PATH:
-                placeholder = _(
-                    "e.g: partner_id/category_id/name ou partner_id/child_ids[]"
-                )
-            elif subsitution.converter == CONSTANT:
-                placeholder = _("e.g: www.orbeet.io")
-            subsitution.value_placeholder = placeholder
+        """Compute placeholder text based on conversion type"""
+        placeholder_map = {
+            FIELD: _("e.g: name or partner_id.name"),
+            MAIL_TEMPLATE: _("e.g: {{object.partner_id.name}}"),
+            MAIL_TEMPLATE_DESERIALIZE: _("e.g: {{ object.get_partner_info() | safe }}"),
+            RELATION_PATH: _(
+                "e.g: partner_id/category_id/name ou partner_id/child_ids[]"
+            ),
+            RELATION_2MANY: _("e.g: tax_ids"),
+            CONSTANT: _("e.g: www.orbeet.io"),
+        }
+        for record in self:
+            record.value_placeholder = placeholder_map.get(record.converter, _("N/A"))
 
     @api.depends("value")
     def _compute_render_model(self):
@@ -126,5 +126,6 @@
             record.depth = record.keyword.count(".")
 
     @api.depends("converter")
-    def _compute_dynamic_placeholder_button_hidden(self):
+    def _compute_hide_placeholder_button(self):
+        """Determine if placeholder button should be hidden"""
         for record in self:
@@ -130,5 +131,5 @@
         for record in self:
-            record.dynamic_placeholder_button_hidden = (
+            record.hide_placeholder_button = (
                 record.converter not in DYNAMIC_PLACEHOLDER_ALLOWED_CONVERTERS
             )
 
diff --git a/static/src/components/charfield/charfield.js b/static/src/components/dynamic_placeholder_char_field/dynamic_placeholder_char_field.js
similarity index 57%
rename from static/src/components/charfield/charfield.js
rename to static/src/components/dynamic_placeholder_char_field/dynamic_placeholder_char_field.js
index 8b8413ec0b2009b8c386a73b95414f68f9dc1c3d_c3RhdGljL3NyYy9jb21wb25lbnRzL2NoYXJmaWVsZC9jaGFyZmllbGQuanM=..bea2d255368c74fbae5a91e426bbd7eebe665e22_c3RhdGljL3NyYy9jb21wb25lbnRzL2R5bmFtaWNfcGxhY2Vob2xkZXJfY2hhcl9maWVsZC9keW5hbWljX3BsYWNlaG9sZGVyX2NoYXJfZmllbGQuanM= 100644
--- a/static/src/components/charfield/charfield.js
+++ b/static/src/components/dynamic_placeholder_char_field/dynamic_placeholder_char_field.js
@@ -9,11 +9,11 @@
 CharField.props = {
     ...CharField.props,
     placeholderField: {type: String, optional: true},
-    placeholderRenderField: {type: String, optional: true},
-    converterField: {type: String, optional: true},
+    buttonVisibilityField: {type: String, optional: true},
+    converterTypeField: {type: String, optional: true},
 };
 
 // Extending charField to extract the new property
 const charExtractProps = charField.extractProps;
 charField.extractProps = (fieldInfo) => {
     return Object.assign(charExtractProps(fieldInfo), {
@@ -14,12 +14,12 @@
 };
 
 // Extending charField to extract the new property
 const charExtractProps = charField.extractProps;
 charField.extractProps = (fieldInfo) => {
     return Object.assign(charExtractProps(fieldInfo), {
-        placeholderField: fieldInfo.options.placeholder_field,
-        placeholderRednerField: fieldInfo.options?.placeholder_redner || false,
-        converterField: fieldInfo.options?.converter_field || false,
+        placeholderField: fieldInfo.options?.placeholder_field || "",
+        buttonVisibilityField: fieldInfo.options?.button_visibility_field || "",
+        converterTypeField: fieldInfo.options?.converter_type_field || "",
     });
 };
 
@@ -43,7 +43,7 @@
             this.props.placeholder
         );
     },
-    get showDynamicPlaceholderButton() {
+    get showPlaceholderButton() {
         return (
             this.props.dynamicPlaceholder &&
             !this.props.readonly &&
@@ -47,6 +47,6 @@
         return (
             this.props.dynamicPlaceholder &&
             !this.props.readonly &&
-            !this.props.record.data[this.props.placeholderRednerField]
+            this.props.record.data[this.props.buttonVisibilityField]
         );
     },
@@ -51,9 +51,8 @@
         );
     },
-
-    get converterValue() {
-        return this.props.record.data[this.props.converterField] || "";
+    get activeConverterType() {
+        return this.props.record.data[this.props.converterTypeField] || "";
     },
 
     async onDynamicPlaceholderOpen() {
         await this.dynamicPlaceholder.open({
@@ -56,7 +55,7 @@
     },
 
     async onDynamicPlaceholderOpen() {
         await this.dynamicPlaceholder.open({
-            validateCallback: this.onDynamicPlaceholderValidate.bind(this),
+            validateCallback: this.handlePlaceholderInsert.bind(this),
         });
     },
@@ -61,5 +60,5 @@
         });
     },
-    async onDynamicPlaceholderValidate(chain, defaultValue) {
+    async handlePlaceholderInsert(chain, defaultValue) {
         if (chain) {
             this.input.el.focus();
@@ -64,6 +63,5 @@
         if (chain) {
             this.input.el.focus();
-            // Initialize dynamicPlaceholder with a default structure
-            let dynamicPlaceholder = ` {{object.${chain}${
+            let placeholder = `{{object.${chain}${
                 defaultValue?.length ? ` ||| ${defaultValue}` : ""
             }}}`;
@@ -68,4 +66,5 @@
                 defaultValue?.length ? ` ||| ${defaultValue}` : ""
             }}}`;
-            switch (this.converter) {
+
+            switch (this.activeConverterType) {
                 case "field":
@@ -71,4 +70,3 @@
                 case "field":
-                    // For "field" converter, use the chain directly as the value
-                    dynamicPlaceholder = `${chain}`;
+                    placeholder = chain;
                     break;
@@ -74,4 +72,4 @@
                     break;
-
+                // Add other converter types here
                 default:
                     // Default case if no specific converter type is found
@@ -76,7 +74,7 @@
                 default:
                     // Default case if no specific converter type is found
-                    dynamicPlaceholder = ` {{object.${chain}${
+                    placeholder = ` {{object.${chain}${
                         defaultValue?.length ? ` ||| ${defaultValue}` : ""
                     }}}`;
                     break;
             }
@@ -79,5 +77,6 @@
                         defaultValue?.length ? ` ||| ${defaultValue}` : ""
                     }}}`;
                     break;
             }
+
             this.input.el.setRangeText(
@@ -83,6 +82,6 @@
             this.input.el.setRangeText(
-                dynamicPlaceholder,
+                placeholder,
                 this.selectionStart,
                 this.selectionStart,
                 "end"
             );
@@ -85,10 +84,9 @@
                 this.selectionStart,
                 this.selectionStart,
                 "end"
             );
-            // trigger events to make the field dirty
             this.input.el.dispatchEvent(new InputEvent("input"));
             this.input.el.dispatchEvent(new KeyboardEvent("keydown"));
             this.input.el.focus();
         }
     },
@@ -90,6 +88,38 @@
             this.input.el.dispatchEvent(new InputEvent("input"));
             this.input.el.dispatchEvent(new KeyboardEvent("keydown"));
             this.input.el.focus();
         }
     },
+    // async handlePlaceholderValidation(chain, defaultValue) {
+    //     if (chain) {
+    //         this.input.el.focus();
+    //         // Initialize dynamicPlaceholder with a default structure
+    //         let dynamicPlaceholder = ` {{object.${chain}${
+    //             defaultValue?.length ? ` ||| ${defaultValue}` : ""
+    //         }}}`;
+    //         switch (this.converter) {
+    //             case "field":
+    //                 // For "field" converter, use the chain directly as the value
+    //                 dynamicPlaceholder = `${chain}`;
+    //                 break;
+
+    //             default:
+    //                 // Default case if no specific converter type is found
+    //                 dynamicPlaceholder = ` {{object.${chain}${
+    //                     defaultValue?.length ? ` ||| ${defaultValue}` : ""
+    //                 }}}`;
+    //                 break;
+    //         }
+    //         this.input.el.setRangeText(
+    //             dynamicPlaceholder,
+    //             this.selectionStart,
+    //             this.selectionStart,
+    //             "end"
+    //         );
+    //         // trigger events to make the field dirty
+    //         this.input.el.dispatchEvent(new InputEvent("input"));
+    //         this.input.el.dispatchEvent(new KeyboardEvent("keydown"));
+    //         this.input.el.focus();
+    //     }
+    // },
 });
diff --git a/static/src/components/charfield/charfield.scss b/static/src/components/dynamic_placeholder_char_field/dynamic_placeholder_char_field.scss
similarity index 100%
rename from static/src/components/charfield/charfield.scss
rename to static/src/components/dynamic_placeholder_char_field/dynamic_placeholder_char_field.scss
diff --git a/static/src/components/charfield/charfield.xml b/static/src/components/dynamic_placeholder_char_field/dynamic_placeholder_char_field.xml
similarity index 92%
rename from static/src/components/charfield/charfield.xml
rename to static/src/components/dynamic_placeholder_char_field/dynamic_placeholder_char_field.xml
index 8b8413ec0b2009b8c386a73b95414f68f9dc1c3d_c3RhdGljL3NyYy9jb21wb25lbnRzL2NoYXJmaWVsZC9jaGFyZmllbGQueG1s..bea2d255368c74fbae5a91e426bbd7eebe665e22_c3RhdGljL3NyYy9jb21wb25lbnRzL2R5bmFtaWNfcGxhY2Vob2xkZXJfY2hhcl9maWVsZC9keW5hbWljX3BsYWNlaG9sZGVyX2NoYXJfZmllbGQueG1s 100644
--- a/static/src/components/charfield/charfield.xml
+++ b/static/src/components/dynamic_placeholder_char_field/dynamic_placeholder_char_field.xml
@@ -13,6 +13,6 @@
     <t t-name="dynamic_placeholder.magicButton">
         <div class="position-relative d-inline">
             <button
-                t-if="showDynamicPlaceholderButton"
+                t-if="activeConverterType"
                 class="btn position-absolute end-0"
                 t-attf-class="{{positionCenter ? 'pb-0 pt-0' : 'bottom-0'}}"
@@ -17,5 +17,6 @@
                 class="btn position-absolute end-0"
                 t-attf-class="{{positionCenter ? 'pb-0 pt-0' : 'bottom-0'}}"
+                t-att-disabled="showPlaceholderButton"
                 t-ref="magicButton"
                 t-on-click="onDynamicPlaceholderOpen"
             >
diff --git a/views/ir_actions_report.xml b/views/ir_actions_report.xml
index 8b8413ec0b2009b8c386a73b95414f68f9dc1c3d_dmlld3MvaXJfYWN0aW9uc19yZXBvcnQueG1s..bea2d255368c74fbae5a91e426bbd7eebe665e22_dmlld3MvaXJfYWN0aW9uc19yZXBvcnQueG1s 100644
--- a/views/ir_actions_report.xml
+++ b/views/ir_actions_report.xml
@@ -46,7 +46,7 @@
                                 <field name="render_model" column_invisible="1" />
                                 <field name="value_placeholder" column_invisible="1" />
                                 <field
-                                    name="dynamic_placeholder_button_hidden"
+                                    name="hide_placeholder_button"
                                     column_invisible="1"
                                 />
                                 <field
@@ -57,8 +57,8 @@
                                         'dynamic_placeholder': true, 
                                         'dynamic_placeholder_model_reference_field': 'render_model', 
                                         'placeholder_field': 'value_placeholder',
-                                        'placeholder_redner': 'dynamic_placeholder_button_hidden',
-                                        'converter_field': 'converter'
+                                        'button_visibility_field': 'hide_placeholder_button',
+                                        'converter_type_field': 'converter'
                                     }"
                                     default_focus="1"
                                 />
diff --git a/views/mail_template.xml b/views/mail_template.xml
index 8b8413ec0b2009b8c386a73b95414f68f9dc1c3d_dmlld3MvbWFpbF90ZW1wbGF0ZS54bWw=..bea2d255368c74fbae5a91e426bbd7eebe665e22_dmlld3MvbWFpbF90ZW1wbGF0ZS54bWw= 100644
--- a/views/mail_template.xml
+++ b/views/mail_template.xml
@@ -42,7 +42,7 @@
                             <field name="render_model" column_invisible="1" />
                             <field name="value_placeholder" column_invisible="1" />
                             <field
-                                name="dynamic_placeholder_button_hidden"
+                                name="hide_placeholder_button"
                                 column_invisible="1"
                             />
                             <field
@@ -53,8 +53,8 @@
                                     'dynamic_placeholder': true, 
                                     'dynamic_placeholder_model_reference_field': 'render_model', 
                                     'placeholder_field': 'value_placeholder',
-                                    'placeholder_redner': 'dynamic_placeholder_button_hidden',
-                                    'converter_field': 'converter'
+                                    'button_visibility_field': 'hide_placeholder_button',
+                                    'converter_type_field': 'converter'
                                 }"
                                 default_focus="1"
                             />