sábado, 12 de novembro de 2016

Global Events


Os habitantes de Funafuti acordaram muito preocupados nesta última semana. E isto se deve principalmente aos últimos acontecimentos, também pudera, não é sempre que o famoso Tuvalu-News noticiou algo tão estranho como a eleição americana. Simplesmente a bolsa de valores de Tuvalu teve uma queda expressiva!

Realmente estamos vivendo uma era de eventos globais, e a eleição nos Estados Unidos é um bom exemplo, pois como pode algo específico do povo americano afetar o funcionamento do mundo inteiro? Será que os americanos se deram conta da responsabilidade que possuem neste momento? Será que ao saírem de casa, no dia da eleição eles pensaram, muito bem vamos derrubar a bolsa de Tuvalu?

Por mais que gostem ou não do resultado, alguns países ficam mais 'afetados' com o problema dos outros. A própria imprensa brasileira está 'decepcionada' com o resultado, e são intermináveis programas, entrevistas, debates sobre este 'tão relevante' assunto para o Brasil, e claro que a conclusão de todos é sempre a tal: vamos ver como é que fica.  Também como explicar uma imprensa que torce ao invés de reportar.

De fato vivemos momentos globais.

Mas deixemos o Trump trabalhar e o pessoal de Tuvalu jogar o seu kilikiti em paz, e vamos ao que, de fato, interessa.


Global Events

Assim como o acontecimento americano, Genexus 15 também afetou a economia. Porém, não estamos falando de dinheiro, e sim da economia de se criar uma única WebPanel para todas as interfaces do sistema! A chamada Single Page Application.

Este tema ficou meio esquecido principalmente porque faltava exatamente o Global Events, e os resultados produzidos não eram, assim, tão legais.

Acontece que GeneXus 15 nos entregou um novo objeto em nossa Kb, o Global Events, que ao ser configurado nos permite que os nossos WebComponents possam 'conversar' com o WebPanel.


Lembrando que isso não era então possível, simplesmente porque o WebPanel tinha a mania de não escutar o que o WebComponent tentava lhe falar, era quase um monólogo onde o painel passava seus parâmetros para o componente, e esperava que este funcionasse, porém não se preocupava nem um pouco se este produzia alguma coisa que lhe pudesse interessar.

Esta situação de falta de comunicação ficou muito evidente com a GeneXus Ev3 porque a mudança do cenário dos eventos Smooth, já não aceitava mais o conceito de reconstruir a interface inteira com um Refresh total, coisa das 'antiquadas interfaces' da Ev2, Ev1, e dai pra baixo. Isto passou a ser quase um pecado, pois como você pode fazer algo com o avançado recurso de atualizar apenas um pedaço da interface (Smooth), se de vez em quando tem que ser forçado a atualizar tudo, parece que a coisa perde um pouco sua importância.

Uma Single Page Application de uma única via também parecia ter um limite de funcionamento, então, o pessoal, 'ouvindo a voz da comunidade' meteu a mão na massa e nos entregou o Global Events.

Nada como termos uma conversa franca, não é mesmo?

Para que serve isso?

Simples, serve para que você possa enviar para um WebPanel alguma ocorrência de um de seus componentes, e com isso permitir que o painel principal possa fazer alguma coisa.

Por exemplo, se você possui um WebPanel e precisa carregar um component, o comando Create é suficiente para enviar para este os parâmetros necessários para sua construção.


Desta forma um comando Component1.Object = Comp1.Create(&p1, &p2), vai passar para o objeto Comp1, que é um WebComponent, os parâmetros &p1 e &p2. E assim o objeto Comp1 será incluído na interface e apresentar seu conteúdo.

O problema é que o objeto Comp1 não possui uma maneira eficaz de enviar para o WebPanel o resultado de algum evento que possa ocorrer. Por exemplo, se este tiver um Grid, ao se selecionar uma linha, não teremos como enviá-la para a página principal. Pode-se dizer que utilizávamos algumas técnicas aleatórias profissionais para fazer isso.


Bem, não tínhamos, agora temos, pois com o Global Events, registramos um evento que ao acontecer disparará uma ação global no sistema, e poderemos interceptar esta ação em nosso WebPanel. Não fique nervoso, é simples.

É mais ou menos assim, registre um novo evento no Global Event, definindo os parâmetros que utilizará para realizar a comunicação.
Em seguida, para gerar o evento será necessário 'chamar' este evento, num formato muito parecido com a chamada a um objeto qualquer. Entre parenteses se deve informar o valor a ser transmitido,a como, por exemplo, GlobalEvents.MeuEvent(2). Esta ação é realizada no WebComponent.

Esta operação disparará um evento global, que poderá ser interceptado por um WebPanel. Para que isto ocorra será necessário criar um Event GlobalEvents.MeuEvento, neste WebPanel.



