Changelog Conheça a evolução das versões do Framework
Inscrições abertas para nosso Webinar anual Adianti Framework 2024!
Clique aqui para saber mais
Changelog
O que mudou nas versões do Adianti Framework.
Pacote Dominando o Adianti 7
Curso + Livro + Apps exemplo
Curso completo em Video Aulas (114 aulas).
Livro completo em PDF (463 páginas).
Códigos-fontes de Apps de Exemplo.
Adianti Framework 7.6.0 (2023-12-20)
"You Can't Beat God's Giving" release


  • Informações gerais
    • Para quem possui aplicações na versão 7.5.0 podem seguir o tutorial de migração para atualizar para a 7.6.0;
    • Mudanças no licenciamento do Framework (aqui) e do Template (aqui).
  • Melhorias globais
    • Compatibilidade com PHP8.3 (Framework, Template, Tutor).
    • Atualizada DomPDF para versão 2.0.3
    • Atualizada Firebase jwt para versão 6.9.0
    • Atualizada Bacon QRCode para versão 2.0.8
    • Atualizada PHPMailer para versão 6.8.1
    • Pacote pablodalloglio/spreadsheet_excel_writer atualizado com fixes para PHP8.3.
    • Novo pacote pablodalloglio/phprtflite com implementações para PHP8.3.
  • Novos componentes
    • Um novo componente para Escala Likert foi desenvolvido. Verifique na aplicação tutor.
  • Melhorias do Template:
    • Melhorias no estilo do menu no Tema 3.
    • Novo preloader.
    • Cadastro usuários agora com formulário de edição em cortina, filtros em cortina e busca global no header.
    • Cadastro grupos agora com formulário de edição em cortina, filtros em cortina e busca global no header.
    • Cadastro unidades agora com formulário de edição em cortina, filtros em cortina e busca global no header.
    • Cadastro programas agora com formulário de edição em cortina, filtros em cortina e busca global no header.
    • Cadastro de programas: agora a listagem de grupos usa TDBCheckList, mais fácil de manusear.
    • Cadastro de usuários: Implementado o código personalizado do usuário, que é disponibilizado na nova variável de sessão usercustomcode.
    • Cadastro de unidades: Implementado o código personalizado da unidade, que é disponibilizado na nova variável de sessão userunitcustomcode.
    • Novo programa para demonstrar as variáveis de sessão (SystemSessionVarsView).
    • As traduções do template agora são separadas das traduções da aplicação. Para tal, uma nova classe foi implementada (AdiantiTemplateTranslator). Com isso, no futuro, não será mais necessário editar o ApplicationTranslator em função de atualizações do Framework.
    • As funções de abas globais e MDI windows foram separadas em um plugin. Para serem utilizadas, deverão ser importadas:
      <script src="lib/adianti/include/mdi_tabs.js" type="text/javascript"></script> __adianti_init_tabs({use_tabs}, {store_tabs}, {use_mdi_windows});
    • Agora o template registra o tempo de carregamento das páginas (quando o request log está ligado). Isto está presente no logo de requisições (nova coluna).
    • O dashboard de logs agora contém um novo indicador com o tempo médio das requisições.
    • O dashboard de logs agora contém um novo gráfico com o tempo médio de requisição (ms) por dia.
    • O dashboard de logs agora contém uma tabela com um ranking das páginas mais lentas.
    • O dashboard de logs agora contém uma tabela com um ranking dos métodos mais lentos.
  • Melhorias de segurança.
    • Foi alterado o algoritmo de hash padrão das senhas. Agora será brypt (mais seguro) usando password_hash().
    • A transição para o novo algoritmo de senhas será transparente e de forma a manter compatibilidade com o algoritmo atual. A troca será automática a partir do novo login dos usuários.
    • Um novo validador de senhas foi implementado, exigindo senhas fortes aos usuários. É necessário habilitá-lo:
      [general] ; Habilita validador forte de senhas validate_strong_pass = "1"
    • A mensagem de usuário não encontrado ou senha inválida agora é sempre genérica: "Usuário não encontrado ou senha errada".
    • Implementado 2FA (Two Factor Authentication) nativo usando TOTP.
    • Foi criado um novo formulário para o usuário habilitar o 2FA dentro do seu perfil (SystemProfile2FAForm).
    • Após o login, será solicitado ao usuário o código 2FA, quando estiver habilitado em seu perfil.
    • Na listagem administrativa de usuários, é exibido agora quais usuários estão com 2FA habilitado.
  • Melhorias no permissionamento
    • Um novo cadastro de papéis foi desenvolvido.
    • No cadastro de usuários, agora é possível selecionar quais são seus papéis (Ex. Gestor financeiro).
    • Os papéis do usuário são disponibilizados por novas variáveis de sessão: userroleids e userroles.
    • Agora é possível restringir o acesso à alguns métodos somente à alguns papéis de usuário. No cadastro de programas agora foi criada a listagem métodos restritos. Quando um método tiver alguma restrição, somente os papéis ali indicados poderão acessar ele.
    • Este modelo novo de permissões é totalmente compatível com o modelo anterior. Caso as restrições por métodos não sejam cadastradas, vale o acesso por classe (página) como um todo.
    • O Template desabilitará automaticamente botões de ação quando um método tiver uma restrição não satisfeita (Ex. botão de edição em datagrid, botão de ação em formulário).
  • Melhorias na camada de banco
    • O tempo de abertura de transações foi aprimorado.
    • Conexões SQL Server devem adicionar isto a partir do Ubuntu 20.04:
      opts = ";ENCRYPT=yes;trustServerCertificate=true"
    • Menos operações com o banco são realizadas pelo método onBeforeStore() do ChangeLogTrait, resultando em melhores tempos (para os casos em que o change log está habilitado).
    • Melhorado o ChangeLogTrait para não mais exibir campos que não eram alterados simplesmente como deletados (Ex. Edição do usuário em que não altera o campo senha).
    • Vários índices faltantes nas bases permission, communication e log foram criados nos updates das migrations.
    • Novas constantes de classe foram criadas nas models para indicar os campos que registram a informação do usuário que (criou, alterou, excluiu) o registro. A constante USERBYATT indica qual atributo da sessão irá alimentar essas variávies (id, login, código personalizado). DELETEDBY somente faz sentido ao utilizar soft deletes.
      const CREATEDBY = 'created_by'; const UPDATEDBY = 'updated_by'; const DELETEDBY = 'deleted_by'; const USERBYATT = 'userid'; (padrão)| 'login' | 'usercustomcode'
    • Suporte ao operador between no where(). Contribuição de Carlos Eduardo.
      Product::where('stock', 'between', [10,20])->load();
    • Agora é possível informar uma callback de transformação nos método de agregação (Ex. avgBy) para p.e. formatar os dados de saída.
      $stats = SystemRequestLog::groupBy('class_name') ->where('log_year', '=', date('Y')) ->where('log_month', '=', date('m')) ->orderBy('avg', 'desc') ->sumByAnd('request_duration', 'total') ->avgBy('request_duration', 'avg', function($v) { return round($v,2); });
    • Agora é possível informar uma callback de transformação para um atributo selecionado.
      $customers = Customer::select('id', 'name') ->where('gender', '=', 'M') ->where('name', 'like', 'A%') ->transformColumn('name', function($v) { return strtoupper($v); }) ->load();
    • O método dropTable(), que antes era experimental, agora é oficialmente suportado para realizar operações de DDL baixo nível para apagar tabela.
      TDatabase::dropTable($conn, 'city', true);
    • O método createTable(), que antes era experimental, agora é oficialmente suportado para realizar operações de DDL baixo nível para criar tabela.
      TDatabase::createTable($conn, 'city', [ 'id' => 'int', 'name' => 'varchar(100)']);
    • O método addColumn(), que antes era experimental, agora é oficialmente suportado para realizar operações de DDL baixo nível para adicionar coluna.
      TDatabase::addColumn($conn, 'city', 'obs', 'varchar(100)', '');
    • O método dropColumn(), que antes era experimental, agora é oficialmente suportado para realizar operações de DDL baixo nível para apagar coluna.
      TDatabase::dropColumn($conn, 'city', 'obs');
    • O método execute(), que antes era experimental, agora é oficialmente suportado para realizar operações de DDL baixo nível.
      TDatabase::execute($conn, "CREATE INDEX city_name_idx ON city(name)"); TDatabase::execute($conn, "UPDATE product set sale_price = sale_price * 1.3");
    • O método getData(), que antes era experimental, agora é oficialmente suportado para realizar operações de obtenção de dados.
      $raw_data = TDatabase::getData($source, $query, $mapping, ['2015-01-01']);
    • O método insertData(), que antes era experimental, agora é oficialmente suportado para realizar operações de inserção de dados de baixo nível.
      TDatabase::insertData($conn, 'city', [ 'id' => 1, 'name' => 'New York' ]);
    • O método updateData(), que antes era experimental, agora é oficialmente suportado para realizar operações de atualização de dados de baixo nível.
      TDatabase::updateData($conn, 'product', $values, $criteria);
    • O método clearData(), que antes era experimental, agora é oficialmente suportado para realizar operações de limpeza de tabela de baixo nível.
      TDatabase::clearData($conn, 'city');
  • Mudanças incompatíveis com versões anteriores
    • No PostgreSQL 16, system_user passou a ser uma palavra reservda, portanto, infelizmente precisaremos alterar esse nome de tabela. As instruções de migration já contemplam esta alteração. Os ajustes serão pequenos (ALTER TABLE e alterar nome na model).
  • Novos exemplos:
    • Criado novo exemplo para demonstrar um utilização de datagrid sobre Rest. Verifique na aplicação tutor.
    • Criado novo exemplo para demonstrar um utilização de datagrid sobre Query pura. Verifique na aplicação tutor.
    • Criado novo exemplo para demonstrar como copiar conteúdos para a área de transferência. Verifique na aplicação tutor.
  • Outras melhorias:
    • Implementado método TCheckList::checkAll(). Verifique na aplicação tutor.
    • Implementado método TCheckList::checkNone(). Verifique na aplicação tutor.
    • Novo método: AdiantiStandardFormTrait::setAfterSaveCallback().
    • TFieldList permitir fazer total mesmo sem o clone button.
    • Implementado CardView addActionGroup().
    • AdiantiHttpClient::request(): novo parâmetro $headers.
    • TTransaction::setLogger() aceita null para limpar.
    • TMultiEntry::setValueSeparator().
    • Template Handler suporta string '0' no number_format.
    • AdiantiHttpClient::request(): Melhor controle de retorno de erro.
    • Novo método BootstrapFormBuilder::getFormTitle().
  • Correções de bug:
    • Dezenas de deprecated PHP8.3
    • Ao apagar usuário, limpar old_password.
    • Se usa $entry->setEditable(FALSE), depois, quando habilita ele com TEntry::enableField('classe', 'TEntry') o setExitAction não funciona mais.
    • Funções aggregate (sumBy) não ignoravam registros trash.
    • TEntry uppercase e lowercase agora mantém a posição do cursor.
    • Reload permissions do template perdia a unidade selecionada na tela de login.
