Versão 88

Novidades

Redimensionamento da grade e reordenação de colunas

As grades do sistema passam a permitir o redimensionamento manual da largura das colunas no modo tabela. Para redimensionar uma coluna, basta posicionar o mouse sobre a borda direita do seu cabeçalho e arrastá-la até a largura desejada.

Column resize

Também é possível redimensionar a altura da grade ao posicionar o mouse sobre a sua borda inferior e arrastá-la até a altura desejada.

Height resize

Além do redimensionamento horizontal e vertical das grades no modo tabela, agora também é possível reordenar suas colunas. Para alterar a posição de uma coluna, basta arrastar seu cabeçalho para a nova posição desejada, indicada por uma linha vertical, e soltar o botão do mouse.

Column reorder

As customizações no layout da grade definidas pelo usuário passam a ser salvas automaticamente pelo navegador, sendo restauradas sempre que a mesma grade for aberta novamente. É importante observar que essa configuração fica salva no navegador utilizado e associada ao endereço exato da página acessada, portanto, ao trocar de navegador, computador ou acessar o sistema por um endereço diferente, os redimensionamentos e as reordenações personalizadas não serão recuperadas. Caso deseje descartar as alterações realizadas, a opção “Redefinir grade” no menu de ferramentas da grade permite restaurar as larguras e posições padrão a qualquer momento.

Mais detalhes nos tópicos “Redimensionar colunas” , “Redimensionar altura da grade” e “Reordenar colunas” do manual do usuário.

Classe RegExp no runtime JavaScript Ije

O runtime JavaScript Ije passa a disponibilizar a classe global RegExp , seguindo a especificação ECMAScript. Por se tratar de um identificador global, não é necessário importá-la como módulo, bastando utilizá-la diretamente no código por meio de expressões regulares literais (/pattern/flags) ou utilizando a classe global (new RegExp('pattern', 'flags')).

O objetivo dessa melhoria é permitir o aproveitamento de códigos JavaScript já existentes, bem como de códigos gerados por ferramentas de inteligência artificial, além de proporcionar uma maior interoperabilidade com o runtime JavaScript V8.

Acompanhando essa novidade, os métodos String.prototype.match(), String.prototype.replace() e String.prototype.split() do runtime Ije passam a aceitar instâncias de RegExp como argumento, seguindo a especificação ECMAScript na maior parte dos casos. Também foi implementado o método String.prototype.search(), antes inexistente no runtime Ije, e criado o método String.prototype.replaceAll() . Algumas diferenças em relação à especificação permanecem, como a falta de suporte a uma função como argumento de substituição em replace() e replaceAll(). Mais detalhes na documentação do manual JavaScript .

Com a introdução da classe RegExp, as seguintes APIs passam a ser consideradas obsoletas:

  • O módulo @nginstack/engine/lib/string/replaceAll.js foi substituído pelo método nativo String.prototype.replaceAll().
  • O módulo @nginstack/engine/lib/regexp/replaceAll foi substituído pelo método nativo String.prototype.replaceAll() ou por String.prototype.replace() com um argumento RegExp.
  • A classe Regex , baseada na biblioteca Qt, foi substituída pela classe global RegExp em conjunto com os métodos String.prototype.match(), replace(), search() e split().

Nova geração de PDF baseada no Chrome

A classe HtmlToPdf foi reformulada e passa a utilizar um motor de renderização moderno baseado no Chrome (chrome-headless-shell), substituindo a biblioteca legada wkhtmltopdf.

A nova implementação traz os seguintes benefícios:

  • Fidelidade visual e padrões modernos: suporte completo às especificações modernas de HTML5 e CSS3 (incluindo Flexbox, Grid e fontes web), garantindo que o PDF gerado represente com precisão o leiaute visualizado no navegador.
  • Segurança aprimorada: a biblioteca wkhtmltopdf foi descontinuada e não recebe mais manutenção nem correções de segurança. O uso do Chrome garante atualizações regulares de segurança e conformidade com os padrões modernos.
  • Melhor controle de escala e margens: eliminação de comportamentos imprevisíveis de redução automática de conteúdo (smart shrinking) implementados pela biblioteca wkhtmltopdf. Caso seja necessário ajustar a escala de impressão de documentos para adequá-los ao número de páginas desejado, basta utilizar a propriedade scale. Valores próximos de 0.78 tendem a gerar resultados semelhantes aos da versão legada.
  • Compatibilidade com distribuições Linux modernas: o uso da biblioteca legada wkhtmltopdf restringia o uso do Engine em distribuições Linux mais atuais que não suportavam mais essa biblioteca por motivos de segurança e manutenção.

A nova versão mantém a compatibilidade com a interface pública da antiga API, mas é importante ter atenção aos seguintes pontos:

  • A propriedade extraArguments continua sendo aceita e traduz automaticamente as principais opções legadas (como parâmetros de margens, orientação e templates de cabeçalho/rodapé). No entanto, o seu uso passa a ser desencorajado, devendo-se preferir as propriedades específicas da classe, como orientation, pageSize, scale, headerTemplate, footerTemplate e as propriedades individuais de margens.
  • A implementação anterior foi mantida temporariamente no módulo @nginstack/engine/lib/pdf/WkHtmlToPdf.js para facilitar a transição caso alguma customização apresente particularidades de leiaute. O uso desse módulo deve ser revisto e evitado, pois ele será descontinuado e removido em versões futuras.

Alterações significativas

Novas dependências do Engine em servidores Linux

