[WIP] Refactor project

This commit is contained in:
Ludovic CANDELLIER
2021-05-21 00:21:05 +02:00
parent f4ab8e71a8
commit 64abc46d99
347 changed files with 14104 additions and 1608 deletions

View File

@@ -0,0 +1,23 @@
<div class="avatar d-flex align-items-center justify-content-center">
<div class="avatar-progress text-white position-absolute">
<i class="fas fa-5x fa-circle-notch fa-spin"></i>
<span class="avatar-percent">0%</span>
</div>
<div class="avatar-buttons">
<div class="btn-group">
<a class="btn btn-sm btn-default avatar-upload" data-link="{{ route('boilerplate.user.avatar.upload', null, false) }}" data-toggle="tooltip" title="Upload">
<i class="fa fa-fw fa-upload"></i>
</a>
<a class="btn btn-sm btn-default avatar-gravatar" data-link="{{ route('boilerplate.user.avatar.gravatar', null, false) }}" data-toggle="tooltip" title="Get from Gravatar">
<i class="fa fa-fw fa-cloud-download-alt"></i>
</a>
<a class="btn btn-sm btn-default avatar-delete {{ $user->hasAvatar() ? '' : 'd-none' }}" data-link="{{ route('boilerplate.user.avatar.delete', null, false) }}" data-toggle="tooltip" title="Delete">
<i class="fa fa-fw fa-trash"></i>
</a>
</div>
</div>
<div class="d-flex align-items-center justify-content-center avatar-label mb-0">
<img src="{{ $user->avatar_url }}" class="avatar-img" alt="avatar" />
{!! Form::file('avatar', ['id' => 'avatar-file', 'class' => 'd-none', 'accept' => 'image/*']) !!}
</div>
</div>

View File

@@ -0,0 +1,62 @@
@extends('boilerplate::layout.index', [
'title' => __('boilerplate::users.title'),
'subtitle' => __('boilerplate::users.create.title'),
'breadcrumb' => [
__('boilerplate::users.title') => 'boilerplate.users.index',
__('boilerplate::users.create.title')
]
])
@section('content')
{{ Form::open(['route' => 'boilerplate.users.store', 'autocomplete' => 'off']) }}
<div class="row">
<div class="col-12 pb-3">
<a href="{{ route("boilerplate.users.index") }}" class="btn btn-default" data-toggle="tooltip" title="@lang('boilerplate::users.returntolist')">
<span class="far fa-arrow-alt-circle-left text-muted"></span>
</a>
<span class="btn-group float-right">
<button type="submit" class="btn btn-primary">
@lang('boilerplate::users.save')
</button>
</span>
</div>
</div>
<div class="row">
<div class="col-lg-6">
@component('boilerplate::card', ['title' => 'boilerplate::users.informations'])
@component('boilerplate::select2', ['name' => 'active', 'label' => 'boilerplate::users.status', 'minimum-results-for-search' => '-1'])
<option value="1" @if (old('active', 1) == '1') selected="selected" @endif>@lang('boilerplate::users.active')</option>
<option value="0" @if (old('active') == '0') selected="selected" @endif>@lang('boilerplate::users.inactive')</option>
@endcomponent
<div class="row">
<div class="col-md-6 col-lg-12 col-xl-6">
@component('boilerplate::input', ['name' => 'first_name', 'label' => 'boilerplate::users.firstname', 'autofocus' => true])@endcomponent
</div>
<div class="col-md-6 col-lg-12 col-xl-6">
@component('boilerplate::input', ['name' => 'last_name', 'label' => 'boilerplate::users.lastname'])@endcomponent
</div>
</div>
@component('boilerplate::input', ['name' => 'email', 'label' => 'boilerplate::users.email', 'help' => 'boilerplate::users.create.help'])@endcomponent
@endcomponent
</div>
<div class="col-lg-6">
@component('boilerplate::card', ['color' => 'teal', 'title' => 'boilerplate::users.roles'])
<table class="table table-sm table-hover">
@foreach($roles as $role)
<tr>
<td style="width:25px">
@component('boilerplate::icheck', ['name' => 'roles['.$role->id.']', 'id' => 'role_'.$role->id, 'checked' => old('roles.'.$role->id) == 'on'])@endcomponent
</td>
<td>
{{ Form::label('role_'.$role->id, $role->display_name, ['class' => 'mb-0 pb-0']) }}<br />
<span class="small">{{ $role->description }}</span><br />
<span class="small text-muted">{{ $role->permissions->implode('display_name', ', ') }}</span>
</td>
</tr>
@endforeach
</table>
@endcomponent
</div>
</div>
{{ Form::close() }}
@endsection

