Versão 89

Novidades

Preenchimento rápido de filtros com valores salvos

As grades de variáveis passam a permitir que o usuário salve os valores informados em conjuntos nomeados e os aplique novamente com um clique, alternando rapidamente entre diferentes conjuntos de valores sem precisar preenchê-los a cada uso.

Saved values

Datas e períodos podem ser salvos como expressões de data , como “Início do mês” ou “Data atual”, que são calculadas novamente a cada uso. Conjuntos podem definir apenas alguns campos, permitindo que sejam mesclados com outros valores informados pelo usuário.

Essa funcionalidade é habilitada por padrão em todos os relatórios e visualizações de dados. Nos demais processos, ela pode ser ativada por meio da propriedade showSavedValuesBar da grade. Mais detalhes no tópico “Valores salvos” do manual do usuário.

Rolagem horizontal e redimensionamento da largura da grade

As grades passam a poder ter a sua largura limitada no modo tabela. Quando as colunas não cabem na largura da grade, elas são roladas dentro dela, em vez de aumentarem a largura do processo. A barra de título, os botões e a pesquisa da grade permanecem visíveis durante a rolagem.

Width resize

O usuário pode redimensionar qualquer grade arrastando a sua borda direita, da mesma forma que já fazia com as colunas e com a altura da grade. A nova opção “Ajustar à largura da tela”, no menu de ferramentas da grade, faz a grade ocupar exatamente a largura visível e acompanhar o tamanho da janela, o que também pode ser feito com um duplo clique sobre a borda direita. A largura escolhida fica salva no navegador e é descartada pela opção “Redefinir grade”.

Mais detalhes no tópico “Redimensionar largura da grade” do manual do usuário e no manual do componente Grid .

Grupos de botões na grade

Os processos e as grades passam a permitir que botões relacionados sejam reunidos em grupos. O grupo é exibido na barra de botões como um botão com uma seta ao lado do rótulo, que abre um menu com os botões do grupo.

Além de deixar a barra de botões mais enxuta, os grupos de botões permitem reunir funcionalidades relacionadas ou de pouco uso sem que deixem de estar acessíveis. Todos os botões mantêm as suas teclas de acesso, mesmo quando estão dentro de um grupo.

A barra de botões também deixa de forçar a expansão lateral da grade. Os botões que não couberem na largura da grade passam a ser reunidos no novo botão “Mais” e voltam para a barra sempre que houver espaço. Se desejado, a propriedade Grid.prototype.width pode ser utilizada para definir uma largura da grade suficiente para exibir todos os botões.

Mais detalhes no tópico “Grupos de botões e botão Mais” do manual do usuário, no manual do componente Grid e na documentação da classe ButtonGroup .

Novo seletor de data

Os campos de data passam a utilizar um seletor de data do próprio sistema no lugar do seletor nativo dos navegadores. Com isso, o calendário passa a ter a mesma aparência e os mesmos recursos em todos os navegadores suportados, acompanhando o tema, o modo escuro e a densidade escolhidos pelo usuário, além de se adaptar melhor a telas estreitas.

Date selector

O seletor passa a contar com o novo painel “Sugestões de datas”, que lista as datas de uso frequente, como “Data atual”, “Fim do mês” e “Fim do mês anterior”. Cada item do painel corresponde a uma expressão de data , permitindo que o usuário conheça os atalhos de datas e períodos que podem ser digitados diretamente no campo.

Mais detalhes no tópico “Campos de data” do manual do usuário.

Modernização das políticas de senha

