Forráskód Böngészése

Added final solution

AItEKS 2 hete
szülő
commit
79804ecb76

+ 28 - 5
form-app-with-data/app/Http/Controllers/FormController.php

@@ -7,6 +7,8 @@ use Illuminate\Support\Facades\File;
 use Carbon\Carbon;
 
 use App\Models\ContactMessage;
+use App\Models\Category;
+use App\Models\Status;
 
 class FormController extends Controller
 {
@@ -19,7 +21,9 @@ class FormController extends Controller
     
     public function index() 
     {
-        return view('form');
+        $categories = Category::all();
+
+        return view('form', compact('categories'));
     }
 
     public function submit(Request $request)
@@ -27,8 +31,14 @@ class FormController extends Controller
         $validated = $request->validate([
             'name' => 'required|string|min:3|max:15',
             'email' => 'required|email|max:50',
-            'message' => 'required|string|min:10|max:100'
+            'message' => 'required|string|min:10|max:100',
+            'category_id' => 'required|exists:categories,id',
         ]);
+        
+        $newStatus = Status::where('name', 'Новое')->first();
+        if ($newStatus) {
+            $validated['status_id'] = $newStatus->id;
+        }
 
         ContactMessage::create($validated);
 
@@ -37,7 +47,7 @@ class FormController extends Controller
 
     public function showData() 
     {
-        $submissions = ContactMessage::latest()->get();
+        $submissions = ContactMessage::with('category', 'status')->new()->latest()->get();
 
         return view('admin.index', compact('submissions'));
     }
@@ -49,7 +59,10 @@ class FormController extends Controller
 
     public function edit(ContactMessage $submission)
     {
-        return view('admin.edit', compact('submission'));
+        $categories = Category::all();
+        $statuses = Status::all();
+
+        return view('admin.edit', compact('submission', 'categories', 'statuses'));
     }
 
     public function update(Request $request , ContactMessage $submission)
@@ -57,7 +70,8 @@ class FormController extends Controller
         $validated = $request->validate([
             'name' => 'required|string|min:3|max:15',
             'email' => 'required|email|max:50',
-            'message' => 'required|string|min:10|max:100'
+            'message' => 'required|string|min:10|max:100',
+            'status_id' => 'required|exists:statuses,id',
         ]);
 
         $submission->update($validated);
@@ -65,6 +79,15 @@ class FormController extends Controller
         return redirect()->route('admin.index')->with('success', 'Данные обновлены!');
     }
 
+    public function addNote(Request $request, ContactMessage $submission)
+    {
+        $request->validate(['body' => 'required|string']);
+
+        $submission->notes()->create($request->only('body'));
+
+        return back()->with('success', 'Заметка добавлена!');
+    }
+
     public function delete(ContactMessage $submission)
     {
         $submission -> delete();

+ 29 - 0
form-app-with-data/app/Http/Resources/ContactMessageResource.php

@@ -0,0 +1,29 @@
+<?php
+
+namespace App\Http\Resources;
+
+use Illuminate\Http\Request;
+use Illuminate\Http\Resources\Json\JsonResource;
+
+class ContactMessageResource extends JsonResource
+{
+    /**
+     * Transform the resource into an array.
+     *
+     * @return array<string, mixed>
+     */
+    public function toArray(Request $request): array
+    {
+        return [
+            'id' => $this->id,
+            'sender_name' => $this->name,
+            'sender_email' => $this->email,
+            'message_body' => $this->message,
+            'submitted_at' => $this->created_at->format('Y-m-d H:i:s'),
+            
+            'category' => new CategoryResource($this->whenLoaded('category')),
+            'status' => new StatusResource($this->whenLoaded('status')),
+            'notes' => NoteResource::collection($this->whenLoaded('notes')),
+        ];
+    }
+}

+ 14 - 0
form-app-with-data/app/Models/Category.php

@@ -0,0 +1,14 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class Category extends Model
+{
+    use HasFactory;
+    protected $fillable = ['name'];
+    
+    public function contactMessages() { return $this->hasMany(ContactMessage::class); }
+}

+ 24 - 1
form-app-with-data/app/Models/ContactMessage.php

@@ -5,6 +5,7 @@ namespace App\Models;
 use Illuminate\Database\Eloquent\Factories\HasFactory;
 use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Eloquent\SoftDeletes;
+use Illuminate\Database\Eloquent\Builder;
 
 class ContactMessage extends Model
 {
@@ -16,7 +17,29 @@ class ContactMessage extends Model
         'name',
         'email',
         'message',
+        'category_id',
+        'status_id',
     ];
+    
+    public function scopeNew(Builder $query): void
+    {
+        $query->whereHas('status', function ($q) {
+            $q->where('name', 'Новое');
+        });
+    }
 
-    protected $dates = ['deleted_at'];
+    public function category()
+    {
+        return $this->belongsTo(Category::class);
+    }
+
+    public function status()
+    {
+        return $this->belongsTo(Status::class);
+    }
+
+    public function notes()
+    {
+        return $this->morphMany(Note::class, 'noteable');
+    }
 }

