diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index 6e8ebecb..3cc976ed 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -275,6 +275,9 @@ public function destroy(Request $request) if ($user->submissions()->count() > 0){ $json_result = array('done' => 0, 'message' => "You must delete users' submission before you can delete user."); } + elseif (Auth::user()->id == $user_id) { + $json_result = array('done' => 0, 'message' => 'You cannot delete yourself!'); + } elseif (User::destroy($user_id)) $json_result = array('done' => 1); else @@ -291,7 +294,7 @@ public function delete_submissions(User $user){ $i = 0; $json_result = array('done'=>0 , 'count' => 0); foreach ($subs as $sub) { - var_dump($sub->directory()); + // var_dump($sub->directory()); shell_exec("rm -rf " . $sub->directory()); $sub->delete(); $i++; @@ -361,8 +364,8 @@ public function add_user($username, $email, $password, $role, $display_name="", 'display_name' => $display_name ]; $validator = Validator::make($user, [ - 'username' => ['required', 'string', 'max:50', 'unique:users'], - 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], + 'username' => ['required', 'string', 'max:50', 'unique:users', 'regex:/^\S*$/'], + 'email' => ['required', 'string', 'email', 'max:255', 'unique:users', 'regex:/^\S*$/'], 'display_name' => ['nullable', 'string', 'max:255'], 'password' => ['required', 'string', 'min:8'], ]); @@ -497,8 +500,6 @@ public function set_trial(Request $request){ $count = $where_clause->update(['trial_time' => DB::Raw(" TIMESTAMPDIFF(HOUR, `created_at`, '$end_time' )") ,'role_id' => 4 ] ); } // dd($count); - return back()->with(['success' => $count ])->withInput() - ; + return back()->with(['success' => $count ])->withInput(); } - -} +} \ No newline at end of file diff --git a/resources/views/users/list.blade.php b/resources/views/users/list.blade.php index 6594bbc4..d8f1261b 100644 --- a/resources/views/users/list.blade.php +++ b/resources/views/users/list.blade.php @@ -41,16 +41,21 @@ Add Users Email all users Update multiple users trial time + {{-- Excel --}} @endsection @section('content') copy user name list +@if (Auth::user()->role->name == 'admin') + +@endif
+ {{-- --}} @@ -64,6 +69,9 @@ @foreach ($users as $user) + {{-- --}} @@ -176,10 +184,95 @@ $("#user_delete").modal("show"); }); + let selected_users = []; + + $('.checkbox').click(function() { + let username = $(this).parents('tr').find('#un').text().trim(); + let id = $(this).parents('tr').data('id'); + + if ($(this).hasClass('fa-check-circle')) { + $(this).removeClass('fa-check-circle').addClass('fa-circle'); + this.classList.add('fa-circle'); + selected_users = selected_users.filter(user => user.id !== id && user.username !== username); + } else { + $(this).removeClass('fa-circle').addClass('fa-check-circle'); + selected_users.push({ + id: id, + username: username, + }); + } + console.log(selected_users) + }); + + $("#delete_selected").click(function(e) { + e.preventDefault(); + console.log(selected_users) + + if (selected_users.length === 0) return; + + // Show popup + let row = $(this).parents('tr'); + let user_ids = row.data('id'); + let usernames = row.children('#un').html(); + + $(".modal-title").html("Are you sure you want to DELETE these users and their submissions?"); + $(".modal-body").html('') + selected_users.forEach(user => { + $(".modal-body").append('User ID: '+user.id+'
Username: '+user.username+'

'); + }); + $("#user_delete").modal("show"); + + $(".confirm-user-delete").click(function() { + $("#user_delete").modal("hide"); + selected_users.forEach(async user => { + + // Delete submissions + await $.ajax({ + url: 'users/delete_submissions/'+user.id, + type: 'POST', + data: { + user_id: user.id, + "_token": "{{ csrf_token() }}", + }, + error: shj.loading_error, + success: function (response){ + if (response.done) { + $.notify('All ' + parseInt(response.count) +' submission(s) ' + 'of User '+user.username +' has been deleted.', {position: 'bottom right', className: 'success', autoHideDelay: 5000}); + } + else { + shj.loading_failed(response.message); + } + } + }); + + // Delete user + await $.ajax({ + url: '{{ route('users.index') }}/'+user.id, + type: 'DELETE', + data: { + user_id: user.id, + "_token": "{{ csrf_token() }}", + }, + error: shj.loading_error, + success: function (response){ + if (response.done) { + row.animate({backgroundColor: '#FF7676'},100, function(){row.remove();}); + $.notify('User '+user.username+' deleted.', {position: 'bottom right', className: 'success', autoHideDelay: 5000}); + } + else { + shj.loading_failed(response.message); + } + } + }); + + }); + }); + }); + $("table").DataTable({ - "pageLength": 50, - "lengthMenu": [ [20, 50, 100, 200, -1], [20, 50, 100, 200, "All"] ] - }); + "pageLength": 50, + "lengthMenu": [ [20, 50, 100, 200, -1], [20, 50, 100, 200, "All"] ] + }); }); diff --git a/routes/web.php b/routes/web.php index 108559cc..d6ecc890 100644 --- a/routes/web.php +++ b/routes/web.php @@ -42,6 +42,7 @@ Route::view('users/set_trial', 'users.set_trial')->name('users.set_trial')->middleware('auth'); Route::post('users/set_trial', [App\Http\Controllers\UserController::class, 'set_trial'])->name('users.set_trial_post'); + Route::get('/problems/downloadtestsdesc/{id}', [App\Http\Controllers\problem_controller::class, 'downloadtestsdesc'])->name('problems.downloadtestsdesc'); Route::get('/problems/downloadpdf/{id}', [App\Http\Controllers\problem_controller::class, 'pdf'])->name('problems.pdf'); Route::get('/problems/downloadtemplate/{problem_id}/{assignment_id}', [App\Http\Controllers\problem_controller::class, 'template'])->name('problems.template');
#User IDUsername
+ + {{$loop->iteration}} {{$user->id}} {{$user->username}}