From d8ae8c88940ddc940f48c89debbeaa81b17a9141 Mon Sep 17 00:00:00 2001 From: Javi Date: Sat, 25 Oct 2025 11:29:20 +0200 Subject: [PATCH] =?UTF-8?q?mejoras=20en=20la=20gesti=C3=B3n=20de=20proyect?= =?UTF-8?q?os=20y=20documentos:=20se=20a=C3=B1aden=20nuevos=20campos=20y?= =?UTF-8?q?=20validaciones=20para=20optimizar=20la=20organizaci=C3=B3n=20y?= =?UTF-8?q?=20el=20seguimiento=20de=20los=20mismos.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/CompanyContactController.php | 53 ++ app/Http/Controllers/CompanyController.php | 143 +++ app/Http/Controllers/ProjectController.php | 40 +- app/Http/Controllers/UserController.php | 6 +- app/Models/Company.php | 65 ++ app/Models/Project.php | 7 +- app/Models/User.php | 13 + app/View/Components/Accordion.php | 6 +- ...25_05_30_163615_create_companies_table.php | 39 + ...1_224101_create_company_contacts_table.php | 32 + ...pdate_users_and_projects_for_companies.php | 51 ++ .../js/pdfjs-5.2.133-dist/web/viewer.mjs | 2 +- resources/views/companies/form.blade.php | 286 ++++++ resources/views/companies/index.blade.php | 91 ++ resources/views/companies/layout.blade.php | 39 + resources/views/companies/show.blade.php | 362 ++++++++ .../views/components/accordion-item.blade.php | 34 + .../views/components/accordion.blade.php | 19 + .../views/components/folder-item.blade.php | 11 +- .../views/components/stats-card.blade.php | 16 +- resources/views/dashboard.blade.php | 2 +- resources/views/documents/show.blade.php | 853 +++++++----------- .../views/livewire/project/show.blade.php | 409 ++++++--- resources/views/livewire/user-table.blade.php | 190 ++-- resources/views/projects/create.blade.php | 29 +- resources/views/projects/index.blade.php | 43 +- resources/views/users/create.blade.php | 23 +- resources/views/users/show.blade.php | 40 +- routes/web.php | 6 +- 29 files changed, 2054 insertions(+), 856 deletions(-) create mode 100644 app/Http/Controllers/CompanyContactController.php create mode 100644 app/Http/Controllers/CompanyController.php create mode 100644 app/Models/Company.php create mode 100644 database/migrations/2025_05_30_163615_create_companies_table.php create mode 100644 database/migrations/2025_05_31_224101_create_company_contacts_table.php create mode 100644 database/migrations/2025_06_06_165146_update_users_and_projects_for_companies.php create mode 100644 resources/views/companies/form.blade.php create mode 100644 resources/views/companies/index.blade.php create mode 100644 resources/views/companies/layout.blade.php create mode 100644 resources/views/companies/show.blade.php create mode 100644 resources/views/components/accordion-item.blade.php create mode 100644 resources/views/components/accordion.blade.php diff --git a/app/Http/Controllers/CompanyContactController.php b/app/Http/Controllers/CompanyContactController.php new file mode 100644 index 0000000..d27efbb --- /dev/null +++ b/app/Http/Controllers/CompanyContactController.php @@ -0,0 +1,53 @@ +validate([ + 'user_id' => 'required|exists:users,id', + 'position' => 'nullable|string|max:100' + ]); + + // Evitar duplicados + if (!$company->contacts()->where('user_id', $request->user_id)->exists()) { + $company->contacts()->attach($request->user_id, [ + 'position' => $request->position + ]); + + return redirect()->back() + ->with('success', 'Contacto agregado exitosamente'); + } + + return redirect()->back() + ->with('error', 'Este contacto ya está asociado a la empresa'); + } + + public function update(Request $request, Company $company, User $contact) + { + $request->validate([ + 'position' => 'nullable|string|max:100' + ]); + + $company->contacts()->updateExistingPivot($contact->id, [ + 'position' => $request->position + ]); + + return redirect()->back() + ->with('success', 'Cargo del contacto actualizado'); + } + + public function destroy(Company $company, User $contact) + { + $company->contacts()->detach($contact->id); + + return redirect()->back() + ->with('success', 'Contacto eliminado de la empresa'); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/CompanyController.php b/app/Http/Controllers/CompanyController.php new file mode 100644 index 0000000..c50e960 --- /dev/null +++ b/app/Http/Controllers/CompanyController.php @@ -0,0 +1,143 @@ +paginate(10); + return view('companies.index', compact('companies')); + } + + /** + * Show the form for creating a new resource. + */ + public function create() + { + return view('companies.form'); + } + + /** + * Store a newly created resource in storage. + */ + public function store(Request $request) + { + $validated = $request->validate([ + 'name' => 'required|string|max:255', + 'commercial_name' => 'required|string|max:255', + 'status' => 'required|in:active,closed', + 'address' => 'nullable|string|max:255', + 'postal_code' => 'nullable|string|max:10', + 'city' => 'nullable|string|max:100', + 'country' => 'nullable|string|max:100', + 'phone' => 'nullable|string|max:20', + 'email' => 'nullable|email|max:255', + 'cif' => 'nullable|string|max:20', + 'logo' => 'nullable|image|max:2048|mimes:jpg,jpeg,png,gif', + ]); + + // Manejar la carga del logo + if ($request->hasFile('logo')) { + $validated['logo'] = $request->file('logo')->store('companies/logos', 'public'); + } + + Company::create($validated); + + return redirect()->route('companies.index') + ->with('success', 'Empresa creada exitosamente.'); + } + + /** + * Display the specified resource. + */ + public function show(Company $company) + { + $company->load(['contacts' => function($query) { + $query->withPivot('position'); + }]); + + $contacts = $company->contacts()->paginate(5); + $projects = $company->contacts()->paginate(5);//$company->projects()->paginate(5); + $availableUsers = User::whereDoesntHave('companies', function($query) use ($company) { + $query->where('company_id', $company->id); + })->get(); + + return view('companies.show', compact('company', 'contacts', 'projects', 'availableUsers')); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(Company $company) + { + + return view('companies.form', compact('company')); + } + + /** + * Update the specified resource in storage. + */ + public function update(Request $request, Company $company) + { + $validated = $request->validate([ + 'name' => 'required|string|max:255', + 'commercial_name' => 'required|string|max:255', + 'status' => 'required|in:active,closed', + 'address' => 'nullable|string|max:255', + 'postal_code' => 'nullable|string|max:10', + 'city' => 'nullable|string|max:100', + 'country' => 'nullable|string|max:100', + 'phone' => 'nullable|string|max:20', + 'email' => 'nullable|email|max:255', + 'cif' => 'nullable|string|max:20', + 'logo' => 'nullable|image|max:2048|mimes:jpg,jpeg,png,gif', + ]); + + // Manejar la actualización del logo + if ($request->hasFile('logo')) { + // Eliminar el logo anterior si existe + if ($company->logo && Storage::disk('public')->exists($company->logo)) { + Storage::disk('public')->delete($company->logo); + } + $validated['logo'] = $request->file('logo')->store('companies/logos', 'public'); + } elseif ($request->has('remove_logo')) { + // Eliminar el logo si se seleccionó la opción de eliminar + if ($company->logo && Storage::disk('public')->exists($company->logo)) { + Storage::disk('public')->delete($company->logo); + } + $validated['logo'] = null; + } else { + // Mantener el logo existente + $validated['logo'] = $company->logo; + } + + $company->update($validated); + + return redirect()->route('companies.index') + ->with('success', 'Empresa actualizada exitosamente.'); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(Company $company) + { + // Eliminar el logo si existe + if ($company->logo && Storage::disk('public')->exists($company->logo)) { + Storage::disk('public')->delete($company->logo); + } + + $company->delete(); + + return redirect()->route('companies.index') + ->with('success', 'Empresa eliminada exitosamente.'); + } +} diff --git a/app/Http/Controllers/ProjectController.php b/app/Http/Controllers/ProjectController.php index 0bdd567..75cc138 100644 --- a/app/Http/Controllers/ProjectController.php +++ b/app/Http/Controllers/ProjectController.php @@ -19,8 +19,8 @@ class ProjectController extends Controller public function index() { $projects = auth()->user()->hasRole('admin') - ? Project::get() // Todos los proyectos para admin - : auth()->user()->projects()->latest()->get(); // Solo proyectos asignados + ? Project::get() // Todos los proyectos para admin + : auth()->user()->projects()->latest()->get(); // Solo proyectos asignados /* $projects = Project::whereHas('users', function($query) { @@ -43,6 +43,7 @@ class ProjectController extends Controller 'project' => $project, 'categories' => Category::orderBy('name')->get(), 'users' => User::where('id', '!=', auth()->id())->get(), + 'companies' => \App\Models\Company::all(), // Pass companies to the view ]); } @@ -65,9 +66,8 @@ class ProjectController extends Controller 'start_date' => 'nullable|date', 'deadline' => 'nullable|date|after:start_date', 'categories' => 'nullable|array|exists:categories,id', - //'categories' => 'required|array', - //'categories.*' => 'exists:categories,id', 'project_image_path' => 'nullable|string', + 'company_id' => 'required|exists:companies,id', // Validate company_id ]); @@ -82,8 +82,8 @@ class ProjectController extends Controller $tempPath = $request->project_image_path; $newPath = 'images/projects/' . basename($tempPath); - Storage::move($tempPath, $newPath); // Mover el archivo - $validated['project_image_path'] = $newPath; // Actualizar path + Storage::move($tempPath, $newPath); // Mover el archivo + $validated['project_image_path'] = $newPath; // Actualizar path } // Crear el proyecto con todos los datos validados @@ -111,6 +111,7 @@ class ProjectController extends Controller 'project' => $project, 'categories' => Category::orderBy('name')->get(), 'users' => User::where('id', '!=', auth()->id())->get(), + 'companies' => \App\Models\Company::all(), // Pass companies to the view ]); } @@ -135,8 +136,31 @@ class ProjectController extends Controller public function update(Request $request, Project $project) { $this->authorize('update', $project); - // Lógica de actualización - $project->update($request->all()); + + $validated = $request->validate([ + 'reference' => 'required|string|max:255', + 'name' => 'required|string|max:255', + 'description' => 'nullable|string', + 'status' => 'required|in:Activo,Inactivo', + 'address' => 'nullable|string|max:255', + 'province' => 'nullable|string|max:100', + 'country' => 'nullable|string|size:2', + 'postal_code' => 'nullable|string|max:10', + 'latitude' => 'required|numeric|between:-90,90', + 'longitude' => 'required|numeric|between:-180,180', + 'start_date' => 'nullable|date', + 'deadline' => 'nullable|date|after:start_date', + 'categories' => 'nullable|array|exists:categories,id', + 'project_image_path' => 'nullable|string', + 'company_id' => 'required|exists:companies,id', // Validate company_id + ]); + + $project->update($validated); + + if ($request->has('categories')) { + $project->categories()->sync($request->categories); + } + return redirect()->route('projects.show', $project)->with('success', 'Project updated successfully.'); } diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index e0645f4..1dbf610 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -65,6 +65,8 @@ class UserController extends Controller 'email' => 'required|email|unique:users', 'phone' => 'nullable|string|max:20', 'address' => 'nullable|string|max:255', + 'user_type' => 'required|integer|in:0,1,2', + 'company_id' => 'nullable|exists:companies,id', // Si se usa una relación con empresas 'profile_photo_path' => 'nullable|string' // Ruta de la imagen subida por Livewire ]); @@ -80,7 +82,9 @@ class UserController extends Controller 'address' => $validated['address'], 'access_start' => $validated['start_date'], 'access_end' => $validated['end_date'], - 'is_active' => true, + 'is_active' => $validated['is_active'] ?? false, // Por defecto, inactivo + 'user_type' => $validated['user_type'] ?? 0, // 0: Usuario, 1: Administrador, 2: Super Admin + 'company_id' => $validated['company_id'] ?? null, // Si se usa una relación con empresas 'profile_photo_path' => $validated['profile_photo_path'] ?? null ]); diff --git a/app/Models/Company.php b/app/Models/Company.php new file mode 100644 index 0000000..e77670c --- /dev/null +++ b/app/Models/Company.php @@ -0,0 +1,65 @@ + 'datetime:d/m/Y H:i', + 'updated_at' => 'datetime:d/m/Y H:i', + ]; + + public function getStatusColorAttribute() + { + return [ + 'active' => 'bg-green-100 text-green-800', + 'closed' => 'bg-red-100 text-red-800', + ][$this->status] ?? 'bg-gray-100 text-gray-800'; + } + + public function getStatusTextAttribute() + { + return [ + 'active' => 'Activo', + 'closed' => 'Cerrado', + ][$this->status] ?? 'Desconocido'; + } + + public function contacts(): BelongsToMany + { + return $this->belongsToMany(User::class, 'company_contacts') + ->withPivot('position') + ->withTimestamps(); + } + + public function users() + { + return $this->hasMany(User::class); + } + + public function projects() + { + return $this->hasMany(Project::class); + } +} diff --git a/app/Models/Project.php b/app/Models/Project.php index f0c80b0..b3b3258 100644 --- a/app/Models/Project.php +++ b/app/Models/Project.php @@ -8,6 +8,7 @@ use Illuminate\Database\Eloquent\Model; class Project extends Model { protected $fillable = [ + 'reference', 'name', 'description', 'creator_id', @@ -22,6 +23,7 @@ class Project extends Model 'icon', 'start_date', 'deadline', + 'company_id', // Agrega cualquier otro campo nuevo aquí ]; @@ -81,5 +83,8 @@ class Project extends Model return $this->belongsToMany(Category::class); } - + public function company() + { + return $this->belongsTo(Company::class); + } } diff --git a/app/Models/User.php b/app/Models/User.php index 38d0396..630bb60 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -10,6 +10,7 @@ use Illuminate\Notifications\Notifiable; use Illuminate\Support\Facades\Storage; use Illuminate\Support\Str; use Spatie\Permission\Traits\HasRoles; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; class User extends Authenticatable { @@ -109,5 +110,17 @@ class User extends Authenticatable { return $this->profile_photo ? Storage::url($this->profile_photo) : asset('images/default-user.png'); } + + public function companies(): BelongsToMany + { + return $this->belongsToMany(Company::class, 'company_contacts') + ->withPivot('position') + ->withTimestamps(); + } + + public function company() + { + return $this->belongsTo(Company::class); + } } diff --git a/app/View/Components/Accordion.php b/app/View/Components/Accordion.php index 8054430..7a80638 100644 --- a/app/View/Components/Accordion.php +++ b/app/View/Components/Accordion.php @@ -21,6 +21,10 @@ class Accordion extends Component */ public function render(): View|Closure|string { - return view('components.accordion'); + return <<<'blade' +
+ +
+blade; } } diff --git a/database/migrations/2025_05_30_163615_create_companies_table.php b/database/migrations/2025_05_30_163615_create_companies_table.php new file mode 100644 index 0000000..f08ac3c --- /dev/null +++ b/database/migrations/2025_05_30_163615_create_companies_table.php @@ -0,0 +1,39 @@ +id(); + $table->string('name'); // Nombre legal + $table->string('commercial_name'); // Apodo comercial + $table->enum('status', ['active', 'closed'])->default('active'); + $table->string('address')->nullable(); + $table->string('postal_code')->nullable(); + $table->string('city')->nullable(); + $table->string('country')->nullable(); + $table->string('phone')->nullable(); + $table->string('email')->nullable(); + $table->string('cif')->nullable(); // Código de identificación fiscal + $table->string('logo')->nullable(); // Ruta del logo + $table->timestamps(); + $table->softDeletes(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('companies'); + } +}; diff --git a/database/migrations/2025_05_31_224101_create_company_contacts_table.php b/database/migrations/2025_05_31_224101_create_company_contacts_table.php new file mode 100644 index 0000000..4a8e3e8 --- /dev/null +++ b/database/migrations/2025_05_31_224101_create_company_contacts_table.php @@ -0,0 +1,32 @@ +id(); + $table->foreignId('company_id')->constrained()->onDelete('cascade'); + $table->foreignId('user_id')->constrained()->onDelete('cascade'); + $table->string('position')->nullable(); + $table->timestamps(); + + $table->unique(['company_id', 'user_id']); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('company_contacts'); + } +}; diff --git a/database/migrations/2025_06_06_165146_update_users_and_projects_for_companies.php b/database/migrations/2025_06_06_165146_update_users_and_projects_for_companies.php new file mode 100644 index 0000000..1ea5307 --- /dev/null +++ b/database/migrations/2025_06_06_165146_update_users_and_projects_for_companies.php @@ -0,0 +1,51 @@ +unsignedSmallInteger('user_type')->default(false)->after('remember_token'); + + // 2. Agregar company_id como nullable con constrained correcto + $table->foreignId('company_id') + ->nullable() + ->after('user_type') + ->constrained('companies'); // Especificar tabla explícitamente + }); + + Schema::table('projects', function (Blueprint $table) { + $table->foreignId('company_id') + ->constrained('companies'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + // 5. Eliminar restricción de clave foránea primero + $table->dropForeign(['company_id']); + + // 6. Eliminar columnas en orden inverso + $table->dropColumn('company_id'); + $table->dropColumn('user_type'); + }); + + Schema::table('projects', function (Blueprint $table) { + // 7. Eliminar restricción antes de la columna + $table->dropForeign(['company_id']); + $table->dropColumn('company_id'); + }); + } +}; diff --git a/resources/js/pdfjs-5.2.133-dist/web/viewer.mjs b/resources/js/pdfjs-5.2.133-dist/web/viewer.mjs index e7f2f38..86c419a 100644 --- a/resources/js/pdfjs-5.2.133-dist/web/viewer.mjs +++ b/resources/js/pdfjs-5.2.133-dist/web/viewer.mjs @@ -896,7 +896,7 @@ const defaultOptions = { }; { defaultOptions.defaultUrl = { - value: "./compressed.tracemonkey-pldi-09.pdf", + value: "compressed.tracemonkey-pldi-09.pdf", kind: OptionKind.VIEWER }; defaultOptions.sandboxBundleSrc = { diff --git a/resources/views/companies/form.blade.php b/resources/views/companies/form.blade.php new file mode 100644 index 0000000..77587b1 --- /dev/null +++ b/resources/views/companies/form.blade.php @@ -0,0 +1,286 @@ +@extends('companies.layout') + +@section('company-content') + + + +
+
+ +

