How to?

Como desenhar uma view?

ModuleReference

O primeiro passo deverá ser adicionar uma referência para o módulo corrente e marcá-lo como Main.

A partir deste momento, desde que tenha já desenhado o seu modelo de serviços, encontra-se disponível uma opção no menu de contexto que lhe permite selecionar os serviços que pretende e a partir destes:

  • Gerar automaticamente as operações de Create e Update (dependendo das definições do serviço)
  • Gerar uma editor view e associar-lhe as operações criadas no ponto anterior
  • Gerar a ListOperation de manutenção da entidade e a respetiva ListView assegurando as referências necessárias às operações.

GenerateOperations

SelectServices

Notas:

  • Só aparecerão nesta lista serviços para os quais ainda possa ser gerado automaticamente algum artefacto.

  • No final deste processo o modelo não será formalmente válido pois as serviceViews não apresentam atributos. Cabe depois ao modelador desenhar os layouts das sevice views e indicar como\onde aparecem as referenced views. Depois disso ficará perfeitamente funcional.

Operation

As operations, correspondem aos tipos de operações que queremos disponibilizar ao utilizador. Para tal, após arrastar a operation, deverá selecionar a Service Operation que pretende usar, nas propriedades da editor view. A seleção disponibilizará de forma hierárquica, organizada por serviço, todas as ServiceOperations de Insert e Update de serviços sobre entidades que não sejam extensões e todas as operações de Picking.

São listadas as operações de serviço: - Create (standard) - Desde que o serviço tenha a flag “Include Create” a “true”. - Update (standard) - Desde que o serviço tenha a flag “Include Update” a “true”. - Picking - Sendo um serviço com tipo “Picking”

Exemplo de modelação de uma operação de CRUD.

CRUD

Exemplo da modelação de uma operação de Picking.

PickingOperation

UIRulesDefinition

Para permitir a inclusão de regras de UI associadas a uma operação\view de serviço, basta preencher esta propriedade com um ficheiro válido.

Operation Actions

Para adicionar ações custom, basta aceder ao menu de contexto sobre a Operation (ou sobre cada um dos compartimentos da mesma) e adicionar as ações que desejar.

Por omissão, uma nova OperationAction terá a sua propriedade GenerateCommand igual a “true”. Neste caso, é necessário selecionar uma ServiceAction.

Pode também associar uma ValidationAction (a ser executada antes da ServiceAction) a qualquer uma das OperationActions (mesmo as de sistema).

A ordem das ações pode ser definida usando as operações de “Move” sobre cada uma delas, e caso deseje, pode definir ações como “filhas” de outra, bastando para isso indicar a Parent Action na janela das propriedades.

operationActions

Adicionar Standard Actions

O modelador pode adicionar automaticamente ações para Guardar, Guardar e enviar por email e Guardar e Imprimir. Esta funcionalidade está disponível no menu de contexto sobre a Operation (Editor) em causa, em operações de Create.

Operations (Editor) -> Add Save Action, Add Save and New Action, Add SaveAndSend Action e Add SaveAndPrint Action

Notas: - A action “Save“ só se encontra disponível quando o serviço de suporte à operação tem o atributo GenerateUpdate a true. - Ao contrário do que acontece com qualquer outra Action adicionada manualmente, estas “standard” actions dispensam o modelador de criar no modelo de serviços uma ServiceAction específica para estes cenários.

Remover Standard Action “Save”

Caso o modelador não pretenda disponibilizar a operação de DisplayAndEdit, o modelo permite que a Action “Save” seja removida.

Para serviços do tipo “Custom”, também é possível remover a action “Save”. Nesses casos, passa também a ser disponibilizada a opção de contexto que permite voltar a adicionar a action de sistema então removida.

Sincronização da Operation

Caso sejam efetuadas alterações à ServiceOperation ou ao serviço, o modelo apresentará erros de validação e pedirá para sincronizar a(s) Operações(s) em causa.

Para tal, basta usar a opção do menu de contexto Operations (Editor)-> Synchronize Operation Information, sobre a Operation (Editor) em causa.

Poderá efetuar essa sincronização de uma só vez, para todas as Operation (Editor), através da opção Operations (Editor)-> Synchronize information for all operations.

Também poderá efetuar de uma só vez a sincronização para todas as operations (Editor e Extension) no menu de contexto, Services -> Synchronize all operations and extensions.

Extension

São disponibilizadas as seguintes operações:

  • Create (standard)
  • Update (standard)

Sincronização da Extension

Caso sejam efetuadas alterações ao serviço, o modelo apresentará erros de validação e pedirá para sincronizar a(s) Extension(s) em causa.