A configuração de políticas de senha do sistema foi revista para seguir recomendações de segurança mais atuais e para tornar a atribuição das regras mais simples. Seguem abaixo as principais mudanças:

  • O processo “Administração do sistema > Segurança > Políticas de segurança > Regras de formação e uso de senhas” foi renomeado para “Políticas de senha” e passa a ser o local central de configuração das políticas de senha do sistema. As políticas de senha deixam de ser atribuídas indiretamente pelas políticas de usuários e passam a ser atribuídas diretamente aos usuários, grupos e papéis nesse processo.
  • As regras de prevenção de reuso passam a ser parametrizáveis, permitindo ao administrador definir quantas das últimas senhas e por quantos dias as senhas anteriores não podem ser reutilizadas.
  • A opção “Aceita repetição de caracteres” foi substituída por um novo controle obrigatório que impede que os usuários utilizem senhas triviais, como repetições (“aaaaaa”, “111111”) ou sequências (“abcdef”, “123456”) de caracteres, e senhas que contenham o nome do usuário, o nome da base de dados ou do sistema.
  • O sistema passa a bloquear por padrão o uso de senhas comuns ou que tenham sido expostas em vazamentos de dados, por meio de uma lista que pode ser complementada pelo administrador, do algoritmo “zxcvbn” e do serviço Have I Been Pwned .
  • A política de senha padrão do sistema passa a exigir senhas com no mínimo 8 caracteres e no máximo 128. Ela também deixa de exigir a troca periódica de senha, seguindo as recomendações atuais do NIST SP 800-63B e do OWASP ASVS .
  • O usuário passa a poder consultar o histórico de alterações de senha, funcionalidade disponível na opção Segurança do menu do Perfil do usuário. Essas informações também passam a estar disponíveis para os administradores por meio do relatório “Administração do sistema > Segurança > Grupos, papéis e usuários > Histórico de alterações de senha”.
  • A alteração de senha no processo “Administração do sistema > Segurança > Grupos, papéis e usuários > Usuários” passa a gerar uma senha diferente para cada usuário quando a opção “Gerar senha automática” é selecionada.
  • Foi criada a propriedade ViewDefField.prototype.showPasswordStrength com o objetivo de exibir um indicador de força de senha nos campos do tipo password das grades e formulários. Essa propriedade é ativada por padrão nos campos de mudança de senha.

Mais detalhes no manual Políticas de senha .

Alterações significativas

Largura da grade no modo tabela

A propriedade Grid.prototype.width deixa de ser apenas uma largura mínima no modo tabela. As grades que informam essa propriedade passam a respeitar a largura informada, e as colunas que não couberem são roladas dentro da grade.

  • Grades que informavam um valor menor que a largura das suas colunas, para garantir uma largura mínima, passam a exibir a rolagem horizontal. Para manter a grade do tamanho do conteúdo, a propriedade não deve ser informada.
  • Um percentual, que antes não tinha efeito, passa a ser calculado sobre a largura visível do processo. Com '100%', a grade vai até a borda visível e acompanha o tamanho da janela.
  • Quando a largura é menor que a barra de título, apenas o título é reduzido, cortado com reticências. A grade nunca fica mais estreita que o necessário para exibir os botões fixos, os contadores e o início do título.
  • As grades que não informam a propriedade e o modo formulário não foram alterados.

Recomenda-se revisar os processos que definem a largura das suas grades. Mais detalhes no manual do componente Grid .

Migração das atribuições de políticas de senha

O processo de atualização do sistema migrará automaticamente as atribuições de regras existentes nas políticas de usuários para o novo formato de configuração. É importante que as atribuições das políticas de senha sejam revistas após a atualização, sendo recomendado que seja mantida uma política de senha comum para todos os usuários do sistema.

Após a migração, as políticas de usuários não devem mais ser utilizadas para obter a política de senha aplicada aos usuários. Processos customizados que fazem uso do campo iPasswordRule devem ser revistos para utilizar a nova classe PasswordValidator , conforme exemplo abaixo:

const PasswordValidator = require('@nginstack/engine/lib/security/PasswordValidator.js');

const passwordValidator = new PasswordValidator();
const result = passwordValidator.validatePassword(newPassword);
result; // => { valid: true, strength: 3, suggestions: [], message: 'Senha válida.' }
const passwordStatus = passwordValidator.getPasswordStatus();
passwordStatus; // => { valid: true, lastChange: Date, daysToExpire: 30, expiringSoon: false }

Melhorias

Administração do sistema

  • O processo “Administração do sistema > Base de dados > Tabelas e índices” agora exibe uma opção que permite desativar os índices não utilizados diretamente no relatório.
  • O processo “Administração do sistema > Licenciamento > Produtos licenciados” passa a validar se todos os requisitos necessários dos produtos licenciados estão atendidos antes de efetivar um novo licenciamento, evitando que a base de dados fique em um estado inconsistente. O usuário também passa a ser alertado da necessidade da execução da atualização de sistema logo após o licenciamento, processo necessário para concluir a ativação e instalação dos novos produtos licenciados.
  • As grades dos processos “Administração do sistema > Base de dados > Tabelas e índices” e “Administração do sistema > Armazenamento de arquivos > Gerenciamento de armazenamento” passam a permitir a ordenação pelas colunas de tamanho.
  • O sistema passa a contar com o relatório “Administração do sistema > Auditoria > Eventos de telemetria”, no qual o administrador pode consultar os registros de telemetria enviados pelo sistema.

