Skip to content

tutorial Panel con más de un control

IngenieroGeomatico edited this page Aug 3, 2023 · 3 revisions

En el caso que se quiera un panel con varios controles, se puede seguir el siguiente flujo de trabajo:

1./ Se añade el CSS necesario para aplicar el estilo al panel, controles y botones

    html,
    body {
      margin: 0;
      padding: 0;
      height: 100%;
      overflow: hidden;
    }

    .g-herramienta .m-tools:before {
      content: "\1F3F3";
      font-size: 22px;
      font-family: none
    }


    /* Abrir y cerrar panel */
    .m-panel.m-plugin-herramienta.collapsed {
      height: 40px;
    }


    .opened .g-cartografia-flecha-izquierda {
      position: absolute !important;
      right: -40px !important;

      color: #71a7d3 !important;
      background-color: #fff !important;
    }


    /* Contenedor del plugin */
    .m-control.m-container.m-herramienta {
      width: 250px;
      display: flex !important;
      flex-direction: column;
    }


    /* Título */
    .m-herramienta-header {
      background-color: #71a7d3;
      color: white;
      display: block;
      font-size: 15px;
      height: 40px;
      line-height: 40px;
      padding: 0 5px;
      text-align: center;
      width: 100%;
    }

    /* Contenedor botones controles */
    .m-herramienta-previews {
      display: flex;
      justify-content: center;
      align-items: center;
      gap: 10px;
      background-color: white;
      width: 100%;
      padding: 15px 0;

      border-bottom: 1px solid #adadad;
    }

    /* Botones controles */
    .m-panel-controls button {
      font-family: 'Times New Roman', Times, serif !important;
      font-size: 1.4rem;
      -webkit-font-smoothing: antialiased;
      border: 0;
      background: none;
      cursor: pointer;


    }

    .m-panel-controls button::before {
      font-size: 22px;
      font-family: none;
    }


    #controlToast::before{
      content: "▱";
      font-weight: bold;
      color:rgb(118, 118, 118)
    }
    #controlToast.activated::before{
      content: "▱";
      color:rgb(122, 239, 255)
    }
    .m-controlToast{
      color:rgb(118, 118, 118)
    }

2./ Se construye el panel y se añade al mapa

    const panelExtra = new M.ui.Panel('toolsExtra', {
      "collapsible": true,
      "className": 'g-herramienta',
      "collapsedButtonClass": 'm-tools',
      "position": M.ui.position.TL
    });

    const htmlPanel =
      `
    <div aria-label="Plugin View Management" role="menuitem" id="div-contenedor-herramienta" class="m-control m-container m-herramienta">
        <header 
            role="heading" 
            tabindex="0" 
            id="m-herramienta-title"
            class="m-herramienta-header">
              Título
        </header>
        <section id="m-herramienta-previews" class="m-herramienta-previews">

        </section>
        <div id="m-herramienta-contents"></div>
    </div>
    `

    mapajs.addPanels([panelExtra]);
    document.querySelector('.g-herramienta .m-panel-controls').innerHTML = htmlPanel;
    // Para hacer movible el panel desde el título
    M.utils.draggabillyPlugin(panelExtra, '#m-herramienta-title');

3./ Se crean los controles y sus funcionalidades

    const controlToast = new M.Control(new M.impl.Control(), 'controlToast');
    controlToast.createView = (map) => {
      const contenedor = document.createElement('div');
      return contenedor;
    }
    controlToast.htmlView = `
                      <button id="toastInfor" class="m-controlToast"> 🛈 </button>
                      <button id="toastError" class="m-controlToast"> ✘ </button>
                      <button id="toastwarning" class="m-controlToast"> ⚠ </button>
                      <button id="toastExito" class="m-controlToast"> ✔ </button>
                      `
    controlToast.activate = () => {
      console.log('Activado control: controlToast ');
      document.querySelector('#controlToast').classList.add("activated");
      document.querySelector('#m-herramienta-contents').innerHTML = controlToast.htmlView

      document.querySelector('#toastInfor').onclick = function(){
        M.toast.info('Notificación informativa'); 
      };
      document.querySelector('#toastError').onclick = function(){
        M.toast.error('Notificación de error', null, 5000);
      };
      document.querySelector('#toastwarning').onclick = function(){
        M.toast.warning('Notificación de aviso', 2, 3000);
      };
      document.querySelector('#toastExito').onclick = function(){
        M.toast.success('Notificación de éxito', 1, 1000);
      };
    }