Adianti Framework 7.5.1 (2023-01-20)
"Hunting high and low" release
  • Informações gerais
    • Para quem possui aplicações na versão 7.5.0 podem seguir o tutorial de migração para atualizar para a 7.5.1;
  • Melhorias globais
    • Suporte à PHP 8.2 (Alterações principais na classe TPage - #[\AllowDynamicProperties]).
    • Compatibilidade com a nova Popover API nativa a partir do Chrome 112 (Alteração principal no adianti.js - função __adianti_process_popover()).
      Atenção: Sem essa atualização, elementos que utilizavam Popover (popover="true") deixarão de funcionar a partir do Chrome 112, ocasionando comportamentos indesejáveis, como simplesmente não aparecerem na tela ou aparecerem com o visual estranho. Isto se dá pois o Chrome 112 irá entregar a nova API de Popover nativa, que introduz justamente um atributo com o nome "popover". Como o Framework já usava este atributo, precisamos fazer alterações para evitar conflito com a API nativa. Portanto, esta atualização se faz necessária. Caso você não queira atualizar o Framework completamente, atualize pelo menos esta função indicada acima, implantando-a por exemplo ao final do application.js (temporariamente). Lembre-se que o melhor caminho sempre é atualizar o Framework como um todo.
    • Corrigido bug na TMultiFile.
Adianti Framework 7.5.0 (2022-12-12)
"Heal the World" release

  • Informações gerais
    • Para quem possui aplicações na versão 7.4.0 podem seguir o tutorial de migração para atualizar para a 7.5.0;
  • Melhorias globais
    • Biblioteca jQuery foi atualizada para a 3.6.1.
    • Biblioteca jQuery UI foi atualizada para a 1.13.2.
    • Biblioteca Moment JS foi atualizada para a 2.29.4.
    • Biblioteca Bacon QRCode foi atualizada para a 2.0, compatível com PHP8.1
  • Novos componentes
    • Um novo componente TGantt foi desenvolvido. Verifique na aplicação tutor.
    • Um novo componente TPillBar foi desenvolvido.
  • Melhorias no Template:
    • Um novo módulo para gestão de documentos foi criado.
    • Um novo módulo para gestão de contatos foi criado.
    • Um novo módulo para gestão de notícias foi criado.
    • Um novo módulo para gestão de páginas Wiki foi criado.
    • Uma nova página para busca de contatos foi criada.
    • Agora são armazenados os metadados do aceite de termos do serviço e política de privacidade. Na listagem de usuários, o sim/não (aceite) agora é clicável para mostrar ess
    • Criada política de expiração de senha de tempos em tempos, não permitindo reutilizar senhas antigas. Para habilitar este recurso é necessário adicionar no application.ini na seção [general]: password_renewal_interval = 30
      [general] ; Habilita expiração de senha após XX dias password_renewal_interval = 30
    • A lista de tabelas do database explorer agora é com icon view.
    • Melhorias gerais de estilo, cores e fontes nos temas 3 e 4
    • Botão que recarrega permissões, agora recarrega todas variáveis de sessão vinculados ao usuário (grupos, unidades), não somente os programas.
  • Melhorias na camada de banco
    • Criada a posição "opts" nos conectores de banco de dados, permitindo passar parâmetros opcionais para a string de conexão da PDO.
    • Criada o tipo de conexão "odbc". Neste caso, todos parâmetros deverão ser passados via "opts".
    • Criadas as opções "fnat" para ligar CASE_NATURAL (manter os nomes das colunas como retornado pelo driver), e fupp para ligar CASE_UPPER para forçar nomes de colunas em maiúsculo.
  • Novos exemplos:
    • Criado novo exemplo para demonstrar um Gantt puro. Verifique na aplicação tutor.
    • Criado novo exemplo para demonstrar um Gantt com banco de dados. Verifique na aplicação tutor.
    • Criado novo exemplo para demonstrar uma Datagrid com filtro em cortina lateral. Verifique na aplicação tutor.
    • Criado novo exemplo para demonstrar uma Datagrid com filtro em janela. Verifique na aplicação tutor.
    • Criado novo exemplo para demonstrar cadastro de uma página (Form/Datagrid) com formulário em cortina. Verifique na aplicação tutor.
    • Criado novo exemplo para demonstrar cadastro de uma página (Form/Datagrid) com formulário em janela. Verifique na aplicação tutor.
    • Criado novo exemplo para demonstrar o uso de session variables em critérios. Verifique na aplicação tutor.
    • Exemplo de TCheckList foi alterado para demonstrar novo evento de seleção de registros. Verifique na aplicação tutor.
    • Exemplo de TCheckList foi alterado para demonstrar novo método para habilitar/desabilitar. Verifique na aplicação tutor.
    • Exemplo de TFieldList foi alterado para demonstrar novo método para habilitar/desabilitar. Verifique na aplicação tutor.
    • Exemplo de Html Editor foi alterado para demonstrar como inserir conteúdo dinamicamente. Verifique na aplicação tutor.
    • Os exemplos que dependiam do antigo Studio, agora foram reescritos em PHP puro com FPDF. Verifique na aplicação tutor aqui. e aqui.
  • Outras melhorias:
    • Agora é possível usar variáveis de sessão em critérios: {session.variable} (avaliada só em tempo de execução). Verifique na aplicação tutor.
    • Agora é possível determinar uma altura padrão para os estágios do Kanban.
      $kanban->setStageHeight('80vh');
      Verifique na aplicação tutor.
    • Agora o TSpinner é configurável para ficar com os botões à esquerda e à direita (enableStepper). Verifique na aplicação tutor.
    • Agora o TDBCheckList possui um evento específico para quando o usuário seleciona os registros. Verifique na aplicação tutor.
    • Agora é possível habilitar/desabilitar um TCheckList inteiro. Verifique na aplicação tutor.
    • Agora é possível habilitar/desabilitar um TFieldList inteiro. Verifique na aplicação tutor.
    • Agora é possível colocar a barra de scroll do Kanban no topo.
      $kanban->enableTopScrollbar();
    • Agora é possível inserir conteúdos de maneira dinâmica no THtmlEditor. Verifique na aplicação tutor.
    • Implementado TSortList::reload(). Verifique na aplicação tutor.
    • Agora é possível desligar a conversão de HTML somente para uma coluna.
      $type->disableHtmlConversion();
    • Agora é possível validar o tamanho do upload de um arquivo já em client-side
      $file->setLimitUploadSize(...);
    • Criado mecanismo para que cortinas não empilhem, ficando somente a última
      parent::setProperty('override', 'true');
    • Criado método para desligar autocomplete em TEntry.
      $entry->disableAutoComplete();
    • Criado método para desligar autocomplete em TPassword.
      $password->disableAutoComplete();
    • Permitir implementar uma ação em uma coluna sem precisar desabilitar o clique default. Verifique na aplicação tutor.
      $column->href='#';
    • Melhorada a performance da abertura do THtmlEditor com grandes imagens embarcadas.
    • Implementado método para desabilitar finais de semana no calendário.
      TFullCalendar::disableWeekend();
    • Implementado disableFileHandling() para TFile e TMultiFile.
    • Agora é possível ter várias ações sem label no form, permitindo passar um nome custom como parâmetro.
      $button = $this->form->addAction('', new TAction(array($this, 'onSend')), 'far:check-circle green', 'xxx');
    • Melhor tratamento de caracteres especiais (aspas com htmlspecialchars) em TCombo, TSelect e TMultiSearch
    • TBarcodeInputReader/TQRCodeInputReader passam a aceitar somente números pelo teclado virtual mobile
    • THidden agora possui ter construtor e id próprios
    • Implementado TWindow::closeAll()
    • Implementado controle para não deixar fazer extends TWindow e setTargetContainer() ao mesmo tempo
    • Implementada validação de TArrowStep::validate() em formulários
    • Critérios do parent::addFilterField() são agora empacotados separadamente, permitindo ter um OR ali dentro, não atrapalhando o setCriteria() principal.
  • Correções de bug:
    • Corrigido multiplos TCheckList com busca na mesma página, quando o nome da coluna era o mesmo, um filtrava o outro.
    • Corrigida falha do TForm::sendData() para enviar dados para um TColor.
    • Corrigido falha do TForm::sendData() para enviar dados para um switch button.
    • Corrigidos mais alguns Deprecated: strpos(): Passing null to parameter #1 ($haystack) of type string is deprecated.
    • Corrigidos mais alguns Deprecated: mb_detect_encoding(): Passing null to parameter #1 ($string) of type string is deprecated.
    • Corrigidas falhas do popover com FullCalendar.
    • Corrigida falha de TFile dentro de TFieldList.
    • Corrigido setData() de TDBUniqueSearch quando usado em TFieldList.
    • TColor estava disparando o change, mesmo quando o fire_events do TForm::sendData() estava desligado.
    • TImageCapture estava apresentando placeholder mesmo quando já tinha uma imagem definida.
    • Corrigida falha de TDate dentro de TFieldList com setChangeAction().
    • Corrigido TFieldList, dados de list_data não estavam indo quando o evento era disparado na primeira linha do onUpdateTotals.
    • Quando habilitado ícone em TEntry ou TPassword, a linha expansível do material design não aparecia mais.
    • Change log estava registrando linhas a mais relativas a created_at, updated_at, deleted_at.
    • No AdiantiMultiSearchService, quando tentava buscar sem informar o valor da busca, ele estava deixando o criterio como like '%%', e com isso o banco não retorna os valores que estão 'NULL'.
    • Estava faltando no arquivo de instalação log.sql, a tabela system_access_notification_log
    • Estava faltando no arquivo permission.sql os campos do accept_terms no insert de usuarios
    • Ajustado FormScreenLabelsView do Tutor para usar a nova versão da BaconQRCode.
Adianti Framework 7.4.0 (2021-12-06)
"One of us" release

  • Informações gerais
    • Para quem possui aplicações na versão 7.3.0 podem seguir o tutorial de migração para atualizar para a 7.4.0;
  • Melhorias globais
    • jQuery atualiazada para 3.5.1.
    • Biblioteca Summernote (THtmlEditor) atualizada.
    • Biblioteca picqer/php-barcode-generator atualizada.
    • Biblioteca FullCalendar (TFullCalendar) atualizada.
    • Biblioteca DomPDF atualizada.
  • Melhorias globais de interface:
    • Agora é possível abrir cortinas sobre cortinas. Nenuma alteração é necessária no código-fonte. O Framework tratará isto automaticamente desde que realizadas as devidas atualizações do Framework e Template.
    • Agora é possível habilitar abas internamente no template. Assim, cada programa é aberto em uma aba interna, sem precisar usar o recurso de abas do navegador. Este recurso precisa ser habilitado globalmente para funcionar.
      application.ini
      use_tabs=1 ; Habilita abas internas store_tabs=1 ; Armazena abas após F5
    • Agora é possível abrir os programas em Janelas flutuantes. Assim, cada programa é aberto em uma janela separada. Este recurso precisa ser habilitado globalmente para funcionar.
      application.ini
      use_mdi_windows=1 ; Habilita janelas flutuantes store_mdi_windows=1 ; Armazena janelas após F5
    • Agora é possível exportar os resultados de datagrids nativamente em XLS. Os exemplos do Tutor já foram atualizados para demonstrar esta capacidade.
  • Melhorias globais do template:
    • Foi incluído um programa default no template (SystemInformationView) que exibe as informações do servidor, tais como: Uso de processamento e memória, uso de discos e itens de rede. Tudo isso para facilitar o monitoramento do servidor.
    • Foi incluído um programa default no template (SystemFilesDiff) que exibe uma listagem de verificação de todos arquivos que fazem parte do Framework e do Template. Esta listagem aponta se existem arquivos modificados pelo usuário (arquivos diferentes do Framework original), ou mesmo excluídos.
    • Foram realizadas melhorias no Explorer de banco de dados, para exibir as tabelas como cards no meio da tela, e exibir os dados de cada tabela na forma de Janela.
    • Foi incluído aceite de Termos do serviço. Cada desenvolvedor deve realizar o cadastro prévio dos termos de serviço. Foi criado um campo na tabela de usuários para registrar quando os termos do serviço foram aceitos. O aceite deve ser habilitado previamente e os termos devem ser cadastrados na tela de preferências do sistema.
      application.ini
      require_terms = "1" ; Exige aceite de termos do serviço
    • Foi criada a opção de notificar o usuário por e-mail sempre que o mesmo realizar login na aplicação, por motivos de segurança (perceber sempre que outro usuário realizar login com o seu usuário). Para este recurso funcionar, ele deve ser habilitado globalmente.
      application.ini
      notification_login = "1" ; Notifica login por e-mail
      Para que os usuários sejam notificados, é necessário agendar um serviço para rodar no agendador do sistema (Ex. Crontab) da seguinte forma:
      php cmd.php "class=SystemAccessNotificationLogService&method=sendNotificationLogin&static=1"
    • Foi adicionada a coluna "personificado por" nos logs de acesso ao sistema para exibir corretamente quando um acesso foi personificado por outra pessoa.
  • Novos componentes e melhorias:
    • TArrowStep: Um novo componente que implementa uma régua de progressão em formulários, foi implementado. Exemplo no ArrowStepView do Tutor.
    • TDBArrowStep: Um novo componente que implementa uma régua de progressão em formulários a partir de registros de uma tabela do banco, foi implementado.
    • Switch: Agora é possível fazer tanto TCheckGroup quanto TCheckButton com aparência de botão de Switch por meio do método setUseSwitch(). Exemplo no FormStaticSelectionView do Tutor.
    • Color Picker: Um novo componente de seleção de cores foi integrado ao Framework, mais completo que o anterior. Confira ao usar o componente TColor. Exemplo no FormBuilderView do Tutor.
    • Foi implementado o método TFieldList::setTotalUpdateAction(), que define uma ação a ser executada sempre que o total da FieldList é atualizado. Exemplo no FormFieldListEventsView do Tutor.
    • Foi implementado o método TDataGrid::setMutationAction(), que permite definir uma ação a ser executada sempre que o total é atualizado. Exemplo no SaleForm do Tutor.
    • Implementado o método TFullCalendar::enableFullHeight(), que faz com que ele ocupe toda a altura disponível. Exemplo no FullCalendarStaticView do Tutor.
    • Agora é possível recarregar elementos dinamicamente de checks e radios, por meio do método reloadFromModel() das classes TDBRadioGroup e TDBCheckGroup, bem como reload(), de TCheckGroup e TRadioGroup.
    • Agora é possível habilitar um botão interno no componente de senhas (TPassword) para exibir/esconder a senha digitada. Habilite por meio do método enableToggleVisibility(). Exemplo no FormBuilderView do Tutor.
    • Agora é possível habilitar um pequeno ícone dentro dos inputs (TEntry) à esquerda do valor digitado. Habilite por meio do método setInnerIcon() das classes TEntry ou TPassword. Exemplo no FormBuilderView do Tutor.
    • Agora tanto TImageCapture quanto TImageCropper permitem definir uma imagem de placeholder. Habilite por meio do método setImagePlaceholder(). Novos placeholders padrão foram incluídos. Exemplo no FormImageUploader do Tutor.
    • Agora é possível definir um máximo de caracteres a ser digitado no THtmlEditor, por meio do método setMaxLength().
    • Foi implementado o método TFieldList::disablePostEmptyRow(), que ao ser habilitado, na postagem de dados de um TFieldList, linha que estiver vazia não é enviada no POST.
    • TDate, TDateTime e TTime agore possuem setChangeAction() e setChangeFunction.
  • Melhorias na camada de banco
    • Foi implementado Soft Deletes. Para usar, basta habilitar, basta declarar a constante DELETEDAT na classe de entidade, contendo o nome da coluna que armazenará a data de exclusão do registro.
    • Foi implementada a busca case insensitive independente de banco. Para habilitar, basta definir: case = "insensitive" no conector do banco. Ao ser habilitada, toda busca com operador 'like', ignorará diferenças de maiúsculas e minúsculas.
    • Implementado os métodos TRecord::firstOrNew($filters), que retorna o primeiro objeto que atende os filtros passados ou retorna um objeto contendo estes dados caso não encontre. Também foi implementado o método TRecord::firstOrCreate($filters), que retorna o primeiro objeto encontrado com aqueles filtros, ou um novo objetos persistido com estes dados caso não encontrado.
    • Implementado o método TTransaction::openFake(), que abre uma espécie de "transação falsa". Toda a comunicação do banco até o TTransaction::close() funciona normalmente, mas um transação "real" não é aberta com o banco de dados, evitando dead locks em casos de transações apenas para consultas.
    • A API Rest, por meio da estensão da classe AdiantiRecordService, agora implementa também o método countAll().
    • Agora o Oracle alimenta o 'id' com select currval após store() com o currvalue da sequência. Atenção: Manter o nome da sequência correto na model.
    • O Explorer de banco de dados do template agora suporta Firebird.
    • Implementada a propriedade ntyp="1" no conector para SQL Server, para que valores numéricos sejam retornados como variáveis do tipo numérica.
    • Implementado timezone para MySQL. Para tal, basta definir zone="..." no conector do banco de dados.
    • Implementado o enconding utf8mb4 para MySQL. Para tal, basta definir char="utf8mb4" no conector do banco de dados.
    • SQLServer: Campo IDENTITY não estava pegando o 'id' após store() quando o driver era o sqlsrv, somente quando era o dblib.
    • Implementado o método TRepository::dump() exibir um Repository como SQL a qualquer momento.
  • Novos exemplos:
    • Tutor: Um novo exemplo foi melhorado para demonstrar como trocar status com dropdown embarcada em datagrid. Exemplo no SaleList do Tutor.
    • Tutor: Um novo exemplo foi melhorado para demonstrar como criar uma janela de busca manualmente para retornar quaisquer dados. Exemplo no FormSeekButtonView do Tutor (Custom Seek).
    • Tutor: Vários exemplos que abriam PDF em janelas, agora emitem uma mensagem caso seja mobile e não suporte a visualização (Ex. TemplateInvoiceView, WindowPDFView). Exemplo no TemplateInvoiceView do Tutor.
    • Tutor: Um novo exemplo foi criado para demonstrar o componente TArrowStep. Exemplo no ArrowStepView do Tutor.
  • Pequenas melhorias:
    • Novo método implementado TEntry::changeMask(), para permitir alterar a máscara de um TEntry dinamicamente.
    • MailService::send() permitir attachments.
    • TFieldList suporta diferentes formatos de máscaras de totalização.
    • Componente TImageCropper suportado no TForm::sendData().
    • Componente TMultiFile suportado no TForm::sendData().
    • Timeline suporta data pura, sem hora.
    • Implementado o método TPage::openPage() para abrir uma página dinamicamente em uma nova aba.
    • Nos cabeçalhos dos métodos setOption(), colocar um @link para documentação correspondente da biblioteca.
    • Implementado o método TPage::setPageTitle() para permitir trocar dinamicamente o título da página.
    • Validar a unidade do multiunidade no backend.
    • Usar códigos corretos de retorno HTTP no server REST.
    • engine.php agora captura \Error para debug.
  • Correções de bug:
    • IOS/theme4: precisava clicar 2x nos itens dos menus.
    • Fotos enviadas no TImageCropper e TImageCaptura apareciam esticadas após redimensionamento.
    • Fix fieldlist addRows, as vezes algumas colunas ficavam quebradas após adicionar linhas dinamicamente.
    • TForm::sendData() da TDate não alterava no componente, daí quando abria o dropdown, limpava o campo:
    • Se chamava o enableCSRFProtection() antes do appendPage(), no tema4 fica uma aba fantasma no início.
    • TForm::sendData() para check/radio com name com espaços em branco não funcionava.
    • TDBMultiSearch::getPostData() abria transação, mas não fechava.
    • Title de elementos em multisearch estava impedindo de clicar no close.
    • THtmlEditor ao abrir em cortina alguns diálogos (Ex. Inserir imagem, inserir link), criava uma camada que bloqueava a tela.
    • O botão de fechar das janelas não estava acompanhando a tradução, ficando sempre "Close".
    • TDBCombo e TDBMultiSearch disabled com enableSearch() não mantinha o title.
    • TDBCombo e TDBMultiSearch não disabilitava via javascript quando estava dentro de nested form (problema no seletor).
    • TEntry e TDate quando inicializavam com setEditable(FALSE), ao habilitar posteriormente, eles perdiam a máscara da digitação.
    • TRadio/TCheck quando inicializavam com setEditable(FALSE) continuavam respondendo pelo clique.
    • TCheckGroup e TSelect com valueseparator, ao desmarcar os itens, no carregamento não mantinha, voltava os defaults.
    • TDBUniqueSearch usando UUID, ele não autocompleta para fazer a edição corretamente.
    • TDropDown addSeparator() não estava funcionando.
    • TTimeline dentro de formulário não funcionava o post da ação.
Adianti Framework 7.3.0 (2020-12-15)
"Show me the way" release release

  • Informações gerais
    • Para quem possui aplicações na versão 7.2.0 podem seguir o tutorial de migração para atualizar para a 7.3.0;
  • Melhorias globais
    • Suporte à PHP 8. Atenção: bibliotecas de terceiros, como a DomPDF (conversão de documentos em PDF) e Picqer Barcode Generator (geração de código de barras) que ainda não possuem suporte. Portanto nossa recomendação para rodar em produção é utilizar PHP 7.4.
    • Atualizada Font Awesome para 5.15.
    • Atualizada DomPDF para 0.8.6.
    • Atualizada PHPMailer para 6.1.8.
    • Atualizada FuseJS para v6.4.1.
    • A versão mínima para rodar o Framework agora é 7.1, por causa de dependências de bibliotecas externas.
    • Algumas bibliotecas (Excel_Spreadsheet_Writer, FPDF) foram transferidas para pacotes próprios, com devidas correções que estavam pendentes (Notice, Warnings).
  • Melhorias na camada de banco
    • Implementada sintaxe para acumular agregadores. Ex:
      var_dump(Sale::groupBy('date')->countByAnd('total', 'count')->sumBy('total', 'total'));
    • Firebird autocommit: Autocommit desligado por padrão no Firebird, para que as transações funcionem adequadamente.
    • Suporte ao generators do Firebird, quando marcado como 'serial'. Assim, gera insert com returning e alimenta a primary key.
    • Implementado TRepository::last(). Suporte à sintaxe Model::where()->last().
    • Driver dblib não estava abrindo transações devido a um bug antigo do PHP já corrigido.
    • Melhorados Componentes TDB's para não abrirem nova conexão com o banco se já tiver uma aberta.
    • Gerador de UUID agora usa random_bytes para evitar colisões.
  • Melhorias REST:
    • Suporte a $header['authorization'] (formato enviado pelo Flutter), não somente $header['Authorization'].
    • Melhorado REST service: Adicionado parâmetro true ao json_decode() do "php://input" para sempre retornar array associativo.
    • Melhorado REST service: Adicionado array_walk_recursive() sobre o vetor de retorno para garantir que JSON sempre esteja em Unicode.
  • Melhorias globais do template:
    • Janelas sobre janelas: Agora o Framework não limita mais a quantidade de janelas abertas sobre janelas.
    • Agora as cortinas laterais mantêm-se abertas quando uma janela é aberta.
    • Se o usuário acessar uma URL e não estiver logado, após o login será redirecionado à esse caminho. Ex:
      http://localhost/template/index.php?class=SystemUserList
  • Novos componentes:
    • TBarCodeInputReader: Input leitor de códigos de barra. Obs: Só funciona se em HTTPS.
    • TQRCodeInputReader: Input leitor de QRCode. Obs: Só funciona se em HTTPS.
    • TImageCropper. Input de imagens com ajustes (crop, resize).
    • TImageCapture. Input para captura de imagens de Webcam com ajustes (crop, resize). Só funciona se em HTTPS.
  • Novos exemplos
    • Um novo exemplo foi criado para demonstrar o novo componente (TBarCodeInputReader). Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar o novo componente (TQRCodeInputReader). Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar o novo componente (TImageCropper). Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar o novo componente (TImageCapture). Verifique na aplicação tutor.
  • Melhorias em componentes:
    • Implementada máscara numérica reversa. Ao ser ligada, a digitação começa da unidade inteira, não dos centavos. Ex:
      $input->setNumericMask(2, ',', '.', true, true);
    • Actions do TFieldList agora suportarem abertura de cortinas laterais.
    • Implementado TFieldList::makeScrollable().
    • Em TFullcalendar, adicionada forma de visualização em lista ("listWeek").
    • Implementado BootstrapFormBuilder::addFooterWidget().
    • Implementado TDropDown::addPostAction($title, $action, $form...) para permitir que menus do tipo dropdown possam postar dados de formulário de qualquer posição da tela em que estejam.
    • Suporte à atributos relacionados em actions. Ex:
      TDataGridAction(['CustomerFormView', 'onEdit'], ['id'=>'{id}', 'city' => '{city->id}']);
    • Todas ações de TFieldList agora são por POST.
    • Botão "selecionar todos" do TCheckList se tiver elementos filtrados (fuse search) marcar somente estes.
    • Se a fuse search não encontra elementos, não exibe nenhum item na datagrid. Antes, todos elementos eram visíveis.
    • Implementado AdiantiHTMLDocumentParser::setDOMOptions() para repassar opções específicas para a DomPDF.
    • Implementado TCheckList::setSize().
    • Melhorias no upload de arquivos para alertar ao usuário se o arquivo é grande demais.
    • Implementado Timeline::setItemDatabase() para definir o conector de base de dados quando itens da timeline usam atributos relacionados.
    • TKanban::addStageAction() agora suporta máscaras no estilo {id} como parâmetro.
    • TKanban::addItemAction() agora suporta máscaras no estilo {id} como parâmetro.
    • TCardView::setTitleAttribute() não suportava máscaras no estilo '{nome} - #{id}'.
    • TCardView::setContentAttribute() não suportava máscaras no estilo '{nome} - #{id}'.
    • Ações backend de TFile e TMultiFile e TDBMultiSearch agora suportam URL's curtas.
    • Ajustes para o TActionLink funcionar na TInputDialog, quando adicionado pela addActionLink() de um BootstrapFormBuilder (L.Tomasi).
    • TPage::openFile($file, $basename = null) agora suporta parâmetro para basename.
    • new TQuestion agora suporta novos parâmetros: label_yes, label_no.
    • O comportamento do método setSize() das seeks foi reformulado e agora está em sintonia com os demais componentes (Ex. TEntry, TDate).
  • Correções de bug:
    • Exportar CSV e XML, funcionava no formato '{city->name}', mas não 'city->name'.
    • setEditable(false) não estava funcionando com TNumeric.
    • TNumeric não exibia corretamente "0,00" na ediço.
    • Quando tem ações à direita, os totais da datagrid ficam fora de sincronia (alinhamento das colunas).
    • Corrigido Bug enforce focus em janelas de busca: https://www.adianti.com.br/forum/pt/view_5500.
    • Fixed Oracle Notice TSqlSelect:276.
    • Corrigido CSS para auto-esconder colunas acima de 1000px, que estavam faltando.
    • Calendário estava abrindo por trás da cortina lateral no tema4.
    • Tema 3 está quebrando o form de login em telas pequenas (IPhone 5).
    • Corrigido bug "index not found" na tradução com Adianti.language. Faltava definição de language no public.html e login.html.
Adianti Framework 7.2.0 (2020-06-05)
"We are the world" release

  • Informações gerais
    • Para quem possui aplicações na versão 7.1.0 podem seguir o tutorial de migração para atualizar para a 7.2.0;
  • Melhorias na camada de banco
    • A classe TRecord agora suporta geração no formato UUID para ID's. Para tal, basta utilizar na constante IDPOLICY o valor 'uuid'.
    • A classe SystemSqlLogService foi melhorada para gravar as datas de log no formato correto quando o banco é Sql Server.
    • O driver DBLIB para Sql Server agora aceita parâmetro de charset no INI do banco.
  • Melhorias REST:
    • Melhorado o servidor REST (rest.php). Agora trata erros no lado do servidor (catch Error), e força o output para UTF8 antes de retornar para quem chama.
    • Melhorada classe AdiantiHttpClient para não trazer os headers da requisição.
  • Melhorias em componentes:
    • Agora é possível configurar as ações da datagrid à direita: TDataGrid::setActionSide('right').
    • Datagrids agora calculam o total automaticamente mesmo em telas estáticas, usando mutation observer (Ex. SaleForm):
      $col_subt->enableTotal('sum', 'R$', 2, ',', '.');
    • Implementado o método TFieldList::addButtonAction(), para permitir adicionar uma ação (TAction) na linha da field list.
    • Implementado o método TFieldList::disableRemoveButton(), para permitir desabilitar o botão de remover da field list.
    • Implementado o método TFieldList::getPostData() para simplficar a obtenção de dados da field list em formato de vetor de objetos.
    • Implementado o método TFieldList::setRemoveAction(), para permitir definir uma ação (TAction) na ação de remover da field list.
    • Agora o TFieldList poder receber uma TAction no addCloneAction() para ser executada ao clonar a linha.
    • Agora o método TFieldList::addCloneAction() permite definir ícone e title, no seguinte formato (o primeiro parâmetro action é opcional):
      $this->fieldlist->addCloneAction(null, 'fa:bolt green', 'Title');
    • Agora o método TFieldList::setRemoveAction() permite definir ícone e title, no seguinte formato (o primeiro parâmetro action é opcional):
      $this->fieldlist->setRemoveAction( null, 'fa:bolt purple', 'Title');
    • Agora o TFieldList passa o _row_id como parâmetro para a action.
    • Disponibilizado novo exemplo no Tutor para demostrar os novos eventos de TFieldList, a validação e a nova forma de obter os dados no post (Ex. FormFieldListEventsView).
    • Agora é possível marcar uma coluna do TFieldList como uniqid ['uniqid' => true]. Dessa forma, o próprio TFieldList vai gerar valores uniqid para aquela coluna quando a linha for clonada.
    • Agora o TFieldlist valida campos obrigatórios com o addValidation(), desde que onSave() não seja "public static", e receba static=1 no parâmetro.
      $combo->addValidation('combo', new TRequiredListValidator);
    • Implementado o método enableSearch() para habilitar busca em uma coluna da TCheckList:
      $col_desc = $orderlist->addColumn('description', 'Description', 'left', '50%'); $col_desc->enableSearch(); $col_desc->getInputSearch()->setSize('calc(100% - 100px)');
    • Implementado o método TCheckList::disableCheckAll(), para poder desabilitar o "selecionar todos" na check list.
    • Implementado o método atalho TCheckList::fillWith() para carregar com objetos do banco de maneira simplificada em uma check list.
    • Agora a TCheckList suporta apresentação de dados relacionados de outras tabelas em uma coluna. Ex: $obj->addColumn('cidade->nome', ...).
    • TCardView agora habilita tradução do template quando usa o setTemplatePath() e quando usa setItemTemplate().
    • $this->cardView->setColorAttribute() e setTitleAttribute() aceitam atributos de tabelas relacionadas. Ex: tabela->campo.
    • Implementao do o método TIconView::enableDoubleClick() para habilitar o duplo clique na icon view.
    • TKanban agora habilita tradução do template quando usa o setTemplatePath().
    • Integrar Jquery mask money. Melhor suporte à máscaras em dispositivos móveis e suporte à máscaras com números negativos. Remoção da jquery iMask em virtude do uso desta biblioteca (Lucas Tomasi).
    • Implementado o método TFile::setErrorAction() para poder registrar uma action quando falha o upload do arquivo.
    • A classe TImage agora suporte os prefixos de ícones da Font Awesome PRO (fal: fad: fab:).
    • As mensagens da bibiliteca Datatables foram traduzidas (pt, es, en).
    • Criado o método atalho THtmlRenderer::create(), que já instancia o template, e recebe os replaces da seção "main", útil para reduzir a quantidade de linhas de código ao utilizar templates simples.
    • Implementada tradução no application.js para termos como "Carregando" em Javascript. Buscar por "Application.translation".
    • Implementado TText::forceUpperCase() e TText::forceLowerCase().
    • Implementado BootstrapFormBuilder::addExpandButton(). Exemplo no ProductList do Tutor.
    • Adicionado parâmetro de cor no TKanban::addStage() para que cada fase possa ter uma cor diferente.
    • Implementado TKanban::setItemTemplate() para que cada card do Kanban possa ter um template HTML diferente.
    • TKanban::addStageAction() agora tem parâmetro de display condition.
  • Correções de bug
    • Corrigidos tooltips que não escondiam após o clique do usuário em outro ponto da página.
    • Em algumas situações, eventos em cascata disparados em formulários (eventos disparados dentro de changes) ficavam trancados, e a pilha de execução não liberava.
    • Adianti.onAfterLoad() padrão alterado para forçar fechamento do unblock_ui após carregamento da página __adianti_unblock_ui( true ).
    • Corrigido o trait utilizado para datagrids, pois ao ordenar por uma coluna relacionada (Ex: city->name), a ordenação era perdida na paginação.
    • TFieldlist totalizador não funciona se total vinha do banco como "1.0" (com pontuação).
    • TFieldlist ao mover linhas com larguras em % estava movendo ela encolhida, não com o tamanho real.
    • TFieldList soma com números muito grandes não funcionava.
    • TFieldList post não estático (método não estático, mas passando static=1 nos parâmetros) agora trata máscara de data (substituição de máscara).
    • TDate/TDateTime com setEditable(), depois não voltava mais com o enableField().
    • TForm::sendData() em campo TDBUniqueSearch não estava disparando os eventos de change com os valores corretos.
    • Busca fuse search não funcionava quando o ultimo atributo da datagrid era vazio.
    • XMLBreadCrumb não pegava o label da classe corretamente do menu do sistema, quando o item estava no primeiro nível do menu.
    • Não permitia adicionar 2 formulários internos da BootstrapFormBuilder, o segundo não funcionava.
    • TForm::sendData() vetorial em campo TDBUniqueSearch não estava setando os valores corretamente.
    • Fix bug TDBCheckList, quando setava um valor no construtor, depois ele não saia mais do próximo post, mesmo desmarcando.
    • Fix bug TCheckList, quando chamava o setId(), o check all parava de funcionar.
    • RESTFul services estava com fixo 'id', e no store() não fazia o update corretamente.
    • Corrigir botão direito em cima de TIconView dentro de janelas, o dropdown aparecia deslocado.
    • Quando usar o inserted_at, dar unset() no update, caso o desenvolvedor tenha colocado no form e no addAttribute() o campo do inserted_at, para evitar manipulação pelo usuário.
    • Corrigidos formatos de datas para registro de log na TRecord (created_at e updated_at) especificamente para Sql Server.
    • Fixed bug no parseHtAccess() quando tinha múltiplos espaços em branco no meio.
    • Corrigir forma de passagem de ícone para o Toast, para suportar prefixos como fas:check-circle.
Adianti Framework 7.1.0 (2020-01-28)
"Better days" release
  • Informações gerais
    • Para quem possui aplicações na versão 7.0.0 podem seguir o tutorial de migração para atualizar para a 7.1.0;
  • Melhorias em classes/componentes
    • Componente TFieldList agora suporta TFile.
    • Suporte à brand icons da Font Awesome 5 no Timage e Notification list.
    • Componentes de radio e check exibidos como botão não estavam quebrando em telas pequenas.
  • Melhorias nos templates:
    • Editor de menu agora permite ter submódulo sem action.
    • O Database explorer e SQLPanel agora suportam conectores de BD com a extensão .php.
  • Melhorias de segurança:
    • Login agora usa hash_equals() no authenticate.
    • Desenvolvido método BootstrapFormBuilder::enableCSRFProtection() para habilitar proteção contra CSRF nos formulários.
  • Correções de bug
    • Em algumas circustâncias, o envio de dados de formulários causava erros Javascript. Ex: Quando continha o caractere "%".
    • O componente TCheckList no tema4 tinha um bug. Quando o usuário clicava na caixinha, sumia o conteúdo do meio da tela.
    • Componente TCheckList não funcionava em formulários com validação.
    • O método filterMany() não estava funcionando adequadamente. Não filtrava pelo registro principal.
    • O editor de HTML estava com erro de posicionamento no Template 4.
    • O formulário de consulta ao perfil do cliente estava visualmente quebrado.
    • Eliminar utilização de strings no formato antigo {}, para evitar mensagens de compatibilidade com PHP 7.4.
    • TFile com galeria habilitada não gerava preview de .jpeg e .gif.
    • Ao clicar em qualquer lugar de um formulário, o title (tooltip) se perdia (necessário atualizar onClearDOM do application.js na migração).
    • Alguns componentes como TCombo e TPassword ficavam com tamanho errado quando desabilitados via disableField().
    • Popover não funcionava somente com title ou somente com content, pois precisava de ambos.
    • Details injetados via TDataGrid::replaceRowById() estavam ficando com acentuação errada.
Adianti Framework 7.0.0 (2019-12-09)
"Hotel California" release

  • Informações gerais
  • Melhorias globais
    • Atualizada jQuery para 3.4.1.
    • Atualizada Bootstrap para 4.3.1. Removidos Icones Bootstrap Glyphicons.
    • Atualizada Select2 para 4.0.10. Melhor acessibilidade, bugs corrigidos.
    • Atualizada Summernote para 0.8.11. Agora compatível com BS4.
    • Atualizada Font Awesome para 5.11.2. Ler migration para compatibilidade.
    • Atualizada Moment.js para 2.24.0.
    • Atualizado Vendor (phpmailer, DomPdf).
  • Novos componentes
    • Novo componente para visão de ícones (TIconView). Verifique na aplicação tutor.
    • Novo componente para visão de linha de tempo (TTimeline). Verifique na aplicação tutor.
    • Novo componente para visão de cards (TCardView). Verifique na aplicação tutor.
    • Novo componente para kanban (TKanban). Verifique na aplicação tutor.
    • Novo componente para lista de checagem (TCheckList). Verifique na aplicação tutor.
    • Novo componente para lista de checagem (TDBCheckList) do banco de dados.
    • Novo componente para toasts (TToast). Verifique na aplicação tutor.
    • Novo componente para passo a passo (TPageStep). Verifique na aplicação tutor.
  • Novos exemplos
    • Um novo exemplo foi criado para demonstrar o novo componente (TIconView). Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar o novo componente (TIconView) com sistema de arquivos. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar o novo componente (TTimeline) Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar o novo componente (TCardView). Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar o novo componente (TCardView) com banco de dados. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar o novo componente (TKanban). Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar o novo componente (TKanban) com banco de dados. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar o novo componente (TCheckList). Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar o novo componente (TToast). Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar o novo componente (TPageStep). Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como criar cortinas laterais. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como criar janelas modais. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como criar calendários com cortinas laterais. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar agregações. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar o novo método para debug de transações. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar abas internas dentro de formulários bootstrap. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como criar um formulário HTML5 puro com template. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar formulário e datagrid lado a lado. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar busca rápida em datagrids. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar datagrids com datatables. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar datagrids com colunas auto escondidas. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar exportação dos dados da datagrid. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar a criação de datagrids com links para telefone e e-mail. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como criar um relatório com uma query manual. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como criar um relatório sobre uma view. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como criar uma fatura. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como criar uma tela com lançamentos de caixa. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como embarcar vídeos. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar vídeos como cards. Verifique na aplicação tutor.
    • O exemplo mestre-detalhe foi totalmente refatorado. Agora é possível implementar com bem menos linhas de código e sem reload da página. Verifique na aplicação tutor.
    • Exemplo de catálogo de produtos refeito para usar os novos cards. Verifique na aplicação tutor.
    • Criada cortina lateral para ver os detalhes da venda. Verifique na aplicação tutor.
    • Listagem de clientes toda alterada para usar autofiltro, trait, busca e ordenação com campo de subquery. Verifique na aplicação tutor.
    • Formulário de clientes alterado para abrir em cortina lateral. Verifique na aplicação tutor.
    • TFieldList agora permite totalização automática. Também implementado método para preenchimento de campos que já estão na tela. Verifique na aplicação tutor.
    • Cadastro de produtos alterado para mostrar como habilitar galeria de imagens. Verifique na aplicação tutor.
    • Exemplo sobre dashboard melhorado para demonstrar indicadores. Verifique na aplicação tutor.
    • Exemplo sobre componentes de seleção alterado para mostrar como criar botão novo ao lado. Verifique na aplicação tutor.
    • Exemplo sobre lista de campos melhorado para usar somente BootstrapFormBuilder. Verifique na aplicação tutor.
    • Exemplo sobre formatação de datagrids melhorado para mostrar formatação de coluna. Verifique na aplicação tutor.
    • Exemplo sobre accordion alterado para compatibilizar com Bootstrap 4. Verifique na aplicação tutor.
    • Exemplo sobre carousel alterado para compatibilizar com Bootstrap 4. Verifique na aplicação tutor.
    • Exemplo sobre exclusão em lote alterado para usar sessão e highlight. Verifique na aplicação tutor.
    • Exemplo sobre registro passo a passo alterado para usar o novo componente TPageStep. Verifique na aplicação tutor.
    • Exemplo sobre componentes de formulários incrementado com TIcon e TTime. Verifique na aplicação tutor.
    • Vários exemplos de datagrid refatorados para usar a nova forma de conectar ações.
  • Melhorias em classes/componentes
    • Implementada validação HTML5 nativa nos formulários com o método BootstrapFormBuilder::setClientValidation(true);
    • O método TForm::sendData() agora aceita parâmetro de timeout.
    • Melhores controles anti XSS em componentes: TEntry, TText, TDataGrid, THtmlRenderer. Se você for usar HTML no conteúdo nestes componentes, use disableHtmlConversion().
    • Implementados métodos BootstrapFormBuilder::generateAria e TFieldList::generateAria() para gerar tags de acessibilidade automaticamente.
    • Implementado o debug mode. Ao ligar debug = 1 no application.ini, as exceções serão em modo desenvolvimento e serão ligadas diretivas de display_errors e error_reporting.
    • Melhorado o estilo do calendário simples (TCalendar). Verifique na aplicação tutor.
    • Novo TSlider, HTML nativo com melhorias visuais. Verifique na aplicação tutor.
    • Novo TSlider, usando a jquery-spinner, agora totalmente responsivo e com melhor aparência. Verifique na aplicação tutor.
    • Implementado THtmlEditor::disableToolbar(), para desabilitar a barra de ferramentas.
    • Implementado THtmlEditor::setCompletion(), para habilitar lista de autocomplete.
    • Implementada classe AdiantiHttpClient para fazer requests HTTP.
    • Componente TIcon compatibilizado com Font Awesome 5.
    • Implementados métodos para exportação de datagrids em PDF, XML e CSV no trait AdiantiStandardListTrait::exportToCSV(), AdiantiStandardListTrait::exportToPDF() e AdiantiStandardListTrait::exportToXML() para exportar a listagem em diferentes formatos.
    • Criado método TFile/TMultifile: enableImageGallery(width, height) para habilitar galeria de imagens.
    • Criado método TFile/TMultifile: enablePopover(title, content) para habilitar popover em files.
    • Implementado THtmlEditor::setOption(). Ex: $html->setOption('placeholder', 'type here...');
    • Implementado TFullCalendar::setOption(). Ex: $fc->setOption('businessHours', [ [ 'dow' => [ 1, 2, 3, 4, 5 ], 'start' => '08:00', 'end' => '18:00' ]]);
    • Implementado TDate::setOption(). Ex: $expires->setOption('datesDisabled', [ "23/02/2019", "24/02/2019", "25/02/2019" ]);
    • Implementado TPanelGroup: addHeaderWidget() para fazer dropdown ao redor das ações de exportação.
    • Implementados novos métodos TWindow::removePadding() e TWindow::removeTitleBar().
    • Implementados o método TWindow::setMinWidth(0.9, 800) para definir uma largura mínima em percentual ou tamanho fixo, para funcionar bem tanto em mobile, quanto desktop.
    • Datagrid::enablePopover() agora aceita parâmetro de displaycondition.
    • TDataGridColumn::setTransformer() agora recebe em sua callback parâmetros novos: célula atual e linha anterior.
    • TDataGridColumn::setTotalFunction() agora recebe em sua callback, além dos valores, os objetos que compuseram a coluna.
    • TDataGridColumn::setTotalFunction() agora recebe um bool para indicar se vai aplicar o transformer no total ou não.
    • Implementados novos métodos TStyle::import() e TScript::import().
    • Implementado novo método AdiantiCoreApplication::loadPageURL().
    • Implementado TElement::find() para retornar um vetor com todas ocorrências tipo jquery.
    • Implementado TElement::after() para adicionar um elemento ao lado de componente.
    • Implementados TDBUniqueSearch::enableIdTextualSearch() / TDBMultiSearch::enableIdTextualSearch() para habilitar busca textual (não numérica).
    • Implementado THtmlRenderer::disableSection($sectionName), para poder desabilitar uma seção já habilitada no template.
    • Criado método AdiantiHTMLDocumentParser::enableTranslation() para habilitar tradução no Document Parser.
    • Implementada order reversa por coluna relacionada (Ex. city->name).
    • Poder passar '*' nas actions da datagrid para passar todos os campos.
  • Melhorias em persistência
    • Implementadas aggregations. groupBy, sumBy(), countBy(), countDistinctBy(), maxBy(), minBy(), maxBy(), avgBy().
      Verifique na aplicação tutor.
    • Implementado preenchimento automático de campos do tipo created_at e updated_at pelas classes TRecord.
    • Implementados conectores em PHP, não somente mais em arquivos .INI. Ambos formatos funcionarão.
    • Implementado cache da leitura do INI da conexão dentro do mesmo request.
    • Implementado novo método para debug da transação: TTransaction::dump().
    • Implementados os métodos take() e skip() direto na TRecord, sem precisar passar por um where() antes. Ex:Customer::take(5)->skip(10)->get().
    • Implementados TTransaction::closeAll() e TTransaction::rollbackAll() - Sugestão de Willian Padilha.
    • TRecord agora é iterável com foreach, implementa IteratorAggregate.
  • Melhorias nos templates:
    • Desenvolvidas facilidades para multi tenant, seleção da base de dados conforme usuário logado. Funcionalidade explicada no livro e videoaulas.
    • Desenvolvidas facilidades para multi idioma, seleção de idioma na tela de login. Funcionalidade explicada no livro e videoaulas.
    • Desenvolvido menu público, versão do template para usuários não logados na aplicação. Funcionalidade explicada no livro e videoaulas.
    • Templates preparados para PWA, instalação da aplicação web como aplicação no mobile. Arquivo de manifesto Android e IOS.
    • Dessenvolvida a possibilidade de abrir conteúdos em cortina lateral de maneira nativa.
    • Desenvolvido um editor de menu na própria ferramenta (Artur Comunello).
    • O tema 4 foi melhorado para apresentar radio e check buttons estilo material design, além disso as cores de fundo do menu, e diálogos de seleção de data/hora agora respeitam as cores do tema.
    • O Template virá API pronto com serviços (CLI e REST) para criação e manutenção de usuários da plataforma. Funcionalidade explicada no livro e videoaulas.
    • Desenvolvido um dashboard administrativo, com informações sobre usuários, grupos e unidades.
    • Desenvolvido um dashboard sobre logs, com informações sobre acessos, logs de SQL e logs de request.
    • Desenvolvido log de requisições WEB, REST, CLI, que registra toda requisição feita no sistema para auditoria. Funcionalidade explicada no livro e videoaulas.
    • Logs de SQL e de mudança de registros foram aperfeiçoados com adição de informações como: ip, rastreabilidade completa (trace), agrupamento por transaction, session, SAPI, classe de controle, e outros. A arquitetura dos logs é explicada no livro e videoaulas.
    • Desenvolvido um painel nativo de DEBUG de requisições HTTP. Com depuração colorida da requisição e do body da requisição.
    • Cadastro de usuários refeito para utilizar o novo componente TCheckList na seleço de programas.
    • Cadastro de grupos refeito para utilizar o novo componente TCheckList na seleção de programas.
    • Agora é possível marcar/desmarcar usuários que fazem parte de um grupo na própria tela de gestão de grupos.
    • Desenvolvida possibilidade de clonar usuários.
    • Desenvolvida possibilidade de clonar grupos.
    • Melhoradas as telas de listagens (usuários e grupos) com a possibilidade de exportação de dados (PDF, CSV, XML).
    • Desenvolvida possibilidade de personificar usuário.
    • Melhorada tela para consultar, bem como eliminar as variáveis da sessão.
    • Melhorada a visualização de Logs de SQL e de mudanças, agrupamento por transação, visualização da rastreabilidade (trace).
    • Melhorada a tela de mensagens (inbox) entre usuários.
    • Melhorado e simplificado o Breadcrumb.
    • Lista de mensagens agora filtra o output (evitar XSS).
    • Lista de tabelas agora apresenta Materialized Views e Foreign Tables em PostgreSQL (Sugestão Jackson Majolo).
    • Registros de logs agora não dão mais lock quando a base de logs está no mesmo banco que a principal.
    • Incrementado o rodapé para exibir a unidade selecionada.
  • Correções de bug
    • O servidor REST seguro não funcionava por não receber os headers em algumas configurações de nginx ou apache + PHP-FPM. Resolvido com o "SetEnvIf". Ver novo htaccess.
    • TUniqueSearch, TDBUniqueSearch, TMultiSearch, TDBMultiSearch ao desabilitar o campo não enviava esse mais no POST.
    • TDBUniqueSearch com sendData() vazio não estava limpando o campo, pegava o primeiro registro encontrado.
    • Alguns anos/meses não eram exibidos no TDate (atualizada moment.js).
    • Caracteres como &micro_= causavam problemas em ações de form e datagrid.
    • Ajuste tradução TDateTime no tema4.
    • Ao abrir janelas, não estava colocando o foco nelas, para poder usar o ESC.
    • Ao usar o TCombo::enableSearch(), não funcionava o disableField().
    • TEntry/TDate desabilitado não disparava change action.
    • TDate desabilitado estaticamente por script não estava indo no POST.
    • TForm::sendData() para TColor manda o valor, mas não atualiza a cor.
    • Melhorar TRadioGroup e TCheckGroup disableField() estático para o campo continuar passando no post.
    • Critério (TCriteria) de saída de campo do seek agora é respeitado (filtro criteria) no autocomplete.
    • Ao usar cache (Ex. TAPCache), estava atualizando os objetos em memória quando utilizadas sintaxes como Classe::select('a', 'b'), com menos atributos.
    • Não carregava waiting quando tinha um load_page depois de um goto_page.
    • TSortList no theme4 não pegava estilo.
    • Removidos os title's das options em TDBUniqueSearch e TCombo com enableSearch() pois ficava exibindo a seleção anterior.
    • Melhorar a mensagem "Conection Failed" para ser mais específica e orientar o desenvolvedor para olhar os logs do servidor de aplicação (Ex. apache).
    • Componentes disabled não aceitam mais foco (tabindex=-1).
  • Remoções
    • Removido componente TComboCombined. Pode muito bem ser substituída por combo simples, TDBUniqueSearch, e outros.
    • Removido componente TMultiField. Pode muito bem ser substituído por TFieldList.
    • AdiantiUIBuilder movido para app space (app/lib/util)
Adianti Framework 5.7.0 (2019-01-24)
"Security" release
  • Informações gerais
    • Para quem possui aplicações na versão 5.6.0 podem seguir o tutorial de migração para atualizar para a 5.7.0;
  • Melhorias
    • Foi corrigido um bug de segurança relacionado à SQL Injection;
    • O método TRecord::all() agora recebe um parâmetro que permite escolher se o retorno será indexado;
    • O TDBUniqueSearch agora funciona com setMinLength(0);
    • Agora o TDropdown suporta mais de um nível;
Adianti Framework 5.6.0 (2019-01-05)
"Nowhere Man" release
  • Informações gerais
    • Para quem possui aplicações na versão 5.5.0 podem seguir o tutorial de migração para atualizar para a 5.6.0;
  • Melhorias globais
    • Acrescentadas novas classes de serviço para autenticação de REST seguro via JWT (link).
  • Novos exemplos
    • Um novo exemplo foi criado para demonstrar uso de diferentes tipos de máscaras em templates. Verifique na aplicação tutor.
    • Um exemplo foi melhorado para demonstrar o novo método AdiantiStandardListTrait::clearFilters(), que limpa uma datagrid que usa o trait padrão. Verifique na aplicação tutor.
  • Melhorias em classes/componentes
    • Uma nova biblioteca de máscaras (https://igorescobar.github.io/jQuery-Mask-Plugin) foi incorporada, agora compatível com mobile. Para voltar ao comportamento anterior, acrescentar no application.js: Adianti.numericMaskLibrary = 'iMask' (Veja exemplo na aplicação tutor):
    • Agora é possível definir atributos nas classes de serviço (extends AdiantiRecordService) para limitar as requisições RecordService.
      Ex: const ATTRIBUTES = ['id', 'name', 'address'];
    • Incorporada tradução para o espanhol para termos do Framework e do Template (colaboração de Willian Padilha). Um artigo será escrito explicando como ativar o suporte em espanhol.
    • Componentes (select2, date, datetime) ajustados para suporte em espanhol (Willian Padilha).
    • Componente TNumeric agora aciona teclado numerico no mobile (atributo inputmode).
    • TDate e TColor agora não exibem mais autocomplete ao clicar no componente, somente o picker (autocomplete off).
    • Mais botões disponibilizados no THtmlEditor (font sizes, line height, italic, undo, redo).
    • A busca em componentes TDBMultiSearch (AdiantiMultiSearchService) agora substitui ' ' no meio por %, buscando por palavras no meio dos elementos.
    • Implementado StandardFormTrait::setAfterSaveAction() para permitir definir uma action personalizada após salvar o registro quando usa o trait padrão.
    • Implementado AdiantiStandardListTrait::clearFilters() para limpar os filtros de uma datagrid que usa o trait padrão.
    • Implementado o método TWindow::parent::disableEscape() para desabilitar ESC nas janelas.
    • Implementado AdiantiHTMLDocumentParser::hideEmptyDetails() para não exibir detail quando a tabela não tiver dados.
    • Implementado TDBEntry::setDisplayMask() para definir uma máscara de exibição na busca.
    • Melhorias na THtmlRenderer para suportar number_format() com espaços antes da vírgula. Ex: number_format({$number} , 2 , '.', ',').
    • Melhorias na THtmlRenderer para suportar date_format() com microsegundos. Ex: date_format({$datetime}, 'm/d/Y H:i:s') em que $datetime é "2018-10-31 15:47:24.17505".
    • Melhorias na THtmlRenderer para suportar date_format() com data vazia.
    • Melhorias nos popovers e titles para suportar aspas simples e duplas sem quebrar o HTML.
    • Adicionado novo parametro no AdiantiStandardListTrait::addFilterField() para operador lógico (and, or).
    • Implementado THidden e TText::getPostData() para serem corretamente processados no post de TFieldList.
    • Implementado TText::setMaxLength(), para definir um tamanho limite.
    • TImage suporta imagens começando com http:// ou https://
    • Os métodos AdiantiFileSaveTrait::saveFile() e AdiantiFileSaveTrait::saveFiles() agora retornam o(s) objeto(s) gravados.
    • O método TDBMultiSearch::setValue() para aceitar setValueSeparator().
  • Correções de bug
    • Corrigido o bug que gerava uma warning no console JS "Incorrectly using unescaped '#' characters in a data URI body".
    • Corrigido bug na TDBSeekButton que gerava warning "Transaction index -1".
    • TDateTime não estava traduzido na interface (Willian padilha).
    • TDBUniqueSerch com campos separados por vírgula para busca e sem setMask() ativado, não busca direito.
    • Ajustado métodos TRadioGroup::setBooleanMode() e TCombo::setBooleanMode(), para poderem ser executados após o setValue() também.
    • SQLServer, ao adicionar o campo de primary key também como atributo (addAttribute), dava erro: coluna tal especificada várias vezes.
    • O método saveFiles() foi corrigido para evitar geração de caminhos de gravação com duas barras (//) em sequência.
    • Melhorias na THtmlRenderer para evitar erro quando passa um atributo de objeto que não é escalar.
    • Melhorias na adianti_block_ui() para poder configurar mensagem de carregando... no theme4.
    • Ajustado TMultiEntry para permitir configurar a altura, que não estava funcionando.
    • No componente TCalendar, as letras que representam os dias no cabeçalho não estavam sendo traduzidas.
Adianti Framework 5.5.0 (2018-09-01)
"In my life" release

  • Informações gerais
  • Melhorias globais
    • Select2 atualizada para 4.0.5;
    • Novo mecanismo de URL's amigáveis (link).
    • Novas classes para REST Services (link ).
    • Compatibilidade com RESTFul Services (link).
  • Novos componentes
    • Um novo componente foi criado: TTime. Ele permite seleção de horas.
  • Novos exemplos
    • Um novo exemplo foi criado para demonstrar a montagem de formulários Bootstrap com labels acima. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como organizar o layout em colunas Bootstrap. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como rolagem horizontal em datagrids. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como embutir PDF em uma página. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como embutir PDF em uma janela. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como embutir um site/sistema externo em uma página. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como embutir um site/sistema externo em uma janela. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como criar uma janela sob demanda. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar os eventos de formulários. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar o novo evento ao fechar janela. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como carregar dados em forma de array simples. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar um método alternativo para criar objetos. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como transformar o resultado de coleções em PHP. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como filtrar o resultado de coleções em PHP. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar diferentes formas de abrir páginas e janelas por meio de links. Verifique na aplicação tutor.
    • Um exemplo foi modificado para demonstrar o novo método first(). Verifique na aplicação tutor.
    • Um exemplo foi modificado para demonstrar os novos métodos de manipulação de formulários vetoriais. Verifique na aplicação tutor.
    • Um exemplo foi modificado para demonstrar a geração de relatórios em formato XLS. Verifique na aplicação tutor.
    • Um exemplo foi melhorado para demonstrar como criar formulários com visual livre. Verifique na aplicação tutor.
    • Um exemplo foi modificado para demonstrar como Formulários Bootstrap responsivos. Verifique na aplicação tutor.
    • O exemplo sobre Barcode agora abre o PDF em nova janela. Verifique na aplicação tutor.
    • O exemplo sobre QRCode agora abre o PDF em nova janela. Verifique na aplicação tutor.
    • O exemplo sobre calendários com dados estáticos foi melhorado visualmente. Verifique na aplicação tutor.
    • O exemplo sobre calendários com dados dinâmicos foi melhorado visualmente. Verifique na aplicação tutor.
    • O exemplo sobre ponto de vendas foi melhorado visualmente. Verifique na aplicação tutor.
    • O exemplo sobre combos hierárquicas foi melhorado visualmente. Verifique na aplicação tutor.
    • O exemplo sobre tela de vendas foi melhorado visualmente. Verifique na aplicação tutor.
    • O exemplo sobre cadastro de produtos foi melhorado para demonstrar o novo componente de upload de arquivos. Verifique na aplicação tutor.
  • Melhorias em classes/componentes
    • O componente BootstrapFormBuilder permite agora criar formulários livres com labels acima dos campos (Veja exemplo na aplicação tutor):
      $this->form->setFieldSizes('100%'); $row = $this->form->addFields( [ new TLabel('Code'), $code ], [ new TLabel('Name'), $name ], [ new TLabel('Gender'), $gender ], [ new TLabel('Status'), $status ] ); $row->layout = ['col-sm-2', 'col-sm-6', 'col-sm-2', 'col-sm-2' ];
    • O componente TFieldList (Formulários vetoriais) agora é responsivo. O método addField() permite definir a largura da coluna em percentual. (Veja exemplo na aplicação tutor):
    • O componente TFieldList (Formulários vetoriais) agora suportam TTime, TDateTime, TSpinner e TDBUniqueSearch.
    • A classe TTableWriterXLS foi criada para exportação de relatórios em XLS foi criada. (Veja exemplo na aplicação tutor):
    • Os componentes THtmlRenderer (templates) e AdiantiHTMLDocumentParser (documentos) permitem aplicação de algumas funções básicas no HTML: (Veja exemplo na aplicação tutor):
      number_format({algo}, 2,3) date_format({algo}, from, to) evaluate({algo}+{algo})
    • A paginação de datagrids agora possui botões para navegar diretamente para a primeira e ltima páginas de registros (quando tiver quantidade de registros maior que as 10 posições do navegador já permite).
    • O componente TMessage foi melhorado para permitir mensagens do tipo "atenção". Ex: new TMessage('warning', 'Mensagem');. (Veja exemplo na aplicação tutor):
    • Agora é possível chamar qualquer janela que estenda a TWindow no formato CustomerWindow::create(...), no lugar de Application::loadPage();
      $win = ContainerWindowView::create('teste', 0.8, 0.8); $win->show();
    • O método TPageNavigation::enableCounters() foi criado para habilitar totalizadores automáticos de registros (1 a 10 de 160 registros) na datagrid (Lucas Tomasi, Pablo); (Veja exemplo na aplicação tutor):
    • O método TWindow::setCloseAction() foi criado para definir uma ação ao evento de fechamento de janela. (Veja exemplo na aplicação tutor):
    • O método TFullCalendar::renderPopover() foi criado para renderizar um popover sobre o título de evento do calendário: (Veja exemplo na aplicação tutor):
      $event_array['title'] = TFullCalendar::renderPopover($event_array['title'], 'Popover title', $popover_content);
    • O método TFile::setAllowedExtensions( ['jpg'] ) agora gera tag accept=".csv,.xls" no input, impedindo que o usuário selecione arquivos de outras extensões no diálogo que o navegador abre para a seleção. É importante notar que o servidor já fazia esta validação anteriormente.
    • O método TEntry::setMask() agora possui parâmetro booleano extra replaceOnPost() para limpar mascara no POST. Quando este parâmetro estiver ligado, a edição do formulário já colocará a máscara.
    • O método TFullCalendar::disableDragging() foi implementado para bloquear a movimentação de um calendário.
    • O método TFullCalendar::disableResizing() foi implementado para bloquear o redimensionamento dos eventos de um calendário.
    • O método TDBEntry::setService() foi criado para indicar um backend service para autocomplete diferente do padrão.
    • O método TEntry::reloadCompletion() foi criado para recarregar autocomplete do TEntry com novas opções (Lucas Tomasi).
    • O método TCombo::clearField() foi alterado para disparar o evento de change quando limpa a combo. Mas um parâmetro extra foi criado (fire_events) para poder desligar este comportamento.
    • O método TFieldList::clear() foi implementado para limpar um formulário vetorial completamente (Eduardo Caron, Pablo).
    • O método BootstrapFormBuilder::setFieldSizes() foi criado para definir o tamanho de todos os campos do form de uma vez.
    • O método TDBSeekButton::setCriteria() foi criado para definir um criteria para seek depois de sua instanciação.
    • Os componentes TDBUniqueSearch e TCombo com enableSearch() agora suportam tags no conteúdo. Ex: <b>{nome}</b> (Veja exemplo na aplicação tutor):
    • Os componentes TDBMultisearch, TDBUniqueSearch, TDBEntry agora usam operador ilike por default para buscas textuais quando o conector for PostgreSQL;
    • O componente TDBUniqueSearch agora funciona com o método TForm::sendData() para enviar estaticamente os dados.
    • O componente TDBSortList agora aceita máscara nos campos. Ex: "{name} - {state}".
    • O componente TDBSeekButton foi melhorado visualmente e agora possui o método setDisplayLabel() pra definir o título da coluna descritiva.
    • O componente TDBSeekButton teve a chamada simplificada no construtor. Agora não são mais necessários tantos parâmetros, pois alguns já tem valores default.
    • O componente TDBSeekButton agora já carrega o campo descritivo automaticamente na edição do formulário.
    • O componente TInputDialog agora suporta BootstrapFormBuilder como parâmetro.
    • Os componentes TSelect e TDBSortList agora permitem usar largura em percentual.
    • O recurso de scroll vertical em datagrids foi melhorado para suportar Bootstrap com largura em percentual;
    • A classe TImage agora suporta Material Icons (Lucas Tomasi, Pablo), mas a biblioteca ainda não está incorporada no Template, é preciso incluí-la via CDN quando necessário. Ex: mi:alarm red mi:alarm small blue.
    • Acrescentado método para habilitar cabeçalho e rodapé em RTF/PDF/XLS/HTML (setHeaderCallback/setFooterCallback). (Veja exemplo na aplicação tutor):
    • O componente BootstrapFormBuilder agora tem pré ajustes para todas colunas de 1 até 12 slots de conteúdo.
    • Os Relatórios em RTF agora tem os tamanhos das colunas proporcionalizadas para não estourar o tamanho máximo da página.
    • Os componentes TDBUniqueSearch e TDBMultiSearch agora suportam chaves alternativas (não somente a PK), como chave do componente.
    • O componente TMultiFile agora permite gravar em banco separado por vírgula. AdiantiFileSaveTrait::saveFilesByComma()..
    • O método TSortList::setValueSeparator() foi implementado para habilitar que o POST de um TSortList ocorra com as opções separadas por vírgula, no lugar de um array. Isto permite gravação em campos Varchar ou Text.
    • O método BootstrapFormBuilder::addActionLink() foi criado para para permitir adicionar uma ação de GET (não POST) em um formulário Bootstrap.
    • Agora é possível definir quais bordas serão ligadas em relatórios HTML e PDF (Leandro Coelho para PDF):
      $tr->addStyle('datai', 'Arial', '10', '', '#000000', '#ffffff', 'LR'); // 0=sem borda, vazio ou 1=com borda, R=right, L=left, T=top, B=bottom
    • Mensagens do upload de arquivos (AdiantiUploaderService) foram traduzidas.
    • O estilo CSS do componente TCalendar foi melhorado.
    • O estilo CSS das datagrids nativas foi melhorado.
    • O estilo CSS dos notebooks nativos (hover) foi melhorado (Leandro Coelho).
  • Melhorias em persistência
    • O método TConnection::setConfigPath() foi criado para indicar o caminho onde os INI's de configuração do banco ficarão armazenados de maneira alternativa à pasta padrão app/config.
    • A classe TRecord foi alterada para carregar somente os atributos definidos pelo addAttribute() no método construtor do Active Record, não mais '*'. Isto pode gerar exceções em casos onde o desenvolvedor apagou um campo da tabela, mas esqueceu de remover o addAttribute() correspondente.
    • O carregamento de objetos agora pode ser realizado com menos atributos para evitar estouro de memória em classes com muitos atributos.
      $products = Product::select('id', 'description') ->where('unity', '=', 'PC') ->orderBy('id') ->load();
    • Os métodos TRecord::first() e TRecord::last() foram criados para retornar o primeiro e último objeto de uma classe (ObjectFirstLastView):
      $first = Customer::where('login', '=', 'maria') ->first(false); // O false é para não carregar os agregados; $first = Customer::first(); $last = Customer::last();
    • O update em lote agora aceita o prefixo NOESC para efetuar cálculos relativos a outros campos:
      Product::where('id', 'IN', [1,2,3,4]) ->where('status', '=', 'C') ->set('preco_venda', 'NOESC:preco_custo * 1.1') ->update();
    • O método transform() foi criado para transformar o resultado de uma coleção antes de ser totalmente carregada em memória:
      $list = Customer::where('id', '>', 1)->transform( function($object) { $object->name = $object->name . ' - changed'; });
    • O método filter() foi criado para filtrar o resultado de uma coleção antes de ser totalmente carregada em memória:
      $list = Customer::where('id', '>', '1')->filter( function($object) { return (stripos($object->address, 'canela') !== false); }, false);
    • As conexões com Oracle podem ser realizadas somente com a string de TNS na declaração do INI do banco.
    • As conexões com sql Server, que sempre usaram o type "mssql", que por sua vez utilizava o driver dblib para Linux ou sqlsrv para windows, agora podem usar os tipos específicos type=dblib ou type=sqlsrv.
    • O método getIndexedArray() agora aceita máscaras na primeira posição (chave).
      $products = Product::where('unity', '=', 'PC') ->orderBy('id') ->getIndexedArray('key{id}', 'teste {description}'); $products = Product::getIndexedArray('key{id}', 'teste-{description}');
    • O método TRepository::loadStatic() foi criado para carregar coleções simples static.
    • Alguns atributos private foram substituídos para protected na TRepository para permitir estender a classe.
  • Melhorias nos templates:
    • O template agora possui a recuperação de senha por e-mail com tokens JWT. Para habilitar este recurso é necessário adicionar no application.ini na seção [permission]:
      [permission] ; Permite que usuários resetem a senha - por meio de um link na tela de login reset_password = "1"
      Obs: Para funcionar, é necessário realizar todos os passos do processo de migração, integralmente.
    • O template agora permite que os usuários se auto registrem. Para habilitar este recurso é necessário adicionar no application.ini na seção [permission]:
      [permission] ; Permite que usuários criem conta (auto registro) - por meio de um link na tela de login user_register = "1" ; Lista de grupos default para usuários que se auto registrarem default_groups = "2" ; Código do programa inicial para usuários que se auto registrarem default_screen = "10"
      Obs: Para funcionar, é necessário realizar todos os passos do processo de migração, integralmente.
    • O login agora possui um módulo pr-pronto para habilitar autenticação AD/LDAP.
    • Uma nova página foi criada para para exibir os módulos habilitados do PHP.
    • Agora é possível ao usuário alterar a foto do perfil, substituindo o avatar padrão.
    • O Navegador de dados agora permite localizar tabela com base na digitação.
    • O Navegador de dados agora permite exportar o banco inteiro ou somente uma tabela como CSV.
    • O Navegador de dados agora permite exportar o banco inteiro ou somente uma tabela como SQL.
    • A lista de programas agora indica o caminho que o programa se encontra no menu.
    • A lista de programas agora indica apresenta opções para adicionar e remover o item do menu.
    • O formulário de cadastro de programas agora somente somente lista as controllers que ainda não foram cadastradas.
    • O cadastro de programas já permite marcar os grupos que terão acesso ao programa, com caixas de marcação (checkbox).
    • Agora é possível gerar notificações de sistema com data futura. O dropdown foi adaptado para listar somente as notificações até o dia atual.
    • O formulário de login não estava exigindo a unidade quando o multiunidade estava ligado.
    • Foi adicionado um CSS para quebrar adequadamente itens longos do menu do tema3 - Admin LTE (Artur Comunello).
    • Agora, as requisições de página rolam para o topo (onBeforeLoad application.js).
    • Foi adicionada transparência no preloader do adminbsb (Sugestão do Tales Igor Ebert).
    • Ao apagar o grupo, agora apaga também a relaão com usuários, para não ficar dados desnecessários no banco em MySQL com myisam.
  • Correções de bug
    • Scripts gerados com TScript::create() estavam acumulando no DOM, tornando a navegação lenta depois de um período (application.js: Adianti.onClearDOM).
    • Algumas chamadas com a função count() estavam gerando Warning quando PHP >= 7.2.
    • Alguns eventos de troca de valor de componentes como TMultiSearch com TCombo com enableSearch() estavam provocando chamadas extras desnecessárias a partir do TForm::sendData().
    • Quando era chamado o TForm::sendData() para enviar valores com quebras de linha, as quebras eram removidas.
    • Os componentes TDBUniqueSearch/TDBMultiSearch agora aceitam setMinLength(0) (Eduardo Caron).
    • Quando havia mais de um formulário BootstrapFormBuilder com abas na mesma tela, a troca de abas não funcionava corretamente (Rodrigo Moglia).
    • Quando existia um campo chamado "data" no banco, dava erro durante o carregamento do registro.
    • Componentes TRadio/TCombo/TCheckGroup/TSelect/TMultiSearch agora funcionam com opções de índice zero.
    • Calendário agora permite clicar fora da área visível para adicionar novo registro.
    • Campos de arquivos (TFile) obrigatórios com enable handling ligado não estavam funcionando.
    • O método estático disableField() não estava trocando a cor de fundo de TEntry, TNumeric, e TDate.
    • Às vezes, o popover do TFullCalendar não era exibido quando a conexão era lenta.
    • Diálogos com yes/no estático não estavam preservando o fundo da página (static=1).
    • Formulários Bootstrap em mobile nem sempre deixavam o usuário clicar nos primeiros campos para posicionar o foco.
  • Melhorias em apps de exemplo
    • As apps (changeman, library) foram atualizadas com o Framework novo.
    • Library: Formulário de livros refeito para usar BootstrapFormBuilder com labels acima, lista de autores, assuntos e exemplares melhorada para ficar responsiva.
    • Library: Telas de empréstimo e devolução melhoradas para lista de exemplares ser responsiva.
    • Library: Relatórios agora também exportam em XLS.
    • Library: Criada página de estatísticas com gráficos de livros por coleção, livros por classificação, e empréstimos por mês.
    • Changeman: Tela de novo chamado melhorada para usar componente TTime (hora), adicionada hora de encerramento do chamado.
    • Changeman: Agora usa TMultiFile e permite vários arquivos por chamado. Também usa trait para upload de arquivos.
    • Changeman: Realizada uma customização no CSS para que os arquivos do upload se pareçam com botões.
    • Changeman: Criada página de estatísticas com gráficos de chamados por estado, por categoria, e abertos por mês.
Adianti Framework 5.0.0 (2017-10-27)
"A Hard Day's Night" release

  • Informações gerais
    • Um novo Template para criação de sistemas foi disponibilizado. Verifique a página do Template;
    • Para quem possui aplicações na versão 4.0.0 podem seguir o tutorial de migração para atualizar para a 5.0.0;
  • Melhorias globais
    • Atualizada JQuery para 3.2.1;
    • Atualizada JQuery-UI para 1.12.1;
    • Atualizada FullCalendar para 3.4;
    • Atualizada FontAwesome para 4.7;
    • Atualizada Select2 para 4.0.3;
    • Atualizada Summernote para 0.8.7;
    • Atualizada Colorpicker para 2.5.1
    • Padronizada pasta /vendor no autoloader e incluído ali algumas dependências (qrcodes, barcodes, dompdf, rtf, phpmailer). Total compatibilidade com composer. Ex: "composer require fzaninotto/faker". O init.php foi ajustado para carregar o autoloader de vendor. Carregamentos de bibliotecas fora do composer devem estar em vendor/autoload_extras.php
  • Novos componentes
    • Um novo componente foi criado: TUniqueSearch. Ele permite selecionar um item dinamicamente com a digitação a partir de um vetor (similar a TCombo com enableSearch()). Verifique na aplicação tutor.
    • Um novo componente foi criado: TDBUniqueSearch. Funciona como o TUniqueSearch, mas permitindo buscas dinâmicas em tabelas; Verifique na aplicação tutor.
    • Um novo componente foi criado: TMultiEntry. Ele permite entrar com várias strings separadas por vírgula ou enter. Verifique na aplicação tutor.
    • Um novo componente foi criado: TFormSeparator. Ele permite criar uma divisória em formulários.
    • Uma nova classe foi criada: AdiantiBarcodeDocumentGenerator: Ela permite gerar documentos com códigos de barras e QRCode. Verifique na aplicação tutor (barcode). Verifique na aplicação tutor (qrcode).
  • Novos exemplos
    • Um novo exemplo foi criado para demonstrar a nova classe para criar formulários vetoriais. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar a nova classe para gerar barcodes. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar a nova classe para gerar QRCodes. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar Barcodes e QRCodes em tela. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como criar Dashboards. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar a conversão de documentos HTML em PDF. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar um gráfico com dados da base. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar formulários master/detail com controllers separadas (uma para o master e uma para o detail), mas na mesma tela. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar os atalhos de persistência. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar os novos métodos render() e evaluate(). Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar os vários componentes de formulários. Verifique na aplicação tutor.
    • Este exemplo foi alterado para demonstrar a geração de documentos PDF. Verifique na aplicação tutor.
  • Melhorias em classes/componentes
    • Implementado o método TFile/TMultiFile::setAllowedExtensions(), para definir as extensões permitidas (ex: jpg, png, gif) no upload;
    • TDBSeekButton recebe operator da consulta como parâmetro no final do construtor (like/ilike);
    • Implementado o método BootstrapFormBuilder::setColumnClasses(), para configurar o grid layout do formulário;
    • Agora é possível usar o componente TTextDisplay dentro de um BootstrapFormBuilder;
    • Agora é permitido passar vários campos como parâmetro de uma ação de datagrid, por meio do TDataGridAction::setFields(), que permite passar um array simples[];
    • BootstrapFormBuilder permite agora ter actions à direita da toolbar topo;
      • $this->form->addHeaderAction('Send 3', new TAction(array($this, 'onSend')), 'fa:check-circle-o green');
    • Criado o método TCombo/TRadioGroup::setBooleanMode(), que cria uma combo/radio que trata corretamente valores booleanos em tela;
    • Criado popover sobre Fullcalendar:
      • $this->fc->enablePopover( 'Title {title}', '<b>{title}</b> <br> <i class="fa fa-user" aria-hidden="true"></i> {person} <br> {description}');
        $obj = (object) ['title'=>'Event 1', 'person' => 'Mary', 'description' => 'Complementary description'];
        $this->fc->addEvent(1, 'Event 1', $before_yesterday.'T08:30:00', $before_yesterday.'T12:30:00', null, '#C04747', $obj);
    • Criado método para indicar os dias disponíveis em um calendário:
      • $this->fc->enableDays([0,1,2,3,4,5,6]);
    • MultiSearch agora permite a busca por múltiplos campos (basta separar por vírgula):
      • $search2= new TDBMultiSearch('search2', 'samples', 'Customer', 'id', 'name, birthdate');
    • Implementado o método TDBMultiSearch::disableIdSearch(), para desabilitar busca pelo ID no TDBMultisearch;
    • TMultiSearch/TDBMultiSearch agora permitem tags HTML na máscara da descrição;
    • Melhorada a aparência da janela de buscas (seek);
    • Agora é permitido passar máscaras com atributos de objetos para TAction::setParameter('chamado_id', '{id}'), ao utilizá-lo em datagrids;
    • Templates HTML agora funcionam sem cifrão (padrão mustache) {{var}};
    • Foi implementado o método TDate::setOption() (Thanks to Artur Comunello);
      • $expires->setOption('startDate', '05/05/2017');
    • TCheckGroup, TCombo, TRadioGroup, TSelect, TSortList, TMultiSearch, e TDBMultiSearch agora possuem um método setChangeFunction() para atribuir uma function Javascript pura quando trocar de valor;
    • Acrescentado o método TEntry, TPassword, TText::setExitFunction(), para atribuir uma function Javascript pura quando sair do campo;
    • TForm::sendData() agora suporta combo com enableSearch();
    • O método TForm::sendData() agora suporta check e radio na forma de botões;
    • O método TForm::sendData() agora suporta TMultiSearch, TUniqueSearch, TMultiEntry;
    • Acrescentado o método TColor::setChangeAction();
    • ReloadFromModel() agora aceita strings no formato mustache:
      • TDBCombo::reloadFromModel('form_hierarchical', 'city_id', 'samples', 'City', 'id', '{name} ({id})', 'name', $criteria, TRUE);
    • TSpinner agora aceita casas decimais;
    • Criado o método BootstrapFormBuider::getActions();
    • TPanelGroup agora permite trocar o background do header;
      • $panel = new TPanelGroup('Panel group title', 'orange');
    • A action da datagrid agora permite passar cores em RGB também:
      • $action1->setImage('bs:search #ff0000');
    • O método setSize() do TRadioGroup e TCheckGroup agora configuram o tamanho do botão (option);
    • O método TCombo::reload() agora aceita options com ">>>" para formar níveis;
    • O método TDataGridAction::setImage() agora permite passar um objeto TImage, não somente descrição da imagem;
    • Não exibir um THidden sozinho na classe BootstrapFormBuilder da mesma maneira que em BootstrapFormWrapper;
    • TFrame e TScroll agora aceitam % em width e height;
    • Agora é possível definir margin em um THtmlEditor:
      • $html->style='margin-left:50px; margin-top:20px';
    • TMultiSearch e TDBMultiSearch agora enviam a changeAction por POST, não GET;
    • Ao usar cálculos em datagrids, era necessário ter espaços em branco entre os operadores, agora não é mais necessário;
    • Se na TDBCombo tiver expressões com substituição de campos "{campo}", onde a ordenação por SQL é impossível, a ordenação será feita via PHP;
    • O método setFontSize() agora aceita "px" ou "pt";
    • Nos relatórios, agora é possível alterar formato e orientação em PDF e RTF (TTableWriter);
      • $tr = new TTableWriterPDF($widths, 'L', 'A4');
        $tr = new TTableWriterRTF($widths, 'L', 'A4');
    • Implementado o método TPageNavigation::getCount() que permite retornar a qtde de registros da datagrid;
    • TPageNavigation, agora tem os métodos getLimit(), getCount(), getPage();
    • Implementado o método TButton::addStyleClass() para permitir adicionar uma classe CSS ao botão;
    • Melhorados os gráficos usando Google Charts para permitir colocar mais de um na mesma tela;
  • Melhorias em persistência
    • Homologado suporte ao Firebird nativo via PDO;
    • Criado o método render() nas Active Records, para permitir renderizar strings com atributos.
      • print $customer->render("Oi {name} that lives in {address}");
    • Criado o método evaluate() nas Active Records, para permitir cálculos com atributos.
      • print $product->evaluate("={amount}*{price}");
    • Criado o método filterMany(), que permite carregar objetos relacionados, e ao mesmo tempo filtrando.
      • Customer::find(2)->filterMany('Contact')->where('active', 'is', TRUE)->load();
    • Implementado o método getIndexedArray() para uso com repositórios, o que permite utilização encadeada.
      • $products = Product::where('unity', '=', 'PC')->orderBy('id')->getIndexedArray('id', 'description');
    • Criado o método create(), que permite criar rapidamente um active record com base em um vetor.
      • $category = Category::create( ['name' => 'test 8'] );
    • Melhorado o metodo deleteComposite(), adicionado parâmetro ao final para indicar se vai fazer delete cascade, chamando o delete() dos objetos compostos.
    • No driver para Sql Server, havia fixo no código um order pelo 'id'. Isso foi removido.
    • Na conexão com Postgresql, agora observa o parâmetro 'char' no ini. Transforma em SET CLIENT_ENCODING.
  • Melhorias nos templates:
    • Um novo template (theme4) foi criado, baseado no AdminBSB ("Conheça o AdminBSB");
    • O novo template (theme4) usa novos diálogos (SweetAlert) e novo seletor de datas (material-datetimepicker);
    • Criada tela para visualizar os logs de erro do PHP (SystemPHPErrorLogView);
    • Criada nova tela para navegar nos bancos de dados (SystemDatabaseExplorer);
    • Criado recurso que permite Multi-empresa no template. Este recurso permite o usuário selecionar a unidade (empresa/filial) já na tela de login: Adicionar "multiunit = 0" na seção general do application.ini;
    • Alterado formulário de cadastro de usuários para permitir vincular mais de uma unidade;
    • Script de Download (download.php) do template agora verifica se o usuário está logado;
    • O diálogo "Carregando..." para requisições GET longas foi adicionado no application.js (Post original);
    • Melhorada tela de consulta e edição de perfil do usuário;
    • Foi alterado o posicionamento da barra de navegação (page navigator) para ficar dentro do footer do panelgroup;
    • Simplificada a tela padrão de seek para funcionar melhor em mobile;
    • Melhorias de performance no mecanismo de tradução do template (ApplicationTranslator);
    • Distribuído rest.php.dist e soap.php.dist junto com o template (basta renomear para ter o server SOAP ou REST);
    • Na tela de login do template botar validação nos campos;
    • Na busca de programas, lista somente os que tem permissão, mas agora filtrado pelos que são visíveis no menu;
    • Tirar o profile do menu logout, deixar somente no menu do usuário;
    • Melhoria do diálogo de "Carregando" em dispositivos móveis (centralização/largura);
    • Aceitar também https:// além de http:// como link direto no menu.xml
  • Novos controles
    • Min version aumentado para 5.5;
  • Correções de bug
    • TFile evita upload de scripts (ex: php, py, cgi);
    • Ação posterior à confirmação em dialogs era disparada duas vezes quando o usuário clicava fora da área;
    • Corrigido bug ao passar criteria para o TDBMultiSearch. Quando já tinha criteria, ele usava OR com o que o usuário digitava, não AND;
    • Corrigido erro ao registrar changelog de campos booleanos (FALSE não gravava em campo text, feito cast (String));
    • HTML's com quebras de linha gerados em métodos estáticos agora são exibidos normalmente (\n\r);
    • Na classe TFilter, o terceiro parâmetro é tratado como subconsulta se começar ou '(SELECT' ou '(select', independente do case;
    • Atribuição de id $entry->id e $combo->id não estava funcionando mais;
    • Seeks criadas pelo designer não passavam o hash de segurança;
    • Agora, quando um BootstrapFormBuilder não tiver actions, não exibe o footer vazio;
    • Se TSlider e TSpinner já iniciavam desabilitados (setEditable(false)), era impossível reabilitá-los via javascript;
  • Melhorias em apps de exemplo
    • As apps de exemplo (changeman, library) foram compatibilizadas com o novo tema material (theme4);
    • No Changeman havia um bug na tela "compartilhados comigo", invalid input syntax for type date;
    • A datagrid de chamados agora usa labels para rotular o estado (status);
    • No Changeman, agora é possível ver o link do arquivo relacionado na tela de consultar o chamado;
    • No Library, agora é tratado o valor do item ao salvar o livro/exemplar (remover a vírgula 10,20);
    • No Library, foram corrigidos bugs com as seeks nas telas de relatórios;
    • No Tutor, foi feita uma busca no código-fonte por palavras-chave (ex: componentes) na área da direita;
    • No Tutor, o cadastro de clientes (CustomerFormView) foi alterado para usar a classe TFieldList;
Adianti Framework 4.0.0 (2016-12-14)
"Free as a bird" release

  • Informações gerais
    • Um novo Template para criação de sistemas foi disponibilizado. Verifique a página do Template;
    • Para quem possui aplicações na versão 3.0.0 podem seguir o tutorial de migração para atualizar para a 4.0.0;
  • Novos componentes
    • Um novo componente foi criado: TFullCalendar. Ele permite criar calendários com agendamentos. Verifique na aplicação tutor.
    • Um novo componente foi criado: BootstrapFormBuilder. Ele permite montar formulários responsivos Boostrap com abas de maneira ágil. Verifique na aplicação tutor.
    • Um novo componente foi criado: TDateTime. Ele permite o usuário selecionar data e hora em um mesmo objeto. Verifique na aplicação tutor.
    • Um novo componente foi criado: TQuickNotebookForm. Ela permite criar rapidamente formulários com abas. Verifique na aplicação tutor.
    • Um novo componente foi criado: TTextDisplay. Ele permite gerar um elemento span para exibir textos facilmente.
      new TTextDisplay('Teste', 'red', 12, 'biu'); Verifique na aplicação tutor.
    • Um novo componente foi criado: TActionLink. Ele permite gerar um link para uma ação (TAction) interna da aplicação.
      new TActionLink('Link', $action, 'blue', 12, 'biu'); Verifique na aplicação tutor.
    • Um novo componente foi criado: THyperLink. Ele permite gerar um link para um recurso (arquivo interno ou link externo).
      new THyperLink('THyperLink (url)', 'http://www.google.com', 'orange', 12, 'biu'); Verifique na aplicação tutor.
    • Um novo componente foi criado: TIcon. Ele permite seleção de ícones.
  • Novos exemplos
    • Um novo exemplo demonstra a utilização do novo componente de calendário com dados estáticos. Verifique na aplicação tutor.
    • Um novo exemplo demonstra a utilização do novo componente de calendário integrado com o banco de dados. Verifique na aplicação tutor.
    • Um novo exemplo demonstra a criação de formulários com campos vetoriais. Verifique na aplicação tutor.
    • Um novo exemplo demonstra uma tela de vendas com formulário com campos vetorias. Verifique na aplicação tutor.
    • Um novo exemplo demonstra gráficos de barra com Google charts. Verifique na aplicação tutor.
    • Um novo exemplo demonstra gráficos de linha com Google charts. Verifique na aplicação tutor.
    • Um novo exemplo demonstra gráficos de pizza com Google charts. Verifique na aplicação tutor.
    • Um novo exemplo demonstra uma lista de vendas com filtros inteligentes, usando funções de transformação. Verifique na aplicação tutor.
    • Um novo exemplo demonstra o carregamento de diferentes páginas em partes diferentes da tela. Verifique na aplicação tutor.
    • Um novo exemplo demonstra a criação de uma datagrid com labels. Verifique na aplicação tutor.
    • Um novo exemplo demonstra a criação de uma datagrid com campos calculados e totais. Verifique na aplicação tutor.
    • Um novo exemplo demonstra a utilização de templates com várias seções e subníveis usando a nova sintáxe com matrizes. Verifique na aplicação tutor.
    • Um novo exemplo demonstra a criação de um formulário vertical Bootstrap. Verifique na aplicação tutor.
    • Um novo exemplo demonstra como exibir/esconder linhas de um formulário. Verifique na aplicação tutor.
    • Um novo exemplo demonstra a utilização de formulários dentro de popovers. Verifique na aplicação tutor.
    • Um novo exemplo demonstra a utilização de combos hierárquicas. Verifique na aplicação tutor.
    • Um novo exemplo demonstra a utilização radios e checks em colunas. Verifique na aplicação tutor.
    • Um novo exemplo demonstra a criação de um formulário com abas laterais à esquerda. Verifique na aplicação tutor.
    • Um novo exemplo demonstra como criar links e botões para ações internas ou recursos externos. Verifique na aplicação tutor.
    • Um novo exemplo demonstra como solicitar senha antes do envio da ação do formulário. Verifique na aplicação tutor.
    • Um novo exemplo demonstra como efetuar cálculos em formulário com ações Javascript (client side). Verifique na aplicação tutor.
    • Um novo exemplo demonstra o novo container TPanelGroup. Verifique na aplicação tutor.
  • Melhorias em classes/componentes
    • Criado o método TDate::setDatabaseMask(), que define a máscara do BD de um campo date. Ao ser utilizado, já realiza a conversão dos formatos de data entre a tela (setMask) e o banco de dados (setDatabaseMask()) na edição/postagem. Verifique na aplicação tutor.
    • Agora é possível colocar campos lado a lado usando BootstrapFormWrapper, usando addQuickFields e notação de vetor []. Verifique na aplicação tutor.
    • Agora é possível botar máscara para o campo de descrição no TDBCombo, TDBRadioGroup, TDBCheckGroup, e outros. Inclusive usando atributos de objetos relacionados (como em city->name), desde que existam os métodos (Ex: get_city()):
      • $radio = new TDBRadioGroup('radio', 'samples', 'Category', 'id', '{id}-({name})');
      • $combo = new TDBCombo('combo', 'samples', 'Customer', 'id', '{id}-{name}-({city->name})');
    • Agora é possivel criar colunas calculadas com fórmulas em datagrids:
      • $datagrid->addQuickColumn('Subtotal','= {amount} * ( {price} - {discount} )', 'right', 80);
    • Agora é possível produzir facilmente totais em datagrids:
      • $column->setTotalFunction( function($values) { return array_sum((array) $values); });
    • Acrescentada uma função anonima como 4o parâmetro da addFilterField(), para transformar o valor do campo antes de injetar na query.
      • parent::addFilterField('name','like','name', function($value){ return strtoupper($value); });
    • Agora é possível usar métodos e atributos relacionados no setMask do TDBMultiSearch. Verifique na aplicação tutor.
      • $search->setMask('({id}) {name} - {state->name}');.
    • TDBMultiSearch agora aceita busca pelo código do objeto também;
    • Agora é possível passar para o popover atributos de objetos relacionados, {cidade->estado->pais->nome}, desde que existam os métodos (Ex: get_estado(), get_pais()):
      • $datagrid->enablePopover('Popover', 'Hi {name}, living at {city->name}-{city->state->name}');
    • Permite a transformação visual de TRadioGroup e TCheckGroup em buttons. Verifique na aplicação tutor.
    • TSpinner, TDate, TColor, TMultiSearch, TDBMultiSearch, TFile agora aceitam largura como percentual;
    • Popover: Implementado o atributo popside, que pode ser usado sobre qualquer objeto para definir o lado que o popover irá abrir;
    • THtmlEditor, TRadioGroup, e TCheckGroup agora são suportados pelo metodo TForm::sendData();
    • TRadioGroup, TSelect, e TText agora também disparam changeaction quando alimentado via sendData();
    • Agora é possível definir combos com separadores de subitens. Verifique na aplicação tutor.
    • Aceleração considerável no mecanismo de tradução do THtmlRenderer;
    • Implementados métodos forceLowerCase() e forceUpperCase() na TEntry. Thanks to Marco AR Campos;
    • Em requisições dinâmicas (changeActions, exitActions), agora passa _field_id, _field_name, e _field_value do requester;
    • Implemetado TNotebook::setTabsSensibility(), para definir se as abas serão sensíveis ao clique;
    • Implementado setEditable(FALSE) na TMultiSearch e TDBMultiSearch;
    • TNotebook agora aceita alterar estilos inline (Ex: $note->style = "");
    • Foi adicionado um parâmetro booleano ao TForm::clear(), que permite preservar os setValues() definidos nos contrutores dos objetos. Ex: Data default;
    • Agora é possível colocar title no header da datagrid via ->title ou setProperty(). Verifique na aplicação tutor.
    • THtmlRenderer agora suporta vários níveis de iteração em um único template. Verifique na aplicação tutor.
    • Agora é possível substituir de atributos de um objeto TRecord dentro do THtmlRenderer, sem precisar passar um a um dos atributos, basta passar o objeto ao replace e depois usar a sintaxe: {$object->name};
    • Agora é possível definir ícones font awesome com cores específicas em métodos que esperam com imagens, com a sintaxe: "fa:save #FF0000";
    • Implementados os métodos TSortList::setLimit(), para definir um limite e TSortList::setOrientation(), pra definir a orientação;
    • O construtor do TLabel, agora aceita mais parâmetros: __construct($value, $color = null, $size = null, $decoration = null);
    • Foi criado um atalho para criação de actions, já definindo os parâmetros: new TAction(array($this, 'onSave'), ['id'=>5] );
    • Foi criado um método estático para criar rapidamente objetos TTable a partir de matrizes (TTable::fromData());
    • Implementado ->titside = "top/left/right/bottom", que ao ser utilizado junto com ->title = "", define o lado para o qual o title irá ser exibido;
  • Melhorias em persistência
    • Novas configurações no INI para Oracle:
      • char=AL32UTF8 // alterar charset de conexão
      • flow=1 // força atributos para lowercase
      • date="YYYY-MM-DD" // NLS_DATE_FORMAT
      • time="YYYY-MM-DD HH:MI:SS.FF" // NLS_TIMESTAMP_FORMAT
      • nsep=',.' // NLS_NUMERIC_CHARACTERS
    • Implementado TRecord::getAttributes();
    • Implementado o update em massa:
      • Customer::where('id','IN',[1,2,3,4])->where('status','=','C')->set('gender', 'M')->update();
    • Implementado atalho para criação de critérios com "=" e "and":
      • TCriteria::create( ['state_id' => $param['state_id'] ] );
    • Implementado atalho para recarregar combo direto com valores do banco:
      • $criteria = TCriteria::create( ['state_code' => 'RS' ] );
      • TDBCombo::reloadFromModel('form_x', 'city_id', 'samples', 'City', 'id', 'name', 'name', $criteria, TRUE);
  • Melhorias globais
    • Atualizada JQuery para 2.1.4;
    • Atualizada Font-Awesome para 4.5;
    • Chamadas síncronas Javascript foram substituídas por assíncronas para evitar: Synchronous XMLHttpRequest on the main thread
    • Implementada a classe AdiantiApplicationConfig, que lê o application.ini na inicialiação e disponibiliza seu conteúdo pelo método get();
    • Agora é possível renderizar uma página (TPage) em diferentes partes (DIV's) do template HTML. Se uma página tiver definido o atributo $this->adianti_target_container = 'xyz'; então ela será renderizada neste DIV. Verifique na aplicação tutor.
    • Itens do menu.xml agora são traduzíveis usando a seguinte sintaxe: _t{Groups};
    • Atualizada versão da FPDF para 1.81;
    • Aumentada a lista de mimetypes para downloads no download.php;
    • Ajuste PHPMailer para evitar exceções de certificado SSL;
    • Melhor controle de erros quando não tem conexão com internet. Não trava mais o diálogo carregando;
    • A classe de cache TAPCache, agora usa as funções apcu_, não mais apc_;
  • Melhorias nos templates:
    • Agora é possível definir quais classes serão públicas (acessadas sem login), diretamente no application.ini:
      [permission]
      public_class[] = ProductView
      public_class[] = CartView
    • Implementada comunicação (mailbox) dentro do template para troca de mensagens entre usuários;
    • Implementado um pequeno controle de documentos, com armazenamento e compartilhamento de documentos entre usuários e grupos;
    • Implementado gráfico com os acessos por dia;
    • Implementado um cadastro de unidades (filiais, setores). Poder vincular um usuário à uma unidade;
    • Implementado controle de notificações ao usuário. É possível gerar uma notificação que leva o usuário à uma ação:
      • SystemNotification::register( $user, $title, $message, $action, $label, $icon );
      • SystemNotification::register( 1, 'Confirmar pgto', 'Aperte no botão para confirmar a ação', 'class=SystemDocumentForm&method=onEdit', 'Editar algo', 'fa fa-pencil-square-o blue' );
    • Implementada uma tela de preferências, para configurações geras do sistema que possam ser alteradas em tempo de execução pelo administrador. Inicialmente terá configurações de e-mail;
    • Implementada uma tela de envio de e-mails para suporte, e dúvidas a respeito do sistema para seus administradores;
    • Criada uma opção "Recarregar permissões" no dropdown do usuário;
    • Agora é possível desativar usuários por meio de um botão na datagrid de usuarios;
    • O cadastro de programas foi melhorado. A nome da classe é agora baseado no sistema de arquivos, para evitar erros de digitação;
    • Foi feito um controle para evitar logins duplicados;
    • No Painel SQL, agora após a seleção do banco, são listadas as tabelas, para facilitar a montagem de queries. Quando seleciona a tabela, já monta o "SELECT * FROM {tabela} limit 100" (funciona somente com PostgreSQL, MySQL, e SQLite);
    • Elaborados novo scripts para instalação das bases do template (permission.sql, log.sql, e communication.sql), testados com PostgreSQL, Mysql e SQLite;
  • Novos controles
    • O Index verifica a versão mínima do PHP para rodar o PHP com version_compare();
    • Foram melhoradas as exceções quando passa uma classe não TRecord ou não encontrada em métodos que espera-se uma;
    • Melhorada a validação de e-mail. (thanks to Paulo Amaral);
    • TStandardForm e TStandardList agora lançam exceptions se não chamar a setActiveRecord() ou setDatabase();
    • Reforçada a segurança em requests de TDBSeekButton, para impedir um usuário, mesmo logado, de fazer requisições;
  • Correções de bug
    • Ao usar o setNumericMask() sobre um campo enviado sem conteúdo, ocorria um notice de number_format();
    • Ao usar Form com BootstrapFormWrapper o campo obrigatório não ficava vermelho;
    • Ao usar BootstrapDatagridWrapper não funcionava ColumnGroup, e não exibia e não funcionava o expande/contrai;
    • TText não desabilita no setEditable(FALSE);
    • SystemChangeLogTrait não dá mais notice quando o campo de primary key não se chama ID;
    • Corrigido alinhamento das options que abrem no TMultiSearch e TDBMultiSearch;
    • Spinner::setValue() agora mantém o valor após aplicar o setRange(), desde que o valor esteja no intervalo e é divisível pelo step;
    • Campos hidden na BootstrapFormWrapper não ficavam realmente escondidos;
    • Campos hidden no TQuickForm ocupavam espaço;
    • THtmlRenderer agora substituem valores NULL também, antes ficava {$var};
    • Campos TEntry com setNumericMask() não estava validando RequiredValidator;
    • TForm::clear() não estava limpando campo com NumericMask e replaceOnPost;
    • Faltava o AutocompleteService no engine.php, por isso dava permissão negada no autocomplete;
    • TButton::disableField() não funcionava em BootstrapFormWrapper, pois nele o botão fica fora do form;
    • Ao atribuir valores NULL para um atributo de TRecord que já tinha valor não voltava para NULL;
    • Não disparava changeaction da TCombo quando a mesma estava desabilitada e tinha valor trocado;
    • Não deixava digitar espaço em branco dentro de TExpander;
Adianti Framework 3.0.0 (2015-11-25)
"What's Going On" release

  • Informações gerais
    • O Template ERP agora conta com 3 diferentes temas (app/templates/themeX). Verifique a página do Template;
    • Para quem possui aplicações desenvolvidas na versão 2.0.0 podem seguir o tutorial de migração para atualizar para a 3.0.0;
  • Novos componentes
    • Um novo componente foi criado: BootstrapFormWrapper. Ele permite transformar um formulário nativo do framework em um formulário Bootstrap. Verifique na aplicação tutor.
    • Um novo componente foi criado: BootstrapDatagridWrapper. Ele permite transformar uma datagrid nativa do framework em uma datagrid Bootstrap. Verifique na aplicação tutor.
    • Um novo componente foi criado: BootstrapNotebookWrapper. Ele permite transformar um notebook nativo do framework em um notebook Bootstrap. Verifique na aplicação tutor.
    • Um novo componente foi criado: TProgressBar. Ele permite criar uma barra de progresso (agradecimentos para Ademilson Nunes). Verifique na aplicação tutor.
    • Um novo componente foi criado: TPanelGroup. Ele permite criar um painel ao redor de formulários. Verifique na aplicação tutor.
    • Um novo componente foi criado: TMultiFile. Ele permite realizar Upload de vários arquivos ao mesmo tempo (agradecimentos para Nataniel Rabaioli).
    • Um novo componente foi criado: TAlert. Ele permite criar mensagens de alerta. Verifique na aplicação tutor.
  • Novos exemplos
    • Um novo exemplo demonstra o uso de query manual com prepare. Verifique na aplicação tutor.
    • Um novo exemplo demonstra a carga de objetos pelo método find(). Verifique na aplicação tutor.
    • Um novo exemplo demonstra a conversão de objetos para JSON. Verifique na aplicação tutor.
    • Um novo exemplo demonstra a utilização de Hook Methods. Verifique na aplicação tutor.
    • Um novo exemplo demonstra a carga simplificada de objetos. Verifique na aplicação tutor.
    • Um novo exemplo demonstra a carga paginada simplificada de objetos. Verifique na aplicação tutor.
    • Um novo exemplo demonstra o método countObjects(). Verifique na aplicação tutor.
    • Um novo exemplo demonstra a contagem simplificada de objetos. Verifique na aplicação tutor.
    • Um novo exemplo demonstra a exclusão simplificada de objetos. Verifique na aplicação tutor.
    • Um novo exemplo demonstra o novo método setLoggerFunction(). Verifique na aplicação tutor.
    • Um novo exemplo demonstra Notebooks Bootstrap. Verifique na aplicação tutor.
    • Um novo exemplo demonstra Notebooks com estilo customizado. Verifique na aplicação tutor.
    • Um novo exemplo demonstra alertas. Verifique na aplicação tutor.
    • Um novo exemplo demonstra formulário com abas. Verifique na aplicação tutor.
    • Um novo exemplo demonstra formulários Bootstrap. Verifique na aplicação tutor.
    • Um novo exemplo demonstra formulários Bootstrap em colunas. Verifique na aplicação tutor.
    • Um novo exemplo demonstra formulários Bootstrap inline. Verifique na aplicação tutor.
    • Um novo exemplo demonstra as novas máscaras de digitação. Verifique na aplicação tutor.
    • Um novo exemplo demonstra datagrids Bootstrap. Verifique na aplicação tutor.
    • Um novo exemplo demonstra datagrids com imagem. Verifique na aplicação tutor.
    • Um novo exemplo demonstra datagrids com barra de progresso. Verifique na aplicação tutor.
    • Um novo exemplo demonstra uma tela de registro passo a passo. Verifique na aplicação tutor.
    • Um novo exemplo demonstra um formulário abrindo uma janela. Verifique na aplicação tutor.
    • Um novo exemplo demonstra uma tela de consulta com ações de edição. Verifique na aplicação tutor.
    • Um novo exemplo demonstra uma tela de seleção de registros com clique na datagrid. Verifique na aplicação tutor.
    • Um novo exemplo demonstra uma tela de seleção de registros com checkbox. Verifique na aplicação tutor.
    • Um novo exemplo demonstra uma tela de exclusão de registros em lote. Verifique na aplicação tutor.
    • A lista de produtos foi melhorada para exibir a imagem do produto ao passar o mouse. Verifique na aplicação tutor.
    • O cadastro de produtos agora exibe a imagem ao terminar o upload. Verifique na aplicação tutor.
    • O catálogo de produtos agora possui paginação. Verifique na aplicação tutor.
  • Melhorias em classes/componentes
    • Implementado datatables para habilitar datagrids responsivas ($datagrid->datatable='true');
    • O clique no header da datagrid permite agora ordenar de maneira ascendente ou descendente; Verifique na aplicação tutor.
    • TDataGridAction::setButtonClass() permite exibir ações de datagrid como botões. Verifique na aplicação tutor.
    • O TPageNavigation agora usa as classes nativas Bootstrap. Verifique na aplicação tutor.
    • Agora são usados ícones da Font Awesome nos diálogos;
    • Melhorado o visual dos diálogos de busca de registros (TDBSeekButton). Verifique na aplicação tutor.
    • TMultifield agora utiliza ícones Font Awesome. Verifique na aplicação tutor.
    • Criado o método (TWindow::create('Title', 0.5, 0.5);); para criar janelas de qualquer ponto. Verifique na aplicação tutor.
    • O componente THtmlEditor foi totalmente reestruturado, agora usa a biblioteca summernote. Verifique na aplicação tutor.
    • O componente TFile agora permite definir outro backend para responder ao upload (Ex: $file->setService("MyUploaderClass"));
    • O componente TFile agora permite definir uma ação ao completar o upload (Ex: $file->setCompleteAction(TAction $action)); Verifique na aplicação tutor.
    • O componente TMultiSearch agora permite definir uma máscara de edibição (Ex: setMask("{name} ({id})")); Verifique na aplicação tutor.
    • O componente TMultiSearch agora permite definir outro backend para responder a busca (Ex: $multisearch->setService($service););
    • O componente TMultiSearch/TDBMultiSearch agora permite definir uma ação localizar um registro (Ex: $multisearch->setChangeAction(TAction $action););
    • O componente TSortList agora permite definir uma ação ao alterar um item (Ex: $sortlist->setChangeAction(TAction $action);); Verifique na aplicação tutor.
    • Os componentes TCheckGroup e TRadioGroup agora permitem definir de quantos em quantos itens quebrar (setBreakItems);
    • O método TEntry::setSize() agora permite definir o tamanho em percentual;
    • Implementado o método TCombo::getItems();
    • Se passar setSize(NULL,NULL) para o notebook, ele não fica com tamanho fixo;
    • O método TEntry::setMask() possui suporte à novas máscaras (Thanks WebSeller). Verifique na aplicação tutor.
  • Melhorias em persistência
    • TRecord só carrega para a memória atributos que obrigatoriamente estiverem no addAttribute();
    • Os métodos loadComposite()/hasMany() agora aceitam um parâmetro de ordem;
    • As classes Active Record agora podem ter métodos onBeforeLoad(), onAfterLoad(), onBeforeStore() onAfterStore(), onBeforeDelete(), e onAfterDelete() on que rodam antes e depois da carga/gravação/exclusão de objetos;
    • Implementado TRecord::countObjects();
    • Implementado TRecord::getIndexedArray(), que retorna os registros de uma tabela em um array indexado;
    • Implementado o método TRecord::find(). Ex: ($product = Product::find(2););
    • Implementado o método TRecord::all(). Ex: ($products = Product::all(););
    • Implementado o método TRecord::toJson(). Ex: (User::find(1)->toJson(););
    • Implementado o método TRecord::save() como um alias para TRecord::store();
    • Implementado atalho para o método load(). Ex: (Product::where('name', 'LIKE', '%computer%')->get(););
    • Implementado atalho para o método count(). Ex: ($count = User::where('age', '>', 18)->count(););
    • Implementado atalho para o método delete(). Ex: (User::where('age', '>', 100)->delete(););
    • Implementado atalho para order. Ex: (Product::where('name', 'LIKE', '%computer%')->orderBy('price', 'asc')->get();
    • Implementado atalho para paginação. Ex: (Product::where('name', 'LIKE', '%computer%')->take(3)->skip(3);
    • Implementado o método hasMany(), como atalho para o loadComposite(). Ex: (Customer::find(1)->hasMany('Contact', 'customer_id');
    • Implementado o método belongsTo(), como atalho para o loadAggregate(). Ex: (Customer::find(1)->belongsToMany('Skill', 'CustomerSkill', 'customer_id', 'skill_id');
  • Melhorias nos templates:
    • Implementado log global de SQL. Basta habilitar (slog = "SystemSqlLog") no INI do banco de dados (app/config). A classe indicada faz parte do Template/TemplateII, recebe todos os SQL gerados pelo framework e armazena em uma base de logs (app/config/log.ini);
    • Implementado o trait SystemChangeLogTrait, que permite registrar as mudanças em valores de colunas de uma tabela. Basta acrescentar em cada classe de modelo (use SystemChangeLogTrait;);
    • Os templates agora exibem o nome do usuário logado no menu de logout;
    • Os templates agora possuem um formulário para o usuário alterar os dados de perfil (SystemProfileView);
    • Os templates agora possuem um painel de consulta SQL (SystemSQLPanel);
    • Os templates agora possuem uma tela para consultar os acessos de usuários (SystemAccessLogList);
    • Os templates agora possuem uma tela de boas-vindas (WelcomeView) que explica ao admin como conceder permissões;
    • Os templates agora possuem um campo para busca de programas na barra superior (SearchBox);
    • Os templates agora possuem uma página com o PHPInfo (SystemPHPInfoView);
  • Melhorias globais
    • Arquivos JS e CSS agora JS/CSS são compilados em menos arquivos (Ex: bootstrap-plugins.min.js e jquery-plugins.min.js);
    • Atualizada Font Awesome para 4.4;
    • Atualizada a PHPMailer para 5.2.10;
    • Menus do template1 agora usam navbar;
    • O comportamento padrão para formulários (TStandardForm) foi tranformado em um trait (AdiantiStandardFormTrait). Isto permite usar formulário-padrão com classe-pai TPage ou TWindow;
    • O comportamento padrão para datagrids (TStandardList) foi tranformado em um trait (AdiantiStandardListTrait). Isto permite usar datagrid-padrão com classe-pai TPage ou TWindow;
    • O comportamento padrão para form/list (TStandardFormList) foi tranformado em um trait (AdiantiStandardFormListTrait). Isto permite usar formlist-padrão com classe-pai TPage ou TWindow;
    • Adicionado ícone animado para diálogo de carregando;
    • Implementado TStandardFormList::setCriteria(), assim como o TStandardList;
    • O método TForm::sendData($form_name, $object, $aggregate = FALSE, $fireEvents = true), agora aceita parâmetro opcional fireEvents, que permite desligar o acionamento de events (changeaction, exitaction) quando enviado dados à um formulário;
    • Caso o método aberto a partir de uma datagrid seja estático, não provocará recarga do núcleo da página;
    • Chamadas estáticas de métodos agora também disparam onAfterLoad() e onAfterPost().
  • Novos controles
    • Construtor da TField, classe base para campos de formulário, agora exige um parâmetro válido não-vazio;
  • Correções de bug
    • Eventos dinâmicos como ChangeAction/ExitAction agora enviam requisição por POST para não estourar URL;
    • Na navegação em datagrids, quando voltava para página 1 estava ignorando os registros iniciais;
    • TDBMultiSearch/TMultiSearch não estavam funcionando com TRequiredValidator
    • TMultifield::disableField() não estava funcionando apropriadamente;
    • setNumericMask() fazia com que campos com setEditable(FALSE) tornavam-se editáveis;
    • TRadioGroup não funcionava com TMultifield. Corrigido
    • Com dois TNotebook na mesma tela, no segundo o conteúdo da primeira aba não era exibido;
    • Corrigidos z-index do TDate e blockUI
    • Corrigida falha com prepared no PHP em Windows, pelo uso da uniqid();
    • Corrigidas falhas em vários componentes ao rodar no Windows 7 ou inferior que usavam uniqid(): TDate, TMultiSearch, TSortList, TSpinner, TSlider;
    • Parâmetro "porta" agora é levado em consideração em conexões com Sql Server. Estava fixo antes.
Adianti Framework 2.0.0 (2015-01-05)
"Like a rolling stone" release

  • Informações gerais
    • Com a versão 2.0.0, a renderização de conteúdos do framework (formulários, datagrids) ficou cerca de 30% à 50% mais rápida em relação à versão anterior;
    • Para quem possui aplicações desenvolvidas na versão 1.X podem seguir o tutorial de migração para atualizar para a 2.0.0;
  • Novos componentes
    • Um novo componente foi criado: TDropDown. Ele permite criar um menu drop down. Verifique na aplicação tutor.
    • Um novo componente foi criado: TInputDialog. Ele permite criar um diálogo rápido para entrada de valores. Verifique na aplicação tutor.
    • Um novo componente foi criado: TCalendar. Ele permite exibir calendários mensais. Verifique na aplicação tutor.
    • Um novo componente foi criado: TColor. Ele permite ao usuário selecionar uma cor. Verifique na aplicação tutor.
    • Um novo componente foi criado: TExpander. Ele permite criar uma área expansível dentro de formulários. Verifique na aplicação tutor.
    • Um novo componente foi criado: TMultiSearch. Ele permite buscar valores dinamicamente com a digitação. (Agradecimentos à Matheus Agnes Dias). Verifique na aplicação tutor.
    • Um novo componente foi criado: TDBMultiSearch. Estende o TMultiSearch, permitindo buscas em tabelas. Verifique na aplicação tutor.
    • Um novo componente foi criado: TDBEntry. Permite autocomplete a partir de tabelas do banco de dados. Verifique na aplicação tutor.
  • Novos exemplos
    • Um novo exemplo foi criado para demonstrar como obter informações da transação ativa. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar diálogos de input. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar novas classes CSS, e popover. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar expander em formulários. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar grupos de ações em datagrid. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar agrupamento por colunas em datagrid. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar detalhamento de linhas em datagrid. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como esconder ações em datagrid. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como usar popover em datagrids. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como usar diálogos de input em datagrids. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como usar o calendário. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como usar do dropdown. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como usar o bread crumb. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como exibir códigos-fontes. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como usar formulário em nova janela. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como criar um catálogo de produtos. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como criar uma agenda. Verifique na aplicação tutor.
    • Um novo exemplo foi criado para demonstrar como criar um formulário de vendas. Verifique na aplicação tutor.
  • Melhorias globais
    • Reestruturação de localização e nomenclatura de classes. As mudanças não afetam as aplicações já escrita, basta seguir o migration;
      Ex: lib/adianti/util/TAdiantiLoader.class.php => lib/adianti/core/AdiantiCoreLoader.php;
      Ex: lib/adianti/widget/web/general/TCoreApplication.class.php => lib/adianti/core/AdiantiCoreApplication.php
    • Foi criado mecanismo de cache do caminho das classes para acelerar o autoload (AdiantiCoreLoader::loadClassMap());
    • É permitido ao usuário definir um caminho absoluto da classe, para acelerar a carga (AdiantiCoreLoader::setClassPath());
    • A documentação dos headers das classes (tag @package) foram atualizadas;
    • Utilização de Namespaces em todas as classes do framework;
    • Foram separadas as versões WEB e GTK do framework para uma melhor organização. O download é separado;
    • A Bootstrap foi atualizada para 3.2;
    • A JQuery foi atualizada para 2.1.1;
    • Foi integrada ao framework a font-awesome 4.2. Ex: FormButtonStyleView;
      Ex: $button->setImage('fa:font awesome class');
      Ex: $button->setImage('bs:glyph class');
    • Os Javascript e CSS do framework foram todos minificados;
    • Os Javascript e CSS do framework agora são pré-carregados no primeiro acesso (libraries.html), tornando a navegação mais fluída;
    • Várias chamadas Javascript foram removidas dos componentes, e substituídas por chamadas de funções Javascript pré-carregados pelo components.js ou components.min.js, como tcombo_enable_field(), para habilitar uma combo;
    • Caso o programador precise criar Javascript próprio, fazer em app/lib/include/application.js;
    • Caso o programador precise criar CSS próprio, fazer em app/templates/theme1/application.css;
    • Criado o init.php, com os comandos de inicialização do framework, usado em engine.php, index.php e outros;
    • Criado o cmd.php, que permite executar qualquer método do framework pela linha de comando:
      Ex: php5 /www/tutor-beta/cmd.php "class=CommandLineFacade&method=getCustomers"
    • Implementada a possibilidade de atribuir popover para qualquer componente (Ex: FormButtonStyleView);
    • Classes TWindow não registram mais a ação na URL;
    • Postagens não registram mais a ação na URL, somente no projeto tutor pelo evento (Adianti.onBeforePost);
    • Implementados novos eventos Javascript, que permitem aos usuários definir ações para:
      onBeforeLoad, onAfterLoad, onBeforePost; onAfterPost;
    • Várias melhorias foram realizadas no processamento do retorno de requisições Ajax, o que permite agora usar TMessage no onExitAction. Ex: FormInteractionsView:
    • engine.php do template melhorado por questões de segurança (AdiantiFileUploader só logado);
    • Acrescentado suporte à janelas sobre janelas. Ex: TWindow que abre a partir de outra TWindow;
    • Os últimos atributos public (id) em classes como TDate, TEntry foram removidos. Foi criado o método getId() e setId() para prover a funcionalidade;
    • Em conformidade com a PSR-3, a classe TTransaction agora implementa a interface LoggerAwareInterface. e as classes de log, filhas de TLogger's agora implementam LoggerInterface;
  • Melhorias em classes/componentes
    • Acrescentado suporte nativo à Prepared statements para todas operações do framework. Para habilitar, basta acrescentar prep = "1" no arquivo de configuração (.INI) à base de dados. Veja lista de métodos que suportam prepared statements: TRepository::load(), TRepository::delete(), TRepository::count(), TRecord::load(), TRecord::store(), e TRecord::delete();
    • Melhorado o mecanismo de cache de objetos em memória. A partir de agora, nas classes Active Record, no lugar de usar OBJECTCACHE = TRUE, deve ser usado CACHECONTROL = 'TAPCache', ou outra classe de cache que implemente AdiantiRegistryInterface;
    • Acrescentado exemplo de between no exemplo de critérios:
      new TFilter('age', 'BETWEEN', 16, 60);
    • Acrescentado um exemplo de uso do NOESC nos critérios:
      new TFilter('birthdate', '<=', "NOESC:date(now()) - '2 years'::interval");
    • Acrescentado um exemplo de subselect nos critérios:
      new TFilter('id', 'IN', '(SELECT customer_id FROM purchases)')
    • Implementado o método TTransaction::getDatabaseInfo(), que permite obter informações sobre a transação ativa;
    • Adicionado o segundo parâmetro em TRecord::getObjects($criteria = NULL, $loadAggregates = TRUE);
    • TDBSeekButton agora aceita criterio como parâmetro, que permite pré-filtrar os dados a serem buscados. Verifique na aplicação tutor;
    • A TImage foi alterada para suportar de maneira nativa no método setImage(), classes Glyphicons e Font Awesome. Verifique na aplicação tutor;
    • Implementado o método TButton::create(), que permite criar um botão e já definir sua ação e ícone. Ex:
      $save_button = TButton::create('save', array($this, 'onSave'), _t('Save'), 'ico_save.png');
    • Uma nova biblioteca de autocomplete está em uso no TEntry::setCompletion. Verifique na aplicação tutor;
    • Foi alterado a biblioteca usada em TDate de jquery-ui-datepicker para bootstrap-datepicker;
    • Foram criados parâmetros adicionais na TMenuBar e TMenu para possibilitar renderizar menus com outras classes CSS. Este recurso foi utilizado no template II;
    • Implementado o método TWindow::setModal(), que faz com que o fundo da janela esteja inacessível;
    • Implementados os métodos TVBox::pack() e THBox::pack(), que criam uma box, e já empacotam os argumentos do método;
    • Implementado o método addQuickFields(), que permite adicionar campos lado a lado em quick forms. Verifique na aplicação tutor;
    • Implementados os métodos TForm::getChild(), TCheckGroup::getLayout(), TRadioGroup::getLayout(), e TText::getSize(), que retornam as informações previamente definidas por seus método setters;
    • Implementada a possibilidade de usar proporções no método TWindow::setSize(0.8, 0.8), que aplica 80% de percentual;
    • Criar um log de SQL que joga os comandos do framework na tela: TLoggerSTD;
    • Implementada a possibilidade de criar um TInputDialog baseado em um TQuickForm já existente. Verifique na aplicação tutor;
    • TStandardList agora pode ter vários campos de filtro, por meio do método addFilterField();
    • Novos métodos criados na TElement, que é a classe básica para criação de outros componentes:
      TElement::get($position): Retorna o objeto que está em determinada posição dentro do TElement;
      TElement::insert($position, $child): Insere um objeto novo (child) em determinada posição;
      TElement::__toString(): Converte automaticamente o objeto em string;
    • Melhorado o Estilo CSS para datagrids alternativas: Verifique na aplicação tutor;
    • Agora podem ser usados ícones da font-awesome e glyphicons em datagrids. Verifique na aplicação tutor;

    • Bootstrap: $action->setImage('bs:search blue');
      Font Awesome: $action->setImage('fa:external-link');
    • Implementado o método TDataGrid::setGroupColumn(), que permite criar uma coluna de agrupamento em datagrid. Verifique na aplicação tutor;
    • Implementado o método TDataGridAction::setDisplayCondition(), que permite esconder uma ação em datagrid mediante uma certa condição. Verifique na aplicação tutor;
    • Implementado o método TDatagrid::enablePopover(), que permite habilitar um popover para uma linha de datagrid. Verifique na aplicação tutor;
    • Novos métodos criados para datagrids:
      TDatagrid::getRowIndex($attribute, $value):Retorna a posição de uma linha, baseado em um atributo do objeto;
      TDatagrid::getRow($position): Retorna o objeto linha (TTableRow), baseado na sua posição;
      TDatagrid::insert($position, $content): Insere um conteúdo, baseado na sua posição na datagrid;
    • Implementado o método TTreeView::expandTo(), que permite expandir a tree view até um certo nível;
    • Melhorada a classe TMessage, para executar a ação definida para o botão, mesmo se o usuário clicar fora do diálogo;
    • Implementada a possibilidade de usar cabeçalhos e rodapés com a classe TTableWriterPdf;
      $fpdf = $writer->getNativeWriter();: Retorna instância da FPDF;
      $tr->getNativeWriter()->setHeaderCallback( array($this, 'header') );: define o método para escrever cabeçalho;
    • Implementado o método TQuickForm::addRow(), que permite adicionar uma linha TTableRow em um quick form;
    • Quando utilizado THidden em QuickForm, não cria rótulo (TLabel) na linha;
    • Permitir TLabel trocar a classe CSS ->{'class'} = 'xyz';
    • Desligado por padrão a tradução em THtmlRenderer. Caso necessário, utilizar o método THtmlRenderer::enableTranslation() para habilitar, pois a tradução quando desligada, melhora o desempenho;
    • Implementado o método TDBMultiSearch::setOperator(), para definir o operador de buscas desse componente;
    • Implementado __adianti_message(), __adianti_question() em Javascript;
    • Melhorado o exemplo DecoratedForms;
    • Implementados TVBox::addColSet() e THBox::addRowSet();
    • Implementado TCombo::setDefaultOption();
    • Demonstrada a possibilidade de manter uma combo hierárquica preenchida mesmo após postagem: FormInteractionsView;
    • Criada a classe TScript, para permitir criar códigos Javascript em tempo de execução pelo método create():
      Ex: TScript::create( ' $(\'[widget="TWindow"]\').remove() ' );
  • Novos controles
    • Se a action da datagrid não tiver campo definido pelo setField(), uma a exceção é lançada quando adicionada a action:
      You must define the field for the action (^1)
    • Na classe TDatagrid, quando o campo passado para o setField() não existir, exibir uma exceção:
      Field ^1 not exists
    • Melhorar TPageNavigation. Adicionadas os seguintes controles: Se não chamou setAction(), lançar exceção no show(); Se não chamou setCount(), setLimit(), etc, exibir uma page navigation vazia;
    • TForm::getData() emite exceção se a classe passada como parâmetro não é encontrada:
      Class ^1 not found in ^2
    • Caso a classe de controle não seja encontrada na execução da página, exibir exeção mais completa:
      Class (control) not found. Check the filename or the classname;
    • Na THtmlRenderer, lançar exceção quando o programador esquecer de declarar o final da seção;
      The section (^1) was not closed properly
    • Na TUIBuilder, se não preenchia todos os campos (database, model, key, value) dos TDB's, não funcionava. Lançar exceção:
      The parameter (database) of ^2 is required
    • Sempre deve ser usado try/catch ao redor de THtmlRenderer. Ex: TemplateViewAdvancedView;
  • Correções de bug
    • TCPFValidator estava passando mesmo quando strlen(cpf) >11. Bug corrigido;
    • Melhorias na TUIBuilder. Quando o botão não tinha ação definida ou quando a datagrid tinha uma ação inexistente, a tela não era exibida. Agora, uma exceção é exibida;
    • Quando um TFrame não tinha conteúdo, uma Warning era exibida. Bug corrigido;
    • Quando no Designer havia um botão sem ação definida, o botão não era exibido. Bug corrigido;
    • Corrigida a implementação do método setEditable() para TRadioGroup, TCheckGroup, TCombo, TSelect e derivados (TDB*);
    • Corrigido bug na TRecord que acontecia quando usava SERIAL e mesmo assim passava o ID, ocorria erro "Object not in prerequisite state". Bug corrigido;
    • Corrigido bug na TUIBuilder. Quando o tamanho declarado do form era menor que o real, não ocupava o devido espaço;
Adianti Framework 1.0.3 (2014-05-01)
"Simply the best" release. Em homenagem a Ayrton Senna

  • Informações gerais
    • Uma nova aplicação tutor com novos exemplos está disponível. Verifique a pgina do Tutor;
    • Foi disponibilizada uma nova aplicação exemplo que trata de controle de permissões de acesso por usuários e grupos. Confira o Template ERP;
  • Novos componentes
    • Implementado o novo componente TSortList, que permite definir ordenação de valores. Verifique na aplicação tutor (Presentation -> Forms -> Sort List). Link direto;
    • Implementado o novo componente TSelect, que funciona como um seletor de valores múltiplos. Também foi criado o método TSelect::disableMultiple(), que desliga a seleção múltipla. Verifique na aplicação tutor (Presentation -> Forms -> Static selections). Link direto;
    • Implementado o novo componente TDBSelect, que funciona sobre o componente TSelect, permitindo exibir valores diretamente de uma tabela. Verifique na aplicação tutor (Presentation -> Forms -> Automatic database selections). Link direto;
    • Implementado o novo componente TDBSeekButton, que funciona criando um componente TSeekButton automático de maneira mais simplificada que na versão anterior. Verifique na aplicação tutor (Presentation -> Forms -> Seek button). Link direto;
    • Implementado o componente TBreadCrumb, que permite criar um caminho de migalhas de pão. Verifique na aplicação tutor (Presentation -> Page Transitions -> Static Multi Step Form II). Link direto;
    • Implementado o componente TXMLBreadCrumb, que permite criar um caminho de migalhas de pão baseado na localização da classe atual, dentro do menu.xml. Todos exemplos da aplicação tutor, agora usam esse componente;
    • Implementado o novo container TVBox, que simplifica a tarefa de organizar elementos verticalmente, sem a criação de tabelas. Verifique na aplicação tutor (Presentation -> Containers -> Vertical Box). Link direto;
    • Implementado o novo container THBox, que simplifica a tarefa de organizar elementos horizontalmente, sem a criação de tabelas. Verifique na aplicação tutor (Presentation -> Containers -> Horizontal Box). Link direto;
  • Novos exemplos
    • Um novo exemplo foi criado para demonstrar como realizar conexões com o banco sem arquivos de configuração. Verifique na aplicação tutor (Persistence -> Setup -> Manual connection). Link direto;
    • Um novo exemplo foi criado para demonstrar a busca do primeiro e último IDs de objetos de uma classe (TRecord::getFirstID() e TRecord::getLastID()). Verifique na aplicação tutor (Persistence -> Objects -> First and Last ID). Link direto;
    • Um novo exemplo foi criado para demonstrar como transformar um Active Record em array e vice-versa (TRecord::toArray() e fromArray()). Verifique na aplicação tutor (Persistence -> Objects -> Array conversion). Link direto;
    • Um novo exemplo foi criado para demonstrar como carregar objetos de uma classe pelo novo método TRecord::getObjects(). Verifique na aplicação tutor (Persistence -> Colections -> Collection get objects). Link direto;
    • Um novo exemplo foi criado para demonstrar a utilização dos novos métodos de persistência para composições loadComposite(), saveComposite(), e deleteComposite(). Verifique na aplicação tutor (Persistence -> Relationships -> Object Simple Composition). Link direto;
    • Um novo exemplo foi criado para demonstrar a utilização dos novos métodos de persistência para agregações loadAggregate(), e saveAggregate(). Verifique na aplicação tutor (Persistence -> Relationships -> Object Simple Aggregation). Link direto;
    • Um novo exemplo foi criado para demonstrar a utilização de caixas horizontais. Verifique na aplicação tutor (Presentation -> Containers -> Horizontal Box). Link direto;
    • Um novo exemplo foi criado para demonstrar a utilização de caixas verticais. Verifique na aplicação tutor (Presentation -> Containers -> Vertical Box). Link direto;
    • Um novo exemplo foi criado para demonstrar a criação de tabelas com múltiplas colunas. Verifique na aplicação tutor (Presentation -> Containers -> Table Columns). Link direto;
    • Um novo exemplo foi criado para demonstrar a criação de tabelas com células mescladas. Verifique na aplicação tutor (Presentation -> Containers -> Table Multi Cell). Link direto;
    • Um novo exemplo foi criado para demonstrar como habilitar/desabilitar e limpar campos de um formulário em tempo de execução (sem recarga). Verifique na aplicação tutor (Presentation -> Forms -> Enable/disable interactions). Link direto;
    • Um novo exemplo foi criado para demonstrar a habilitação do botão de envio do formulário somente mediante uma condição. Verifique na aplicação tutor (Presentation -> Forms -> Conditional submission). Link direto;
    • Um novo exemplo foi criado para demonstrar a criação de datagrids com estilos CSS personalizados. Verifique na aplicação tutor (Presentation -> Extras -> Stylized Datagrids). Link direto;
    • Um novo exemplo foi criado para demonstrar como criar campos de entrada de dados em datagrids. Verifique na aplicação tutor (Presentation -> Datagrid -> Datagrid with input fields). Link direto;
    • Um novo exemplo foi criado para demonstrar o novo componente TSortList, que permite definir a ordenação de valores. Verifique na aplicação tutor (Presentation -> Forms -> Sort List). Link direto;
    • Um novo exemplo foi criado para demonstrar a formatação de uma coluna em datagrid baseada em outra coluna. Verifique na aplicação tutor (Presentation -> Datagrid -> Datagrid transformers II). Link direto;
    • Um novo exemplo foi criado para demonstrar um formulário passo a passo estático com abas. Verifique na aplicação tutor (Presentation -> Page transitions -> Static Multi Step Form). Link direto;
    • Um novo exemplo foi criado para demonstrar um formulário passo a passo estático sem abas. Verifique na aplicação tutor (Presentation -> Page transitions -> Static Multi Step Form II). Link direto;
    • Um novo exemplo foi criado para demonstrar um formulário passo a passo construído dinamicamente. Verifique na aplicação tutor (Presentation -> Page transitions -> Dynamic Multi Step Form). Link direto;
    • Um novo exemplo foi criado para demonstrar uma tela passo a passo com postagem entre diferentes formulários. Verifique na aplicação tutor (Presentation -> Page transitions -> Multi Step Multi Form). Link direto;
    • Um novo exemplo foi criado para demonstrar a criação de documentos PDF criados pela nova ferramenta Studio PDF Designer. Este exemplo contém formas (retângulos, elipses), e substituição de textos; Verifique na aplicação tutor (Presentation -> Reports -> Designed PDF shapes). Link direto;
    • Um novo exemplo foi criado para demonstrar a criação de documentos PDF criados pela nova ferramenta Studio PDF Designer. Este exemplo demonstra a criação de um relatório tabular; Verifique na aplicação tutor (Presentation -> Reports -> Designed PDF report). Link direto;
    • Um novo exemplo foi criado para demonstrar a criação de documentos PDF criados pela nova ferramenta Studio PDF Designer. Este exemplo demonstra a criação de uma Nota Fiscal Eletrônica; Verifique na aplicação tutor (Presentation -> Reports -> Designed PDF NFE). Link direto;
    • Um novo exemplo foi criado para demonstrar como realizar edição em datagrid com paginação. Verifique na aplicação tutor (Organization -> Complex Views -> Product massive update). Link direto;
    • Um novo exemplo foi criado para demonstrar a filtragem dinâmica de conteúdo em um formulário. Verifique na aplicação tutor (Organization -> Complex Views -> Dynamic filtering). Link direto;
    • Um novo exemplo foi criado para demonstrar a criação de uma tela de Ponto de Vendas (PDV). Verifique na aplicação tutor (Organization -> Complex Views -> POS form). Link direto;
    • Um novo exemplo foi criado para demonstrar a utilização de fragmentos HTML para exibir as vendas para um cliente. Verifique na aplicação tutor (Organization -> Complex Views -> Customer Status). Link direto;
    • O exemplo de checkout com datagrid foi melhorado para colocar um totalizador. Verifique na aplicação tutor (Organization -> Complex Views -> Checkout form). Link direto;
    • O exemplo Master/Detail que antes era em abas, foi reestruturado para ficar em páginas separadas. Verifique na aplicação tutor (Organization -> Complex Views -> Separated master/detail). Link direto;
  • Melhorias
    • Dialogs de erro e informação foram alterados para usar Bootstrap;
    • Melhorias foram realizadas no visual (CSS) dos componentes TDataGrid, TMultiField, TDate e TSeekButton;
    • Melhorias foram realizadas na aparência dos formulários, por meio da criação de novos estilos (tform, tformtitle, e tformaction), e da atribuição inline destes estilos aos elementos de um formulário. Verifique na aplicação tutor (Organization -> Standard Controls -> Standard form). Link direto;
      Ex: $this->form->class = 'tform'; // CSS style
    • Mensagens de erro Javascript passam a suar dialog jQuery e não alert();
    • Foi criado o método TCoreApplication::registerPage(), que permite registrar uma página na URL. Este método será usado para URL's amigáveis;
    • Foi criado o método TElement::clearChildren(), que permite remover o conteúdo de um container;
    • A partir de agora, quando cria-se ações em datagrid sem imagem (ícone), estas passam a assumir o formato de um botão por padrão. Verifique na aplicação tutor (Organization -> Complex views -> Separated master/detail). Link direto;
    • O componente TFile foi totalmente reescrito para usar controles HTML5 (Créditos: Nataniel Rabaioli);
    • Foi acrescentado na classe TUIBuilder o suporte aos componentes TSelect e TDBSelect;
    • Implementados os métodos TForm::delField() e TForm::delFields(), que permitem remover um (ou todos) campo da manipulação de um formulário;
    • TForm agora pode receber atributos dinamicamente na Web.
      Ex: $this->form->class = 'my-css-form-class';
    • TButton agora pode receber atributos dinamicamente na Web.
      Ex: $button->class = 'btn-success';
    • O método TForm::sendData(), agora permite alterar o conteúdo de campos de seleção (TCombo);
    • Agora é possível apontar propriedades no formato "city->name" em colunas de datagrids. O framework percorre os atributos de objetos relacionados ao Active Record. Verifique na aplicação tutor (Organization -> Complex View -> Complete customers datagrid). Link direto;
    • Agora é possível obrigar o usuário a preencher um campo em uma multifield antes de poder adicioná-lo. Isto é possível pelo 5o parâmetro de TMultiField::addField(). Verifique na aplicação tutor (Presentation -> Forms -> Multi field). Link direto;
    • Foi criado o método TMultiField::setOrientation(), que permite definir a disposição dos campos (horizontal, vertical). Verifique na aplicação tutor (Presentation -> Forms -> Multi field). Link direto;
    • Implementando TNotebook::getCurrentPage(), que permite retornar a página corrente do TNotebook;
    • Agora, a ação definida pelo TSeekButton::setExitAction(), também é executada no evento onSelect da janela de buscas de registros. Verifique na aplicação tutor (Organization -> Complex Views -> POS form). Link direto;
    • O método TQuickForm::addQuickField() agora aceita um novo parâmetro adicional (Validador);
    • Implementados os métodos TStandardFormList::setDefaultOrder() e TStandardList::setDefaultOrder(), que permitem definir uma ordenação padrão para as listagens;
    • Implementado o métodos TStandardList::setCriteria(), que permite definir um filtro, mesmo em listagens padrão;
    • As Seeks padrão (TStandardSeek) passam a ter uma ordem default pela chave primária do registro buscado;
    • Implementados na classe TRecord, os métodos loadComposite(), deleteComposite(), saveComposite(), loadAggregate(), e saveAggregate(), que permitem lidar com relacionamentos de composição e agregação, de maneira simplificada;
    • O Between foi implementado nos filtros: new TFilter('campo' , 'BETWEEN', 1, 2);
    • Criado segundo parâmetro booleano na TRecord::__construct() e na TRepository::load(), para indicar se quer chamar o método load() sobrecarregado do Active Record deve ser chamado durante a carga (carregando objetos agregados). Isto pode ser usado para carregar informações de objetos associados sem carregar seus agregados:
      Ex: TRecord: public function __construct($id = NULL, $callObjectLoad = TRUE)
    • Melhorias foram feitas na performance das controladoras padrão (TStandardFormList, TStandardList, TStandardSeek) para não carregar objetos agregados na listagem:
      Ex: $objects = $repository->load($criteria, FALSE);
    • Melhorias de performance foram feitas nos componentes TDBCombo, TDBSortList, TDBRadioGroup, TDBSelect, TDBCheckGroup, para não carregar objetos agregados:
      Ex: $objects = $repository->load($criteria, FALSE);
    • Implementado TRadioGroup::setChangeAction() e TCheckGroup::setChangeAction(), que permitem definir uma ação quando o usuário troca o valor de uma radio ou check. Verifique na aplicação tutor (Presentation -> Forms -> Enable/disable interactions). Link direto;
    • Implementados os métodos enableField(), disableField() e clearField(), que permitem habilitar, desabilitar ou limpar um campo de maneira dinâmica (em tempo de execução) nas classes: TCombo, TDate, TEntry, TDBCombo, TRadioGroup, TDBRadioGroup, TCheckGroup, TDBCheckGroup, TText, TFile, TPassword, TSeekButton, THtmlEditor, TSpinner, TSlider, TComboCombined, TSortList e TSelect. Verifique na aplicação tutor (Presentation -> Forms -> Enable/disable interactions). Link direto;
    • Implementado o método TNotebook::setTabAction(), que permite definir uma ação para quando o usuário clicar sobre a aba de um TNotebook;
    • As validações de um formulário agora são processadas todas de uma só vez. O processamento acumula as exceções de formulário;
    • Agora é possível substituir variáveis com conteúdo vazio na THtmlRenderer;
    • Foi criado o método TNotebook::setTabsVisibility() para permitir esconder as abas de um notebook;
    • O método TDataGridColumn::setTransformer() agora também recebe o objeto Active Record inteiro, o que permite fazer formatação de um campo baseado em outro campo. Verifique na aplicação tutor (Presentation -> Datagrid -> Datagrid transformers II). Link direto;
    • Implementado o método TWindow::setPosition(), que permite definir um posicionamento absoluto para janelas TWindow;
    • Implementado o método TTable::addRowSet( $obj1, $obj2), que permite adicionar uma linha com várias células de uma só vez em uma tabela. Verifique na aplicação tutor (Presentation -> Containers -> Table Columns). Link direto;
    • Implementado o método TTableRow::addMultiCell($obj1, $obj2, $obj3), que permite adicionar uma célula mesclada com vários conteúdos em uma linha de tabela. Verifique na aplicação tutor (Presentation -> Containers -> Table Multi Cell). Link direto;
    • O exemplo sobre o componente TFrame foi melhorado para demonstrar a criação de um botão para exibir/esconder um frame. Verifique na aplicação tutor (Presentation -> Containers -> Frame). Link direto;
    • Melhorada a navegação entre classes. Agora, postagens também alteram o estado da URL (pushState). Anteriormente, somente requisições por GET atualizavam o endereço da URL (pushState);
    • Criado método para habilitar/desabilitar TButton at runtime: enableField(), disableField();
    • O método TStandardFormList::onEdit() passa a recarregar a datagrid (onReload) mantendo-se na página corrente;
    • Agora é possível passar um filtro (TCriteria) para a TDBCombo, no 7o parâmetro de seu construtor;
    • Agora é possível abrir transações passando somente as informações do banco em forma de array, sem config (INI): TTransaction::open(NULL, $data);
    • Foi implementada a possibilidade de construir uma expressão sem escape em filters, o que permite construir um filtro comparando duas colunas. Ex: $criteria->add(new TFilter('codigo', '<>', 'NOESC:ultimo_utilizado'));
    • Foi implementada a possibilidade de alterar os atributos de campos em geral (TEntry, TPassword, TText) por meio da atribuição direta de propriedades. Ex: $entry->onblur = '...'; Isto já era possível com outros elementos como TTable, TTableRow, etc;
    • Datagrids (TDataGrid) e botões (TButton) foram alterados para vasculhar pelos ícones informados pelo usuário, primeiro na pasta app/images, depois na pasta padrão do framework;
    • Foi disponibilizada uma callback Javascript chamada Adianti.onLoadClass para programar eventos JS sempre que uma nova classe for carregada por GET ou POST pelo framework. Essa callback pode ser melhor compreendida observando o arquivo app/templates/theme1/layout.html do tutor;
  • Novos controles
    • Ações (TAction) definidas em métodos como setChangeAction() e setExitAction() agora precisam necessariamente ser declaradas como static, caso contrário uma exceção será lançada;
    • Em todas classes com setActiveRecord(), agora é verificado se a classe passada como parâmetro é realmente uma filha de TRecord, caso contrário, uma exceção é lançada;
    • O Construtor de TRepository() deve receber uma classe existente e filha de TRecord. Caso contrário, uma exceção será lançada.
    • Um Active Record não pode ter atributo chamado data, pois é um atributo reservado. Sempre que alguém tentar definir um atributo com esse nome, será lançada uma exceção;
    • Objetos com os métodos setExitAction() ou setChangeAction() agora obrigatoriamente verificam se foram passados pelo TForm::setFields(). Caso contrário uma exceção (You must pass the field () as a parameter to TForm::setFields()') será lançada. Isto se deve por que nestas ações, é obrigatório que o campo faça parte de um formulário, tendo em vista que ele envia todos os dados do formulário como parâmetro para a ação;
    • O método TTransaction::setLogger() passa a emitir exceção quando não tiver transação ativa;
  • Correções de bug
    • O fechamento de transação nos TStandardSeek foi passado para depois do retorno dos campos. Assim, agora é possível retornar para o formulário-pai, um atributo dependente;
    • Foram Corrigidos bugs na TMultifield relativos à largura de colunas e atualização de valores quando utilizada com o componente TComboCombined;
    • Corrigido bug na TMultifield relacionado à postagem de caracteres acentuados;
    • Foi corrigida a TRequiredValidator para validar também Radios/Checks vazios;
    • Corrigido bug com estilos em TLabel, que por vezes não eram atualizados na página.
    • Acentos no menu.xml não estavam funcionando no Windows, causando exceção
    • A TRequiredValidator estava falhando ao validar valores com espaços em branco;
    • Corrigidos bugs na abertura de arquivos com a TPage::openFile() no Windows (Ex: Relatórios PDF);
    • THtmlEditor não estava abrindo dentro de TWindow;
Adianti Framework 1.0.2 (2013-10-15)
"Eight days a week" release

  • Informações gerais
    • Uma nova aplicação tutor com novos exemplos está disponível. Verifique a página do Tutor;
  • Novos componentes
    • Um novo componente foi criado para permitir a exibição de árvores (TTreeView). Verifique na aplicação tutor (Presentation -> Forms -> Tree View);
  • Novos exemplos
    • Um novo exemplo foi elaborado, mostrando como construir formulários do tipo Master/Detail. Este formulário permite cadastrar um projeto e vários itens de um Product Backlog dentro do projeto. Verifique na aplicação tutor (Organization -> Complex Views -> Separated master/detail forms);
    • Um novo exemplo foi elaborado, mostrando como construir telas de checkout. Esta tela permite ao usuário selecionar itens de uma datagrid e passar para outra datagrid, usando somente a informação da sessão. Verifique na aplicação tutor (Organization -> Complex Views -> Checkout form);
    • Um novo exemplo foi elaborado, para demonstrar a utilização de templates HTML e estilos CSS para decorar objetos do framework, neste caso um formulário. Verifique na aplicação tutor (Presentation -> Extras -> Decorated forms);
    • Um novo exemplo foi elaborado, para demonstrar a utilização do componente de edição de HTML (THtmlEditor). Verifique na aplicação tutor (Presentation -> Forms -> HTML Editor);
    • Um novo exemplo foi elaborado, demonstrando como utilizar uma separação MVC total no framework, sem a criação do visual da aplicação (View) no método construtor das classes controladoras. Verifique na aplicação tutor (Presentation -> Forms -> Reusable Forms);
  • Melhorias
    • Foram aumentados os tamanhos dos diálogos de mensagem e questionamento;
    • Agora é permitido criar datagrids com rolagem e header fixo. Para tal, é necessário executar os métodos: TDataGrid::makeScrollable(), para habilitar a rolagem, e também TDataGrid::setSize(), para definir seu tamanho. Verifique na aplicação tutor (Presentation -> Datagrid -> Scrollable Datagrids);
    • O componente TSeekButton agora também aceita definir uma ação de saída de campo (setExitAction()), além de sua ação padrão de buscas (setAction()), que além de ser executada na saída do campo, também é via botão (select);
    • Foi acrescentado ao componente TEntry, a possibilidade de definir uma máscara para digitação de valores numéricos, por meio do método TEntry::setNumericMask($decimals, $decimalsSeparator, $thousandSeparator); Verifique na aplicação tutor (Presentation -> Extras -> Decorated Forms);
    • Foi acrescentada à classe TMessage, a possibilidade de acrescentar uma ação ao botão de fechamento do diálogo. Agradecimentos à contribuição de Victor Feitoza. Para tal, foi acrescentado um terceiro parâmetro ao construtor. __construct($type, $message, TAction $action = NULL). Verifique na aplicação tutor (Presentation -> Dialogs -> Error Dialog);
    • A biblioteca sack (usada em lookups) foi removida e substituída por chamadas nativas jQuery. Ela também foi removida dos templates (libraries.html);
    • Foram realizadas melhorias na API de manipulação de objetos (coleções em base de dados);
      • Foi criada uma forma simplificada de contagem de objetos que atendem um determinado critério, utilizando fluent interface. Verifique na aplicação tutor (Persistence -> Collections -> Collection simple count);
      • Foi criada uma forma simplificada de carregamento de objetos que atendem um determinado critério, utilizando fluent interface. Verifique na aplicação tutor (Persistence -> Collections -> Collection simple load);
      • Foi criada uma forma simplificada de exclusão de objetos que atendem um determinado critério, utilizando fluent interface. Verifique na aplicação tutor (Persistence -> Collections -> Collection simple delete);
    • O engine.php (motor de execuão para a Web) foi simplificado em tamanho. Muitas partes deste arquivo (responsáveis por decidir a classe e o método a serem executados) foram passados para a classe TCoreApplication, do núcleo do framework. Apesar do arquivo ter ficado menor, o desenvolvedor pode perfeitamente acrescentar regras de valiação, dentro da chamada do método run(), por onde passam todas requisições Web;
    • Foi melhorada a forma de exibição de exceções que não são tratadas pelo desenvolvedor dentro das classes controladoras. Estas exceções são tratadas dentro do método run() da classe TCoreApplication, o que é realizado no engine.php. Por padrão, o framework passará a exibir uma informação mais completa (trace) sobre a exceção, para facilitar a localização dos erros. Ao final do arquivo engine.php, existe a chamada TApplication::run(TRUE). No parâmetro boolean (TRUE), identificamos se as exceções devem ser exibidas da forma completa com trace (TRUE) ou não (FALSE).
    • Dentro das classes de controle, as exceções são controladas totalmente pelo desenvolvedor, que utiliza-se normalmente da classe TMessage para exibir as mensagens de erro. Para facilitar a localização de problemas, foi criada uma classe de Debug de exceções. Assim, no lugar de utilizar simplesmente a classe TMessage, o desenvolvedor pode utilizar a chamada: new TExceptionView($e); onde $e é o objeto de exceção. O framework providenciará um debug completo da exceção lançada.
    • A constante APPLICATION_NAME, que é utilizada para separar o conteúdo de variáveis de sessão conforme o nome da aplicação, passou a ter seu conteúdo alimentado a partir do arquivo de configuração da aplicação (application.ini). Como antes ela estava definida de maneira fixa no engine.php e index.web.php, muitos desenvolvedores alteravam seu conteúdo em apenas um lugar, causando confusões;
    • Ações em datagrid agora são executadas mantendo os parâmetros de paginação. Assim, ao excluir um registro de uma datagrid, o usuário permanecerá na mesma página. Para que essa estratégia funcione, algumas mudanças devem ser realizadas:
      • Caso você ainda tenha um engine.php da versão anterior, deverá passar os parâmetros da URL ($_GET) ao executar o método show() da página $page->show( $_GET ). Na nova versão do engine.php (que utiliza a classe TCoreApplication, isso já está habilitado por default;
      • Sempre que o desenvolvedor reescrever o método show() em alguma página em que faz uma chamada ao método onReload(), deverá passar um novo parâmetro: $this->onReload( func_get_arg(0) );
      • Os metodos delete() que fazem chamada ao método onReload() devem acrescentar um novo parâmetro na chamada ($param), que representa os parâmetros da URL, da seguinte forma: $this->onReload( $param );
    • Foram criadas novas classes CSS: tdatagrid_head e tdatagrid_body, para quem desejar manipular o visual das datagrids;
    • A classe TAdiantiLoader, responsável pelo carregamento das classes, foi alterada para também efetuar carregamento de classes localizadas no diretório app/view;
  • Novos controles
    • Catchable Fatal Errors (Ex: Type hinting) agora são tratados como exceções com melhor debug (set_error_handler);
    • Algumas validações foram acrescentadas:
      • Caso o desenvolvedor passe NULL para o método TTableRow::addCell(), uma exceção será lançada;
      • O método TForm::setFields() somente aceitará um parâmetro do tipo vetor. Caso contrário, uma exceção será lançada;
      • O método TQuickForm::addQuickAction() foi modificado para aceitar somente um parâmetro do tipo TAction. Caso contrário, uma exceção será lançada;
      • No momento de instanciarmos um objeto do tipo TAction, é verificado se o parâmetro é uma callback válida do PHP. Caso contrário, uma exceção será lançada;
      • O método addCell() das classes TTableWriter*, agora verifica se o estilo identificado como parâmetro foi previamente criado. Caso contrário, uma exceção será lançada;
      • Não é permitido adicionar um item na datagrid sem executar o createModel() antes. Caso isso for realizado, uma exceção será lançada;
      • Não é permitido criar uma ação ou coluna em datagrid após o método createModel() ser executado. Caso isso for realizado, uma exceção será lançada;
      • Não é permitido adicionar 2 campos com o mesmo nome no form pelo TForm::addField(). Caso isso for realizado, uma exceção será lançada;
      • Todos os widgets agora implementam a interface IAdiantiWidget, o que permite uma maior consistência em formulários;
      • O método TForm::setFields() foi alterado para somente aceitar widgets (IWidget) em cada uma das posições do vetor passado como parâmetro;
  • Correções de bug
    • Conexões Myql, que antes estavam iniciando com encoding ISO, passaram para UTF8 por default. Caso seja necessário utilizar Mysql com encoding ISO, será necessário acrescentar "char = ISO" ao arquivo de configuração do acesso à base de dados;
    • Ao utilizar a estratégia de incremento de ID's (IDPOLICY) do tipo "serial" com PostgreSQL, o ID do objeto não estava sendo gravado após a chamada do método store(). Este bug foi corrigido;
    • O componente TMultiField apresentava um bug de scrolling com muitos itens. Este bug foi corrigido;
Adianti Framework 1.0.1 (2013-06-25)
"Do You Want to Know a Secret" release
  • A camada de persistência agora suporta o Banco de dados MS Sql Server;
  • A camada de persistência agora suporta o Banco de dados Oracle;
  • Uma nova aplicação tutor com novos exemplos está disponível. Verifique a página do Tutor;
  • Uma nova funcionalidade está disponível em formulários, permitindo lidar com interações em formulários de maneira dinamica. Verifique na aplicação tutor (Presentation -> Forms -> Dynamic interactions);
  • Um novo grupo de bibliotecas para geração de gráficos está disponível. Verifique na aplicação tutor (Presentation -> Charts/Reports -> Line/Bar/Pie chart);
  • Um novo exemplo de datagrid com filtragem no topo e exportação para CSV está disponível. Verifique na aplicação tutor (Organization -> Complex Views -> Complete customers datagrid);
  • Agora é possível utilizar edição inline nas datagrids. Um exemplo de como utilizar este recurso foi preparado. Verifique na aplicação tutor (Organization -> Complex Views -> Inline editing datagrid);
  • Um novo componente (TSpinner) está disponível. Verifique na aplicação tutor (Presentation -> Forms -> Custom Forms);
  • Um novo componente (TSlider) está disponível. Verifique na aplicação tutor (Presentation -> Forms -> Custom Forms);
  • Uma nova funcionalidade de tooltip/dica de preenchimento ($widget->setTip()) está disponível. Verifique na aplicação tutor (Presentation -> Forms -> Custom Forms);
  • Um novo validador (TNumericValidator) está disponível. Verifique na aplicação tutor (Presentation -> Forms -> Form validation);
  • Um novo exemplo demonstra como criar um componente novo no espaço da aplicação. Verifique na aplicação tutor (Presentation -> Extending -> Creating new components);
  • Um novo exemplo demonstra como criar containers do tipo Window. Verifique na aplicação tutor (Presentation -> Containers -> Window);
  • Um novo exemplo demonstra como modificar as colunas de uma datagrid para exibição. Verifique na aplicação tutor (Presentation -> Datagrid -> Datagrid transformers);
  • Um novo exemplo demonstra como criar datagrids com checkbuttons. Verifique na aplicação tutor (Presentation -> Datagrid -> Datagrids with Checkbutton);
  • Um novo exemplo demonstra como fazer datagrids que abrem uma nova janela na ação. Verifique na aplicação tutor (Presentation -> Datagrid -> Datagrids with new Window);
  • Um novo exemplo demonstra como filtrar e ordenar a datagrid por uma informação associada (tabela relacionada). Verifique na aplicação tutor (Organization -> Complex Views -> Complete customers datagrid);
  • A documentação do site agora explica como criar novos componentes;
  • A documentação do site agora explica como criar novos validadores;
  • Toda a pasta /lib de sua aplicação deve ser atualizada. Tome cuidado para não sobrescrever a pasta /app (sua aplicação). Faça um backup antes;
  • Todas bibliotecas Javascript e arquivos CSS necessários agora estão encapsulados no arquivo libraries.html, que deve ser referenciado dentro do template pela palavra-chave {LIBRARIES}. Esta palavra-chave é substituída pelo conteúdo "libraries.html" pelo "index.web.php";
  • Muitas bibliotecas externas utilizadas pelo framework foram atualizadas (jquery-1.8.3, jquery-ui-1.9.2), e algumas outras foram incluídas. Garanta que você tenha importado o libraries.html em sua aplicação usando a palavra-chave {LIBRARIES} dentro do cabeçalho de seu template;
  • TButton agora usa estilos da bootstrap;
  • TMessage e TQuestion agora usam diálogos jQuery;
  • A integridade referencial em bancos SQLite agora é ligada no início da conexão em tempo de execução;
  • Alguns estilos foram melhorados e removidos do cdigo-fonte (veja lib/adianti/include/tdatagrid/tdatagrid.css);
  • O método __construct() das classes TDBCheckGroup, TDBCombo e TDBRadioGroup agora recebe um quinto elemento que contém o nome da coluna para ordenação;
  • O método setOperator() foi criado em TStandardList para definir qual o operador será usado para filtragem nos controladores-padrão;
  • O método disableDefaultClick() foi criado na TDataGrid para opcionalmente desligar o clique normal para executar a ação default.


Adianti Framework 1.0.0 (2012-11-10)
"Twist and Shout" release
Release inicial.