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.
Respuestas:
A pedido de los comentarios en la respuesta de ChrisF, aquí hay una solución que he usado en el pasado:
Mi implementación terminó pareciéndose a esto:
Tiene resaltado opcional de la variable para diferenciarla del texto estándar.
Los delimitadores variables están realmente allí, simplemente tienen los mismos colores de primer plano y fondo.
Obviamente, esto es bastante diferente a su implementación, que está basada en HTML. Probablemente me gustaría ver cómo se implementa el editor de Gmail; parece ser similar a un área de texto, pero puede tener imágenes en línea (emoticones, etc.), que es similar al comportamiento que está buscando.
fuente
Consideraría cambiar la forma en que se presenta la plantilla al usuario para que pueda hacer que las partes que serán cambiadas por el código no sean editables. Algo como esto:
Los bits que no desea que el usuario cambie ahora no son editables. Puede incluir un botón de cierre para que puedan eliminar los elementos si no los necesitan. También puede incluir texto explicativo y / o información sobre herramientas para explicar qué
{{...}}
significan los bits y por qué deben dejarse solos.Usar algo como Silverlight / WPF
WrapPanel
para cada párrafo podría proporcionarle algo que permita que cada parte (editable y no editable) fluya a medida que el texto controlado por el usuario crece y se reduce.fuente
WrapPanel
para cada párrafo podría darte algo como lo que quieres.