fix(templates+uploads): botones del catálogo global + subida de KML/KMZ/SHP

1) global-template-manager.blade.php: los botones "Nuevo" e "Importar CSV/Excel"
   estaban dentro de <x-slot name="header">, que Blade renderiza FUERA del
   componente Livewire (lo pinta el layout), por lo que sus wire:click no se
   ataban. Movidos al cuerpo del componente; el slot solo lleva el título.

2) config/livewire.php: creado para sobrescribir temporary_file_upload.rules.
   Por defecto Livewire aplica "file|mimes:png,jpeg,...|max:12288" al fichero
   temporal, lo que hace que .kml/.kmz/.shp/.dwg/.zip rebote con
   "The uploadFile failed to upload". Ahora el paso temporal solo exige file y
   max 50 MB; los componentes ya validan mime/tamaño reales antes de guardar.

Nota: en el servidor hay que `php artisan config:clear && php artisan config:cache`
para que el nuevo config/livewire.php se aplique.

Suite 91 passing.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-07-07 18:36:25 +02:00
co-authored by Claude Opus 4.7
parent ca04b5a760
commit 042233069f
2 changed files with 38 additions and 16 deletions
+20
View File
@@ -0,0 +1,20 @@
<?php
/**
* Config parcial de Livewire solo sobrescribimos la subida temporal.
* Por defecto Livewire aplica reglas restrictivas ("file|mimes:png,jpeg,...|max:12288")
* que rechazan .kml/.kmz/.shp/.dwg/.zip con "The uploadFile failed to upload".
* Aquí subimos el límite a 50 MB y quitamos el filtro de mime en el paso temporal
* (los componentes ya validan mime/tamaño reales antes de guardar).
*/
return [
'temporary_file_upload' => [
'disk' => null,
'rules' => ['required', 'file', 'max:51200'],
'directory' => null,
'middleware' => null,
'preview_mimes' => ['png', 'gif', 'bmp', 'svg', 'wav', 'mp4', 'mov', 'avi', 'wmv', 'mp3', 'm4a', 'jpg', 'jpeg', 'mpga', 'webp', 'wma'],
'max_upload_time' => 5,
'cleanup' => true,
],
];
@@ -1,26 +1,28 @@
<div> <div>
{{-- Cabecera de la página, en el layout --}}
<x-slot name="header"> <x-slot name="header">
{{-- ── Cabecera ─────────────────────────────────────────────────────────── --}} <h2 class="font-semibold text-xl text-gray-800 leading-tight">
<div class="flex justify-between items-center mb-4"> 📋 {{ __('Inspection templates') }}
<div> </h2>
<h1 class="text-xl font-bold">📋 {{ __('Inspection templates') }}</h1>
<p class="text-sm text-base-content/60">{{ __('Global catalogue, reusable across all projects.') }}</p>
</div>
<div class="flex items-center gap-4">
<button wire:click="openImportFileModal" class="btn btn-outline btn-sm gap-1" title="{{ __('Import from CSV/Excel') }}">
<x-heroicon-o-document-arrow-up class="w-4 h-4" />
{{ __('Import CSV/Excel') }}
</button>
<button wire:click="newTemplate" class="btn btn-primary btn-sm">
{{ __('New template') }}
</button>
</div>
</div>
</x-slot> </x-slot>
<div class="py-12"> <div class="py-12">
<div class="max-w-7xl mx-auto sm:px-6 lg:px-8"> <div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
<div class="bg-white rounded-lg shadow p-6"> <div class="bg-white rounded-lg shadow p-6">
{{-- Botones DENTRO del componente Livewire (para que wire:click funcione) --}}
<div class="flex justify-between items-center mb-4">
<p class="text-sm text-base-content/60">{{ __('Global catalogue, reusable across all projects.') }}</p>
<div class="flex items-center gap-2">
<button type="button" wire:click="openImportFileModal" class="btn btn-outline btn-sm gap-1" title="{{ __('Import from CSV/Excel') }}">
<x-heroicon-o-document-arrow-up class="w-4 h-4" />
{{ __('Import CSV/Excel') }}
</button>
<button type="button" wire:click="newTemplate" class="btn btn-primary btn-sm">
{{ __('New template') }}
</button>
</div>
</div>
@if($showForm) @if($showForm)
<form wire:submit.prevent="saveTemplate" class="border p-4 rounded mb-6 bg-base-200"> <form wire:submit.prevent="saveTemplate" class="border p-4 rounded mb-6 bg-base-200">
<table class="w-full mb-8"> <table class="w-full mb-8">