Loading app/Http/Controllers/InstitucionesController.php +55 −60 Original line number Diff line number Diff line Loading @@ -3,6 +3,8 @@ namespace App\Http\Controllers; use App\Models\Instituciones; use App\Models\TelefonoInst; use App\Models\RedesSocialesInst; use App\Models\Subgrupo; use Illuminate\Http\Request; Loading @@ -22,87 +24,80 @@ public function create() public function store(Request $request) { $validatedData = $request->validate([ 'nombre' => 'required|string|max:255', 'RFC' => 'nullable|string|max:13', $data = $request->validate([ 'imagen' => 'nullable|string', 'nombre' => 'required|string', 'RFC' => 'nullable|string', 'domicilio' => 'nullable|string', 'codigo_postal' => 'nullable|integer', 'localidad' => 'nullable|string', 'aniversario' => 'nullable|date', 'observaciones' => 'nullable|string', 'subgrupo_id' => 'nullable|integer', 'imagen' => 'nullable|image|mimes:jpeg,png,jpg,gif|max:2048', 'domicilio' => 'nullable|string|max:255', 'codigo_postal' => 'nullable|string|max:10', 'localidad' => 'nullable|string|max:255', 'prefijo' => 'nullable|string|max:10', 'lada' => 'nullable|string|max:5', 'numero' => 'nullable|string|max:15', 'tipo' => 'nullable|string', 'estatus' => 'nullable|boolean', 'ext' => 'nullable|string|max:10', 'observaciones' => 'nullable|string', 'ID_radio' => 'nullable|string|max:50', 'nombre' => 'nullable|string|max:255', 'link' => 'nullable|url', 'tipo' => 'nullable|string', 'telefonos' => 'array', 'redesSociales' => 'array' ]); // Handle file upload if there is any if ($request->hasFile('imagen')) { $imagePath = $request->file('imagen')->store('imagenes', 'public'); $validatedData['imagen'] = $imagePath; } $institucion = Institucion::create($data); $institucion = Institucion::create($validatedData); // Guardar los teléfonos foreach ($request->prefijo as $index => $prefijo) { Telefono::create([ 'institucion_id' => $institucion->id, 'prefijo' => $prefijo, 'lada' => $request->lada[$index], 'numero' => $request->numero[$index], 'tipo' => $request->tipo[$index], 'estatus' => $request->estatus[$index], 'ext' => $request->ext[$index], 'observaciones' => $request->telefono_observaciones[$index], 'ID_radio' => $request->ID_radio[$index], ]); foreach ($data['telefonos'] as $telefono) { $institucion->telefonos()->create($telefono); } // Guardar las redes sociales foreach ($request->red_nombre as $index => $red_nombre) { RedSocial::create([ 'institucion_id' => $institucion->id, 'nombre' => $red_nombre, 'link' => $request->link[$index], 'tipo' => $request->red_tipo[$index], ]); foreach ($data['redesSociales'] as $redSocial) { $institucion->redesSociales()->create($redSocial); } return redirect()->route('instituciones.index')->with('success', 'Institución creada exitosamente'); return redirect()->route('instituciones.index'); } public function edit($id) public function show(Institucion $institucion) { $institucion = Instituciones::findOrFail($id); $subgrupos = Subgrupo::all(); return view('adminGen.instituciones.edit', compact('institucion', 'subgrupos')); return view('instituciones.show', compact('institucion')); } public function update(Request $request, $id) public function edit(Institucion $institucion) { $institucion = Instituciones::findOrFail($id); $data = $request->all(); if ($request->hasFile('imagen')) { $data['imagen'] = $request->file('imagen')->store('imagenes', 'public'); return view('instituciones.edit', compact('institucion')); } public function update(Request $request, Institucion $institucion) { $data = $request->validate([ 'imagen' => 'nullable|string', 'nombre' => 'required|string', 'RFC' => 'nullable|string', 'domicilio' => 'nullable|string', 'codigo_postal' => 'nullable|integer', 'localidad' => 'nullable|string', 'aniversario' => 'nullable|date', 'observaciones' => 'nullable|string', 'subgrupo_id' => 'nullable|integer', 'telefonos' => 'array', 'redesSociales' => 'array' ]); $institucion->update($data); $institucion->telefonos()->delete(); foreach ($data['telefonos'] as $telefono) { $institucion->telefonos()->create($telefono); } $institucion->redesSociales()->delete(); foreach ($data['redesSociales'] as $redSocial) { $institucion->redesSociales()->create($redSocial); } return redirect()->route('instituciones.index'); } public function destroy($id) public function destroy(Institucion $institucion) { $institucion = Instituciones::findOrFail($id); $institucion->telefonos()->delete(); $institucion->redesSociales()->delete(); $institucion->delete(); return redirect()->route('instituciones.index'); } } app/Http/Controllers/RedesSocialesInstController.php +1 −1 Original line number Diff line number Diff line Loading @@ -3,7 +3,7 @@ namespace App\Http\Controllers; use App\Models\RedSocialInst; use App\Models\Institucion; use App\Models\Instituciones; use Illuminate\Http\Request; class RedSocialInstController extends Controller Loading app/Models/RedesSocialesInst.php +1 −1 Original line number Diff line number Diff line Loading @@ -5,7 +5,7 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class RedSocialInst extends Model class RedesSocialesInst extends Model { use HasFactory; Loading resources/views/adminGen/instituciones/create.blade.php +141 −118 Original line number Diff line number Diff line Loading @@ -90,8 +90,8 @@ </div> <!-- Campos para cada pestaña --> <div> <form action="{{ route('instituciones.store') }}" method="POST" enctype="multipart/form-data" @submit.prevent="submitForm"> <div class="container"> <form action="{{ route('instituciones.store') }}" method="POST" x-data="institucionForm"> @csrf <!--Datos--> <div x-show="activeTab === 1"> Loading @@ -99,7 +99,7 @@ <h2 class="text-2xl font-bold mb-6">Agregar Datos</h2> <div class="mb-4"> <label for="nombre" class="block text-gray-700">Nombre:</label> <input type="text" id="nombre" name="nombre" class="form-input mt-1 block w-full" required> <input type="text" id="nombre" name="nombre" x-model="nombre" class="form-input mt-1 block w-full" required> </div> <div class="mb-4"> <label for="RFC" class="block text-gray-700">RFC:</label> Loading Loading @@ -154,22 +154,23 @@ <div class="panel mt-6"> <h1 class="text-2xl font-semibold mb-5">Agregar teléfono</h1> <div id="telefonos-container" class="space-y-4"> <template x-for="(telefono, index) in telefonos" :key="index"> <div class="telefono-group grid grid-cols-1 md:grid-cols-8 gap-4"> <div> <label for="prefijo" class="block text-sm font-medium text-gray-700">Prefijo</label> <input type="number" name="prefijo[]" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" value="{{ old('prefijo') }}"> <input type="number" :name="'prefijo['+index+']'" x-model="telefono.prefijo" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"> </div> <div> <label for="lada" class="block text-sm font-medium text-gray-700">Lada</label> <input type="number" name="lada[]" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" value="{{ old('lada') }}"> <input type="number" :name="'lada['+index+']'" x-model="telefono.lada" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"> </div> <div> <label for="numero" class="block text-sm font-medium text-gray-700">Número</label> <input type="number" name="numero[]" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" value="{{ old('numero') }}"> <input type="number" :name="'numero['+index+']'" x-model="telefono.numero" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"> </div> <div class="mb-5"> <label for="tipo" class="block text-sm font-medium text-gray-700">Tipo</label> <select name="tipo[]" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"> <select :name="'tipo['+index+']'" x-model="telefono.tipo" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"> <option value="0">Selecciona un tipo</option> <option value="Celular">Celular</option> <option value="Fax">Fax</option> Loading @@ -181,29 +182,30 @@ </div> <div> <label for="estatus" class="block text-sm font-medium text-gray-700">Estatus</label> <select name="estatus[]" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"> <select :name="'estatus['+index+']'" x-model="telefono.estatus" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"> <option value="1">Activo</option> <option value="0">Inactivo</option> </select> </div> <div> <label for="ext" class="block text-sm font-medium text-gray-700">Extensión</label> <input type="number" name="ext[]" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" value="{{ old('ext') }}"> <input type="number" :name="'ext['+index+']'" x-model="telefono.ext" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"> </div> <div> <label for="observaciones" class="block text-sm font-medium text-gray-700">Observaciones</label> <input type="text" name="observaciones[]" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" value="{{ old('observaciones') }}"> <input type="text" :name="'observaciones['+index+']'" x-model="telefono.observaciones" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"> </div> <div> <label for="ID_radio" class="block text-sm font-medium text-gray-700">ID Radio</label> <input type="text" name="ID_radio[]" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" value="{{ old('ID_radio') }}"> <input type="text" :name="'ID_radio['+index+']'" x-model="telefono.ID_radio" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"> </div> <div class="col-span-8 text-right"> <button type="button" class="btn btn-success mt-4" onclick="addTelefono()">Agregar Teléfono</button> <button type="button" class="btn btn-success mt-4" @click="addTelefono">Agregar Teléfono</button> <br> <button type="button" class="btn btn-danger" onclick="removeTelefono(this)">Eliminar</button> <button type="button" class="btn btn-danger" @click="removeTelefono(index)">Eliminar</button> </div> </div> </template> </div> </div> </div> Loading @@ -214,18 +216,19 @@ <div class="container mx-auto mt-6"> <h2 class="text-2xl font-bold mb-6">Agregar redes sociales</h2> <div id="redes-container" class="space-y-4"> <template x-for="(redSocial, index) in redesSociales" :key="index"> <div class="red-social-group grid grid-cols-1 md:grid-cols-4 gap-4"> <div class="mb-4"> <label for="nombre" class="block text-gray-700">Nombre:</label> <input type="text" id="nombre" name="nombre" class="form-input mt-1 block w-full" required> <input type="text" :name="'red_nombre['+index+']'" x-model="redSocial.nombre" class="form-input mt-1 block w-full" required> </div> <div class="mb-4"> <label for="link" class="block text-gray-700">Link:</label> <input type="url" id="link" name="link" class="form-input mt-1 block w-full"> <input type="url" :name="'link['+index+']'" x-model="redSocial.link" class="form-input mt-1 block w-full"> </div> <div class="form-group mb-4"> <label for="tipo" class="block text-sm font-medium text-gray-700">Tipo de Red social</label> <select name="tipo" id="tipo" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"> <select :name="'red_tipo['+index+']'" x-model="redSocial.tipo" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"> <option value="0">Seleccione una red social</option> <option value="Facebook">Facebook</option> <option value="X (twitter)">X (twitter)</option> Loading @@ -235,12 +238,13 @@ </div> <br> <div class="col-span-4 text-right"> <button type="button" class="btn btn-success" onclick="addRedSocial()">Agregar Red Social</button> <button type="button" class="btn btn-success" @click="addRedSocial">Agregar Red Social</button> </div> <div class="col-span-4 text-right"> <button type="button" class="btn btn-danger" onclick="removeRedSocial(this)">Eliminar</button> <button type="button" class="btn btn-danger" @click="removeRedSocial(index)">Eliminar</button> </div> </div> </template> </div> </div> </div> Loading @@ -264,52 +268,71 @@ <button type="button" class="btn btn-primary" :disabled="activeTab === 1" @click="activeTab--">Atras</button> <button type="button" class="btn btn-primary" :disabled="activeTab === 5" @click="activeTab++">Siguiente</button> </div> <!--Script o funcionalidad para agregar y eliminar telefono--> <script> function addTelefono() { const container = document.getElementById('telefonos-container'); const telefonoGroup = document.querySelector('.telefono-group'); const newTelefonoGroup = telefonoGroup.cloneNode(true); newTelefonoGroup.querySelectorAll('input').forEach(input => input.value = ''); newTelefonoGroup.querySelectorAll('select').forEach(select => select.value = '0'); container.appendChild(newTelefonoGroup); } <br> function removeTelefono(button) { const container = document.getElementById('telefonos-container'); if (container.childElementCount > 1) { button.parentElement.parentElement.remove(); <script> document.addEventListener('alpine:init', () => { Alpine.data('institucionForm', () => ({ nombre: '', RFC: '', aniversario: '', observaciones: '', subgrupo_id: '', domicilio: '', codigo_postal: '', localidad: '', telefonos: [{ prefijo: '', lada: '', numero: '', tipo: '', estatus: '1', ext: '', observaciones: '', ID_radio: '' }], redesSociales: [{ nombre: '', link: '', tipo: '' }], addTelefono() { this.telefonos.push({ prefijo: '', lada: '', numero: '', tipo: '', estatus: '1', ext: '', observaciones: '', ID_radio: '' }); }, removeTelefono(index) { if (this.telefonos.length > 1) { this.telefonos.splice(index, 1); } else { alert('Debe haber al menos un teléfono'); } } </script> <!--Script o funcionalidad para agregar y eliminar red social--> <script> function addRedSocial() { const container = document.getElementById('redes-container'); const redSocialGroup = document.querySelector('.red-social-group'); const newRedSocialGroup = redSocialGroup.cloneNode(true); newRedSocialGroup.querySelectorAll('input').forEach(input => input.value = ''); newRedSocialGroup.querySelectorAll('select').forEach(select => select.value = '0'); container.appendChild(newRedSocialGroup); } function removeRedSocial(button) { const container = document.getElementById('redes-container'); if (container.childElementCount > 1) { button.parentElement.parentElement.remove(); }, addRedSocial() { this.redesSociales.push({ nombre: '', link: '', tipo: '' }); }, removeRedSocial(index) { if (this.redesSociales.length > 1) { this.redesSociales.splice(index, 1); } else { alert('Debe haber al menos una red social'); } } })); }); </script> </x-layout.default> resources/views/adminGen/instituciones/index.blade.php +12 −13 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
app/Http/Controllers/InstitucionesController.php +55 −60 Original line number Diff line number Diff line Loading @@ -3,6 +3,8 @@ namespace App\Http\Controllers; use App\Models\Instituciones; use App\Models\TelefonoInst; use App\Models\RedesSocialesInst; use App\Models\Subgrupo; use Illuminate\Http\Request; Loading @@ -22,87 +24,80 @@ public function create() public function store(Request $request) { $validatedData = $request->validate([ 'nombre' => 'required|string|max:255', 'RFC' => 'nullable|string|max:13', $data = $request->validate([ 'imagen' => 'nullable|string', 'nombre' => 'required|string', 'RFC' => 'nullable|string', 'domicilio' => 'nullable|string', 'codigo_postal' => 'nullable|integer', 'localidad' => 'nullable|string', 'aniversario' => 'nullable|date', 'observaciones' => 'nullable|string', 'subgrupo_id' => 'nullable|integer', 'imagen' => 'nullable|image|mimes:jpeg,png,jpg,gif|max:2048', 'domicilio' => 'nullable|string|max:255', 'codigo_postal' => 'nullable|string|max:10', 'localidad' => 'nullable|string|max:255', 'prefijo' => 'nullable|string|max:10', 'lada' => 'nullable|string|max:5', 'numero' => 'nullable|string|max:15', 'tipo' => 'nullable|string', 'estatus' => 'nullable|boolean', 'ext' => 'nullable|string|max:10', 'observaciones' => 'nullable|string', 'ID_radio' => 'nullable|string|max:50', 'nombre' => 'nullable|string|max:255', 'link' => 'nullable|url', 'tipo' => 'nullable|string', 'telefonos' => 'array', 'redesSociales' => 'array' ]); // Handle file upload if there is any if ($request->hasFile('imagen')) { $imagePath = $request->file('imagen')->store('imagenes', 'public'); $validatedData['imagen'] = $imagePath; } $institucion = Institucion::create($data); $institucion = Institucion::create($validatedData); // Guardar los teléfonos foreach ($request->prefijo as $index => $prefijo) { Telefono::create([ 'institucion_id' => $institucion->id, 'prefijo' => $prefijo, 'lada' => $request->lada[$index], 'numero' => $request->numero[$index], 'tipo' => $request->tipo[$index], 'estatus' => $request->estatus[$index], 'ext' => $request->ext[$index], 'observaciones' => $request->telefono_observaciones[$index], 'ID_radio' => $request->ID_radio[$index], ]); foreach ($data['telefonos'] as $telefono) { $institucion->telefonos()->create($telefono); } // Guardar las redes sociales foreach ($request->red_nombre as $index => $red_nombre) { RedSocial::create([ 'institucion_id' => $institucion->id, 'nombre' => $red_nombre, 'link' => $request->link[$index], 'tipo' => $request->red_tipo[$index], ]); foreach ($data['redesSociales'] as $redSocial) { $institucion->redesSociales()->create($redSocial); } return redirect()->route('instituciones.index')->with('success', 'Institución creada exitosamente'); return redirect()->route('instituciones.index'); } public function edit($id) public function show(Institucion $institucion) { $institucion = Instituciones::findOrFail($id); $subgrupos = Subgrupo::all(); return view('adminGen.instituciones.edit', compact('institucion', 'subgrupos')); return view('instituciones.show', compact('institucion')); } public function update(Request $request, $id) public function edit(Institucion $institucion) { $institucion = Instituciones::findOrFail($id); $data = $request->all(); if ($request->hasFile('imagen')) { $data['imagen'] = $request->file('imagen')->store('imagenes', 'public'); return view('instituciones.edit', compact('institucion')); } public function update(Request $request, Institucion $institucion) { $data = $request->validate([ 'imagen' => 'nullable|string', 'nombre' => 'required|string', 'RFC' => 'nullable|string', 'domicilio' => 'nullable|string', 'codigo_postal' => 'nullable|integer', 'localidad' => 'nullable|string', 'aniversario' => 'nullable|date', 'observaciones' => 'nullable|string', 'subgrupo_id' => 'nullable|integer', 'telefonos' => 'array', 'redesSociales' => 'array' ]); $institucion->update($data); $institucion->telefonos()->delete(); foreach ($data['telefonos'] as $telefono) { $institucion->telefonos()->create($telefono); } $institucion->redesSociales()->delete(); foreach ($data['redesSociales'] as $redSocial) { $institucion->redesSociales()->create($redSocial); } return redirect()->route('instituciones.index'); } public function destroy($id) public function destroy(Institucion $institucion) { $institucion = Instituciones::findOrFail($id); $institucion->telefonos()->delete(); $institucion->redesSociales()->delete(); $institucion->delete(); return redirect()->route('instituciones.index'); } }
app/Http/Controllers/RedesSocialesInstController.php +1 −1 Original line number Diff line number Diff line Loading @@ -3,7 +3,7 @@ namespace App\Http\Controllers; use App\Models\RedSocialInst; use App\Models\Institucion; use App\Models\Instituciones; use Illuminate\Http\Request; class RedSocialInstController extends Controller Loading
app/Models/RedesSocialesInst.php +1 −1 Original line number Diff line number Diff line Loading @@ -5,7 +5,7 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class RedSocialInst extends Model class RedesSocialesInst extends Model { use HasFactory; Loading
resources/views/adminGen/instituciones/create.blade.php +141 −118 Original line number Diff line number Diff line Loading @@ -90,8 +90,8 @@ </div> <!-- Campos para cada pestaña --> <div> <form action="{{ route('instituciones.store') }}" method="POST" enctype="multipart/form-data" @submit.prevent="submitForm"> <div class="container"> <form action="{{ route('instituciones.store') }}" method="POST" x-data="institucionForm"> @csrf <!--Datos--> <div x-show="activeTab === 1"> Loading @@ -99,7 +99,7 @@ <h2 class="text-2xl font-bold mb-6">Agregar Datos</h2> <div class="mb-4"> <label for="nombre" class="block text-gray-700">Nombre:</label> <input type="text" id="nombre" name="nombre" class="form-input mt-1 block w-full" required> <input type="text" id="nombre" name="nombre" x-model="nombre" class="form-input mt-1 block w-full" required> </div> <div class="mb-4"> <label for="RFC" class="block text-gray-700">RFC:</label> Loading Loading @@ -154,22 +154,23 @@ <div class="panel mt-6"> <h1 class="text-2xl font-semibold mb-5">Agregar teléfono</h1> <div id="telefonos-container" class="space-y-4"> <template x-for="(telefono, index) in telefonos" :key="index"> <div class="telefono-group grid grid-cols-1 md:grid-cols-8 gap-4"> <div> <label for="prefijo" class="block text-sm font-medium text-gray-700">Prefijo</label> <input type="number" name="prefijo[]" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" value="{{ old('prefijo') }}"> <input type="number" :name="'prefijo['+index+']'" x-model="telefono.prefijo" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"> </div> <div> <label for="lada" class="block text-sm font-medium text-gray-700">Lada</label> <input type="number" name="lada[]" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" value="{{ old('lada') }}"> <input type="number" :name="'lada['+index+']'" x-model="telefono.lada" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"> </div> <div> <label for="numero" class="block text-sm font-medium text-gray-700">Número</label> <input type="number" name="numero[]" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" value="{{ old('numero') }}"> <input type="number" :name="'numero['+index+']'" x-model="telefono.numero" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"> </div> <div class="mb-5"> <label for="tipo" class="block text-sm font-medium text-gray-700">Tipo</label> <select name="tipo[]" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"> <select :name="'tipo['+index+']'" x-model="telefono.tipo" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"> <option value="0">Selecciona un tipo</option> <option value="Celular">Celular</option> <option value="Fax">Fax</option> Loading @@ -181,29 +182,30 @@ </div> <div> <label for="estatus" class="block text-sm font-medium text-gray-700">Estatus</label> <select name="estatus[]" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"> <select :name="'estatus['+index+']'" x-model="telefono.estatus" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"> <option value="1">Activo</option> <option value="0">Inactivo</option> </select> </div> <div> <label for="ext" class="block text-sm font-medium text-gray-700">Extensión</label> <input type="number" name="ext[]" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" value="{{ old('ext') }}"> <input type="number" :name="'ext['+index+']'" x-model="telefono.ext" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"> </div> <div> <label for="observaciones" class="block text-sm font-medium text-gray-700">Observaciones</label> <input type="text" name="observaciones[]" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" value="{{ old('observaciones') }}"> <input type="text" :name="'observaciones['+index+']'" x-model="telefono.observaciones" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"> </div> <div> <label for="ID_radio" class="block text-sm font-medium text-gray-700">ID Radio</label> <input type="text" name="ID_radio[]" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" value="{{ old('ID_radio') }}"> <input type="text" :name="'ID_radio['+index+']'" x-model="telefono.ID_radio" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"> </div> <div class="col-span-8 text-right"> <button type="button" class="btn btn-success mt-4" onclick="addTelefono()">Agregar Teléfono</button> <button type="button" class="btn btn-success mt-4" @click="addTelefono">Agregar Teléfono</button> <br> <button type="button" class="btn btn-danger" onclick="removeTelefono(this)">Eliminar</button> <button type="button" class="btn btn-danger" @click="removeTelefono(index)">Eliminar</button> </div> </div> </template> </div> </div> </div> Loading @@ -214,18 +216,19 @@ <div class="container mx-auto mt-6"> <h2 class="text-2xl font-bold mb-6">Agregar redes sociales</h2> <div id="redes-container" class="space-y-4"> <template x-for="(redSocial, index) in redesSociales" :key="index"> <div class="red-social-group grid grid-cols-1 md:grid-cols-4 gap-4"> <div class="mb-4"> <label for="nombre" class="block text-gray-700">Nombre:</label> <input type="text" id="nombre" name="nombre" class="form-input mt-1 block w-full" required> <input type="text" :name="'red_nombre['+index+']'" x-model="redSocial.nombre" class="form-input mt-1 block w-full" required> </div> <div class="mb-4"> <label for="link" class="block text-gray-700">Link:</label> <input type="url" id="link" name="link" class="form-input mt-1 block w-full"> <input type="url" :name="'link['+index+']'" x-model="redSocial.link" class="form-input mt-1 block w-full"> </div> <div class="form-group mb-4"> <label for="tipo" class="block text-sm font-medium text-gray-700">Tipo de Red social</label> <select name="tipo" id="tipo" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"> <select :name="'red_tipo['+index+']'" x-model="redSocial.tipo" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"> <option value="0">Seleccione una red social</option> <option value="Facebook">Facebook</option> <option value="X (twitter)">X (twitter)</option> Loading @@ -235,12 +238,13 @@ </div> <br> <div class="col-span-4 text-right"> <button type="button" class="btn btn-success" onclick="addRedSocial()">Agregar Red Social</button> <button type="button" class="btn btn-success" @click="addRedSocial">Agregar Red Social</button> </div> <div class="col-span-4 text-right"> <button type="button" class="btn btn-danger" onclick="removeRedSocial(this)">Eliminar</button> <button type="button" class="btn btn-danger" @click="removeRedSocial(index)">Eliminar</button> </div> </div> </template> </div> </div> </div> Loading @@ -264,52 +268,71 @@ <button type="button" class="btn btn-primary" :disabled="activeTab === 1" @click="activeTab--">Atras</button> <button type="button" class="btn btn-primary" :disabled="activeTab === 5" @click="activeTab++">Siguiente</button> </div> <!--Script o funcionalidad para agregar y eliminar telefono--> <script> function addTelefono() { const container = document.getElementById('telefonos-container'); const telefonoGroup = document.querySelector('.telefono-group'); const newTelefonoGroup = telefonoGroup.cloneNode(true); newTelefonoGroup.querySelectorAll('input').forEach(input => input.value = ''); newTelefonoGroup.querySelectorAll('select').forEach(select => select.value = '0'); container.appendChild(newTelefonoGroup); } <br> function removeTelefono(button) { const container = document.getElementById('telefonos-container'); if (container.childElementCount > 1) { button.parentElement.parentElement.remove(); <script> document.addEventListener('alpine:init', () => { Alpine.data('institucionForm', () => ({ nombre: '', RFC: '', aniversario: '', observaciones: '', subgrupo_id: '', domicilio: '', codigo_postal: '', localidad: '', telefonos: [{ prefijo: '', lada: '', numero: '', tipo: '', estatus: '1', ext: '', observaciones: '', ID_radio: '' }], redesSociales: [{ nombre: '', link: '', tipo: '' }], addTelefono() { this.telefonos.push({ prefijo: '', lada: '', numero: '', tipo: '', estatus: '1', ext: '', observaciones: '', ID_radio: '' }); }, removeTelefono(index) { if (this.telefonos.length > 1) { this.telefonos.splice(index, 1); } else { alert('Debe haber al menos un teléfono'); } } </script> <!--Script o funcionalidad para agregar y eliminar red social--> <script> function addRedSocial() { const container = document.getElementById('redes-container'); const redSocialGroup = document.querySelector('.red-social-group'); const newRedSocialGroup = redSocialGroup.cloneNode(true); newRedSocialGroup.querySelectorAll('input').forEach(input => input.value = ''); newRedSocialGroup.querySelectorAll('select').forEach(select => select.value = '0'); container.appendChild(newRedSocialGroup); } function removeRedSocial(button) { const container = document.getElementById('redes-container'); if (container.childElementCount > 1) { button.parentElement.parentElement.remove(); }, addRedSocial() { this.redesSociales.push({ nombre: '', link: '', tipo: '' }); }, removeRedSocial(index) { if (this.redesSociales.length > 1) { this.redesSociales.splice(index, 1); } else { alert('Debe haber al menos una red social'); } } })); }); </script> </x-layout.default>
resources/views/adminGen/instituciones/index.blade.php +12 −13 File changed.Preview size limit exceeded, changes collapsed. Show changes