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:
parent
877dfa5c44
commit
f793eb4257
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user