+ {{ (isset($company) && $company->id) ? 'Editar Empresa' : 'Nueva Empresa' }} +

+
+

+ @if(isset($user) && $user->id) + Modifique los campos necesarios para actualizar la información del usuario. + @else + Complete todos los campos obligatorios para registrar un nuevo usuario en el sistema. + @endisset +

+
+ +
+ @csrf + @if(isset($company)) + @method('PUT') + @endif + + +
+
+
+
+
+ Datos Personales +
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + @error('name') +

{{ $message }}

+ @enderror +
+ + + + @error('commercial_name') +

{{ $message }}

+ @enderror +
+ + + + @error('cif') +

{{ $message }}

+ @enderror +
+ + + + @error('status') +

{{ $message }}

+ @enderror +
+
+ + +
+
+
+
+
+ Configuración de acceso +
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + @error('address') +

{{ $message }}

+ @enderror +
+ + + + @error('postal_code') +

{{ $message }}

+ @enderror +
+ + + + @error('city') +

{{ $message }}

+ @enderror +
+ + + + @error('country') +

{{ $message }}

+ @enderror +
+ + + + @error('phone') +

{{ $message }}

+ @enderror +
+ + + + @error('email') +

{{ $message }}

+ @enderror +
+ + + + @error('logo') +

