diff --git a/app/Http/Controllers/AutograderController.php b/app/Http/Controllers/AutograderController.php index 0a0bfaadd0074ae57890161542633e659cc22678..67993bd06f9bb10ca323b789792372abbc909099 100644 --- a/app/Http/Controllers/AutograderController.php +++ b/app/Http/Controllers/AutograderController.php @@ -147,23 +147,60 @@ class AutograderController extends Controller } } - $results[] = AutograderController::jaccardIndex($key, $answer); + $results[] = AutograderController::cosine($key, $answer); } return $results; } /** - * Get Jaccard Index score + * Get Cosine Similarity * * @return score */ - public function jaccardIndex($key, $answer) { - $arr_intersection = count(array_intersect( $key, $answer )); - $arr_union = count(array_merge( $key, $answer )) - $arr_intersection; - $jaccard_index = $arr_intersection / $arr_union; + public function cosine($key, $answer) { + $token = []; + $vector1 = []; + $vector2 = []; + foreach($key as $k) { + if (!in_array($k, $token)) { + $token[] = $k; + $vector1[] = 0; + $vector2[] = 0; + } + } + + foreach($answer as $k) { + if (!in_array($k, $token)) { + $token[] = $k; + $vector1[] = 0; + $vector2[] = 0; + } + } + + foreach($key as $k) { + $vector1[array_search($k, $token)] += 1; + } + foreach($answer as $k) { + $vector2[array_search($k, $token)] += 1; + } + + $dot_product = 0; + for($i=0; $i<count($token); $i++) { + $dot_product += ($vector1[$i])*($vector2[$i]); + } + + $length1 = 0; + $length2 = 0; - return $jaccard_index; + for($i=0; $i<count($token); $i++) { + $length1 += pow($vector1[$i], 2); + $length2 += pow($vector2[$i], 2); + } + + $similarity = $dot_product/sqrt($length1*$length2); + + return $similarity; } /** diff --git a/app/Http/Controllers/CourseController.php b/app/Http/Controllers/CourseController.php index e08391fbe1e267fc99e5328b62c82f4130acb952..6d8109cd61b6c416af84c51caca9ab254b08f7fa 100644 --- a/app/Http/Controllers/CourseController.php +++ b/app/Http/Controllers/CourseController.php @@ -76,6 +76,20 @@ class CourseController extends Controller return redirect()->route('home', ['msg' => 2]); } + /** + * Edit course name + * + * @return newCourse + */ + public function edit($id_course, Request $request) + { + DB::table('courses')->where('id', $id_course)->update([ + 'name' => $request->course_name, + ]); + + return redirect()->route('course', ['id_course' => $id_course, 'msg' => 5]); + } + /** * delete course * @@ -110,4 +124,18 @@ class CourseController extends Controller ]); return redirect()->route('home', ['msg' => 3]); } + + /** + * Edit Topic + * + * @return msg + */ + public function editTopic($id_course, $id_topic, Request $request) { + DB::table('topics')->where('id', $id_topic)->update([ + 'name' => $request->topic_name, + 'description' => $request->topic_description + ]); + + return redirect()->route('course', ['id_course' => $id_course, 'msg' => 4]); + } } diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index 78f0be5778bc8631a1cd1ea22927aa94ab3a4d57..ad747df869ccc82454cd798f351bce00403f14de 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -5,6 +5,8 @@ namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Hash; +use App\Http\Requests\UpdatePasswordRequest; class HomeController extends Controller { @@ -43,6 +45,16 @@ class HomeController extends Controller return view('home', ['profile' => $profile, 'role' => $role, 'courses' => $courses, 'enrolled' => $enrolled]); } + /** + * Show the application dashboard. + * + * @return \Illuminate\Contracts\Support\Renderable + */ + public function editPassword() + { + return view('editPassword'); + } + public function profile(Request $request) { DB::table('users')->where('id', Auth::id())->update([ @@ -51,4 +63,17 @@ class HomeController extends Controller return redirect()->route('home', ['msg' => 1]); } + + /** + * @param UpdatePasswordRequest $request + * @return \Illuminate\Http\RedirectResponse + */ + public function password(UpdatePasswordRequest $request) + { + DB::table('users')->where('id', Auth::id())->update([ + 'password' => Hash::make($request->get('password')) + ]); + + return redirect()->route('home', ['msg' => 5]); + } } diff --git a/app/Http/Requests/UpdatePasswordRequest.php b/app/Http/Requests/UpdatePasswordRequest.php new file mode 100644 index 0000000000000000000000000000000000000000..5f3d90427144f9ebbac0a8f892f5f9cb1fc67f79 --- /dev/null +++ b/app/Http/Requests/UpdatePasswordRequest.php @@ -0,0 +1,31 @@ +<?php + +namespace App\Http\Requests; + +use Illuminate\Foundation\Http\FormRequest; +use Illuminate\Support\Facades\Auth; + +class UpdatePasswordRequest extends FormRequest +{ + /** + * Determine if the user is authorized to make this request. + * + * @return bool + */ + public function authorize() + { + return Auth::check(); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules() + { + return [ + 'password' => ['required', 'string', 'min:8', 'confirmed'], + ]; + } +} diff --git a/public/css/home.css b/public/css/home.css index e2a29e59b9240ab4264516e6c124e3e71ed2a2b2..b8340a70cb50c7c47e9d731eaab1f86bcf921971 100644 --- a/public/css/home.css +++ b/public/css/home.css @@ -10,4 +10,8 @@ #edit { margin-top: 2rem; +} + +.editpass { + float: left; } \ No newline at end of file diff --git a/resources/views/course.blade.php b/resources/views/course.blade.php index b98b2652fea1af39ee4b108b8d2d57b218c44478..d1e60c6a7e486ccebde3557a3071700262db0476 100644 --- a/resources/views/course.blade.php +++ b/resources/views/course.blade.php @@ -24,6 +24,20 @@ <span aria-hidden="true">×</span> </button> </div> + @elseif( request()->get('msg') == 4 ) + <div class="alert alert-success alert-dismissible fade show" role="alert"> + Deskripsi Materi Berhasil Diubah + <button type="button" class="close" data-dismiss="alert" aria-label="Close"> + <span aria-hidden="true">×</span> + </button> + </div> + @elseif( request()->get('msg') == 5 ) + <div class="alert alert-success alert-dismissible fade show" role="alert"> + Nama Kelas Berhasil Diubah + <button type="button" class="close" data-dismiss="alert" aria-label="Close"> + <span aria-hidden="true">×</span> + </button> + </div> @else <div class="alert alert-danger alert-dismissible fade show" role="alert"> Pembuatan Materi Gagal @@ -55,7 +69,8 @@ {{ $topic->description }} <br/><br/> @if(Auth::user()->role == 1) <button type="button" class="btn btn-danger" data-toggle="modal" data-target="#deleteModal{{ $topic->id }}">Hapus</button> - <a href="<?php echo $topic->id_course; ?>/learn/<?php echo $topic->id; ?>/edit" class="btn btn-primary" role="button">Edit Materi</a> + <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#editModal{{ $topic->id }}">Edit Deskripsi</button> + <a style="float: right;" href="<?php echo $topic->id_course; ?>/learn/<?php echo $topic->id; ?>/edit" class="btn btn-primary" role="button">Isi Konten</a> <div class="modal fade" id="deleteModal{{ $topic->id }}" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true"> <div class="modal-dialog modal-dialog-centered" role="document"> <div class="modal-content"> @@ -76,6 +91,35 @@ </div> </div> </div> + <div class="modal fade" id="editModal{{ $topic->id }}" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true"> + <div class="modal-dialog modal-dialog-centered" role="document"> + <div class="modal-content"> + <form action="<?php echo Request::url(); ?>/edit_topic/{{ $topic->id }}" method="post"> + {{ csrf_field() }} + <div class="modal-header"> + <h5 class="modal-title" id="exampleModalCenterTitle">Edit Materi</h5> + <button type="button" class="close" data-dismiss="modal" aria-label="Close"> + <span aria-hidden="true">×</span> + </button> + </div> + <div class="modal-body"> + <div class="form-group"> + <label for="topic-name" class="col-form-label">Edit Judul Materi</label> + <input type="text" class="form-control" name="topic_name" id="topic-name" required="required" value="{{ $topic->name }}"> + </div> + <div class="form-group"> + <label for="topic-description">Edit Deskripsi</label> + <textarea class="form-control" name="topic_description" id="topic_description" rows="2">{{ $topic->description }}</textarea> + </div> + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-secondary" data-dismiss="modal">Batal</button> + <button type="submit" class="btn btn-primary">Submit</button> + </div> + </form> + </div> + </div> + </div> @else <a href="<?php echo $topic->id_course; ?>/learn/<?php echo $topic->id; ?>" class="btn btn-primary" role="button">Buka Materi</a> @endif @@ -110,6 +154,34 @@ </div> </div> </div> + <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#nameCourse"> + Edit Nama Kelas + </button> + <div class="modal fade" id="nameCourse" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true"> + <div class="modal-dialog modal-dialog-centered" role="document"> + <div class="modal-content"> + <form action="{{ $course->id }}/edit" method="post"> + {{ csrf_field() }} + <div class="modal-header"> + <h5 class="modal-title" id="exampleModalCenterTitle">Edit Nama Kelas</h5> + <button type="button" class="close" data-dismiss="modal" aria-label="Close"> + <span aria-hidden="true">×</span> + </button> + </div> + <div class="modal-body"> + <div class="form-group"> + <label for="topic-name" class="col-form-label">Nama Kelas</label> + <input type="text" class="form-control" name="course_name" id="course-name" required="required" value="{{ $course->name }}"> + </div> + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-secondary" data-dismiss="modal">Batal</button> + <button type="submit" class="btn btn-primary">Submit</button> + </div> + </form> + </div> + </div> + </div> <button style="float: right;" type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModalCenter"> Tambah Materi </button> @@ -127,7 +199,7 @@ <div class="modal-body"> <div class="form-group"> <label for="topic-name" class="col-form-label">Masukkan Judul Materi</label> - <input type="text" class="form-control" name="topic_name" id="topic-name" required="required" placeholder="Judul Topik"> + <input type="text" class="form-control" name="topic_name" id="topic-name" required="required" placeholder="Judul Materi"> </div> <div class="form-group"> <label for="topic-description">Deskripsi</label> diff --git a/resources/views/editPassword.blade.php b/resources/views/editPassword.blade.php new file mode 100644 index 0000000000000000000000000000000000000000..0d9432247b9cedd595d788a8e40ab49bf5dd618f --- /dev/null +++ b/resources/views/editPassword.blade.php @@ -0,0 +1,48 @@ +@extends('layouts.app') + +@section('content') +<div class="container"> + <div class="row justify-content-center"> + <div class="col-md-8"> + <div class="card"> + <div class="card-header">Ubah Password</div> + + <div class="card-body"> + <form method="POST" action="/password"> + @csrf + <div class="form-group row"> + <label for="password" class="col-md-4 col-form-label text-md-right">Password Baru</label> + + <div class="col-md-6"> + <input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="new-password"> + + @error('password') + <span class="invalid-feedback" role="alert"> + <strong>{{ $message }}</strong> + </span> + @enderror + </div> + </div> + + <div class="form-group row"> + <label for="password-confirm" class="col-md-4 col-form-label text-md-right">Konfirmasi Password</label> + + <div class="col-md-6"> + <input id="password-confirm" type="password" class="form-control" name="password_confirmation" required autocomplete="new-password"> + </div> + </div> + + <div class="form-group row mb-0"> + <div class="col-md-6 offset-md-4"> + <button type="submit" class="btn btn-primary"> + Ubah Password + </button> + </div> + </div> + </form> + </div> + </div> + </div> + </div> +</div> +@endsection diff --git a/resources/views/home.blade.php b/resources/views/home.blade.php index 1cb3cad8c20e83cf0b1220550eb31a4672d7bb78..05cce0a1a1937756bab01cc50df620660f5c8d17 100644 --- a/resources/views/home.blade.php +++ b/resources/views/home.blade.php @@ -31,6 +31,13 @@ <span aria-hidden="true">×</span> </button> </div> + @elseif( request()->get('msg') == 5 ) + <div class="alert alert-success alert-dismissible fade show" role="alert"> + Password Berhasil Diubah + <button type="button" class="close" data-dismiss="alert" aria-label="Close"> + <span aria-hidden="true">×</span> + </button> + </div> @endif @endisset <div class="row justify-content"> @@ -95,7 +102,7 @@ <a id="email">{{ $profile->email }}</a> <br/> <a id="role">{{ $role }}</a> <br/><br/> <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModalCenter"> - Edit Profile + Edit Profil </button> <div class="modal fade" id="exampleModalCenter" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true"> <div class="modal-dialog modal-dialog-centered" role="document"> @@ -116,6 +123,7 @@ </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" data-dismiss="modal">Batal</button> + <a href="edit_password" class="btn btn-primary editpass" role="button">Ubah Password</a> <button type="submit" class="btn btn-primary">Submit</button> </div> </form> @@ -131,27 +139,25 @@ <div class="col-md-12"> <div class="card"> <div class="card-header"><b>Kelas Tersedia</b></div> - <div class="card-body"> - <div class="accordion" id="accordionCourses"> - @foreach($courses as $index => $course) - <div class="card"> - <div class="card-header" id="heading<?php echo $course->id; ?>" style="transform: rotate(0);"> - <a class="stretched-link" type="button" data-toggle="collapse" data-target="#collapse<?php echo $course->id; ?>" aria-expanded="false" aria-controls="collapse<?php echo $course->id; ?>">{{ $course->name }}</a> - </div> + <div class="accordion" id="accordionCourses"> + @foreach($courses as $index => $course) + <div class="card"> + <div class="card-header" id="heading<?php echo $course->id; ?>" style="transform: rotate(0);"> + <a class="stretched-link" type="button" data-toggle="collapse" data-target="#collapse<?php echo $course->id; ?>" aria-expanded="false" aria-controls="collapse<?php echo $course->id; ?>">{{ $course->name }}</a> + </div> - <div id="collapse<?php echo $course->id; ?>" class="collapse" aria-labelledby="heading<?php echo $course->id; ?>" data-parent="#accordionCourses"> - <div class="card-body"> - {{ $course->description }} <br/><br/> - <form action="course/enroll" method="post"> - {{ csrf_field() }} - <input style="display: none;" type="number" class="form-control" name="enroll_id" id="enroll_id" required="required" value="<?php echo $course->id ?>"> - <button type="submit" class="btn btn-primary">Daftar Kelas</button> - </form> - </div> + <div id="collapse<?php echo $course->id; ?>" class="collapse" aria-labelledby="heading<?php echo $course->id; ?>" data-parent="#accordionCourses"> + <div class="card-body"> + {{ $course->description }} <br/><br/> + <form action="course/enroll" method="post"> + {{ csrf_field() }} + <input style="display: none;" type="number" class="form-control" name="enroll_id" id="enroll_id" required="required" value="<?php echo $course->id ?>"> + <button type="submit" class="btn btn-primary">Daftar Kelas</button> + </form> </div> </div> - @endforeach - </div> + </div> + @endforeach </div> </div> </div> diff --git a/routes/web.php b/routes/web.php index c6aeaad0020624f0da7e71d60ae7f57e17c8e657..3d26056a7b5704c45f7718ec0ee467d2a4a70e71 100644 --- a/routes/web.php +++ b/routes/web.php @@ -14,10 +14,14 @@ Auth::routes(); Route::get('/', 'HomeController@index')->name('home'); Route::redirect('/home', '/'); Route::post('/profile', 'HomeController@profile')->name('profile'); +Route::get('/edit_password', 'HomeController@editPassword')->name('edit_password'); +Route::post('/password', 'HomeController@password')->name('password'); Route::get('/course/{id_course}', 'CourseController@index')->name('course'); +Route::post('/course/{id_course}/edit_topic/{id_topic}', 'CourseController@editTopic')->name('edit_topic'); Route::post('/course/new', 'CourseController@new')->name('course/new'); Route::post('/course/enroll', 'CourseController@enroll')->name('course/enroll'); Route::post('/course/{id_course}/delete', 'CourseController@delete')->name('course/delete'); +Route::post('/course/{id_course}/edit', 'CourseController@edit')->name('course/edit'); Route::post('/course/{id_course}/learn/new', 'LearnController@new')->name('learn/new'); Route::get('/course/{id_course}/learn/{id_topic}', 'LearnController@index')->name('learn'); Route::get('/course/{id_course}/learn/{id_topic}/edit', 'LearnController@edit')->name('edit');