From ad510cecd597f3877aea6d73988ea3ed713fa5f5 Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 10 Mar 2017 20:07:44 -0800 Subject: [PATCH] Fixes #2422 - Adds bulk edit for select user attributes --- app/Helpers/Helper.php | 2 +- app/Http/Controllers/UsersController.php | 80 +++++++++++++- app/Presenters/UserPresenter.php | 8 ++ resources/lang/en/admin/users/general.php | 2 + resources/lang/en/admin/users/message.php | 2 + resources/views/users/bulk-edit.blade.php | 121 ++++++++++++++++++++++ resources/views/users/edit.blade.php | 35 ------- resources/views/users/index.blade.php | 4 +- routes/web/users.php | 7 ++ 9 files changed, 220 insertions(+), 41 deletions(-) create mode 100644 resources/views/users/bulk-edit.blade.php diff --git a/app/Helpers/Helper.php b/app/Helpers/Helper.php index 0dda49f55..66f91f7ed 100644 --- a/app/Helpers/Helper.php +++ b/app/Helpers/Helper.php @@ -157,7 +157,7 @@ class Helper */ public static function companyList() { - $company_list = array('0' => trans('general.select_company')) + DB::table('companies') + $company_list = array('' => trans('general.select_company')) + DB::table('companies') ->orderBy('name', 'asc') ->pluck('name', 'id') ->toArray(); diff --git a/app/Http/Controllers/UsersController.php b/app/Http/Controllers/UsersController.php index 30ca9f4e3..9633c2725 100755 --- a/app/Http/Controllers/UsersController.php +++ b/app/Http/Controllers/UsersController.php @@ -405,23 +405,97 @@ class UsersController extends Controller * @since [v1.7] * @return \Illuminate\Contracts\View\View */ - public function postBulkEdit() + public function postBulkEdit(Request $request) { $this->authorize('update', User::class); if ((!Input::has('ids')) || (count(Input::has('ids')) == 0)) { return redirect()->back()->with('error', 'No users selected'); } else { + $statuslabel_list = Helper::statusLabelList(); $user_raw_array = array_keys(Input::get('ids')); $licenses = DB::table('license_seats')->whereIn('assigned_to', $user_raw_array)->get(); - $users = User::whereIn('id', $user_raw_array)->with('groups', 'assignedAssets', 'licenses', 'accessories')->get(); - // $users = Company::scopeCompanyables($users)->get(); + $users = User::whereIn('id', $user_raw_array)->with('groups', 'assets', 'licenses', 'accessories')->get(); + if ($request->input('bulk_actions')=='edit') { + + return View::make('users/bulk-edit', compact('users')) + ->with('location_list', Helper::locationsList()) + ->with('company_list', Helper::companyList()) + ->with('manager_list', Helper::managerList()) + ->with('manager_list', Helper::managerList()) + ->with('groups', Group::pluck('name', 'id')); + } return View::make('users/confirm-bulk-delete', compact('users', 'statuslabel_list')); } } + + /** + * Save bulk-edited users + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @return \Illuminate\Http\RedirectResponse + */ + public function postBulkEditSave(Request $request) + { + $this->authorize('update', User::class); + if ((!Input::has('ids')) || (count(Input::has('ids')) == 0)) { + return redirect()->back()->with('error', 'No users selected'); + } else { + + $user_raw_array = Input::get('ids'); + $update_array = array(); + + $users = User::whereIn('id', $user_raw_array)->where('id','!=',Auth::user()->id)->get(); + + if ($request->has('location_id')) { + $update_array['location_id'] = $request->input('location_id'); + } + if ($request->has('company_id')) { + $update_array['company_id'] = $request->input('company_id'); + } + + if ($request->has('manager_id')) { + + // Do not allow a manager update if the selected manager is one of the users being + // edited. + if (!array_key_exists($request->input('manager_id'), $user_raw_array)) { + $update_array['manager_id'] = $request->input('manager_id'); + $manager_conflict = false; + } else { + $manager_conflict = true; + } + + } + if ($request->has('activated')) { + $update_array['activated'] = $request->input('activated'); + } + + if (count($update_array) > 0) { + User::whereIn('id', $user_raw_array)->where('id','!=',Auth::user()->id)->update($update_array); + } + + // Only sync groups if groups were selected + if ($request->has('groups')) { + foreach ($users as $user) { + $user->groups()->sync($request->input('groups')); + } + } + + } + if ($manager_conflict) { + return redirect()->route('users.index') + ->with('warning', trans('admin/users/message.bulk_manager_warn')); + } + return redirect()->route('users.index') + ->with('success', trans('admin/users/message.success.update_bulk')); + + + } + /** * Soft-delete bulk users * diff --git a/app/Presenters/UserPresenter.php b/app/Presenters/UserPresenter.php index 1c0ecf85a..5a80de2ee 100644 --- a/app/Presenters/UserPresenter.php +++ b/app/Presenters/UserPresenter.php @@ -87,6 +87,14 @@ class UserPresenter extends Presenter "true" => false, "formatter" => "locationsLinkObjFormatter" ], + [ + "field" => "manager", + "searchable" => true, + "sortable" => true, + "title" => trans('admin/users/table.manager'), + "visible" => true, + "formatter" => "usersLinkObjFormatter" + ], [ "field" => "assets_count", "searchable" => false, diff --git a/resources/lang/en/admin/users/general.php b/resources/lang/en/admin/users/general.php index 92ee04b49..34f982417 100644 --- a/resources/lang/en/admin/users/general.php +++ b/resources/lang/en/admin/users/general.php @@ -4,6 +4,8 @@ return array( 'assets_user' => 'Assets assigned to :name', + 'bulk_update_warn' => 'You are about to edit the properties of :user_count users. Please note that you cannot change your own user attributes using this form, and must make edits to your own user individually.', + 'bulk_update_help' => 'This form allows you to update multiple users at once. Only fill in the fields you need to change. Any fields left blank will remain unchanged.', 'current_assets' => 'Assets currently checked out to this user', 'clone' => 'Clone User', 'contact_user' => 'Contact :name', diff --git a/resources/lang/en/admin/users/message.php b/resources/lang/en/admin/users/message.php index a1a9757e8..36bb0a9a9 100644 --- a/resources/lang/en/admin/users/message.php +++ b/resources/lang/en/admin/users/message.php @@ -4,6 +4,7 @@ return array( 'accepted' => 'You have successfully accepted this asset.', 'declined' => 'You have successfully declined this asset.', + 'bulk_manager_warn' => 'Your users have been successfully updated, however your manager entry was not saved because the manager you selected was also in the user list to be edited, and users may not be their own manager. Please select your users again, excluding the manager.', 'user_exists' => 'User already exists!', 'user_not_found' => 'User [:id] does not exist.', 'user_login_required' => 'The login field is required', @@ -16,6 +17,7 @@ return array( 'success' => array( 'create' => 'User was successfully created.', 'update' => 'User was successfully updated.', + 'update_bulk' => 'Users were successfully updated!', 'delete' => 'User was successfully deleted.', 'ban' => 'User was successfully banned.', 'unban' => 'User was successfully unbanned.', diff --git a/resources/views/users/bulk-edit.blade.php b/resources/views/users/bulk-edit.blade.php new file mode 100644 index 000000000..51e4f980a --- /dev/null +++ b/resources/views/users/bulk-edit.blade.php @@ -0,0 +1,121 @@ +@extends('layouts/default') + +{{-- Page title --}} +@section('title') + Bulk Edit + @parent +@stop + + +@section('header_right') + + {{ trans('general.back') }} +@stop + +{{-- Page content --}} +@section('content') +
+
+ +

