v1.2.4 - Lightbox para visualizar imágenes en Chat Assistant
FRONTEND: - Implementado visor de imágenes (lightbox) dentro del modal de chat - Click en imagen abre pantalla completa en lugar de nueva pestaña - Fondo negro translúcido (95%) con z-index 200 - Botón de cerrar (×) en esquina superior derecha - Click en imagen/fondo cierra el lightbox - Etiqueta flotante con nombre de archivo - Cursor zoom-in en miniaturas para indicar ampliación - Responsive: max 95vw/95vh con scroll automático - Frontend v1.2.4 BACKEND: - Sin cambios (v1.1.1)
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "checklist-frontend",
|
"name": "checklist-frontend",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "1.2.3",
|
"version": "1.2.4",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// Service Worker para PWA con detección de actualizaciones
|
// Service Worker para PWA con detección de actualizaciones
|
||||||
// IMPORTANTE: Actualizar esta versión cada vez que se despliegue una nueva versión
|
// IMPORTANTE: Actualizar esta versión cada vez que se despliegue una nueva versión
|
||||||
const CACHE_NAME = 'ayutec-v1.2.3';
|
const CACHE_NAME = 'ayutec-v1.2.4';
|
||||||
const urlsToCache = [
|
const urlsToCache = [
|
||||||
'/',
|
'/',
|
||||||
'/index.html'
|
'/index.html'
|
||||||
|
|||||||
@@ -5457,6 +5457,7 @@ function InspectionModal({ checklist, existingInspection, user, onClose, onCompl
|
|||||||
function AIAssistantChatModal({ question, inspection, allAnswers, messages, setMessages, loading, setLoading, onClose }) {
|
function AIAssistantChatModal({ question, inspection, allAnswers, messages, setMessages, loading, setLoading, onClose }) {
|
||||||
const [inputMessage, setInputMessage] = useState('')
|
const [inputMessage, setInputMessage] = useState('')
|
||||||
const [attachedFiles, setAttachedFiles] = useState([])
|
const [attachedFiles, setAttachedFiles] = useState([])
|
||||||
|
const [selectedImage, setSelectedImage] = useState(null) // Para lightbox
|
||||||
const chatEndRef = useRef(null)
|
const chatEndRef = useRef(null)
|
||||||
const fileInputRef = useRef(null)
|
const fileInputRef = useRef(null)
|
||||||
const config = question.options || {}
|
const config = question.options || {}
|
||||||
@@ -5715,8 +5716,8 @@ function AIAssistantChatModal({ question, inspection, allAnswers, messages, setM
|
|||||||
<img
|
<img
|
||||||
src={file.preview}
|
src={file.preview}
|
||||||
alt={file.name}
|
alt={file.name}
|
||||||
className="rounded-lg max-w-full h-auto max-h-64 object-contain cursor-pointer hover:opacity-90 transition"
|
className="rounded-lg max-w-full h-auto max-h-64 object-contain cursor-zoom-in hover:opacity-90 transition"
|
||||||
onClick={() => window.open(file.preview, '_blank')}
|
onClick={() => setSelectedImage({ url: file.preview, name: file.name })}
|
||||||
/>
|
/>
|
||||||
<div className={`text-xs flex items-center gap-1 ${msg.role === 'user' ? 'text-blue-100' : 'text-gray-500'}`}>
|
<div className={`text-xs flex items-center gap-1 ${msg.role === 'user' ? 'text-blue-100' : 'text-gray-500'}`}>
|
||||||
<span>🖼️</span>
|
<span>🖼️</span>
|
||||||
@@ -5850,6 +5851,35 @@ function AIAssistantChatModal({ question, inspection, allAnswers, messages, setM
|
|||||||
</p>
|
</p>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{/* Lightbox para visualizar imágenes */}
|
||||||
|
{selectedImage && (
|
||||||
|
<div
|
||||||
|
className="fixed inset-0 bg-black/95 z-[200] flex items-center justify-center p-4"
|
||||||
|
onClick={() => setSelectedImage(null)}
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
onClick={() => setSelectedImage(null)}
|
||||||
|
className="absolute top-4 right-4 text-white/80 hover:text-white text-4xl font-bold z-10 bg-black/50 rounded-full w-12 h-12 flex items-center justify-center"
|
||||||
|
>
|
||||||
|
×
|
||||||
|
</button>
|
||||||
|
<div className="relative max-w-[95vw] max-h-[95vh] overflow-auto">
|
||||||
|
<img
|
||||||
|
src={selectedImage.url}
|
||||||
|
alt={selectedImage.name}
|
||||||
|
className="max-w-full max-h-[95vh] object-contain cursor-zoom-out"
|
||||||
|
onClick={(e) => {
|
||||||
|
e.stopPropagation()
|
||||||
|
setSelectedImage(null)
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<div className="absolute bottom-4 left-1/2 transform -translate-x-1/2 bg-black/70 text-white px-4 py-2 rounded-lg text-sm">
|
||||||
|
🖼️ {selectedImage.name}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -153,7 +153,7 @@ export default function Sidebar({ user, activeTab, setActiveTab, sidebarOpen, se
|
|||||||
className="w-10 h-10 object-contain bg-white rounded p-1"
|
className="w-10 h-10 object-contain bg-white rounded p-1"
|
||||||
/>
|
/>
|
||||||
<p className="text-xs text-indigo-300 font-medium hover:text-indigo-200">
|
<p className="text-xs text-indigo-300 font-medium hover:text-indigo-200">
|
||||||
Ayutec v1.2.3
|
Ayutec v1.2.4
|
||||||
</p>
|
</p>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user