]> BookStack Code Mirror - bookstack/commitdiff
Added User managment. Fixes #5
authorDan Brown <redacted>
Sat, 8 Aug 2015 19:05:30 +0000 (20:05 +0100)
committerDan Brown <redacted>
Sat, 8 Aug 2015 19:05:30 +0000 (20:05 +0100)
13 files changed:
app/Http/Controllers/UserController.php [new file with mode: 0644]
app/Http/Middleware/Authenticate.php
app/Http/routes.php
resources/assets/sass/_buttons.scss
resources/assets/sass/_tables.scss [new file with mode: 0644]
resources/assets/sass/styles.scss
resources/views/base.blade.php
resources/views/form/password.blade.php
resources/views/users/create.blade.php [new file with mode: 0644]
resources/views/users/delete.blade.php [new file with mode: 0644]
resources/views/users/edit.blade.php [new file with mode: 0644]
resources/views/users/form.blade.php [new file with mode: 0644]
resources/views/users/index.blade.php [new file with mode: 0644]

diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php
new file mode 100644 (file)
index 0000000..07d2cac
--- /dev/null
@@ -0,0 +1,132 @@
+<?php
+
+namespace Oxbow\Http\Controllers;
+
+use Illuminate\Http\Request;
+
+use Illuminate\Support\Facades\Hash;
+use Oxbow\Http\Requests;
+use Oxbow\Http\Controllers\Controller;
+use Oxbow\User;
+
+class UserController extends Controller
+{
+
+    protected $user;
+
+    /**
+     * UserController constructor.
+     * @param $user
+     */
+    public function __construct(User $user)
+    {
+        $this->user = $user;
+    }
+
+
+    /**
+     * Display a listing of the users.
+     *
+     * @return Response
+     */
+    public function index()
+    {
+        $users = $this->user->all();
+        return view('users/index', ['users'=> $users]);
+    }
+
+    /**
+     * Show the form for creating a new user.
+     *
+     * @return Response
+     */
+    public function create()
+    {
+        return view('users/create');
+    }
+
+    /**
+     * Store a newly created user in storage.
+     *
+     * @param  Request  $request
+     * @return Response
+     */
+    public function store(Request $request)
+    {
+        $this->validate($request, [
+            'name' => 'required',
+            'email' => 'required|email',
+            'password' => 'required|min:5',
+            'password-confirm' => 'required|same:password'
+        ]);
+
+        $user = $this->user->fill($request->all());
+        $user->password = Hash::make($request->get('password'));
+        $user->save();
+        return redirect('/users');
+    }
+
+
+    /**
+     * Show the form for editing the specified user.
+     *
+     * @param  int  $id
+     * @return Response
+     */
+    public function edit($id)
+    {
+        $user = $this->user->findOrFail($id);
+        return view('users/edit', ['user' => $user]);
+    }
+
+    /**
+     * Update the specified user in storage.
+     *
+     * @param  Request  $request
+     * @param  int  $id
+     * @return Response
+     */
+    public function update(Request $request, $id)
+    {
+        $this->validate($request, [
+            'name' => 'required',
+            'email' => 'required|email',
+            'password' => 'min:5',
+            'password-confirm' => 'same:password'
+        ]);
+
+        $user = $this->user->findOrFail($id);
+        $user->fill($request->all());
+
+        if($request->has('password') && $request->get('password') != '') {
+            $password = $request->get('password');
+            $user->password = Hash::make($password);
+        }
+        $user->save();
+        return redirect('/users');
+    }
+
+    /**
+     * Show the user delete page.
+     * @param $id
+     * @return \Illuminate\View\View
+     */
+    public function delete($id)
+    {
+        $user = $this->user->findOrFail($id);
+        return view('users/delete', ['user' => $user]);
+    }
+
+    /**
+     * Remove the specified user from storage.
+     *
+     * @param  int  $id
+     * @return Response
+     */
+    public function destroy($id)
+    {
+        $user = $this->user->findOrFail($id);
+        $user->delete();
+        return redirect('/users');
+    }
+}
index c3ddb9a0dba430d0f8161f9830df8b39736072f5..563fb1e9d89e6336e9b10a98be0bdb407b8314a5 100644 (file)
@@ -17,8 +17,7 @@ class Authenticate
     /**
      * Create a new filter instance.
      *
-     * @param  Guard  $auth
-     * @return void
+     * @param  Guard $auth
      */
     public function __construct(Guard $auth)
     {
index 7053c71b9035dd6c44047a1a0043a66364af317d..d1ea3e854e79d714c40830f5d12cd8b5fe816c61 100644 (file)
@@ -50,11 +50,24 @@ Route::group(['middleware' => 'auth'], function() {
 
     Route::post('/upload/image', 'ImageController@upload');
 
+    // Users
+    Route::get('/users', 'UserController@index');
+    Route::get('/users/create', 'UserController@create');
+    Route::get('/users/{id}/delete', 'UserController@delete');
+    Route::post('/users/create', 'UserController@store');
+    Route::get('/users/{id}', 'UserController@edit');
+    Route::put('/users/{id}', 'UserController@update');
+    Route::delete('/users/{id}', 'UserController@destroy');
+
+    // Image routes
     Route::get('/images/all', 'ImageController@getAll');
     Route::get('/images/all/{page}', 'ImageController@getAll');
     Route::get('/images/{any}', 'ImageController@getImage')->where('any', '.*');
 
+    // Links
     Route::get('/link/{id}', 'PageController@redirectFromLink');
+
+    // Search
     Route::get('/pages/search/all', 'PageController@searchAll');
 
     Route::get('/', function () {
index 49d8629d686a1428806a1d8a69f755d294afaf1d..d9a45709bccb91a2e2a42d8339bef066e23ddc3e 100644 (file)
@@ -43,6 +43,9 @@ $button-border-radius: 3px;
   &.secondary {
     @include generate-button-colors(#EEE, $secondary);
   }
+  &.muted {
+    @include generate-button-colors(#EEE, #888);
+  }
 }
 
 .button-group {
diff --git a/resources/assets/sass/_tables.scss b/resources/assets/sass/_tables.scss
new file mode 100644 (file)
index 0000000..768eb18
--- /dev/null
@@ -0,0 +1,18 @@
+
+table.table {
+  width: 100%;
+  tr {
+    border-bottom: 1px solid #DDD;
+  }
+  th, td {
+    text-align: left;
+    border: none;
+    padding: $-xs $-xs;
+  }
+  th {
+    font-weight: bold;
+  }
+  tr:hover {
+    background-color: #EEE;
+  }
+}
\ No newline at end of file
index 9dc60a2f4c4b08ba2788a3cc3caf0c80de7fd81a..aece8c09a864783b52f6478daa8a49729c6bacb0 100644 (file)
@@ -7,6 +7,7 @@
 @import "blocks";
 @import "buttons";
 @import "forms";
+@import "tables";
 @import "tinymce";
 
 header {
index f3f9a2d6f9b5d4d67c58f6cd6b1af4a776d29dce..f6233132944ad153565231d655a5aa14441c8ff7 100644 (file)
@@ -46,6 +46,7 @@
         </div>
         <ul class="menu">
             <li><a href="/books"><i class="zmdi zmdi-book"></i>Books</a></li>
+            <li><a href="/users"><i class="zmdi zmdi-accounts"></i>Users</a></li>
             <li><a href="/logout"><i class="zmdi zmdi-run zmdi-hc-flip-horizontal"></i>Logout</a></li>
         </ul>
         @if(isset($book) && !isset($books))
index 294c64504e2f693fc6f35b7fcd3eb6b80cd39f31..ca981a20ab29182dc446555f23d70f4c61d80e6c 100644 (file)
@@ -1,7 +1,7 @@
 <input type="password" id="{{ $name }}" name="{{ $name }}"
        @if($errors->has($name)) class="neg" @endif
        @if(isset($placeholder)) placeholder="{{$placeholder}}" @endif
-       @if(isset($model) || old($name)) value="{{ old($name) ? old($name) : $model->$name}}" @endif>
+       @if(old($name)) value="{{ old($name)}}" @endif>
 @if($errors->has($name))
     <div class="text-neg text-small">{{ $errors->first($name) }}</div>
 @endif
\ No newline at end of file
diff --git a/resources/views/users/create.blade.php b/resources/views/users/create.blade.php
new file mode 100644 (file)
index 0000000..ced7736
--- /dev/null
@@ -0,0 +1,15 @@
+@extends('base')
+
+
+@section('content')
+
+    <div class="page-content">
+        <h1>Create User</h1>
+
+        <form action="/users/create" method="post">
+            {!! csrf_field() !!}
+            @include('users/form')
+        </form>
+    </div>
+
+@stop
diff --git a/resources/views/users/delete.blade.php b/resources/views/users/delete.blade.php
new file mode 100644 (file)
index 0000000..279fbdb
--- /dev/null
@@ -0,0 +1,22 @@
+@extends('base')
+
+@section('content')
+
+    <div class="page-content">
+        <h1>Delete User</h1>
+        <p>This will fully delete this user with the name '<span class="text-neg">{{$user->name}}</span>' from the system.</p>
+        <p class="text-neg">Are you sure you want to delete this user?</p>
+
+        <form action="/users/{{$user->id}}" method="POST">
+            {!! csrf_field() !!}
+            <input type="hidden" name="_method" value="DELETE">
+            <a href="/user/{{$user->id}}" class="button muted">Cancel</a>
+            <button type="submit" class="button neg">Confirm</button>
+        </form>
+    </div>
+
+@stop
+
+@section('bottom')
+    @include('pages/image-manager')
+@stop
\ No newline at end of file
diff --git a/resources/views/users/edit.blade.php b/resources/views/users/edit.blade.php
new file mode 100644 (file)
index 0000000..5e164e9
--- /dev/null
@@ -0,0 +1,25 @@
+@extends('base')
+
+
+@section('content')
+
+    <div class="row faded-small">
+        <div class="col-md-6"></div>
+        <div class="col-md-6 faded">
+            <div class="action-buttons">
+                <a href="/users/{{$user->id}}/delete" class="text-neg"><i class="zmdi zmdi-delete"></i>Delete User</a>
+            </div>
+        </div>
+    </div>
+
+    <div class="page-content">
+        <h1>Edit User</h1>
+
+        <form action="/users/{{$user->id}}" method="post">
+            {!! csrf_field() !!}
+            <input type="hidden" name="_method" value="put">
+            @include('users/form', ['model' => $user])
+        </form>
+    </div>
+
+@stop
diff --git a/resources/views/users/form.blade.php b/resources/views/users/form.blade.php
new file mode 100644 (file)
index 0000000..5d5aa14
--- /dev/null
@@ -0,0 +1,33 @@
+
+<div class="form-group">
+    <label for="name">Name</label>
+    @include('form/text', ['name' => 'name'])
+</div>
+
+<div class="form-group">
+    <label for="email">Email</label>
+    @include('form/text', ['name' => 'email'])
+</div>
+
+@if(isset($model))
+<div class="form-group">
+        <span class="text-muted">
+            Only fill the below if you would like <br>to change your password:
+        </span>
+</div>
+@endif
+
+<div class="form-group">
+    <label for="password">Password</label>
+    @include('form/password', ['name' => 'password'])
+</div>
+
+<div class="form-group">
+    <label for="password-confirm">Confirm Password</label>
+    @include('form/password', ['name' => 'password-confirm'])
+</div>
+
+<div class="form-group">
+    <a href="/users" class="button muted">Cancel</a>
+    <button class="button pos" type="submit">Save</button>
+</div>
\ No newline at end of file
diff --git a/resources/views/users/index.blade.php b/resources/views/users/index.blade.php
new file mode 100644 (file)
index 0000000..f29ad79
--- /dev/null
@@ -0,0 +1,33 @@
+@extends('base')
+
+
+@section('content')
+
+
+    <div class="row faded-small">
+        <div class="col-md-6"></div>
+        <div class="col-md-6 faded">
+            <div class="action-buttons">
+                <a href="/users/create" class="text-pos"><i class="zmdi zmdi-account-add"></i>New User</a>
+            </div>
+        </div>
+    </div>
+
+
+    <div class="page-content">
+        <h1>Users</h1>
+        <table class="table">
+            <tr>
+                <th>Name</th>
+                <th>Email</th>
+            </tr>
+            @foreach($users as $user)
+                <tr>
+                    <td><a href="/users/{{$user->id}}">{{$user->name}}</a></td>
+                    <td>{{$user->email}}</td>
+                </tr>
+            @endforeach
+        </table>
+    </div>
+
+@stop