Estou trabalhando em um sistema em que confiamos muitos "administradores / gerentes" enviando e-mails a usuários do banco de dados. Um dos principais recursos é poder enviar e-mail para várias pessoas ao mesmo tempo, com informações específicas relevantes para cada uma delas. Outro recurso importante é poder criar e-mails manualmente, porque é necessário modificá-los levemente a cada vez, mas ter um modelo básico economiza muito tempo.
Para isso, temos a solução típica de "modelos", onde temos um modelo mais ou menos assim:
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
O problema que estamos enfrentando é obviamente que (como esperávamos), os gerentes não entendem toda a idéia das "variáveis" e fazem coisas como substituí-las, o que não lhes permite enviar e-mails para mais de uma pessoa por vez, assumindo eles não serão substituídos e que o sistema está quebrado ou até coisas inexplicáveis como "Olá {{John}}".
O grande problema é que isso não é relegado, como sempre, a uma seção "admin", na qual apenas alguns usuários avançados têm acesso à edição dos modelos que são enviados automaticamente, e espera-se que eles saibam o que estão fazendo. Todo usuário do sistema fica exposto a esse problema.
A solução óbvia seria substituir as variáveis antes de mostrar este modelo para o usuário editar, mas isso não funciona ao enviar e-mail para várias pessoas.
Parece um problema razoavelmente comum, e esperamos que alguém já o tenha resolvido.
Você já viu em algum lugar / criou / consegue pensar em boas soluções para esse problema?
Atualizar
O que acabei fazendo com base na resposta de Daniel B foi detectar, com base na posição do cursor e na posição de {{}} no código, se o usuário está atualmente "dentro de uma variável" ou "fora". Por dentro, mostro um pequeno pedaço de texto abaixo da grande área de texto, explicando que isso será substituído e que eles podem removê-lo completamente, se quiserem, mas não podem editá-lo.
Eu faço isso onClick, onChange, onKeyDown, onKeyUp. Para os eventos "key", se estivermos dentro de uma variável, retornarei TRUE apenas se o keyCode for uma das poucas chaves "de navegação". Caso contrário, retornarei FALSE, o que efetivamente impede a edição dessa variável.
Não é perfeito, mas era muito barato e parece eficaz.
Respostas:
Por solicitação dos comentários na resposta de ChrisF, aqui está uma solução que eu usei no passado:
Minha implementação acabou parecendo algo assim:
Possui destaque opcional da variável para diferenciá-la do texto padrão.
Os delimitadores de variáveis estão realmente lá, eles têm as mesmas cores de primeiro e segundo plano.
Obviamente, isso é bem diferente da sua implementação, que é baseada em HTML. Eu provavelmente examinaria como o editor do Gmail é implementado; parece ser semelhante a uma área de texto, mas é capaz de ter imagens embutidas (smilies, etc), que é semelhante ao comportamento que você está procurando.
fonte
Eu consideraria alterar a forma como o modelo é apresentado ao usuário para que você possa tornar as partes que serão alteradas pelo código não editáveis. Algo assim:
Os bits que você não deseja que o usuário altere agora não são editáveis. Você pode incluir um botão Fechar para que eles possam remover os itens, caso não precisem deles. Você também pode incluir texto explicativo e / ou dicas de ferramentas para explicar o que os
{{...}}
bits significam e por que eles devem ser deixados em paz.Usar algo como um Silverlight / WPF
WrapPanel
para cada parágrafo pode fornecer algo que permita que cada parte (editável e não editável) flua à medida que o texto controlado pelo usuário aumenta e diminui.fonte
WrapPanel
para cada parágrafo pode dar a você o que você deseja.