Desenvolvimento

  • O relatório final do processo “Desenvolvimento > Atualização > Atualização do sistema” passa a listar os pacotes JAZ atualizados.
  • O processo “Desenvolvimento > Atualização > Atualização do sistema” passa a recriar os índices das tabelas de forma alternada, garantindo que os índices sejam recriados imediatamente após serem removidos.

Engine

  • Foi criado o método Security.prototype.canCollectUserCredentials para indicar se a política de autenticação aplicada permite coletar as credenciais do usuário.
  • Foram criados os métodos Session.prototype.encryptUserData e Session.prototype.decryptUserData com o objetivo de gravar dados pertencentes ao usuário na base de dados de forma criptografada. Os dados somente podem ser recuperados em uma sessão autenticada pelo mesmo usuário.
  • A seção Configuração do fuso horário do manual de suporte ao Linux foi revista para deixar mais clara a necessidade de configurar o mesmo fuso horário nos arquivos /etc/localtime e /etc/timezone. O Engine Linux também passa a registrar um alerta no log durante a sua inicialização caso detecte uma inconsistência entre esses arquivos, situação que pode provocar a exibição de datas e horas incorretas.
  • As mensagens geradas por bibliotecas Java por meio do java.util.logging e registradas no log “java.log” passam a ser gravadas com a prioridade original da mensagem, em vez de sempre serem registradas como erro. A data e a hora geradas pelo Java também deixam de ser repetidas no conteúdo da mensagem.
  • A página Sessions do Manage agora agrupa as sessões por Realm, indicando o total de cada um.
  • A inicialização do Engine no Linux passa a exibir uma mensagem de alerta no console caso seja informado o endereço do servidor sem indicar a base de dados.
  • Foi criada a classe FormData com o objetivo de criar e serializar requisições do tipo multipart/form-data. A nova classe tenta seguir a especificação definida em Web API FormData , mas possui diferenças importantes devido às características do runtime JavaScript do Engine, descritas na documentação JavaScript .
  • A classe XMLHttpRequest passa a aceitar uma instância de FormData no método .send().
  • As funções estáticas .digest() e .hexDigest() das classes HMAC, MD5, SHA1, SHA256 e SHA512 passam a aceitar as classes File e MemoryStream como argumento.

Web Framework

  • Os campos do tipo data passam a aceitar expressões que representam o início ou o fim de uma semana, mês, trimestre, semestre ou ano, combinadas com deslocamentos em dias, semanas, meses, trimestres, semestres ou anos. Com isso, é possível informar datas como o último dia do mês anterior (fm-1m), o início do trimestre anterior (it-1t) ou o mesmo dia do ano anterior (-1a). Também passam a ser aceitas as expressões hoje, ontem e amanhã, e as expressões deixam de diferenciar letras maiúsculas e minúsculas, como em FM e +1M, que antes eram rejeitadas. Consulte a página Expressões de data para a lista completa de expressões suportadas.
  • Foi criado o formato NumberFormat.FILE_SIZE com o objetivo de exibir tamanhos em bytes em campos da grade e colunas do SimpleLayout, como 1,5K, 20M e 2G, dispensando o uso de campos calculados com a função formatFileSize. Nos campos editáveis, o valor pode ser informado com as mesmas unidades de medida.
  • Foi criada a propriedade FieldAggregator.prototype.displayFormat com o objetivo de definir o formato de exibição dos totalizadores da grade. Por padrão, é utilizado o formato do campo totalizado.

Defeitos corrigidos

Administração do sistema

  • A replicação de dados poderia sobrescrever os campos de início e fim de vigência dos usuários na base de dados de destino. Esses campos agora são preservados durante a sincronização.

Desenvolvimento

  • O script uploadToVfs do pacote @nginstack/build-tools poderia não reconhecer as configurações informadas no arquivo .env.local quando executado manualmente, fora de um pipeline de build. É recomendado que os pacotes que dependam desse script sejam atualizados para a versão 89.0.2 ou superior (^89.0.2).
  • O processo “Desenvolvimento > Atualização > Visualizador de diferenças da VFS” sempre falhava com o erro “Failed attempt of connection to the Engine” ao clicar no botão “Executar”.