+ 14 - 0
form-app-with-data/app/Models/Note.php

@@ -0,0 +1,14 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+
+class Note extends Model
+{
+    use HasFactory;
+    protected $fillable = ['body'];
+    
+    public function noteable() { return $this->morphTo(); }
+}

+ 16 - 0
form-app-with-data/app/Models/Status.php

@@ -0,0 +1,16 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+
+class Status extends Model
+{
+    use HasFactory;
+    protected $fillable = ['name', 'color_class'];
+    public $timestamps = false;
+
+    public function contactMessages() { return $this->hasMany(ContactMessage::class); }
+}
+

+ 5 - 0
form-app-with-data/database/migrations/2025_12_02_014646_create_contact_messages_table.php

@@ -16,7 +16,12 @@ return new class extends Migration
             $table->string('name', 50);
             $table->string('email', 100);
             $table->string('message');
+
+            $table->foreignId('category_id')->constrained()->onDelete('cascade');
+            $table->foreignId('status_id')->nullable()->constrained()->onDelete('set null');
+
             $table->timestamps();
+            $table->softDeletes();
         });
     }
 

+ 5 - 7
form-app-with-data/database/migrations/2025_12_08_110321_add_deleted_at_to_contact_messages_table.php → form-app-with-data/database/migrations/2025_12_08_152715_create_categories_table.php

