feat(service): bouton « Do Stuff » sur le service → ouvre la vue appareil

Demande user : une façon SIMPLE d'accéder au Do Stuff. Ajout d'un bouton « Do Stuff —
appareil » sur le détail du service (SubscriptionDetail), comme le bouton Do Stuff de F.
Résout l'appareil du service (Service Equipment par lieu de service, sinon par client ;
préfère un appareil actif avec n° de série) et navigate('Service Equipment', name) →
la fiche ouvre EquipmentDetail = la vue « Do Stuff » (signal Rx/Tx, débit WAN en direct,
actions device_action). Marche pour fibre ET sans-fil (l'appareil résolu s'ouvre ; les
stats airMAX sans-fil s'y afficheront quand leur lecteur sera branché).

Build spa OK, md5 match. Rendu live = fiche sous SSO (prod).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
louispaulb 2026-07-20 13:14:10 -04:00
parent 877dfa5c44
commit f793eb4257

View File

@ -1,4 +1,11 @@
<template>
<!-- Accès DIRECT au « Do Stuff » de l'appareil du service (signal, débit WAN en direct, actions) comme le bouton
« Do Stuff » de F. Résout l'appareil du lieu de service (sinon du client) et ouvre sa vue équipement. -->
<div class="q-mb-sm">
<q-btn dense no-caps unelevated color="deep-purple-6" icon="settings_input_antenna"
:loading="dsLoading" label="Do Stuff — appareil" @click="openDoStuff" />
<span v-if="dsMsg" class="text-caption text-grey-6 q-ml-sm">{{ dsMsg }}</span>
</div>
<div class="modal-field-grid">
<div class="mf"><span class="mf-label">Statut</span><span class="ops-badge" :class="subStatusClass(doc.status)">{{ doc.status }}</span></div>
<div class="mf"><span class="mf-label">SKU</span><code>{{ doc.item_code }}</code></div>
@ -41,12 +48,32 @@
</template>
<script setup>
import { ref } from 'vue'
import { useQuasar } from 'quasar'
import { listDocs } from 'src/api/erp'
import { formatDate, formatMoney } from 'src/composables/useFormatters'
import { subStatusClass } from 'src/composables/useStatusClasses'
defineProps({
const props = defineProps({
doc: { type: Object, required: true },
docName: String,
})
defineEmits(['save-field', 'toggle-recurring'])
const emit = defineEmits(['save-field', 'toggle-recurring', 'navigate'])
const $q = useQuasar()
const dsLoading = ref(false); const dsMsg = ref('')
// « Do Stuff » : résout l'appareil du service (par lieu de service, sinon par client) et ouvre sa vue équipement
// (EquipmentDetail = signal Rx/Tx, débit WAN en direct, actions). navigate openModal du parent (fiche).
async function openDoStuff () {
dsLoading.value = true; dsMsg.value = ''
try {
let eqs = []
if (props.doc.service_location) eqs = await listDocs('Service Equipment', { filters: { service_location: props.doc.service_location }, fields: ['name', 'equipment_type', 'status', 'serial_number'], limit: 10 })
if (!eqs.length && props.doc.customer) eqs = await listDocs('Service Equipment', { filters: { customer: props.doc.customer }, fields: ['name', 'equipment_type', 'status', 'serial_number'], limit: 10 })
if (!eqs.length) { dsMsg.value = 'Aucun appareil lié à ce service'; return }
const active = eqs.filter(e => String(e.status || '').toLowerCase() !== 'retiré')
const pick = active.find(e => e.serial_number) || active[0] || eqs.find(e => e.serial_number) || eqs[0]
emit('navigate', 'Service Equipment', pick.name)
} catch (e) { dsMsg.value = ''; $q.notify({ type: 'negative', message: 'Do Stuff : ' + (e.message || e) }) } finally { dsLoading.value = false }
}
</script>