Com a adoção de uma nova implementação para a geração de PDFs, o Engine passa a exigir bibliotecas do sistema operacional Linux necessárias para a execução do Chrome. Para simplificar a gestão e instalação dessas dependências, foi criado o pacote de sistema engine-deps, disponível para distribuições baseadas em pacotes DEB (Ubuntu, Debian e derivados) e RPM (Red Hat Enterprise Linux, Rocky Linux e Fedora). Esse pacote deve ser instalado uma única vez em todos os servidores Linux que executem o Engine, conforme procedimento abaixo:

  • Para sistemas baseados em DEB (Ubuntu, Debian e derivados):

    curl -fsSL https://<endereco-servidor>/install/setup-apt.sh | sudo bash
    
  • Para sistemas baseados em RPM (Red Hat Enterprise Linux, Rocky Linux e Fedora):

    curl -fsSL https://<endereco-servidor>/install/setup-yum.sh | sudo bash
    

Para mais detalhes, consulte o tópico Instalação das dependências do sistema (engine-deps) do manual de Suporte ao Linux .

Melhorias

Administração do sistema

  • O processo “Administração do sistema > Base de dados > Tabelas e índices” passa a exibir, na grade de índices, a data e hora da última atualização de estatísticas do índice. No PostgreSQL, por não haver uma data de coleta específica por índice, é exibida a data da última coleta de estatísticas (ANALYZE) da tabela à qual o índice pertence.

Engine

  • As credenciais do usuário passam a ser opcionais no método ProductManager.prototype.createProduct . Caso não sejam informadas, será utilizado o usuário corrente da sessão.
  • Foi criada a constante Limits.MAX_AUTH_TOKEN_LENGTH com o objetivo de indicar o tamanho máximo dos tokens de autorização gerados pelo sistema. O seu valor inicial é de 1024 caracteres.

Web Framework

  • Foi criado o método Process.prototype.confirmUser com o objetivo de solicitar a reautenticação do usuário logado na sessão corrente. A funcionalidade exibe um diálogo de confirmação de identidade, sendo indicada para validar a segurança em operações sensíveis. Caso o usuário tenha acessado o sistema por meio de um provedor de identidade externo, o diálogo exibirá também a opção de revalidar a identidade com o respectivo serviço.
  • O método XLSXWriter.prototype.writeString passa a ter como padrão a formatação “General” do Excel. O comportamento anterior passa agora a ser realizado pelo novo método XLSXWriter.prototype.writeText , que aplica por padrão a formatação de texto nos valores escritos.

Extensão VS Code

  • A pesquisa textual passa a contar com estatísticas de performance. Para ativar, basta utilizar o comando Engine DevTools: Toggle Search Statistics. As estatísticas são apresentadas na guia “Output”, no canal “Engine Search Statistics”.

Defeitos corrigidos

Administração do sistema

  • Ao clicar no botão “Exibir índices não utilizados” do processo “Administração do sistema > Base de dados > Tabelas e índices” ocorria o erro “getTime is not a function” quando a base de dados PostgreSQL não possuía uma data de redefinição das estatísticas conhecida. O processo passa agora a utilizar outras datas menos confiáveis como referência para o cálculo de dias sem utilização dos índices e passa a sugerir ao usuário que solicite ao DBA a execução do comando de redefinição das estatísticas para tornar o cálculo mais preciso.

Engine

  • A classe Pop3 poderia realizar uma alocação de memória excessiva durante a leitura de mensagens. Para melhorar o tratamento de mensagens de tamanho desconhecido, o método retrieve passou a suportar a limitação do tamanho máximo dos dados lidos por meio do parâmetro maxSize.

Web Framework

  • A carga da página “/sistema” poderia travar no navegador Chrome.
  • Links em relatórios em árvore poderiam falhar ao restaurar os parâmetros informados no momento da escrita da coluna.
  • O favicon do sistema não considerava corretamente o esquema de cores (claro ou escuro) definido no navegador.
  • Ao exportar dados para Excel, o arquivo era gerado com colunas numéricas formatadas incorretamente como texto. A exportação passa a respeitar o tipo de dado, definindo a formatação com base nos dados da coluna.

Outras alterações

Engine

  • O módulo @nginstack/engine/lib/print/HtmlToPdf.js foi movido para @nginstack/engine/lib/pdf/HtmlToPdf.js . O caminho anterior foi mantido apenas para fins de compatibilidade com os códigos existentes.

Web Framework

  • A largura do grupo de colunas da grade no modo tabela passa a respeitar estritamente a largura dos campos. Anteriormente, o grupo forçava a expansão dos campos além desse limite. Como consequência, os títulos de grupos poderão ser truncados caso excedam o espaço definido.

  • Os seguintes processos foram revistos para serem compatíveis com a autenticação e confirmação de usuários por meio de provedores de identidade externos:

    • Administração do sistema > Auditoria > Reversão de alterações
    • Administração do sistema > Cache local > Descarte dos caches de dados e de chaves
    • Administração do sistema > Ferramentas para chaves > Substituição de referências
    • Desenvolvimento > Produtos > Migração de chaves entre produtos
    • Desenvolvimento > Produtos > Recriação de faixa de chaves
    • Desenvolvimento > Produtos > Licenciamento > Criação de licença
    • Perfil do usuário > Segurança
  • A opção de informar campos customizados no chatbot Octadesk foi desativada. Essa opção pode ser reativada por meio de um chatbot customizado, seguindo orientação do suporte da Octadesk. Mais detalhes em Chatbot .

  • A função newSettingsGrid passa a gerar nomes derivados a partir de settingsId caso não seja informado um nome explicitamente. Essa alteração tem o objetivo de garantir que as preferências do usuário das grades de configuração sejam preservadas mesmo quando o nome não é explicitamente informado. Um efeito colateral dessa alteração é que passa a ser obrigatório informar o nome das grades de configuração, caso seja necessário criar mais de uma grade para o mesmo settingsId em um mesmo processo.