View File

@@ -0,0 +1,75 @@
@extends('boilerplate::layout.index', [
'title' => __('boilerplate::users.title'),
'subtitle' => __('boilerplate::users.edit.title'),
'breadcrumb' => [
__('boilerplate::users.title') => 'boilerplate.users.index',
__('boilerplate::users.edit.title')
]
])
@section('content')
{{ Form::open(['route' => ['boilerplate.users.update', $user->id], 'method' => 'put', 'autocomplete' => 'off']) }}
<div class="row">
<div class="col-12 pb-3">
<a href="{{ route("boilerplate.users.index") }}" class="btn btn-default" data-toggle="tooltip" title="@lang('boilerplate::users.returntolist')">
<span class="far fa-arrow-alt-circle-left text-muted"></span>
</a>
<span class="btn-group float-right">
<button type="submit" class="btn btn-primary">
@lang('boilerplate::users.save')
</button>
</span>
</div>
</div>
<div class="row">
<div class="col-md-6">
@component('boilerplate::card', ['title' => __('boilerplate::users.informations')])
@if(Auth::user()->id !== $user->id)
@component('boilerplate::select2', ['name' => 'active', 'label' => 'boilerplate::users.status', 'minimum-results-for-search' => '-1'])
<option value="1" @if (old('active', $user->active) == '1') selected="selected" @endif>@lang('boilerplate::users.active')</option>
<option value="0" @if (old('active', $user->active) == '0') selected="selected" @endif>@lang('boilerplate::users.inactive')</option>
@endcomponent
@endif
<div class="row">
<div class="col-md-6">
@component('boilerplate::input', ['name' => 'first_name', 'label' => 'boilerplate::users.firstname', 'value' => $user->first_name])@endcomponent
</div>
<div class="col-md-6">
@component('boilerplate::input', ['name' => 'last_name', 'label' => 'boilerplate::users.lastname', 'value' => $user->last_name])@endcomponent
</div>
</div>
@component('boilerplate::input', ['name' => 'email', 'label' => 'boilerplate::users.email', 'value' => $user->email])@endcomponent
@endcomponent
</div>
<div class="col-md-6">
@component('boilerplate::card', ['color' => 'teal', 'title' =>__('boilerplate::users.roles')])
<table class="table table-sm table-hover">
@foreach($roles as $role)
@if($role->name !== 'admin' || ($role->name === 'admin' && Auth::user()->hasRole('admin')))
<tr>
<td style="width:25px">
<div class="icheck-primary">
@if(Auth::user()->id === $user->id && $role->name === 'admin' && Auth::user()->hasRole('admin'))
{{ Form::checkbox('roles['.$role->id.']', 1, old('roles['.$role->id.']', $user->hasRole($role->name)), ['id' => 'role_'.$role->id, 'class' => 'icheck', 'checked', 'disabled']) }}
{!! Form::hidden('roles['.$role->id.']', '1', ['id' => 'role_'.$role->id]) !!}
@else
{{ Form::checkbox('roles['.$role->id.']', 1, old('roles['.$role->id.']', $user->hasRole($role->name)), ['id' => 'role_'.$role->id, 'class' => 'icheck']) }}
@endif
<label for="{{ 'role_'.$role->id }}"></label>
</div>
</td>
<td>
{{ Form::label('role_'.$role->id, $role->display_name, ['class' => 'mbn']) }}<br />
<span class="small">{{ $role->description }}</span><br />
<span class="small text-muted">{{ $role->permissions->implode('display_name', ', ') }}</span>
</td>
</tr>
@endif
@endforeach
</table>
@endcomponent
</div>
</div>
{{ Form::close() }}
@endsection

