Merge branch 'master' into 'production'

Master

See merge request Romulus21/portal!27
This commit is contained in:
Romain Delanoë
2020-04-12 07:44:39 +00:00
10 changed files with 138 additions and 16 deletions

View File

@@ -0,0 +1,20 @@
<?php
namespace App\Listeners;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Support\Facades\Auth;
class UserLoginAttempt
{
/**
* Handle the event.
*
* @return void
*/
public function handle()
{
Auth::user()->update(['login_at' => now()]);
}
}

View File

@@ -19,7 +19,10 @@ class User extends Authenticatable
* @var array * @var array
*/ */
protected $fillable = [ protected $fillable = [
'name', 'email', 'password', 'name',
'email',
'password',
'login_at',
]; ];
/** /**

View File

@@ -2,6 +2,8 @@
namespace App\Providers; namespace App\Providers;
use App\Events\UserLoggedIn;
use App\Listeners\UpdateUserMetaData;
use Illuminate\Auth\Events\Registered; use Illuminate\Auth\Events\Registered;
use Illuminate\Auth\Listeners\SendEmailVerificationNotification; use Illuminate\Auth\Listeners\SendEmailVerificationNotification;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
@@ -18,6 +20,9 @@ class EventServiceProvider extends ServiceProvider
Registered::class => [ Registered::class => [
SendEmailVerificationNotification::class, SendEmailVerificationNotification::class,
], ],
\Illuminate\Auth\Events\Authenticated::class => [
'App\Listeners\UserLoginAttempt@handle'
],
]; ];
/** /**

View File

@@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddLoginAtToUsersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->timestamp('login_at')->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('login_at');
});
}
}

View File

@@ -38,6 +38,6 @@ then
php artisan migrate --force php artisan migrate --force
php artisan optimize php artisan optimize
npm install npm install --no-progress
npm run prod npm run prod
fi fi

View File

@@ -10,10 +10,15 @@
</div> </div>
</div> </div>
<div v-if="authUser.data.attributes.is_admin"> <div v-if="authUser.data.attributes.is_admin">
<div class="box-toggle">
<div class="box-toggle-header" @click="userAddToggle = !userAddToggle">
<h2 class="mb-1">Ajouter un membre</h2> <h2 class="mb-1">Ajouter un membre</h2>
<svg-vue icon="arrow" v-bind:class="{ open: userAddToggle }" />
</div>
<transition name="fade">
<form @submit.prevent="addMember" v-if="userAddToggle" class="box-toggle-content" >
<AlertBox v-if="alertType" :type="alertType" :message="alertMessage" class="mb-1" /> <AlertBox v-if="alertType" :type="alertType" :message="alertMessage" class="mb-1" />
<form @submit.prevent="addMember" class="mb-2"> <div class="flex mb-1">
<div class="flex">
<InputField name="name" label="Nom du nouveau membre" placeholder="Nom" required :errors="errors" @update:field="form.name = $event" class="mr-1" /> <InputField name="name" label="Nom du nouveau membre" placeholder="Nom" required :errors="errors" @update:field="form.name = $event" class="mr-1" />
<InputField name="email" type="email" label="Adresse email du nouveau membre" placeholder="E-mail" required :errors="errors" @update:field="form.email = $event" class="mr-1" /> <InputField name="email" type="email" label="Adresse email du nouveau membre" placeholder="E-mail" required :errors="errors" @update:field="form.email = $event" class="mr-1" />
<div class="flex-middle mt-4"> <div class="flex-middle mt-4">
@@ -21,12 +26,19 @@
</div> </div>
</div> </div>
</form> </form>
<div class="mb-2"> </transition>
</div>
<div class="mb-2 box-toggle">
<div class="box-toggle-header" @click="userListToggle = !userListToggle">
<h2>Liste des utilisateurs</h2> <h2>Liste des utilisateurs</h2>
<ul> <svg-vue icon="arrow" v-bind:class="{ open: userListToggle }" />
</div>
<transition name="fade">
<ul v-if="userListToggle" class="box-toggle-content">
<Loader v-if="loading" /> <Loader v-if="loading" />
<li v-else v-for="user in users"><a :href="user.links.self">{{ user.data.attributes.name }}</a> - {{ user.data.attributes.email }} - {{ user.data.attributes.is_admin }}</li> <li v-else v-for="user in users"><a :href="user.links.self">{{ user.data.attributes.name }}</a> - {{ user.data.attributes.email }} - {{ user.data.attributes.is_admin }}</li>
</ul> </ul>
</transition>
</div> </div>
<div>Css Testeur pour constituer un thème : <router-link to="/css-testeur">Css Testeur</router-link></div> <div>Css Testeur pour constituer un thème : <router-link to="/css-testeur">Css Testeur</router-link></div>
</div> </div>
@@ -56,6 +68,8 @@
errors: null, errors: null,
loading: true, loading: true,
users: null, users: null,
userListToggle: false,
userAddToggle: false,
} }
}, },
computed: { computed: {

View File

@@ -6,6 +6,7 @@
@import "setup/containers"; @import "setup/containers";
@import "setup/effects"; @import "setup/effects";
@import "components/transitions";
@import "components/btn"; @import "components/btn";
@import "components/elements"; @import "components/elements";
@import "components/loader"; @import "components/loader";

View File

@@ -0,0 +1,6 @@
.fade-enter-active, .fade-leave-active {
transition: opacity .3s;
}
.fade-enter, .fade-leave-to /* .fade-leave-active below version 2.1.8 */ {
opacity: 0;
}

View File

@@ -46,3 +46,34 @@
} }
} }
.box-toggle {
box-shadow: 1px 2px 5px rgba(0,0,0,0.2);
&-header {
display: flex;
justify-content: space-between;
align-items: center;
background-color: $light;
padding: 0.5rem 1rem;
border-radius: 0.2rem;
svg {
width: 2rem;
}
}
svg {
transform: rotate(270deg);
transition: transform 0.3s;
&.open {
transform: rotate(90deg);
}
}
&-content {
padding: 0.5rem 1rem;
}
}

View File

@@ -13,3 +13,13 @@ body {
margin: 0; margin: 0;
} }
} }
ul {
margin-top:0;
margin-bottom: 0;
padding-left: 0;
li {
list-style: none;
}
}