From dd3b2da6706da0ec5de86f55b3db9a80b4dc623a Mon Sep 17 00:00:00 2001 From: snipe Date: Wed, 24 Jan 2024 19:08:47 +0000 Subject: [PATCH 1/4] Updated variable names for clarity, remove the concat of order and sort Signed-off-by: snipe --- .../views/partials/bootstrap-table.blade.php | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/resources/views/partials/bootstrap-table.blade.php b/resources/views/partials/bootstrap-table.blade.php index 531f7d429cd2..992162e3dc2e 100644 --- a/resources/views/partials/bootstrap-table.blade.php +++ b/resources/views/partials/bootstrap-table.blade.php @@ -164,23 +164,24 @@ function dateRowCheckStyle(value) { // Initialize sort-order for bulk actions (label-generation) for snipe-tables $('.snipe-table').each(function (i, table) { table_cookie_segment = $(table).data('cookie-id-table'); - name = ''; - direction = ''; + sort = ''; + order = ''; cookies = document.cookie.split(";"); for(i in cookies) { cookiedef = cookies[i].split("=", 2); cookiedef[0] = cookiedef[0].trim(); if (cookiedef[0] == table_cookie_segment + ".bs.table.sortOrder") { - direction = cookiedef[1]; + order = cookiedef[1]; } if (cookiedef[0] == table_cookie_segment + ".bs.table.sortName") { - name = cookiedef[1]; + sort = cookiedef[1]; } } - if (name && direction) { + if (sort && order) { domnode = $($(this).data('bulk-form-id')).get(0); if ( domnode && domnode.elements && domnode.elements.sort ) { - domnode.elements.sort.value = name + " " + direction; + domnode.elements.sort.value = sort; + domnode.elements.order.value = order; } } }); @@ -190,7 +191,8 @@ function dateRowCheckStyle(value) { domnode = $($(this).data('bulk-form-id')).get(0); // make safe in case there isn't a bulk-form-id, or it's not found, or has no 'sort' element if ( domnode && domnode.elements && domnode.elements.sort ) { - domnode.elements.sort.value = name + " " + order; + domnode.elements.sort.value = name; + domnode.elements.order.value = order; } }); From ba680126bc0c7a2d15af912f67c73930958f20c8 Mon Sep 17 00:00:00 2001 From: snipe Date: Wed, 24 Jan 2024 19:09:06 +0000 Subject: [PATCH 2/4] Properly sort the results based on non-asset fields Signed-off-by: snipe --- .../Assets/BulkAssetsController.php | 80 ++++++++++++++++++- 1 file changed, 76 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/Assets/BulkAssetsController.php b/app/Http/Controllers/Assets/BulkAssetsController.php index 2947344a507a..cc50923d6b78 100644 --- a/app/Http/Controllers/Assets/BulkAssetsController.php +++ b/app/Http/Controllers/Assets/BulkAssetsController.php @@ -49,15 +49,87 @@ public function edit(Request $request) return redirect()->back()->with('error', trans('admin/hardware/message.update.no_assets_selected')); } + $asset_ids = $request->input('ids'); + // Figure out where we need to send the user after the update is complete, and store that in the session $bulk_back_url = request()->headers->get('referer'); session(['bulk_back_url' => $bulk_back_url]); + $allowed_columns = [ + 'id', + 'name', + 'asset_tag', + 'serial', + 'model_number', + 'last_checkout', + 'notes', + 'expected_checkin', + 'order_number', + 'image', + 'assigned_to', + 'created_at', + 'updated_at', + 'purchase_date', + 'purchase_cost', + 'last_audit_date', + 'next_audit_date', + 'warranty_months', + 'checkout_counter', + 'checkin_counter', + 'requests_counter', + 'byod', + 'asset_eol_date', + ]; - $asset_ids = $request->input('ids'); - // Using the 'short-ternary' A/K/A "Elvis operator" '?:' here because ->input() might return an empty string - list($sortname,$sortdir) = explode(" ",$request->input('sort') ?: 'id ASC'); - $assets = Asset::with('assignedTo', 'location', 'model')->whereIn('id', $asset_ids)->orderBy($sortname, $sortdir)->get(); + + /** + * Make sure the column is allowed, and if it's a custom field, make sure we strip the custom_fields. prefix + */ + $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; + $sort_override = str_replace('custom_fields.', '', $request->input('sort')); + + // This handles all of the pivot sorting below (versus the assets.* fields in the allowed_columns array) + $column_sort = in_array($sort_override, $allowed_columns) ? $sort_override : 'assets.id'; + + $assets = Asset::with('assignedTo', 'location', 'model')->whereIn('assets.id', $asset_ids); + + switch ($sort_override) { + case 'model': + $assets->OrderModels($order); + break; + case 'model_number': + $assets->OrderModelNumber($order); + break; + case 'category': + $assets->OrderCategory($order); + break; + case 'manufacturer': + $assets->OrderManufacturer($order); + break; + case 'company': + $assets->OrderCompany($order); + break; + case 'location': + $assets->OrderLocation($order); + case 'rtd_location': + $assets->OrderRtdLocation($order); + break; + case 'status_label': + $assets->OrderStatus($order); + break; + case 'supplier': + $assets->OrderSupplier($order); + break; + case 'assigned_to': + $assets->OrderAssigned($order); + break; + default: + $assets->orderBy($column_sort, $order); + break; + } + + \Log::debug($assets->toSql()); + $assets = $assets->get(); $models = $assets->unique('model_id'); $modelNames = []; From 2c7bbfa6376c9044c06741f1775eee66c585ee97 Mon Sep 17 00:00:00 2001 From: snipe Date: Wed, 24 Jan 2024 19:09:20 +0000 Subject: [PATCH 3/4] Added additional sort/order hidden fields Signed-off-by: snipe --- resources/views/partials/asset-bulk-actions.blade.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/resources/views/partials/asset-bulk-actions.blade.php b/resources/views/partials/asset-bulk-actions.blade.php index d56c7dc39460..d46b4e525bb6 100644 --- a/resources/views/partials/asset-bulk-actions.blade.php +++ b/resources/views/partials/asset-bulk-actions.blade.php @@ -6,8 +6,9 @@ 'id' => (isset($id_formname)) ? $id_formname : 'assetsBulkForm', ]) }} - {{-- The 'id ASC' will only be used if the cookie is actually empty (like on first-use) --}} - + {{-- The sort and order will only be used if the cookie is actually empty (like on first-use) --}} + +