From e51cbce9065d4d1796092a088eeb4070964efb8d Mon Sep 17 00:00:00 2001 From: Vari Date: Sat, 6 Jul 2024 21:06:04 +0200 Subject: [PATCH] Fixed template and Js of the item-selector because it only worked if it was only one time on the page. Added user-selector dropdown with data fetching from the backend. Fix a null error in the inbox-message component. --- .../Api/Catalog/CatalogController.php | 3 + .../Web/Admin/Tools/UsersController.php | 38 ++++++++ .../View/Components/admin/user-selector.php | 26 ++++++ dist/resources/css/app.scss | 11 +++ dist/resources/css/select2-tailwind.scss | 6 +- .../resources/js/admin/tools/item-selector.js | 86 ++++++++++--------- dist/resources/js/admin/user-selector.js | 26 ++++++ .../admin/tools/inbox-message.blade.php | 2 +- .../admin/tools/item-selector.blade.php | 11 ++- .../components/admin/user-selector.blade.php | 9 ++ dist/routes/admin.php | 1 + 11 files changed, 169 insertions(+), 50 deletions(-) create mode 100644 dist/app/View/Components/admin/user-selector.php create mode 100644 dist/resources/js/admin/user-selector.js create mode 100644 dist/resources/views/components/admin/user-selector.blade.php diff --git a/dist/app/Http/Controllers/Api/Catalog/CatalogController.php b/dist/app/Http/Controllers/Api/Catalog/CatalogController.php index 4ddbaaa..0d4c916 100644 --- a/dist/app/Http/Controllers/Api/Catalog/CatalogController.php +++ b/dist/app/Http/Controllers/Api/Catalog/CatalogController.php @@ -5,7 +5,9 @@ use App\Http\Controllers\Controller; use App\Models\Game\CatalogItem; use Auth; +use Illuminate\Database\Eloquent\Collection; use Illuminate\Http\Request; +use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Support\Facades\Storage; class CatalogController extends Controller @@ -27,6 +29,7 @@ public function catalogItemDropdown(Request $request) if($searchTerm === null) abort(400, 'Search term must be provided.'); + /** @var Collection|LengthAwarePaginator $users */ $items = CatalogItem::where('display_name', 'LIKE', "%{$searchTerm}%") ->select(['id', 'display_name']) ->paginate(static::CATALOG_DROPDOWN_PAGINATION_LIMIT); diff --git a/dist/app/Http/Controllers/Web/Admin/Tools/UsersController.php b/dist/app/Http/Controllers/Web/Admin/Tools/UsersController.php index 16d3b80..76bbc91 100644 --- a/dist/app/Http/Controllers/Web/Admin/Tools/UsersController.php +++ b/dist/app/Http/Controllers/Web/Admin/Tools/UsersController.php @@ -16,6 +16,7 @@ use Carbon\Carbon; use Illuminate\Database\Eloquent\Collection; use Illuminate\Http\Request; +use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Support\Facades\Session; use Illuminate\Support\Facades\View; @@ -31,6 +32,8 @@ class UsersController extends AdminToolController const PER_PAGE = 15; + const USER_DROPDOWN_PER_PAGE = 20; + public function index(Request $request) { if(!Auth::user()->can(Permissions::VIEW_USERS->value)) @@ -91,6 +94,41 @@ public function edit(User $user, EditUserRequest $request) return redirect()->back(); } + public function getUsersForDropdown(Request $request) + { + if(!Auth::check() && Auth::user()->can(Permissions::VIEW_USERS->value)) + abort(403, 'No Permission to get this Data'); + + $searchTerm = $request->input('term'); + + if($searchTerm === null) + abort(400, 'Search term must be provided.'); + + $query = User::orderBy('last_known_username') + ->orWhere('id', 'LIKE', '%'.$searchTerm.'%') + ->orWhere('steam_id', 'LIKE', '%'.$searchTerm.'%') + ->orWhere('last_known_username', 'LIKE', '%'.$searchTerm.'%') + ->select(['id', 'last_known_username']); + + /** @var Collection|LengthAwarePaginator $users */ + $users = $query->paginate(static::USER_DROPDOWN_PER_PAGE); + + $result = []; + $users->each(function ($user) use (&$result) { + $result[] = [ + 'id' => $user->id, + 'text' => $user->last_known_username, + ]; + }); + + return [ + 'results' => $result, + 'pagination' => [ + 'more' => $users->currentPage() < $users->lastPage(), + ], + ]; + } + public function reset(User $user) { $canReset = Auth::check() && Auth::user()->can(Permissions::EDIT_USERS->value); diff --git a/dist/app/View/Components/admin/user-selector.php b/dist/app/View/Components/admin/user-selector.php new file mode 100644 index 0000000..0ae1240 --- /dev/null +++ b/dist/app/View/Components/admin/user-selector.php @@ -0,0 +1,26 @@ + { - let data = $('.item-selector #add-item-id').select2('data')[0]; + let itemSelectors = $('.item-selector'); + itemSelectors.each((index, element) => { + let selector = new ItemSelector(); + selector.rewardItemContainer = $(element).find('.current-items-selection'); - // Check if we have selected something and if it exists already - if(typeof data === 'undefined' || data.disabled || ItemSelector.rewardItemContainer.find('input[value="' + data.id + '"]').length > 0) - return; + let addItemButton = $(element).find('.add-item-button'); + addItemButton.on('click', () => { + let data = $(element).find('.catalog-item-selector').select2('data')[0]; - let newRewardItem = ItemSelector.createRewardItemElement( - 'Inventory', - data.id, - data.text, - 1 - ); - ItemSelector.rewardItemContainer.append(newRewardItem); - newRewardItem.on('click', 'button', () => { - $(newRewardItem).remove(); + // Check if we have selected something and if it exists already + if(typeof data === 'undefined' || data.disabled || selector.rewardItemContainer.find('input[value="' + data.id + '"]').length > 0) + return; + + let newRewardItem = ItemSelector.createRewardItemElement( + 'Inventory', + data.id, + data.text, + 1 + ); + selector.rewardItemContainer.append(newRewardItem); + newRewardItem.on('click', 'button', () => { + $(newRewardItem).remove(); + }) }) - }) - let addCurrencyButton = $('button[id="add-currency-button"]'); - addCurrencyButton.on('click', () => { - let type = $('.item-selector #add-currency-type').val(); - let amount = $('.item-selector #add-currency-amount').val(); - console.log(amount); + let addCurrencyButton = $(element).find('.add-currency-button'); + addCurrencyButton.on('click', () => { + let type = $(element).find('.add-currency-type').val(); + let amount = $(element).find('.add-currency-amount').val(); + console.log(amount); - // Check if we have selected something and if it exists already - if(amount === '' || ItemSelector.rewardItemContainer.find('input[value="' + type + '"]').length > 0) - return; + // Check if we have selected something and if it exists already + if(amount === '' || selector.rewardItemContainer.find('input[value="' + type + '"]').length > 0) + return; - let newRewardItem = ItemSelector.createRewardItemElement( - 'Currency', - type, - type, - amount - ); - ItemSelector.rewardItemContainer.prepend(newRewardItem); - newRewardItem.on('click', 'button', () => { - $(newRewardItem).remove(); - }) + let newRewardItem = ItemSelector.createRewardItemElement( + 'Currency', + type, + type, + amount + ); + selector.rewardItemContainer.prepend(newRewardItem); + newRewardItem.on('click', 'button', () => { + $(newRewardItem).remove(); + }) + }); }); + + + + } } diff --git a/dist/resources/js/admin/user-selector.js b/dist/resources/js/admin/user-selector.js new file mode 100644 index 0000000..47454cd --- /dev/null +++ b/dist/resources/js/admin/user-selector.js @@ -0,0 +1,26 @@ +import $ from 'jquery'; + +class UserSelector { + static getSelect2Options(element) { + return { + width: '100%', + minimumInputLength: 2, + ajax: { + url: $(element).attr('data-fetch-url'), + dataType: 'json', + } + }; + } + + static initUserDropdowns() { + let userDropdowns = $('.user-selector'); + + userDropdowns.each((index, element) => { + $(element).select2(UserSelector.getSelect2Options(element)); + }) + } + + static { + UserSelector.initUserDropdowns(); + } +} \ No newline at end of file diff --git a/dist/resources/views/components/admin/tools/inbox-message.blade.php b/dist/resources/views/components/admin/tools/inbox-message.blade.php index 5c704f5..5099e15 100644 --- a/dist/resources/views/components/admin/tools/inbox-message.blade.php +++ b/dist/resources/views/components/admin/tools/inbox-message.blade.php @@ -89,7 +89,7 @@ class="h-44" type="datetime-local" id="{{ $message->id }}_expireAt" name="expireAt" - value="{{ $message->expire_at->toDateTimeString('minute') }}" + value="{{ $message->expire_at?->toDateTimeString('minute') }}" /> @else
diff --git a/dist/resources/views/components/admin/tools/item-selector.blade.php b/dist/resources/views/components/admin/tools/item-selector.blade.php index ae2e0f2..e5df693 100644 --- a/dist/resources/views/components/admin/tools/item-selector.blade.php +++ b/dist/resources/views/components/admin/tools/item-selector.blade.php @@ -31,13 +31,12 @@

Add item

-
- + Add
@@ -45,14 +44,14 @@ class="catalog-item-selector input-global-dropdown w-full"

Add Currency

Amount - +
- + Add
diff --git a/dist/resources/views/components/admin/user-selector.blade.php b/dist/resources/views/components/admin/user-selector.blade.php new file mode 100644 index 0000000..188199b --- /dev/null +++ b/dist/resources/views/components/admin/user-selector.blade.php @@ -0,0 +1,9 @@ +@pushonce('head') + @vite(['resources/js/admin/user-selector.js']) +@endpushonce + + + diff --git a/dist/routes/admin.php b/dist/routes/admin.php index 9a418f7..7abf9d6 100644 --- a/dist/routes/admin.php +++ b/dist/routes/admin.php @@ -27,6 +27,7 @@ Route::post('user/{user}/ban/{ban}', [UsersController::class, 'banPost'])->name('user.ban.post'); Route::get('user/{user}/ban/create', [UsersController::class, 'createBan'])->name('user.ban.create'); Route::get('user/{user}', [UsersController::class, 'details'])->name('user.details'); +Route::get('usersDropdown', [UsersController::class, 'getUsersForDropdown'])->name('users.dropdown'); Route::get('user/{user}/inbox', [UsersController::class, 'inbox'])->name('user.inbox'); Route::post('user/{user}/inboxMessage/{message}', [UsersController::class, 'inboxMessagePost'])->name('user.inboxMessage.edit');