gigafibre-fsm/apps/ops/src/config/ticket-config.js
louispaulb 6628eaaa5b feat(ops+hub): sender picker, per-user notifs, editable rating emails, planif & tickets UX
- Comms: sélecteur d'expéditeur « De: » (défaut groupe Support TARGO) via resolveSendFrom + alias vérifiés
- Notifs: prefs de feeds PAR utilisateur (/conversations/notif-prefs) + cloche à bascules ; boot tooltip-ux (clic prioritaire + anti-empilement)
- Courriel: invitation à évaluer = modèle Unlayer éditable (transactional-rating-invite-*) ; test-send via Gmail + expansion {{rating}} ; logo TARGO auto-hébergé sur le magasin d'actifs du hub
- Planif: bloc « sans déplacement » (damier, début de quart, alerte si pas de quart), quart éditable dans l'éditeur de jour, icônes de compétence en vue jour (TV pour télé), clic cellule → éditeur, clic gauche lane → liste / clic droit → menu quart, lien ↗ ticket par job
- Tickets: défaut « Non fermés » + correction du filtre « Mes tickets » (owner)
- Inbox: poll Gmail 1 min + rafraîchir à la demande (poll-now)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 22:41:51 -04:00

56 lines
2.1 KiB
JavaScript

export const statusOptions = [
{ label: 'Tous', value: 'all' },
{ label: 'Non fermes', value: 'not_closed' },
{ label: 'Ouverts', value: 'Open' },
{ label: 'Repondus', value: 'Replied' },
{ label: 'Resolus', value: 'Resolved' },
{ label: 'Fermes', value: 'Closed' },
]
export const priorityOptions = [
{ label: 'Urgent', value: 'Urgent' },
{ label: 'Haute', value: 'High' },
{ label: 'Moyenne', value: 'Medium' },
{ label: 'Basse', value: 'Low' },
]
export const columns = [
{ name: 'important', label: '', field: 'is_important', align: 'center', style: 'width:30px;padding:0' },
{ name: 'legacy_id', label: '#', field: 'legacy_ticket_id', align: 'left', sortable: true, style: 'width:70px' },
{ name: 'subject', label: 'Sujet', field: 'subject', align: 'left' },
{ name: 'customer_name', label: 'Client', field: 'customer_name', align: 'left', sortable: true },
{ name: 'issue_type', label: 'Type', field: 'issue_type', align: 'left' },
{ name: 'opening_date', label: 'Date', field: 'opening_date', align: 'left', sortable: true },
{ name: 'priority', label: 'Priorite', field: 'priority', align: 'center', sortable: true },
{ name: 'status', label: 'Statut', field: 'status', align: 'center' },
]
export function buildFilters ({ statusFilter, typeFilter, priorityFilter, search, ownerFilter, me }) {
const filters = {}
if (statusFilter === 'not_closed') {
filters.status = ['!=', 'Closed']
} else if (statusFilter !== 'all') {
filters.status = statusFilter
}
if (typeFilter) filters.issue_type = typeFilter
if (priorityFilter) filters.priority = priorityFilter
if (search?.trim()) {
const q = search.trim()
if (/^\d+$/.test(q)) {
filters.legacy_ticket_id = parseInt(q)
} else {
filters.subject = ['like', '%' + q + '%']
}
}
if (ownerFilter === 'mine' && me) {
filters.owner = me // « Mes tickets » = créés/possédés par l'agent connecté (champ owner, toujours requêtable)
}
return filters
}
export function getSortField (col) {
if (col === 'opening_date') return 'creation'
if (col === 'legacy_id') return 'legacy_ticket_id'
return col || 'creation'
}