Engine

  • Em situações muito específicas, a função JSON.stringify poderia serializar incorretamente valores inteiros como null no runtime JavaScript Ije.
  • A carga das páginas “/manage” e “/install” poderia falhar quando acessadas sob concorrência no Engine Linux.
  • A integração do Engine com o Java foi revista para evitar situações que poderiam deixar a máquina virtual Java em um estado inconsistente, como falhas no registro das saídas do Java no log “java.log” e a desassociação indevida de threads que já estavam associadas à máquina virtual. Também foi corrigido o retorno de scripts executados pelo Java por meio da classe EngineJavaInterface, que poderia ser corrompido em situações de concorrência. Para facilitar o diagnóstico de requisições bloqueadas, o status das conexões passa a detalhar a etapa em execução na verificação das classes Enginelet, como a associação da thread à máquina virtual e a carga da classe.
  • Uma falha na geração de números aleatórios não era detectada em algumas rotinas de criptografia do Engine, que poderiam prosseguir com valores que não eram aleatórios. Essas rotinas agora são interrompidas com um erro nessa situação.
  • A classe XMLHttpRequest poderia falhar ao carregar certificados de cliente no formato PFX (PKCS#12) codificados no formato BER ou protegidos por alguns algoritmos de criptografia antigos, como o 3DES e o RC2-40. Nesses casos, a classe passa a ativar automaticamente o modo de compatibilidade useNativeTls.
  • O roteador HTTP do Engine falhava com o erro “Vector index out of bounds” se o diretório “routes” de um pacote estivesse vazio.
  • O cache local de Engines que ficavam alguns dias sem serem executados poderia manter uma versão desatualizada do conteúdo de arquivos da VFS, mesmo após o reinício do Engine. Uma rotina executada após a atualização ajustará os arquivos eventualmente afetados.

Web Framework

  • Ao passar o mouse sobre botões sem ajuda e sem atalho de teclado associado, ocorria a exibição de um tooltip vazio. O sistema agora deixa de exibir o tooltip nesses casos.
  • A funcionalidade de “Exibir chaves” da grade não considerava corretamente a visibilidade do campo Chave quando ela variava entre os diferentes modos de exibição da grade. O uso dessa funcionalidade também poderia falhar com o erro “Não existem campos visíveis para exibição” caso as propriedades formViewFieldNames e tableViewFieldNames fossem informadas com uma lista de campos separados por “,”.
  • A marcação de campos checkbox da grade poderia falhar em navegadores de dispositivos móveis.
  • O título da grade lookup apresentava um valor incorreto caso o usuário exibisse as chaves dos registros.
  • Menus exibidos dentro de processos, como a lista de links de um campo, poderiam ser posicionados distantes do botão que os abriu quando não havia espaço suficiente abaixo ou à direita do botão e o menu precisava ser aberto acima ou à esquerda dele.
  • Os totalizadores de campos da grade ignoravam a propriedade displayFormat do campo totalizado, como no formato NumberFormat.DBKEY, que era exibido com separador de milhar, e nos formatos de data, sempre exibidos como dia/mês/ano.
  • A validação de interdependência entre registros dos produtos do sistema não estava sendo executada corretamente no preenchimento de campos do tipo lookup.
  • O mecanismo de invalidação do cache dos arquivos estáticos do Web Framework no navegador poderia falhar logo após uma atualização de sistema, criando inconsistências visuais na interface do sistema.

Outras alterações

Engine

Web Framework

  • O botão do menu de ferramentas da grade passa a exibir o tooltip “Ferramentas da grade” em vez de “Opções adicionais”.
  • Os atalhos alternativos para inserir e excluir registros na grade passam de “Alt + +” e “Alt + -” para “Ctrl + Shift + +” e “Ctrl + Shift + -”. A combinação “Alt + +” passa a abrir o menu do botão “Mais”. Os atalhos “Insert” e “Ctrl + Delete” foram mantidos.
  • O título padrão da grade de variáveis dos relatórios e visualizações de dados passa a ser “Filtros” em vez de “Variáveis”. A propriedade vars.title pode ser utilizada para alterar o título padrão caso seja necessário.