gigafibre-fsm/apps/ops/src/components/shared/DataTable.vue
louispaulb 512c4a5f1b feat(ops): dispatch auto complet + perf Boîte/rapports + fix session
Planificateur « Suggérer » : 4 stratégies (smart / meilleurs d'abord / équilibré /
juste ce qu'il faut), compétences+niveaux par tech (édition inline), niveau requis
par compétence + par job, carte des tournées (1 couleur/tech, domicile→arrêts,
sélecteur de jour), fenêtre de dispatch auj.+demain (dates sélectionnées), règle
week-end + placeholder « en attente du quart », clustering + lasso + filtre-date
sur la carte, accès rapide « À assigner » (badge).

Boîte : liste /conversations allégée (45 Mo → ~1 Mo, 17×) + messages chargés à
l'ouverture. Rapports : cache SWR sur revenue-explorer (22×). Session : keep-alive
+ timeout fetch global + authFetch durci → fin des rechargements manuels.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 08:49:35 -04:00

40 lines
1.7 KiB
Vue

<template>
<!-- q-table qui bascule en mode CARTES sous 1024px (sinon une table large déborde en horizontal sur mobile).
Transmet tous les attrs/slots du q-table. Un slot #item par défaut rend chaque ligne en carte clé/valeur ;
fournir son propre #item pour personnaliser. Usage : <DataTable :rows :columns row-key="name" />. -->
<q-table v-bind="$attrs" :grid="isMobile" flat bordered>
<template v-for="(_, name) in $slots" #[name]="slotProps">
<slot :name="name" v-bind="slotProps || {}" />
</template>
<template v-if="!$slots.item" #item="props">
<div class="col-12 dt-grid-item">
<q-card flat bordered class="dt-card" :class="{ 'dt-card-click': !!$attrs.onRowClick }"
@click="$attrs.onRowClick && $attrs.onRowClick($event, props.row)">
<div v-for="col in props.cols" :key="col.name" class="dt-row">
<span class="dt-k">{{ col.label }}</span>
<span class="dt-v">{{ col.value }}</span>
</div>
</q-card>
</div>
</template>
</q-table>
</template>
<script setup>
import { useIsMobile } from 'src/composables/useMediaQuery'
defineOptions({ inheritAttrs: false })
const isMobile = useIsMobile()
</script>
<style scoped>
.dt-grid-item { padding: 4px; }
.dt-card { padding: 8px 12px; border-radius: 10px; }
.dt-card-click { cursor: pointer; }
.dt-card-click:active { background: var(--ops-bg-light, #f8fafc); }
.dt-row { display: flex; justify-content: space-between; gap: 12px; padding: 4px 0; font-size: 0.85rem; border-bottom: 1px solid var(--ops-border); }
.dt-row:last-child { border-bottom: none; }
.dt-k { color: var(--ops-text-muted); }
.dt-v { font-weight: 600; text-align: right; word-break: break-word; }
</style>