Composables

useGlobalFilters

Filtri globali del foglio (periodo, idcliente, idreparto, testoLibero) con autosave debounced su PostgREST.

Signature

function useGlobalFilters(options: UseGlobalFiltersOptions): UseGlobalFiltersReturn

Gestisce i filtri globali del foglio (periodo, cliente, reparto, testo libero) con autosave debounced 1000ms verso foglidicalcolo.filtriglobali (JSONB).

I filtri globali sono usati da useSpreadsheetERP per filtrare in modo coordinato le sorgenti con usaFiltriGlobali: true.

Opzioni

interface UseGlobalFiltersOptions {
  initialFilters?: GlobalFilters
  idfolio: Ref<number | null>
}
OpzioneDescrizione
initialFiltersFiltri iniziali (es. dal foglio appena caricato)
idfolioID foglio corrente. Se null, l'autosave è disabilitato

Risultato

interface UseGlobalFiltersReturn {
  filtri: Ref<GlobalFilters>
  setFilter(key: string, value: unknown): void
  resetFilters(): void
  setFiltriFromFoglio(foglio: FoglioDettaglio): void
  salvaFiltri(): Promise<void>
}

GlobalFilters

interface GlobalFilters {
  periodo?: {
    da: string                   // ISO date "2026-01-01"
    a: string                    // ISO date "2026-01-31"
  }
  idcliente?: number | null
  idreparto?: number | null
  testoLibero?: string
  [key: string]: unknown         // estendibile per filtri custom
}

L'index signature [key: string]: unknown permette di aggiungere filtri custom specifici del business (es. idmagazzino, idsede).

Comportamento

setFilter(key, value)

Imposta un singolo filtro mantenendo gli altri. È superficiale: per filtri composti (es. periodo), passa l'oggetto intero.

gf.setFilter('idcliente', 42)
gf.setFilter('periodo', { da: '2026-01-01', a: '2026-12-31' })

resetFilters()

Resetta filtri.value a {}. Triggera l'autosave (cancella i filtri sul DB).

setFiltriFromFoglio(foglio)

Sovrascrive filtri.value con foglio.filtriglobali. Usato da SpreadsheetEditor dopo il load del foglio per popolare i filtri dal DB.

salvaFiltri()

Forza un salvataggio immediato (senza debounce):

await gf.salvaFiltri()
// → PATCH /foglidicalcolo?idfolio=eq.{id} con { filtriglobali: filtri.value }

Non chiamato direttamente: l'autosave debounced lo invoca automaticamente. Usalo solo se vuoi forzare il flush prima di una operazione critica.

Autosave debounced

const debouncedSalva = debounce(salvaFiltri, 1000)
watch(filtri, () => {
  if (idfolio.value !== null) debouncedSalva()
}, { deep: true })

L'autosave non parte se idfolio === null (foglio non ancora caricato/creato).

Esempio

<script setup lang="ts">
import { ref } from 'vue'
import { useGlobalFilters } from '@pzeta/vue-foglidicalcolo'

const idfolio = ref<number | null>(42)
const gf = useGlobalFilters({ idfolio })

// Imposta periodo
gf.setFilter('periodo', {
  da: '2026-01-01',
  a: '2026-12-31',
})

// Imposta cliente
gf.setFilter('idcliente', 15)

// Dopo 1 secondo: PATCH /foglidicalcolo?idfolio=eq.42 con i filtri aggiornati
</script>

<template>
  <input
    type="date"
    :value="gf.filtri.value.periodo?.da"
    @change="gf.setFilter('periodo', { ...gf.filtri.value.periodo, da: $event.target.value })"
  />

  <button @click="gf.resetFilters">Reset filtri</button>
</template>

Integrazione con useSpreadsheetERP

Quando useGlobalFilters.filtri cambia, useSpreadsheetERP (che ha filtriGlobali come Ref<GlobalFilters>) triggera automaticamente debouncedRefreshAll() per ricaricare le sorgenti che ereditano dai filtri globali.

const gf = useGlobalFilters({ idfolio })
const erp = useSpreadsheetERP({
  idfolio,
  filtriGlobali: gf.filtri,         // ← reattivo
  sorgentiConfig: ...,
})

gf.setFilter('idcliente', 42)
// → autosave debounced 1000ms (DB) + erp refreshAll debounced 500ms (UI)

Tipi correlati