{{ $message }}

+ @enderror + + @if(isset($company) && $company->logo) +
+ Logo actual +
+ +
+
+ @endif +
+
+ +
+ + Cancelar + + +
+ +
+@endsection \ No newline at end of file diff --git a/resources/views/companies/index.blade.php b/resources/views/companies/index.blade.php new file mode 100644 index 0000000..aef8156 --- /dev/null +++ b/resources/views/companies/index.blade.php @@ -0,0 +1,91 @@ +@extends('companies.layout') + +@section('company-content') +
+
+

Listado de Empresas

+ + Nueva Empresa + +
+ +
+ + + + + + + + + + + + @forelse($companies as $company) + + + + + + + + @empty + + + + @endforelse + +
NombreNombre ComercialEstadoCIFAcciones
+
+ @if($company->logo) + {{ $company->name }} + @else +
+ @endif +
+
{{ $company->name }}
+
{{ $company->email }}
+
+
+
+ {{ $company->commercial_name }} + + + {{ $company->status_text }} + + + {{ $company->cif }} + +
+ + + + + + +
+ @csrf + @method('DELETE') + +
+
+
+ No se han encontrado empresas +
+
+ +
+ {{ $companies->links() }} +
+
+@endsection \ No newline at end of file diff --git a/resources/views/companies/layout.blade.php b/resources/views/companies/layout.blade.php new file mode 100644 index 0000000..eb0757a --- /dev/null +++ b/resources/views/companies/layout.blade.php @@ -0,0 +1,39 @@ + + + @if(session('success')) +
+ {{ session('success') }} +
+ @endif + + @yield('company-content') + + + + @push('sidebar-menu') + + + + + {{ __('List companies') }} + + + + {{ __('Create new company') }} + + + + + + + @endpush + +
diff --git a/resources/views/companies/show.blade.php b/resources/views/companies/show.blade.php new file mode 100644 index 0000000..01e677e --- /dev/null +++ b/resources/views/companies/show.blade.php @@ -0,0 +1,362 @@ +@extends('companies.layout') + +@section('company-content') + + +
+ +
+ + + + +
+