View File

@@ -0,0 +1,156 @@
@extends('boilerplate::layout.index', [
'title' => __('boilerplate::users.title'),
'subtitle' => __('boilerplate::users.list.title'),
'breadcrumb' => [
__('boilerplate::users.title') => 'boilerplate.users.index'
]
])
@section('right-sidebar')
<div id="filters">
<div class="form-group">
<select name="state" class="form-control select2" data-placeholder="@lang('boilerplate::users.list.state')">
<option></option>
<option value="1">@lang('boilerplate::users.active')</option>
<option value="0">@lang('boilerplate::users.inactive')</option>
</select>
</div>
<div class="form-group">
<select name="role" class="form-control select2" data-placeholder="@lang('boilerplate::role.role')">
<option></option>
@foreach($roles as $role)
<option value="{{ $role->name }}">{{ $role->display_name }}</option>
@endforeach
</select>
</div>
</div>
@endsection
@section('content')
<div class="row">
<div class="col-12 mbl">
<span class="float-right pb-3">
<a href="{{ route("boilerplate.users.create") }}" class="btn btn-primary">
@lang('boilerplate::users.create.title')
</a>
</span>
</div>
</div>
@component('boilerplate::card')
<div class="table-responsive">
<table class="table table-striped table-hover va-middle" id="users-list">
<thead>
<tr>
<th>{{-- id --}}</th>
<th>{{-- avatar --}}</th>
<th>@lang('boilerplate::users.list.state')</th>
<th>@lang('boilerplate::users.list.lastname')</th>
<th>@lang('boilerplate::users.list.firstname')</th>
<th>@lang('boilerplate::users.list.email')</th>
<th>@lang('boilerplate::users.list.roles')</th>
<th>@lang('boilerplate::users.list.creationdate')</th>
<th>@lang('boilerplate::users.list.lastconnect')</th>
<th></th>
</tr>
</thead>
</table>
</div>
@endcomponent
@endsection
@include('boilerplate::load.datatables')
@include('boilerplate::load.select2')
@push('js')
<script>
$('.select2').select2({
minimumResultsForSearch: -1,
allowClear: true,
placeholder: $(this).data('placeholder'),
width: '100%'
});
$(function () {
var oTable = $('#users-list').DataTable({
processing: true,
serverSide: true,
stateSave: true,
order: [[7, "desc"]],
ajax: {
url: '{!! route('boilerplate.users.datatable') !!}',
type: 'post',
},
columns: [
{data: 'id', name: 'id', visible: false},
{data: 'avatar', name: 'avatar', searchable: false, sortable: false, width : '32px'},
{data: 'status', name: 'users.active', searchable: true},
{data: 'last_name', name: 'last_name'},
{data: 'first_name', name: 'first_name'},
{data: 'email', name: 'email'},
{data: 'roles', name: 'roles.name', searchable: false, orderable: false},
{
data: 'created_at',
name: 'users.created_at',
searchable: false,
render: $.fn.dataTable.render.moment('@lang('boilerplate::date.YmdHis')')
},
{
data: 'last_login',
name: 'last_login',
searchable: false,
render: function(date) {
return date === null ? '-' : moment(date).fromNow(date)
}
},
{
data: 'actions',
name: 'actions',
orderable: false,
searchable: false,
width: '80px',
class: 'visible-on-hover text-nowrap'
}
],
fnInitComplete: function() {
$('#users-list_filter').append('<button class="btn btn-default btn-sm ml-2" data-widget="control-sidebar" data-slide="true"><span class="fa fa-filter"></span></button>')
}
});
$('#filters select').on('change', function() {
localStorage.setItem('user_search_'+$(this).attr('name'), $(this).val());
oTable.column(($(this).attr('name') === 'state' ? 2 : 6)).search($(this).val()).draw()
})
if (localStorage.getItem('user_search_state')) {
value = localStorage.getItem('user_search_state');
$('#filters select[name=state]').val(value).trigger('change')
oTable.column(2).search(value).draw();
}
if (localStorage.getItem('user_search_role')) {
value = localStorage.getItem('user_search_role');
$('#filters select[name=role]').val(value).trigger('change')
oTable.column(6).search(value).draw();
}
$(document).on('click', '#users-list .destroy', function (e) {
e.preventDefault();
var href = $(this).attr('href');
bootbox.confirm("@lang('boilerplate::users.list.confirmdelete')", function (result) {
if (result === false) return;
$.ajax({
url: href,
method: 'delete',
success: function () {
oTable.ajax.reload();
growl("@lang('boilerplate::users.list.deletesuccess')", "success");
}
});
});
});
});
</script>
@endpush