{{ trans('admin/users/general.bulk_update_help') }}

+ +
+ {{ trans('admin/users/general.bulk_update_warn', ['user_count' => count($users)]) }} +
+ +
+ {{ csrf_field() }} + +
+
+ + + +
+ +
+ {{ Form::select('location_id', $location_list , Input::old('rtd_location_id'), array('class'=>'select2', 'style'=>'width:350px')) }} + {!! $errors->first('status_id', ' :message') !!} +
+
+ + + +
+ +
+ {{ Form::select('company_id', $company_list , Input::old('company_id'), array('class'=>'select2', 'style'=>'width:350px')) }} + {!! $errors->first('company_id', ' :message') !!} +
+
+ + +
+ +
+ {{ Form::select('manager_id', $manager_list , Input::old('manager_id'), array('class'=>'select2', 'style'=>'width:350px')) }} + {!! $errors->first('manager_id', ' :message') !!} +
+
+ + +
+
+ Activated +
+
+
+ +
+
+
+ + + +
+ +
+ @if ((Config::get('app.lock_passwords') || (!Auth::user()->isSuperUser()))) + + Only superadmins may edit group memberships.

+ @else +
+ + + + {{ trans('admin/users/table.groupnotes') }} + +
+ @endif +
+
+ + + @foreach ($users as $user) + + @endforeach +
+ + +
+
+
+
+@stop diff --git a/resources/views/users/edit.blade.php b/resources/views/users/edit.blade.php index c77fce39f..354db7c43 100755 --- a/resources/views/users/edit.blade.php +++ b/resources/views/users/edit.blade.php @@ -357,41 +357,6 @@ - -
- -
- @if ((Config::get('app.lock_passwords') || (!Auth::user()->isSuperUser()))) - @if (count($userGroups->keys()) > 0) -
    - @foreach ($groups as $id => $group) - {!! ($userGroups->keys()->contains($id) ? '
  • '.e($group).'
  • ' : '') !!} - @endforeach -
- @endif - Only superadmins may edit group memberships.

- @else -
- - - - {{ trans('admin/users/table.groupnotes') }} - -
- @endif -
-
@if (!$user->id) diff --git a/resources/views/users/index.blade.php b/resources/views/users/index.blade.php index 12371a588..d866ba29b 100755 --- a/resources/views/users/index.blade.php +++ b/resources/views/users/index.blade.php @@ -50,6 +50,7 @@
@@ -59,10 +60,9 @@ 'users', 'middleware' => ['web','auth']], function () 'uses' => 'UsersController@postBulkSave', ] ); + Route::post( + 'bulkeditsave', + [ + 'as' => 'users/bulkeditsave', + 'uses' => 'UsersController@postBulkEditSave', + ] + ); });