+ {{ $company->name }} +

+ + +
+ @if($company->commercial_name ) +
+

+ {{ $company->commercial_name }} +

+
+ @endif + + @if($company->address ) +
+ +

+ {{ $company->address }} +

+
+ @endif + + @if($company->email) + + @endif + + @if($company->phone) + + @endif +
+
+
+ + +
+ +
+ + + + + @if(true) + + + @endif + + @if(true) + + + @endif +
+ + + + {{ $company->status_text}} + +
+
+ + +
+ +
+ +
+ +
+ +
+
+ + + @foreach(['name' => 'Nombre', 'commercial_name' => 'Nombre Comercial', 'cif' => 'CIF/NIF', 'created_at' => 'Creado el', 'updated_at' => 'Última actualización'] as $field => $label) + + + + + @endforeach + +
{{ $label }} + {{ $company->$field ?? 'N/A' }} +
+
+ +
+ + + + + Editar + + + {{-- Formulario de Edición --}} +
+ @csrf + @method('PUT') + +
+ + {{-- Formulario de Eliminación --}} +
+ @csrf + @method('DELETE') + +
+
+
+ + +
+
+

Contactos de la Empresa

+ +
+ + @if($contacts->isEmpty()) +
+

No hay contactos asociados a esta empresa.

+ +
+ @else +
+ + + + + + + + + + + + @foreach($contacts as $contact) + + + + + + + + @endforeach + +
NombreCargoEmailTeléfonoAcciones
+
+
+ {{ $contact->name }} +
+
+
{{ $contact->name }}
+
+
+
+ {{ $contact->pivot->position }} + + {{ $contact->email }} + + {{ $contact->phone ?? 'N/A' }} + + + +
+
+ +
+ {{ $contacts->links() }} +
+ @endif +
+ + +
+
+

