Browse Source

Add admin ui

Jovan Jovanovic 3 years ago
parent
commit
0597b4aabe

+ 57 - 5
app/Http/Controllers/Admin/UserController.php

@@ -5,6 +5,7 @@ namespace App\Http\Controllers\Admin;
 use App\Classes\Pterodactyl;
 use App\Http\Controllers\Controller;
 use App\Models\User;
+use App\Notifications\DynamicNotification;
 use Exception;
 use Illuminate\Contracts\Foundation\Application;
 use Illuminate\Contracts\View\Factory;
@@ -12,8 +13,10 @@ use Illuminate\Contracts\View\View;
 use Illuminate\Http\RedirectResponse;
 use Illuminate\Http\Request;
 use Illuminate\Http\Response;
+use Illuminate\Notifications\Messages\MailMessage;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Hash;
+use Illuminate\Support\HtmlString;
 use Illuminate\Validation\Rule;
 use Illuminate\Validation\ValidationException;
 
@@ -104,7 +107,6 @@ class UserController extends Controller
         $user->update($request->all());
 
         return redirect()->route('admin.users.index')->with('success', 'User updated!');
-
     }
 
     /**
@@ -142,6 +144,55 @@ class UserController extends Controller
         return redirect()->route('admin.users.index');
     }
 
+    /**
+     * Show the form for seding notifications to the specified resource.
+     *
+     * @param User $user
+     * @return Application|Factory|View|Response
+     */
+    public function notifications(User $user)
+    {
+        return view('admin.users.notifications')->with([
+            'user' => $user
+        ]);
+    }
+
+    /**
+     * Notify the specified resource.
+     *
+     * @param Request $request
+     * @param User $user
+     * @return RedirectResponse
+     * @throws Exception
+     */
+    public function notify(Request $request, User $user)
+    {
+        $via = $request->validate([
+            "via" => "required|min:1|array",
+            "via.*" => "required|string|in:mail,database",
+        ])["via"];
+
+        $mail = null;
+        $database = null;
+        if (in_array('database', $via)) {
+            $database = $request->validate([
+                "title" => "required|string|min:1",
+                "content" => "required|string|min:1"
+            ]);
+        }
+        if (in_array('mail', $via)) {
+            $data = $request->validate([
+                "subject" => "required|string|min:1",
+                "body" => "required|string|min:1"
+            ]);
+            $mail = (new MailMessage)->subject($data["subject"])->line(new HtmlString($data["body"]));
+        }
+        $user->notify(
+            new DynamicNotification($via, $database, $mail)
+        );
+        return redirect()->route('admin.users.notifications', $user->id)->with('success', 'User notified!');
+    }
+
     /**
      *
      * @throws Exception
@@ -177,6 +228,7 @@ class UserController extends Controller
                 <a data-content="Login as user" data-toggle="popover" data-trigger="hover" data-placement="top" href="' . route('admin.users.loginas', $user->id) . '" class="btn btn-sm btn-primary mr-1"><i class="fas fa-sign-in-alt"></i></a>
                 <a data-content="Show" data-toggle="popover" data-trigger="hover" data-placement="top"  href="' . route('admin.users.show', $user->id) . '" class="btn btn-sm text-white btn-warning mr-1"><i class="fas fa-eye"></i></a>
                 <a data-content="Edit" data-toggle="popover" data-trigger="hover" data-placement="top"  href="' . route('admin.users.edit', $user->id) . '" class="btn btn-sm btn-info mr-1"><i class="fas fa-pen"></i></a>
+                <a data-content="Notifications" data-toggle="popover" data-trigger="hover" data-placement="top"  href="' . route('admin.users.notifications', $user->id) . '" class="btn btn-sm btn-info mr-1"><i class="fas fa-paper-plane"></i></a>
                 <form class="d-inline" onsubmit="return submitResult();" method="post" action="' . route('admin.users.destroy', $user->id) . '">
                             ' . csrf_field() . '
                             ' . method_field("DELETE") . '
@@ -186,16 +238,16 @@ class UserController extends Controller
             })
             ->editColumn('role', function (User $user) {
                 switch ($user->role) {
-                    case 'admin' :
+                    case 'admin':
                         $badgeColor = 'badge-danger';
                         break;
-                    case 'mod' :
+                    case 'mod':
                         $badgeColor = 'badge-info';
                         break;
-                    case 'client' :
+                    case 'client':
                         $badgeColor = 'badge-success';
                         break;
-                    default :
+                    default:
                         $badgeColor = 'badge-secondary';
                         break;
                 }

+ 161 - 0
resources/views/admin/users/notifications.blade.php

@@ -0,0 +1,161 @@
+@extends('layouts.main')
+
+@section('content')
+    <!-- CONTENT HEADER -->
+    <section class="content-header">
+        <div class="container-fluid">
+            <div class="row mb-2">
+                <div class="col-sm-6">
+                    <h1>Users</h1>
+                </div>
+                <div class="col-sm-6">
+                    <ol class="breadcrumb float-sm-right">
+                        <li class="breadcrumb-item"><a href="{{route('home')}}">Dashboard</a></li>
+                        <li class="breadcrumb-item"><a href="{{route('admin.users.index')}}">Users</a></li>
+                        <li class="breadcrumb-item"><a class="text-muted"
+                                                       href="{{route('admin.users.notifications' , $user->id)}}">Notifications</a></li>
+                    </ol>
+                </div>
+            </div>
+        </div>
+    </section>
+    <!-- END CONTENT HEADER -->
+
+    <!-- MAIN CONTENT -->
+    <section class="content">
+        <div class="container-fluid">
+
+            <div class="row">
+                <div class="col-lg-12">
+                    <div class="card">
+                        <div class="card-body">
+                            <form action="{{route('admin.users.notifications', $user->id)}}" method="POST">
+                                @csrf
+                                @method('POST')
+
+                                <div class="form-group">
+                                    <label>Send via</label><br>
+                                    <input value="database" id="database" name="via[]"
+                                           type="checkbox"
+                                           onchange="toggleGroup('database-group')">
+                                    <label for="database">Database</label>
+                                    <br>
+                                    <input value="mail" id="mail" name="via[]"
+                                           type="checkbox"
+                                           onchange="toggleGroup('mail-group')">
+                                    <label for="mail">Mail</label>
+                                    @error('via')
+                                        <div class="invalid-feedback d-block">
+                                            {{$message}}
+                                        </div>
+                                    @enderror
+                                </div>
+
+                                <div class="d-none" id="database-group">
+                                    <div class="form-group" >
+                                        <label for="title">Title</label>
+                                        <input value="{{old('title')}}" id="title" name="title"
+                                            type="text"
+                                            class="form-control @error('title') is-invalid @enderror">
+                                        @error('title')
+                                        <div class="invalid-feedback">
+                                            {{$message}}
+                                        </div>
+                                        @enderror
+                                    </div>
+                                    <div class="form-group">
+                                        <label for="content">Content</label>
+                                        <textarea id="content"
+                                                name="content"
+                                                type="content"
+                                                class="form-control @error('content') is-invalid @enderror">
+                                            {{old('content')}}
+                                        </textarea>
+                                        @error('content')
+                                        <div class="text-danger">
+                                            {{$message}}
+                                        </div>
+                                        @enderror
+                                    </div>
+                                </div>
+
+                                <div class="d-none" id="mail-group">
+                                    <div class="form-group">
+                                        <label for="subject">Subject</label>
+                                        <input value="{{old('subject')}}" id="subject" name="subject"
+                                            type="text"
+                                            class="form-control @error('subject') is-invalid @enderror">
+                                        @error('subject')
+                                        <div class="invalid-feedback">
+                                            {{$message}}
+                                        </div>
+                                        @enderror
+                                    </div>
+
+                                    <div class="form-group">
+                                        <label for="body">Body</label>
+                                        <textarea id="body"
+                                                name="body"
+                                                type="body"
+                                                class="form-control @error('body') is-invalid @enderror">
+                                            {{old('body')}}
+                                        </textarea>
+                                        @error('body')
+                                        <div class="text-danger">
+                                            {{$message}}
+                                        </div>
+                                        @enderror
+                                    </div>
+                                </div>
+                                <div class="form-group text-right">
+                                    <button type="submit" class="btn btn-primary">Submit</button>
+                                </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+
+    </section>
+    <!-- END CONTENT -->
+    <script>
+        document.addEventListener('DOMContentLoaded', (event) => {
+            // Summernote
+            $('#body').summernote({
+                height: 100,
+                toolbar: [
+                    [ 'style', [ 'style' ] ],
+                    [ 'font', [ 'bold', 'italic', 'underline', 'strikethrough', 'superscript', 'subscript', 'clear'] ],
+                    [ 'fontname', [ 'fontname' ] ],
+                    [ 'fontsize', [ 'fontsize' ] ],
+                    [ 'color', [ 'color' ] ],
+                    [ 'para', [ 'ol', 'ul', 'paragraph', 'height' ] ],
+                    [ 'table', [ 'table' ] ],
+                    [ 'insert', [ 'link'] ],
+                    [ 'view', [ 'undo', 'redo', 'fullscreen', 'codeview', 'help' ] ]
+                ]
+            })
+            $('#content').summernote({
+                height: 100,
+                toolbar: [
+                    [ 'style', [ 'style' ] ],
+                    [ 'font', [ 'bold', 'italic', 'underline', 'strikethrough', 'superscript', 'subscript', 'clear'] ],
+                    [ 'fontname', [ 'fontname' ] ],
+                    [ 'fontsize', [ 'fontsize' ] ],
+                    [ 'color', [ 'color' ] ],
+                    [ 'para', [ 'ol', 'ul', 'paragraph', 'height' ] ],
+                    [ 'table', [ 'table' ] ],
+                    [ 'insert', [ 'link'] ],
+                    [ 'view', [ 'undo', 'redo', 'fullscreen', 'codeview', 'help' ] ]
+                ]
+            })
+        })
+
+        function toggleGroup(name) {
+            document.getElementById(name).classList.toggle("d-none")
+        }
+    </script>
+
+
+@endsection

+ 2 - 0
routes/web.php

@@ -76,6 +76,8 @@ Route::middleware('auth')->group(function () {
 
         Route::get('users/loginas/{user}', [UserController::class, 'loginAs'])->name('users.loginas');
         Route::get('users/datatable', [UserController::class, 'datatable'])->name('users.datatable');
+        Route::get('users/{user}/notifications', [UserController::class, 'notifications'])->name('users.notifications');
+        Route::post('users/{user}/notifications', [UserController::class, 'notify'])->name('users.notifications');
         Route::resource('users', UserController::class);
 
         Route::get('servers/datatable', [AdminServerController::class, 'datatable'])->name('servers.datatable');