Files
checklist/frontend/public/service-worker.js
ronalds 54006d5756 Campo de Observaciones Opcional
 Agregado checkbox "Agregar campo observaciones" en QuestionTypeEditor.jsx (sección "Opciones Generales")
 Por defecto está marcado (compatibilidad con preguntas existentes)
 El campo de observaciones solo se muestra si show_observations !== false
 El admin ahora tiene control total sobre si mostrar o no las observaciones
2. Botón "Consultar Asistente IA" Siempre Visible
 El botón ahora aparece siempre para preguntas tipo ai_assistant
 No depende de que la pregunta tenga fotos habilitadas
 Movido a una sección independiente (fuera del bloque de fotos)
 Removido el botón duplicado que estaba dentro de la sección de fotos
3. Versiones Actualizadas
Frontend: 1.0.89 → 1.0.90
Service Worker: ayutec-v1.0.89 → ayutec-v1.0.90
Backend: Sin cambios (no fue necesario)
📋 Detalles Técnicos
App.jsx:

Campo de respuesta oculto para photo_only y ai_assistant
Botón de Asistente IA en sección dedicada (siempre visible para ai_assistant)
Observaciones solo si show_observations !== false y no es photo_only ni ai_assistant
QuestionTypeEditor.jsx:

Nueva sección "⚙️ Opciones Generales" con checkbox azul
Texto de ayuda: "Si está marcado, el mecánico podrá agregar notas adicionales"
2025-11-30 23:51:04 -03:00

68 lines
1.9 KiB
JavaScript

// Service Worker para PWA con detección de actualizaciones
// IMPORTANTE: Actualizar esta versión cada vez que se despliegue una nueva versión
const CACHE_NAME = 'ayutec-v1.0.90';
const urlsToCache = [
'/',
'/index.html'
];
// Instalación del service worker
self.addEventListener('install', (event) => {
console.log('Service Worker: Installing version', CACHE_NAME);
event.waitUntil(
caches.open(CACHE_NAME)
.then((cache) => {
console.log('Service Worker: Caching files');
return cache.addAll(urlsToCache);
})
// NO hacer skipWaiting automáticamente - esperar a que el usuario lo active
);
});
// Activación del service worker
self.addEventListener('activate', (event) => {
console.log('Service Worker: Activating...');
event.waitUntil(
caches.keys().then((cacheNames) => {
return Promise.all(
cacheNames.map((cacheName) => {
if (cacheName !== CACHE_NAME) {
console.log('Service Worker: Deleting old cache:', cacheName);
return caches.delete(cacheName);
}
})
);
})
// NO hacer claim automáticamente - solo cuando el usuario actualice manualmente
);
});
// Estrategia: Network First, fallback to Cache
self.addEventListener('fetch', (event) => {
event.respondWith(
fetch(event.request)
.then((response) => {
// Clone la respuesta
const responseToCache = response.clone();
// Actualizar cache con la nueva respuesta
caches.open(CACHE_NAME).then((cache) => {
cache.put(event.request, responseToCache);
});
return response;
})
.catch(() => {
// Si falla la red, usar cache
return caches.match(event.request);
})
);
});
// Mensaje para notificar actualización
self.addEventListener('message', (event) => {
if (event.data && event.data.type === 'SKIP_WAITING') {
self.skipWaiting();
}
});