Em seguida,  uma vez que o evento tenha sido interceptado com Event MeuEvento, será possível tomar uma decisão, como por exemplo, se trocar o Comp1 para outra interface qualquer, criando o efeito da Single Page Application. Teríamos vários componentes a serem apresentados em apenas um WebPanel.

Um Exemplo

No Wiki HowTo: Using Global Events in Web Objects temos um excelente exemplo apresentado pela Sabrina Juarez, inclusive com o XPZ que pode ser baixado e colocado em sua Kb. Neste a Sabrina apresenta uma lista de autores e seus livros, e quando se escolhe algum no Grid à esquerda, os componentes que apresentam os detalhes são disparados.


É um recurso muito interessante e simples de entender.  No exemplo, apenas um pequeno detalhe, caso ocorra um erro na carga das imagens, no DataProvider LiteraryWork_DataProvider, mais especificamente nas linhas que carregam as capas dos livros, devem ser comentadas. // LiteraryWorkImage = Link("bodas_de_sangre")

Conclusão

O Global Event do GeneXus se mostra um recurso excepcionalmente interessante e com certeza vai se adequar muito bem aos projetos mais ambiciosos de interface.

Infelizmente, quanto à eleição americana, parece que o mundo também tem sido influenciado globalmente pela falta de candidatos adequados para que a população possa escolher alguém de fato representativo. Os políticos de aqui e de acolá estão adotando aquela velha estratégia suja de fechar uma lista de pessoas que infelizmente não poderiam ser escolhidas, na qual o melhor seria não escolher ninguém, digamos, que tal o menos pior?

Se a tendência perdurar até 2018, pode ser que tenhamos um Trump aqui também.







terça-feira, 11 de outubro de 2016

Web Live Editing

Normalmente levamos um certo tempo para assimilar as coisas novas, inclusive é esperado que percamos também algum tempo entendendo tudo. Minha experiência com live editing foi assim, porém, após três horas tentando fazer a coisa funcionar, sem sucesso, uma inocente tentativa de abrir o programa em um outro navegador fez com que o endpoint fosse imediatamente construído, :(

Portanto, antes de mais nada, feche seu Firefox e abra o Chrome, e em seguida se quiser ver o recurso funcionando bonito, bastará respeitar algumas regrinhas:

1) Execute a aplicação Genexus em modo Live Editing


2) Abra a aplicação no Chrome, Opera, Microsoft Edge, Vivaldi, ...,  (somente no Firefox não funciona, vai entender)

3) Na interface do Genexus verá que um endpoint é definido para o navegador. Uma bolinha verde indicará que o Genexus está conectado ao navegador. E assim, qualquer ajuste refletirá imediatamente no navegador aberto. Se abrir uma segunda janela do navegador, um novo endpoint será criado para esta.


4) Na Web somente ajustes realizados no tema Carmine atualizarão imediatamente o conteúdo do navegador. Isto significa que é possível trocar cores, fontes, dimensões de texto, porém, não será possível se incluir um novo recurso na tela, como por exemplo um novo botão.  A estrutura da página deverá estar montada, o live editing ajudará no ajuste visual final.

Portanto, acredito que uma boa prática para usar o recurso seria construir a estrutura da interface, e em seguida quando entrar no modo ajuste fino, se liga o recurso para alinhar as fontes e aspectos visuais.

Troca de imagens também não funciona, portanto, até o momento o recurso está um pouquinho limitado, mas a idéia com certeza é fantástica!

Maiores informações




quarta-feira, 5 de outubro de 2016

User Control, um pequeno resumo

Durante o evento Genexus Gx26 apresentamos uma palestra resumindo a construção de User Controls.

Para os interessados, o link é o seguinte:

GX26 Meeting
Desenvolvendo Web User Controls para GeneXus 15

O processo apresentado é aplicável às versões anteriores do Genexus.

quinta-feira, 22 de setembro de 2016

User Controls

Existem alguns temas que parecem tão complexos e obscuros que afugentam a grande maioria das pessoas, como se fosse uma selva sombria e úmida. Os poucos que desbravam esta densa vegetação, creio que em busca de uma aventura, acabam como heróis por sua coragem, desprendimento, e principalmente por encontrar as riquezas ocultas.

Esta era minha a sensação quando se falava User Control, um tema oculto e destinado apenas aos mais destemidos, que, sendo sincero, nunca tive muita intenção de abraçar, mas que ao mesmo tempo aguçava demasiadamente a minha curiosidade, e claro admiração.

Acontece que novos caminhos levaram a uma trilha na qual, o que se via a frente era apenas esta densa floresta, e nenhum desvio, a não ser a única opção de ingressar literalmente no meio do mato.

Trilhando um novo caminho

Com o advento do Abstract Editor o que pudemos observar foi que o pouco de HTML que poderíamos recorrer quando o calo apertava, simplesmente foi ocultado em um novo nível de abstração, que simplesmente deixou de aceitar baixarias, ou melhor, 'baixo nível'.

O mesmo editor também causou um bom incômodo, por nos permitir criar as tais maravilhosas interfaces responsivas, porém, com parcos recursos. Até o momento, sem o Work With for Web não saímos do lugar.