Para tal, basta usar a opção do menu de contexto Operations (Extension)-> Synchronize Caption que se encontrará disponível sobre a Operation (Extension) em causa.

Poderá efetuar essa sincronização de uma só vez, para todas Operation (Extension), através da opção Operations (Extension)-> Synchronize Caption for all extensions.

Também poderá efetuar de uma só vez a sincronização para todas as operations (Editor e Extension) no menu de contexto Services -> Synchronize all operations and extensions.

EditorView

Para que a operação esteja de facto disponível, é necessário que esta use uma EditorView (um layout de interface).

Para tal, após arrastar uma EditorView para o designer, desde que tenha um resourcemodel associado, é possível editar o layout.

Bloqueio dos campos construtores

É possível, para qualquer entidade, definir um conjunto de campos construtores que, aquando da criação da entidade, terão um comportamento distinto - são os únicos campos desbloqueados na view e só depois de serem preenchidos é que os restantes campos ficam desbloqueados. Posteriormente, quando há uma alteração de outro campo, os campos do construtor ficam bloqueados.

Para isso, é necessário associar ao serviço relativo à entidade uma service operation do tipo CreateInstance, que tenha como parâmetros os campos correspondentes aos construtores.

ServiceOperation CreateInstance

Alteração ao comportamento standard

Em determinados cenários o bloqueio dos campos construtores pode não ser desejável. Para que seja possível ter esses campos desbloqueados, o modelador pode optar por ativar a flag: 'UnlockConstructorArguments'.

UnlockConstructorArguments

Edição de layout

O desenho da view é bastante linear e basicamente permite definir uma estrutura com uma ou mais rows (linhas horizontais) permitindo estas uma ou mais colunas.

As colunas, por seu lado, permitem apenas adicionar campos a partir do ResourceModel.

Para aceder à edição de layout, deve ser selecionada a view pretendida, clicar com o botão direito do rato na mesma, e selecionar a opção Views (Editor) > Edit Layout.

EditLayout

O desenho do layout de uma EditorView acenta neste conceito. Por convenção, é assumido que o espaço de um container se encontra organizado em 12 colunas.

As dimensões indicadas nos controlos “filhos” serão sempre em relação a estas colunas do “pai”.

Cada controlo filho adicionado, poderá: - Indicar o tamanho que ocupa em colunas (até ao máximo de 12). - Definir um offset (número de colunas que deseja manter em branco) sendo que o offset, somado ao seu tamanho, não deverá somar mais do que as 12 colunas).

Esta regra é transversal à árvore de containers ou seja, cada container (mesmo que seja já ele um container “filho”) terá disponíveis 12 colunas para serem usadas pelos seu controlos “filhos” de forma idêntica.

EditLayout

Nota: Se os tamanhos dos controlos filhos somados ultrapassarem o limite de 12 colunas o layout será ajustado passando o que não couber para baixo destes (parecendo que se adicionou uma nova linha)

Adicionar RowContainer

Esta operação aparece no Menu de contexto sobre a root (nome da view).

Só é permitido adicionar rowcontainers (linhas) na root do layout.

Expanders

Um RowContainer permite indicar o seu tipo como: - Standard - Expander: um RowContainer do tipo Expander permite indicar o seu tipo de conteúdo: - Standard - ReferencedView (e neste caso indicar qual a referencedview a utilizar)

Adicionar ColumnContainer

Esta operação aparece no Menu de contexto sobre a o RowContainer selecionado. Só é permitido adicionar ColumnContainers (colunas) quando nos encontramos posicionados numa RowContainer (linhas).

Adicionar todos os campos

Esta operação aparece no menu de contexto e permite adicionar, de uma só vez, todos os campos existentes no ResourceModel que ainda não tenham sido incluídos na editorView. É permitido adicionar campos quando nos encontrarmos posicionados: - Numa ColumnContainer - Neste caso poderão ser adicionados todos os campos das resource incluindo detalhes. - Num campo do tipo Lista (campo de detalhes de uma entidade). - Neste caso só poderão ser adicionados os campos que pertençam à resource do detalhe.

Adicionar um novo campo

De igual forma, só é permitido adicionar campos quando nos encontrarmos numa ColumnContainer ou sobre um campo do tipo Lista (campo de detalhes de uma entidade).

Esta operação permite adicionar um novo campo (a partir dos existentes no ResourceModel) e aparece no Menu de contexto em ambos os cenários.

Mover campos e Containers

  • Ordenação