Proyectos de la Empresa

+ + Nuevo Proyecto + +
+ + @if($projects->isEmpty()) +
+

No hay proyectos asociados a esta empresa.

+ + Crear Proyecto + +
+ @else +
+ @foreach($projects as $project) +
+
+
+
{{ $project->name }}
+ + {{ $project->status === 'active' ? 'Activo' : 'Completado' }} + +
+ +

+ {{ $project->description }} +

+ +
+ + + {{ $project->created_at->format('d M Y') }} - + {{ $project->due_date?->format('d M Y') ?? 'Sin fecha límite' }} + +
+ +
+
+ + + {{ $project->users_count }} miembros + +
+ + + Ver detalles + +
+
+
+ @endforeach +
+ +
+ {{ $projects->links('pagination::tailwind', ['pageName' => 'projects_page']) }} +
+ @endif +
+
+
+ + @vite([ 'resources/js/pdfjs-5.2.133-dist/build/pdf.mjs', 'resources/js/pdfjs-5.2.133-dist/web/viewer.mjs', 'resources/js/pdfjs-5.2.133-dist/web/viewer.css' ]) - @endpush - - + @endpush diff --git a/resources/views/livewire/project/show.blade.php b/resources/views/livewire/project/show.blade.php index daa8810..42d9504 100644 --- a/resources/views/livewire/project/show.blade.php +++ b/resources/views/livewire/project/show.blade.php @@ -1,142 +1,309 @@
-
-
-
- -

