Browse Source

cambios

quite el estatus de momento de lo comente por si lo necesitamos en el futuro y tambien ya quedo bien todolo demas
main
sergiomarquez778 2 weeks ago
parent
commit
cfca95dffb
  1. 0
      -i
  2. 68
      app/Http/Controllers/MarcaController.php
  3. 6
      app/Models/Marca.php
  4. 36
      database/migrations/2025_01_18_230913_create_marcs_table.php
  5. 4
      database/migrations/2025_02_28_192615_create_marcas_table.php
  6. 128
      resources/views/marcas.blade.php
  7. 32
      resources/views/marcasCrearEditar.blade.php

68
app/Http/Controllers/MarcaController.php

@ -4,42 +4,38 @@ namespace App\Http\Controllers;
use App\Models\Marca; use App\Models\Marca;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Models\Marc;
class MarcaController extends Controller class MarcaController extends Controller
{ {
/** /**
* Display a listing of the resource. * Display a listing of the resource.
*/ */
public function index(Request $request) public function index(Request $request)
{ {
$busqueda = $request->busqueda; $busqueda = $request->busqueda;
if ($busqueda) { if ($busqueda) {
// Busca en la tabla 'marcs' usando la relación // Busca en la columna 'marca' de la tabla 'marcas'
$marcas = Marca::whereHas('Marc', function($query) use ($busqueda) { $marcas = Marca::where('marca', 'LIKE', "%{$busqueda}%")->get();
$query->where('name', 'LIKE', "%{$busqueda}%");
})->get();
if ($marcas->isEmpty()) { if ($marcas->isEmpty()) {
return redirect()->route('marca.index') return redirect()->route('marca.index')
->with('error', 'No existe ninguna marca con el nombre "' . $busqueda . '". Por favor, inténtalo de nuevo.'); ->with('error', 'No existe ninguna marca con el nombre "' . $busqueda . '". Por favor, inténtalo de nuevo.');
}
} else {
// Si no hay búsqueda, mostrar todas las marcas
$marcas = Marca::all();
} }
} else {
return view('marcas', ['marcas' => $marcas]); // Si no hay búsqueda, mostrar todas las marcas
$marcas = Marca::where('eliminado', 0)->get();
} }
return view('marcas', ['marcas' => $marcas]);
}
/** /**
* Show the form for creating a new resource. * Show the form for creating a new resource.
*/ */
public function create() public function create()
{ {
$marcs = Marc::all(); // Asegúrate de que el modelo Marc esté correctamente importado return view('marcasCrearEditar', ['marca' => null]); // No se necesita pasar marcas
return view('marcasCrearEditar', ['marcs' => $marcs]); // Pasa la variable correctamente
} }
/** /**
@ -47,9 +43,12 @@ class MarcaController extends Controller
*/ */
public function store(Request $request) public function store(Request $request)
{ {
// Crea una nueva marca
$marca = new Marca($request->all()); $marca = new Marca();
$marca->marca = $request->marca; // Asigna el nombre ingresado por el usuario
$marca->eliminado = 0; // Marca como activa por defecto
$marca->save(); $marca->save();
return redirect()->route('marca.index')->with('success', 'Marca creada exitosamente.'); return redirect()->route('marca.index')->with('success', 'Marca creada exitosamente.');
} }
@ -59,8 +58,7 @@ class MarcaController extends Controller
public function edit($id) public function edit($id)
{ {
$marca = Marca::findOrFail($id); // Busca la marca por ID $marca = Marca::findOrFail($id); // Busca la marca por ID
$marcs = Marc::all(); // Recupera todas las marcas para el select return view('marcasCrearEditar', ['marca' => $marca]); // Pasa la marca a la vista
return view('marcasCrearEditar', ['marca' => $marca, 'marcs' => $marcs]); // Pasa la marca y las marcas a la vista
} }
/** /**
@ -69,15 +67,8 @@ class MarcaController extends Controller
public function update(Request $request, $id) public function update(Request $request, $id)
{ {
$marca = Marca::findOrFail($id); // Encuentra la marca por ID $marca = Marca::findOrFail($id); // Encuentra la marca por ID
$marca->marca = $request->marca; // Actualiza el nombre de la marca
// Si el campo 'recuperar' está presente, cambia el estado a activo $marca->eliminado = 0; // Cambia el estado a activo si se está editando
if ($request->has('recuperar')) {
$marca->eliminado = 0; // Marca como activa
} else {
// Actualiza los datos de la marca directamente
$marca->fill($request->all()); // Rellena los datos sin validación
}
$marca->save(); // Guarda los cambios $marca->save(); // Guarda los cambios
return redirect()->route('marca.index')->with('success', 'Marca actualizada correctamente.'); return redirect()->route('marca.index')->with('success', 'Marca actualizada correctamente.');
@ -88,17 +79,10 @@ class MarcaController extends Controller
*/ */
public function destroy($id) public function destroy($id)
{ {
// Encuentra la marca por ID $marca = Marca::findOrFail($id); // Encuentra la marca por ID
$marca = Marca::findOrFail($id); $marca->eliminado = 1; // Cambia el estado a inactivo
// Cambia el campo 'eliminado' a 1 (inactivo)
$marca->eliminado = 1; // Marca como inactiva
$marca->save(); // Guarda los cambios $marca->save(); // Guarda los cambios
// Redirige con un mensaje de éxito
return redirect()->route('marca.index')->with('success', 'Marca inactivada correctamente.'); return redirect()->route('marca.index')->with('success', 'Marca inactivada correctamente.');
} }
/**
* Recover the specified resource.
*/
} }