Se quisermos alterar a ordem de container ou campos dentro do seu container pai, podemos fazê-lo através no Menu de contexto ou com as teclas de atalho. - MoveUp (CTRL+Up) - MoveDown (CTRL+Down)

  • Posicionamento no Layout

Se quisermos mover campos entre ColumnContainers ou ColumnContainers entre RowsContainer podemos faze-lo através de Drag and Drop.

Adicionar ReferencedView

AddReferencedView

O que se pretende é ter a possibilidade de usar um link ou um expander para uma view que contem alguns dados parciais da entidade.

Esta operação aparece no Menu de contexto sobre o nó com o mesmo nome (ReferencedViews).

  • Ao selecionar esta opção é adicionado um novo nó.
  • É depois necessário selecionar (ou criar) um field link ou selecionar (ou criar) um RowContainer do tipo Expander e indicar a associação para a nova referencedView.
  • Caso exista relações Master-> Detail->Detail, o processo adequado será colocar num view própria esses atributos do segundo nível de detalhe. Também é comum associar a invocação desses detalhes em função da linha de detalhes selecionada.

Para esses casos o padrão proposto o seguinte: - Adicionar um novo atrobuto do tipo link à grelha de detalhes, indicando-o como link (actionType “ShowModal”) e colocando como Display “RowActions” para que apareça nas ações associadas à linha de detalhes.

Adicionar ItemTemplateView

O que se pretende é ter a possibilidade apresentar os dado de uma grelha sobre a forma de uma view.

Esta operação aparece no Menu de contexto sobre o nó com o mesmo nome (Item Template Views). - Ao selecionar esta opção é adicionado um novo nó. Deverá de seguida selecionar a ItemTemplateView que pretende indicar como referência. - Só conseguirá selecionar uma ItemTemplateView se já existir alguma no modelo cujo ResourceModel esteja associado ao mesmo serviço das operations relacionadas com a view atual. - É depois necessário selecionar um field do tipo list, indicar como ContentDisplay “Row” e no atributo FormTemplate indicar a associação para a nova ItemTemplateView. - Provavelmente quererá indicar o valor Items_1 no atributo ItemsPerPage e e esconder o seletor de Items por página, colocando o atributo HideItemsPerPageSelector a true.

Adicionar uma Custom Drill-Down

O que se pretende é que, por exemplo, um atributo do tipo Text ou Money permita um drill down para uma determinada view.

Para tal deverá proceder do seguinte modo: - Na edição de layout, selecionado o atributo da view pretendido, indicar como Action Type o valor “Custom”. Ao fazê-lo será apresentada a propriedade “Service Action”. - Selecionar a ServiceAction pretendida (definida anteriormente no modelo de serviços). Terá que ter em consideração que caso pretende executar uma ação sobre uma atributo de um detalhe, a service action respetiva no modelo de serviços, terá que ter indicada essa mesma entidade detalhe no seu atributo Setail Target”. - Terá posteriormente que implementar manualmente a ação pretendida.

ServiceViewFields – Propriedades

Sempre que quisermos colocar as labels por cima de um campo (em vez de posicionada à sua esquerda), basta colocar o label size a 12 (ocupando assim todo o espaço disponível e forçando o campo de input a ser apresentado numa “linha” abaixo).

Sempre que quisermos simular mais do que uma linha dentro de um ColumnContainer, podemos colocar os vários campos com a sua label size a 12 (ocupando assim todo o espaço disponível e forçando o campo de input a ser apresentado numa “linha” abaixo).

Validações

As validações necessárias ao modelo são efetuadas no momento do Accept. Em caso de inconsistências, aparece mensagem listando todas elas. Ao utilizador é dada a possibilidade de aceitar gravar ao corrigir o necessário. Naturalmente caso existam erros, não será possível transformar o modelo.

ItemTemplateView

Para que conteúdo de uma grelha seja apresentado sob forma de uma view, é necessário que esta use uma ItemTemplateView. Para tal, após arrastar uma ItemTemplateView para o designer, deverá selecionar o ResourceModel pretendido.

ItemTemplate - Edição de Layout

Desde que a ItemTemplateView tenha um resourcemodel associado é possível editar o layout da ItemTemplateView.

ItemTemplateEditLayout

O desenho de uma ItemTemplateView é em tudo semelhante ao descrito para uma editorView. Basicamente, permite definir uma estrutura com uma ou mais rows (linhas horizontais) permitindo estas uma ou mais colunas. As colunas por seu lado, permitem apenas adicionar campos a partir do ResourceModel.

Exemplo

ItemTemplateEditLayout

Widgets

Para desenhar dashboards terá que ter disponíveis as partes que os continuem – Widgets.