View File

@@ -0,0 +1,86 @@
@extends('boilerplate::layout.index', [
'title' => __('boilerplate::users.profile.title'),
'subtitle' => $user->name,
'breadcrumb' => [
$user->name => 'boilerplate.user.profile',
]
])
@section('content')
{{ Form::open(['route' => ['boilerplate.user.profile'], 'method' => 'post', 'autocomplete' => 'off', 'files' => true]) }}
<div class="row">
<div class="col-12 mb-3">
<span class="btn-group float-right">
<button type="submit" class="btn btn-primary">
@lang('boilerplate::users.save')
</button>
</span>
</div>
</div>
<div class="row">
<div class="col-xl-5">
@component('boilerplate::card', ['title' => __('boilerplate::users.profile.title')])
<div class="d-flex flex-wrap">
<div id="avatar-wrapper" class="mb-3">
@include('boilerplate::users.avatar')
</div>
<div class="pl-3">
<span class="info-box-text">
<p class="mb-0"><strong class="h3">{{ $user->name }}</strong></p>
<p class="">{{ $user->getRolesList() }}</p>
</span>
<span class="info-box-more">
<p class="text-muted">
<span class="far fa-fw fa-envelope"></span> {{ $user->email }}
</p>
<p class="mb-0 text-muted">
{{ __('boilerplate::users.profile.subscribedsince', [
'date' => $user->created_at->isoFormat(__('boilerplate::date.lFdY')),
'since' => $user->created_at->diffForHumans()]) }}
</p>
</span>
</div>
</div>
@endcomponent
</div>
<div class="col-xl-7">
@component('boilerplate::card', ['color' => 'teal', 'title' => __('boilerplate::users.informations')])
<div class="row">
<div class="col-md-6">
@component('boilerplate::input', ['name' => 'first_name', 'label' => 'boilerplate::users.firstname', 'value' => $user->first_name, 'autofocus' => true])@endcomponent
</div>
<div class="col-md-6">
@component('boilerplate::input', ['name' => 'last_name', 'label' => 'boilerplate::users.lastname', 'value' => $user->last_name])@endcomponent
</div>
<div class="col-md-6">
@component('boilerplate::input', ['type' => 'password', 'name' => 'password', 'label' => ucfirst(__('boilerplate::auth.fields.password'))])@endcomponent
</div>
<div class="col-md-6">
@component('boilerplate::input', ['type' => 'password', 'name' => 'password_confirmation', 'label' => ucfirst(__('boilerplate::auth.fields.password_confirm'))])@endcomponent
</div>
</div>
@endcomponent
</div>
</div>
{{ Form::close() }}
@endsection
@push('js')
<script>
var avatar = {
url: "{{ route('boilerplate.user.avatar.url', null, false) }}",
locales: {
delete: "@lang('boilerplate::avatar.delete')",
gravatar: {
success: "@lang('boilerplate::avatar.gravatar.success')",
error: "@lang('boilerplate::avatar.gravatar.error')",
},
upload: {
success: "@lang('boilerplate::avatar.upload.success')",
error: "@lang('boilerplate::avatar.upload.error')",
}
}
}
</script>
<script src="{{ mix('/avatar.min.js', '/assets/vendor/boilerplate') }}"></script>
@endpush