6
app/Models/Marca.php

@ -12,9 +12,9 @@ class Marca extends Model
protected $table = 'marcas'; protected $table = 'marcas';
protected $fillable = ['marcs_id']; protected $fillable = ['marca'];
public function Marc():HasOne{ /*public function Marc():HasOne{
return $this->hasOne(marc::class, 'id','marcs_id'); return $this->hasOne(marc::class, 'id','marcs_id');
} }*/
} }

36
database/migrations/2025_01_18_230913_create_marcs_table.php

@ -16,8 +16,40 @@ return new class extends Migration
$table->string('name'); $table->string('name');
$table->timestamps(); $table->timestamps();
}); });
DB::table('marcs')->insert(['name'=> 'chevorel']); DB::table('marcs')->insert([
DB::table('marcs')->insert(['name'=> 'nissan']); ['name' => 'chevrolet'],
['name' => 'nissan'],
['name' => 'ford'],
['name' => 'toyota'],
['name' => 'honda'],
['name' => 'bmw'],
['name' => 'audi'],
['name' => 'mercedes-benz'],
['name' => 'volkswagen'],
['name' => 'hyundai'],
['name' => 'kia'],
['name' => 'subaru'],
['name' => 'mazda'],
['name' => 'peugeot'],
['name' => 'renault'],
['name' => 'fiat'],
['name' => 'land rover'],
['name' => 'jaguar'],
['name' => 'tesla'],
['name' => 'porsche'],
['name' => 'volvo'],
['name' => 'mitsubishi'],
['name' => 'chrysler'],
['name' => 'dodge'],
['name' => 'jeep'],
['name' => 'buick'],
['name' => 'gmc'],
['name' => 'infiniti'],
['name' => 'lexus'],
['name' => 'acura'],
['name' => 'alfa romeo'],
// Agrega más marcas según sea necesario
]);
} }
/** /**

4
database/migrations/2025_02_28_192615_create_marcas_table.php

@ -13,9 +13,9 @@ return new class extends Migration
{ {
Schema::create('marcas', function (Blueprint $table) { Schema::create('marcas', function (Blueprint $table) {
$table->id(); $table->id();
$table->unsignedBigInteger('marcs_id'); $table->string('marca');
$table->timestamps(); $table->timestamps();
$table->foreign('marcs_id')->references('id')->on('marcs'); // funciona como enlace de una tabla a otra par agregar valores ya definidos $table->foreign('marcs_id')->references('id')->on('marcs');
}); });
} }

128
resources/views/marcas.blade.php

@ -2,7 +2,9 @@
@section('content') @section('content')
<div class="container mx-auto px-4 py-6"> <div class="container mx-auto px-4 py-6">
<!-- Encabezado -->
<!-- Mensajes de éxito y error -->
@if(session('success')) @if(session('success'))
<div id="success-message" class="bg-green-100 border border-green-400 text-green-700 px-4 py-3 rounded relative mb-4" role="alert"> <div id="success-message" class="bg-green-100 border border-green-400 text-green-700 px-4 py-3 rounded relative mb-4" role="alert">
<span class="block sm:inline">{{ session('success') }}</span> <span class="block sm:inline">{{ session('success') }}</span>
@ -18,15 +20,13 @@
<div class="bg-white rounded-lg shadow-lg"> <div class="bg-white rounded-lg shadow-lg">
<div class="p-4 border-b border-gray-200 flex justify-between items-center"> <div class="p-4 border-b border-gray-200 flex justify-between items-center">
<h2 class="text-2xl font-bold">Gestión de Marcas</h2> <h2 class="text-2xl font-bold">Gestión de Marcas</h2>
<a href="{{ route('marca.create') }}" <a href="{{ route('marca.create') }}" class="px-4 py-2 bg-blue-500 text-white rounded-lg hover:bg-blue-600 flex items-center gap-2">
class="px-4 py-2 bg-blue-500 text-white rounded-lg hover:bg-blue-600 flex items-center gap-2">
<i class="fas fa-plus"></i> <i class="fas fa-plus"></i>
Agregar Agregar
</a> </a>
</div> </div>
<!-- Barra de búsqueda -->
<!-- Barra de búsqueda --> <div class="p-4 border-b border-gray-200 bg-gray-50">
<div class="p-4 border-b border-gray-200 bg-gray-50">
<form action="{{ route('marca.index') }}" method="GET" class="flex gap-2"> <form action="{{ route('marca.index') }}" method="GET" class="flex gap-2">
<div class="relative w-full sm:w-64"> <div class="relative w-full sm:w-64">
<input type="text" <input type="text"
@ -39,7 +39,7 @@
</div> </div>
</div> </div>
<button type="submit" class="px-4 py-2 bg-blue-500 text-white rounded-lg hover:bg-blue-600"> <button type="submit" class="px-4 py-2 bg-blue-500 text-white rounded-lg hover:bg-blue-600">
Buscar/Actualizar Buscar
</button> </button>
@if(request('busqueda')) @if(request('busqueda'))
<a href="{{ route('marca.index') }}" class="px-4 py-2 bg-gray-500 text-white rounded-lg hover:bg-gray-600"> <a href="{{ route('marca.index') }}" class="px-4 py-2 bg-gray-500 text-white rounded-lg hover:bg-gray-600">
@ -55,6 +55,7 @@
<tr> <tr>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">ID</th> <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">ID</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Marca</th> <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Marca</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Acciones</th> <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Acciones</th>
</tr> </tr>
</thead> </thead>
@ -64,28 +65,42 @@
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">{{ $marca->id }}</td> <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">{{ $marca->id }}</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900"> <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">
<i class="fas fa-car text-blue-500 mr-2"></i> <i class="fas fa-car text-blue-500 mr-2"></i>
{{ $marca->Marc->name }} {{ $marca->marca }}
</td> </td>
<td class="px-6 py-4 whitespace-nowrap text-sm"> {{-- todo esto funciona para mostrar el estatus de tiempo real dela actividad
<div class="flex gap-2"> <td class="px-6 py-4 whitespace-nowrap text-sm">
<a href="#" @if($marca->eliminado == 0)
onclick="confirmarEdicion('{{ route('marca.edit', $marca->id) }}')" <span class="flex items-center">
class="text-blue-600 hover:text-blue-900"> <span class="h-2 w-2 bg-green-500 rounded-full mr-2"></span> Activo
<i class="fas fa-edit"></i> </span>
@else
<span class="flex items-center">
<span class="h-2 w-2 bg-red-500 rounded-full mr-2"></span> Inactivo
</span>
@endif
</td>--}}
<td class="flex space-x-2 px-6 py-4 whitespace-nowrap text-sm">
@if($marca->eliminado == 1)
<form action="{{ route('marca.update', $marca->id) }}" method="POST" class="d-inline">
@csrf
@method('PUT')
<input type="hidden" name="recuperar" value="1">
<a href="#" onclick="event.preventDefault(); this.closest('form').submit();" class="text-success">
<i class="fas fa-undo" style="color: green;"></i>
</a>
</form>
@else
<a href="{{ route('marca.edit', $marca->id) }}" class="text-warning">
<i class="fas fa-edit" style="color: orange;"></i>
</a> </a>
<form action="{{ route('marca.destroy', $marca->id) }}" <form action="{{ route('marca.destroy', $marca->id) }}" method="POST" class="d-inline">
method="POST"
class="inline"
onsubmit="return false;">
@csrf @csrf
@method('DELETE') @method('DELETE')
<button type="button" <a href="#" onclick="event.preventDefault(); this.closest('form').submit();" class="text-danger">
onclick="confirmarEliminacion(this)" <i class="fas fa-trash" style="color: red;"></i>
class="text-red-600 hover:text-red-900"> </a>
<i class="fas fa-trash"></i>
</button>
</form> </form>
</div> @endif
</td> </td>
</tr> </tr>
@endforeach @endforeach
@ -96,51 +111,26 @@
</div> </div>
<script> <script>
function confirmarEdicion(url) { // Desaparecer el mensaje después de 3 segundos
Swal.fire({ setTimeout(function() {
title: '¿Editar marca?', var message = document.getElementById('success-message');
text: "¿Estás seguro de que deseas editar esta marca?", if (message) {
icon: 'question', message.style.transition = 'opacity 0.5s ease';
showCancelButton: true, message.style.opacity = '0';
confirmButtonColor: '#3085d6', setTimeout(function() {
cancelButtonColor: '#d33', message.remove();
confirmButtonText: 'Sí, editar', }, 500); // Tiempo para remover el elemento después de la transición
cancelButtonText: 'Cancelar'
}).then((result) => {
if (result.isConfirmed) {
window.location.href = url;
} }
}); }, 3000); // Tiempo en milisegundos antes de comenzar a desaparecer
} setTimeout(function() {
var noResultsMessage = document.getElementById('no-results-message');
function confirmarEliminacion(button) { if (noResultsMessage) {
Swal.fire({ noResultsMessage.style.transition = 'opacity 0.5s ease';
title: '¿Estás seguro?', noResultsMessage.style.opacity = '0';
text: "Esta acción no se puede deshacer", setTimeout(function() {
icon: 'warning', noResultsMessage.remove();
showCancelButton: true, }, 500); // Tiempo para remover el elemento después de la transición
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: 'Sí, eliminar',
cancelButtonText: 'Cancelar'
}).then((result) => {
if (result.isConfirmed) {
button.closest('form').onsubmit = null;
button.closest('form').submit();
} }
}); }, 3000); // Tiempo en milisegundos antes de comenzar a desaparecer
}
// Desaparecer el mensaje después de 3 segundos
setTimeout(function() {
var message = document.getElementById('success-message');
if (message) {
message.style.transition = 'opacity 0.5s ease';
message.style.opacity = '0';
setTimeout(function() {
message.remove();
}, 500); // Tiempo para remover el elemento después de la transición
}
}, 3000); // Tiempo en milisegundos antes de comenzar a desaparecer
</script> </script>
@endsection @endsection

32
resources/views/marcasCrearEditar.blade.php

@ -30,7 +30,6 @@
</div> </div>
</div> </div>
@endif @endif
<!-- Formulario --> <!-- Formulario -->
<form id="marcaForm" <form id="marcaForm"
action="{{ isset($marca) ? route('marca.update', $marca->id) : route('marca.store') }}" action="{{ isset($marca) ? route('marca.update', $marca->id) : route('marca.store') }}"
@ -42,20 +41,31 @@
<div class="space-y-6"> <div class="space-y-6">
<!-- Campo Nombre --> <!-- Campo Nombre -->
<div class="mb-6"> <div>
<label for="marcs_id" class="block text-sm font-medium text-gray-700">Selecciona una Marca 🏷️</label> <label for="marca" class="block text-sm font-medium text-gray-700 mb-2">
<select name="marcs_id" id="marcs_id" class="mt-1 block w-full border border-gray-300 rounded-md shadow-sm focus:ring-blue-500 focus:border-blue-500" required> Nombre de la Marca
<option value="" disabled selected></option> </label>
@foreach($marcs as $marc) <div class="relative rounded-md shadow-sm">
<option value="{{ $marc->id }}">{{ $marc->name }}</option> <div class="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none">
@endforeach <i class="fas fa-tag text-gray-400"></i>
</select> </div>
<input type="text"
name="marca"
id="marca"
class="block w-full pl-10 pr-3 py-2 border border-gray-300 rounded-md focus:ring-2 focus:ring-blue-500 focus:border-blue-500"
required
placeholder="Ingresa el nombre de la marca"
value="{{ isset($marca) ? $marca->marca : old('marca') }}">
</div>
@error('marca')
<p class="mt-1 text-sm text-red-600">{{ $message }}</p>
@enderror
</div> </div>
<!-- Botones de acción --> <!-- Botones de acción -->
<div class="flex justify-end space-x-2 pt-4 border-t border-gray-200"> <div class="flex justify-end space-x-2 pt-4 border-t border-gray-200">
<a href="{{ route('marca.index') }}" <a href="{{ route('marca.index') }}"
class="px-4 py-2 border border-gray-300 rounded-md text-sm font-medium text-gray-700 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500"> class="px-4 py-2 border border-gray-300 rounded-md text-sm font-medium text-gray-700 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500">
Cancelar Cancelar
</a> </a>
<button type="submit" <button type="submit"
@ -69,4 +79,4 @@
</div> </div>
</div> </div>
</div> </div>
@endsection @endsection
Loading…
Cancel
Save