O mesmo é válido se pretender definir páginas de informação de contexto.

Colocando de parte a implementação propriamente dita de um widget, do ponto de vista do modelador, a disponibilização de um widget resume-se apenas a arrastar um (ou mais) Widget para o modelo, dando-lhe um nome.

ContextPages

Para adicionar informação de contexto a uma determinada operação de serviço, terá que ter disponíveis ContextPages (páginas de informação de contexto). Para disponibilizar ContextPages, basta arrastar uma ou mais ContextPages para o modelo dando-lhe uma nome e caption.

Associar ContextPages a Operations

Podemos estabelecer esta relação de 3 maneiras. - Através do LinkConnector, desenhando uma relação a partir da Operation para a ContextPage em causa. - Através da operação de menu de contexto sobre a ContextPage (Context Pages -> Select Editor Operations…). Nesta opção pode selecionar\remover de uma só vez uma ou mais destas relações. - Através da operação de menu de contexto sobre a Operation (EditorOperations -> Select ContextPages). Nesta opção pode selecionar\remover de uma só vez uma ou mais destas relações.

Associar Widgets a ContextPages

Podemos estabelecer esta relação de 3 maneiras. - Através do LinkConnector, desenhando uma relação a partir da ContextPage para o Widget em causa. - Através da operação de menu de contexto sobre o Widget (Widgets -> Select Context Pages…). Nesta opção pode selecionar\remover de uma só vez uma ou mais destas relações. - Através da operação de menu de contexto sobre a ContextPage (Context Pages -> Select Widgets…). Nesta opção pode selecionar\remover de uma só vez uma ou mais destas relações.

Definir propriedades da ContextPage na Operation

Para definir as propriedades de Activator, Display Index e ParameterBindings de um uma contextpage, deverá selecionar o link entre ambos. Ao fazê-lo esses atributos serão listados nas propriedades. - A forma mais expedita de definir a ordem das ContextPages associadas a uma Service Operation é usando o editor disponibilizado no menu de contexto usando as opções de Move.

OrdernarContextPages

ParameterBindings

  • Se um dos widgets associados à ContextPage tiver parâmetros, é obrigatório preencher este atributo.
  • Pode fazê-lo:
    • Escrevendo diretamente no campo conforme descrito acima no documento.
    • Usando o editor próprio. Este editor apresenta todos os widgets com parâmetros, e para cada um deles apresenta os seus parâmetros.

Select Widget

  • Comece por selecionar na ComboBox o widget para o qual pretende definir os bindings para os seus parâmetros. Este serão apresentados em grelha.

parameterbindings

Parameter Value Editor

  • Para selecionar o atributo da view basta invocar o editor próprio.

Definir propriedades do Widget na ContextPage Para definir as propriedades de Caption e Display Index de um widget, numa ContextPage, deverá selecionar o link entre ambos. Ao fazê-lo esses atributos serão listados nas propriedades. - A forma mais expedita de definir o display dos Widgets associados a uma ContextPage é usando o editor disponibilizado no menu de contexto usando as opções de Move.

DashboardOperation

As operações de dashboard correspondem a um dos tipos de operações que queremos disponibilizar ao utilizador.

DashboardView

Para que a operação de dashboard esteja de facto disponível, é necessário que esta use uma DashboardView (um layout de interface). Para tal, após arrastar uma DashboardView para o designer, deverá ligar a dashboard operation desejada à nova DashboardViewView.

DashboardView - Edição de Layout Usando o menu de contexto é possível passar então à definição do layout da DashboardView.

ItemTemplateEditLayout

O desenho de uma DashboardView é em tudo semelhante ao descrito para uma editorView. Basicamente, permite definir uma estrutura com uma ou mais rows (linhas horizontais) permitindo estas uma ou mais colunas. As colunas por seu lado permitem apenas adicionar campos do tipo Widget.

List Operation

Seleção da List Service Operation

A seleção disponibilizará de forma hierárquica, organizada por serviço, todas as ListServiceOperations. A seleção é filtrada consoante a ListOperationType. - No caso de EntityManagment, serão listadas apenas as ListServiceOperations do tipo ServiceEntityList - No caso de Custom, serão listadas apenas as ListServiceOperations do tipo Custom.

Seleção de operações de Create e View

No caso de ListOperation do tipo EntityManagment, após a seleção da List Service Operation, será automaticamente adicionada uma CreateAction e se possível selecionada as Operations de Create e de Visualização.

Geração da ListView

Depois de selecionar o ListOperation deverá usar a opção do menu de contexto (ListOperation-> Generate ListView) para criar de forma automática a ListView que define o layout (a associação entra a operação de lista e a ListView será também criada automaticamente).