4./ Por último, se añaden los controles al panel y se le da la lógica de comportamiento

    panelExtra.addControls(controlToast);

    panelExtra.getControls().forEach((btn) => {
      document.querySelector('#m-herramienta-previews').innerHTML += `<button id='${btn.name}' class="button-herramienta"></button>`
    })

    document.querySelectorAll('.button-herramienta').forEach((btn) => {
      console.log(btn)
      btn.addEventListener('click', (e) =>{

        if (document.querySelector('#m-herramienta-previews').querySelector('.activated') !== null){
          document.querySelector('#m-herramienta-previews').querySelector('.activated').classList.remove("activated")
        }
        
        // panelExtra.getControls(e.target.id)[0].activate()
        mapajs.getControls({name:e.target.id})[0].activate()
      })
    })

1.INICIO
   1.1. Componentes de la API-CNIG
   1.2. Documentación y Puntos de acceso
   1.3. Primeros pasos
   1.4. Diagrama API CNIG

2. MAPA
2.1. Capas

 ■ 2.1.1. Fuentes
   • 2.1.1.1. Capas vectoriales
     + Vector
     + WFS
     + GeoJSON
     + KML
     + MVT
     + OGCAPIFeatures
     + MBTilesVector
     + GenericVector
     + MapLibre
   • 2.1.1.2. Capas ráster
     + WMS
     + WMTS
     + TMS
     + XYZ
     + OSM
     + MBTiles
     + GenericRaster
     + GeoTIFF
   • 2.1.1.3. Capas rápidas
   • 2.1.1.4. Grupo de capas

 ■ 2.1.2. Simbolización
   • 2.1.2.1. Genérica
     + Puntos
     + Líneas
     + Polígonos
   • 2.1.2.2. Básica
     + Puntos
     + Líneas
     + Polígonos
   • 2.1.2.3. Avanzada
     + Coropletas
     + Proporcional
     + Categorías
     + Estadísticos
     + Mapas de Calor
     + Cluster
     + Línea de flujo
     + Composición

 ■ 2.1.3. Filtros

2.3.-Plugins

  > Creación de plugin en cliente

  » Tutorial de creación de un plugin

2.4. Paneles

  » Creación de panel desde cero sin controles

  » Tutorial Panel de un único control

  » Tutorial Panel de un único control con más de un botón

  » Tutorial Panel con más de un control

2.5. Eventos

  » Gestión de eventos
  » Gestión de eventos en controles personalizados

    2.6. Internacionalización

    2.7. Configuración

    2.8. Acceso librerías base

3. UTILIDADES

4. PROXY

5. API REST
 5.1. Parametrización API-REST
 5.2. Base de Datos API-REST
 5.3. API REST Actions
 5.4. Servicio de correos electrónicos
 5.5. Capas rápidas

6. PARAMETRIZACIÓN VISUALIZADORES

7. SOLUCIÓN DE PROBLEMAS

8. PROCESO DE VERSIONADO

9. GUÍA DE DESARROLLO
  > Guía para el desarrollo de API-CNIG
  » Tutorial desarrollo del núcleo de API-CNIG - (Cliente)
  > Guía de desarrollo de componentes
  » Tutorial desarrollo del núcleo de API-CNIG - (Servidor)
  > Guía de desarrollo de plugins
  » Tutorial desarrollo de plugins ya creados
  » Tutorial desarrollo de nuevos plugins
  > Guía de desarrollo de visualizadores con React

  > Compilación proyecto API-CNIG

Clone this wiki locally