Estoy trabajando en un sistema en el que confiamos que muchos "administradores / gerentes" envíen correos electrónicos a los usuarios desde la base de datos. Una de las características clave es poder enviar correos electrónicos a varias personas al mismo tiempo, con información específica relevante para cada una de ellas. Otra característica clave es poder elaborar correos electrónicos a mano, ya que suele ser necesario modificarlos ligeramente cada vez, pero tener una plantilla básica ahorra mucho tiempo.
Para esto, tenemos la solución típica de "plantillas", donde tenemos una plantilla que se ve así:
Hello {{recipient.full_name}},
Your application to {{activity.title}} has been accepted.
You have requested to participate on dates {{application.dates}}, in role {{application.role}}
Blah blah blah
El problema que tenemos es, obviamente, que (como esperábamos), los gerentes no tienen la idea completa de "variables", y hacen cosas como sobrescribirlas, lo que no les permite enviar correos electrónicos a más de una persona a la vez, suponiendo esos no van a ser reemplazados y que el sistema está roto, o incluso cosas inexplicables como "Hola {{John}}".
El gran problema es que esto no está relegado, como de costumbre, a una sección de "administrador" donde solo unos pocos usuarios avanzados tienen acceso para editar las plantillas que se envían automáticamente, y se espera que sepan lo que están haciendo. Todos los usuarios del sistema quedan expuestos a este problema.
La solución obvia sería reemplazar las variables antes de mostrar esta plantilla para que el usuario la edite, pero eso no funciona cuando se envían correos electrónicos a varias personas.
Esto parece un problema razonablemente común, y esperamos que alguien ya lo haya resuelto.
¿Has visto en alguna parte / creado / puedes pensar en buenas soluciones para este problema?
Actualizar
Lo que terminé haciendo en función de la respuesta de Daniel B fue detectar, en función de la posición del cursor y la posición de {{}} en el código si el usuario está actualmente "dentro de una variable" o "fuera". En el interior, muestro un pequeño fragmento de texto debajo del área de texto grande explicando que esto será reemplazado y que pueden eliminarlo por completo si lo desean, pero no pueden editarlo.
Hago esto en Click, onChange, onKeyDown, onKeyUp. Para los eventos "clave", si estamos dentro de una variable, solo devuelvo VERDADERO si el KeyCode es una de las pocas claves "de navegación". De lo contrario, devuelvo FALSE, lo que efectivamente impide la edición de esa variable.
No es perfecto, pero fue muy barato y parece efectivo.