Sincronização da ListView

Caso sejam efetuadas alterações no modelo de serviços à ListServiceOperation em uso, ou caso de selecione outra ListServiceOperation, o modelo apresentará erros de validação e pedirá para sincronizar a(s) ListView(s) em causa.

O mesmo acontecerá se, para listas do tipo EntityManagment, foram efetuadas alterações ao FriendlyName do serviço utilizado em alguma das create actions da lista.

Para isso, basta usar a opção do menu de contexto (Operation (List)-> Synchronize Create Actions and ListView) que se encontrará disponível sobre a ListOperation ou a ListView em causa.

Também poderá efetuar, de uma só vez, a sincronização para todas as list operations no menu de contexto (Operation (List)-> Synchronize All Create Actions and ListViews).

Associação a Operations

Caso se trate de uma ListOperation do tipo EntityManagment terá sempre que existir uma CreateAction associada a uma Operation de InsertEntity sobre a mesma entidade da ListOperation.

Da mesma forma, caso a propriedade ViewActionType seja do tipo “Default” também a propriedade ViewServiceOperation deverá referenciar uma Operation do tipo DisplayAndEditEntity sobre a mesma entidade da ListOperation (ou a sua entidade base caso se trate de uma extensão).

Também é possível associar uma custom operation que, por sua vez, estará associada a uma custom view. Ambos os artefactos não são gerados automaticamente e devem ser programados manualmente.

Usar múltiplas operações para gestão da entidade

Pode ocorrer o caso de termos uma lista que apresente uma entidade que permita diferentes views de criação\edição.

Este cenário poderá ocorrer quando é criada uma lista sobre uma entidade que tenha definidas várias resources sobre si mesma, e não é efetuado nenhum tipo de filtro sobre a mesma. Caso o deseje, poderá associar mais do que uma CreateAction à mesma ListOperation (sendo que primeira CreateAction será utilizada como a Default).

Neste caso, provavelmente quer também a ação de visualização varie de acordo com o item da lista. Neste caso deverá indicar a ViewActionType como “Custom” o que permitirá a implementação custom da ação de visualização.

Abaixo um exemplo deste cenário:

MultipleOperations

ReportOperation

As operações de report correspondem a um dos tipos de operações que queremos disponibilizar ao utilizador. Para tal, após arrastá-la para o modelo deverá selecionar a custom service que pretende usar.

Seleção da Custom Service Operation

A seleção disponibilizará de forma hierárquica, organizada por serviço, todas os serviços que tenham como tipo “Custom” e ele associado uma ListOperation do tipo Custom. Este tipo de operação obrigará à existência de uma ligação desta operação com uma EditorView (a View que será utilizada para introdução dos parâmetros) e com uma ReportView (a ReportView que define o layout do report a utilizar).

ReportView

Depois de arrastar o elemento para o diagrama, a primeira ação a executar é selecionar o modelo para o qual pretende definir um report específico.

Associar ReportViews a operações

Podemos estabelecer esta relação de 3 maneiras. - Através do LinkConnector, desenhando uma relação a partir da Operation para a ReportView em causa. - Através da operação de menu de contexto sobre a Operation (Operations (Editor) -> Select ReportViews). Nesta opção pode selecionar\remover de uma só vez uma ou mais destas relações. - Através da operação de menu de contexto sobre a ReportView (Views (Report) -> Select Editor Operations…). Nesta opção pode selecionar\remover de uma só vez uma ou mais destas relações.

ReportViewsOperations

Definir Propriedades da ReportView numa Operation

Para definir as propriedades de Display Index e DefaultReport de uma reportView numa operation, deverá selecionar o link entre ambos. Ao fazê-lo esses atributos serão listados nas propriedades. - A forma mais expedita de definir a ordem das ReportViews associadas a uma Service Operation é usando o editor disponibilizado no menu de contexto usando as opções de Move.

ReportView – Edição de Layout

Desde que a ReportView tenha uma entidade associada, é possível editar o layout da reportView. Para isso, basta selecionar a opção do menu de contexto existente para o efeito, disponibilizado quando selecionamos a ReportView pretendida.

ReportViewEditLayout

O desenho da view é bastante linear e basicamente permite definir uma estrutura com uma ou mais sections (específicas e dependentes do tipo de report) com uma ou mais rows (linhas horizontais) permitindo estas uma ou mais colunas.

As colunas, por seu lado, permitem apenas adicionar campos a partir da coleção de atributos da entidade do report e dos atributos das entidades com ela relacionadas até ao 3º nível.