a386986c17
Implementazione completa del flusso operativo per il ruolo MeasurementTec:
Blueprint measure.py:
- select_recipe: selezione ricetta con ricerca e barcode
- task_list: lista task con conteggi subtask e allegati
- task_execute: esecuzione misure con numpad, calibro USB, feedback real-time
- task_complete: riepilogo con statistiche pass/fail e export CSV
- API AJAX: lookup-barcode, save-traceability, save-measurement
- Autorizzazione role_required("MeasurementTec") su tutte le route
Componenti riutilizzabili:
- numpad.html/js/css: tastierino numerico touch-friendly con keyboard support
- caliper_status.html + caliper.js: integrazione calibro USB via Web Serial API
- barcode_scanner.html + barcode.js: scansione barcode con html5-qrcode
- measurement_feedback.html: feedback visivo pass/warning/fail in tempo reale
- next_measurement.html: indicatore prossima misurazione
- annotation-viewer.js: visualizzatore canvas con marker su disegni tecnici
- csv-export.js: export CSV con locale italiano (delimitatore ;, decimale ,)
Sicurezza:
- Decoratore role_required(*roles) per autorizzazione basata su ruoli
- CSRF token su tutti i POST AJAX
- |tojson per prevenire XSS su annotations_json
- Validazione input lato client e server
i18n: 23+ nuove chiavi tradotte IT/EN per tutti i template FASE 3
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
56 lines
1.3 KiB
CSS
56 lines
1.3 KiB
CSS
/**
|
|
* Numpad Component Styles
|
|
* Additional styles not covered by TailwindCSS utility classes
|
|
*/
|
|
|
|
/* Touch optimization - prevent text selection and improve tap responsiveness */
|
|
.numpad-container button {
|
|
touch-action: manipulation;
|
|
-webkit-tap-highlight-color: transparent;
|
|
-webkit-touch-callout: none;
|
|
-webkit-user-select: none;
|
|
user-select: none;
|
|
}
|
|
|
|
/* Ensure touch-manipulation class works */
|
|
.touch-manipulation {
|
|
touch-action: manipulation;
|
|
}
|
|
|
|
/* Prevent tap highlight on mobile devices */
|
|
.numpad-container button:active {
|
|
-webkit-tap-highlight-color: transparent;
|
|
}
|
|
|
|
/* Improve button focus for accessibility */
|
|
.numpad-container button:focus-visible {
|
|
outline: 2px solid var(--color-primary, #0D47A1);
|
|
outline-offset: 2px;
|
|
}
|
|
|
|
/* Ensure consistent sizing on all devices */
|
|
.numpad-container {
|
|
-webkit-tap-highlight-color: transparent;
|
|
}
|
|
|
|
/* Value display - ensure proper spacing and alignment */
|
|
.value-display {
|
|
min-height: 60px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
}
|
|
|
|
/* Prevent zoom on double-tap for iOS Safari */
|
|
@media (max-width: 768px) {
|
|
.numpad-container button {
|
|
touch-action: manipulation;
|
|
}
|
|
}
|
|
|
|
/* Dark mode adjustments for better contrast */
|
|
.dark .value-display {
|
|
background-color: var(--bg-card, rgb(51, 65, 85));
|
|
border-color: var(--border-color, rgb(71, 85, 105));
|
|
}
|