TRF Certest first commit
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
@extends('layouts.auth')
|
||||
|
||||
@section('page-title', trans('Login'))
|
||||
|
||||
@section('content')
|
||||
|
||||
<div class="col-md-8 col-lg-6 col-xl-5 mx-auto my-10p" id="login">
|
||||
<div class="text-center">
|
||||
<x-logo />
|
||||
</div>
|
||||
|
||||
<div class="card mt-5">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title text-center mt-4 text-uppercase">
|
||||
@lang('Login')
|
||||
</h5>
|
||||
|
||||
<div class="p-4">
|
||||
@include('auth.social.buttons')
|
||||
|
||||
@include('partials.messages')
|
||||
|
||||
<form role="form" action="<?= url('login') ?>" method="POST" id="login-form" autocomplete="off" class="mt-3">
|
||||
|
||||
<input type="hidden" value="<?= csrf_token() ?>" name="_token">
|
||||
|
||||
@if (Request::has('to'))
|
||||
<input type="hidden" value="{{ Request::get('to') }}" name="to">
|
||||
@endif
|
||||
|
||||
<div class="form-group">
|
||||
<label for="username" class="sr-only">@lang('Email or Username')</label>
|
||||
<input type="text"
|
||||
name="username"
|
||||
id="username"
|
||||
class="form-control input-solid"
|
||||
placeholder="@lang('Email or Username')"
|
||||
value="{{ old('username') }}">
|
||||
</div>
|
||||
|
||||
<div class="form-group password-field">
|
||||
<label for="password" class="sr-only">@lang('Password')</label>
|
||||
<input type="password"
|
||||
name="password"
|
||||
id="password"
|
||||
class="form-control input-solid"
|
||||
placeholder="@lang('Password')">
|
||||
</div>
|
||||
|
||||
|
||||
@if (setting('remember_me'))
|
||||
<div class="custom-control custom-checkbox">
|
||||
<input type="checkbox" class="custom-control-input" name="remember" id="remember" value="1"/>
|
||||
<label class="custom-control-label font-weight-normal" for="remember">
|
||||
@lang('Remember me?')
|
||||
</label>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
|
||||
<div class="form-group mt-4">
|
||||
<button type="submit" class="btn btn-primary btn-lg btn-block" id="btn-login">
|
||||
@lang('Log In')
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
@if (setting('forgot_password'))
|
||||
<a href="<?= route('password.request') ?>" class="forgot">@lang('I forgot my password')</a>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="text-center text-muted">
|
||||
@if (setting('reg_enabled'))
|
||||
@lang("Don't have an account?")
|
||||
<a class="font-weight-bold" href="<?= url("register") ?>">@lang('Sign Up')</a>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@stop
|
||||
|
||||
@section('scripts')
|
||||
<script src="{{ asset('assets/js/as/login.js') }}"></script>
|
||||
{!! JsValidator::formRequest('Vanguard\Http\Requests\Auth\LoginRequest', '#login-form') !!}
|
||||
@stop
|
||||
@@ -0,0 +1,53 @@
|
||||
@extends('layouts.auth')
|
||||
|
||||
@section('page-title', __('Reset Password'))
|
||||
|
||||
@section('content')
|
||||
|
||||
<div class="col-md-8 col-lg-6 col-xl-5 mx-auto my-10p">
|
||||
<div class="text-center">
|
||||
<x-logo />
|
||||
</div>
|
||||
|
||||
<div class="card mt-5">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title text-center mt-4 mb-2 text-uppercase">
|
||||
@lang('Forgot Your Password?')
|
||||
</h5>
|
||||
|
||||
<div class="p-4">
|
||||
<form role="form" action="<?= route('password.email') ?>" method="POST" id="remind-password-form" autocomplete="off">
|
||||
{{ csrf_field() }}
|
||||
|
||||
<p class="text-muted mb-4 text-center font-weight-light">
|
||||
@lang('Please provide your email below and we will send you a password reset link.')
|
||||
</p>
|
||||
|
||||
@include('partials.messages')
|
||||
|
||||
<div class="form-group password-field my-3">
|
||||
<label for="password" class="sr-only">@lang('Email')</label>
|
||||
<input type="email"
|
||||
name="email"
|
||||
id="email"
|
||||
class="form-control input-solid"
|
||||
placeholder="@lang('Your E-Mail')">
|
||||
</div>
|
||||
|
||||
<div class="form-group mt-4">
|
||||
<button type="submit" class="btn btn-primary btn-lg btn-block" id="btn-reset-password">
|
||||
@lang('Reset Password')
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
@stop
|
||||
|
||||
@section('scripts')
|
||||
{!! JsValidator::formRequest('Vanguard\Http\Requests\Auth\PasswordRemindRequest', '#remind-password-form') !!}
|
||||
@stop
|
||||
@@ -0,0 +1,71 @@
|
||||
@extends('layouts.auth')
|
||||
|
||||
@section('page-title', __('Reset Password'))
|
||||
|
||||
@section('content')
|
||||
|
||||
<div class="col-md-8 col-lg-6 col-xl-5 mx-auto my-10p">
|
||||
<div class="text-center">
|
||||
<x-logo />
|
||||
</div>
|
||||
|
||||
<div class="card mt-5">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title text-center mt-4 mb-2 text-uppercase">
|
||||
@lang('Reset Your Password')
|
||||
</h5>
|
||||
|
||||
<form role="form" action="{{ route('password.update') }}" method="POST" id="reset-password-form"
|
||||
autocomplete="off" class="p-4">
|
||||
<input type="hidden" name="token" value="{{ $token }}">
|
||||
{{ csrf_field() }}
|
||||
|
||||
<p class="text-muted mb-4 text-center font-weight-light px-2">
|
||||
@lang('Please provide your email and pick a new password below.')
|
||||
</p>
|
||||
|
||||
@include('partials.messages')
|
||||
|
||||
<div class="form-group">
|
||||
<label for="password" class="sr-only">@lang('Your E-Mail')</label>
|
||||
<input type="email"
|
||||
name="email"
|
||||
id="email"
|
||||
class="form-control input-solid"
|
||||
placeholder="@lang('Your E-Mail')">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="password" class="sr-only">@lang('New Password')</label>
|
||||
<input type="password"
|
||||
name="password"
|
||||
id="password"
|
||||
class="form-control input-solid"
|
||||
placeholder="@lang('New Password')">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="password" class="sr-only">@lang('Confirm New Password')</label>
|
||||
<input type="password"
|
||||
name="password_confirmation"
|
||||
id="password_confirmation"
|
||||
class="form-control input-solid"
|
||||
placeholder="@lang('Confirm New Password')">
|
||||
</div>
|
||||
|
||||
<div class="form-group mt-5">
|
||||
<button type="submit" class="btn btn-primary btn-lg btn-block" id="btn-reset-password">
|
||||
@lang('Update Password')
|
||||
</button>
|
||||
</div>
|
||||
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@stop
|
||||
|
||||
@section('scripts')
|
||||
{!! JsValidator::formRequest('Vanguard\Http\Requests\Auth\PasswordResetRequest', '#reset-password-form') !!}
|
||||
@stop
|
||||
@@ -0,0 +1,124 @@
|
||||
@extends('layouts.auth')
|
||||
|
||||
@section('page-title', __('Sign Up'))
|
||||
|
||||
@if (setting('registration.captcha.enabled'))
|
||||
<script src='https://www.google.com/recaptcha/api.js'></script>
|
||||
@endif
|
||||
|
||||
@section('content')
|
||||
|
||||
<div class="col-md-8 col-lg-6 col-xl-5 mx-auto my-10p">
|
||||
<div class="text-center">
|
||||
<x-logo />
|
||||
</div>
|
||||
|
||||
<div class="card mt-5">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title text-center mt-4 text-uppercase">
|
||||
@lang('Register')
|
||||
</h5>
|
||||
|
||||
<div class="p-4">
|
||||
@include('auth.social.buttons')
|
||||
|
||||
@include('partials/messages')
|
||||
|
||||
<form role="form" action="<?= url('register') ?>" method="post" id="registration-form" autocomplete="off" class="mt-3">
|
||||
<input type="hidden" value="<?= csrf_token() ?>" name="_token">
|
||||
<div class="form-group">
|
||||
<input type="email"
|
||||
name="email"
|
||||
id="email"
|
||||
class="form-control input-solid"
|
||||
placeholder="@lang('Email')"
|
||||
value="{{ old('email') }}">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<input type="text"
|
||||
name="username"
|
||||
id="username"
|
||||
class="form-control input-solid"
|
||||
placeholder="@lang('Username')"
|
||||
value="{{ old('username') }}">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<input type="password"
|
||||
name="password"
|
||||
id="password"
|
||||
class="form-control input-solid"
|
||||
placeholder="@lang('Password')">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<input type="password"
|
||||
name="password_confirmation"
|
||||
id="password_confirmation"
|
||||
class="form-control input-solid"
|
||||
placeholder="@lang('Confirm Password')">
|
||||
</div>
|
||||
|
||||
@if (setting('tos'))
|
||||
<div class="custom-control custom-checkbox">
|
||||
<input type="checkbox" class="custom-control-input" name="tos" id="tos" value="1"/>
|
||||
<label class="custom-control-label font-weight-normal" for="tos">
|
||||
@lang('I accept')
|
||||
<a href="#tos-modal" data-toggle="modal">@lang('Terms of Service')</a>
|
||||
</label>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
{{-- Only display captcha if it is enabled --}}
|
||||
@if (setting('registration.captcha.enabled'))
|
||||
<div class="form-group my-4">
|
||||
{!! app('captcha')->display() !!}
|
||||
</div>
|
||||
@endif
|
||||
{{-- end captcha --}}
|
||||
|
||||
<div class="form-group mt-4">
|
||||
<button type="submit" class="btn btn-primary btn-lg btn-block" id="btn-login">
|
||||
@lang('Register')
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="text-center text-muted">
|
||||
@if (setting('reg_enabled'))
|
||||
@lang('Already have an account?')
|
||||
<a class="font-weight-bold" href="<?= url("login") ?>">@lang('Login')</a>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
@if (setting('tos'))
|
||||
<div class="modal fade" id="tos-modal" tabindex="-1" role="dialog" aria-labelledby="tos-label">
|
||||
<div class="modal-dialog" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title" id="tos-label">@lang('Terms of Service')</h5>
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
@include('auth.tos')
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary" data-dismiss="modal">
|
||||
@lang('Close')
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@stop
|
||||
|
||||
@section('scripts')
|
||||
{!! JsValidator::formRequest('Vanguard\Http\Requests\Auth\RegisterRequest', '#registration-form') !!}
|
||||
@stop
|
||||
@@ -0,0 +1,30 @@
|
||||
@if ($socialProviders)
|
||||
<?php $colSize = 12 / count($socialProviders); ?>
|
||||
|
||||
<div class="row pb-3 pt-2">
|
||||
@if (in_array('facebook', $socialProviders))
|
||||
<div class="col-{{ $colSize }} d-flex align-items-center justify-content-center">
|
||||
<a href="{{ url('auth/facebook/login') }}" class="btn-facebook">
|
||||
<i class="fab fa-facebook fa-2x"></i>
|
||||
</a>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@if (in_array('twitter', $socialProviders))
|
||||
<div class="col-{{ $colSize }} d-flex align-items-center justify-content-center">
|
||||
<a href="{{ url('auth/twitter/login') }}" class="btn-twitter">
|
||||
<i class="fab fa-twitter fa-2x"></i>
|
||||
</a>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@if (in_array('google', $socialProviders))
|
||||
<div class="col-{{ $colSize }} d-flex align-items-center justify-content-center">
|
||||
<a href="{{ url('auth/google/login') }}" class="btn-google">
|
||||
<i class="fab fa-google-plus-square fa-2x"></i>
|
||||
</a>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
@endif
|
||||
@@ -0,0 +1,44 @@
|
||||
@extends('layouts.auth')
|
||||
|
||||
@section('page-title', trans('Two-Factor Authentication'))
|
||||
|
||||
@section('content')
|
||||
|
||||
<div class="col-md-8 col-lg-6 col-xl-5 mx-auto my-10p">
|
||||
<div class="text-center">
|
||||
<x-logo />
|
||||
</div>
|
||||
|
||||
<div class="card mt-5">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title text-center mt-4 text-uppercase">
|
||||
@lang('Two-Factor Authentication')
|
||||
</h5>
|
||||
|
||||
<div class="p-4">
|
||||
@include('partials/messages')
|
||||
|
||||
<form role="form" action="<?= route('auth.token.validate') ?>" method="POST" autocomplete="off">
|
||||
<input type="hidden" value="<?= csrf_token() ?>" name="_token">
|
||||
|
||||
<div class="form-group">
|
||||
<label for="password" class="sr-only">@lang('Token')</label>
|
||||
<input type="text"
|
||||
name="code"
|
||||
id="code"
|
||||
class="form-control input-solid"
|
||||
placeholder="@lang('2FA Code')">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<button type="submit" class="btn btn-primary btn-lg btn-block" id="btn-reset-password">
|
||||
@lang('Validate')
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@stop
|
||||
@@ -0,0 +1,24 @@
|
||||
<h4>1. Terms</h4>
|
||||
|
||||
<p>
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
||||
Donec quis lacus porttitor, dignissim nibh sit amet, fermentum felis.
|
||||
Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere
|
||||
cubilia Curae; In ultricies consectetur viverra. Nullam velit neque,
|
||||
placerat condimentum tempus tincidunt, placerat eu lectus. Nam molestie
|
||||
porta purus, et pretium risus vehicula in. Cras sem ipsum, varius sagittis
|
||||
rhoncus nec, dictum maximus diam. Duis ac laoreet est. In turpis velit, placerat
|
||||
eget nisi vitae, dignissim tristique nisl. Curabitur sollicitudin, nunc ut
|
||||
viverra interdum, lacus...
|
||||
</p>
|
||||
|
||||
<h4>2. Use License</h4>
|
||||
|
||||
<ol type="a">
|
||||
<li>
|
||||
Aenean vehicula erat eu nisi scelerisque, a mattis purus blandit. Curabitur congue
|
||||
ollis nisl malesuada egestas. Lorem ipsum dolor sit amet, consectetur adipiscing elit:
|
||||
</li>
|
||||
</ol>
|
||||
|
||||
<p>...</p>
|
||||
@@ -0,0 +1,30 @@
|
||||
@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-body">
|
||||
<h5 class="card-title">{{ __('Verify Your Email Address') }}</h5>
|
||||
|
||||
@if (session('resent'))
|
||||
<div class="alert alert-success" role="alert">
|
||||
{{ __('A fresh verification link has been sent to your email address.') }}
|
||||
</div>
|
||||
@endif
|
||||
|
||||
{{ __('Before proceeding, please check your email for a verification link.') }}
|
||||
{{ __('If you did not receive the email') }},
|
||||
<form action="{{ route('verification.resend') }}" method="POST" class="d-inline">
|
||||
@csrf
|
||||
<button type="submit" class="d-inline btn btn-link p-0">
|
||||
{{ __('click here to request another') }}
|
||||
</button>.
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
@@ -0,0 +1,4 @@
|
||||
<img src="{{ $src ?? '' }}"
|
||||
class="{{ $class ?? '' }}"
|
||||
alt="{{ setting('app_name') }}"
|
||||
height="{{ $height ?? '50' }}">
|
||||
@@ -0,0 +1,35 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('page-title', __('Dashboard'))
|
||||
@section('page-heading', __('Dashboard'))
|
||||
|
||||
@section('breadcrumbs')
|
||||
<li class="breadcrumb-item active">
|
||||
@lang('Dashboard')
|
||||
</li>
|
||||
@stop
|
||||
|
||||
@section('content')
|
||||
@include('partials.messages')
|
||||
|
||||
<div class="row">
|
||||
@foreach (\Vanguard\Plugins\Vanguard::availableWidgets(auth()->user()) as $widget)
|
||||
@if ($widget->width)
|
||||
<div class="col-md-{{ $widget->width }}">
|
||||
@endif
|
||||
{!! app()->call([$widget, 'render']) !!}
|
||||
@if($widget->width)
|
||||
</div>
|
||||
@endif
|
||||
@endforeach
|
||||
</div>
|
||||
|
||||
@stop
|
||||
|
||||
@section('scripts')
|
||||
@foreach (\Vanguard\Plugins\Vanguard::availableWidgets(auth()->user()) as $widget)
|
||||
@if (method_exists($widget, 'scripts'))
|
||||
{!! app()->call([$widget, 'scripts']) !!}
|
||||
@endif
|
||||
@endforeach
|
||||
@stop
|
||||
@@ -0,0 +1,32 @@
|
||||
@extends('layouts.install')
|
||||
|
||||
@section('content')
|
||||
|
||||
@include('install.steps', ['steps' => [
|
||||
'welcome' => 'selected done',
|
||||
'requirements' => 'selected done',
|
||||
'permissions' => 'selected done',
|
||||
'database' => 'selected done',
|
||||
'installation' => 'selected done',
|
||||
'complete' => 'selected'
|
||||
]])
|
||||
|
||||
<div class="step-content">
|
||||
<h3>Complete!</h3>
|
||||
<hr>
|
||||
<p><strong>Well Done!</strong></p>
|
||||
<p>You application is now successfully installed! You can login by clicking on "Log In" button below.</p>
|
||||
|
||||
@if (is_writable(base_path()))
|
||||
<p><strong>Important!</strong> Since your root directory is still writable,
|
||||
you can change the permissions to 755 to make it writable only by root user.</p>
|
||||
@endif
|
||||
|
||||
<a class="btn btn-primary float-right" href="{{ url('login') }}">
|
||||
<i class="fa fa-sign-in"></i>
|
||||
Log In
|
||||
</a>
|
||||
<div class="clearfix"></div>
|
||||
</div>
|
||||
|
||||
@stop
|
||||
@@ -0,0 +1,52 @@
|
||||
@extends('layouts.install')
|
||||
|
||||
@section('content')
|
||||
|
||||
@include('install.steps', ['steps' => [
|
||||
'welcome' => 'selected done',
|
||||
'requirements' => 'selected done',
|
||||
'permissions' => 'selected done',
|
||||
'database' => 'selected'
|
||||
]])
|
||||
|
||||
@include('partials.messages')
|
||||
|
||||
<form action="{{ route('install.installation') }}" method="POST">
|
||||
@csrf
|
||||
<div class="step-content">
|
||||
<h3>Database Info</h3>
|
||||
<hr>
|
||||
<div class="form-group">
|
||||
<label for="host">Host</label>
|
||||
<input type="text" class="form-control" id="host" name="host" value="{{ old('host') }}">
|
||||
<small>Database host. Usually you should enter localhost or mysql.</small>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="username">Username</label>
|
||||
<input type="text" class="form-control" id="username" name="username" value="{{ old('username') }}">
|
||||
<small>Your database username.</small>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="password">Password</label>
|
||||
<input type="password" class="form-control" id="password" name="password">
|
||||
<small>Database password for provided username.</small>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="database">Database Name</label>
|
||||
<input type="text" class="form-control" id="database" name="database" value="{{ old('database') }}">
|
||||
<small>Name of database where tables should be created.</small>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="prefix">Tables Prefix</label>
|
||||
<input type="text" class="form-control" id="prefix" name="prefix" value="{{ old('prefix') }}">
|
||||
<small>Prefix to put in front of database table names. You can leave it blank if you want.</small>
|
||||
</div>
|
||||
<button class="btn btn-green float-right mt-3">
|
||||
Next
|
||||
<i class="fa fa-arrow-right"></i>
|
||||
</button>
|
||||
<div class="clearfix"></div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
@stop
|
||||
@@ -0,0 +1,27 @@
|
||||
@extends('layouts.install')
|
||||
|
||||
@section('content')
|
||||
|
||||
@include('install.steps', ['steps' => [
|
||||
'welcome' => 'selected done',
|
||||
'requirements' => 'selected done',
|
||||
'permissions' => 'selected done',
|
||||
'database' => 'selected done',
|
||||
'installation' => 'selected done',
|
||||
'complete' => 'selected error'
|
||||
]])
|
||||
|
||||
<div class="step-content">
|
||||
<h3>Whoops!</h3>
|
||||
<hr>
|
||||
<p><strong>There was something wrong during the installation!</strong></p>
|
||||
<p>Please check your log located inside <code>storage/logs</code> directory to see what's going on.</p>
|
||||
|
||||
<a class="btn btn-primary float-right mt-3" href="{{ route('install.start') }}">
|
||||
<i class="fa fa-undo"></i>
|
||||
Try Again
|
||||
</a>
|
||||
<div class="clearfix"></div>
|
||||
</div>
|
||||
|
||||
@stop
|
||||
@@ -0,0 +1,31 @@
|
||||
@extends('layouts.install')
|
||||
|
||||
@section('content')
|
||||
|
||||
@include('install.steps', ['steps' => [
|
||||
'welcome' => 'selected done',
|
||||
'requirements' => 'selected done',
|
||||
'permissions' => 'selected done',
|
||||
'database' => 'selected done',
|
||||
'installation' => 'selected'
|
||||
]])
|
||||
|
||||
<form action="{{ route('install.install') }}" method="POST">
|
||||
@csrf
|
||||
<div class="step-content">
|
||||
<h3>Installation</h3>
|
||||
<hr>
|
||||
<p>Vanguard is ready to be installed!</p>
|
||||
<p>Before you proceed, please provide the name for your application below:</p>
|
||||
<div class="form-group">
|
||||
<label for="app_name">App Name</label>
|
||||
<input type="text" class="form-control" id="app_name" name="app_name" value="Vanguard">
|
||||
</div>
|
||||
<button class="btn btn-green pull-right" data-toggle="loader" data-loading-text="Installing" type="submit">
|
||||
<i class="fa fa-play"></i>
|
||||
Install
|
||||
</button>
|
||||
<div class="clearfix"></div>
|
||||
</div>
|
||||
</form>
|
||||
@stop
|
||||
@@ -0,0 +1,35 @@
|
||||
@extends('layouts.install')
|
||||
|
||||
@section('content')
|
||||
|
||||
@include('install.steps', ['steps' => [
|
||||
'welcome' => 'selected done',
|
||||
'requirements' => 'selected done',
|
||||
'permissions' => 'selected'
|
||||
]])
|
||||
|
||||
<div class="step-content">
|
||||
<h3>Permissions</h3>
|
||||
<hr>
|
||||
<ul class="list-group mb-4">
|
||||
@foreach($folders as $path => $isWritable)
|
||||
<li class="list-group-item">
|
||||
{{ $path }}
|
||||
@if ($isWritable)
|
||||
<span class="badge badge-secondary float-right ml-2">775</span>
|
||||
<span class="badge badge-success float-right"><i class="fa fa-check"></i></span>
|
||||
@else
|
||||
<span class="badge badge-secondary float-right ml-2">775</span>
|
||||
<span class="badge badge-danger float-right"><i class="fa fa-times"></i></span>
|
||||
@endif
|
||||
</li>
|
||||
@endforeach
|
||||
</ul>
|
||||
<a class="btn btn-green float-right" href="{{ route('install.database') }}">
|
||||
Next
|
||||
<i class="fa fa-arrow-right"></i>
|
||||
</a>
|
||||
<div class="clearfix"></div>
|
||||
</div>
|
||||
|
||||
@stop
|
||||
@@ -0,0 +1,41 @@
|
||||
@extends('layouts.install')
|
||||
|
||||
@section('content')
|
||||
|
||||
@include('install.steps', ['steps' => ['welcome' => 'selected done', 'requirements' => 'selected']])
|
||||
|
||||
@if (! $allLoaded)
|
||||
<div class="alert alert-danger">
|
||||
<strong>Oh snap!</strong> Your system does not meet the requirements. You have to fix them in order to continue.
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<div class="step-content">
|
||||
<h3>System Requirements</h3>
|
||||
<hr>
|
||||
<ul class="list-group mb-4">
|
||||
@foreach ($requirements as $extension => $loaded)
|
||||
<li class="list-group-item {{ ! $loaded ? 'list-group-item-danger' : '' }}">
|
||||
{{ $extension }}
|
||||
@if ($loaded)
|
||||
<span class="badge badge-success float-right"><i class="fa fa-check"></i></span>
|
||||
@else
|
||||
<span class="badge badge-danger float-right"><i class="fa fa-times"></i></span>
|
||||
@endif
|
||||
</li>
|
||||
@endforeach
|
||||
</ul>
|
||||
@if ($allLoaded)
|
||||
<a class="btn btn-green float-right" href="{{ route('install.permissions') }}">
|
||||
Next
|
||||
<i class="fa fa-arrow-right"></i>
|
||||
</a>
|
||||
@else
|
||||
<button class="btn btn-green pull-right" disabled>
|
||||
Next
|
||||
<i class="fa fa-arrow-right"></i>
|
||||
</button>
|
||||
@endif
|
||||
<div class="clearfix"></div>
|
||||
</div>
|
||||
@stop
|
||||
@@ -0,0 +1,20 @@
|
||||
@extends('layouts.install')
|
||||
|
||||
@section('content')
|
||||
|
||||
@include('install.steps', ['steps' => ['welcome' => 'selected']])
|
||||
|
||||
<div class="step-content">
|
||||
<h3>Welcome</h3>
|
||||
<hr>
|
||||
<p>This steps will guide you through few step installation process.</p>
|
||||
<p>When this installation process is finished, you will be able
|
||||
to login and manage your users immediately! </p>
|
||||
<br>
|
||||
<a href="{{ route('install.requirements') }}" class="btn btn-primary float-right" role="button">
|
||||
Next
|
||||
<i class="fa fa-arrow-right"></i>
|
||||
</a>
|
||||
<div class="clearfix"></div>
|
||||
</div>
|
||||
@stop
|
||||
@@ -0,0 +1,40 @@
|
||||
<div class="steps">
|
||||
<ul>
|
||||
<li>
|
||||
<a class="{{ isset($steps['welcome']) ? $steps['welcome'] : '' }}">
|
||||
<div class="stepNumber"><i class="fa fa-home"></i></div>
|
||||
<span class="stepDesc text-small">Welcome</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="{{ isset($steps['requirements']) ? $steps['requirements'] : '' }}">
|
||||
<div class="stepNumber"><i class="fa fa-list"></i></div>
|
||||
<span class="stepDesc text-small">System Requirements</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="{{ isset($steps['permissions']) ? $steps['permissions'] : '' }}">
|
||||
<div class="stepNumber"><i class="fa fa-lock"></i></div>
|
||||
<span class="stepDesc text-small">Permissions</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="{{ isset($steps['database']) ? $steps['database'] : '' }}">
|
||||
<div class="stepNumber"><i class="fa fa-database"></i></div>
|
||||
<span class="stepDesc text-small">Database Info</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="{{ isset($steps['installation']) ? $steps['installation'] : '' }}">
|
||||
<div class="stepNumber"><i class="fa fa-terminal"></i></div>
|
||||
<span class="stepDesc text-small">Installation</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="{{ isset($steps['complete']) ? $steps['complete'] : '' }}">
|
||||
<div class="stepNumber"><i class="fa fa-flag-checkered"></i></div>
|
||||
<span class="stepDesc text-small">Complete</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
@@ -0,0 +1,49 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
|
||||
<meta name="csrf-token" content="{{ csrf_token() }}">
|
||||
|
||||
<title>@yield('page-title') - {{ setting('app_name') }}</title>
|
||||
|
||||
<link rel="apple-touch-icon-precomposed" sizes="144x144" href="{{ url('assets/img/icons/apple-touch-icon-144x144.png') }}" />
|
||||
<link rel="apple-touch-icon-precomposed" sizes="152x152" href="{{ url('assets/img/icons/apple-touch-icon-152x152.png') }}" />
|
||||
<link rel="icon" type="image/png" href="{{ url('assets/img/icons/favicon-32x32.png') }}" sizes="32x32" />
|
||||
<link rel="icon" type="image/png" href="{{ url('assets/img/icons/favicon-16x16.png') }}" sizes="16x16" />
|
||||
<meta name="application-name" content="{{ setting('app_name') }}"/>
|
||||
<meta name="msapplication-TileColor" content="#FFFFFF" />
|
||||
<meta name="msapplication-TileImage" content="{{ url('assets/img/icons/mstile-144x144.png') }}" />
|
||||
|
||||
<link media="all" type="text/css" rel="stylesheet" href="{{ url(mix('assets/css/vendor.css')) }}">
|
||||
<link media="all" type="text/css" rel="stylesheet" href="{{ url(mix('assets/css/app.css')) }}">
|
||||
|
||||
@yield('styles')
|
||||
|
||||
@hook('app:styles')
|
||||
</head>
|
||||
<body>
|
||||
@include('partials.navbar')
|
||||
|
||||
<div class="container-fluid">
|
||||
<div class="row">
|
||||
@include('partials.sidebar.main')
|
||||
|
||||
<div class="content-page">
|
||||
<main role="main" class="px-4">
|
||||
@yield('content')
|
||||
</main>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="{{ url(mix('assets/js/vendor.js')) }}"></script>
|
||||
<script src="{{ url('assets/js/as/app.js') }}"></script>
|
||||
@yield('scripts')
|
||||
|
||||
@hook('app:scripts')
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,34 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
|
||||
<title>@yield('page-title') - {{ setting('app_name') }}</title>
|
||||
|
||||
<link href="{{ asset('assets/css/app.css') }}" rel="stylesheet">
|
||||
<link href="{{ asset('assets/css/fontawesome-all.min.css') }}" rel="stylesheet">
|
||||
|
||||
@yield('header-scripts')
|
||||
|
||||
@hook('auth:styles')
|
||||
</head>
|
||||
<body class="auth">
|
||||
|
||||
<div class="d-flex justify-content-end py-2 pr-4">
|
||||
@include('partials.locale-dropdown')
|
||||
</div>
|
||||
|
||||
<div class="container">
|
||||
@yield('content')
|
||||
</div>
|
||||
|
||||
<script src="{{ asset('assets/js/vendor.js') }}"></script>
|
||||
<script src="{{ asset('assets/js/as/app.js') }}"></script>
|
||||
<script src="{{ asset('assets/js/as/btn.js') }}"></script>
|
||||
@yield('scripts')
|
||||
@hook('auth:scripts')
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,42 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
|
||||
<meta name="csrf-token" content="{{ csrf_token() }}">
|
||||
|
||||
<title>Installation - {{ setting('app_name') }}</title>
|
||||
|
||||
<link href="{{ asset('assets/css/vendor.css') }}" rel="stylesheet">
|
||||
<link href="{{ asset('assets/css/app.css') }}" rel="stylesheet">
|
||||
<link href="{{ asset('assets/css/install.css') }}" rel="stylesheet">
|
||||
|
||||
@yield('styles')
|
||||
</head>
|
||||
<body style="background-color: #fff;">
|
||||
|
||||
<div class="container-fluid">
|
||||
<div class="row">
|
||||
<div class="col-md-6 offset-3 logo-wrapper">
|
||||
<x-logo class="logo" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="wizard col-md-6 offset-3">
|
||||
@yield('content')
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript" src="{{ mix("assets/js/vendor.js") }}"></script>
|
||||
<script type="text/javascript" src="{{ url('assets/js/as/app.js') }}"></script>
|
||||
<script type="text/javascript" src="{{ url('assets/js/as/btn.js') }}"></script>
|
||||
<script>
|
||||
$("a[data-toggle=loader], button[data-toggle=loader]").click(function () {
|
||||
if ($(this).parents('form').valid()) {
|
||||
as.btn.loading($(this), $(this).data('loading-text'));
|
||||
$(this).parents('form').submit();
|
||||
}
|
||||
});
|
||||
</script>
|
||||
@yield('scripts')
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,22 @@
|
||||
@component('mail::message')
|
||||
|
||||
# @lang('Hello!')
|
||||
|
||||
@lang('You are receiving this email because we received a password reset request for your account.')
|
||||
|
||||
@component('mail::button', ['url' => route('password.reset', ['token' => $token])])
|
||||
@lang('Reset Password')
|
||||
@endcomponent
|
||||
|
||||
@lang('This password reset link will expire in :count minutes.', [
|
||||
'count' => config('auth.passwords.users.expire')
|
||||
])
|
||||
|
||||
|
||||
@lang('If you did not request a password reset, no further action is required.')
|
||||
|
||||
|
||||
@lang('Regards'),<br>
|
||||
{{ setting('app_name') }}
|
||||
|
||||
@endcomponent
|
||||
@@ -0,0 +1,19 @@
|
||||
@component('mail::message')
|
||||
|
||||
# @lang('Hello!')
|
||||
|
||||
@lang('New user was just registered on :app website.', ['app' => setting('app_name')])
|
||||
|
||||
|
||||
@lang('To view the user details just visit the link below.')
|
||||
|
||||
|
||||
@component('mail::button', ['url' => route('users.show', $user)])
|
||||
@lang('View User')
|
||||
@endcomponent
|
||||
|
||||
|
||||
@lang('Regards'),<br>
|
||||
{{ setting('app_name') }}
|
||||
|
||||
@endcomponent
|
||||
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
use Vanguard\Support\Locale;
|
||||
?>
|
||||
<li class="nav-item dropdown d-flex align-items-center">
|
||||
<a class="nav-link dropdown-toggle text-uppercase"
|
||||
href="#"
|
||||
id="navbarDropdown"
|
||||
role="button"
|
||||
data-toggle="dropdown"
|
||||
aria-haspopup="true"
|
||||
aria-expanded="false">
|
||||
<img src="{{ Locale::flagUrl(session()->get('locale') ?: config('app.locale')) }}" width="30" />
|
||||
<span class="ml-1">{{ session()->get('locale') }}</span>
|
||||
</a>
|
||||
<div class="dropdown-menu dropdown-menu-right position-absolute p-0" aria-labelledby="navbarDropdown">
|
||||
@foreach(Locale::AVAILABLE_LOCALES as $locale)
|
||||
<a class="dropdown-item py-2 text-uppercase" href="?lang={{ $locale }}">
|
||||
<img src="{{ Locale::flagUrl($locale) }}" alt="{{ $locale }}" width="30">
|
||||
<span class="ml-1">{{ $locale }}</span>
|
||||
</a>
|
||||
@endforeach
|
||||
</div>
|
||||
</li>
|
||||
@@ -0,0 +1,27 @@
|
||||
|
||||
@if(isset ($errors) && count($errors) > 0)
|
||||
<div class="alert alert-danger alert-notification">
|
||||
<ul class="list-unstyled mb-0">
|
||||
@foreach($errors->all() as $error)
|
||||
<li>{{ $error }}</li>
|
||||
@endforeach
|
||||
</ul>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@if(Session::get('success', false))
|
||||
<?php $data = Session::get('success'); ?>
|
||||
@if (is_array($data))
|
||||
@foreach ($data as $msg)
|
||||
<div class="alert alert-success alert-notification">
|
||||
<i class="fa fa-check"></i>
|
||||
{{ $msg }}
|
||||
</div>
|
||||
@endforeach
|
||||
@else
|
||||
<div class="alert alert-success alert-notification">
|
||||
<i class="fa fa-check"></i>
|
||||
{{ $data }}
|
||||
</div>
|
||||
@endif
|
||||
@endif
|
||||
@@ -0,0 +1,103 @@
|
||||
<nav class="navbar fixed-top align-items-start navbar-expand-lg pl-0 pr-0 py-0" >
|
||||
|
||||
<div class="navbar-brand-wrapper d-flex align-items-center justify-content-center">
|
||||
<a class="navbar-brand mr-0" href="{{ url('/') }}">
|
||||
<x-logo class="logo-lg" height="35" />
|
||||
<x-logo variant="no-text" class="logo-sm" height="35" />
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
@if (app('impersonate')->isImpersonating())
|
||||
<a href="{{ route('impersonate.leave') }}" class="navbar-toggler text-danger hidden-md">
|
||||
<i class="fas fa-user-secret"></i>
|
||||
</a>
|
||||
@endif
|
||||
|
||||
<button class="navbar-toggler" type="button" id="sidebar-toggle">
|
||||
<i class="fas fa-align-right text-muted"></i>
|
||||
</button>
|
||||
|
||||
<button class="navbar-toggler mr-3"
|
||||
type="button"
|
||||
data-toggle="collapse"
|
||||
data-target="#top-navigation"
|
||||
aria-controls="top-navigation"
|
||||
aria-expanded="false"
|
||||
aria-label="Toggle navigation">
|
||||
<i class="fas fa-bars text-muted"></i>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="collapse navbar-collapse" id="top-navigation">
|
||||
<div class="row ml-2">
|
||||
<div class="col-lg-12 d-flex align-items-left align-items-md-center flex-column flex-md-row py-3">
|
||||
<h4 class="page-header mb-0">
|
||||
@yield('page-heading')
|
||||
</h4>
|
||||
|
||||
<ol class="breadcrumb mb-0 font-weight-light">
|
||||
<li class="breadcrumb-item">
|
||||
<a href="{{ url('/') }}" class="text-muted">
|
||||
<i class="fa fa-home"></i>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
@yield('breadcrumbs')
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<ul class="navbar-nav ml-auto pr-3 flex-row">
|
||||
@if (app('impersonate')->isImpersonating())
|
||||
<li class="nav-item d-flex align-items-center visible-lg">
|
||||
<a href="{{ route('impersonate.leave') }}" class="btn text-danger">
|
||||
<i class="fas fa-user-secret mr-2"></i>
|
||||
@lang('Stop Impersonating')
|
||||
</a>
|
||||
</li>
|
||||
@endif
|
||||
|
||||
@hook('navbar:items')
|
||||
|
||||
@include('partials.locale-dropdown')
|
||||
|
||||
<li class="nav-item dropdown">
|
||||
<a class="nav-link dropdown-toggle"
|
||||
href="#"
|
||||
id="navbarDropdown"
|
||||
role="button"
|
||||
data-toggle="dropdown"
|
||||
aria-haspopup="true"
|
||||
aria-expanded="false">
|
||||
<img src="{{ auth()->user()->present()->avatar }}"
|
||||
width="50"
|
||||
height="50"
|
||||
class="rounded-circle img-thumbnail img-responsive">
|
||||
</a>
|
||||
<div class="dropdown-menu dropdown-menu-right position-absolute p-0" aria-labelledby="navbarDropdown">
|
||||
<a class="dropdown-item py-2" href="{{ route('profile') }}">
|
||||
<i class="fas fa-user text-muted mr-2"></i>
|
||||
@lang('My Profile')
|
||||
</a>
|
||||
|
||||
@if (config('session.driver') == 'database')
|
||||
<a href="{{ route('profile.sessions') }}" class="dropdown-item py-2">
|
||||
<i class="fas fa-list text-muted mr-2"></i>
|
||||
@lang('Active Sessions')
|
||||
</a>
|
||||
@endif
|
||||
|
||||
@hook('navbar:dropdown')
|
||||
|
||||
<div class="dropdown-divider m-0"></div>
|
||||
|
||||
<a class="dropdown-item py-2" href="{{ route('auth.logout') }}">
|
||||
<i class="fas fa-sign-out-alt text-muted mr-2"></i>
|
||||
@lang('Logout')
|
||||
</a>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
@@ -0,0 +1,26 @@
|
||||
@if ($item && $item->authorize(auth()->user()))
|
||||
<li class="nav-item">
|
||||
<a class="nav-link {{ Request::is($item->getActivePath()) ? 'active' : '' }}"
|
||||
href="{{ $item->getHref() }}"
|
||||
@if($item->isDropdown())
|
||||
data-toggle="collapse"
|
||||
aria-expanded="{{ Request::is($item->getExpandedPath()) ? 'true' : 'false' }}"
|
||||
@endif
|
||||
>
|
||||
@if ($item->getIcon())
|
||||
<i class="{{ $item->getIcon() }}"></i>
|
||||
@endif
|
||||
|
||||
<span>{{ $item->getTitle() }}</span>
|
||||
</a>
|
||||
|
||||
@if ($item->isDropdown())
|
||||
<ul class="{{ Request::is($item->getExpandedPath()) ? '' : 'collapse' }} list-unstyled sub-menu"
|
||||
id="{{ str_replace('#', '', $item->getHref()) }}">
|
||||
@foreach ($item->children() as $child)
|
||||
@include('partials.sidebar.items', ['item' => $child])
|
||||
@endforeach
|
||||
</ul>
|
||||
@endif
|
||||
</li>
|
||||
@endif
|
||||
@@ -0,0 +1,37 @@
|
||||
<nav class="col-md-2 sidebar">
|
||||
<div class="user-box text-center pt-5 pb-3">
|
||||
<div class="user-img">
|
||||
<img src="{{ auth()->user()->present()->avatar }}"
|
||||
width="90"
|
||||
height="90"
|
||||
alt="user-img"
|
||||
class="rounded-circle img-thumbnail img-responsive">
|
||||
</div>
|
||||
<h5 class="my-3">
|
||||
<a href="{{ route('profile') }}">{{ auth()->user()->present()->nameOrEmail }}</a>
|
||||
</h5>
|
||||
|
||||
<ul class="list-inline mb-2">
|
||||
<li class="list-inline-item">
|
||||
<a href="{{ route('profile') }}" title="@lang('My Profile')">
|
||||
<i class="fas fa-cog"></i>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="list-inline-item">
|
||||
<a href="{{ route('auth.logout') }}" class="text-custom" title="@lang('Logout')">
|
||||
<i class="fas fa-sign-out-alt"></i>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="sidebar-sticky">
|
||||
<ul class="nav flex-column">
|
||||
@foreach (\Vanguard\Plugins\Vanguard::availablePlugins() as $plugin)
|
||||
@include('partials.sidebar.items', ['item' => $plugin->sidebar()])
|
||||
@endforeach
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
@@ -0,0 +1,84 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('page-title', __('Permissions'))
|
||||
@section('page-heading', $edit ? $permission->name : __('Create New Permission'))
|
||||
|
||||
@section('breadcrumbs')
|
||||
<li class="breadcrumb-item">
|
||||
<a href="{{ route('permissions.index') }}">@lang('Permissions')</a>
|
||||
</li>
|
||||
<li class="breadcrumb-item active">
|
||||
{{ __($edit ? 'Edit' : 'Create') }}
|
||||
</li>
|
||||
@stop
|
||||
|
||||
@section('content')
|
||||
|
||||
@include('partials.messages')
|
||||
|
||||
@if ($edit)
|
||||
<form action="{{ route('permissions.update', $permission) }}" method="POST" id="permission-form">
|
||||
@method('PUT')
|
||||
@else
|
||||
<form action="{{ route('permissions.store') }}" method="POST" id="permission-form">
|
||||
@endif
|
||||
@csrf
|
||||
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-md-3">
|
||||
<h5 class="card-title">
|
||||
@lang('Permission Details')
|
||||
</h5>
|
||||
<p class="text-muted font-weight-light">
|
||||
@lang('A general permission information.')
|
||||
</p>
|
||||
</div>
|
||||
<div class="col-md-9">
|
||||
<div class="form-group">
|
||||
<label for="name">@lang('Name')</label>
|
||||
<input type="text"
|
||||
class="form-control input-solid"
|
||||
id="name"
|
||||
name="name"
|
||||
placeholder="@lang('Permission Name')"
|
||||
value="{{ $edit ? $permission->name : old('name') }}">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="display_name">@lang('Display Name')</label>
|
||||
<input type="text"
|
||||
class="form-control input-solid"
|
||||
id="display_name"
|
||||
name="display_name"
|
||||
placeholder="@lang('Display Name')"
|
||||
value="{{ $edit ? $permission->display_name : old('display_name') }}">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="description">@lang('Description')</label>
|
||||
<textarea name="description"
|
||||
id="description"
|
||||
class="form-control input-solid">{{ $edit ? $permission->description : old('description') }}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-2">
|
||||
<button type="submit" class="btn btn-primary">
|
||||
{{ __($edit ? "Update Permission" : "Create Permission") }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
@stop
|
||||
|
||||
@section('scripts')
|
||||
@if ($edit)
|
||||
{!! JsValidator::formRequest('Vanguard\Http\Requests\Permission\UpdatePermissionRequest', '#permission-form') !!}
|
||||
@else
|
||||
{!! JsValidator::formRequest('Vanguard\Http\Requests\Permission\CreatePermissionRequest', '#permission-form') !!}
|
||||
@endif
|
||||
@stop
|
||||
@@ -0,0 +1,106 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('page-title', __('Permissions'))
|
||||
@section('page-heading', __('Permissions'))
|
||||
|
||||
@section('breadcrumbs')
|
||||
<li class="breadcrumb-item active">
|
||||
@lang('Permissions')
|
||||
</li>
|
||||
@stop
|
||||
|
||||
@section('content')
|
||||
|
||||
@include('partials.messages')
|
||||
|
||||
<form action="{{ route('permissions.save') }}" method="POST" class="mb-4">
|
||||
@csrf
|
||||
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
|
||||
<div class="row mb-3 pb-3 border-bottom-light">
|
||||
<div class="col-lg-12">
|
||||
<div class="float-right">
|
||||
<a href="{{ route('permissions.create') }}" class="btn btn-primary btn-rounded">
|
||||
<i class="fas fa-plus mr-2"></i>
|
||||
@lang('Add Permission')
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="table-responsive" id="users-table-wrapper">
|
||||
<table class="table table-striped table-borderless">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="min-width-200">@lang('Name')</th>
|
||||
@foreach ($roles as $role)
|
||||
<th class="text-center">{{ $role->display_name }}</th>
|
||||
@endforeach
|
||||
<th class="text-center min-width-100">@lang('Action')</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@if (count($permissions))
|
||||
@foreach ($permissions as $permission)
|
||||
<tr>
|
||||
<td>{{ $permission->display_name ?: $permission->name }}</td>
|
||||
|
||||
@foreach ($roles as $role)
|
||||
<td class="text-center">
|
||||
<div class="custom-control custom-checkbox">
|
||||
<input type="checkbox"
|
||||
name="roles[{{ $role->id }}][]"
|
||||
value="{{ $permission->id }}"
|
||||
class="custom-control-input"
|
||||
id="cb-{{ $role->id }}-{{ $permission->id }}"
|
||||
{{ $role->hasPermission($permission->name) ? 'checked' : '' }}>
|
||||
<label class="custom-control-label d-inline"
|
||||
for="cb-{{ $role->id }}-{{ $permission->id }}"></label>
|
||||
</div>
|
||||
</td>
|
||||
@endforeach
|
||||
|
||||
<td class="text-center">
|
||||
<a href="{{ route('permissions.edit', $permission) }}" class="btn btn-icon"
|
||||
title="@lang('Edit Permission')" data-toggle="tooltip" data-placement="top">
|
||||
<i class="fas fa-edit"></i>
|
||||
</a>
|
||||
|
||||
@if ($permission->removable)
|
||||
<a href="{{ route('permissions.destroy', $permission) }}" class="btn btn-icon"
|
||||
title="@lang('Delete Permission')"
|
||||
data-toggle="tooltip"
|
||||
data-placement="top"
|
||||
data-method="DELETE"
|
||||
data-confirm-title="@lang('Please Confirm')"
|
||||
data-confirm-text="@lang('Are you sure that you want to delete this permission?')"
|
||||
data-confirm-delete="@lang('Yes, delete it!')">
|
||||
<i class="fas fa-trash"></i>
|
||||
</a>
|
||||
@endif
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
@else
|
||||
<tr>
|
||||
<td colspan="4"><em>@lang('No records found.')</em></td>
|
||||
</tr>
|
||||
@endif
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@if (count($permissions))
|
||||
<div class="row">
|
||||
<div class="col-md-2">
|
||||
<button type="submit" class="btn btn-primary">@lang('Save Permissions')</button>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
</form>
|
||||
|
||||
@stop
|
||||
@@ -0,0 +1,14 @@
|
||||
<div class="card widget">
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="p-3 text-danger flex-1">
|
||||
<i class="fa fa-user-slash fa-3x"></i>
|
||||
</div>
|
||||
|
||||
<div class="pr-3">
|
||||
<h2 class="text-right">{{ number_format($count) }}</h2>
|
||||
<div class="text-muted">@lang('Banned Users')</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,31 @@
|
||||
<div class="card overflow-hidden">
|
||||
<h6 class="card-header d-flex align-items-center justify-content-between">
|
||||
@lang('Latest Registrations')
|
||||
|
||||
@if (count($latestRegistrations))
|
||||
<small class="float-right">
|
||||
<a href="{{ route('users.index') }}">@lang('View All')</a>
|
||||
</small>
|
||||
@endif
|
||||
</h6>
|
||||
|
||||
<div class="card-body p-0">
|
||||
@if (count($latestRegistrations))
|
||||
<ul class="list-group list-group-flush">
|
||||
@foreach ($latestRegistrations as $user)
|
||||
<li class="list-group-item list-group-item-action px-4 py-3">
|
||||
<a href="{{ route('users.show', $user) }}" class="d-flex text-dark no-decoration">
|
||||
<img class="rounded-circle" width="40" height="40" src="{{ $user->present()->avatar }}">
|
||||
<div class="ml-2" style="line-height: 1.2;">
|
||||
<span class="d-block p-0">{{ $user->present()->nameOrEmail }}</span>
|
||||
<small class="text-muted">{{ $user->created_at->diffForHumans() }}</small>
|
||||
</div>
|
||||
</a>
|
||||
</li>
|
||||
@endforeach
|
||||
</ul>
|
||||
@else
|
||||
<p class="text-muted">@lang('No records found.')</p>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,14 @@
|
||||
<div class="card widget">
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="p-3 text-success flex-1">
|
||||
<i class="fa fa-user-plus fa-3x"></i>
|
||||
</div>
|
||||
|
||||
<div class="pr-3">
|
||||
<h2 class="text-right">{{ number_format($count) }}</h2>
|
||||
<div class="text-muted">@lang('New Users')</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,13 @@
|
||||
<script>
|
||||
var users = @json(array_values($usersPerMonth));
|
||||
var months = @json(array_keys($usersPerMonth));
|
||||
var trans = {
|
||||
chartLabel: "{{ __('Registration History') }}",
|
||||
new: "{{ __('new') }}",
|
||||
user: "{{ __('user') }}",
|
||||
users: "{{ __('users') }}"
|
||||
};
|
||||
</script>
|
||||
|
||||
<script src="{{ asset('assets/js/chart.min.js') }}"></script>
|
||||
<script src="{{ asset('assets/js/as/dashboard-admin.js') }}"></script>
|
||||
@@ -0,0 +1,11 @@
|
||||
<div class="card">
|
||||
<h6 class="card-header">
|
||||
@lang('Registration History')
|
||||
</h6>
|
||||
|
||||
<div class="card-body">
|
||||
<div class="pt-4 px-3">
|
||||
<canvas id="myChart" height="365"></canvas>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,14 @@
|
||||
<div class="card widget">
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="p-3 text-primary flex-1">
|
||||
<i class="fa fa-users fa-3x"></i>
|
||||
</div>
|
||||
|
||||
<div class="pr-3">
|
||||
<h2 class="text-right">{{ number_format($count) }}</h2>
|
||||
<div class="text-muted">@lang('Total Users')</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,14 @@
|
||||
<div class="card widget">
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="p-3 text-info flex-1">
|
||||
<i class="fa fa-user fa-3x"></i>
|
||||
</div>
|
||||
|
||||
<div class="pr-3">
|
||||
<h2 class="text-right">{{ number_format($count) }}</h2>
|
||||
<div class="text-muted">@lang('Unconfirmed Users')</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,53 @@
|
||||
<div class="col-md-3">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<a href="{{ route('profile') }}" class="text-center no-decoration">
|
||||
<div class="icon my-3">
|
||||
<i class="fas fa-user fa-2x"></i>
|
||||
</div>
|
||||
<p class="lead mb-0">@lang('Update Profile')</p>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@if (config('session.driver') == 'database')
|
||||
<div class="col-md-3">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<a href="{{ route('profile.sessions') }}" class="text-center no-decoration">
|
||||
<div class="icon my-3">
|
||||
<i class="fa fa-list fa-2x"></i>
|
||||
</div>
|
||||
<p class="lead mb-0">@lang('My Sessions')</p>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<div class="col-md-3">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<a href="{{ route('profile.activity') }}" class="text-center no-decoration">
|
||||
<div class="icon my-3">
|
||||
<i class="fas fa-server fa-2x"></i>
|
||||
</div>
|
||||
<p class="lead mb-0">@lang('Activity Log')</p>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-3">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<a href="{{ route('auth.logout') }}" class="text-center no-decoration">
|
||||
<div class="icon my-3">
|
||||
<i class="fas fa-sign-out-alt fa-2x"></i>
|
||||
</div>
|
||||
<p class="lead mb-0">@lang('Logout')</p>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,81 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('page-title', __('Roles'))
|
||||
@section('page-heading', $edit ? $role->name : __('Create New Role'))
|
||||
|
||||
@section('breadcrumbs')
|
||||
<li class="breadcrumb-item">
|
||||
<a href="{{ route('roles.index') }}">@lang('Roles')</a>
|
||||
</li>
|
||||
<li class="breadcrumb-item active">
|
||||
{{ __($edit ? 'Edit' : 'Create') }}
|
||||
</li>
|
||||
@stop
|
||||
|
||||
@section('content')
|
||||
|
||||
@include('partials.messages')
|
||||
|
||||
@if ($edit)
|
||||
<form action="{{ route('roles.update', $role) }}" method="POST" id="role-form">
|
||||
@method('PUT')
|
||||
@else
|
||||
<form action="{{ route('roles.store') }}" method="POST" id="role-form">
|
||||
@endif
|
||||
@csrf
|
||||
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-md-3">
|
||||
<h5 class="card-title">
|
||||
@lang('Role Details')
|
||||
</h5>
|
||||
<p class="text-muted">
|
||||
@lang('A general role information.')
|
||||
</p>
|
||||
</div>
|
||||
<div class="col-md-9">
|
||||
<div class="form-group">
|
||||
<label for="name">@lang('Name')</label>
|
||||
<input type="text"
|
||||
class="form-control input-solid"
|
||||
id="name"
|
||||
name="name"
|
||||
placeholder="@lang('Role Name')"
|
||||
value="{{ $edit ? $role->name : old('name') }}">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="display_name">@lang('Display Name')</label>
|
||||
<input type="text"
|
||||
class="form-control input-solid"
|
||||
id="display_name"
|
||||
name="display_name"
|
||||
placeholder="@lang('Display Name')"
|
||||
value="{{ $edit ? $role->display_name : old('display_name') }}">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="description">@lang('Description')</label>
|
||||
<textarea name="description"
|
||||
id="description"
|
||||
class="form-control input-solid">{{ $edit ? $role->description : old('description') }}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button type="submit" class="btn btn-primary">
|
||||
{{ __($edit ? 'Update Role' : 'Create Role') }}
|
||||
</button>
|
||||
</form>
|
||||
|
||||
@stop
|
||||
|
||||
@section('scripts')
|
||||
@if ($edit)
|
||||
{!! JsValidator::formRequest('Vanguard\Http\Requests\Role\UpdateRoleRequest', '#role-form') !!}
|
||||
@else
|
||||
{!! JsValidator::formRequest('Vanguard\Http\Requests\Role\CreateRoleRequest', '#role-form') !!}
|
||||
@endif
|
||||
@stop
|
||||
@@ -0,0 +1,76 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('page-title', __('Roles'))
|
||||
@section('page-heading', __('Roles'))
|
||||
|
||||
@section('breadcrumbs')
|
||||
<li class="breadcrumb-item active">
|
||||
@lang('Roles')
|
||||
</li>
|
||||
@stop
|
||||
|
||||
@section('content')
|
||||
|
||||
@include('partials.messages')
|
||||
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<div class="row mb-3 pb-3 border-bottom-light">
|
||||
<div class="col-lg-12">
|
||||
<div class="float-right">
|
||||
<a href="{{ route('roles.create') }}" class="btn btn-primary btn-rounded">
|
||||
<i class="fas fa-plus mr-2"></i>
|
||||
@lang('Add Role')
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="table-responsive" id="users-table-wrapper">
|
||||
<table class="table table-striped table-borderless">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="min-width-100">@lang('Name')</th>
|
||||
<th class="min-width-150">@lang('Display Name')</th>
|
||||
<th class="min-width-150">@lang('# of users with this role')</th>
|
||||
<th class="text-center">@lang('Action')</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@if (count($roles))
|
||||
@foreach ($roles as $role)
|
||||
<tr>
|
||||
<td>{{ $role->name }}</td>
|
||||
<td>{{ $role->display_name }}</td>
|
||||
<td>{{ $role->users_count }}</td>
|
||||
<td class="text-center">
|
||||
<a href="{{ route('roles.edit', $role) }}" class="btn btn-icon"
|
||||
title="@lang('Edit Role')" data-toggle="tooltip" data-placement="top">
|
||||
<i class="fas fa-edit"></i>
|
||||
</a>
|
||||
@if ($role->removable)
|
||||
<a href="{{ route('roles.destroy', $role) }}" class="btn btn-icon"
|
||||
title="@lang('Delete Role')"
|
||||
data-toggle="tooltip"
|
||||
data-placement="top"
|
||||
data-method="DELETE"
|
||||
data-confirm-title="@lang('Please Confirm')"
|
||||
data-confirm-text="@lang('Are you sure that you want to delete this role?')"
|
||||
data-confirm-delete="@lang('Yes, delete it!')">
|
||||
<i class="fas fa-trash"></i>
|
||||
</a>
|
||||
@endif
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
@else
|
||||
<tr>
|
||||
<td colspan="4"><em>@lang('No records found.')</em></td>
|
||||
</tr>
|
||||
@endif
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@stop
|
||||
@@ -0,0 +1,70 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('page-title', __('Authentication Settings'))
|
||||
@section('page-heading', __('Authentication'))
|
||||
|
||||
@section('breadcrumbs')
|
||||
<li class="breadcrumb-item text-muted">
|
||||
@lang('Settings')
|
||||
</li>
|
||||
<li class="breadcrumb-item active">
|
||||
@lang('Authentication')
|
||||
</li>
|
||||
@stop
|
||||
|
||||
@section('content')
|
||||
|
||||
@include('partials.messages')
|
||||
|
||||
<!-- Nav tabs -->
|
||||
<ul class="nav nav-pills mb-4 mt-2" id="pills-tab" role="tablist">
|
||||
<li class="nav-item">
|
||||
<a href="#auth"
|
||||
class="nav-link active"
|
||||
id="pills-home-tab"
|
||||
data-toggle="pill"
|
||||
aria-controls="pills-home"
|
||||
aria-selected="true">
|
||||
<i class="fa fa-lock"></i>
|
||||
@lang('Authentication')
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="#registration"
|
||||
class="nav-link"
|
||||
id="pills-home-tab"
|
||||
data-toggle="pill"
|
||||
aria-controls="pills-home"
|
||||
aria-selected="true">
|
||||
<i class="fa fa-user-plus"></i>
|
||||
@lang('Registration')
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<!-- Tab panes -->
|
||||
<div class="tab-content">
|
||||
<div role="tabpanel" class="tab-pane active" id="auth">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
@include('settings.partials.auth')
|
||||
@include('settings.partials.two-factor')
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
@include('settings.partials.throttling')
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div role="tabpanel" class="tab-pane" id="registration">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
@include('settings.partials.registration')
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
@include('settings.partials.recaptcha')
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@stop
|
||||
@@ -0,0 +1,41 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('page-title', __('General Settings'))
|
||||
@section('page-heading', __('General Settings'))
|
||||
|
||||
@section('breadcrumbs')
|
||||
<li class="breadcrumb-item text-muted">
|
||||
@lang('Settings')
|
||||
</li>
|
||||
<li class="breadcrumb-item active">
|
||||
@lang('General')
|
||||
</li>
|
||||
@stop
|
||||
|
||||
@section('content')
|
||||
|
||||
@include('partials.messages')
|
||||
|
||||
<form action="{{ route('settings.general.update') }}" method="POST" id="general-settings-form">
|
||||
@csrf
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-8">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<div class="form-group">
|
||||
<label for="name">@lang('Name')</label>
|
||||
<input type="text" class="form-control input-solid" id="app_name"
|
||||
name="app_name" value="{{ setting('app_name') }}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button type="submit" class="btn btn-primary">
|
||||
@lang('Update')
|
||||
</button>
|
||||
</form>
|
||||
|
||||
@stop
|
||||
@@ -0,0 +1,63 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('page-title', __('Notification Settings'))
|
||||
@section('page-heading', __('Notification Settings'))
|
||||
|
||||
@section('breadcrumbs')
|
||||
<li class="breadcrumb-item text-muted">
|
||||
@lang('Settings')
|
||||
</li>
|
||||
<li class="breadcrumb-item active">
|
||||
@lang('Notifications')
|
||||
</li>
|
||||
@stop
|
||||
|
||||
@section('content')
|
||||
|
||||
@include('partials.messages')
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div class="card">
|
||||
<h5 class="card-header">
|
||||
@lang('Email Notifications')
|
||||
</h5>
|
||||
|
||||
<div class="card-body">
|
||||
<form action="{{ route('settings.notifications.update') }}" method="POST" id="notification-settings-form">
|
||||
@csrf
|
||||
|
||||
<div class="form-group mb-4">
|
||||
<div class="d-flex align-items-center">
|
||||
<div class="switch">
|
||||
<input type="hidden" value="0" name="notifications_signup_email">
|
||||
|
||||
<input type="checkbox"
|
||||
name="notifications_signup_email"
|
||||
class="switch"
|
||||
value="1"
|
||||
id="switch-signup-email"
|
||||
{{ setting('notifications_signup_email') ? 'checked' : '' }}>
|
||||
|
||||
<label for="switch-signup-email"></label>
|
||||
</div>
|
||||
<div class="ml-3 d-flex flex-column">
|
||||
<label class="mb-0">@lang('Sign-Up Notification')</label>
|
||||
|
||||
<small class="pt-0 text-muted">
|
||||
@lang('Send an email to the Administrators when user signs up.')
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button type="submit" class="btn btn-primary mt-3">
|
||||
@lang('Update')
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@stop
|
||||
@@ -0,0 +1,73 @@
|
||||
<div class="card">
|
||||
<h6 class="card-header">
|
||||
@lang('General')
|
||||
</h6>
|
||||
|
||||
<div class="card-body">
|
||||
<form method="POST" action="{{ route('settings.auth.update') }}" id="auth-general-settings-form">
|
||||
@csrf
|
||||
|
||||
<div class="form-group mb-4">
|
||||
<div class="d-flex align-items-center">
|
||||
<div class="switch">
|
||||
<input type="hidden" value="0" name="remember_me">
|
||||
<input type="checkbox" name="remember_me" id="switch-remember-me" class="switch"
|
||||
value="1" {{ setting('remember_me') ? 'checked' : '' }}>
|
||||
<label for="switch-remember-me"></label>
|
||||
</div>
|
||||
<div class="ml-3 d-flex flex-column">
|
||||
<label class="mb-0">@lang('Allow "Remember Me"')</label>
|
||||
<small class="pt-0 text-muted">
|
||||
@lang("Should 'Remember Me' checkbox be displayed on login form?")
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group my-4">
|
||||
<div class="d-flex align-items-center">
|
||||
<div class="switch">
|
||||
<input type="hidden" value="0" name="forgot_password">
|
||||
<input type="checkbox" name="forgot_password" id="switch-forgot-pass" class="switch"
|
||||
value="1" {{ setting('forgot_password') ? 'checked' : '' }}>
|
||||
<label for="switch-forgot-pass"></label>
|
||||
</div>
|
||||
<div class="ml-3 d-flex flex-column">
|
||||
<label class="mb-0">@lang('Forgot Password')</label>
|
||||
<small class="pt-0 text-muted">
|
||||
@lang('Enable/Disable forgot password feature.')
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group my-4">
|
||||
<label for="login_reset_token_lifetime">
|
||||
@lang('Reset Token Lifetime') <br>
|
||||
<small class="text-muted">
|
||||
@lang('Number of minutes that the reset token should be considered valid.')
|
||||
</small>
|
||||
</label>
|
||||
<input type="text" name="login_reset_token_lifetime"
|
||||
class="form-control input-solid" value="{{ setting('login_reset_token_lifetime', 30) }}">
|
||||
</div>
|
||||
|
||||
<div class="form-group my-4">
|
||||
<label for="login_reset_token_lifetime">
|
||||
@lang('Max Number of Active Sessions') <br>
|
||||
<small class="text-muted">
|
||||
@lang('Maximum number of active sessions per user. Set to 0 to allow unlimited number of active sessions.')
|
||||
<br>
|
||||
@lang('Only applies when using database session driver.')
|
||||
</small>
|
||||
</label>
|
||||
<input type="text" name="max_active_sessions"
|
||||
class="form-control input-solid" value="{{ setting('max_active_sessions', 0) }}">
|
||||
</div>
|
||||
|
||||
<button type="submit" class="btn btn-primary">
|
||||
@lang('Update')
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,41 @@
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title mb-1">
|
||||
@lang('Google reCAPTCHA')
|
||||
</h5>
|
||||
|
||||
<small class="text-muted d-block mb-4">
|
||||
@lang('Enable/Disable Google reCAPTCHA during the registration.')
|
||||
</small>
|
||||
|
||||
@if (! (config('captcha.secret') && config('captcha.sitekey')))
|
||||
<div class="alert alert-info">
|
||||
@lang('To utilize Google reCAPTCHA, please get your') <code>@lang('Site Key')</code>
|
||||
@lang('and') <code>@lang('Secret Key')</code>
|
||||
@lang('from')
|
||||
<a href="https://www.google.com/recaptcha/intro/index.html" target="_blank">
|
||||
<strong>@lang('reCAPTCHA Website')</strong>
|
||||
</a>,
|
||||
@lang('and update your') <code>RECAPTCHA_SITEKEY</code> @lang('and')
|
||||
<code>RECAPTCHA_SECRETKEY</code> @lang('environment variables inside') <code>.env</code>
|
||||
@lang('file').
|
||||
</div>
|
||||
@else
|
||||
@if (setting('registration.captcha.enabled'))
|
||||
<form action="{{ route('settings.registration.captcha.disable') }}" method="POST" id="captcha-settings-form">
|
||||
@csrf
|
||||
<button type="submit" class="btn btn-danger">
|
||||
@lang('Disable')
|
||||
</button>
|
||||
</form>
|
||||
@else
|
||||
<form action="{{ route('settings.registration.captcha.enable') }}" method="POST" id="captcha-settings-form">
|
||||
@csrf
|
||||
<button type="submit" class="btn btn-primary">
|
||||
@lang('Enable')
|
||||
</button>
|
||||
</form>
|
||||
@endif
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,76 @@
|
||||
<div class="card">
|
||||
<h6 class="card-header">@lang('General')</h6>
|
||||
|
||||
<div class="card-body">
|
||||
<form action="{{ route('settings.auth.update') }}" method="POST" id="registration-settings-form">
|
||||
@csrf
|
||||
|
||||
<div class="form-group mb-4">
|
||||
<div class="d-flex align-items-center">
|
||||
<div class="switch">
|
||||
<input type="hidden" value="0" name="reg_enabled">
|
||||
|
||||
<input
|
||||
type="checkbox" name="reg_enabled"
|
||||
id="switch-reg-enabled"
|
||||
class="switch" value="1"
|
||||
{{ setting('reg_enabled') ? 'checked' : '' }}>
|
||||
|
||||
<label for="switch-reg-enabled"></label>
|
||||
</div>
|
||||
<div class="ml-3 d-flex flex-column">
|
||||
<label class="mb-0">@lang('Allow Registration')</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group my-4">
|
||||
<div class="d-flex align-items-center">
|
||||
<div class="switch">
|
||||
<input type="hidden" value="0" name="tos">
|
||||
<input
|
||||
value="1"
|
||||
type="checkbox" name="tos"
|
||||
id="switch-tos"
|
||||
class="switch"
|
||||
{{ setting('tos') ? 'checked' : '' }}>
|
||||
<label for="switch-tos"></label>
|
||||
</div>
|
||||
<div class="ml-3 d-flex flex-column">
|
||||
<label class="mb-0">@lang('Terms & Conditions')</label>
|
||||
<small class="pt-0 text-muted">
|
||||
@lang('The user has to confirm that he agrees with terms and conditions in order to create an account.')
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group my-4">
|
||||
<div class="d-flex align-items-center">
|
||||
<div class="switch">
|
||||
<input type="hidden" value="0" name="reg_email_confirmation">
|
||||
<input
|
||||
value="1"
|
||||
type="checkbox" name="reg_email_confirmation"
|
||||
id="switch-reg-email-confirm"
|
||||
class="switch"
|
||||
{{ setting('reg_email_confirmation') ? 'checked' : '' }}>
|
||||
<label for="switch-reg-email-confirm"></label>
|
||||
</div>
|
||||
<div class="ml-3 d-flex flex-column">
|
||||
<label class="mb-0">
|
||||
@lang('Email Confirmation')
|
||||
</label>
|
||||
<small class="text-muted">
|
||||
@lang('Require email confirmation from your newly registered users.')
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button type="submit" class="btn btn-primary mt-3">
|
||||
@lang('Update')
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,59 @@
|
||||
<div class="card">
|
||||
<h6 class="card-header">
|
||||
@lang('Authentication Throttling')
|
||||
</h6>
|
||||
|
||||
<div class="card-body">
|
||||
<form method="POST" action="{{ route('settings.auth.update') }}" id="auth-throttle-settings-form">
|
||||
@csrf
|
||||
|
||||
<div class="form-group mb-4">
|
||||
<div class="d-flex align-items-center">
|
||||
<div class="switch">
|
||||
<input type="hidden" value="0" name="throttle_enabled">
|
||||
<input type="checkbox"
|
||||
class="switch"
|
||||
id="switch-throttle"
|
||||
name="throttle_enabled"
|
||||
value="1"
|
||||
{{ setting('throttle_enabled') ? 'checked' : '' }}>
|
||||
<label for="switch-throttle"></label>
|
||||
</div>
|
||||
<div class="ml-3 d-flex flex-column">
|
||||
<label class="mb-0">@lang('Throttle Authentication')</label>
|
||||
<small class="text-muted">
|
||||
@lang('Should the system throttle authentication attempts?')
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group my-4">
|
||||
<label for="throttle_attempts">
|
||||
@lang('Maximum Number of Attempts') <br>
|
||||
<small class="text-muted">
|
||||
@lang('Maximum number of incorrect login attempts before lockout.')
|
||||
</small>
|
||||
</label>
|
||||
<input type="text" name="throttle_attempts" class="form-control input-solid"
|
||||
value="{{ setting('throttle_attempts', 10) }}">
|
||||
</div>
|
||||
|
||||
<div class="form-group my-4">
|
||||
<label for="throttle_lockout_time">
|
||||
@lang('Lockout Time') <br>
|
||||
<small class="text-muted">
|
||||
@lang('Number of minutes to lock the user out for after specified maximum number of incorrect login attempts.')
|
||||
</small>
|
||||
</label>
|
||||
|
||||
<input type="text" name="throttle_lockout_time" class="form-control input-solid"
|
||||
value="{{ setting('throttle_lockout_time', 1) }}">
|
||||
</div>
|
||||
|
||||
<button type="submit" class="btn btn-primary">
|
||||
@lang('Update')
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,31 @@
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title mb-1">@lang('Two-Factor Authentication')</h5>
|
||||
|
||||
<small class="text-muted d-block mb-4">
|
||||
@lang('Enable/Disable Two-Factor Authentication for the application.')
|
||||
</small>
|
||||
|
||||
@if (setting('2fa.enabled'))
|
||||
<form method="POST" action="{{ route('settings.auth.2fa.disable') }}" id="auth-2fa-settings-form">
|
||||
@csrf
|
||||
<button type="submit"
|
||||
class="btn btn-danger"
|
||||
data-toggle="loader"
|
||||
data-loading-text="@lang('Disabling...')">
|
||||
@lang('Disable')
|
||||
</button>
|
||||
</form>
|
||||
@else
|
||||
<form method="POST" action="{{ route('settings.auth.2fa.enable') }}" id="auth-2fa-settings-form">
|
||||
@csrf
|
||||
<button type="submit"
|
||||
class="btn btn-primary"
|
||||
data-toggle="loader"
|
||||
data-loading-text="@lang('Enabling...')">
|
||||
@lang('Enable')
|
||||
</button>
|
||||
</form>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,72 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('page-title', __('Add User'))
|
||||
@section('page-heading', __('Create New User'))
|
||||
|
||||
@section('breadcrumbs')
|
||||
<li class="breadcrumb-item">
|
||||
<a href="{{ route('users.index') }}">@lang('Users')</a>
|
||||
</li>
|
||||
<li class="breadcrumb-item active">
|
||||
@lang('Create')
|
||||
</li>
|
||||
@stop
|
||||
|
||||
@section('content')
|
||||
|
||||
@include('partials.messages')
|
||||
|
||||
<form action="{{ route('users.store') }}" method="POST" enctype="multipart/form-data" id="user-form">
|
||||
@csrf
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-md-3">
|
||||
<h5 class="card-title">
|
||||
@lang('User Details')
|
||||
</h5>
|
||||
<p class="text-muted font-weight-light">
|
||||
@lang('A general user profile information.')
|
||||
</p>
|
||||
</div>
|
||||
<div class="col-md-9">
|
||||
@include('user.partials.details', ['edit' => false, 'profile' => false])
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-md-3">
|
||||
<h5 class="card-title">
|
||||
@lang('Login Details')
|
||||
</h5>
|
||||
<p class="text-muted font-weight-light">
|
||||
@lang('Details used for authenticating with the application.')
|
||||
</p>
|
||||
</div>
|
||||
<div class="col-md-9">
|
||||
@include('user.partials.auth', ['edit' => false])
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<button type="submit" class="btn btn-primary">
|
||||
@lang('Create User')
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<br>
|
||||
@stop
|
||||
|
||||
@section('scripts')
|
||||
<script src="{{ asset('assets/js/as/profile.js') }}"></script>
|
||||
{!! JsValidator::formRequest('Vanguard\Http\Requests\User\CreateUserRequest', '#user-form') !!}
|
||||
@stop
|
||||
@@ -0,0 +1,132 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('page-title', __('Edit User'))
|
||||
@section('page-heading', $user->present()->nameOrEmail)
|
||||
|
||||
@section('breadcrumbs')
|
||||
<li class="breadcrumb-item">
|
||||
<a href="{{ route('users.index') }}">@lang('Users')</a>
|
||||
</li>
|
||||
<li class="breadcrumb-item">
|
||||
<a href="{{ route('users.show', $user->id) }}">
|
||||
{{ $user->present()->nameOrEmail }}
|
||||
</a>
|
||||
</li>
|
||||
<li class="breadcrumb-item active">
|
||||
@lang('Edit')
|
||||
</li>
|
||||
@stop
|
||||
|
||||
@section('content')
|
||||
|
||||
@include('partials.messages')
|
||||
|
||||
@php
|
||||
$activeTab = session('tab') ?? 'details';
|
||||
@endphp
|
||||
|
||||
<div class="row">
|
||||
<div class="col-8">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<ul class="nav nav-tabs" id="nav-tab" role="tablist">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link {{ $activeTab == 'details' ? 'active' : '' }}"
|
||||
id="details-tab"
|
||||
data-toggle="tab"
|
||||
href="#details"
|
||||
role="tab"
|
||||
aria-controls="home"
|
||||
aria-selected="true">
|
||||
@lang('User Details')
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link"
|
||||
id="authentication-tab"
|
||||
data-toggle="tab"
|
||||
href="#login-details"
|
||||
role="tab"
|
||||
aria-controls="home"
|
||||
aria-selected="true">
|
||||
@lang('Login Details')
|
||||
</a>
|
||||
</li>
|
||||
@if (setting('2fa.enabled'))
|
||||
<li class="nav-item">
|
||||
<a class="nav-link {{ $activeTab == '2fa' ? 'active' : '' }}"
|
||||
id="authentication-tab"
|
||||
data-toggle="tab"
|
||||
href="#2fa"
|
||||
role="tab"
|
||||
aria-controls="home"
|
||||
aria-selected="true">
|
||||
@lang('Two-Factor Authentication')
|
||||
</a>
|
||||
</li>
|
||||
@endif
|
||||
</ul>
|
||||
|
||||
<div class="tab-content mt-4" id="nav-tabContent">
|
||||
<div class="tab-pane {{ $activeTab == 'details' ? 'show active' : '' }} fade px-2"
|
||||
id="details"
|
||||
role="tabpanel"
|
||||
aria-labelledby="nav-home-tab">
|
||||
<form action="{{ route('users.update.details', $user) }}" method="POST" id="details-form">
|
||||
@csrf
|
||||
@method('PUT')
|
||||
@include('user.partials.details', ['profile' => false])
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div class="tab-pane fade px-2"
|
||||
id="login-details"
|
||||
role="tabpanel"
|
||||
aria-labelledby="nav-profile-tab">
|
||||
<form action="{{ route('users.update.login-details', $user) }}"
|
||||
method="POST"
|
||||
id="login-details-form">
|
||||
@csrf
|
||||
@method('PUT')
|
||||
@include('user.partials.auth')
|
||||
</form>
|
||||
</div>
|
||||
|
||||
@if (setting('2fa.enabled'))
|
||||
<div class="tab-pane {{ $activeTab == '2fa' ? 'show active' : '' }} fade px-2" id="2fa" role="tabpanel" aria-labelledby="nav-profile-tab">
|
||||
@include('user.partials.two-factor')
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-4">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<form action="{{ route('user.update.avatar', $user->id) }}"
|
||||
method="POST"
|
||||
id="avatar-form"
|
||||
enctype="multipart/form-data">
|
||||
@csrf
|
||||
@include('user.partials.avatar', ['updateUrl' => route('user.update.avatar.external', $user->id)])
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@stop
|
||||
|
||||
@section('scripts')
|
||||
<script src="{{ asset('assets/js/as/btn.js') }}"></script>
|
||||
<script src="{{ asset('assets/js/as/profile.js') }}"></script>
|
||||
{!! JsValidator::formRequest('Vanguard\Http\Requests\User\UpdateDetailsRequest', '#details-form') !!}
|
||||
{!! JsValidator::formRequest('Vanguard\Http\Requests\User\UpdateLoginDetailsRequest', '#login-details-form') !!}
|
||||
|
||||
@if (setting('2fa.enabled'))
|
||||
{!! JsValidator::formRequest('Vanguard\Http\Requests\TwoFactor\EnableTwoFactorRequest', '#two-factor-form') !!}
|
||||
@endif
|
||||
@stop
|
||||
@@ -0,0 +1,102 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('page-title', __('Users'))
|
||||
@section('page-heading', __('Users'))
|
||||
|
||||
@section('breadcrumbs')
|
||||
<li class="breadcrumb-item active">
|
||||
@lang('Users')
|
||||
</li>
|
||||
@stop
|
||||
|
||||
@section('content')
|
||||
|
||||
@include('partials.messages')
|
||||
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
|
||||
<form action="" method="GET" id="users-form" class="pb-2 mb-3 border-bottom-light">
|
||||
<div class="row my-3 flex-md-row flex-column-reverse">
|
||||
<div class="col-md-4 mt-md-0 mt-2">
|
||||
<div class="input-group custom-search-form">
|
||||
<input type="text"
|
||||
class="form-control input-solid"
|
||||
name="search"
|
||||
value="{{ Request::get('search') }}"
|
||||
placeholder="@lang('Search for users...')">
|
||||
|
||||
<span class="input-group-append">
|
||||
@if (Request::has('search') && Request::get('search') != '')
|
||||
<a href="{{ route('users.index') }}"
|
||||
class="btn btn-light d-flex align-items-center text-muted"
|
||||
role="button">
|
||||
<i class="fas fa-times"></i>
|
||||
</a>
|
||||
@endif
|
||||
<button class="btn btn-light" type="submit" id="search-users-btn">
|
||||
<i class="fas fa-search text-muted"></i>
|
||||
</button>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-2 mt-2 mt-md-0">
|
||||
<select name="status" id="status" class="form-control input-solid">
|
||||
@foreach($statuses as $key => $value)
|
||||
<option value="{{ $key }}" {{ Request::get('status') == $key ? 'selected' : '' }}>
|
||||
{{ $value }}
|
||||
</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
<a href="{{ route('users.create') }}" class="btn btn-primary btn-rounded float-right">
|
||||
<i class="fas fa-plus mr-2"></i>
|
||||
@lang('Add User')
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<div class="table-responsive" id="users-table-wrapper">
|
||||
<table class="table table-borderless table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th></th>
|
||||
<th class="min-width-80">@lang('Username')</th>
|
||||
<th class="min-width-150">@lang('Full Name')</th>
|
||||
<th class="min-width-100">@lang('Email')</th>
|
||||
<th class="min-width-80">@lang('Registration Date')</th>
|
||||
<th class="min-width-80">@lang('Status')</th>
|
||||
<th class="text-center min-width-150">@lang('Action')</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@if (count($users))
|
||||
@foreach ($users as $user)
|
||||
@include('user.partials.row')
|
||||
@endforeach
|
||||
@else
|
||||
<tr>
|
||||
<td colspan="7"><em>@lang('No records found.')</em></td>
|
||||
</tr>
|
||||
@endif
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{!! $users->render() !!}
|
||||
|
||||
@stop
|
||||
|
||||
@section('scripts')
|
||||
<script>
|
||||
$("#status").change(function () {
|
||||
$("#users-form").submit();
|
||||
});
|
||||
</script>
|
||||
@stop
|
||||
@@ -0,0 +1,44 @@
|
||||
<div class="form-group">
|
||||
<label for="email">@lang('Email')</label>
|
||||
<input type="email"
|
||||
class="form-control input-solid"
|
||||
id="email"
|
||||
name="email"
|
||||
placeholder="@lang('Email')"
|
||||
value="{{ $edit ? $user->email : '' }}">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="username">@lang('Username')</label>
|
||||
<input type="text"
|
||||
class="form-control input-solid"
|
||||
id="username"
|
||||
placeholder="(@lang('optional'))"
|
||||
name="username"
|
||||
value="{{ $edit ? $user->username : '' }}">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="password">{{ $edit ? __("New Password") : __('Password') }}</label>
|
||||
<input type="password"
|
||||
class="form-control input-solid"
|
||||
id="password"
|
||||
name="password"
|
||||
@if ($edit) placeholder="@lang("Leave field blank if you don't want to change it")" @endif>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="password_confirmation">{{ $edit ? __("Confirm New Password") : __('Confirm Password') }}</label>
|
||||
<input type="password"
|
||||
class="form-control input-solid"
|
||||
id="password_confirmation"
|
||||
name="password_confirmation"
|
||||
@if ($edit) placeholder="@lang("Leave field blank if you don't want to change it")" @endif>
|
||||
</div>
|
||||
|
||||
@if ($edit)
|
||||
<button type="submit" class="btn btn-primary mt-2" id="update-login-details-btn">
|
||||
<i class="fa fa-refresh"></i>
|
||||
@lang('Update Details')
|
||||
</button>
|
||||
@endif
|
||||
@@ -0,0 +1,92 @@
|
||||
<div class="avatar-wrapper">
|
||||
<div class="spinner">
|
||||
<div class="spinner-dot"></div>
|
||||
<div class="spinner-dot"></div>
|
||||
<div class="spinner-dot"></div>
|
||||
</div>
|
||||
<div id="avatar"></div>
|
||||
<div class="text-center">
|
||||
<div class="avatar-preview">
|
||||
<img class="avatar rounded-circle img-thumbnail img-responsive mt-5 mb-4"
|
||||
width="150"
|
||||
src="{{ $edit ? $user->present()->avatar : url('assets/img/profile.png') }}">
|
||||
|
||||
<h5 class="text-muted">{{ $user->present()->nameOrEmail }}</h5>
|
||||
</div>
|
||||
|
||||
<div id="change-picture"
|
||||
class="btn btn-outline-secondary btn-block mt-5"
|
||||
data-toggle="modal"
|
||||
data-target="#choose-modal">
|
||||
<i class="fa fa-camera"></i>
|
||||
@lang('Change Photo')
|
||||
</div>
|
||||
|
||||
<div class="row avatar-controls d-none">
|
||||
<div class="col-md-6">
|
||||
<div id="cancel-upload" class="btn btn-block btn-outline-secondary text-center">
|
||||
<i class="fa fa-times"></i> @lang('Cancel')
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<button type="submit" id="save-photo" class="btn btn-success btn-block text-center">
|
||||
<i class="fa fa-check"></i> @lang('Save')
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="modal fade" id="choose-modal">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-body">
|
||||
<div class="row">
|
||||
<div class="col-md-4 avatar-source" id="no-photo"
|
||||
data-url="{{ $updateUrl }}">
|
||||
<img src="{{ url('assets/img/profile.png') }}" class="rounded-circle img-thumbnail img-responsive">
|
||||
<p class="mt-3">@lang('No Photo')</p>
|
||||
</div>
|
||||
<div class="col-md-4 avatar-source">
|
||||
<div class="btn btn-light btn-upload">
|
||||
<i class="fa fa-upload"></i>
|
||||
<input type="file" name="avatar" id="avatar-upload">
|
||||
</div>
|
||||
<p class="mt-3">@lang('Upload Photo')</p>
|
||||
</div>
|
||||
@if ($edit)
|
||||
<div class="col-md-4 avatar-source source-external"
|
||||
data-url="{{ $updateUrl }}">
|
||||
<img src="{{ $user->gravatar() }}" class="rounded-circle img-thumbnail img-responsive">
|
||||
<p class="mt-3">@lang('Gravatar')</p>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
@if ($edit && count($socialLogins))
|
||||
@foreach ($socialLogins->chunk(3) as $logins)
|
||||
<br>
|
||||
<div class="row">
|
||||
@foreach($logins as $login)
|
||||
<div class="col-md-4 avatar-source source-external"
|
||||
data-url="{{ $updateUrl }}">
|
||||
<img src="{{ $login->avatar }}"
|
||||
class="rounded-circle img-thumbnail img-responsive"
|
||||
style="width: 120px;">
|
||||
<p>{{ ucfirst($login->provider) }}</p>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
@endforeach
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="d-none">
|
||||
<input type="hidden" name="points[x1]" id="points_x1">
|
||||
<input type="hidden" name="points[y1]" id="points_y1">
|
||||
<input type="hidden" name="points[x2]" id="points_x2">
|
||||
<input type="hidden" name="points[y2]" id="points_y2">
|
||||
</div>
|
||||
@@ -0,0 +1,76 @@
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div class="form-group">
|
||||
<label for="role_id">@lang('Role')</label>
|
||||
<select name="role_id" id="role_id" class="form-control input-solid" {{ $profile ? 'disabled' : '' }}>
|
||||
@foreach($roles as $roleId => $roleName)
|
||||
<option value="{{ $roleId }}" {{ ($edit && $user->role->id == $roleId) ? 'selected' : '' }}>
|
||||
{{ $roleName }}
|
||||
</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="status">@lang('Status')</label>
|
||||
<select name="status" id="status" class="form-control input-solid" {{ $profile ? 'disabled' : '' }}>
|
||||
@foreach($statuses as $statusId => $statusName)
|
||||
<option value="{{ $statusId }}" {{ ($edit && $user->status->value == $statusId) ? 'selected' : '' }}>
|
||||
{{ $statusName }}
|
||||
</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="first_name">@lang('First Name')</label>
|
||||
<input type="text" class="form-control input-solid" id="first_name"
|
||||
name="first_name" placeholder="@lang('First Name')" value="{{ $edit ? $user->first_name : '' }}">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="last_name">@lang('Last Name')</label>
|
||||
<input type="text" class="form-control input-solid" id="last_name"
|
||||
name="last_name" placeholder="@lang('Last Name')" value="{{ $edit ? $user->last_name : '' }}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
<div class="form-group">
|
||||
<label for="birthday">@lang('Date of Birth')</label>
|
||||
<div class="form-group">
|
||||
<input type="text"
|
||||
name="birthday"
|
||||
id='birthday'
|
||||
value="{{ $edit && $user->birthday ? $user->present()->birthday : '' }}"
|
||||
class="form-control input-solid" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="phone">@lang('Phone')</label>
|
||||
<input type="text" class="form-control input-solid" id="phone"
|
||||
name="phone" placeholder="@lang('Phone')" value="{{ $edit ? $user->phone : '' }}">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="address">@lang('Address')</label>
|
||||
<input type="text" class="form-control input-solid" id="address"
|
||||
name="address" placeholder="@lang('Address')" value="{{ $edit ? $user->address : '' }}">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="country_id">@lang('Country')</label>
|
||||
<select name="country_id" id="country_id" class="form-control input-solid">
|
||||
@foreach($countries as $countryId => $countryName)
|
||||
<option value="{{ $countryId }}" {{ ($edit && $user->country_id == $countryId) ? 'selected' : '' }}>
|
||||
{{ $countryName }}
|
||||
</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@if ($edit)
|
||||
<div class="col-md-12 mt-2">
|
||||
<button type="submit" class="btn btn-primary" id="update-details-btn">
|
||||
<i class="fa fa-refresh"></i>
|
||||
@lang('Update Details')
|
||||
</button>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
@@ -0,0 +1,73 @@
|
||||
<tr>
|
||||
<td style="width: 40px;">
|
||||
<a href="{{ route('users.show', $user) }}">
|
||||
<img
|
||||
class="rounded-circle img-responsive"
|
||||
width="40"
|
||||
src="{{ $user->present()->avatar }}"
|
||||
alt="{{ $user->present()->name }}">
|
||||
</a>
|
||||
</td>
|
||||
<td class="align-middle">
|
||||
<a href="{{ route('users.show', $user) }}">
|
||||
{{ $user->username ?: __('N/A') }}
|
||||
</a>
|
||||
</td>
|
||||
<td class="align-middle">{{ $user->first_name . ' ' . $user->last_name }}</td>
|
||||
<td class="align-middle">{{ $user->email }}</td>
|
||||
<td class="align-middle">{{ $user->created_at->format(config('app.date_format')) }}</td>
|
||||
<td class="align-middle">
|
||||
<span class="badge badge-lg badge-{{ $user->present()->labelClass }}">
|
||||
{{ trans("app.status.{$user->status->value}") }}
|
||||
</span>
|
||||
</td>
|
||||
<td class="text-center align-middle">
|
||||
<div class="dropdown show d-inline-block">
|
||||
<a class="btn btn-icon"
|
||||
href="#" role="button" id="dropdownMenuLink"
|
||||
data-toggle="dropdown"
|
||||
aria-haspopup="true" aria-expanded="false">
|
||||
<i class="fas fa-ellipsis-h"></i>
|
||||
</a>
|
||||
|
||||
<div class="dropdown-menu dropdown-menu-right" aria-labelledby="dropdownMenuLink">
|
||||
@if (config('session.driver') == 'database')
|
||||
<a href="{{ route('user.sessions', $user) }}" class="dropdown-item text-gray-500">
|
||||
<i class="fas fa-list mr-2"></i>
|
||||
@lang('User Sessions')
|
||||
</a>
|
||||
@endif
|
||||
<a href="{{ route('users.show', $user) }}" class="dropdown-item text-gray-500">
|
||||
<i class="fas fa-eye mr-2"></i>
|
||||
@lang('View User')
|
||||
</a>
|
||||
|
||||
@canBeImpersonated($user)
|
||||
<a href="{{ route('impersonate', $user) }}" class="dropdown-item text-gray-500 impersonate">
|
||||
<i class="fas fa-user-secret mr-2"></i>
|
||||
@lang('Impersonate')
|
||||
</a>
|
||||
@endCanBeImpersonated
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<a href="{{ route('users.edit', $user) }}"
|
||||
class="btn btn-icon edit"
|
||||
title="@lang('Edit User')"
|
||||
data-toggle="tooltip" data-placement="top">
|
||||
<i class="fas fa-edit"></i>
|
||||
</a>
|
||||
|
||||
<a href="{{ route('users.destroy', $user) }}"
|
||||
class="btn btn-icon"
|
||||
title="@lang('Delete User')"
|
||||
data-toggle="tooltip"
|
||||
data-placement="top"
|
||||
data-method="DELETE"
|
||||
data-confirm-title="@lang('Please Confirm')"
|
||||
data-confirm-text="@lang('Are you sure that you want to delete this user?')"
|
||||
data-confirm-delete="@lang('Yes, delete him!')">
|
||||
<i class="fas fa-trash"></i>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -0,0 +1,62 @@
|
||||
@php
|
||||
$route = 'enable';
|
||||
$needsVerification = session('tab') == '2fa' && $user->needsTwoFactorVerification();
|
||||
|
||||
if ($needsVerification) {
|
||||
$route = 'verify';
|
||||
} elseif ($user->twoFactorEnabled()) {
|
||||
$route = 'disable';
|
||||
}
|
||||
@endphp
|
||||
|
||||
<form action="{{ route("two-factor.{$route}") }}" method="POST" id="two-factor-form">
|
||||
@csrf
|
||||
<input type="hidden" name="user" value="{{ $user->id }}">
|
||||
@if (!$user->twoFactorEnabled() && !$needsVerification)
|
||||
<button type="submit"
|
||||
class="btn btn-primary"
|
||||
data-toggle="loader"
|
||||
data-loading-text="@lang('Enabling...')">
|
||||
@lang('Enable')
|
||||
</button>
|
||||
@else
|
||||
@if ($user->twoFactorEnabled())
|
||||
<button type="submit"
|
||||
class="btn btn-danger mt-2"
|
||||
data-toggle="loader"
|
||||
data-loading-text="@lang('Disabling...')">
|
||||
<i class="fa fa-close"></i>
|
||||
@lang('Disable')
|
||||
</button>
|
||||
@else
|
||||
<h3>@lang("Please finish configuring Two-Factor authentication below.")</h3>
|
||||
<div class="my-3 font-medium text-sm font-weight-bold">
|
||||
@lang("When two factor authentication is enabled, you will be prompted for a secure, random token during authentication.")
|
||||
@lang("You may retrieve this token from your phone's Authenticator application.")
|
||||
</div>
|
||||
|
||||
<div class="my-3 font-medium text-sm">
|
||||
@lang("To finish enabling two factor authentication, scan the following QR code using your phone's authenticator application or enter the setup key and provide the generated OTP code.")
|
||||
</div>
|
||||
|
||||
<div class="my-5 d-flex align-items-center justify-content-center w-100">
|
||||
{!! $user->twoFactorQrCodeSvg() !!}
|
||||
</div>
|
||||
|
||||
<input type="text"
|
||||
name="code"
|
||||
id="code"
|
||||
class="form-control input-solid mb-4"
|
||||
placeholder="@lang('Code')"
|
||||
value="{{ old('code') }}">
|
||||
|
||||
<button type="submit"
|
||||
class="btn btn-primary mr-2"
|
||||
data-toggle="loader"
|
||||
data-loading-text="@lang('Confirming...')">
|
||||
<i class="fa fa-close"></i>
|
||||
@lang('Confirm')
|
||||
</button>
|
||||
@endif
|
||||
@endif
|
||||
</form>
|
||||
@@ -0,0 +1,128 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('page-title', __('My Profile'))
|
||||
@section('page-heading', __('My Profile'))
|
||||
|
||||
@section('breadcrumbs')
|
||||
<li class="breadcrumb-item active">
|
||||
@lang('My Profile')
|
||||
</li>
|
||||
@stop
|
||||
|
||||
@section('content')
|
||||
|
||||
@include('partials.messages')
|
||||
|
||||
@php
|
||||
$activeTab = session('tab') ?? 'details';
|
||||
@endphp
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-8">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<ul class="nav nav-tabs" id="nav-tab" role="tablist">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link {{ $activeTab == 'details' ? 'active' : '' }}"
|
||||
id="details-tab"
|
||||
data-toggle="tab"
|
||||
href="#details"
|
||||
role="tab"
|
||||
aria-controls="home"
|
||||
aria-selected="true">
|
||||
@lang('User Details')
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link"
|
||||
id="authentication-tab"
|
||||
data-toggle="tab"
|
||||
href="#login-details"
|
||||
role="tab"
|
||||
aria-controls="home"
|
||||
aria-selected="true">
|
||||
@lang('Login Details')
|
||||
</a>
|
||||
</li>
|
||||
@if (setting('2fa.enabled'))
|
||||
<li class="nav-item">
|
||||
<a class="nav-link {{ $activeTab == '2fa' ? 'active' : '' }}"
|
||||
id="authentication-tab"
|
||||
data-toggle="tab"
|
||||
href="#2fa"
|
||||
role="tab"
|
||||
aria-controls="home"
|
||||
aria-selected="true">
|
||||
@lang('Two-Factor Authentication')
|
||||
</a>
|
||||
</li>
|
||||
@endif
|
||||
</ul>
|
||||
|
||||
<div class="tab-content mt-4" id="nav-tabContent">
|
||||
<div class="tab-pane {{ $activeTab == 'details' ? 'show active' : '' }} fade px-2"
|
||||
id="details"
|
||||
role="tabpanel"
|
||||
aria-labelledby="nav-home-tab">
|
||||
<form action="{{ route('profile.update.details') }}" method="POST" id="details-form">
|
||||
@method('PUT')
|
||||
@csrf
|
||||
@include('user.partials.details', ['profile' => true])
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div class="tab-pane fade px-2"
|
||||
id="login-details"
|
||||
role="tabpanel"
|
||||
aria-labelledby="nav-profile-tab">
|
||||
<form action="{{ route('profile.update.login-details') }}"
|
||||
method="POST"
|
||||
id="login-details-form">
|
||||
@method('PUT')
|
||||
@csrf
|
||||
@include('user.partials.auth')
|
||||
</form>
|
||||
</div>
|
||||
|
||||
@if (setting('2fa.enabled'))
|
||||
<div class="tab-pane {{ $activeTab == '2fa' ? 'show active' : '' }} fade px-2"
|
||||
id="2fa"
|
||||
role="tabpanel"
|
||||
aria-labelledby="nav-profile-tab"
|
||||
>
|
||||
@include('user.partials.two-factor')
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-4">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<form action="{{ route("profile.update.avatar") }}"
|
||||
method="POST"
|
||||
id="avatar-form"
|
||||
enctype="multipart/form-data">
|
||||
@csrf
|
||||
@include('user.partials.avatar', ['updateUrl' => route('profile.update.avatar-external')])
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@stop
|
||||
|
||||
@section('scripts')
|
||||
<script src="{{ asset('assets/js/as/btn.js') }}"></script>
|
||||
<script src="{{ asset('assets/js/as/profile.js') }}"></script>
|
||||
{!! JsValidator::formRequest('Vanguard\Http\Requests\User\UpdateDetailsRequest', '#details-form') !!}
|
||||
{!! JsValidator::formRequest('Vanguard\Http\Requests\User\UpdateProfileLoginDetailsRequest', '#login-details-form') !!}
|
||||
|
||||
@if (setting('2fa.enabled'))
|
||||
{!! JsValidator::formRequest('Vanguard\Http\Requests\TwoFactor\EnableTwoFactorRequest', '#two-factor-form') !!}
|
||||
@endif
|
||||
@stop
|
||||
@@ -0,0 +1,80 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('page-title', $user->present()->nameOrEmail . ' - ' . __('Active Sessions'))
|
||||
|
||||
@section('page-heading')
|
||||
@lang('Sessions') ({{ $user->present()->nameOrEmail }})
|
||||
@stop
|
||||
|
||||
@section('breadcrumbs')
|
||||
@if (isset($adminView))
|
||||
<li class="breadcrumb-item">
|
||||
<a href="{{ route('users.index') }}">@lang('Users')</a>
|
||||
</li>
|
||||
|
||||
<li class="breadcrumb-item">
|
||||
<a href="{{ route('users.show', $user->id) }}">
|
||||
{{ $user->present()->nameOrEmail }}
|
||||
</a>
|
||||
</li>
|
||||
@endif
|
||||
|
||||
<li class="breadcrumb-item active">
|
||||
@lang('Sessions')
|
||||
</li>
|
||||
@stop
|
||||
|
||||
@section('content')
|
||||
|
||||
@include('partials.messages')
|
||||
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-borderless table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>@lang('IP Address')</th>
|
||||
<th>@lang('Device')</th>
|
||||
<th>@lang('Browser')</th>
|
||||
<th>@lang('Last Activity')</th>
|
||||
<th class="text-center">@lang('Action')</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@if (count($sessions))
|
||||
@foreach ($sessions as $session)
|
||||
<tr>
|
||||
<td>{{ $session->ip_address }}</td>
|
||||
<td>
|
||||
{{ $session->device ?: __('Unknown') }} ({{ $session->platform ?: __('Unknown') }})
|
||||
</td>
|
||||
<td>{{ $session->browser ?: __('Unknown') }}</td>
|
||||
<td>{{ $session->last_activity->format(config('app.date_time_format')) }}</td>
|
||||
<td class="text-center">
|
||||
<a href="{{ isset($profile) ? route('profile.sessions.invalidate', $session->id) : route('user.sessions.invalidate', [$user->id, $session->id]) }}"
|
||||
class="btn btn-icon"
|
||||
title="@lang('Invalidate Session')"
|
||||
data-toggle="tooltip"
|
||||
data-placement="top"
|
||||
data-method="DELETE"
|
||||
data-confirm-title="@lang('Please Confirm')"
|
||||
data-confirm-text="@lang('Are you sure that you want to invalidate this session?')"
|
||||
data-confirm-delete="@lang('Yes, proceed!')">
|
||||
<i class="fas fa-times"></i>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
@else
|
||||
<tr>
|
||||
<td colspan="6"><em>@lang('No records found.')</em></td>
|
||||
</tr>
|
||||
@endif
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@stop
|
||||
@@ -0,0 +1,73 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('page-title', __('My Profile'))
|
||||
@section('page-heading', __('My Profile'))
|
||||
|
||||
@section('breadcrumbs')
|
||||
<li class="breadcrumb-item">
|
||||
@lang('My Profile')
|
||||
</li>
|
||||
|
||||
<li class="breadcrumb-item active">
|
||||
@lang('Two-Factor Phone Verification')
|
||||
</li>
|
||||
@stop
|
||||
|
||||
@section('content')
|
||||
|
||||
@include('partials.messages')
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6 m-auto">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title card-title-bold">
|
||||
@lang('Phone Verification')
|
||||
</h5>
|
||||
|
||||
<p>
|
||||
@lang('We have sent you a verification token via SMS. Please provide the token
|
||||
below to verify your phone number.')
|
||||
</p>
|
||||
|
||||
<form action="{{ route('two-factor.verify') }}" method="POST" id="two-factor-form">
|
||||
@csrf
|
||||
@if ($user)
|
||||
<input type="hidden" name="user" value="{{ $user }}">
|
||||
@endif
|
||||
<div class="form-group mt-4">
|
||||
<input type="text"
|
||||
class="form-control"
|
||||
id="token"
|
||||
name="token"
|
||||
placeholder="@lang('Token')">
|
||||
</div>
|
||||
<div class="mt-3">
|
||||
<button type="submit"
|
||||
class="btn btn-primary"
|
||||
data-toggle="loader"
|
||||
data-loading-text="@lang('Verifying...')">
|
||||
@lang('Verify')
|
||||
</button>
|
||||
<a href="javascript:;"
|
||||
class="btn d-none"
|
||||
id="resend-token"
|
||||
data-loading-text="@lang('Sending...')">
|
||||
@lang('Resend Token')
|
||||
</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@stop
|
||||
|
||||
@section('scripts')
|
||||
<script>
|
||||
var user = {{ isset($user) ? $user : 'null' }};
|
||||
</script>
|
||||
<script src="{{ asset('assets/js/as/btn.js') }}"></script>
|
||||
<script src="{{ asset('assets/js/as/two-factor.js') }}"></script>
|
||||
@stop
|
||||
@@ -0,0 +1,90 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('page-title', $user->present()->nameOrEmail)
|
||||
@section('page-heading', $user->present()->nameOrEmail)
|
||||
|
||||
@section('breadcrumbs')
|
||||
<li class="breadcrumb-item">
|
||||
<a href="{{ route('users.index') }}">@lang('Users')</a>
|
||||
</li>
|
||||
<li class="breadcrumb-item active">
|
||||
{{ $user->present()->nameOrEmail }}
|
||||
</li>
|
||||
@stop
|
||||
|
||||
@section('content')
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-5 col-xl-4 @if (! isset($activities)) mx-auto @endif">
|
||||
<div class="card">
|
||||
<h6 class="card-header d-flex align-items-center justify-content-between">
|
||||
@lang('Details')
|
||||
|
||||
<small>
|
||||
@canBeImpersonated($user)
|
||||
<a href="{{ route('impersonate', $user) }}"
|
||||
data-toggle="tooltip"
|
||||
data-placement="top"
|
||||
title="@lang('Impersonate User')">
|
||||
@lang('Impersonate')
|
||||
</a>
|
||||
<span class="text-muted">|</span>
|
||||
@endCanBeImpersonated
|
||||
|
||||
<a href="{{ route('users.edit', $user) }}"
|
||||
class="edit"
|
||||
data-toggle="tooltip"
|
||||
data-placement="top"
|
||||
title="@lang('Edit User')">
|
||||
@lang('Edit')
|
||||
</a>
|
||||
</small>
|
||||
</h6>
|
||||
<div class="card-body">
|
||||
<div class="d-flex align-items-center flex-column pt-3">
|
||||
<div>
|
||||
<img class="rounded-circle img-thumbnail img-responsive mb-4"
|
||||
width="130"
|
||||
height="130" src="{{ $user->present()->avatar }}">
|
||||
</div>
|
||||
|
||||
@if ($name = $user->present()->name)
|
||||
<h5>{{ $user->present()->name }}</h5>
|
||||
@endif
|
||||
|
||||
<a href="mailto:{{ $user->email }}" class="text-muted font-weight-light mb-2">
|
||||
{{ $user->email }}
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<ul class="list-group list-group-flush mt-3">
|
||||
@if ($user->phone)
|
||||
<li class="list-group-item">
|
||||
<strong>@lang('Phone'):</strong>
|
||||
<a href="telto:{{ $user->phone }}">{{ $user->phone }}</a>
|
||||
</li>
|
||||
@endif
|
||||
<li class="list-group-item">
|
||||
<strong>@lang('Birthday'):</strong>
|
||||
{{ $user->present()->birthday }}
|
||||
</li>
|
||||
<li class="list-group-item">
|
||||
<strong>@lang('Address'):</strong>
|
||||
{{ $user->present()->fullAddress }}
|
||||
</li>
|
||||
<li class="list-group-item">
|
||||
<strong>@lang('Last Logged In'):</strong>
|
||||
{{ $user->present()->lastLogin }}
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@if (isset($activities))
|
||||
<div class="col-lg-7 col-xl-8">
|
||||
@include("user-activity::recent-activity", ['activities' => $activities])
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
@stop
|
||||
Vendored
@@ -0,0 +1,54 @@
|
||||
<script>
|
||||
jQuery(document).ready(function(){
|
||||
|
||||
$("<?php echo $validator['selector']; ?>").validate({
|
||||
errorElement: 'span',
|
||||
errorClass: 'invalid-feedback',
|
||||
|
||||
errorPlacement: function(error, element) {
|
||||
if (element.parent('.input-group').length ||
|
||||
element.prop('type') === 'checkbox' || element.prop('type') === 'radio') {
|
||||
error.insertAfter(element.parent());
|
||||
// else just place the validation message immediately after the input
|
||||
} else {
|
||||
error.insertAfter(element);
|
||||
}
|
||||
},
|
||||
|
||||
highlight: function(element) {
|
||||
$(element).closest('.form-group input').removeClass('is-valid').addClass('is-invalid');
|
||||
},
|
||||
|
||||
<?php if (isset($validator['ignore']) && is_string($validator['ignore'])) : ?>
|
||||
ignore: "<?php echo $validator['ignore']; ?>",
|
||||
<?php endif; ?>
|
||||
|
||||
|
||||
// Uncomment this to mark as validated non required fields
|
||||
unhighlight: function(element) {
|
||||
$(element).closest('.form-group input').removeClass('is-invalid');
|
||||
},
|
||||
|
||||
success: function(element) {
|
||||
$(element).closest('.form-group input').removeClass('is-invalid').addClass('is-valid');
|
||||
},
|
||||
|
||||
focusInvalid: false, // do not focus the last invalid input
|
||||
<?php if (Config::get('jsvalidation.focus_on_error')) : ?>
|
||||
invalidHandler: function(form, validator) {
|
||||
|
||||
if (!validator.numberOfInvalids())
|
||||
return;
|
||||
|
||||
$('html, body').animate({
|
||||
scrollTop: $(validator.errorList[0].element).offset().top
|
||||
}, <?php echo Config::get('jsvalidation.duration_animate') ?>);
|
||||
$(validator.errorList[0].element).focus();
|
||||
|
||||
},
|
||||
<?php endif; ?>
|
||||
|
||||
rules: <?php echo json_encode($validator['rules']); ?>
|
||||
})
|
||||
})
|
||||
</script>
|
||||
@@ -0,0 +1,19 @@
|
||||
<table class="action" align="center" width="100%" cellpadding="0" cellspacing="0" role="presentation">
|
||||
<tr>
|
||||
<td align="center">
|
||||
<table width="100%" border="0" cellpadding="0" cellspacing="0" role="presentation">
|
||||
<tr>
|
||||
<td align="center">
|
||||
<table border="0" cellpadding="0" cellspacing="0" role="presentation">
|
||||
<tr>
|
||||
<td>
|
||||
<a href="{{ $url }}" class="button button-{{ $color ?? 'brand' }}" target="_blank">{{ $slot }}</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
@@ -0,0 +1,11 @@
|
||||
<tr>
|
||||
<td>
|
||||
<table class="footer" align="center" width="570" cellpadding="0" cellspacing="0" role="presentation">
|
||||
<tr>
|
||||
<td class="content-cell" align="center">
|
||||
{{ Illuminate\Mail\Markdown::parse($slot) }}
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -0,0 +1,7 @@
|
||||
<tr>
|
||||
<td class="header">
|
||||
<a href="{{ $url }}">
|
||||
{{ $slot }}
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -0,0 +1,54 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
</head>
|
||||
<body>
|
||||
<style>
|
||||
@media only screen and (max-width: 600px) {
|
||||
.inner-body {
|
||||
width: 100% !important;
|
||||
}
|
||||
|
||||
.footer {
|
||||
width: 100% !important;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 500px) {
|
||||
.button {
|
||||
width: 100% !important;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
<table class="wrapper" width="100%" cellpadding="0" cellspacing="0" role="presentation">
|
||||
<tr>
|
||||
<td align="center">
|
||||
<table class="content" width="100%" cellpadding="0" cellspacing="0" role="presentation">
|
||||
{{ $header ?? '' }}
|
||||
|
||||
<!-- Email Body -->
|
||||
<tr>
|
||||
<td class="body" width="100%" cellpadding="0" cellspacing="0">
|
||||
<table class="inner-body" align="center" width="570" cellpadding="0" cellspacing="0" role="presentation">
|
||||
<!-- Body content -->
|
||||
<tr>
|
||||
<td class="content-cell">
|
||||
{{ Illuminate\Mail\Markdown::parse($slot) }}
|
||||
|
||||
{{ $subcopy ?? '' }}
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
{{ $footer ?? '' }}
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,27 @@
|
||||
@component('mail::layout')
|
||||
{{-- Header --}}
|
||||
@slot('header')
|
||||
@component('mail::header', ['url' => config('app.url')])
|
||||
<x-logo />
|
||||
@endcomponent
|
||||
@endslot
|
||||
|
||||
{{-- Body --}}
|
||||
{{ $slot }}
|
||||
|
||||
{{-- Subcopy --}}
|
||||
@isset($subcopy)
|
||||
@slot('subcopy')
|
||||
@component('mail::subcopy')
|
||||
{{ $subcopy }}
|
||||
@endcomponent
|
||||
@endslot
|
||||
@endisset
|
||||
|
||||
{{-- Footer --}}
|
||||
@slot('footer')
|
||||
@component('mail::footer')
|
||||
© {{ date('Y') }} {{ config('app.name') }}. @lang('All rights reserved.')
|
||||
@endcomponent
|
||||
@endslot
|
||||
@endcomponent
|
||||
@@ -0,0 +1,13 @@
|
||||
<table class="panel" width="100%" cellpadding="0" cellspacing="0" role="presentation">
|
||||
<tr>
|
||||
<td class="panel-content">
|
||||
<table width="100%" cellpadding="0" cellspacing="0" role="presentation">
|
||||
<tr>
|
||||
<td class="panel-item">
|
||||
{{ Illuminate\Mail\Markdown::parse($slot) }}
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
@@ -0,0 +1,7 @@
|
||||
<table class="promotion" align="center" width="100%" cellpadding="0" cellspacing="0" role="presentation">
|
||||
<tr>
|
||||
<td align="center">
|
||||
{{ Illuminate\Mail\Markdown::parse($slot) }}
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
@@ -0,0 +1,13 @@
|
||||
<table width="100%" border="0" cellpadding="0" cellspacing="0" role="presentation">
|
||||
<tr>
|
||||
<td align="center">
|
||||
<table border="0" cellpadding="0" cellspacing="0" role="presentation">
|
||||
<tr>
|
||||
<td>
|
||||
<a href="{{ $url }}" class="button button-green" target="_blank">{{ $slot }}</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
@@ -0,0 +1,7 @@
|
||||
<table class="subcopy" width="100%" cellpadding="0" cellspacing="0" role="presentation">
|
||||
<tr>
|
||||
<td>
|
||||
{{ Illuminate\Mail\Markdown::parse($slot) }}
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
@@ -0,0 +1,3 @@
|
||||
<div class="table">
|
||||
{{ Illuminate\Mail\Markdown::parse($slot) }}
|
||||
</div>
|
||||
+307
@@ -0,0 +1,307 @@
|
||||
/* Base */
|
||||
|
||||
body,
|
||||
body *:not(html):not(style):not(br):not(tr):not(code) {
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif,
|
||||
'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body {
|
||||
background-color: #f8fafc;
|
||||
color: #74787e;
|
||||
height: 100%;
|
||||
hyphens: auto;
|
||||
line-height: 1.4;
|
||||
margin: 0;
|
||||
-moz-hyphens: auto;
|
||||
-ms-word-break: break-all;
|
||||
width: 100% !important;
|
||||
-webkit-hyphens: auto;
|
||||
-webkit-text-size-adjust: none;
|
||||
word-break: break-all;
|
||||
word-break: break-word;
|
||||
}
|
||||
|
||||
p,
|
||||
ul,
|
||||
ol,
|
||||
blockquote {
|
||||
line-height: 1.4;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #3869d4;
|
||||
}
|
||||
|
||||
a img {
|
||||
border: none;
|
||||
}
|
||||
|
||||
/* Typography */
|
||||
|
||||
h1 {
|
||||
color: #3d4852;
|
||||
font-size: 19px;
|
||||
font-weight: bold;
|
||||
margin-top: 0;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
h2 {
|
||||
color: #3d4852;
|
||||
font-size: 16px;
|
||||
font-weight: bold;
|
||||
margin-top: 0;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
h3 {
|
||||
color: #3d4852;
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
margin-top: 0;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
p {
|
||||
color: #3d4852;
|
||||
font-size: 16px;
|
||||
line-height: 1.5em;
|
||||
margin-top: 0;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
p.sub {
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
img {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
/* Layout */
|
||||
|
||||
.wrapper {
|
||||
background-color: #f8fafc;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
width: 100%;
|
||||
-premailer-cellpadding: 0;
|
||||
-premailer-cellspacing: 0;
|
||||
-premailer-width: 100%;
|
||||
}
|
||||
|
||||
.content {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
width: 100%;
|
||||
-premailer-cellpadding: 0;
|
||||
-premailer-cellspacing: 0;
|
||||
-premailer-width: 100%;
|
||||
}
|
||||
|
||||
/* Header */
|
||||
|
||||
.header {
|
||||
padding: 25px 0;
|
||||
text-align: center;
|
||||
border-top: 5px solid #1c8966;
|
||||
}
|
||||
|
||||
.header a {
|
||||
color: #bbbfc3;
|
||||
font-size: 19px;
|
||||
font-weight: bold;
|
||||
text-decoration: none;
|
||||
text-shadow: 0 1px 0 white;
|
||||
}
|
||||
|
||||
/* Body */
|
||||
|
||||
.body {
|
||||
background-color: #ffffff;
|
||||
border-bottom: 1px solid #edeff2;
|
||||
border-top: 1px solid #edeff2;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
width: 100%;
|
||||
-premailer-cellpadding: 0;
|
||||
-premailer-cellspacing: 0;
|
||||
-premailer-width: 100%;
|
||||
}
|
||||
|
||||
.inner-body {
|
||||
background-color: #ffffff;
|
||||
margin: 0 auto;
|
||||
padding: 0;
|
||||
width: 570px;
|
||||
-premailer-cellpadding: 0;
|
||||
-premailer-cellspacing: 0;
|
||||
-premailer-width: 570px;
|
||||
}
|
||||
|
||||
/* Subcopy */
|
||||
|
||||
.subcopy {
|
||||
border-top: 1px solid #edeff2;
|
||||
margin-top: 25px;
|
||||
padding-top: 25px;
|
||||
}
|
||||
|
||||
.subcopy p {
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
/* Footer */
|
||||
|
||||
.footer {
|
||||
margin: 0 auto;
|
||||
padding: 0;
|
||||
text-align: center;
|
||||
width: 570px;
|
||||
-premailer-cellpadding: 0;
|
||||
-premailer-cellspacing: 0;
|
||||
-premailer-width: 570px;
|
||||
}
|
||||
|
||||
.footer p {
|
||||
color: #aeaeae;
|
||||
font-size: 12px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/* Tables */
|
||||
|
||||
.table table {
|
||||
margin: 30px auto;
|
||||
width: 100%;
|
||||
-premailer-cellpadding: 0;
|
||||
-premailer-cellspacing: 0;
|
||||
-premailer-width: 100%;
|
||||
}
|
||||
|
||||
.table th {
|
||||
border-bottom: 1px solid #edeff2;
|
||||
padding-bottom: 8px;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.table td {
|
||||
color: #74787e;
|
||||
font-size: 15px;
|
||||
line-height: 18px;
|
||||
padding: 10px 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.content-cell {
|
||||
padding: 35px;
|
||||
}
|
||||
|
||||
/* Buttons */
|
||||
|
||||
.action {
|
||||
margin: 30px auto;
|
||||
padding: 0;
|
||||
text-align: center;
|
||||
width: 100%;
|
||||
-premailer-cellpadding: 0;
|
||||
-premailer-cellspacing: 0;
|
||||
-premailer-width: 100%;
|
||||
}
|
||||
|
||||
.button {
|
||||
border-radius: 3px;
|
||||
box-shadow: 0 2px 3px rgba(0, 0, 0, 0.16);
|
||||
color: #fff;
|
||||
display: inline-block;
|
||||
text-decoration: none;
|
||||
-webkit-text-size-adjust: none;
|
||||
}
|
||||
|
||||
.button-blue,
|
||||
.button-primary {
|
||||
background-color: #3490dc;
|
||||
border-top: 10px solid #3490dc;
|
||||
border-right: 18px solid #3490dc;
|
||||
border-bottom: 10px solid #3490dc;
|
||||
border-left: 18px solid #3490dc;
|
||||
}
|
||||
|
||||
.button-green,
|
||||
.button-success {
|
||||
background-color: #38c172;
|
||||
border-top: 10px solid #38c172;
|
||||
border-right: 18px solid #38c172;
|
||||
border-bottom: 10px solid #38c172;
|
||||
border-left: 18px solid #38c172;
|
||||
}
|
||||
|
||||
.button-red,
|
||||
.button-error {
|
||||
background-color: #e3342f;
|
||||
border-top: 10px solid #e3342f;
|
||||
border-right: 18px solid #e3342f;
|
||||
border-bottom: 10px solid #e3342f;
|
||||
border-left: 18px solid #e3342f;
|
||||
}
|
||||
|
||||
.button-brand {
|
||||
background-color: #1c8966;
|
||||
border-top: 10px solid #1c8966;
|
||||
border-right: 18px solid #1c8966;
|
||||
border-bottom: 10px solid #1c8966;
|
||||
border-left: 18px solid #1c8966;
|
||||
}
|
||||
|
||||
/* Panels */
|
||||
|
||||
.panel {
|
||||
margin: 0 0 21px;
|
||||
}
|
||||
|
||||
.panel-content {
|
||||
background-color: #f1f5f8;
|
||||
padding: 16px;
|
||||
}
|
||||
|
||||
.panel-item {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.panel-item p:last-of-type {
|
||||
margin-bottom: 0;
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
/* Promotions */
|
||||
|
||||
.promotion {
|
||||
background-color: #ffffff;
|
||||
border: 2px dashed #9ba2ab;
|
||||
margin: 0;
|
||||
margin-bottom: 25px;
|
||||
margin-top: 25px;
|
||||
padding: 24px;
|
||||
width: 100%;
|
||||
-premailer-cellpadding: 0;
|
||||
-premailer-cellspacing: 0;
|
||||
-premailer-width: 100%;
|
||||
}
|
||||
|
||||
.promotion h1 {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.promotion p {
|
||||
font-size: 15px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
code {
|
||||
background: rgba(0,0,0,.05);
|
||||
padding: 2px 4px;
|
||||
border-radius: 2px;
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
{{ $slot }}: {{ $url }}
|
||||
@@ -0,0 +1 @@
|
||||
{{ $slot }}
|
||||
@@ -0,0 +1 @@
|
||||
[{{ $slot }}]({{ $url }})
|
||||
@@ -0,0 +1,9 @@
|
||||
{!! strip_tags($header) !!}
|
||||
|
||||
{!! strip_tags($slot) !!}
|
||||
@isset($subcopy)
|
||||
|
||||
{!! strip_tags($subcopy) !!}
|
||||
@endisset
|
||||
|
||||
{!! strip_tags($footer) !!}
|
||||
@@ -0,0 +1,27 @@
|
||||
@component('mail::layout')
|
||||
{{-- Header --}}
|
||||
@slot('header')
|
||||
@component('mail::header', ['url' => config('app.url')])
|
||||
{{ config('app.name') }}
|
||||
@endcomponent
|
||||
@endslot
|
||||
|
||||
{{-- Body --}}
|
||||
{{ $slot }}
|
||||
|
||||
{{-- Subcopy --}}
|
||||
@isset($subcopy)
|
||||
@slot('subcopy')
|
||||
@component('mail::subcopy')
|
||||
{{ $subcopy }}
|
||||
@endcomponent
|
||||
@endslot
|
||||
@endisset
|
||||
|
||||
{{-- Footer --}}
|
||||
@slot('footer')
|
||||
@component('mail::footer')
|
||||
© {{ date('Y') }} {{ config('app.name') }}. @lang('All rights reserved.')
|
||||
@endcomponent
|
||||
@endslot
|
||||
@endcomponent
|
||||
@@ -0,0 +1 @@
|
||||
{{ $slot }}
|
||||
@@ -0,0 +1 @@
|
||||
{{ $slot }}
|
||||
@@ -0,0 +1 @@
|
||||
[{{ $slot }}]({{ $url }})
|
||||
@@ -0,0 +1 @@
|
||||
{{ $slot }}
|
||||
@@ -0,0 +1 @@
|
||||
{{ $slot }}
|
||||
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
if (! empty($greeting)) {
|
||||
echo $greeting, "\n\n";
|
||||
} else {
|
||||
echo $level == 'error' ? 'Whoops!' : 'Hello!', "\n\n";
|
||||
}
|
||||
|
||||
if (! empty($introLines)) {
|
||||
echo implode("\n", $introLines), "\n\n";
|
||||
}
|
||||
|
||||
if (isset($actionText)) {
|
||||
echo "{$actionText}: {$actionUrl}", "\n\n";
|
||||
}
|
||||
|
||||
if (! empty($outroLines)) {
|
||||
echo implode("\n", $outroLines), "\n\n";
|
||||
}
|
||||
|
||||
echo 'Regards,', "\n";
|
||||
echo config('app.name'), "\n";
|
||||
@@ -0,0 +1,193 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
|
||||
<style type="text/css" rel="stylesheet" media="all">
|
||||
/* Media Queries */
|
||||
@media only screen and (max-width: 500px) {
|
||||
.button {
|
||||
width: 100% !important;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<?php
|
||||
|
||||
$style = [
|
||||
/* Layout ------------------------------ */
|
||||
|
||||
'body' => 'margin: 0; padding: 0; width: 100%; background-color: #F2F4F6;',
|
||||
'email-wrapper' => 'width: 100%; margin: 0; padding: 0; background-color: #F2F4F6; border-top: 5px solid #1c8966;',
|
||||
|
||||
/* Masthead ----------------------- */
|
||||
|
||||
'email-masthead' => 'padding: 25px 0; text-align: center;',
|
||||
'email-masthead_name' => 'font-size: 16px; font-weight: bold; color: #2F3133; text-decoration: none; text-shadow: 0 1px 0 white;',
|
||||
|
||||
'email-body' => 'width: 100%; margin: 0; padding: 0; border-top: 1px solid #EDEFF2; border-bottom: 1px solid #EDEFF2; background-color: #FFF;',
|
||||
'email-body_inner' => 'width: auto; max-width: 570px; margin: 0 auto; padding: 0;',
|
||||
'email-body_cell' => 'padding: 35px;',
|
||||
|
||||
'email-footer' => 'width: auto; max-width: 570px; margin: 0 auto; padding: 0; text-align: center;',
|
||||
'email-footer_cell' => 'color: #AEAEAE; padding: 35px; text-align: center;',
|
||||
|
||||
/* Body ------------------------------ */
|
||||
|
||||
'body_action' => 'width: 100%; margin: 30px auto; padding: 0; text-align: center;',
|
||||
'body_sub' => 'margin-top: 25px; padding-top: 25px; border-top: 1px solid #EDEFF2;',
|
||||
|
||||
/* Type ------------------------------ */
|
||||
|
||||
'anchor' => 'color: #3869D4;',
|
||||
'header-1' => 'margin-top: 0; color: #2F3133; font-size: 19px; font-weight: bold; text-align: left;',
|
||||
'paragraph' => 'margin-top: 0; color: #74787E; font-size: 16px; line-height: 1.5em;',
|
||||
'paragraph-sub' => 'margin-top: 0; color: #74787E; font-size: 12px; line-height: 1.5em;',
|
||||
'paragraph-center' => 'text-align: center;',
|
||||
|
||||
/* Buttons ------------------------------ */
|
||||
|
||||
'button' => 'display: block; display: inline-block; width: 200px; min-height: 20px; padding: 10px;
|
||||
background-color: #3869D4; border-radius: 3px; color: #ffffff; font-size: 15px; line-height: 25px;
|
||||
text-align: center; text-decoration: none; -webkit-text-size-adjust: none;',
|
||||
|
||||
'button--green' => 'background-color: #5cb85c;',
|
||||
'button--red' => 'background-color: #dc4d2f;',
|
||||
'button--blue' => 'background-color: #3869D4;',
|
||||
'button--default' => 'background-color: #1c8966;'
|
||||
];
|
||||
?>
|
||||
|
||||
<?php $fontFamily = 'font-family: Arial, \'Helvetica Neue\', Helvetica, sans-serif;'; ?>
|
||||
|
||||
<body style="{{ $style['body'] }}">
|
||||
<table width="100%" cellpadding="0" cellspacing="0">
|
||||
<tr>
|
||||
<td style="{{ $style['email-wrapper'] }}" align="center">
|
||||
<table width="100%" cellpadding="0" cellspacing="0">
|
||||
<!-- Logo -->
|
||||
<tr>
|
||||
<td style="{{ $style['email-masthead'] }}">
|
||||
<a style="{{ $fontFamily }} {{ $style['email-masthead_name'] }}" href="{{ url('/') }}" target="_blank">
|
||||
<x-logo height="60" />
|
||||
{{--{{ config('app.name') }}--}}
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- Email Body -->
|
||||
<tr>
|
||||
<td style="{{ $style['email-body'] }}" width="100%">
|
||||
<table style="{{ $style['email-body_inner'] }}" align="center" width="570" cellpadding="0" cellspacing="0">
|
||||
<tr>
|
||||
<td style="{{ $fontFamily }} {{ $style['email-body_cell'] }}">
|
||||
<!-- Greeting -->
|
||||
<h1 style="{{ $style['header-1'] }}">
|
||||
@if (! empty($greeting))
|
||||
{{ $greeting }}
|
||||
@else
|
||||
@if ($level == 'error')
|
||||
Whoops!
|
||||
@else
|
||||
Hello!
|
||||
@endif
|
||||
@endif
|
||||
</h1>
|
||||
|
||||
<!-- Intro -->
|
||||
@foreach ($introLines as $line)
|
||||
<p style="{{ $style['paragraph'] }}">
|
||||
{{ $line }}
|
||||
</p>
|
||||
@endforeach
|
||||
|
||||
<!-- Action Button -->
|
||||
@if (isset($actionText))
|
||||
<table style="{{ $style['body_action'] }}" align="center" width="100%" cellpadding="0" cellspacing="0">
|
||||
<tr>
|
||||
<td align="center">
|
||||
<?php
|
||||
switch ($level) {
|
||||
case 'success':
|
||||
$actionColor = 'button--green';
|
||||
break;
|
||||
case 'error':
|
||||
$actionColor = 'button--red';
|
||||
break;
|
||||
default:
|
||||
$actionColor = 'button--default';
|
||||
}
|
||||
?>
|
||||
|
||||
<a href="{{ $actionUrl }}"
|
||||
style="{{ $fontFamily }} {{ $style['button'] }} {{ $style[$actionColor] }}"
|
||||
class="button"
|
||||
target="_blank">
|
||||
{{ $actionText }}
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
@endif
|
||||
|
||||
<!-- Outro -->
|
||||
@foreach ($outroLines as $line)
|
||||
<p style="{{ $style['paragraph'] }}">
|
||||
{{ $line }}
|
||||
</p>
|
||||
@endforeach
|
||||
|
||||
<!-- Salutation -->
|
||||
<p style="{{ $style['paragraph'] }}">
|
||||
@lang('Regards'),<br>{{ config('app.name') }}
|
||||
</p>
|
||||
|
||||
<!-- Sub Copy -->
|
||||
@if (isset($actionText))
|
||||
<table style="{{ $style['body_sub'] }}">
|
||||
<tr>
|
||||
<td style="{{ $fontFamily }}">
|
||||
<p style="{{ $style['paragraph-sub'] }}">
|
||||
@lang("If you're having trouble clicking the \":button\" button, copy and paste the URL below into your web browser:", ['button' => $actionText])
|
||||
</p>
|
||||
|
||||
<p style="{{ $style['paragraph-sub'] }}">
|
||||
<a style="{{ $style['anchor'] }}" href="{{ $actionUrl }}" target="_blank">
|
||||
{{ $actionUrl }}
|
||||
</a>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
@endif
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- Footer -->
|
||||
<tr>
|
||||
<td>
|
||||
<table style="{{ $style['email-footer'] }}" align="center" width="570" cellpadding="0" cellspacing="0">
|
||||
<tr>
|
||||
<td style="{{ $fontFamily }} {{ $style['email-footer_cell'] }}">
|
||||
<p style="{{ $style['paragraph-sub'] }}">
|
||||
© {{ date('Y') }}
|
||||
<a style="{{ $style['anchor'] }}" href="{{ url('/') }}" target="_blank">{{ config('app.name') }}</a>.
|
||||
@lang('All rights reserved.')
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,36 @@
|
||||
@if ($paginator->hasPages())
|
||||
<ul class="pagination">
|
||||
<!-- Previous Page Link -->
|
||||
@if ($paginator->onFirstPage())
|
||||
<li class="page-item disabled"><span class="page-link">«</span></li>
|
||||
@else
|
||||
<li class="page-item"><a class="page-link" href="{{ $paginator->previousPageUrl() }}" rel="prev">«</a></li>
|
||||
@endif
|
||||
|
||||
<!-- Pagination Elements -->
|
||||
@foreach ($elements as $element)
|
||||
<!-- "Three Dots" Separator -->
|
||||
@if (is_string($element))
|
||||
<li class="page-item disabled"><span class="page-link">{{ $element }}</span></li>
|
||||
@endif
|
||||
|
||||
<!-- Array Of Links -->
|
||||
@if (is_array($element))
|
||||
@foreach ($element as $page => $url)
|
||||
@if ($page == $paginator->currentPage())
|
||||
<li class="page-item active"><span class="page-link">{{ $page }}</span></li>
|
||||
@else
|
||||
<li class="page-item"><a class="page-link" href="{{ $url }}">{{ $page }}</a></li>
|
||||
@endif
|
||||
@endforeach
|
||||
@endif
|
||||
@endforeach
|
||||
|
||||
<!-- Next Page Link -->
|
||||
@if ($paginator->hasMorePages())
|
||||
<li class="page-item"><a class="page-link" href="{{ $paginator->nextPageUrl() }}" rel="next">»</a></li>
|
||||
@else
|
||||
<li class="page-item disabled"><span class="page-link">»</span></li>
|
||||
@endif
|
||||
</ul>
|
||||
@endif
|
||||
@@ -0,0 +1,36 @@
|
||||
@if ($paginator->hasPages())
|
||||
<ul class="pagination">
|
||||
<!-- Previous Page Link -->
|
||||
@if ($paginator->onFirstPage())
|
||||
<li class="disabled"><span>«</span></li>
|
||||
@else
|
||||
<li><a href="{{ $paginator->previousPageUrl() }}" rel="prev">«</a></li>
|
||||
@endif
|
||||
|
||||
<!-- Pagination Elements -->
|
||||
@foreach ($elements as $element)
|
||||
<!-- "Three Dots" Separator -->
|
||||
@if (is_string($element))
|
||||
<li class="disabled"><span>{{ $element }}</span></li>
|
||||
@endif
|
||||
|
||||
<!-- Array Of Links -->
|
||||
@if (is_array($element))
|
||||
@foreach ($element as $page => $url)
|
||||
@if ($page == $paginator->currentPage())
|
||||
<li class="active"><span>{{ $page }}</span></li>
|
||||
@else
|
||||
<li><a href="{{ $url }}">{{ $page }}</a></li>
|
||||
@endif
|
||||
@endforeach
|
||||
@endif
|
||||
@endforeach
|
||||
|
||||
<!-- Next Page Link -->
|
||||
@if ($paginator->hasMorePages())
|
||||
<li><a href="{{ $paginator->nextPageUrl() }}" rel="next">»</a></li>
|
||||
@else
|
||||
<li class="disabled"><span>»</span></li>
|
||||
@endif
|
||||
</ul>
|
||||
@endif
|
||||
@@ -0,0 +1,17 @@
|
||||
@if ($paginator->hasPages())
|
||||
<ul class="pagination">
|
||||
<!-- Previous Page Link -->
|
||||
@if ($paginator->onFirstPage())
|
||||
<li class="page-item disabled"><span class="page-link">«</span></li>
|
||||
@else
|
||||
<li class="page-item"><a class="page-link" href="{{ $paginator->previousPageUrl() }}" rel="prev">«</a></li>
|
||||
@endif
|
||||
|
||||
<!-- Next Page Link -->
|
||||
@if ($paginator->hasMorePages())
|
||||
<li class="page-item"><a class="page-link" href="{{ $paginator->nextPageUrl() }}" rel="next">»</a></li>
|
||||
@else
|
||||
<li class="page-item disabled"><span class="page-link">»</span></li>
|
||||
@endif
|
||||
</ul>
|
||||
@endif
|
||||
@@ -0,0 +1,17 @@
|
||||
@if ($paginator->hasPages())
|
||||
<ul class="pagination">
|
||||
<!-- Previous Page Link -->
|
||||
@if ($paginator->onFirstPage())
|
||||
<li class="disabled"><span>«</span></li>
|
||||
@else
|
||||
<li><a href="{{ $paginator->previousPageUrl() }}" rel="prev">«</a></li>
|
||||
@endif
|
||||
|
||||
<!-- Next Page Link -->
|
||||
@if ($paginator->hasMorePages())
|
||||
<li><a href="{{ $paginator->nextPageUrl() }}" rel="next">»</a></li>
|
||||
@else
|
||||
<li class="disabled"><span>»</span></li>
|
||||
@endif
|
||||
</ul>
|
||||
@endif
|
||||
Reference in New Issue
Block a user