.. role:: raw-html-m2r(raw) :format: html Configuração ============ Estrutura --------- Para manter a organização e a consistência entre projetos, seu app deve seguir algumas regras de estrutura. Pastas ^^^^^^ Clique nos links dos arquivos ou diretórios para ver como devem ser configurados. .. raw:: html
└── project/
├── e2e/
├── node_modules/
├── src/
│ ├── app/
│ │ ├── pages/
│ │ │ ├── abc/
│ │ │ │ ├── i18n/
│ │ │ │ │ ├── en.ts
│ │ │ │ │ └── pt.ts
│ │ │ │ ├── abc-list/
│ │ │ │ ├── abc-detail/
│ │ │ │ ├── abc-routing.module.ts
│ │ │ │ └── abc.module.ts
│ │ │ ├── def/
│ │ │ ├── ghi/
│ │ │ ├── pages-routing.module.ts
│ │ │ └── pages.module.ts
│ │ └── app.module.ts
│ ├── assets/
│ │ ├── apps.svg
│ │ └── nav.svg
│ ├── environments/
│ │ └── ...
│ ├── browserslist
│ ├── favicon.ico
│ ├── index.html
│ ├── karma.conf.js
│ ├── main.ts
│ ├── polyfills.ts
│ ├── styles.scss
│ ├── test.ts
│ ├── tsconfig.app.json
│ ├── tsconfig.spec.json
│ └── tslint.json
├── .gitignore
├── .npmrc
├── angular.json
├── package.json
├── README.rst
├── tsconfig.json
└── tslint.json
Módulos e componentes
^^^^^^^^^^^^^^^^^^^^^
``AppModule`` e ``index.html``
Primeiramente, devemos apagar os seguintes arquivos:
- ``app.component.html``
- ``app.component.scss``
- ``app.component.ts``
E editar os seguintes arquivos:
``app.module.ts``
.. code-block:: ts
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import { VsHttpModule, API_GATEWAY } from '@viasoft/http';
import { VsAppCoreModule } from '@viasoft/app-core';
import { VsNavigationViewComponent } from '@viasoft/navigation';
@NgModule({
declarations: [],
imports: [
VsHttpModule,
VsAppCoreModule.forRoot( Ver AppCore ),
RouterModule.forRoot([
{ path: '', loadChildren: './pages/pages.module#PagesModule' }
])
],
providers: [
{ provide: API_GATEWAY, useValue: 'http://192.168.99.100:9999' }
],
bootstrap: [VsNavigationViewComponent]
})
export class AppModule { }
``index.html``
.. code:: html
``pages-routing.module.ts`` .. raw:: htmlimport { NgModule } from '@angular/core'; import { VsCommonModule } from '@viasoft/common'; import { PagesRoutingModule } from './pages-routing.module'; @NgModule({ declarations: [], imports: [ VsCommonModule, PagesRoutingModule ] }) export class PagesModule { }
Esse arquivo deve conter rotas que redirecionam para os módulos de cada página ou domínio. Caso nenhuma rota seja encontrada, deve ser definida uma página padrão para a aplicação. Dentro do módulo (no caso, ``abc``), teríamos: ``abc.module.ts`` .. raw:: htmlimport { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; const routes: Routes = [ { path: 'abc', loadChildren: './abc/abc.module#AbcModule' }, { path: 'def', loadChildren: './def/def.module#DefModule' }, { path: 'ghi', loadChildren: './ghi/ghi.module#GhiModule' }, { path: '**', redirectTo: 'abc' }, ]; @NgModule({ imports: [RouterModule.forChild(routes)], exports: [RouterModule] }) export class PagesRoutingModule {}
``abc-routing.module.ts`` .. raw:: htmlimport { NgModule } from '@angular/core'; import { VsCommonModule } from '@viasoft/common'; import { AbcRoutingModule } from './abc-routing.module'; import { VsNavigationViewComponent } from '@viasoft/navigation'; // ... @NgModule({ declarations: [ /* Module declarations */ ], imports: [ VsCommonModule.forChild( Ver Traduções ), AbcRoutingModule ] }) export class AbcModule { }
Onde ``AbcListComponent`` é a página principal com uma listagem de itens e ``AbcDetailComponent`` é a página de detalhe de um item, com funcionalidade de criação e/ou edição. Para rotas adicionais, as seguintes regras se aplicam: - Sempre utilizar o inglês. - :raw-html-m2r:`/abc/detail` - :raw-html-m2r:`/abc/detalhes` - Sempre utilizar Kebab Case, ou seja, palavras em letra minúscula separadas por um hífen. - :raw-html-m2r:`/abc/simulation-graph` - :raw-html-m2r:`/abc/simulationGraph` - :raw-html-m2r:`/abc/simulation_graph` - Nunca utilizar barras no ``path``, ao invés disso criar um sub-módulo com seu próprio módulo de rotas. - A rota *wildcard* (``**``) deve sempre redirecionar para o componente principal da página ou domínio (no caso, o componente de listagem de itens). AppCore ------- Dentro do ``VsAppCoreModule.forRoot()``\ , devemos passar as seguintes configurações: .. raw:: htmlimport { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; import { AbcListComponent } from './abc-list/abc-list.component'; import { AbcDetailComponent } from './abc-detail/abc-detail.component'; const routes: Routes = [ { path: '', component: AbcListComponent }, { path: 'new', component: AbcDetailComponent }, { path: ':id', component: AbcDetailComponent }, { path: '**', redirectTo: '' }, ]; @NgModule({ imports: [RouterModule.forChild(routes)], exports: [RouterModule] }) export class AbcRoutingModule {}
PortalConfig ^^^^^^^^^^^^ :raw-html-m2r:`` A propriedade ``portalConfig`` aceita os seguintes parâmetros: .. code-block:: ts portalConfig: { appId: 'my-app-id', // ID único do app appName: 'my-app-name', // Nome do app domain: 'my-domain', // Domínio do app navbarTitle: 'My App' // Título mostrado no topo da navbar }, Navigation ^^^^^^^^^^ A propriedade ``navigation`` controla o menu lateral da aplicação. Recebe um array de `IItemMenuOptions <#>`_\ , ou seja, um ícone, título, e um caminho ou sub-itens. Por exemplo, três itens simples seriam configurados da seguinte maneira: .. code-block:: ts navigation: [ { icon: 'apple', label: 'Abc', path: '/abc' }, { icon: 'carrot', label: 'Def', path: '/def' }, { icon: 'lemon', label: 'Ghi', path: '/ghi' }, ] .. image:: ./assets/nav_3_tabs.gif :width: 400 :alt: Navbar Sub Tabs Alternativamente, um item com três sub-items seria configurado assim: .. code-block:: ts navigation: [ { icon: 'archive', label: 'Páginas', children: [ { icon: 'apple', label: 'Abc', path: '/abc' }, { icon: 'carrot', label: 'Def', path: '/def' }, { icon: 'lemon', label: 'Ghi', path: '/ghi' }, ] } ] .. image:: ./assets/nav_tab_3_subtabs.gif :width: 400 :alt: Navbar Sub Tabs i18n ---- Para manter a consistência entre telas, reutilizar chaves e habilitar a internacionalização das aplicações, utilizamos traduções. Em cada módulo onde utilizaremos essa funcionalidade, devemos criar um diretório chamado ``i18n``. Dentro dele criamos os arquivos ``en.ts`` e ``pt.ts``\ , contendo as traduções para o inglês e o português, respectivamente. Por exemplo, os arquivos de tradução para o módulo ``abc`` ficariam da seguinte maneira: ``pt.ts`` .. code-block:: ts export const pt = { Abc: { Hello: "Olá", User: "Usuário", CloseWindow: "Fechar janela" } } ``en.ts`` .. code-block:: ts export const en = { Abc: { Hello: "Hello", User: "User", CloseWindow: "Close window" } } Para importar essas chaves, configure seu módulo da seguinte maneira: ``abc.module.ts`` .. code-block:: ts import { pt } from './i18n/pt'; import { en } from './i18n/en'; // ... @NgModule({ // ... imports: [ VsCommonModule.forChild({ translates: { pt: pt, en: en } }), // ... ] }) export class AbcModule { } E para utilizá-las em seus componentes: .. code-block:: html {{ 'Abc.Hello' | translate }}imports: [ // ... VsAppCoreModule.forRoot({ portalConfig: { Ver PortalConfig } navigation: { Ver Navigation } }), ],