Componenti

FogliListView

Componente lista fogli con ricerca full-text, filtri (mine/shared/templates), paginazione, viste grid/list, dialog di creazione e condivisione.

Quick start

<template>
  <FogliListView
    :page-size="20"
    filter="all"
    view-mode="grid"
    @open="apriFoglio"
    @create="apriFoglio"
  />
</template>

<script setup lang="ts">
function apriFoglio(payload: { idfolio: number }) {
  router.push(`/fogli/${payload.idfolio}`)
}
</script>

Props

PropTipoDefaultDescrizione
showTemplatesbooleantrueMostra/nasconde il filtro "Templates"
pageSizenumber20Numero di righe per pagina
filter'all' | 'mine' | 'shared' | 'templates''all'Filtro iniziale applicato
viewMode'grid' | 'list''grid'Modalità visualizzazione iniziale (toggleabile dall'utente)

Eventi

EventoPayloadQuando
open{ idfolio: number }Click su foglio (apertura editor)
create{ idfolio: number }Creazione/duplicazione completata (ID del nuovo foglio)
errorSpreadsheetErrorEventErrore in rinomina/duplica/elimina

Filtri disponibili

filterComportamento
'all'Tutti i fogli accessibili (proprietari + condivisi + pubblici)
'mine'Solo fogli con permesso_effettivo === 'proprietario'
'shared'Solo fogli condivisi (permesso_effettivo !== 'proprietario')
'templates'Solo fogli con istemplate === true

L'utente può cambiare il filtro a runtime via FogliFilters interno.

Ricerca full-text

Il textbox di ricerca dentro FogliFilters triggera una query PostgREST verso la vista dedicata v_foglidicalcolo_ricerca:

GET /v_foglidicalcolo_ricerca?tsv_search=plfts(italian).{q}

plfts = phrase_to_tsquery. La ricerca è debounced 300ms e resetta page a 0.

Operazioni supportate

Dalla riga lista (menu contestuale di FogliListItem):

AzioneImplementazione
Apriemit('open', { idfolio })
RinominauseFogliList.rinomina(id, nuovoNome)
DuplicauseFogliList.duplica(id) → emit create
EliminaConferma + useFogliList.elimina(id) (irreversibile)
CondividiApre FogliShareDialog per gestire ACL

L'eliminazione richiede conferma esplicita via confirm.require di @pzeta/vue-components.

Creazione nuovo foglio

Pulsante "Nuovo foglio" → FogliCreateDialog:

interface CreateFoglioRequest {
  nome: string
  descrizione?: string
  istemplate?: boolean
  ispubblico?: boolean
  filtriglobali?: GlobalFilters
  sorgentierp?: DataSourceConfig[]
}

A creazione riuscita → emit create con idfolio del nuovo foglio.

Visualizzazione

Due modalità switchabili dall'utente (toolbar interna):

ModeLayout
'grid'Cards in griglia responsive
'list'Righe compatte tabellari

Entrambe usano FogliListItem con diverso template.

Stato vuoto

Se la query non ritorna risultati, viene mostrato un empty state con call-to-action "Crea il primo foglio" o "Modifica i filtri".

Pattern: lista in dialog

Per integrare la lista come selettore di foglio in un workflow:

<script setup lang="ts">
import { Dialog } from '@pzeta/vue-components'

const open = ref(false)
const selezionato = ref<number | null>(null)

function onScelta(payload: { idfolio: number }) {
  selezionato.value = payload.idfolio
  open.value = false
}
</script>

<template>
  <Dialog v-model:visible="open" header="Seleziona foglio" style="width: 80vw">
    <FogliListView filter="mine" view-mode="list" @open="onScelta" />
  </Dialog>
</template>

Pattern: solo template

<FogliListView filter="templates" :show-templates="false" @open="apriTemplate" />

Composable correlato

FogliListView usa internamente useFogliList. Se hai bisogno di una UI custom (es. layout completamente diverso), usa direttamente il composable.

Tipi correlati