framework7io / framework7

Full featured HTML framework for building iOS & Android apps
http://framework7.io
MIT License
17.97k stars 3.24k forks source link

Route async tablet/movil #4263

Open tmwebs opened 2 months ago

tmwebs commented 2 months ago

I am trying to get dynamic content loading, I have a .f7 page in which I have a left menu and a right container, if I am on mobile, the left menu I want to open a new page (this if it works), but if I am on tablet I want the left menu to load the page in the right container, I am using async but I don't get it, I show my code:

Page with the containers:

<div class="page-content">
    <div class="grid grid-cols-1 medium-grid-cols-2 ">   

      <div class="list list-strong inset list-dividers-ios components-list searchbar-found menu-panel">
        <ul>
          <li>
            <a class="item-content item-link" href="/presupuestos/">
              <div class="item-media">
                <i class="icon icon-f7"></i>
              </div>
              <div class="item-inner">
                <div class="item-title">Presupuestos</div>
              </div>
            </a>
          </li>
          <li>
            <a class="item-content item-link" href="/eventos/">
              <div class="item-media">
                <i class="icon icon-f7"></i>
              </div>
              <div class="item-inner">
                <div class="item-title">Eventos</div>
              </div>
            </a>
          </li>
        </ul>
      </div>

      <div class="panel-right">
        <!-- El contenido de detalle se cargará aquí -->
        <p>Seleccione una opción para ver los detalles aquí.</p>
      </div>

    </div>
  </div>

my routes.js file


import HomePage from '../pages/home.f7';
...

import Presupuestos from '../pages/presupuestos.f7';
...

var version = "1.0.0";

var routes = [
  {
    path: '/',
    component: HomePage,
    options: {
      props: {
        version: version,
      },
    },
  },
  ...

  {
    path: '/presupuestos/',
    async({ app, to, resolve }) {
        if (screen.orientation.type.startsWith('landscape')) {
            console.log('----> tablet');

            const container = app.$el.find('.panel-right');
            if (container.length === 0) {
                console.error('Contenedor .panel-right no encontrado.');
                return;
            }

            resolve({
                el: container,
                component: Presupuestos,
            });
        } else {
          console.log('----> móvil');
          resolve({
              component: Presupuestos,
          });
        }
    }
  },

  {
    path: '(.*)',
    component: NotFoundPage,
  },
];

export default routes;

my page budgets.f7:


<template>
<div class="page" data-name="presupuestos">
  <div class="navbar">
    <div class="navbar-bg"></div>
    <div class="navbar-inner sliding">
      <div class="left">
        <a href="#" class="link back">
          <i class="icon icon-back"></i>
          <!-- <span class="if-not-md">Back</span> -->
        </a>
      </div>
      <div class="title">${titulo_pagina}</div>
    </div>
  </div>

  <div class="page-content">

    <p>hola</p>

  </div>
</div>
</template>
<script>
  import utils from '../js/utils.js';

  export default (props, {$, $f7, $on, $update }) => {

    let id_bod = props.id_bod;
    let titulo_pagina = "Presupuestos ";

    let i18n = $f7.i18n;

    const abrirT = (e) => {
      utils.abrirTeclado();
    }

    const cerrarT = (e) => {
      utils.cerrarTeclado();
    }

    $on('pageInit', () => {      

    });

    return $render;
  };
</script>
tmwebs commented 2 months ago

I did not realize that this is the master view for this, I have already adapted it and it works correctly, now I have a doubt, my first link is budgets, can I make it so that when loading the master view by default the first option is selected?

<template>
<div class="page" data-name="about">
  <div class="navbar">
    <div class="navbar-bg"></div>
    <div class="navbar-inner sliding">
      <div class="left">
        <a href="#" class="link back">
          <i class="icon icon-back"></i>
          <!-- <span class="if-not-md">Back</span> -->
        </a>
      </div>
      <div class="title">${titulo_pagina}</div>
    </div>
  </div>

  <div class="page-content">

    <div class="list links-list list-strong inset">
      <ul>
        <li><a href="/presupuestos/${id_bod}/" data-reload-detail="true">Presupuestos</a></li>
        <li><a href="/eventos/" data-reload-detail="true">Eventos</a></li>
      </ul>
    </div>

  </div>

</div>  
</template>

y mi route.js:

{
    path: '/bodas-mas/:id_bod/',
    component: BodasMas,
    master: true,  // Indica que esta es la ruta maestra para el diseño master-detail
    detailRoutes: [
      {
        path: '/presupuestos/:id_bod/',
        component: Presupuestos,
      },
    ]
  },