UNPKG

@ijusplab/svg-mapa

Version:

Componente Vue para renderização de mapa interativo da Seção Judiciária e de suas Subseções

270 lines (232 loc) 11.2 kB
<div style="display: flex; align-items: center; justify-content: space-around;"> <img src="src/assets/ijusplab.jpg" height="90px" alt="" /> <img src="src/assets/incubadora.png" height="50px" alt="" /> </div> <h1 style="font-family: Roboto, sans-serif; text-align: center; color: #0D47A1; text-decoration: underline; padding: 20px 0;"> Componente svg-mapa </h1> Componente criado em [Vue](https://vuejs.org/) para a renderização de mapa interativo em svg da Seção Judiciária. O mapa é descrito inteiramente em um objeto Javascript, com ou sem metadados de agrupamento das unidades territoriais (definidos em outro objeto Javascript), permitindo customização de tamanho, cores e isolamento de partes do mapa para visualização destacada. O componente permite também captar eventos de clique em cada uma das unidades territoriais, retornando o código da unidade e, se houver, do grupo ao qual ela pertence. O *screenshot* abaixo ilustra o mapa da Seção Judiciária de São Paulo, com suas Subseções, renderizado pelo componente: <div style="display: flex; align-items: center; justify-content: space-around;"> <img src="https://github.com/ijusplab/assets/blob/master/screenshot.png?raw=true" alt="screenshot" /> </div> #### 1. Incluindo o componente em seu projeto Para incorporar o componente ao seu projeto, digite: ```node yarn add @ijusplab/svg-mapa // ou npm install @ijusplab/svg-mapa --save ``` Alternativamente, no `Laravel`, você pode instalar o componente como dependência de desenvolvimento: ```node yarn add -D @ijusplab/svg-mapa // ou npm install @ijusplab/svg-mapa --save-dev ``` Em seguida, você porde importar o componente para uso em seu projeto do seguinte modo: ```javascript import SvgMapa from '@ijusplab/svg-mapa'; import '@ijusplab/svg-mapa/dist/svg-mapa.css'; ... export default { name: 'app', components: { SvgMapa }, ... } ``` #### 2. Configurando o mapa Os parâmetros do mapa devem ser fornecidos pelo desenvolvedor, conforme descrito a seguir. 1.1. A aplicação deve fornecer ao componente um objeto `Javascript`, com a estrutura dada pelo `json` a seguir. ```json { "title": { "name": "Seção Judiciária de São Paulo", "style": { "fill": "#212121", "font-family": "Segoe UI", "font-size": 24, "font-weight": "normal" }, "containerStyle": { "stroke": "#212121", "stroke-width": "2px", "fill": "#E0E0E0", "rx": "5px", "ry": "5px", "padding": "5px" }, "off-set": { "x": 220, "y": 310 } }, "svg": { "width": "1086.4963", "height": "707.90271", "viewBox": "0 0 1086.4963 707.90271", "style": { "stroke": "#ffffff", "stroke-width": "0.1px", "stroke-linecap": "butt", "stroke-linejoin": "miter" } }, "paths": [ // array de paths (cada path deve corresponder a uma unidade territorial) { "name": "..." // nome da unidade, "label": { "style": { "fill": "#000000", "font-family": "Segoe UI", "font-size": "16px", "font-weight": "bold", "stroke": "#ffffff", "stroke-width": "0px", "stroke-linecap": "round" }, "containerStyle": { "stroke": "#212121", "stroke-width": "0px", "fill": "none", "rx": "5px", "padding": "5px" }, "off-set": { // off-set em relação ao centroid calculado automaticamente "x": 0, "y": 0 } }, "id": 5, // código numérico "d": "...", // elemento <d></d> do path "style": { // parâmetro opcional; na ausência, aplica-se o estilo do grupo ou um estilo default "stroke": "#ffffff", "stroke-width": "0.1px", "stroke-linecap": "round" } }, ... ] } ``` 1.2. Opcionalmente, os `paths` podem ser agrupados fornecendo ao componente um objeto com a seguinte estrutura: ```json { "name": "...", // nome do agrupamento "groups": [ // array com os grupos pertencentes ao agrupamento { "name": "Presidente\nPrudente", // utilize \n para dividir o texto "label": { "style": { "fill": "#000000", "font-family": "Segoe UI", "font-size": "10", "font-weight": "bold", "stroke": "#ffffff", "stroke-width": "0px", "stroke-linecap": "round" }, "containerStyle": { "stroke": "#212121", "stroke-width": "0px", "fill": "none", "rx": "5px", "padding": "5px" }, "off-set": { // off-set em relação à posição do centroid calculado automaticamente "x": 2, "y": -10 } }, "id": 30, "paths": [ 30 ], "style": { // parâmetro opcional; na ausência, aplica-se o estilo default "fill": "#FFEBEE", "stroke": "#ffffff", "stroke-width": "3px", "stroke-linecap": "round" } }, ... ] } ``` 1.3. Também opcionalmente, os `paths` podem ser coloridos segundo o padrão fornecido por um objeto `chart` com a estrutura abaixo. Sendo habilitada a opção de exibir legenda, o componente criará a legenda automaticamente. ```json { "name": "Teste", "legend": { "width": 300, "height": 100, "x": 30, "y": 480 }, "groups": [ { "name": "Item 1", "label": { "style": { "fill": "#000000", "font-family": "Segoe UI", "font-size": "20", "font-weight": "bold", "stroke": "#ffffff", "stroke-width": "0px", "stroke-linecap": "round" }, "containerStyle": { "stroke": "#212121", "stroke-width": "1px", "fill": "#E0E0E0", "rx": "5px", "padding": "5px" }, "off-set": { "x": null, "y": null } }, "paths": [ 40, 17, 25, 33, 35, 26, 27, 8 ], "style": { "fill": "#90CAF9" } }, ... ] } ``` 1.4. Observação: os parâmetros `style` e `containerStyle` nos três objetos acima podem receber qualquer propriedade `CSS` aplicável aos elementos do `svg`. O `containerStyle` permite, ainda, a utilização das propriedades `padding`, `padding-top`, `padding-bottom`, `padding-left` e/ou `padding-right`, que são convertidas em espaçamento entre o texto do _label_ (elementos `text` e `tspan`) e o seu container (elementos `rect` e `svg`). #### 2. Lista das propriedades | Propriedade | Valor | Finalidade | | ----------- | ----- | ---------- | | `map` | `Object` | Objeto descrito no item 1.1 | | `width` | `String` | Valor da propriedade `width` do objeto de estilo (`css`) do `div` em que está contido o elemento `svg`. O valor default é `100%` | | `height` | `String` | Valor da propriedade `height` do objeto de estilo (`css`) do `div` em que está contido o elemento `svg`. O valor default é `auto` | | `show-title` | `Boolean` | Indica se o título do mapa deve ser exibido. Default: `false` | | `show-labels` | `Boolean` | Indica se os rótulos devem ser mostrados. Default: `false`. Se `true`, não exibe `tooltips` para os mesmos elementos, ainda que a opção `showTooltips` seja também `true` | | `show-tooltips` | `Boolean` | Indica se os `tooltips` (elemento `title`) serão exibidos no evento `hover`. Caso `show-labels` também for `true`, os `tooltips` não será exibidos para o mesmo elemento em que houver um `label` sendo exibido. | | `visible-paths` | `Array` | Um `array` de números correspondentes aos códigos dos `paths` que deverão ficar visíveis. Todos os demais deixarão de ser renderizados. Se fornecida uma lista vazia, todos os `paths` são renderizados. | | `detach-path` | `Number` | Código do `path` a ser destacado e renderizado isoladamente. Para desabilitar a opção, basta atribuir valor `-1` à propriedade. | | `grouping` | `Object` | Objeto descrito no item 1.2 | | `visible-groups` | `Array` | Um `array` de números correspondentes aos códigos dos grupos definidos no `grouping` que deverão ficar visíveis. Todos os demais grupos deixarão de ser renderizados. Se fornecida uma lista vazia, todos os grupos serão renderizados. | | `detach-group` | `Number` | Código do grupo em `grouping` a ser destacado e renderizado isoladamente. Esse grupo passa a ocupar todo o espaço do `viewBox`. Para desabilitar a opção, basta atribuir valor `-1` à propriedade. A opção será ignorada se houver um path selecionado em `detach-path`. | | `chart` | `Object` | Objecto descrito no item 1.3 | | `show-legend` | `Boolean` | Indica se a legenda do `chart` deve ser exibida. | | `enable-group-hover` | `Boolean` | Quando `true`, os elementos `path` do grupo sofrem decréscimo da opacidade no evento `hover` em qualquer um dos `paths` do mesmo grupo. O valor default é `false`. Pode ser utilizado em conjunto com `enable-path-hover`, caso em que os dois efeitos são percebidos simultaneamente.| | `enable-path-hover` | `Boolean` | Quanto `true`, o elemento `path` sofre sofre decréscimo da opacidade no evento `hover`. O valor default é `true`. Pode ser utilizado em conjunto com `enable-group-hover`, caso em que os dois efeitos são percebidos simultaneamente. | #### 3. Dados sobre as versões > Atenção: A versão `2.0.0` traz algumas alterações na API do componente que o tornam incompatível com as versões anteriores. #### 4. Dependências O componente foi desenhado para funcionar com [Vue](https://vuejs.org/). --- <div style="display: flex; align-items: center; justify-content: space-around;"> &copy; 2019 - Incubadora de Soluções Tecnológicas - iJuspLab </div> <div style="display: flex; align-items: center; justify-content: space-around;"> Licença MIT </div>