From 11c5dcaf48332933a64e098f3c7bf0aff97889fe Mon Sep 17 00:00:00 2001 From: mirivlad Date: Mon, 30 Mar 2026 12:23:05 +0800 Subject: [PATCH] =?UTF-8?q?Feat:=20Tags=20Input=20=D0=BA=D0=BE=D0=BC=D0=BF?= =?UTF-8?q?=D0=BE=D0=BD=D0=B5=D0=BD=D1=82=20=D0=B4=D0=BB=D1=8F=20=D0=B3?= =?UTF-8?q?=D1=80=D1=83=D0=BF=D0=BF=20(WordPress=20style)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ✅ Новый компонент x-tags-input ✅ Поле ввода + бейджи ниже ✅ Typeahead поиск групп ✅ Крестик для удаления ✅ Синие бейджи как в WordPress ✅ Отдельный компонент (не влияет на searchable-select) Co-authored-by: Qwen-Coder --- app/Http/Controllers/Admin/UserController.php | 21 +-- resources/views/admin/users/edit.blade.php | 5 +- .../views/components/tags-input.blade.php | 151 ++++++++++++++++++ 3 files changed, 164 insertions(+), 13 deletions(-) create mode 100644 resources/views/components/tags-input.blade.php diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php index 868c49d..cfa7f2f 100755 --- a/app/Http/Controllers/Admin/UserController.php +++ b/app/Http/Controllers/Admin/UserController.php @@ -118,7 +118,7 @@ class UserController extends Controller public function update(Request $request, User $user) { Gate::authorize('update', $user); - + $validated = $request->validate([ 'name' => 'required|string|max:255', 'email' => 'required|string|email|max:255|unique:users,email,' . $user->id, @@ -126,10 +126,10 @@ class UserController extends Controller 'phone' => 'nullable|string|max:20', 'organization_id' => 'nullable|exists:organizations,id', 'role' => 'required|exists:roles,name', - 'groups' => 'array|exists:groups,id', + 'groups' => 'nullable|string', 'is_active' => 'boolean', ]); - + $user->update([ 'name' => $validated['name'], 'email' => $validated['email'], @@ -137,23 +137,24 @@ class UserController extends Controller 'organization_id' => $validated['organization_id'] ?? null, 'is_active' => $validated['is_active'] ?? true, ]); - + // Обновление пароля if (!empty($validated['password'])) { $user->password = Hash::make($validated['password']); $user->save(); } - + // Обновление роли $user->syncRoles([$validated['role']]); - - // Обновление групп - if (isset($validated['groups'])) { - $user->groups()->sync($validated['groups']); + + // Обновление групп (строка "1,2,3" → массив) + if (!empty($validated['groups'])) { + $groupIds = array_map('intval', array_filter(explode(',', $validated['groups']))); + $user->groups()->sync($groupIds); } else { $user->groups()->detach(); } - + return redirect()->route('admin.users.show', $user) ->with('success', 'Пользователь успешно обновлён.'); } diff --git a/resources/views/admin/users/edit.blade.php b/resources/views/admin/users/edit.blade.php index 7ed6b16..e75a712 100644 --- a/resources/views/admin/users/edit.blade.php +++ b/resources/views/admin/users/edit.blade.php @@ -63,12 +63,11 @@ @if($allGroups->count() > 0)
- Выберите группы
diff --git a/resources/views/components/tags-input.blade.php b/resources/views/components/tags-input.blade.php new file mode 100644 index 0000000..1d2c1c9 --- /dev/null +++ b/resources/views/components/tags-input.blade.php @@ -0,0 +1,151 @@ +@props(['name', 'url', 'placeholder' => 'Начните вводить...', 'value' => []]) + +
+ + +
+
+ +@push('scripts') + + + + +@endpush