{{ $project->name }}

+
+ +
+ + + + +
+

+ {{ $project->name }} +

+ + +
+
+

+ {{ $project->reference }} +

+
+ + @if($project->phone) + + @endif +
- - - - - Editar - +
+ + +
+ +
+ + + + + + +
+ + + + {{ $project->is_active ? 'Activo' : 'Inactivo' }} +
+
Subiendo archivos...
- -
- -
-
- - - -
- -
-
+ + + +
- -
- -
-
-
    - @foreach($project->rootFolders as $folder) - - @endforeach -
+ +
+ +
+ +
+ +
+
+ + + @foreach(['name' => 'Nombre', 'last_name' => 'Apellido', 'email' => 'Email', 'phone' => 'Teléfono', 'created_at' => 'Fecha Registro'] as $field => $label) + + + + + @endforeach + +
{{ $label }} + {{ $project->$field ?? 'N/A' }} +
+
+
+ +
+
+

Descripción

+
+ {!! $project->description ? $project->description : '

N/A

' !!} +
+
+
+
+ + +
+ + + + + Editar + + + {{-- Formulario de Edición --}} +
+ @csrf + @method('PUT') + +
+ + {{-- Formulario de Eliminación --}} +
+ @csrf + @method('DELETE') + +
+ + +
+
- -
-
- - - - - - - - - - - @forelse($this->documents as $document) - - - - - - - @empty - - - - @endforelse - -
Nombre - javiVersionesÚltima ActualizaciónEstado
- - {{ $document->versions_count }} - - {{ $document->updated_at->diffForHumans() }} - - -
- No se encontraron documentos en esta carpeta -
+
+
+ +
+ + + + + + + + + + + @forelse($this->documents as $document) + + + + + + + @empty + + + + @endforelse + +
Nombre - javiVersionesÚltima ActualizaciónEstado
+ + + {{ $document->versions_count }} + + {{ $document->updated_at->diffForHumans() }} + + +
+ No se encontraron documentos en esta carpeta +
+
+
+
diff --git a/resources/views/livewire/user-table.blade.php b/resources/views/livewire/user-table.blade.php index e8bc36d..47c91e2 100644 --- a/resources/views/livewire/user-table.blade.php +++ b/resources/views/livewire/user-table.blade.php @@ -7,11 +7,11 @@
+ class="absolute bg-white shadow-lg rounded-lg p-4 mt-2 min-w-[200px] z-10"> @foreach($available_columns as $key => $label) @endforeach @@ -61,120 +61,96 @@ @endif @endif @endforeach - - Acciones @foreach($users as $user) - @if($columns['full_name']) - - - - @if($user->profile_photo_path) -
- {{ $user->full_name }} -
- @else -
- -
- @endif - - - - {{ $user->full_name }} - @if(!$user->is_active) - (Inactivo) - @endif - + + @foreach($available_columns as $key => $label) + @if($columns[$key]) + + @switch($key) + @case('full_name') +
+ @if($user->profile_photo_path) +
+ {{ $user->full_name }} +
+ @else +
+ +
+ @endif + + + {{ $user->full_name }} + @if(!$user->is_active) + (Inactivo) + @endif + +
+ @break + + @case('email') +
+ + + + {{ $user->email }} +
+ @break + + @case('phone') +
+ + + + {{ $user->phone ?? 'N/A' }} +
+ @break + + @case('access_start') + {{ $user->access_start?->format('d/m/Y') ?? 'N/A' }} + @break + + @case('created_at') + {{ $user->created_at->format('d/m/Y H:i') }} + @break + + @case('is_active') + {{ $user->is_active ? 'Activo' : 'Inactivo' }} + @break + + @default + {{ $user->$key ?? 'N/A' }} + @endswitch + + @endif + @endforeach + + + +
+ + + - - @endif - - - @if($columns['username']) - {{ $user->username }} - @else - N/A - @endif - - - - @if($columns['email']) - -
- - - - {{ $user->email }} -
- @else - N/A - @endif - - - - @if($columns['phone']) - -
- - - - {{ $user->phone ?? 'N/A' }} -
- @else - N/A - @endif - - - - @if($columns['access_start']) - {{ $user->access_start?->format('d/m/Y') }} - @else - N/A - @endif - - - - @if($columns['created_at']) - {{ $user->created_at->format('d/m/Y H:i') }} - @else - N/A - @endif - - - - @if($columns['is_active']) - {{ $user->is_active ? 'Activo' : 'Inactivo' }} - @else - N/A - @endif - - - - -
- - - - - - + + - -
+ +
@endforeach diff --git a/resources/views/projects/create.blade.php b/resources/views/projects/create.blade.php index 606bc7e..4c5ad27 100644 --- a/resources/views/projects/create.blade.php +++ b/resources/views/projects/create.blade.php @@ -65,14 +65,36 @@
- + + + + + + +
+ + + + @error('company_id') +

{{ $message }}

+ @enderror +
-
- + @error('name') diff --git a/resources/views/projects/index.blade.php b/resources/views/projects/index.blade.php index 1d066c0..b3b81a8 100644 --- a/resources/views/projects/index.blade.php +++ b/resources/views/projects/index.blade.php @@ -25,7 +25,7 @@
@forelse($projects as $project) -
+
@if($project->project_image_path) @endif -
+

@@ -42,10 +42,15 @@ {{ $project->name }}

+ + {{ $project->reference }} +

- {{ Str::limit($project->description, 100) }} + {{ Str::limit(strip_tags($project->description), 200) }}

+