@@ -11,9 +11,10 @@ return new class extends Migration
      */
     public function up(): void
     {
-        Schema::table('contact_messages', function (Blueprint $table) {
-            //
-            $table->softDeletes();
+        Schema::create('categories', function (Blueprint $table) {
+            $table->id();
+            $table->string('name')->unique();
+            $table->timestamps();
         });
     }
 
@@ -22,9 +23,6 @@ return new class extends Migration
      */
     public function down(): void
     {
-        Schema::table('contact_messages', function (Blueprint $table) {
-            //
-            $table->dropSoftDeletes();
-        });
+        Schema::dropIfExists('categories');
     }
 };

+ 29 - 0
form-app-with-data/database/migrations/2025_12_08_152719_create_statuses_table.php

@@ -0,0 +1,29 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     */
+    public function up(): void
+    {
+        Schema::create('statuses', function (Blueprint $table) {
+            $table->id();
+            $table->string('name')->unique();
+            $table->string('color_class')->default('secondary'); 
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     */
+    public function down(): void
+    {
+        Schema::dropIfExists('statuses');
+    }
+};

+ 29 - 0
form-app-with-data/database/migrations/2025_12_08_152721_create_notes_table.php

@@ -0,0 +1,29 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     */
+    public function up(): void
+    {
+        Schema::create('notes', function (Blueprint $table) {
+            $table->id();
+            $table->text('body');
+            $table->morphs('noteable');
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     */
+    public function down(): void
+    {
+        Schema::dropIfExists('notes');
+    }
+};

+ 20 - 0
form-app-with-data/database/seeders/CategorySeeder.php

@@ -0,0 +1,20 @@
+<?php
+
+namespace Database\Seeders;
+
+use Illuminate\Database\Console\Seeds\WithoutModelEvents;
+use Illuminate\Database\Seeder;
+use App\Models\Category;
+
+class CategorySeeder extends Seeder
+{
+    /**
+     * Run the database seeds.
+     */
+    public function run(): void
+    {
+        Category::create(['name' => 'Техническая поддержка']);
+        Category::create(['name' => 'Предложение о сотрудничестве']);
+        Category::create(['name' => 'Общий вопрос']);
+    }
+}

+ 5 - 7
form-app-with-data/database/seeders/DatabaseSeeder.php

@@ -14,12 +14,10 @@ class DatabaseSeeder extends Seeder
      * Seed the application's database.
      */
     public function run(): void
-    {
-        // User::factory(10)->create();
-
-        User::factory()->create([
-            'name' => 'Test User',
-            'email' => 'test@example.com',
-        ]);
+    {   
+        $this->call([
+        CategorySeeder::class,
+        StatusSeeder::class,
+    ]);
     }
 }

+ 21 - 0
form-app-with-data/database/seeders/StatusSeeder.php

@@ -0,0 +1,21 @@
+<?php
+
+namespace Database\Seeders;
+
+use Illuminate\Database\Console\Seeds\WithoutModelEvents;
+use Illuminate\Database\Seeder;
+use App\Models\Status;
+
+class StatusSeeder extends Seeder
+{
+    /**
+     * Run the database seeds.
+     */
+    public function run(): void
+    {
+        Status::create(['name' => 'Новое', 'color_class' => 'primary']);
+        Status::create(['name' => 'В обработке', 'color_class' => 'warning']);
+        Status::create(['name' => 'Решено', 'color_class' => 'success']);
+        Status::create(['name' => 'Спам', 'color_class' => 'danger']);
+    }
+}

+ 131 - 11
form-app-with-data/resources/views/admin/edit.blade.php

@@ -4,16 +4,107 @@
     <meta charset="UTF-8">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <title>Редактирование записи #{{ $submission->id }}</title>
+    <style>
+        * { margin: 0; padding: 0; box-sizing: border-box; }
+        body {
+            font-family: Arial, sans-serif;
+            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+            min-height: 100vh;
+            display: flex;
+            justify-content: center;
+            align-items: center;
+            padding: 20px;
+        }
+        .container {
+            background: white;
+            padding: 40px;
+            border-radius: 10px;
+            box-shadow: 0 10px 40px rgba(0,0,0,0.2);
+            max-width: 500px;
+            width: 100%;
+        }
+        h1 {
+            color: #333;
+            margin-bottom: 10px;
+            text-align: center;
+        }
+        .subtitle {
+            color: #666;
+            text-align: center;
+            margin-bottom: 30px;
+            font-size: 14px;
+        }
+        .form-group {
+            margin-bottom: 20px;
+        }
+        label {
+            display: block;
+            margin-bottom: 5px;
+            color: #333;
+            font-weight: bold;
+        }
+        input, textarea, select {
+            width: 100%;
+            padding: 12px;
+            border: 2px solid #e1e1e1;
+            border-radius: 5px;
+            font-size: 14px;
+            transition: border-color 0.3s;
+            background-color: white;
+        }
+        input:focus, textarea:focus, select:focus {
+            outline: none;
+            border-color: #667eea;
+        }
+        textarea {
+            resize: vertical;
+            min-height: 100px;
+        }
+        .btn {
+            width: 100%;
+            padding: 12px;
+            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+            color: white;
+            border: none;
+            border-radius: 5px;
+            font-size: 16px;
+            font-weight: bold;
+            cursor: pointer;
+            transition: transform 0.2s;
+        }
+        .btn:hover {
+            transform: translateY(-2px);
+        }
+        .alert {
+            padding: 15px;
+            border-radius: 5px;
+            margin-bottom: 20px;
+        }
+        .alert-success {
+            background: #d4edda;
+            color: #155724;
+            border: 1px solid #c3e6cb;
+        }
+        .alert-error {
+            background: #f8d7da;
+            color: #721c24;
+            border: 1px solid #f5c6cb;
+        }
+        .error-text {
+            color: #e74c3c;
+            font-size: 12px;
+            margin-top: 5px;
+        }
+    </style>
 </head>
 <body>
     <div class="container">
-        <h1>Редактирование записи</h1>
+        <h1>Редактирование записи #{{ $submission->id }}</h1>
 
-        {{-- Блок для вывода ошибок валидации --}}
         @if ($errors->any())
-            <div class="alert" style="background: #f8d7da; color: #721c24;">
+            <div class="alert alert-error">
                 <strong>Ошибка!</strong> Проверьте введенные данные.
-                <ul>
+                <ul style="margin-top: 10px; margin-left: 20px;">
                     @foreach ($errors->all() as $error)
                         <li>{{ $error }}</li>
                     @endforeach
@@ -24,24 +115,53 @@
         <form action="{{ route('admin.update', $submission) }}" method="POST">
             @csrf
             @method('PUT')
-            <div style="margin-bottom: 15px;">
+
+            <div class="form-group">
                 <label for="name">Имя</label>
-                <input type="text" name="name" id="name" value="{{ old('name', $submission->name) }}" required style="width: 100%; padding: 10px; border-radius: 5px; border: 1px solid #ccc;">
+                <input type="text" name="name" id="name" value="{{ old('name', $submission->name) }}" required>
             </div>
 
-            <div style="margin-bottom: 15px;">
+            <div class="form-group">
                 <label for="email">Email</label>
-                <input type="email" name="email" id="email" value="{{ old('email', $submission->email) }}" required style="width: 100%; padding: 10px; border-radius: 5px; border: 1px solid #ccc;">
+                <input type="email" name="email" id="email" value="{{ old('email', $submission->email) }}" required>
             </div>
 
-            <div style="margin-bottom: 20px;">
+            <div class="form-group">
+                <label for="category_id">Категория</label>
+                <select name="category_id" id="category_id" required>
+                    @foreach($categories as $category)
+                        <option 
+                            value="{{ $category->id }}"
+                            {{ old('category_id', $submission->category_id) == $category->id ? 'selected' : '' }}
+                        >
+                            {{ $category->name }}
+                        </option>
+                    @endforeach
+                </select>
+            </div>
+            
+            <div class="form-group">
+                <label for="status_id">Статус</label>
+                <select name="status_id" id="status_id" required>
+                     @foreach($statuses as $status)
+                        <option 
+                            value="{{ $status->id }}"
+                            {{ old('status_id', $submission->status_id) == $status->id ? 'selected' : '' }}
+                        >
+                            {{ $status->name }}
+                        </option>
+                    @endforeach
+                </select>
+            </div>
+            
+            <div class="form-group">
                 <label for="message">Сообщение</label>
-                <textarea name="message" id="message" rows="5" required style="width: 100%; padding: 10px; border-radius: 5px; border: 1px solid #ccc;">{{ old('message', $submission->message) }}</textarea>
+                <textarea name="message" id="message" rows="5" required>{{ old('message', $submission->message) }}</textarea>
             </div>
 
             <div>
                 <button type="submit" class="btn">Сохранить изменения</button>
-                <a href="{{ route('admin.index') }}" class="btn btn-secondary">Отмена</a>
+                <a href="{{ route('admin.index') }}" class="btn" style="background: grey; margin-top: 10px;">Отмена</a>
             </div>
         </form>
     </div>

+ 39 - 28
form-app-with-data/resources/views/admin/index.blade.php

@@ -198,6 +198,20 @@
                 margin: 1px;
             }
         }
+        
+        .status-badge {
+            padding: 4px 8px;
+            border-radius: 12px;
+            color: white;
+            font-size: 12px;
+            font-weight: bold;
+            white-space: nowrap;
+        }
+        .status-primary { background-color: #007bff; }
+        .status-warning { background-color: #ffc107; color: #212529; }
+        .status-success { background-color: #28a745; }
+        .status-danger { background-color: #dc3545; }
+        .status-secondary { background-color: #6c757d; }
     </style>
 </head>
 <body>
@@ -210,6 +224,12 @@
                 {{ session('success') }}
             </div>
         @endif
+        
+        {{-- Добавим ссылку на главную страницу --}}
+        <div class="header-actions">
+            <a href="{{ route('form') }}" class="btn btn-secondary">← На главную</a>
+            <span class="count-badge">Всего записей: {{ $submissions->count() }}</span>
+        </div>
 
         <div class="table-wrapper">
             @if($submissions->count() > 0)
@@ -220,47 +240,38 @@
                             <th>Имя</th>
                             <th>Email</th>
                             <th>Сообщение</th>
-                            <th>Дата отправки</th>
+                            <th>Категория</th> {{-- НОВАЯ КОЛОНКА --}}
+                            <th>Статус</th>   {{-- НОВАЯ КОЛОНКА --}}
+                            <th>Дата</th>
                             <th style="text-align: right;">Действия</th>
                         </tr>
                     </thead>
                     <tbody>
                         @foreach($submissions as $submission)
                             <tr>
-                                <td>{{ $loop->iteration }}</td>
+                                <td>{{ $submission->id }}</td> {{-- Лучше использовать реальный ID --}}
                                 <td>{{ $submission->name }}</td>
                                 <td class="email-cell">{{ $submission->email }}</td>
-                                <td class="message-cell">{{ $submission->message }}</td>
+                                <td class="message-cell">{{ Str::limit($submission->message, 50) }}</td> {{-- Ограничим длину для красоты --}}
+                                
+                                {{-- НОВЫЕ ДАННЫЕ --}}
+                                <td>{{ $submission->category->name ?? 'N/A' }}</td>
+                                <td>
+                                    <span class="status-badge status-{{ $submission->status->color_class ?? 'secondary' }}">
+                                        {{ $submission->status->name ?? 'Неизвестен' }}
+                                    </span>
+                                </td>
+
                                 <td class="date-cell">
                                     {{ $submission->created_at->format('d.m.Y H:i') }}
                                 </td>
                                 <td style="text-align: right; white-space: nowrap;">
-                                    {{-- Просмотр --}}
-                                    <a href="{{ route('admin.show', $submission->id) }}" 
-                                       class="action-btn btn-view" 
-                                       title="Просмотр">
-                                        👁️
-                                    </a>
-
-                                    {{-- Редактирование --}}
-                                    <a href="{{ route('admin.edit', $submission->id) }}" 
-                                       class="action-btn btn-edit" 
-                                       title="Редактировать">
-                                        ✏️
-                                    </a>
-
-                                    {{-- Удаление --}}
-                                    <form action="{{ route('admin.delete', $submission) }}" 
-                                          method="POST" 
-                                          style="display: inline;"
-                                          onsubmit="return confirm('⚠️ Вы уверены?\n\nЗапись будет перемещена в корзину.')">
+                                    <a href="{{ route('admin.show', $submission->id) }}" class="action-btn btn-view" title="Просмотр">👁️</a>
+                                    <a href="{{ route('admin.edit', $submission->id) }}" class="action-btn btn-edit" title="Редактировать">✏️</a>
+                                    <form action="{{ route('admin.delete', $submission) }}" method="POST" style="display: inline;" onsubmit="return confirm('⚠️ Вы уверены, что хотите удалить запись?')">
                                         @csrf
                                         @method('DELETE')
-                                        <button type="submit" 
-                                                class="action-btn btn-delete" 
-                                                title="Удалить">
-                                            🗑️
-                                        </button>
+                                        <button type="submit" class="action-btn btn-delete" title="Удалить">🗑️</button>
                                     </form>
                                 </td>
                             </tr>
@@ -271,7 +282,7 @@
                 <div class="empty-state">
                     <div class="empty-state-icon">📭</div>
                     <h3>Пока нет отправленных данных</h3>
-                    <p style="margin-top: 10px;">Заполните форму, чтобы увидеть данные здесь</p>
+                    <p style="margin-top: 10px;">Заполните <a href="{{ route('form') }}">форму</a>, чтобы увидеть данные здесь</p>
                 </div>
             @endif
         </div>

+ 250 - 9
form-app-with-data/resources/views/admin/show.blade.php

@@ -3,27 +3,268 @@
 <head>
     <meta charset="UTF-8">
     <title>Просмотр записи #{{ $submission->id }}</title>
-    {{-- Вставьте сюда ваши теги <style> и <meta> --}}
+    <style>
+        * { margin: 0; padding: 0; box-sizing: border-box; }
+        body {
+            font-family: Arial, sans-serif;
+            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+            min-height: 100vh;
+            padding: 40px 20px;
+        }
+        .container {
+            background: white;
+            padding: 40px;
+            border-radius: 10px;
+            box-shadow: 0 10px 40px rgba(0,0,0,0.2);
+            max-width: 1200px;
+            margin: 0 auto;
+        }
+        h1 {
+            color: #333;
+            margin-bottom: 10px;
+            text-align: center;
+        }
+        .subtitle {
+            color: #666;
+            text-align: center;
+            margin-bottom: 30px;
+            font-size: 14px;
+        }
+        .header-actions {
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
+            margin-bottom: 20px;
+            flex-wrap: wrap;
+            gap: 10px;
+        }
+        .btn {
+            padding: 10px 20px;
+            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+            color: white;
+            border: none;
+            border-radius: 5px;
+            font-size: 14px;
+            font-weight: bold;
+            cursor: pointer;
+            text-decoration: none;
+            display: inline-block;
+            transition: transform 0.2s;
+        }
+        .btn:hover {
+            transform: translateY(-2px);
+        }
+        .btn-secondary {
+            background: linear-gradient(135deg, #a8a8a8 0%, #7f7f7f 100%);
+        }
+        .count-badge {
+            background: #667eea;
+            color: white;
+            padding: 5px 15px;
+            border-radius: 20px;
+            font-size: 14px;
+            font-weight: bold;
+        }
+        .table-wrapper {
+            overflow-x: auto;
+            margin-top: 20px;
+        }
+        table {
+            width: 100%;
+            border-collapse: collapse;
+            background: white;
+        }
+        thead {
+            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+        }
+        thead th {
+            color: white;
+            padding: 15px;
+            text-align: left;
+            font-weight: bold;
+            font-size: 14px;
+        }
+        tbody tr {
+            border-bottom: 1px solid #e1e1e1;
+            transition: background-color 0.2s;
+        }
+        tbody tr:hover {
+            background-color: #f8f9fa;
+        }
+        tbody tr:last-child {
+            border-bottom: none;
+        }
+        td {
+            padding: 15px;
+            color: #333;
+            font-size: 14px;
+        }
+        .message-cell {
+            max-width: 300px;
+            word-wrap: break-word;
+            white-space: pre-wrap;
+        }
+        .date-cell {
+            white-space: nowrap;
+            color: #666;
+            font-size: 13px;
+        }
+        .email-cell {
+            color: #667eea;
+            font-weight: 500;
+        }
+        .empty-state {
+            text-align: center;
+            padding: 60px 20px;
+            color: #999;
+        }
+        .empty-state-icon {
+            font-size: 64px;
+            margin-bottom: 20px;
+        }
+        .alert {
+            padding: 15px;
+            border-radius: 5px;
+            margin-bottom: 20px;
+        }
+        .alert-success {
+            background: #d4edda;
+            color: #155724;
+            border: 1px solid #c3e6cb;
+        }
+
+        /* Стили для кнопок действий */
+        .action-btn {
+            padding: 5px 10px;
+            font-size: 16px;
+            border: none;
+            border-radius: 5px;
+            cursor: pointer;
+            text-decoration: none;
+            display: inline-block;
+            margin: 0 2px;
+            transition: all 0.2s;
+        }
+
+        .action-btn:hover {
+            transform: scale(1.1);
+            box-shadow: 0 2px 8px rgba(0,0,0,0.2);
+        }
+
+        .btn-view {
+            background: #3498db;
+            color: white;
+        }
+
+        .btn-view:hover {
+            background: #2980b9;
+        }
+
+        .btn-edit {
+            background: #f1c40f;
+            color: white;
+        }
+
+        .btn-edit:hover {
+            background: #f39c12;
+        }
+
+        .btn-delete {
+            background: #e74c3c;
+            color: white;
+        }
+
+        .btn-delete:hover {
+            background: #c0392b;
+        }
+        
+        @media (max-width: 768px) {
+            .container {
+                padding: 20px;
+            }
+            table {
+                font-size: 12px;
+            }
+            thead th, td {
+                padding: 10px 8px;
+            }
+            .message-cell {
+                max-width: 150px;
+            }
+            .action-btn {
+                font-size: 14px;
+                padding: 4px 8px;
+                margin: 1px;
+            }
+        }
+        
+        .status-badge {
+            padding: 4px 8px;
+            border-radius: 12px;
+            color: white;
+            font-size: 12px;
+            font-weight: bold;
+            white-space: nowrap;
+        }
+        .status-primary { background-color: #007bff; }
+        .status-warning { background-color: #ffc107; color: #212529; }
+        .status-success { background-color: #28a745; }
+        .status-danger { background-color: #dc3545; }
+        .status-secondary { background-color: #6c757d; }
+    </style>
 </head>
 <body>
     <div class="container">
         <h1>Просмотр записи #{{ $submission->id }}</h1>
         <div style="background: #f8f9fa; padding: 20px; border-radius: 8px;">
-            <h3>Имя:</h3>
-            <p>{{ $submission->name }}</p>
+            
+            <p><strong>Имя:</strong> {{ $submission->name }}</p>
             <hr style="margin: 15px 0;">
 
-            <h3>Email:</h3>
-            <p class="email-cell">{{ $submission->email }}</p>
+            <p><strong>Email:</strong> <span class="email-cell">{{ $submission->email }}</span></p>
             <hr style="margin: 15px 0;">
 
-            <h3>Сообщение:</h3>
-            <pre class="message-cell">{{ $submission->message }}</pre>
+            {{-- НОВЫЕ ПОЛЯ --}}
+            <p><strong>Категория:</strong> {{ $submission->category->name ?? 'N/A' }}</p>
             <hr style="margin: 15px 0;">
 
-            <h3>Дата отправки:</h3>
-            <p class="date-cell">{{ $submission->created_at->format('d.m.Y в H:i:s') }}</p>
+            <p><strong>Статус:</strong> 
+                <span class="status-badge status-{{ $submission->status->color_class ?? 'secondary' }}">
+                    {{ $submission->status->name ?? 'Неизвестен' }}
+                </span>
+            </p>
+            <hr style="margin: 15px 0;">
+
+            <p><strong>Сообщение:</strong></p>
+            <pre class="message-cell" style="background: #fff; padding: 10px; border: 1px solid #ddd; border-radius: 4px;">{{ $submission->message }}</pre>
+            <hr style="margin: 15px 0;">
+
+            <p><strong>Дата отправки:</strong> <span class="date-cell">{{ $submission->created_at->format('d.m.Y в H:i:s') }}</span></p>
         </div>
+
+        <div class="notes-section" style="margin-top: 30px;">
+            <h2>Заметки к записи</h2>
+            <div class="notes-list" style="margin-top: 15px;">
+                @forelse($submission->notes as $note)
+                    <div style="background: #fff3cd; padding: 15px; border-radius: 5px; margin-bottom: 10px; border-left: 4px solid #ffeeba;">
+                        <p>{{ $note->body }}</p>
+                        <small style="color: #666; display: block; text-align: right; margin-top: 5px;">
+                            Добавлено: {{ $note->created_at->diffForHumans() }}
+                        </small>
+                    </div>
+                @empty
+                    <p style="color: #888;">Заметок пока нет.</p>
+                @endforelse
+            </div>
+            
+            <form action="{{ route('admin.notes.add', $submission) }}" method="POST" style="margin-top: 20px;">
+                @csrf
+                <label for="note_body">Добавить заметку:</label>
+                <textarea name="body" id="note_body" rows="3" required style="width: 100%; padding: 10px; border-radius: 5px; border: 1px solid #ccc;"></textarea>
+                <button type="submit" class="btn" style="margin-top: 10px; width: auto;">Сохранить заметку</button>
+            </form>
+        </div>
+
         <div style="margin-top: 30px;">
             <a href="{{ route('admin.index') }}" class="btn btn-secondary">← Назад к списку</a>
             <a href="{{ route('admin.edit', $submission) }}" class="btn" style="background: #f1c40f; margin-left: 10px;">Редактировать</a>

+ 19 - 2
form-app-with-data/resources/views/form.blade.php

@@ -4,6 +4,7 @@
     <meta charset="UTF-8">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <title>Тест Laravel</title>
+    {{-- Стили остаются без изменений --}}
     <style>
         * { margin: 0; padding: 0; box-sizing: border-box; }
         body {
@@ -43,15 +44,16 @@
             color: #333;
             font-weight: bold;
         }
-        input, textarea {
+        input, textarea, select {
             width: 100%;
             padding: 12px;
             border: 2px solid #e1e1e1;
             border-radius: 5px;
             font-size: 14px;
             transition: border-color 0.3s;
+            background-color: white;
         }
-        input:focus, textarea:focus {
+        input:focus, textarea:focus, select:focus {
             outline: none;
             border-color: #667eea;
         }
@@ -154,6 +156,21 @@
                 @enderror
             </div>
 
+            <div class="form-group">
+                <label for="category_id">Категория:</label>
+                <select name="category_id" id="category_id">
+                    <option value="" disabled selected>-- Выберите категорию --</option>
+                    @foreach($categories as $category)
+                        <option value="{{ $category->id }}" {{ old('category_id') == $category->id ? 'selected' : '' }}>
+                            {{ $category->name }}
+                        </option>
+                    @endforeach
+                </select>
+                 @error('category_id')
+                    <div class="error-text">{{ $message }}</div>
+                @enderror
+            </div>
+
             <div class="form-group">
                 <label for="message">Сообщение:</label>
                 <textarea 

+ 2 - 1
form-app-with-data/routes/web.php

@@ -11,4 +11,5 @@ Route::get('/admin', [FormController::class, 'showData'])->name('admin.index');
 Route::get('/admin/{submission}', [FormController::class, 'show'])->name('admin.show');
 Route::get('/admin/{submission}/edit', [FormController::class, 'edit'])->name('admin.edit');
 Route::put('/admin/{submission}', [FormController::class, 'update'])->name('admin.update');
-Route::delete('/admin/{submission}', [FormController::class, 'delete'])->name('admin.delete');
+Route::delete('/admin/{submission}', [FormController::class, 'delete'])->name('admin.delete');
+Route::post('/admin/{submission}/notes', [FormController::class, 'addNote'])->name('admin.notes.add');