Foram muitos artigos aqui no Genexando nos quais apresentávamos algumas formas de produzir conteúdo HTML + CSS na interface, como, por exemplo, textblock.caption, mas mesmo isto, apesar de ser possível, não parece mais ser uma solução elegante e consistente no modelo atual. Nada contra este recurso, ainda o utilizo, mas que tal buscarmos algo novo?

O pior é que a solução para estas questões já estava disponível desde 2007, sob o nome de User Control, a única coisa que faltava era uma boa documentação.

User Control

No meu humilde ponto de vista, User Control acaba de ganhar muita importância neste novo cenário, pois, de repente, nossos recursos foram limitados basicamente aos Common Controls do Toolbox.

A razão é simples, nenhum (ou quase nenhum) User Control atualmente publicado no Marketplace está preparado para o cenário da responsividade. Encontram-se ainda sob a ótica das interfaces Web tradicionais, e vão exigir, no mínimo uma boa revisão por parte dos nossos heróis desbravadores.

Os User Controls também oferecem uma forma muito mais elegante para resolvermos a questão do uso de recursos para construirmos interfaces convincentes, que são as excelentes bibliotecas externas em Javascript que diariamente nos entregam novas funcionalidades, e que caberiam muito bem aos nossos projetos.

Desta forma, com a motivação adequada e certo de que poderíamos sair vivos desta selva, buscamos a ferramenta adequada para enfrentarmos o desconhecido. E o resultado desta aventura, também se mostrou um enorme desafio.

O que é um User Control?

Dificilmente você não utilizou um User Control, é quase impossível uma interface GeneXus sem pelo menos um deles. Porém, em termos estruturais, acredito que pouca gente conheça que é um pequeno projeto de um componente de interface, no qual definimos suas configurações de instalação,  aparência no GeneXus e funcionalidade no navegador do usuário. No mínimo teremos sempre quatro arquivos para registrar todas estas características.

Uma vez construído e instalado, teremos o recurso à nossa disposição no Toolbox do objeto GeneXus. Ou ainda, na propriedade Control Type de atributos e variáveis.

O objetivo fundamental será sempre o de oferecer algum recurso visual ou funcional diferenciado na interface do usuário, e que pode ser um novo controle para ingresso de dados, novos componentes de navegação como menus, navbar, dropdowns, ou mesmo recursos para controlar as ações dos usuários.

Para chegarmos a isto necessitaremos conhecer novos recursos como a linguagem Javascript, CSS, HTML, XML e XSLT. Mas também bibliotecas externas que eventualmente nos forneçam o recurso que desejamos implementar. Além dos próprios arquivos de configuração.

Não é necessário ser um programador profissional destes recursos para se alcançar resultados excelentes, veja meu caso, por exemplo, rs.

User Control: Construindo controles com o GeneXus


Como estratégia de aprendizagem deste tema peculiar, praticamente tive que ler e interpretar o funcionamento da grande maioria dos User Controls do Genexus Marketplace, entender suas semelhanças e diferenças, e em seguida buscar uma explicação plausível para seu comportamento.

A intensa programação Javascript por muitas vezes ocultavam importantes segredos, assim como as classes CSS que quando em funcionamento também não respondiam a contento, enfim, um cenário muito desafiador.

O Genexus Wiki, uma fonte importantíssima de informação, desta vez não contribuiu muito.

Ao final foi simples chegar a uma conclusão: o tema é muito importante para ficar escondido no mato.  E como resultado desta aventura, resolvi escrever um livro sobre este tema desafiador, principalmente porque o pouco material disponível praticamente pouco me ajudou.

A idéia por traz do livro foi simples: dividir os temas mais complexos em tópicos e apresentar muitos exemplos práticos para reforçar todo conteúdo apresentado. Com isso chegamos a onze capítulos que vão apresentar e desenvolver todos os recursos necessários para se construir seu próprio User Control. E ao término de cada um, uma atividade prática com o objetivo de desenvolver um controle útil com o recurso Bootstrap, ou seja, o mesmo framework utilizado pelo GeneXus para construir as interfaces responsivas.

Um detalhe, não abordo no livro User Controls para Android e iOs, nesta edição limitei a controles para Web.

Então, se você também sofrer da mesma doença: usercontrolitis curiositis, terá a sua disposição um material que eu acredito, irá te ajudar nesta aventura.

Disponível aqui:

https://www.amazon.com.br/User-Control-Desenvolvendo-controles-GeneXus-ebook/dp/B01LZT1NX7/ref=sr_1_5?ie=UTF8&qid=1474121129&sr=8-5&keywords=user+control

https://www.amazon.com/User-Control-Desenvolvendo-controles-Portuguese-ebook/dp/B01LZT1NX7/ref=sr_1_7?s=books&ie=UTF8&qid=1474120886&sr=1-7&keywords=user+control#nav-subnav