[WIP] Refactor project

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

View File

@@ -1,19 +1,19 @@
@extends('layout.index', [
'title' => __('article_families.title'),
'subtitle' => __('article_families.create.title'),
'breadcrumb' => [__('article_families.title'), __('article_families.create.title')]
'title' => __('customers.title'),
'subtitle' => __('customers.create.title'),
'breadcrumb' => [__('customers.title'), __('customers.create.title')]
])
@include('boilerplate::load.fileinput')
@section('content')
{{ Form::open(['route' => 'Shop.Admin.ArticleFamilies.store', 'id' => 'article-family-form', 'autocomplete' => 'off', 'files' => true]) }}
{{ Form::open(['route' => 'Shop.Admin.Customers.store', 'id' => 'customer-form', 'autocomplete' => 'off']) }}
<div class="row">
<div class="col-sm-12 mbl">
<a href="{{ route("Shop.Admin.Articles.index") }}" class="btn btn-default">
{{ __('article_families.list.title') }}
<a href="{{ route("Shop.Admin.Customers.index") }}" class="btn btn-default">
{{ __('customers.list.title') }}
</a>
<span class="btn-group pull-right">
@@ -22,7 +22,7 @@
</div>
</div>
@include('Shop.Admin.ArticleFamilies.form')
@include('Shop.Admin.Customers.form')
</form>
@endsection

View File

@@ -1,6 +1,6 @@
@extends('layout.index', [
'title' => 'Famille d\'articles',
'subtitle' => 'Edition d\'une famille d\'article',
'title' => 'Clients',
'subtitle' => 'Edition d\'un client',
'breadcrumb' => ['Articles']
])
@@ -8,22 +8,9 @@
@section('content')
{{ Form::open(['route' => 'Shop.Admin.ArticleFamilies.update', 'id' => 'article-family-form', 'autocomplete' => 'off', 'files' => true]) }}
<div class="row">
<div class="col-sm-12 mbl">
<a href="{{ route("Shop.Admin.ArticleFamilies.index") }}" class="btn btn-default">
{{ __('article_families.list.title') }}
</a>
<span class="btn-group pull-right">
@include('components.button-save')
</span>
</div>
</div>
<input type="hidden" name="id" value="{{ $id }}">
@include('Shop.Admin.ArticleFamilies.form')
{{ Form::open(['route' => 'Shop.Admin.Customers.update', 'id' => 'customer-form', 'autocomplete' => 'off']) }}
<input type="hidden" name="id" value="{{ $customer['id'] }}">
@include('Shop.Admin.Customers.form')
</form>
@endsection

View File

@@ -12,18 +12,12 @@
</div>
</div>
<div class="row">
<div class="col-md-8">
<div class="float-right mt-3">
@include('components.button-save')
</div>
</div>
</div>
@include('components.save')
@push('js')
<script>
$(function() {
$('.editor').tinymce({});
});
</script>
<script>
$(function() {
$('.editor').tinymce({});
});
</script>
@endpush

View File

@@ -1,21 +1,11 @@
@extends('layout.index', [
'title' => __('Shop.article_families.title'),
'subtitle' => __('Shop.article_families.list'),
'breadcrumb' => [__('Shop.article_families.title')]
'title' => __('Shop.customers.title'),
'subtitle' => __('Shop.customers.list'),
'breadcrumb' => [__('Shop.customers.title')]
])
@section('content')
<div class="row pb-3">
<div class="col text-right">
<a href="{{ route('Shop.Admin.ArticleFamilies.create') }}" class="btn btn-sm btn-success">{{ __('Shop.Admin.ArticleFamilies.add') }} <i class="fa fa-plus"></i></a>
</div>
</div>
{{$dataTable->table()}}
@component('components.card')
@include('components.datatable', ['route' => route('Shop.Admin.Customers.index'), 'model' => 'customers'])
@endcomponent
@endsection
@push('scripts')
@include('components.js.datatable', ['route' => '/Shop/Admin/ArticleFamilies', 'model' => 'articlefamilies'])
@endpush

View File

@@ -1,28 +1,16 @@
@extends('layout.index', [
'title' => __('article_families.title'),
'subtitle' => __('article_families.create.title'),
'breadcrumb' => [__('article_families.title'), __('article_families.create.title')]
'title' => __('invoices.title'),
'subtitle' => __('invoices.create.title'),
'breadcrumb' => [__('invoices.title'), __('invoices.create.title')]
])
@include('boilerplate::load.fileinput')
@section('content')
{{ Form::open(['route' => 'Shop.Admin.ArticleFamilies.store', 'id' => 'article-family-form', 'autocomplete' => 'off', 'files' => true]) }}
<div class="row">
<div class="col-sm-12 mbl">
<a href="{{ route("Shop.Admin.Articles.index") }}" class="btn btn-default">
{{ __('article_families.list.title') }}
</a>
<span class="btn-group pull-right">
@include('components.button-save')
</span>
</div>
</div>
@include('Shop.Admin.ArticleFamilies.form')
{{ Form::open(['route' => 'Shop.Admin.Invoices.store', 'id' => 'invoice-form', 'autocomplete' => 'off']) }}
@include('Shop.Admin.Invoices.form')
@include('components.save')
</form>
@endsection

View File

@@ -1,6 +1,6 @@
@extends('layout.index', [
'title' => 'Famille d\'articles',
'subtitle' => 'Edition d\'une famille d\'article',
'title' => 'Factures',
'subtitle' => 'Edition d\'une facture',
'breadcrumb' => ['Articles']
])
@@ -8,22 +8,11 @@
@section('content')
{{ Form::open(['route' => 'Shop.Admin.ArticleFamilies.update', 'id' => 'article-family-form', 'autocomplete' => 'off', 'files' => true]) }}
{{ Form::open(['route' => 'Shop.Admin.Invoices.update', 'id' => 'invoice-form', 'autocomplete' => 'off']) }}
<input type="hidden" name="id" value="{{ $invoice['id'] }}">
@include('Shop.Admin.Invoices.form')
@include('components.button-save')
<div class="row">
<div class="col-sm-12 mbl">
<a href="{{ route("Shop.Admin.ArticleFamilies.index") }}" class="btn btn-default">
{{ __('article_families.list.title') }}
</a>
<span class="btn-group pull-right">
@include('components.button-save')
</span>
</div>
</div>
<input type="hidden" name="id" value="{{ $id }}">
@include('Shop.Admin.ArticleFamilies.form')
</form>
@endsection

View File

@@ -1,21 +1,11 @@
@extends('layout.index', [
'title' => __('Shop.article_families.title'),
'subtitle' => __('Shop.article_families.list'),
'breadcrumb' => [__('Shop.article_families.title')]
'title' => __('Shop.invoices.title'),
'subtitle' => __('Shop.invoices.list'),
'breadcrumb' => [__('Shop.invoices.title')]
])
@section('content')
<div class="row pb-3">
<div class="col text-right">
<a href="{{ route('Shop.Admin.ArticleFamilies.create') }}" class="btn btn-sm btn-success">{{ __('Shop.Admin.ArticleFamilies.add') }} <i class="fa fa-plus"></i></a>
</div>
</div>
{{$dataTable->table()}}
@component('components.card')
@include('components.datatable', ['route' => route('Shop.Admin.Invoices.index'), 'model' => 'invoices'])
@endcomponent
@endsection
@push('scripts')
@include('components.js.datatable', ['route' => '/Shop/Admin/ArticleFamilies', 'model' => 'articlefamilies'])
@endpush

View File

@@ -1,21 +1,11 @@
@extends('layout.index', [
'title' => __('Shop.article_families.title'),
'subtitle' => __('Shop.article_families.list'),
'breadcrumb' => [__('Shop.article_families.title')]
'title' => __('Shop.orders.title'),
'subtitle' => __('Shop.orders.list'),
'breadcrumb' => [__('Shop.orders.title')]
])
@section('content')
<div class="row pb-3">
<div class="col text-right">
<a href="{{ route('Shop.Admin.ArticleFamilies.create') }}" class="btn btn-sm btn-success">{{ __('Shop.Admin.ArticleFamilies.add') }} <i class="fa fa-plus"></i></a>
</div>
</div>
{{$dataTable->table()}}
@component('components.card')
@include('components.datatable', ['route' => route('Shop.Admin.Orders.index'), 'model' => 'orders'])
@endcomponent
@endsection
@push('scripts')
@include('components.js.datatable', ['route' => '/Shop/Admin/ArticleFamilies', 'model' => 'articlefamilies'])
@endpush

View File

@@ -1,22 +1,22 @@
var circleCoordinates_{!! $id !!} = (
@foreach ($options['coordinates'] as $key => $coordinate)
new google.maps.LatLng({!! $coordinate['latitude'] !!}, {!! $coordinate['longitude'] !!})
@endforeach
@foreach ($options['coordinates'] as $key => $coordinate)
new google.maps.LatLng({!! $coordinate['latitude'] !!}, {!! $coordinate['longitude'] !!})
@endforeach
);
var circle_{!! $id !!} = new google.maps.Circle({
strokeColor: '{!! $options['strokeColor'] !!}',
strokeOpacity: {!! $options['strokeOpacity'] !!},
strokeWeight: {!! $options['strokeWeight'] !!},
fillColor: '{!! $options['fillColor'] !!}',
fillOpacity: {!! $options['fillOpacity'] !!},
center: circleCoordinates_{!! $id !!},
radius: {!! $options['radius'] !!},
editable: {!! $options['editable'] ? 'true' : 'false' !!}
strokeColor: '{!! $options['strokeColor'] !!}',
strokeOpacity: {!! $options['strokeOpacity'] !!},
strokeWeight: {!! $options['strokeWeight'] !!},
fillColor: '{!! $options['fillColor'] !!}',
fillOpacity: {!! $options['fillOpacity'] !!},
center: circleCoordinates_{!! $id !!},
radius: {!! $options['radius'] !!},
editable: {!! $options['editable'] ? 'true' : 'false' !!}
});
circle_{!! $id !!}.setMap({!! $options['map'] !!});
shapes.push({
'circle_{!! $id !!}': circle_{!! $id !!}
'circle_{!! $id !!}': circle_{!! $id !!}
});

View File

@@ -26,7 +26,7 @@
@if ($options['cluster'])
<script type="text/javascript" src="//googlemaps.github.io/js-marker-clusterer/src/markerclusterer.js"></script>
<script type="text/javascript" src="//googlearchive.github.io/js-marker-clusterer/src/markerclusterer.js"></script>
@endif

View File

@@ -2,111 +2,112 @@
<script type="text/javascript">
var maps = [];
var maps = [];
function initialize_{!! $id !!}() {
var bounds = new google.maps.LatLngBounds();
var infowindow = new google.maps.InfoWindow();
var position = new google.maps.LatLng({!! $options['latitude'] !!}, {!! $options['longitude'] !!});
function initialize_{!! $id !!}() {
var bounds = new google.maps.LatLngBounds();
var infowindow = new google.maps.InfoWindow();
var position = new google.maps.LatLng({!! $options['latitude'] !!}, {!! $options['longitude'] !!});
var mapOptions_{!! $id !!} = {
@if ($options['center'])
center: position,
@endif
var mapOptions_{!! $id !!} = {
@if ($options['center'])
center: position,
@endif
zoom: {!! $options['zoom'] !!},
mapTypeId: google.maps.MapTypeId.{!! $options['type'] !!},
disableDefaultUI: @if (!$options['ui']) true @else false @endif,
scrollwheel: @if ($options['scrollWheelZoom']) true @else false @endif,
mapTypeId: google.maps.MapTypeId.{!! $options['type'] !!},
disableDefaultUI: @if (!$options['ui']) true @else false @endif,
scrollwheel: @if ($options['scrollWheelZoom']) true @else false @endif,
zoomControl: @if ($options['zoomControl']) true @else false @endif,
mapTypeControl: @if ($options['mapTypeControl']) true @else false @endif,
scaleControl: @if ($options['scaleControl']) true @else false @endif,
streetViewControl: @if ($options['streetViewControl']) true @else false @endif,
rotateControl: @if ($options['rotateControl']) true @else false @endif,
fullscreenControl: @if ($options['fullscreenControl']) true @else false @endif
};
fullscreenControl: @if ($options['fullscreenControl']) true @else false @endif,
gestureHandling: '{!! $options['gestureHandling'] !!}'
};
var map_{!! $id !!} = new google.maps.Map(document.getElementById('map-canvas-{!! $id !!}'), mapOptions_{!! $id !!});
map_{!! $id !!}.setTilt({!! $options['tilt'] !!});
var map_{!! $id !!} = new google.maps.Map(document.getElementById('map-canvas-{!! $id !!}'), mapOptions_{!! $id !!});
map_{!! $id !!}.setTilt({!! $options['tilt'] !!});
var markers = [];
var infowindows = [];
var shapes = [];
var markers = [];
var infowindows = [];
var shapes = [];
@foreach ($options['markers'] as $key => $marker)
{!! $marker->render($key, $view) !!}
@endforeach
@foreach ($options['markers'] as $key => $marker)
{!! $marker->render($key, $view) !!}
@endforeach
@foreach ($options['shapes'] as $key => $shape)
{!! $shape->render($key, $view) !!}
@endforeach
@foreach ($options['shapes'] as $key => $shape)
{!! $shape->render($key, $view) !!}
@endforeach
@if ($options['overlay'] == 'BIKE')
var bikeLayer = new google.maps.BicyclingLayer();
bikeLayer.setMap(map_{!! $id !!});
@endif
@if ($options['overlay'] == 'BIKE')
var bikeLayer = new google.maps.BicyclingLayer();
bikeLayer.setMap(map_{!! $id !!});
@endif
@if ($options['overlay'] == 'TRANSIT')
var transitLayer = new google.maps.TransitLayer();
transitLayer.setMap(map_{!! $id !!});
@endif
@if ($options['overlay'] == 'TRANSIT')
var transitLayer = new google.maps.TransitLayer();
transitLayer.setMap(map_{!! $id !!});
@endif
@if ($options['overlay'] == 'TRAFFIC')
var trafficLayer = new google.maps.TrafficLayer();
trafficLayer.setMap(map_{!! $id !!});
@endif
@if ($options['overlay'] == 'TRAFFIC')
var trafficLayer = new google.maps.TrafficLayer();
trafficLayer.setMap(map_{!! $id !!});
@endif
var idleListener = google.maps.event.addListenerOnce(map_{!! $id !!}, "idle", function () {
map_{!! $id !!}.setZoom({!! $options['zoom'] !!});
var idleListener = google.maps.event.addListenerOnce(map_{!! $id !!}, "idle", function () {
map_{!! $id !!}.setZoom({!! $options['zoom'] !!});
@if (!$options['center'])
map_{!! $id !!}.fitBounds(bounds);
@endif
@if (!$options['center'])
map_{!! $id !!}.fitBounds(bounds);
@endif
@if ($options['locate'])
if (typeof navigator !== 'undefined' && navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function (position) {
map_{!! $id !!}.setCenter(new google.maps.LatLng(position.coords.latitude, position.coords.longitude));
});
}
@endif
});
@if ($options['locate'])
if (typeof navigator !== 'undefined' && navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function (position) {
map_{!! $id !!}.setCenter(new google.maps.LatLng(position.coords.latitude, position.coords.longitude));
});
}
@endif
});
var map = map_{!! $id !!};
@if (isset($options['eventBeforeLoad']))
{!! $options['eventBeforeLoad'] !!}
@endif
@if (isset($options['eventBeforeLoad']))
{!! $options['eventBeforeLoad'] !!}
@endif
@if (isset($options['eventAfterLoad']))
google.maps.event.addListenerOnce(map_{!! $id !!}, "tilesloaded", function() {
{!! $options['eventAfterLoad'] !!}
});
@endif
@if (isset($options['eventAfterLoad']))
google.maps.event.addListenerOnce(map_{!! $id !!}, "tilesloaded", function() {
{!! $options['eventAfterLoad'] !!}
});
@endif
@if ($options['cluster'])
var markerClusterOptions = {
imagePath: '{!! $options['clusters']['icon'] !!}',
gridSize: {!! $options['clusters']['grid'] !!},
maxZoom: @if ($options['clusters']['zoom'] === null) null @else {!! $options['clusters']['zoom'] !!} @endif,
averageCenter: @if ($options['clusters']['center'] === true) true @else false @endif,
minimumClusterSize: {!! $options['clusters']['size'] !!}
};
var markerCluster = new MarkerClusterer(map_{!! $id !!}, markers, markerClusterOptions);
@endif
@if ($options['cluster'])
var markerClusterOptions = {
imagePath: '{!! $options['clusters']['icon'] !!}',
gridSize: {!! $options['clusters']['grid'] !!},
maxZoom: @if ($options['clusters']['zoom'] === null) null @else {!! $options['clusters']['zoom'] !!} @endif,
averageCenter: @if ($options['clusters']['center'] === true) true @else false @endif,
minimumClusterSize: {!! $options['clusters']['size'] !!}
};
var markerCluster = new MarkerClusterer(map_{!! $id !!}, markers, markerClusterOptions);
@endif
maps.push({
key: {!! $id !!},
markers: markers,
infowindows: infowindows,
map: map_{!! $id !!},
shapes: shapes
});
}
maps.push({
key: {!! $id !!},
markers: markers,
infowindows: infowindows,
map: map_{!! $id !!},
shapes: shapes
});
}
@if (!$options['async'])
google.maps.event.addDomListener(window, 'load', initialize_{!! $id !!});
google.maps.event.addDomListener(window, 'load', initialize_{!! $id !!});
@endif
</script>
</script>

View File

@@ -2,7 +2,7 @@
@foreach ($items as $id => $item)
{!! $item->render($id, $view) !!}
{!! $item->render($id, $view) !!}
@if ($options['async'])

View File

@@ -1,71 +1,126 @@
@if ($options['place'])
var service = new google.maps.places.PlacesService({!! $options['map'] !!});
var request = {
placeId: '{!! $options['place'] !!}'
};
var service = new google.maps.places.PlacesService({!! $options['map'] !!});
var request = {
placeId: {!! json_encode((string) $options['place']) !!}
};
service.getDetails(request, function(placeResult, status) {
if (status != google.maps.places.PlacesServiceStatus.OK) {
alert('Unable to find the Place details.');
return;
}
service.getDetails(request, function(placeResult, status) {
if (status != google.maps.places.PlacesServiceStatus.OK) {
alert('Unable to find the Place details.');
return;
}
@endif
@if ($options['locate'] && $options['marker'])
if (typeof navigator !== 'undefined' && navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function (position) {
marker_0.setPosition(new google.maps.LatLng(position.coords.latitude, position.coords.longitude));
});
}
if (typeof navigator !== 'undefined' && navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function (position) {
marker_0.setPosition(new google.maps.LatLng(position.coords.latitude, position.coords.longitude));
});
}
@endif
var markerPosition_{!! $id !!} = new google.maps.LatLng({!! $options['latitude'] !!}, {!! $options['longitude'] !!});
var marker_{!! $id !!} = new google.maps.Marker({
position: markerPosition_{!! $id !!},
@if ($options['place'])
place: {
placeId: '{!! $options['place'] !!}',
location: { lat: {!! $options['latitude'] !!}, lng: {!! $options['longitude'] !!} }
},
attribution: {
source: document.title,
webUrl: document.URL
},
@endif
@if (isset($options['draggable']) && $options['draggable'] == true)
draggable: true,
@endif
title: {!! json_encode((string) $options['title']) !!},
label: {!! json_encode($options['label']) !!},
animation: @if (empty($options['animation']) || $options['animation'] == 'NONE') '' @else google.maps.Animation.{!! $options['animation'] !!} @endif,
@if ($options['symbol'])
icon: {
path: google.maps.SymbolPath.{!! $options['symbol'] !!},
scale: {!! $options['scale'] !!}
}
@else
icon:
@if (is_array($options['icon']) && isset($options['icon']['url']))
{
url: {!! json_encode((string) $options['icon']['url']) !!},
position: markerPosition_{!! $id !!},
@if ($options['place'])
place: {
placeId: {!! json_encode((string) $options['place']) !!},
location: { lat: {!! $options['latitude'] !!}, lng: {!! $options['longitude'] !!} }
},
attribution: {
source: document.title,
webUrl: document.URL
},
@endif
@if (isset($options['icon']['size']))
@if (is_array($options['icon']['size']))
scaledSize: new google.maps.Size({!! $options['icon']['size'][0] !!}, {!! $options['icon']['size'][1] !!})
@else
scaledSize: new google.maps.Size({!! $options['icon']['size'] !!}, {!! $options['icon']['size'] !!})
@endif
@endif
}
@else
{!! json_encode($options['icon']) !!}
@endif
@endif
@if (isset($options['clickable']))
clickable: {!! json_encode((bool) $options['clickable']) !!},
@endif
@if (isset($options['cursor']))
cursor: {!! json_encode((string) $options['cursor']) !!},
@endif
@if (isset($options['draggable']))
draggable: {!! json_encode((bool) $options['draggable']) !!},
@endif
@if (isset($options['opacity']))
opacity: {!! json_encode((float) $options['opacity']) !!},
@endif
@if (isset($options['visible']))
visible: {!! json_encode((bool) $options['visible']) !!},
@endif
@if (isset($options['zIndex']))
zIndex: {!! json_encode((int) $options['zIndex']) !!},
@endif
title: {!! json_encode((string) $options['title']) !!},
label: @if (is_array($options['label']))
{
@foreach ($options['label'] as $key => $value)
{!! $key !!}: {!! json_encode((string) $value) !!},
@endforeach
}
@else
{!! json_encode($options['label']) !!}
@endif
,
animation: @if (empty($options['animation']) || $options['animation'] == 'NONE') '' @else google.maps.Animation.{!! $options['animation'] !!} @endif,
@if (isset($options['icon']))
icon: @if (is_array($options['icon']))
{
@foreach ($options['icon'] as $key => $value)
@switch($key)
@case('symbol')
path: google.maps.SymbolPath.{!! $value !!},
@break;
@case('size')
@case('scaledSize')
@if (is_array($value))
{!! $key !!}: new google.maps.Size({!! $value[0] !!}, {!! $value[1] !!}),
@else
{!! $key !!}: new google.maps.Size({!! $value !!}, {!! $value !!}),
@endif
@break;
@case('anchor')
@case('origin')
@case('labelOrigin')
@if (is_array($value))
{!! $key !!}: new google.maps.Point({!! $value[0] !!}, {!! $value[1] !!}),
@else
{!! $key !!}: new google.maps.Point({!! $value !!}, {!! $value !!}),
@endif
@break;
@case('fillOpacity')
@case('rotation')
@case('scale')
@case('strokeOpacity')
@case('strokeWeight')
{!! $key !!}: {!! json_encode((int) $value) !!},
@break
@default
{!! $key !!}: {!! json_encode((string) $value) !!},
@break
@endswitch
@endforeach
}
@else
{!! json_encode((string) $options['icon']) !!}
@endif
@endif
});
bounds.extend(marker_{!! $id !!}.position);
@@ -75,59 +130,59 @@ markers.push(marker_{!! $id !!});
@if ($options['place'])
marker_{!! $id !!}.addListener('click', function() {
infowindow.setContent('<a href="' + placeResult.website + '">' + placeResult.name + '</a>');
infowindow.open({!! $options['map'] !!}, this);
});
});
marker_{!! $id !!}.addListener('click', function() {
infowindow.setContent('<a href="' + placeResult.website + '">' + placeResult.name + '</a>');
infowindow.open({!! $options['map'] !!}, this);
});
});
@else
@if (!empty($options['content']))
@if (!empty($options['content']))
var infowindow_{!! $id !!} = new google.maps.InfoWindow({
content: {!! json_encode((string) $options['content']) !!}
});
var infowindow_{!! $id !!} = new google.maps.InfoWindow({
content: {!! json_encode((string) $options['content']) !!}
});
@if (isset($options['maxWidth']))
@if (isset($options['maxWidth']))
infowindow_{!! $id !!}.setOptions({ maxWidth: {!! $options['maxWidth'] !!} });
infowindow_{!! $id !!}.setOptions({ maxWidth: {!! $options['maxWidth'] !!} });
@endif
@endif
@if (isset($options['open']) && $options['open'])
@if (isset($options['open']) && $options['open'])
infowindow_{!! $id !!}.open({!! $options['map'] !!}, marker_{!! $id !!});
infowindow_{!! $id !!}.open({!! $options['map'] !!}, marker_{!! $id !!});
@endif
@endif
google.maps.event.addListener(marker_{!! $id !!}, 'click', function() {
google.maps.event.addListener(marker_{!! $id !!}, 'click', function() {
@if (isset($options['autoClose']) && $options['autoClose'])
@if (isset($options['autoClose']) && $options['autoClose'])
for (var i = 0; i < infowindows.length; i++) {
infowindows[i].close();
}
for (var i = 0; i < infowindows.length; i++) {
infowindows[i].close();
}
@endif
@endif
infowindow_{!! $id !!}.open({!! $options['map'] !!}, marker_{!! $id !!});
});
infowindow_{!! $id !!}.open({!! $options['map'] !!}, marker_{!! $id !!});
});
infowindows.push(infowindow_{!! $id !!});
infowindows.push(infowindow_{!! $id !!});
@endif
@endif
@endif
@foreach (['eventClick', 'eventDblClick', 'eventRightClick', 'eventMouseOver', 'eventMouseDown', 'eventMouseUp', 'eventMouseOut', 'eventDrag', 'eventDragStart', 'eventDragEnd', 'eventDomReady'] as $event)
@if (isset($options[$event]))
@if (isset($options[$event]))
google.maps.event.addListener(marker_{!! $id !!}, '{!! str_replace('event', '', strtolower($event)) !!}', function (event) {
{!! $options[$event] !!}
});
google.maps.event.addListener(marker_{!! $id !!}, '{!! str_replace('event', '', strtolower($event)) !!}', function (event) {
{!! $options[$event] !!}
});
@endif
@endif
@endforeach

View File

@@ -1,12 +1,12 @@
var overlayCoordinates_{!! $id !!} = new google.maps.LatLngBounds(
@foreach ($options['coordinates'] as $coordinate)
new google.maps.LatLng({!! $coordinate['latitude'] !!}, {!! $coordinate['longitude'] !!}),
@endforeach
@foreach ($options['coordinates'] as $coordinate)
new google.maps.LatLng({!! $coordinate['latitude'] !!}, {!! $coordinate['longitude'] !!}),
@endforeach
);
overlay_{!! $id !!} = new google.maps.GroundOverlay(
'{!! $options['image'] !!}',
overlayCoordinates_{!! $id !!}
'{!! $options['image'] !!}',
overlayCoordinates_{!! $id !!}
);
overlay_{!! $id !!}.setMap({!! $options['map'] !!});

View File

@@ -1,21 +1,21 @@
var polygonCoordinates_{!! $id !!} = [
@foreach ($options['coordinates'] as $coordinate)
new google.maps.LatLng({!! $coordinate['latitude'] !!}, {!! $coordinate['longitude'] !!}),
@endforeach
@foreach ($options['coordinates'] as $coordinate)
new google.maps.LatLng({!! $coordinate['latitude'] !!}, {!! $coordinate['longitude'] !!}),
@endforeach
];
var polygon_{!! $id !!} = new google.maps.Polygon({
paths: polygonCoordinates_{!! $id !!},
strokeColor: '{!! $options['strokeColor'] !!}',
strokeOpacity: {!! $options['strokeOpacity'] !!},
strokeWeight: {!! $options['strokeWeight'] !!},
fillColor: '{!! $options['fillColor'] !!}',
fillOpacity: {!! $options['fillOpacity'] !!},
editable: {!! $options['editable'] ? 'true' : 'false' !!}
paths: polygonCoordinates_{!! $id !!},
strokeColor: '{!! $options['strokeColor'] !!}',
strokeOpacity: {!! $options['strokeOpacity'] !!},
strokeWeight: {!! $options['strokeWeight'] !!},
fillColor: '{!! $options['fillColor'] !!}',
fillOpacity: {!! $options['fillOpacity'] !!},
editable: {!! $options['editable'] ? 'true' : 'false' !!}
});
polygon_{!! $id !!}.setMap({!! $options['map'] !!});
shapes.push({
'polygon_{!! $id !!}': polygon_{!! $id !!}
'polygon_{!! $id !!}': polygon_{!! $id !!}
});

View File

@@ -1,20 +1,20 @@
var polylineCoordinates_{!! $id !!} = [
@foreach ($options['coordinates'] as $coordinate)
new google.maps.LatLng({!! $coordinate['latitude'] !!}, {!! $coordinate['longitude'] !!}),
@endforeach
@foreach ($options['coordinates'] as $coordinate)
new google.maps.LatLng({!! $coordinate['latitude'] !!}, {!! $coordinate['longitude'] !!}),
@endforeach
];
var polyline_{!! $id !!} = new google.maps.Polyline({
path: polylineCoordinates_{!! $id !!},
geodesic: {!! $options['strokeColor'] ? 'true' : 'false' !!},
strokeColor: '{!! $options['strokeColor'] !!}',
strokeOpacity: {!! $options['strokeOpacity'] !!},
strokeWeight: {!! $options['strokeWeight'] !!},
editable: {!! $options['editable'] ? 'true' : 'false' !!}
path: polylineCoordinates_{!! $id !!},
geodesic: {!! $options['strokeColor'] ? 'true' : 'false' !!},
strokeColor: '{!! $options['strokeColor'] !!}',
strokeOpacity: {!! $options['strokeOpacity'] !!},
strokeWeight: {!! $options['strokeWeight'] !!},
editable: {!! $options['editable'] ? 'true' : 'false' !!}
});
polyline_{!! $id !!}.setMap({!! $options['map'] !!});
shapes.push({
'polyline_{!! $id !!}': polyline_{!! $id !!}
'polyline_{!! $id !!}': polyline_{!! $id !!}
});

View File

@@ -1,21 +1,21 @@
var rectangleCoordinates_{!! $id !!} = new google.maps.LatLngBounds(
@foreach ($options['coordinates'] as $key => $coordinate)
new google.maps.LatLng({!! $coordinate['latitude'] !!}, {!! $coordinate['longitude'] !!})@if (count($options['coordinates']) - 1 > $key), @endif
@endforeach
@foreach ($options['coordinates'] as $key => $coordinate)
new google.maps.LatLng({!! $coordinate['latitude'] !!}, {!! $coordinate['longitude'] !!})@if (count($options['coordinates']) - 1 > $key), @endif
@endforeach
);
var rectangle_{!! $id !!} = new google.maps.Rectangle({
strokeColor: '{!! $options['strokeColor'] !!}',
strokeOpacity: {!! $options['strokeOpacity'] !!},
strokeWeight: {!! $options['strokeWeight'] !!},
fillColor: '{!! $options['fillColor'] !!}',
fillOpacity: {!! $options['fillOpacity'] !!},
bounds: rectangleCoordinates_{!! $id !!},
editable: {!! $options['editable'] ? 'true' : 'false' !!}
strokeColor: '{!! $options['strokeColor'] !!}',
strokeOpacity: {!! $options['strokeOpacity'] !!},
strokeWeight: {!! $options['strokeWeight'] !!},
fillColor: '{!! $options['fillColor'] !!}',
fillOpacity: {!! $options['fillOpacity'] !!},
bounds: rectangleCoordinates_{!! $id !!},
editable: {!! $options['editable'] ? 'true' : 'false' !!}
});
rectangle_{!! $id !!}.setMap({!! $options['map'] !!});
shapes.push({
'rectangle_{!! $id !!}': rectangle_{!! $id !!}
'rectangle_{!! $id !!}': rectangle_{!! $id !!}
});

View File

@@ -2,33 +2,33 @@
<script type="text/javascript">
function initialize_{!! $id !!}() {
var bounds = new google.maps.LatLngBounds();
var position = new google.maps.LatLng({!! $options['latitude'] !!}, {!! $options['longitude'] !!});
function initialize_{!! $id !!}() {
var bounds = new google.maps.LatLngBounds();
var position = new google.maps.LatLng({!! $options['latitude'] !!}, {!! $options['longitude'] !!});
var mapOptions = {
@if ($options['center'])
center: position,
@endif
zoom: {!! $options['zoom'] !!},
mapTypeId: google.maps.MapTypeId.{!! $options['type'] !!},
disableDefaultUI: @if (!$options['ui']) true @else false @endif
};
var mapOptions = {
@if ($options['center'])
center: position,
@endif
zoom: {!! $options['zoom'] !!},
mapTypeId: google.maps.MapTypeId.{!! $options['type'] !!},
disableDefaultUI: @if (!$options['ui']) true @else false @endif
};
var map = new google.maps.Map(document.getElementById('map-canvas-{!! $id !!}'), mapOptions);
var map = new google.maps.Map(document.getElementById('map-canvas-{!! $id !!}'), mapOptions);
var panoramaOptions = {
position: position,
pov: {
heading: {!! $options['heading'] !!},
pitch: {!! $options['pitch'] !!}
}
};
var panoramaOptions = {
position: position,
pov: {
heading: {!! $options['heading'] !!},
pitch: {!! $options['pitch'] !!}
}
};
var panorama = new google.maps.StreetViewPanorama(document.getElementById('map-canvas-{!! $id !!}'), panoramaOptions);
var panorama = new google.maps.StreetViewPanorama(document.getElementById('map-canvas-{!! $id !!}'), panoramaOptions);
map.setStreetView(panorama);
}
map.setStreetView(panorama);
}
@if (!$options['async'])

View File

@@ -2,4 +2,4 @@
@section('title', __('Service Unavailable'))
@section('code', '503')
@section('message', __($exception->getMessage() ?: 'Service Unavailable'))
@section('message', __('Service Unavailable'))

View File

@@ -7,8 +7,8 @@
<title>@yield('title')</title>
<!-- Fonts -->
<link rel="dns-prefetch" href="//fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css?family=Nunito" rel="stylesheet">
<link rel="preconnect" href="https://fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css2?family=Nunito&display=swap" rel="stylesheet">
<!-- Styles -->
<style>

View File

@@ -7,8 +7,8 @@
<title>@yield('title')</title>
<!-- Fonts -->
<link rel="dns-prefetch" href="//fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css?family=Nunito" rel="stylesheet" type="text/css">
<link rel="preconnect" href="https://fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css2?family=Nunito&display=swap" rel="stylesheet">
<!-- Styles -->
<style>

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,11 @@
<div class="p-4">
<div class="alert alert-danger" style="display:flex;align-items:center">
<span class="fa fa-exclamation-triangle fa-3x" style="margin-right: 10px"></span>
<span>
{{ __('boilerplate-media-manager::error.notfound') }}<br />
<a href="{{ route('mediamanager.index').($query !== '' ? '?'.$query : '') }}" style="color: #FFF">
{{ __('boilerplate-media-manager::error.back') }}
</a>
</span>
</div>
</div>

View File

@@ -0,0 +1,43 @@
@include('boilerplate-media-manager::scripts')
<!DOCTYPE html>
<html lang="{{ App::getLocale() }}">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="robots" content="noindex, nofollow">
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>{{ config('app.name') }}</title>
@stack('css')
<link rel="stylesheet" href="{{ mix('/plugins/fontawesome/fontawesome.min.css', '/assets/vendor/boilerplate') }}">
<link rel="stylesheet" href="{{ mix('/adminlte.min.css', '/assets/vendor/boilerplate') }}">
<link rel="stylesheet" href="{{ mix('/mediamanager.min.css', '/assets/vendor/boilerplate-media-manager') }}">
<link rel="preconnect" href="https://fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css2?family=Source+Sans+Pro:ital,wght@0,300;0,400;0,700;1,400&display=swap" rel="stylesheet">
</head>
<body class="sidebar-mini">
<div id="disable"></div>
<div class="content-wrapper ml-0">
<div id="loading">
<div><span class="fa fa-4x fa-sync-alt fa-spin"></span></div>
</div>
<div id="media-content" data-mce="1" data-display="list" data-type="{{ $type }}"
data-path="{{ (string) $path }}" data-field="{{ $field }}" data-return="{{ $return_type }}"
data-selected="{{ $selected }}"></div>
</div>
<script src="{{ mix('/bootstrap.min.js', '/assets/vendor/boilerplate') }}"></script>
<script src="{{ mix('/admin-lte.min.js', '/assets/vendor/boilerplate') }}"></script>
<script src="{{ mix('/boilerplate.min.js', '/assets/vendor/boilerplate') }}"></script>
<script>
$.ajaxSetup({headers: {'X-CSRF-TOKEN': '{{ csrf_token() }}'}});
bootbox.setLocale('{{ App::getLocale() }}');
var session = {
keepalive: "{{ route('boilerplate.keepalive', null, false) }}",
expire: {{ time() + config('session.lifetime') * 60 }},
lifetime: {{ config('session.lifetime') * 60 }},
id: "{{ session()->getId() }}"
}
</script>
@stack('js')
</body>

View File

@@ -0,0 +1,19 @@
@extends('boilerplate::layout.index', [
'title' => __('boilerplate-media-manager::menu.medialibrary'),
'subtitle' => __('boilerplate-media-manager::menu.medialist'),
'breadcrumb' => [
__('boilerplate-media-manager::menu.medialibrary')
]
])
@section('content')
<div id="disable"></div>
<div id="loading"><div><span class="fa fa-4x fa-sync-alt fa-spin"></span></div></div>
<div id="media-content" data-mce="0" data-display="list" data-type="{{ $type }}" data-path="/{{ (string) $path }}"></div>
@endsection
@push('css')
<link rel="stylesheet" href="{{ mix('/mediamanager.min.css', '/assets/vendor/boilerplate-media-manager') }}">
@endpush
@include('boilerplate-media-manager::scripts')

View File

@@ -0,0 +1,79 @@
<table class="table table-striped table-sm table-hover" id="media-list" data-path="{{ $content->path() }}">
<thead>
<tr>
<th style="width:35px">
<div class="icheck-primary">
<input type="checkbox" class="check-all" id="check-all">
<label for="check-all"></label>
</div>
</th>
<th>{{ __('boilerplate-media-manager::list.name') }}</th>
<th style="width: 100px">{{ __('boilerplate-media-manager::list.weight') }}</th>
<th style="width: 80px">{{ __('boilerplate-media-manager::list.type') }}</th>
<th style="width: 160px">{{ __('boilerplate-media-manager::list.date') }}</th>
<th style="width: 150px"></th>
</tr>
</thead>
<tbody>
@if($parent)
<tr class="level-up">
<td></td>
<td>
<a href="{{ $parent['link'] }}" class="link-folder">
<span class="fa fa-level-up-alt fa-lg fa-fw media-icon fa-flip-horizontal" ></span> ..
</a>
</td>
<td>-</td>
<td>{{ __('boilerplate-media-manager::types.folder') }}</td>
<td>{{ $parent['time'] }}</td>
<td></td>
</tr>
@endif
@foreach($list as $k => $item)
<tr class="media" data-filename="{{ $item['name'] }}" data-url="{{ $item['url'] }}">
<td>
<div class="icheck-primary">
<input type="checkbox" name="check[]" value="{{ $item['name'] }}" id="item_{{ $k }}">
<label for="item_{{ $k }}"></label>
</div>
</td>
<td>
@if($item['isDir'])
<a href="{{ $item['link'] }}" class="link-folder">
<span class="far fa-folder fa-lg fa-fw media-icon"></span>&nbsp;{{ $item['name'] }}
</a>
@else
<a href="{{ $item['url'] }}" class="link-media" data-filename="{{ $item['name'] }}">
@if($item['type'] === 'image')
<img class="lazy mr-2" data-src="{{ $item['thumb'] }}" alt="{{ $item['name'] }}" style="max-width:26px;max-height:26px"> {{ $item['name'] }}
@else
<span class="far fa-{{ $item['icon'] }} fa-lg fa-fw media-icon"></span>&nbsp;{{ $item['name'] }}
@endif
</a>
@endif
</td>
<td>{{ $item['size'] }}</td>
<td>{{ __('boilerplate-media-manager::types.'.$item['type']) }}</td>
<td>{{ $item['time'] }}</td>
<td class="visible-on-hover">
<div class="btn-group">
@if(!$item['isDir'])
<a href="{{ $item['url'] }}" class="btn btn-sm btn-default btn-view">
<span class="fa fa-eye"></span>
</a>
<a href="{{ $item['url'] }}" class="btn btn-sm btn-default" download="{{ $item['url'] }}" target="_blank">
<span class="fa fa-download"></span>
</a>
@endif
<a href="#" class="btn btn-sm btn-default btn-rename" data-filename="{{ $item['name'] }}">
<span class="fa fa-pencil-alt"></span>
</a>
<a href="#" class="btn btn-sm btn-default btn-delete" data-filename="{{ $item['name'] }}">
<span class="fa fa-trash"></span>
</a>
</div>
</td>
</tr>
@endforeach
</tbody>
</table>

View File

@@ -0,0 +1,57 @@
<div id="media-list" class="media-tiles" data-path="{{ $content->path() }}">
@if($parent)
<div class="tile">
<div class="tile-icon">
<a href="{{ $parent['link'] }}" class="link-folder">
<span class="fa fa-level-up-alt fa-4x fa-fw media-icon fa-flip-horizontal" ></span>
</a>
</div>
<div class="tile-label">
<label class="text-center">..</label>
</div>
</div>
@endif
@foreach($list as $k => $item)
<div class="tile media" data-filename="{{ $item['name'] }}" data-url="{{ $item['url'] }}">
<div class="tile-icon">
@if($item['isDir'])
<a href="{{ $item['link'] }}" class="link-folder">
<span class="far fa-folder }} fa-4x fa-fw media-icon"></span>
</a>
@else
<a href="{{ $item['url'] }}" class="link-media" data-filename="{{ $item['name'] }}">
@if($item['type'] === 'image')
<img class="lazy" data-src="{{ $item['thumb'] }}" alt="{{ $item['name'] }}">
@else
<span class="fa fa-{{ $item['icon'] }} fa-5x fa-fw media-icon"></span>
@endif
</a>
@endif
</div>
<div class="tile-menu">
<div class="btn-group">
@if(!$item['isDir'])
<a href="{{ $item['url'] }}" class="btn btn-sm btn-default btn-view">
<span class="fa fa-eye"></span>
</a>
<a href="{{ $item['url'] }}" class="btn btn-sm btn-default" download="{{ $item['url'] }}" target="_blank">
<span class="fa fa-download"></span>
</a>
@endif
<a href="#" class="btn btn-sm btn-default btn-rename" data-filename="{{ $item['name'] }}">
<span class="fa fa-pencil-alt"></span>
</a>
<a href="#" class="btn btn-sm btn-default btn-delete" data-filename="{{ $item['name'] }}">
<span class="fa fa-trash"></span>
</a>
</div>
</div>
<div class="tile-label">
<div class="icheck-primary d-inline">
<input type="checkbox" name="check[]" value="{{ $item['name'] }}" id="item_{{ $k }}">
<label for="item_{{ $k }}">{{ $item['name'] }}</label>
</div>
</div>
</div>
@endforeach
</div>

View File

@@ -0,0 +1,64 @@
<div class="card card-outline card-info">
<div id="btn-paste-group" style="display: none">
<div class="files-selected">
<span id="nb-files-selected"></span> {{ __('boilerplate-media-manager::message.paste.files') }}
</div>
<div class="btn-group">
<button class="btn btn-primary btn-paste" disabled>{{ __('boilerplate-media-manager::menu.paste') }}</button>
<button class="btn btn-default btn-paste-cancel">{{ __('boilerplate-media-manager::menu.cancel') }}</button>
</div>
</div>
<div class="card-header border-bottom-0">
<div class="btn-group">
<button href="#" class="btn btn-default delete-checked" disabled>
<span class="fa fa-trash"></span>
</button>
<button href="#" class="btn btn-default copy-checked" disabled>
<span class="fa fa-clipboard"></span>
</button>
</div>
<span href="#" class="btn btn-default fileinput-button">
<i class="fa fa-upload"></i>
<span>{{ __('boilerplate-media-manager::menu.upload') }}</span>
<input id="fileupload" type="file" name="file" multiple>
</span>
<a href="#" class="btn btn-default add-folder">
<span class="fa fa-folder"></span> {{ __('boilerplate-media-manager::menu.newFolder') }}
</a>
<div class="btn-group float-right">
<a href="#" class="btn btn-{{ $display === 'list' ? 'secondary' : 'default' }} btn-toggle-display" data-display="list">
<span class="fa fa-th-list"></span>
</a>
<a href="#" class="btn btn-{{ $display === 'tiles' ? 'secondary' : 'default' }} btn-toggle-display" data-display="tiles">
<span class="fa fa-th"></span>
</a>
</div>
<div class="btn-group float-right mr-2">
<a href="#" class="btn btn-default btn-refresh">
<span class="fa fa-sync-alt"></span>
</a>
</div>
</div>
<div class="card-body pt-0">
<ol id="media-breadcrumb" class="breadcrumb mb-3 py-2">
<li><a href="{{ route('mediamanager.index', [], false) }}"><i class="fa fa-home"></i></a></li>
@foreach($breadcrumb->items() as $dir)
<li><a href="{{ route('mediamanager.index', ['path' => $dir['path']], false) }}">{{ $dir['name'] }}</a></li>
@endforeach
</ol>
<div id="progress" class="progress mb-3" style="display: none">
<div class="progress-bar"></div>
</div>
@if(empty($list) && empty($parent))
<div class="alert alert-info">
{{ __('boilerplate-media-manager::list.nocontent') }}
</div>
@else
@if($display === 'list')
@include('boilerplate-media-manager::list-table')
@else
@include('boilerplate-media-manager::list-tiles')
@endif
@endif
</div>
</div>

View File

@@ -0,0 +1,54 @@
@push('js')
<script>
var tinyMediaManager = {
image_advtab: true,
images_upload_handler: function (blobInfo, success, failure) {
var formData = new FormData();
formData.append('file', blobInfo.blob(), blobInfo.filename());
$.ajax({
url: '{{ route('mediamanager.ajax.mce-upload') }}',
type: 'post',
data: formData,
processData: false,
contentType: false,
success: function(json){
if (!json || typeof json.location != 'string') {
failure('Invalid JSON');
return;
}
success(json.location);
}
});
},
file_picker_callback: function (callback, value, meta) {
tinymce.activeEditor.windowManager.openUrl({
url: '{{ route('mediamanager.index', [], false) }}?mce=1&type=' + meta.filetype + '&selected=' + value,
title: 'File Manager',
width: Math.round(window.innerWidth * 0.8),
height: Math.round(window.innerHeight * 0.8),
onMessage: function (instance, data) {
if (data.mceAction === 'insertMedia') {
if (meta.filetype === 'image') {
callback(data.url, {alt: data.name});
}
if (meta.filetype === 'file') {
callback(data.url, {text: data.name});
}
if (meta.filetype === 'media') {
callback(data.url);
}
}
instance.close();
}
});
return false;
}
};
tinymce.defaultSettings = $.extend({}, tinymce.defaultSettings, tinyMediaManager);
</script>
@endpush

View File

@@ -0,0 +1,5 @@
@if(!defined('LOAD_TINYMCE_MEDIA'))
@include('boilerplate::load.tinymce')
@include('boilerplate-media-manager::load.mceextend')
@php(define('LOAD_TINYMCE_MEDIA', true))
@endif

View File

@@ -0,0 +1,27 @@
@push('js')
<script>
var clipboard = {path: '', files: []};
var locales = {
deleteConfirm: "{{ __('boilerplate-media-manager::message.delete.confirm') }}",
deleteSuccess: "{{ __('boilerplate-media-manager::message.delete.success') }}",
folderName: "{{ __('boilerplate-media-manager::message.folder.name') }}",
folderSuccess: "{{ __('boilerplate-media-manager::message.folder.success') }}",
renameTitle: "{{ __('boilerplate-media-manager::message.rename.title') }}",
renameSuccess: "{{ __('boilerplate-media-manager::message.rename.success') }}",
uploadSuccess: "{{ __('boilerplate-media-manager::message.upload.success') }}",
pasteSuccess: "{{ __('boilerplate-media-manager::message.paste.success') }}",
};
var routes = {
ajaxList: "{{ route('mediamanager.ajax.list', [], false) }}",
ajaxDelete: "{{ route('mediamanager.ajax.delete', [], false) }}",
ajaxUpload: "{{ route('mediamanager.ajax.upload', [], false) }}",
ajaxPaste: "{{ route('mediamanager.ajax.paste', [], false) }}",
newFolder: "{{ route('mediamanager.ajax.new-folder', [], false) }}",
rename: "{{ route('mediamanager.ajax.rename', [], false) }}",
}
</script>
<script src="{{ mix('/vendor/blueimp-file-upload/jquery.fileupload.min.js', '/assets/vendor/boilerplate-media-manager') }}"></script>
<script src="{{ mix('/vendor/jquery-lazy/jquery.lazy.plugins.js', '/assets/vendor/boilerplate-media-manager') }}"></script>
<script src="{{ mix('/mediamanager.min.js', '/assets/vendor/boilerplate-media-manager') }}"></script>
@endpush

View File

@@ -0,0 +1,35 @@
@php($id = uniqid())
<div class="form-group">
@if(!empty($label))
{{ Form::label($name ?? 'file', $label) }}
@endif
<div class="input-group">
<div class="input-group-prepend">
<button type="button" class="btn-select-file btn btn-secondary" data-field="{{ $id }}" data-src="{!! route('mediamanager.index', ['mce' => true, 'type' => $type ?? 'all', 'return_type' => 'file', 'field' => $id], false) !!}">
<i class="far fa-folder-open"></i>
</button>
</div>
<input type="text" class="form-control" data-id="text-{{ $id }}" value="{{ preg_replace('/.*\/(.*)\?.*$/', '$1', $value ?? '') }}" placeholder="{{ __('boilerplate-media-manager::select.no_file_selected') }}" style="background: #FFF" disabled>
<button class="btn {{ $value ? '' : 'd-none' }}" id="clear-{{ $id }}" style="position:absolute;right:0"><span class="fa fa-times"></span></button>
</div>
<input type="hidden" name="{{ $name ?? 'file' }}" value="{{ $value ?? '' }}" data-id="{{ $id }}"/>
{!! $errors->first( $name ?? 'file' ,'<div class="error-bubble"><div>:message</div></div>') !!}
</div>
@include('boilerplate-media-manager::select.scripts')
<script>
document.addEventListener("DOMContentLoaded", function() {
$('input[type="hidden"][data-id="{{ $id }}"]').on('change', function() {
$('#clear-{{ $id }}').addClass('d-none')
$('input[type="text"][data-id="text-{{ $id }}"]').val('')
if($(this).val() !== '') {
$('#clear-{{ $id }}').removeClass('d-none')
$('input[type="text"][data-id="text-{{ $id }}"]').val($(this).val().replace(/.*\/(.*)\?.*$/, '$1'))
}
})
$('#clear-{{ $id }}').on('click', function(e) {
e.preventDefault()
$('input[type="hidden"][data-id="{{ $id }}"]').val('').trigger('change')
})
})
</script>

View File

@@ -0,0 +1,19 @@
@php($id = uniqid())
<div class="select-image-wrapper {{ empty($value) ? '' : 'editable' }}" style="width:{{ $width ?? 300 }}px;height:{{ $height ?? 200 }}px">
<button type="button" style="max-width:{{ $width ?? 300 }}px;height:{{ $height ?? 200 }}px" class="btn-select-image" data-field="{{ $id }}"
data-src="{!! route('mediamanager.index', ['mce' => true, 'type' => 'image', 'return_type' => 'image', 'field' => $id], false) !!}">
@empty($value)
<span class="fa fa-image fa-3x"></span>
@else
<img src="{{ $value }}" />
@endempty
</button>
<div class="select-image-menu">
<button class="btn select-image-view"><span class="fa fa-eye"></span></button>
<button class="btn select-image-edit"><span class="fa fa-pencil"></span></button>
<button class="btn select-image-delete"><span class="fa fa-times"></span></button>
</div>
<input type="hidden" name="{{ $name ?? 'image' }}" value="{{ $value ?? '' }}" data-id="{{ $id }}"/>
</div>
{!! $errors->first( $name ?? 'image' ,'<div class="error-bubble"><div>:message</div></div>') !!}
@include('boilerplate-media-manager::select.scripts')

View File

@@ -0,0 +1,14 @@
@if(!defined('MEDIA_SELECT_SCRIPTS'))
@push('js')
<script>
var selectMediaLocales = {
confirm: "{{ __('boilerplate-media-manager::message.deletemedia') }}"
};
</script>
<script src="{{ mix('/select-media.min.js', '/assets/vendor/boilerplate-media-manager') }}"></script>
@endpush
@push('css')
<link rel="stylesheet" href="{{ mix('/select-media.min.css', '/assets/vendor/boilerplate-media-manager') }}">
@endpush
@php(define('MEDIA_SELECT_SCRIPTS', true))
@endif

View File

@@ -0,0 +1,20 @@
@extends('boilerplate::auth.layout', [
'title' => __('boilerplate::auth.firstlogin.title'),
'bodyClass' => 'hold-transition login-page'
])
@section('content')
@component('boilerplate::auth.loginbox')
{{ Form::open(['route' => 'boilerplate.users.firstlogin', 'autocomplete' => 'off']) }}
<input type="hidden" name="token" value="{{ $token }}">
<div class="alert alert-info">
@lang('boilerplate::auth.firstlogin.intro')
</div>
@component('boilerplate::input', ['name' => 'password', 'placeholder' => 'boilerplate::auth.fields.password', 'append-text' => 'fas fa-lock', 'type' => 'password', 'autofocus' => true])@endcomponent
@component('boilerplate::input', ['name' => 'password_confirmation', 'placeholder' => 'boilerplate::auth.fields.password_confirm', 'append-text' => 'fas fa-lock', 'type' => 'password'])@endcomponent
<div class="form-group text-center">
<button type="submit" class="btn btn-primary">@lang('boilerplate::auth.firstlogin.button')</button>
</div>
</form>
@endcomponent
@endsection

View File

@@ -0,0 +1,18 @@
<!DOCTYPE html>
<html lang="{{ App::getLocale() }}" dir="@lang('boilerplate::layout.direction')">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="robots" content="noindex, nofollow">
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>{{ $title }} | {{ config('app.name') }}</title>
<link rel="stylesheet" href="{{ mix('/plugins/fontawesome/fontawesome.min.css', '/assets/vendor/boilerplate') }}">
<link rel="stylesheet" href="{{ mix('/adminlte.min.css', '/assets/vendor/boilerplate') }}">
<link rel="preconnect" href="https://fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css2?family=Source+Sans+Pro:ital,wght@0,300;0,400;0,700;1,400&display=swap" rel="stylesheet">
</head>
<body class="hold-transition {{ $bodyClass ?? 'login-page'}}">
@yield('content')
</body>
</html>

View File

@@ -0,0 +1,26 @@
@extends('boilerplate::auth.layout', [
'title' => __('boilerplate::auth.login.title'),
'bodyClass' => 'hold-transition login-page'
])
@section('content')
@component('boilerplate::auth.loginbox')
<p class="login-box-msg text-sm">@lang('boilerplate::auth.login.intro')</p>
{!! Form::open(['route' => 'boilerplate.login', 'method' => 'post', 'autocomplete'=> 'off']) !!}
@component('boilerplate::input', ['name' => 'email', 'placeholder' => 'boilerplate::auth.fields.email', 'append-text' => 'fas fa-envelope', 'type' => 'email'])@endcomponent
@component('boilerplate::input', ['name' => 'password', 'placeholder' => 'boilerplate::auth.fields.password', 'append-text' => 'fas fa-lock', 'type' => 'password'])@endcomponent
<div class="d-flex flex-wrap align-items-center justify-content-between">
@component('boilerplate::icheck', ['name' => 'remember', 'checked' => old('remember') == 'on', 'label' => 'boilerplate::auth.login.rememberme', 'class' => 'text-sm'])@endcomponent
<button type="submit" class="btn btn-primary mb-3">@lang('boilerplate::auth.login.signin')</button>
</div>
{!! Form::close() !!}
<p class="mb-1 text-sm">
<a href="{{ route('boilerplate.password.request') }}">@lang('boilerplate::auth.login.forgotpassword')</a><br>
</p>
@if(config('boilerplate.auth.register'))
<p class="mb-0 text-sm">
<a href="{{ route('boilerplate.register') }}" class="text-center">@lang('boilerplate::auth.login.register')</a>
</p>
@endif
@endcomponent
@endsection

View File

@@ -0,0 +1,12 @@
<div class="login-box">
<div class="login-logo">
{!! config('boilerplate.theme.sidebar.brand.logo.icon') ?? '' !!}
{!! config('boilerplate.theme.sidebar.brand.logo.text') ?? $title ?? '' !!}
</div>
<div class="card">
<div class="card-body login-card-body">
{{ $slot }}
</div>
</div>
</div>

View File

@@ -0,0 +1,32 @@
@extends('boilerplate::auth.layout', ['title' => __('boilerplate::auth.password.title'), 'bodyClass' => 'hold-transition login-page'])
@section('content')
@component('boilerplate::auth.loginbox')
<p class="login-box-msg text-sm">@lang('boilerplate::auth.password.intro')</p>
@if (session('status'))
<div class="alert alert-success d-flex align-items-center">
<span class="far fa-check-circle fa-3x mr-3"></span>
{{ session('status') }}
</div>
@else
{!! Form::open(['route' => 'boilerplate.password.email', 'method' => 'post', 'autocomplete'=> 'off']) !!}
@component('boilerplate::input', ['name' => 'email', 'placeholder' => 'boilerplate::auth.fields.email', 'append-text' => 'fas fa-envelope', 'type' => 'email', 'autofocus' => true])@endcomponent
<div class="form-group">
<div class="row">
<div class="col-12 text-right">
<button type="submit" class="btn btn-primary">@lang('boilerplate::auth.password.submit')</button>
</div>
</div>
</div>
{!! Form::close() !!}
@endif
<p class="mb-0 text-sm">
<a href="{{ route('boilerplate.login') }}">@lang('boilerplate::auth.password.login_link')</a>
</p>
@if(config('boilerplate.auth.register'))
<p class="mb-0 text-sm">
<a href="{{ route('boilerplate.register') }}" class="text-center">@lang('boilerplate::auth.login.register')</a>
</p>
@endif
@endcomponent
@endsection

View File

@@ -0,0 +1,18 @@
@extends('boilerplate::auth.layout', ['title' => __('boilerplate::auth.password_reset.title')])
@section('content')
@component('boilerplate::auth.loginbox')
<p class="login-box-msg text-sm">@lang('boilerplate::auth.password_reset.intro')</p>
{!! Form::open(['route' => 'boilerplate.password.reset.post', 'method' => 'post', 'autocomplete'=> 'off']) !!}
{!! Form::hidden('token', $token) !!}
@component('boilerplate::input', ['name' => 'email', 'placeholder' => 'boilerplate::auth.fields.email', 'append-text' => 'fas fa-envelope', 'type' => 'email', 'value' => $email, 'autofocus' => true])@endcomponent
@component('boilerplate::input', ['name' => 'password', 'placeholder' => 'boilerplate::auth.fields.password', 'append-text' => 'fas fa-lock', 'type' => 'password'])@endcomponent
@component('boilerplate::input', ['name' => 'password_confirmation', 'placeholder' => 'boilerplate::auth.fields.password_confirm', 'append-text' => 'fas fa-lock', 'type' => 'password'])@endcomponent
<div class="row">
<div class="col-12 text-center">
<button class="btn btn-primary" type="submit">@lang('boilerplate::auth.password_reset.submit')</button>
</div>
</div>
{!! Form::close() !!}
@endcomponent
@endsection

View File

@@ -0,0 +1,26 @@
@extends('boilerplate::auth.layout', ['title' => __('boilerplate::auth.register.title'), 'bodyClass' => 'hold-transition login-page'])
@section('content')
@component('boilerplate::auth.loginbox')
<p class="login-box-msg text-sm">@lang('boilerplate::auth.register.intro')</p>
{!! Form::open(['route' => 'boilerplate.register', 'method' => 'post', 'autocomplete'=> 'off']) !!}
@component('boilerplate::input', ['name' => 'first_name', 'placeholder' => 'boilerplate::auth.fields.first_name', 'append-text' => 'fas fa-user', 'autofocus' => true])@endcomponent
@component('boilerplate::input', ['name' => 'last_name', 'placeholder' => 'boilerplate::auth.fields.last_name', 'append-text' => 'fas fa-user'])@endcomponent
@component('boilerplate::input', ['name' => 'email', 'placeholder' => 'boilerplate::auth.fields.email', 'append-text' => 'fas fa-envelope', 'type' => 'email'])@endcomponent
@component('boilerplate::input', ['name' => 'password', 'placeholder' => 'boilerplate::auth.fields.password', 'append-text' => 'fas fa-lock', 'type' => 'password'])@endcomponent
@component('boilerplate::input', ['name' => 'password_confirmation', 'placeholder' => 'boilerplate::auth.fields.password_confirm', 'append-text' => 'fas fa-lock', 'type' => 'password'])@endcomponent
<div class="mb-3">
<div class="col-12 text-right">
<button type="submit" class="btn btn-primary">
@lang('boilerplate::auth.register.register_button')
</button>
</div>
</div>
{!! Form::close() !!}
@if(!$firstUser)
<p class="mb-0 text-sm">
<a href="{{ route('boilerplate.login') }}">@lang('boilerplate::auth.register.login_link')</a><br>
</p>
@endif
@endcomponent
@endsection

View File

@@ -0,0 +1,31 @@
<div class="card{{ isset($tabs) ? ($outline ? ' card-outline card-outline-tabs' : ' card-tabs') : ($outline ? ' card-outline' : '') }} card-{{ $color ?? config('boilerplate.theme.card.default_color', 'info') }} bg-{{ $bgColor ?? 'white' }}{{ $collapsed ? ' collapsed-card' : '' }}{{ !empty($class) ? ' '.$class : '' }}"{!! empty($attributes) ? '' : ' '.$attributes !!}>
@if($title ?? false || $header ?? false || $tools ?? false || $maximize || $reduce || $close)
<div class="card-header{{ isset($tabs) ? ($outline ? ' p-0' : ' p-0 pt-1') : '' }} border-bottom-0">
@if($header ?? false)
{{ $header }}
@else
<h3 class="card-title">@lang($title ?? '')</h3>
@if($tools ?? false || $maximize || $reduce || $close)
<div class="card-tools">
@isset($tools)
{{ $tools ?? '' }}
@endisset
@if($maximize)
<button type="button" class="btn btn-tool" data-card-widget="maximize"><i class="fas fa-expand"></i></button>
@endif
@if($reduce)
<button type="button" class="btn btn-tool" data-card-widget="collapse"><i class="fas fa-{{ $collapsed ? 'plus' : 'minus' }}"></i></button>
@endif
@if($close)
<button type="button" class="btn btn-tool" data-card-widget="remove"><i class="fas fa-times"></i></button>
@endif
</div>
@endisset
@endif
</div>
@endif
<div class="card-body{{ $title ?? false ? ($outline ? ' pt-0' : '') : '' }}">{{ $slot }}</div>
@isset($footer)
<div class="card-footer">{{ $footer }}</div>
@endisset
</div>

View File

@@ -0,0 +1,3 @@
{!! Form::open($attributes ?? []) !!}
{{ $slot }}
{!! Form::close() !!}

View File

@@ -0,0 +1,6 @@
<div class="form-group{{ !empty($class) ? ' '.$class : '' }}">
<div class="icheck-{{ $color ?? 'primary' }}"{!! !empty($attributes) ? ' '.$attributes : '' !!}>
<input type="{{ $type ?? 'checkbox' }}" id="{{ $id }}"{{ $checked ? ' checked' : '' }}{{ $disabled ? ' disabled' : '' }}{!! !empty($name) ? ' name="'.$name.'"' : '' !!}{!! !empty($value) ? ' value="'.$value.'"' : '' !!}>
<label for="{{ $id }}" class="font-weight-normal">@lang($label ?? '')</label>
</div>
</div>

View File

@@ -0,0 +1,15 @@
<div class="info-box bg-{{ $bgColor ?? 'white' }}{{ !empty($class) ? ' '.$class : '' }}"{!! empty($attributes) ? '' : ' '.$attributes !!}>
<span class="info-box-icon bg-{{ $color ?? config('boilerplate.theme.card.default_color', 'info') }}">
<i class="{{ $icon ?? 'fas fa-cubes' }}"></i>
</span>
<div class="info-box-content">
<span class="info-box-text">@lang($text ?? '')</span>
<span class="info-box-number">{{ $number ?? '' }}</span>
@if(!empty($progress))
<div class="progress"><div class="progress-bar" style="width:{{ $progress ?? 0 }}%"></div></div>
@endif
@if(!empty($description))
<span class="progress-description">@lang($description ?? '')</span>
@endif
</div>
</div>

View File

@@ -0,0 +1,51 @@
@if(empty($name))
<code>
&lt;x-boilerplate::input>
The name attribute has not been set
</code>
@else
<div class="form-group">
@isset($label)
{{ Form::label($name, __($label)) }}
@endisset
@if($prepend || $prependText || $append || $appendText)
<div class="input-group">
@endif
@if($prepend || $prependText)
<div class="input-group-prepend">
@if($prepend)
{!! $prepend !!}
@else
<span class="input-group-text">{!! $prependText !!}</span>
@endif
</div>
@endif
@if($type === 'password')
{{ Form::password($name, array_merge(['class' => 'form-control'.$errors->first($name,' is-invalid').(isset($class) ? ' '.$class : '')], $attributes)) }}
@elseif($type === 'file')
{{ Form::file($name, array_merge(['class' => 'form-control-file'.$errors->first($name,' is-invalid').(isset($class) ? ' '.$class : '')], $attributes)) }}
@elseif($type === 'select')
{{ Form::select($name, $options ?? [], old($name, $value ?? ''), array_merge(['class' => 'form-control'.$errors->first($name,' is-invalid').(isset($class) ? ' '.$class : '')], $attributes)) }}
@else
{{ Form::{$type ?? 'text'}($name, old($name, $value ?? ''), array_merge(['class' => 'form-control'.$errors->first($name,' is-invalid').(isset($class) ? ' '.$class : '')], $attributes)) }}
@endif
@if($append || $appendText)
<div class="input-group-append">
@if($append)
{!! $append !!}
@else
<span class="input-group-text">{!! $appendText !!}</span>
@endif
</div>
@endif
@if($prepend || $prependText || $append || $appendText)
</div>
@endif
@if($help ?? false)
<small class="form-text text-muted">@lang($help)</small>
@endif
@error($name)
<div class="error-bubble"><div>{{ $message }}</div></div>
@enderror
</div>
@endif

View File

@@ -0,0 +1,47 @@
@if(empty($name))
<code>
&lt;x-boilerplate::select2>
The name attribute has not been set
</code>
@else
<div class="form-group">
@isset($label)
{{ Form::label($name, __($label)) }}
@endisset
<select id="{{ $id }}" name="{{ $name }}" class="form-control{{ $errors->first($name,' is-invalid') }}{{ isset($class) ? ' '.$class : '' }}"{!! !empty($attributes) ? ' '.$attributes : '' !!}>
@if(!isset($multiple))
<option></option>
@endif
{{ $slot }}
</select>
@if($help ?? false)
<small class="form-text text-muted">@lang($help)</small>
@endif
@error($name)
<div class="error-bubble"><div>{{ $message }}</div></div>
@enderror
</div>
@include('boilerplate::load.select2')
@push('js')
<script>
$(function () {
$('#{{ $id }}').select2({
placeholder: '{{ $placeholder ?? '' }}',
allowClear: {{ $allowClear }},
language: "{{ config('boilerplate.app.locale') }}",
direction: "@lang('boilerplate::layout.direction')",
minimumInputLength: {{ $minimumInputLength ?? 0 }},
minimumResultsForSearch: {{ $minimumResultsForSearch ?? 0 }},
width: '100%',
@isset($ajax)
ajax: {
delay: 200,
url: '{{ $ajax }}',
method: 'post'
}
@endisset
});
});
</script>
@endpush
@endif

View File

@@ -0,0 +1,12 @@
<div class="small-box bg-{{ $color ?? 'info' }}{{ !empty($class) ? ' '.$class : '' }}"{!! empty($attributes) ? '' : ' '.$attributes !!}>
<div class="inner">
<h3>{{ $nb ?? 0 }}</h3>
<p>@lang($text ?? '&nbsp;')</p>
</div>
<div class="icon"><i class="{{ $icon ?? 'fas fa-cubes' }}"></i></div>
@if(!empty($link))
<a href="{!! $link !!}" class="small-box-footer">
@lang($linkText ?? '') <i class="fas fa-arrow-circle-right"></i>
</a>
@endif
</div>

View File

@@ -0,0 +1,9 @@
<textarea id="{{ $id }}"{!! !empty($attributes) ? ' '.$attributes : '' !!}></textarea>
@if($hasMediaManager)
@include('boilerplate-media-manager::load.tinymce')
@else
@include('boilerplate::load.tinymce')
@endif
@push('js')
<script>$(function(){$('#{{ $id }}').tinymce({})});</script>
@endpush

View File

@@ -0,0 +1,6 @@
<div class="form-group{{ !empty($class) ? ' '.$class : '' }}">
<div class="custom-control custom-switch custom-switch-off-{{ $colorOff ?? 'light' }} custom-switch-on-{{ $colorOn ?? 'primary' }}"{!! !empty($attributes) ? ' '.$attributes : '' !!}>
<input type="{{ $type ?? 'checkbox' }}" class="custom-control-input" id="{{ $id }}"{{ $checked ? ' checked' : '' }}{!! !empty($name) ? ' name="'.$name.'"' : '' !!}{!! !empty($value) ? ' value="'.$value.'"' : '' !!}>
<label class="custom-control-label font-weight-normal" for="{{ $id }}">@lang($label ?? '')</label>
</div>
</div>

View File

@@ -0,0 +1,9 @@
@extends('boilerplate::layout.index', [
'title' => __('boilerplate::layout.dashboard'),
'subtitle' => 'Plugins demo',
'breadcrumb' => ['Plugins demo']]
)
@section('content')
@include('boilerplate::plugins.demo')
@endsection

View File

@@ -0,0 +1,34 @@
<div class="content-header pt-2 pb-1">
<div class="container-fluid">
<div class="row mb-2 align-items-end">
<div class="col-sm-6">
<h1 class="m-0 text-dark">
{{ $title }}
@if(isset($subtitle))
<small class="font-weight-light ml-1 text-md">{{ $subtitle }}</small>
@endif
</h1>
</div>
<div class="col-sm-6">
<ol class="breadcrumb float-sm-right text-sm">
<li class="breadcrumb-item">
<a href="{{ route('boilerplate.dashboard') }}">
{{ __('boilerplate::layout.home') }}
</a>
</li>
@if(isset($breadcrumb))
@foreach($breadcrumb as $label => $route)
@if(is_numeric($label))
<li class="breadcrumb-item active">{{ $route }}</li>
@elseif(is_array($route))
<li class="breadcrumb-item"><a href="{{ route($route[0], $route[1]) }}">{{ $label }}</a></li>
@else
<li class="breadcrumb-item"><a href="{{ route($route) }}">{{ $label }}</a></li>
@endif
@endforeach
@endif
</ol>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,18 @@
<footer class="main-footer text-sm">
<strong>
&copy; {{ date('Y') }}
@if(config('boilerplate.theme.footer.vendorlink'))
<a href="{{ config('boilerplate.theme.footer.vendorlink') }}">
{!! config('boilerplate.theme.footer.vendorname') !!}
</a>.
@else
{!! config('boilerplate.theme.footer.vendorname') !!}.
@endif
</strong>
{{ __('boilerplate::layout.rightsres') }}
<div class="float-right d-none d-sm-inline">
<a href="https://github.com/sebastienheyd/boilerplate">
Boilerplate
</a>
</div>
</footer>

View File

@@ -0,0 +1,36 @@
<nav class="main-header navbar navbar-expand navbar-{{ config('boilerplate.theme.navbar.bg') }} navbar-{{ config('boilerplate.theme.navbar.type') }} {{ config('boilerplate.theme.navbar.border') ? "" : "border-bottom-0" }}">
<div class="navbar-left d-flex">
<ul class="nav navbar-nav">
<li class="nav-item">
<a class="nav-link sidebar-toggle px-2" data-widget="pushmenu" href="#">
<i class="fas fa-fw fa-bars"></i>
</a>
</li>
</ul>
@foreach(app('boilerplate.navbar.items')->getItems('left') as $view)
{!! $view !!}
@endforeach
</div>
<div class="navbar-right ml-auto d-flex">
@foreach(app('boilerplate.navbar.items')->getItems('right') as $view)
{!! $view !!}
@endforeach
<ul class="nav navbar-nav">
@if(config('boilerplate.theme.navbar.user.visible'))
<li class="nav-item">
<a href="{{ route('boilerplate.user.profile') }}" class="nav-link d-flex align-items-center">
<img src="{{ Auth::user()->avatar_url }}" class="avatar-img img-circle bg-gray mr-2 elevation-{{ config('boilerplate.theme.navbar.user.shadow') }}" alt="{{ Auth::user()->name }}" height="32">
{{ Auth::user()->name }}
</a>
</li>
@endif
<li class="nav-item">
{!! Form::open(['route' => 'boilerplate.logout', 'method' => 'post', 'id' => 'logout-form']) !!}
<button type="submit" class="btn nav-link d-flex align-items-center logout px-2" data-question="{{ __('boilerplate::layout.logoutconfirm') }}" data-toggle="tooltip" title="{{ __('boilerplate::layout.logout') }}">
<span class="fa fa-power-off hidden-xs pr-1"></span>
</button>
{!! Form::close() !!}
</li>
</ul>
</div>
</nav>

View File

@@ -0,0 +1,65 @@
<!DOCTYPE html>
<html lang="{{ App::getLocale() }}" dir="@lang('boilerplate::layout.direction')">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="robots" content="noindex, nofollow">
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>{{ $title }} | {{ config('app.name') }}</title>
@stack('css')
<link rel="stylesheet" href="{{ mix('/plugins/fontawesome/fontawesome.min.css', '/assets/vendor/boilerplate') }}">
<link rel="stylesheet" href="{{ mix('/adminlte.min.css', '/assets/vendor/boilerplate') }}">
<link rel="preconnect" href="https://fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css2?family=Source+Sans+Pro:ital,wght@0,300;0,400;0,700;1,400&display=swap" rel="stylesheet">
</head>
<body class="layout-fixed layout-navbar-fixed sidebar-mini">
<div class="wrapper">
@include('boilerplate::layout.header')
@include('boilerplate::layout.mainsidebar')
<div class="content-wrapper">
@include('boilerplate::layout.contentheader')
<section class="content">
<div class="container-fluid">
@yield('content')
</div>
</section>
</div>
@includeWhen(config('boilerplate.theme.footer.visible', true), 'boilerplate::layout.footer')
<aside class="control-sidebar control-sidebar-{{ config('boilerplate.theme.sidebar.type') }} elevation-{{ config('boilerplate.theme.sidebar.shadow') }}">
<button class="btn btn-sm" data-widget="control-sidebar"><span class="fa fa-times"></span></button>
<div class="control-sidebar-content">
<div class="p-3">
@yield('right-sidebar')
</div>
</div>
</aside>
<div class="control-sidebar-bg"></div>
</div>
<script src="{{ mix('/bootstrap.min.js', '/assets/vendor/boilerplate') }}"></script>
<script src="{{ mix('/admin-lte.min.js', '/assets/vendor/boilerplate') }}"></script>
<script src="{{ mix('/boilerplate.min.js', '/assets/vendor/boilerplate') }}"></script>
<script>
$.ajaxSetup({headers: {'X-CSRF-TOKEN': '{{ csrf_token() }}'}});
bootbox.setLocale('{{ App::getLocale() }}');
var session = {
keepalive: "{{ route('boilerplate.keepalive', null, false) }}",
expire: {{ time() + config('session.lifetime') * 60 }},
lifetime: {{ config('session.lifetime') * 60 }},
id: "{{ session()->getId() }}"
}
</script>
@if(Session::has('growl'))
<script>
$(function() {
@if(is_array(Session::get('growl')))
growl("{!! Session::get('growl')[0] !!}", "{{ Session::get('growl')[1] }}");
@else
growl("{{Session::get('growl')}}");
@endif
});
</script>
@endif
@stack('js')
</body>
</html>

View File

@@ -0,0 +1,23 @@
<aside class="main-sidebar {{ config('boilerplate.theme.sidebar.border') ? 'border-right' : ''}} sidebar-{{ config('boilerplate.theme.sidebar.type') }}-{{ config('boilerplate.theme.sidebar.links.bg') }} elevation-{{ config('boilerplate.theme.sidebar.shadow') }}">
<a href="{{ route('boilerplate.dashboard') }}" class="brand-link {{ !empty(config('boilerplate.theme.sidebar.brand.bg')) ? 'bg-'.config('boilerplate.theme.sidebar.brand.bg') : ''}}">
<span class="brand-logo bg-{{ config('boilerplate.theme.sidebar.brand.logo.bg') }} elevation-{{ config('boilerplate.theme.sidebar.brand.logo.shadow') }}">
{!! config('boilerplate.theme.sidebar.brand.logo.icon') !!}
</span>
<span class="brand-text">{!! config('boilerplate.theme.sidebar.brand.logo.text') !!}</span>
</a>
<div class="sidebar">
@if(config('boilerplate.theme.sidebar.user.visible'))
<div class="user-panel py-3 d-flex">
<div class="image">
<img src="{{ Auth::user()->avatar_url }}" class="avatar-img img-circle elevation-{{ config('boilerplate.theme.sidebar.user.shadow') }}" alt="{{ Auth::user()->name }}">
</div>
<div class="info">
<a href="{{ route('boilerplate.user.profile') }}" class="d-block">{{ Auth::user()->name }}</a>
</div>
</div>
@endif
<nav class="mt-3">
{!! $menu !!}
</nav>
</div>
</aside>

View File

@@ -0,0 +1,40 @@
@once
@push('css')
<link rel="stylesheet" href="{{ mix('/plugins/codemirror/codemirror.min.css', '/assets/vendor/boilerplate') }}">
@endpush
@php
$default = [
'mode/xml/xml.js',
'mode/css/css.js',
'mode/javascript/javascript.js',
'mode/htmlmixed/htmlmixed.js',
'addon/edit/matchbrackets.js',
'addon/edit/matchtags.js',
'addon/edit/closetag.js',
'addon/fold/xml-fold.js',
'addon/selection/active-line.js'
];
if (isset($js) && is_array($js)) {
$default = array_merge($default, $js);
}
$js = array_unique($default);
@endphp
@push('js')
<script src="{{ mix('/plugins/codemirror/jquery.codemirror.min.js', '/assets/vendor/boilerplate') }}"></script>
@if(!empty($js))
@foreach($js as $script)
<script src="/assets/vendor/boilerplate/plugins/codemirror/{{ $script }}"></script>
@endforeach
@endif
@endpush
@isset($theme)
@push('css')
<link rel="stylesheet" href="/assets/vendor/boilerplate/plugins/codemirror/theme/{{ $theme }}.css">
@endpush
@push('js')
<script>$.fn.codemirror.defaults.theme='{{ $theme }}';</script>
@endpush
@endisset
@endonce

View File

@@ -0,0 +1,25 @@
@once
@push('css')
<link rel="stylesheet" href="{!! mix('/plugins/datatables/datatables.min.css', '/assets/vendor/boilerplate') !!}">
@endpush
@push('js')
@include('boilerplate::load.moment')
<script src="{!! mix('/plugins/datatables/datatables.min.js', '/assets/vendor/boilerplate') !!}"></script>
<script>$.extend(true,$.fn.dataTable.defaults,{autoWidth:false,language:{url:"{!! mix('/plugins/datatables/i18n/'.$locale.'.json', '/assets/vendor/boilerplate') !!}"}});</script>
@endpush
@endonce
{{-- Plugins --}}
@foreach($plugins as $plugin)
@if($$plugin ?? false)
@once
@push('css')
<link rel="stylesheet" href="{!! mix('/plugins/datatables/plugins/'.$plugin.'.bootstrap4.min.css', '/assets/vendor/boilerplate') !!}">
@endpush
@push('js')
<script src="{!! mix('/plugins/datatables/plugins/dataTables.'.$plugin.'.min.js', '/assets/vendor/boilerplate') !!}"></script>
<script src="{!! mix('/plugins/datatables/plugins/'.$plugin.'.bootstrap4.min.js', '/assets/vendor/boilerplate') !!}"></script>
@endpush
@endonce
@endif
@endforeach

View File

@@ -0,0 +1,29 @@
@once
@push('css')
<link rel="stylesheet" href="{!! mix('/plugins/datepicker/datepicker.min.css', '/assets/vendor/boilerplate') !!}">
@endpush
@push('js')
@include('boilerplate::load.moment')
<script src="{!! mix('/plugins/datepicker/datepicker.min.js', '/assets/vendor/boilerplate') !!}"></script>
<script>
$.fn.datetimepicker.Constructor.Default = $.extend({}, $.fn.datetimepicker.Constructor.Default, {
locale: "{{ config('boilerplate.app.locale') }}",
icons: $.extend({}, $.fn.datetimepicker.Constructor.Default.icons, {
time: "far fa-clock",
date: "far fa-calendar-alt",
up: "fa fa-chevron-up",
down: "fa fa-chevron-down"
})
});
$.fn.daterangepicker.defaultOptions = {
locale: {
"applyLabel": "@lang('boilerplate::daterangepicker.applyLabel')",
"cancelLabel": "@lang('boilerplate::daterangepicker.cancelLabel')",
"fromLabel": "@lang('boilerplate::daterangepicker.fromLabel')",
"toLabel": "@lang('boilerplate::daterangepicker.toLabel')",
"customRangeLabel": "@lang('boilerplate::daterangepicker.customRangeLabel')",
}
};
</script>
@endpush
@endonce

View File

@@ -0,0 +1,14 @@
@once
@push('css')
<link rel="stylesheet" href="{!! mix('/plugins/fileinput/bootstrap-fileinput.min.css', '/assets/vendor/boilerplate') !!}">
@endpush
@push('js')
<script src="{!! mix('/plugins/fileinput/bootstrap-fileinput.min.js', '/assets/vendor/boilerplate') !!}"></script>
<script src="/assets/vendor/boilerplate/plugins/fileinput/themes/fas/theme.min.js"></script>
<script>$.fn.fileinput.defaults = $.extend({}, $.fn.fileinput.defaults, $.fn.fileinputThemes.fas);</script>
@if(App::getLocale() !== 'en')
<script src="/assets/vendor/boilerplate/plugins/fileinput/locales/{{ config('boilerplate.app.locale') }}.js"></script>
<script>$.fn.fileinput.defaults.language='{{ config('boilerplate.app.locale') }}';</script>
@endif
@endpush
@endonce

View File

@@ -0,0 +1,12 @@
@once
@push('css')
<link rel="stylesheet" href="{!! mix('/plugins/fullcalendar/main.min.css', '/assets/vendor/boilerplate') !!}">
@endpush
@push('js')
<script src="{!! mix('/plugins/fullcalendar/fullcalendar.min.js', '/assets/vendor/boilerplate') !!}"></script>
@if(App::getLocale() !== 'en')
<script src="{!! mix('/plugins/fullcalendar/locales/'.App::getLocale().'.js', '/assets/vendor/boilerplate') !!}"></script>
<script>$.fn.fullCalendar.options = {locale:"{{ App::getLocale() }}"}</script>
@endif
@endpush
@endonce

View File

@@ -0,0 +1,4 @@
@once
<script src="{!! mix('/plugins/moment/moment-with-locales.min.js', '/assets/vendor/boilerplate') !!}"></script>
<script>moment.locale('{{ config('boilerplate.app.locale') }}');</script>
@endonce

View File

@@ -0,0 +1,10 @@
@once
@push('css')
<link rel="stylesheet" href="{!! mix('/plugins/select2/select2.min.css', '/assets/vendor/boilerplate') !!}">
@endpush
@push('js')
<script src="{!! mix('/plugins/select2/select2.full.min.js', '/assets/vendor/boilerplate') !!}"></script>
<script src="{!! mix('/plugins/select2/i18n/'.config('boilerplate.app.locale').'.js', '/assets/vendor/boilerplate') !!}"></script>
<script>$.extend(true,$.fn.select2.defaults,{language:'{{ config('boilerplate.app.locale') }}',direction:'@lang('boilerplate::layout.direction')'});</script>
@endpush
@endonce

View File

@@ -0,0 +1,37 @@
@once
@push('js')
<script src="{!! mix('/plugins/tinymce/tinymce.min.js', '/assets/vendor/boilerplate') !!}"></script>
<script>
tinymce.defaultSettings = {
plugins: "autoresize fullscreen codemirror link lists table media image imagetools paste customalign stickytoolbar",
toolbar: "undo redo | styleselect | bold italic underline | customalignleft aligncenter customalignright | link media image | bullist numlist | table | code fullscreen",
contextmenu: "link image imagetools table spellchecker bold italic underline",
sticky_toolbar_container: '.tox-editor-header',
toolbar_drawer: "sliding",
sticky_offset: $('nav.main-header').outerHeight(),
codemirror: { config: { theme: 'storm' } },
menubar: false,
removed_menuitems: 'newdocument',
remove_linebreaks: false,
forced_root_block: false,
force_p_newlines: true,
relative_urls: false,
verify_html: false,
branding: false,
statusbar: false,
browser_spellcheck: true,
encoding: 'UTF-8',
image_uploadtab: false,
paste_preprocess: function(plugin, args) {
args.content = args.content.replace(/<(\/)*(\\?xml:|meta|link|span|font|del|ins|st1:|[ovwxp]:)((.|\s)*?)>/gi, ''); // Unwanted tags
args.content = args.content.replace(/\s(class|style|type|start)=("(.*?)"|(\w*))/gi, ''); // Unwanted attributes
args.content = args.content.replace(/<(p|a|div|span|strike|strong|i|u)[^>]*?>(\s|&nbsp;|<br\/>|\r|\n)*?<\/(p|a|div|span|strike|strong|i|u)>/gi, ''); // Empty tags
},
skin : "boilerplate",
@if(config('boilerplate.app.locale') !== 'en')
language: '{{ config('boilerplate.app.locale') }}'
@endif
};
</script>
@endpush
@endonce

View File

@@ -0,0 +1,32 @@
<div class="card no-shadow">
<div class="card-header bg-gray font-weight-bold py-1">
{{ __('boilerplate::logs.show.levels') }}
</div>
<ul class="list-group list-unstyled">
@foreach($log->menu() as $level => $item)
@if ($item['count'] === 0)
<li>
<a href="#" class="list-group-item py-2 d-flex justify-content-between" style="opacity:.5;background: #F0F0F0; border-radius:0">
<span class="badge badge-pill text-secondary">
{!! $item['icon'] !!} {{ $item['name'] }}
</span>
<span class="badge badge-pill badge-secondary">
{{ $item['count'] }}
</span>
</a>
</li>
@else
<li>
<a href="{{ $item['url'] }}" class="list-group-item py-2 {{ $level }} d-flex justify-content-between" style="border-radius: 0">
<span class="badge badge-pill level-{{ $level }}">
{!! $item['icon'] !!} {{ $item['name'] }}
</span>
<span class="badge badge-pill level-{{ $level }}">
{{ $item['count'] }}
</span>
</a>
</li>
@endif
@endforeach
</ul>
</div>

View File

@@ -0,0 +1,10 @@
<footer class="main-footer">
<div class="container">
<p class="text-muted pull-left">
LogViewer - <span class="label label-info">version {{ log_viewer()->version() }}</span>
</p>
<p class="text-muted pull-right">
Created with <i class="fa fa-heart"></i> by ARCANEDEV <sup>&copy;</sup>
</p>
</div>
</footer>

View File

@@ -0,0 +1,42 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>LogViewer</title>
<meta name="description" content="LogViewer">
<meta name="author" content="ARCANEDEV">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datetimepicker/4.15.35/css/bootstrap-datetimepicker.min.css">
<link href='https://fonts.googleapis.com/css?family=Montserrat:400,700|Source+Sans+Pro:400,600' rel='stylesheet' type='text/css'>
@include('boilerplate::logs._template.style')
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body>
@include('boilerplate::logs._template.navigation')
<div class="container-fluid">
@yield('content')
</div>
@include('boilerplate::logs._template.footer')
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.11.1/moment-with-locales.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.3.0/Chart.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datetimepicker/4.15.35/js/bootstrap-datetimepicker.min.js"></script>
<script>
Chart.defaults.global.responsive = true;
Chart.defaults.global.scaleFontFamily = "'Source Sans Pro'";
Chart.defaults.global.animationEasing = "easeOutQuart";
</script>
@yield('modals')
@yield('scripts')
</body>
</html>

View File

@@ -0,0 +1,29 @@
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a href="{{ route('boilerplate.logs.dashboard') }}" class="navbar-brand">
<i class="fa fa-fw fa-book"></i> LogViewer
</a>
</div>
<div class="collapse navbar-collapse" id="navbar">
<ul class="nav navbar-nav">
<li class="{{ Route::is('boilerplate.logs.dashboard') ? 'active' : '' }}">
<a href="{{ route('boilerplate.logs.dashboard') }}">
<i class="fa fa-dashboard"></i> Dashboard
</a>
</li>
<li class="{{ Route::is('boilerplate.logs.list') ? 'active' : '' }}">
<a href="{{ route('boilerplate.logs.list') }}">
<i class="fa fa-archive"></i> Logs
</a>
</li>
</ul>
</div>
</div>
</nav>

View File

@@ -0,0 +1,255 @@
<style>
html {
position: relative;
min-height: 100%;
}
body {
padding-top: 50px;
/* Margin bottom by footer height */
margin-bottom: 50px;
font-family: 'Source Sans Pro', 'Helvetica Neue', Helvetica, sans-serif;
font-weight: 600;
}
h1, h2, h3 {
font-family: 'Montserrat', 'Helvetica Neue', Helvetica, sans-serif;
}
.sub-header {
padding-bottom: 10px;
border-bottom: 1px solid #EEE;
}
.navbar-inverse {
background-color: #1a237e;
border-color: #1a237e;
}
.navbar-inverse .navbar-nav>.active>a,
.navbar-inverse .navbar-nav>.active>a:focus,
.navbar-inverse .navbar-nav>.active>a:hover {
background-color: #3949ab;
}
.navbar-inverse .navbar-brand {
color: #c5cae9;
}
.navbar-inverse .navbar-nav>li>a {
color: #c5cae9;
}
.navbar-fixed-top {
border: 0;
}
.main {
padding: 20px;
}
.main .page-header {
margin-top: 0;
}
footer.main-footer {
position: absolute;
padding: 10px 0;
bottom: 0;
width: 100%;
background-color: #e8eaf6;
font-weight: 600;
}
footer.main-footer p {
margin: 0;
}
footer.main-footer i.fa.fa-heart {
color: #C62828;
}
.pagination {
margin: 0;
}
.pagination > li > a,
.pagination > li > span {
padding: 4px 10px;
}
.table-condensed > tbody > tr > td.stack,
.table-condensed > tfoot > tr > td.stack,
.table-condensed > thead > tr > td.stack {
padding: 0;
border-top: none;
}
.stack-content {
padding: 8px;
background-color: #F6F6F6;
border-top: 1px solid #D1D1D1;
color: #AE0E0E;
font-family: consolas,sans-serif;
font-size: 12px;
}
.info-box.level {
display: block;
padding: 0;
margin-bottom: 15px;
min-height: 70px;
background: #fff;
width: 100%;
box-shadow: 0 1px 1px rgba(0,0,0,0.1);
border-radius: 2px;
}
.info-box.level .info-box-text,
.info-box.level .info-box-number,
.info-box.level .info-box-icon > i {
text-shadow: 0 1px 1px rgba(0, 0, 0, 0.3);
}
.info-box.level .info-box-text {
display: block;
font-size: 14px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.info-box.level .info-box-content {
padding: 5px 10px;
margin-left: 70px;
}
.info-box.level .info-box-number {
display: block;
font-weight: bold;
font-size: 18px;
}
.info-box.level .info-box-icon {
border-radius: 2px 0 0 2px;
display: block;
float: left;
height: 70px; width: 70px;
text-align: center;
font-size: 40px;
line-height: 70px;
background: rgba(0,0,0,0.2);
}
.info-box.level .progress {
background: rgba(0,0,0,0.2);
margin: 5px -10px 5px -10px;
height: 2px;
}
.info-box.level .progress .progress-bar {
background: #fff;
}
.info-box.level-empty {
opacity: .6;
-webkit-filter: grayscale(1);
-moz-filter: grayscale(1);
-ms-filter: grayscale(1);
filter: grayscale(1);
-webkit-transition: all 0.2s ease-in-out;
-moz-transition: all 0.2s ease-in-out;
-o-transition: all 0.2s ease-in-out;
transition: all 0.2s ease-in-out;
-webkit-transition-property: -webkit-filter, opacity;
-moz-transition-property: -moz-filter, opacity;
-o-transition-property: filter, opacity;
transition-property: -webkit-filter, -moz-filter, -o-filter, filter, opacity;
}
.info-box.level-empty:hover {
opacity: 1;
-webkit-filter: grayscale(0);
-moz-filter: grayscale(0);
-ms-filter: grayscale(0);
filter: grayscale(0);
}
.level {
padding: 2px 6px;
text-shadow: 0 1px 1px rgba(0, 0, 0, 0.3);
border-radius: 2px;
font-size: .9em;
font-weight: 600;
}
.badge.level-all,
.badge.level-emergency,
.badge.level-alert,
.badge.level-critical,
.badge.level-error,
.badge.level-warning,
.badge.level-notice,
.badge.level-info,
.badge.level-debug,
.level, .level i,
.info-box.level-all,
.info-box.level-emergency,
.info-box.level-alert,
.info-box.level-critical,
.info-box.level-error,
.info-box.level-warning,
.info-box.level-notice,
.info-box.level-info,
.info-box.level-debug {
color: #FFF;
}
.label-env {
font-size: .85em;
}
.badge.level-all, .level.level-all, .info-box.level-all {
background-color: {{ log_styler()->color('all') }};
}
.badge.level-emergency, .level.level-emergency, .info-box.level-emergency {
background-color: {{ log_styler()->color('emergency') }};
}
.badge.level-alert, .level.level-alert, .info-box.level-alert {
background-color: {{ log_styler()->color('alert') }};
}
.badge.level-critical, .level.level-critical, .info-box.level-critical {
background-color: {{ log_styler()->color('critical') }};
}
.badge.level-error, .level.level-error, .info-box.level-error {
background-color: {{ log_styler()->color('error') }};
}
.badge.level-warning, .level.level-warning, .info-box.level-warning {
background-color: {{ log_styler()->color('warning') }};
}
.badge.level-notice, .level.level-notice, .info-box.level-notice {
background-color: {{ log_styler()->color('notice') }};
}
.badge.level-info, .level.level-info, .info-box.level-info {
background-color: {{ log_styler()->color('info') }};
}
.badge.level-debug, .level.level-debug, .info-box.level-debug {
background-color: {{ log_styler()->color('debug') }};
}
.badge.level-empty, .level.level-empty {
background-color: {{ log_styler()->color('empty') }};
}
.badge.label-env, .label.label-env {
background-color: #6A1B9A;
}
</style>

View File

@@ -0,0 +1,68 @@
@extends('boilerplate::layout.index', [
'title' => __('boilerplate::logs.menu.category'),
'subtitle' => __('boilerplate::logs.menu.stats'),
'breadcrumb' => [
__('boilerplate::logs.menu.stats')
]
])
@include('boilerplate::logs.style')
@section('content')
<div class="row">
<div class="col-12">
@component('boilerplate::card')
<div class="row">
<div class="mb-3 ml-auto mr-auto col-md-6 col-lg-3">
<canvas id="stats-doughnut-chart" height="300"></canvas>
</div>
<div class="col-lg-9">
<div class="row">
@foreach($percents as $level => $item)
<div class="col-sm-6 col-lg-4">
<div class="info-box level level-{{ $level }} {{ $item['count'] === 0 ? 'level-empty' : '' }}">
<span class="info-box-icon">
{!! log_styler()->icon($level) !!}
</span>
<div class="info-box-content">
<span class="info-box-text">{{ $item['name'] }}</span>
<span class="info-box-number">
{{ __('boilerplate::logs.stats.entries', $item) }}
</span>
<div class="progress">
<div class="progress-bar"
style="width: {{ $item['percent'] }}%"></div>
</div>
</div>
</div>
</div>
@endforeach
</div>
</div>
</div>
@slot('footer')
<div class="text-right text-muted small">
{!! __('boilerplate::logs.vendor') !!}
</div>
@endslot
@endcomponent
</div>
</div>
@endsection
@push('js')
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.3.0/Chart.min.js"></script>
<script>
$(function() {
new Chart($('canvas#stats-doughnut-chart'), {
type: 'doughnut',
data:{!! $chartData !!},
options: {
legend: {
position: 'bottom'
}
}
});
});
</script>
@endpush

View File

@@ -0,0 +1,116 @@
@extends('boilerplate::layout.index', [
'title' => __('boilerplate::logs.menu.category'),
'subtitle' => __('boilerplate::logs.menu.reports'),
'breadcrumb' => [
__('boilerplate::logs.menu.reports')
]
])
@include('boilerplate::logs.style')
@section('content')
<div class="row">
<div class="col-12">
@component('boilerplate::card')
{!! $rows->render() !!}
<div class="table-responsive">
<table class="table table-hover table-striped table-sm">
<thead>
<tr>
@foreach($headers as $key => $header)
<th class="{{ $key == 'date' ? 'text-left' : 'text-center' }}">
@if ($key == 'date')
@else
<span class="badge badge-pill level-{{ $key }}">
{!! log_styler()->icon($key) . ' ' . $header !!}
</span>
@endif
</th>
@endforeach
<th class="text-right"></th>
</tr>
</thead>
<tbody>
@if ($rows->count() > 0)
@foreach($rows as $date => $row)
<tr>
@foreach($row as $key => $value)
<td class="{{ $key == 'date' ? 'text-left' : 'text-center' }}">
@if ($key == 'date')
<a href="{{ route('boilerplate.logs.show', [$date]) }}">
<span class="badge badge-pill badge-info">
{{ \Carbon\Carbon::createFromFormat('Y-m-d', $value)->isoFormat(__('boilerplate::date.Ymd')) }}
</span>
</a>
@elseif ($value == 0)
<span class="badge badge-pill level-empty">{{ $value }}</span>
@else
<a href="{{ route('boilerplate.logs.filter', [$date, $key]) }}">
<span class="badge badge-pill level-{{ $key }}">{{ $value }}</span>
</a>
@endif
</td>
@endforeach
<td class="text-right visible-on-hover no-wrap">
<a href="{{ route('boilerplate.logs.show', [$date]) }}" class="btn btn-sm btn-primary">
<i class="fa fa-search"></i>
</a>
<a href="#delete-log-modal" class="btn btn-sm btn-danger" data-log-date="{{ $date }}">
<i class="fas fa-trash"></i>
</a>
</td>
</tr>
@endforeach
@else
<tr>
<td colspan="11" class="text-center">
<span class="badge badge-pill badge-default">{{ trans('log-viewer::general.empty-logs') }}</span>
</td>
</tr>
@endif
</tbody>
</table>
</div>
{!! $rows->render() !!}
@slot('footer')
<div class="text-right small text-muted">
{!! __('boilerplate::logs.vendor') !!}
</div>
@endslot
@endcomponent
</div>
</div>
@endsection
@push('css')
<style> table tr th { border-top:0 !important } </style>
@endpush
@push('js')
<script>
$(function () {
$('a[href="#delete-log-modal"]').on('click', function(e){
e.preventDefault();
var el = $(this);
bootbox.confirm("{{ __('boilerplate::logs.list.deletequestion') }}", function(e){
if(e === false) return;
$.ajax({
url: '{{ route('boilerplate.logs.delete') }}',
type: 'delete',
dataType: 'json',
data: {date:el.data('log-date')},
cache: false,
success: function(res) {
location.reload();
}
});
});
});
});
</script>
@endpush

View File

@@ -0,0 +1,191 @@
@php($date = \Carbon\Carbon::createFromFormat('Y-m-d', $log->date)->isoFormat(__('boilerplate::date.lFdY')))
@extends('boilerplate::layout.index', [
'title' => __('boilerplate::logs.menu.category'),
'subtitle' => __('boilerplate::logs.show.title', ['date' => $date]),
'breadcrumb' => [
__('boilerplate::logs.menu.reports') => 'boilerplate.logs.list',
__('boilerplate::logs.show.title', ['date' => $date])
]
])
@include('boilerplate::logs.style')
@section('content')
<div class="row">
<div class="col-12 py-2 sticky-toolbar">
<a href="{{ route('boilerplate.logs.list') }}" class="btn btn-default">
<span class="far fa-arrow-alt-circle-left text-muted"></span>
</a>
<span class="float-right">
<span class="btn-group">
<a href="{{ route('boilerplate.logs.download', [$log->date]) }}" class="btn btn-default" data-toggle="tooltip" title="{{ __('boilerplate::logs.show.download') }}">
<span class="fa fa-download text-muted"></span>
</a>
<a href="#delete-log-modal" class="btn btn-danger" data-log-date="{{ $log->date }}" data-toggle="tooltip" title="{{ __('boilerplate::logs.show.delete') }}">
<span class="fa fa-trash"></span>
</a>
</span>
</span>
</div>
<div class="col-12">
@component('boilerplate::card', ['title' => ucfirst(__('boilerplate::logs.show.file', ['date' => $date]))])
<div class="row">
<div class="col-md-2">
@include('boilerplate::logs._partials.menu')
</div>
<div class="col-md-10">
<div class="card no-shadow">
<div class="card-header bg-gray font-weight-bold py-1">
{{ __('boilerplate::logs.show.loginfo') }}
</div>
<div class="card-body py-1 px-0">
<div class="table-responsive">
<table class="table no-border table-sm mb-0">
<tbody>
<tr class="border-bottom">
<td class="pl-2">{{ __('boilerplate::logs.show.filepath') }}</td>
<td colspan="7">{{ $log->getPath() }}</td>
</tr>
<tr>
<td class="pl-2">{{ __('boilerplate::logs.show.logentries') }}</td>
<td>
<span class="badge badge-pill badge-secondary">{{ $entries->total() }}</span>
</td>
<td>{{ __('boilerplate::logs.show.size') }}</td>
<td>
<span class="badge badge-pill badge-secondary">{{ $log->size() }}</span>
</td>
<td>{{ __('boilerplate::logs.show.createdat') }}</td>
<td>
<span class="badge badge-pill badge-secondary">
{{ $log->createdAt()->isoFormat(__('boilerplate::date.YmdHis')) }}
</span>
</td>
<td>{{ __('boilerplate::logs.show.updatedat') }}</td>
<td>
<span class="badge badge-pill badge-secondary">
{{ $log->updatedAt()->isoFormat(__('boilerplate::date.YmdHis')) }}
</span>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
@if ($entries->hasPages())
<div class="d-flex justify-content-between text-sm align-items-center mb-3">
<span class="text-sm text-muted ">
{{ __('boilerplate::logs.show.page', ['current' => $entries->currentPage(), 'last' => $entries->lastPage()]) }}
</span>
{!! $entries->render() !!}
</div>
@endif
<div class="table-responsive">
<table id="entries" class="table table-hover table-sm border-left border-right">
<thead class="bg-gray">
<tr class="text-center">
<th>{{ __('boilerplate::logs.show.env') }}</th>
<th style="width: 120px;">{{ __('boilerplate::logs.show.level') }}</th>
<th style="width: 65px;">{{ __('boilerplate::logs.show.time') }}</th>
<th>{{ __('boilerplate::logs.show.header') }}</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach($entries as $key => $entry)
<tr class="{{ $key %2 ? 'even' : 'odd' }}">
<td class="px-2">
<span class="badge badge-pill bg-purple">
{{ $entry->env }}
</span>
</td>
<td class="px-2">
<span class="badge badge-pill level-{{ $entry->level }}">
{!! $entry->level() !!}
</span>
</td>
<td class="px-2">
<span class="badge badge-pill bg-secondary">
{{ $entry->datetime->format('H:i:s') }}
</span>
</td>
<td class="text-sm">
{{ $entry->header }}
</td>
<td class="text-right px-2">
@if ($entry->hasStack())
<a class="btn btn-xs btn-default" role="button" data-toggle="collapse" href="#log-stack-{{ $key }}" aria-expanded="false" aria-controls="log-stack-{{ $key }}">
Stack
</a>
@endif
</td>
</tr>
@if ($entry->hasStack())
<tr>
<td colspan="5" class="stack">
<div class="stack-content collapse" id="log-stack-{{ $key }}">
{!! preg_replace('`#([0-9]*)\s`', "<br /><strong>#$1</strong> ", $entry->stack()) !!}
</div>
</td>
</tr>
@endif
@endforeach
</tbody>
</table>
</div>
@if ($entries->hasPages())
<div class="panel-footer d-flex justify-content-between align-items-center text-sm">
<span class="pull-right small text-muted mtm">
{{ __('boilerplate::logs.show.page', ['current' => $entries->currentPage(), 'last' => $entries->lastPage()]) }}
</span>
{!! $entries->render() !!}
</div>
@endif
</div>
</div>
@slot('footer')
<div class="text-muted text-right small">
{!! __('boilerplate::logs.vendor') !!}
</div>
@endslot
@endcomponent
</div>
@endsection
@push('css')
<style>.pagination { margin: 0; }</style>
@endpush
@push('js')
<script>
$(function () {
$('a[href="#delete-log-modal"]').on('click', function(e){
e.preventDefault();
var el = $(this);
bootbox.confirm("{{ __('boilerplate::logs.list.deletequestion') }}", function(e){
if(e === false) return;
$.ajax({
url: '{{ route('boilerplate.logs.delete') }}',
type: 'delete',
dataType: 'json',
data: {date:el.data('log-date')},
headers: {'X-CSRF-TOKEN': '{{ csrf_token() }}'},
cache: false,
success: function(res) {
location.replace("{{ route('boilerplate.logs.list') }}");
}
});
});
});
});
</script>
@endpush

View File

@@ -0,0 +1,182 @@
@push('css')
<style>
.table>tbody>tr.even>td {
background: #F7F7F7;
}
.table>tbody>tr.even>td:hover {
background: #F0F0F0;
}
.table>tbody>tr>td.stack {
padding: 0;
}
.stack-content {
padding: 0 20px 10px;
background-color: #FFF;
color: #666;
font-family: consolas,sans-serif;
font-size: 11px;
}
.info-box.level {
display: block;
padding: 0;
margin-bottom: 15px;
min-height: 70px;
background: #fff;
width: 100%;
box-shadow: 0 1px 1px rgba(0,0,0,0.1);
border-radius: 2px;
}
.info-box.level .info-box-text,
.info-box.level .info-box-number,
.info-box.level .info-box-icon > i {
text-shadow: 0 1px 1px rgba(0, 0, 0, 0.3);
}
.info-box.level .info-box-text {
display: block;
font-size: 14px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.info-box.level .info-box-content {
padding: 5px 10px;
margin-left: 70px;
}
.info-box.level .info-box-number {
display: block;
font-weight: bold;
font-size: 18px;
}
.info-box.level .info-box-icon {
border-radius: 2px 0 0 2px;
display: block;
float: left;
height: 70px; width: 70px;
text-align: center;
font-size: 40px;
line-height: 70px;
background: rgba(0,0,0,0.2);
}
.info-box.level .progress {
background: rgba(0,0,0,0.2);
margin: 5px -10px 5px -10px;
height: 2px;
}
.info-box.level .progress .progress-bar {
background: #fff;
}
.info-box.level-empty {
opacity: .6;
-webkit-filter: grayscale(1);
-moz-filter: grayscale(1);
-ms-filter: grayscale(1);
filter: grayscale(1);
-webkit-transition: all 0.2s ease-in-out;
-moz-transition: all 0.2s ease-in-out;
-o-transition: all 0.2s ease-in-out;
transition: all 0.2s ease-in-out;
-webkit-transition-property: -webkit-filter, opacity;
-moz-transition-property: -moz-filter, opacity;
-o-transition-property: filter, opacity;
transition-property: -webkit-filter, -moz-filter, -o-filter, filter, opacity;
}
.info-box.level-empty:hover {
opacity: 1;
-webkit-filter: grayscale(0);
-moz-filter: grayscale(0);
-ms-filter: grayscale(0);
filter: grayscale(0);
}
.level {
padding: 2px 6px;
text-shadow: 0 1px 1px rgba(0, 0, 0, 0.3);
border-radius: 2px;
font-size: .9em;
font-weight: 600;
}
.badge.level-all,
.badge.level-emergency,
.badge.level-alert,
.badge.level-critical,
.badge.level-error,
.badge.level-warning,
.badge.level-notice,
.badge.level-info,
.badge.level-debug,
.level, .level i,
.info-box.level-all,
.info-box.level-emergency,
.info-box.level-alert,
.info-box.level-critical,
.info-box.level-error,
.info-box.level-warning,
.info-box.level-notice,
.info-box.level-info,
.info-box.level-debug {
color: #FFF;
}
.label-env {
font-size: .85em;
}
.badge.level-all, .level.level-all, .info-box.level-all {
background-color: #8A8A8A;
}
.badge.level-emergency, .level.level-emergency, .info-box.level-emergency {
background-color: #B71C1C;
}
.badge.level-alert, .level.level-alert, .info-box.level-alert {
background-color: #D32F2F;
}
.badge.level-critical, .level.level-critical, .info-box.level-critical {
background-color: #F44336;
}
.badge.level-error, .level.level-error, .info-box.level-error {
background-color: #FF5722;
}
.badge.level-warning, .level.level-warning, .info-box.level-warning {
background-color: #FF9100;
}
.badge.level-notice, .level.level-notice, .info-box.level-notice {
background-color: #4CAF50;
}
.badge.level-info, .level.level-info, .info-box.level-info {
background-color: #1976D2;
}
.badge.level-debug, .level.level-debug, .info-box.level-debug {
background-color: #90CAF9;
}
.badge.level-empty, .level.level-empty {
background-color: #D1D1D1;
}
.badge.label-env, .label.label-env {
background-color: #6A1B9A;
}
</style>
@endpush

View File

@@ -0,0 +1,57 @@
@component('boilerplate::notifications.message')
{{-- Greeting --}}
@if (! empty($greeting))
# {{ $greeting }}
@else
@if ($level == 'error')
# Whoops!
@else
# {{ __('boilerplate::notifications.hello') }}
@endif
@endif
{{-- Intro Lines --}}
@foreach ($introLines as $line)
{{ $line }}
@endforeach
{{-- Action Button --}}
@if (isset($actionText))
<?php
switch ($level) {
case 'success':
$color = 'green';
break;
case 'error':
$color = 'red';
break;
default:
$color = 'blue';
}
?>
@component('mail::button', ['url' => $actionUrl, 'color' => $color])
{{ $actionText }}
@endcomponent
@endif
{{-- Outro Lines --}}
@foreach ($outroLines as $line)
{{ $line }}
@endforeach
<!-- Salutation -->
@if (! empty($salutation))
{!! $salutation !!}
@else
{!! __('boilerplate::notifications.salutation', ['name' => config('app.name') ]) !!}
@endif
<!-- Subcopy -->
@if (isset($actionText))
@component('mail::subcopy')
{{ __('boilerplate::notifications.subcopy', ['actionText' => $actionText, 'actionUrl' => $actionUrl]) }}
@endcomponent
@endif
@endcomponent

View File

@@ -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 --}}
@if (isset($subcopy))
@slot('subcopy')
@component('mail::subcopy')
{{ $subcopy }}
@endcomponent
@endslot
@endif
{{-- Footer --}}
@slot('footer')
@component('mail::footer')
{!! __('boilerplate::notifications.copyright', ['date' => date('Y'), 'name' => config('app.name')]) !!}
@endcomponent
@endslot
@endcomponent

View File

@@ -0,0 +1,17 @@
<div class="row">
<div class="col-md-6">
@include('boilerplate::plugins.demo.select2')
@include('boilerplate::plugins.demo.datepicker')
@include('boilerplate::plugins.demo.icheck')
@include('boilerplate::plugins.demo.codemirror')
@include('boilerplate::plugins.demo.fileinput')
@include('boilerplate::plugins.demo.tabs')
</div>
<div class="col-md-6">
@include('boilerplate::plugins.demo.tinymce')
@include('boilerplate::plugins.demo.datatables')
@include('boilerplate::plugins.demo.bootbox')
@include('boilerplate::plugins.demo.notify')
@include('boilerplate::plugins.demo.fullcalendar')
</div>
</div>

View File

@@ -0,0 +1,15 @@
@component('boilerplate::card', ['color' => 'pink', 'title' => 'Bootbox'])
<p><button class="btn btn-primary" onclick="bootbox.alert('Example')">bootbox.alert</button></p>
<pre class="prettyprint">bootbox.alert('Example')</pre>
<p><button class="btn btn-primary" onclick="bootbox.confirm('OK', function(result){ console.log('Result: ' + result); });">bootbox.confirm</button></p>
<pre class="prettyprint">bootbox.confirm("OK ?", function(result){ console.log('Result: ' + result); });</pre>
<p><button class="btn btn-primary" onclick="bootbox.prompt('Value', function(result){ console.log(result); });">bootbox.prompt</button></p>
<pre class="prettyprint">bootbox.prompt("Value", function(result){ console.log(result); });</pre>
<p><button class="btn btn-primary" onclick="bootbox.dialog({ message: '<h1>HTML message</h1><p>Hello there !</p>'})">bootbox.dialog</button></p>
<pre class="prettyprint">bootbox.dialog({ message: '&lt;h1>HTML message&lt;/h1>&lt;p>Hello there !&lt;/p>' });</pre>
@slot('footer')
<div class="small text-muted text-right">
<a href="http://bootboxjs.com/documentation.html" target="_blank">bootbox</a>
</div>
@endslot
@endcomponent

View File

@@ -0,0 +1,39 @@
@include('boilerplate::load.codemirror', ['theme' => 'storm'])
@push('js')
<script>
$(function () {
$('#code').codemirror();
})
</script>
@endpush
@component('boilerplate::card', ['color' => 'warning', 'title' => 'CodeMirror'])
Usage :
<pre>
&commat;include('boilerplate::load.codemirror', ['theme' => 'storm'])
&commat;push('js')
&lt;script>
var myCode = $('#code').codemirror();
// To get the value : myCode.getValue();
&lt;/script>
&commat;endpush</pre>
<textarea id="code"><h1>CodeMirror demo</h1>
<style>
.color {
color: red;
}
</style>
<script>
$(function () {
alert('demo');
});
</script>
</textarea>
@slot('footer')
<div class="small text-muted text-right">
<a href="https://codemirror.net/" target="_blank">CodeMirror</a>
</div>
@endslot
@endcomponent

View File

@@ -0,0 +1,64 @@
@include('boilerplate::load.datatables')
@push('js')
<script>
$(function() {
$('#dt').dataTable({
columns : [
null,
null,
{ render: function(data) { return moment(data).format('YYYY-MM-DD hh:mm') } }
]
});
});
</script>
@endpush
@component('boilerplate::card', ['color' => 'orange', 'title' => 'Datatables'])
Usage :
<pre class="mb-3">
&commat;include('boilerplate::load.datatables')
&commat;push('js')
&lt;script>
$('#dt').dataTable();
&lt;/script>
&commat;endpush</pre>
<table class="table table-sm table-striped table-hover" id="dt">
<thead>
<tr>
<th>Name</th>
<th>Email</th>
<th>Date</th>
</tr>
</thead>
<tbody>
<tr>
<td>Orlo Bashirian</td>
<td>qWaelchi@hotmail.com</td>
<td>2017-03-01 13:12</td>
</tr>
<tr>
<td>Martina Armstrong</td>
<td>Hertha92@yahoo.com</td>
<td>2016-06-08 14:16</td>
</tr>
<tr>
<td>Mandy Legros</td>
<td>Kirsten68@gmail.com</td>
<td>2017-08-15 12:10</td>
</tr>
<tr>
<td>Anne Franecki</td>
<td>Iva.shoen@hayley.com</td>
<td>2017-08-15 12:15</td>
</tr>
</tbody>
</table>
@slot('footer')
<div class="small text-muted text-right">
<a href="https://datatables.net/manual/index">datatables</a>
</div>
@endslot
@endcomponent

View File

@@ -0,0 +1,115 @@
@include('boilerplate::load.datepicker')
@push('js')
<script>
$(function() {
// Date range picker
$('#reservation').daterangepicker();
// Date range picker with time picker
$('#reservationtime').daterangepicker({timePicker: true, timePickerIncrement: 15, timePicker24Hour: true, format: 'MM/DD/YYYY hh:mm A'});
// Date range as a button
$('#daterange-btn').daterangepicker(
{
ranges: {
"Today": [moment(), moment()],
'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')],
'Last 7 days': [moment().subtract(6, 'days'), moment()],
'Last 30 days': [moment().subtract(29, 'days'), moment()],
'This month': [moment().startOf('month'), moment().endOf('month')],
'Last month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')]
},
startDate: moment().subtract(29, 'days'),
endDate: moment()
},
function (start, end) {
$('#daterange-btn span').html(start.format('MMMM D, YYYY') + ' - ' + end.format('MMMM D, YYYY'));
}
);
// Date picker
$('.datepicker').datetimepicker({
format: 'L'
});
$('.datetimepicker').datetimepicker();
});
</script>
@endpush
@component('boilerplate::card', ['color' => 'indigo', 'title' => 'Date picker'])
Usage
<pre>
&commat;include('boilerplate::load.datepicker')
&commat;push('js')
&lt;script>
$('.datepicker').datetimepicker({ format: "L" });
$('.datetimepicker').datetimepicker();
$('.daterangepicker').daterangepicker();
&lt;/script>
&commat;endpush</pre>
<!-- Date -->
<div class="form-group">
<label>Date</label>
<div class="input-group date">
<div class="input-group-append">
<div class="input-group-text"><i class="far fa-calendar-alt"></i></div>
</div>
<input type="text" class="form-control datepicker" id="datepicker" data-toggle="datetimepicker" data-target="#datepicker">
</div>
</div>
<!-- Datetime -->
<div class="form-group">
<label>Datetime</label>
<div class="input-group date">
<div class="input-group-append">
<div class="input-group-text"><i class="far fa-calendar-alt"></i></div>
</div>
<input type="text" class="form-control pull-right datetimepicker" id="datetimepicker" data-toggle="datetimepicker" data-target="#datetimepicker">
</div>
</div>
<!-- Date range -->
<div class="form-group">
<label>Date range</label>
<div class="input-group">
<div class="input-group-append">
<div class="input-group-text"><i class="far fa-calendar-alt"></i></div>
</div>
<input type="text" class="form-control pull-right" id="reservation">
</div>
</div>
<!-- Date and time range -->
<div class="form-group">
<label>Date and time range</label>
<div class="input-group">
<div class="input-group-append">
<div class="input-group-text"><i class="far fa-clock"></i></div>
</div>
<input type="text" class="form-control pull-right" id="reservationtime">
</div>
</div>
<!-- Date and time range -->
<div class="form-group">
<label>Date range button</label>
<div class="input-group">
<button type="button" class="btn btn-default pull-right" id="daterange-btn">
<span>
<i class="far fa-calendar-alt mr-2"></i>Date range picker
</span>
<i class="fa fa-caret-down"></i>
</button>
</div>
</div>
@slot('footer')
<div class="small text-muted text-right">
<a href="https://tempusdominus.github.io/bootstrap-4/" target="_blank">Tempus Dominus</a> /
<a href="https://www.daterangepicker.com" target="_blank">Date Range Picker</a>
</div>
@endslot
@endcomponent

View File

@@ -0,0 +1,24 @@
@include('boilerplate::load.fileinput')
@push('js')
<script>
$('#files').fileinput()
</script>
@endpush
@component('boilerplate::card', ['color' => 'primary', 'title' => 'Fileinput'])
Usage :
<pre>
&commat;include('boilerplate::load.fileinput')
&commat;push('js')
&lt;script>
$('#files').fileinput()
&lt;/script>
&commat;endpush</pre>
<input id="files" name="files" type="file" class="file" multiple>
@slot('footer')
<div class="text-muted small text-right">
<a href="https://plugins.krajee.com/file-input" target="_blank">bootstrap-fileinput</a>
</div>
@endslot
@endcomponent

View File

@@ -0,0 +1,39 @@
@include('boilerplate::load.fullcalendar')
@push('js')
<script>
$('#calendar').fullCalendar({
headerToolbar: {
left: 'prev,next today',
center: 'title',
right: 'dayGridMonth,timeGridWeek,timeGridDay,listMonth'
},
buttonIcons: false,
navLinks: true,
editable: true,
dayMaxEvents: true,
events: 'https://fullcalendar.io/demo-events.json?overload-day'
})
</script>
@endpush
@component('boilerplate::card', ['color' => 'success', 'title' => 'FullCalendar'])
Usage :
<pre>
&commat;include('boilerplate::load.fullcalendar')
&commat;push('js')
&lt;script>
var calendar = $('#calendar').fullCalendar({
buttonIcons: false,
});
&lt;/script>
&commat;endpush</pre>
<div id='calendar'></div>
@slot('footer')
<div class="text-muted small text-right">
<a href="https://fullcalendar.io" target="_blank">FullCalendar</a>
</div>
@endslot
@endcomponent

View File

@@ -0,0 +1,144 @@
@component('boilerplate::card', ['color' => 'success', 'title' => 'iCheck Bootstrap'])
<div class="row mb-3">
<div class="col-12">
Usage :
<pre>
&lt;div class="icheck-primary d-inline">
&lt;input type="checkbox" id="checkboxPrimary1">
&lt;label for="checkboxPrimary1">&lt;/label>
&lt;/div></pre>
</div>
</div>
<div class="row">
<div class="col-sm-6">
<div class="form-group clearfix">
<div class="icheck-primary d-inline">
<input type="checkbox" id="checkboxPrimary1" checked>
<label for="checkboxPrimary1">
</label>
</div>
<div class="icheck-primary d-inline">
<input type="checkbox" id="checkboxPrimary2">
<label for="checkboxPrimary2">
</label>
</div>
<div class="icheck-primary d-inline">
<input type="checkbox" id="checkboxPrimary3" disabled>
<label for="checkboxPrimary3">
Primary checkbox
</label>
</div>
</div>
</div>
<div class="col-sm-6">
<div class="form-group clearfix">
<div class="icheck-primary d-inline">
<input type="radio" id="radioPrimary1" name="r1" checked>
<label for="radioPrimary1">
</label>
</div>
<div class="icheck-primary d-inline">
<input type="radio" id="radioPrimary2" name="r1">
<label for="radioPrimary2">
</label>
</div>
<div class="icheck-primary d-inline">
<input type="radio" id="radioPrimary3" name="r1" disabled>
<label for="radioPrimary3">
Primary radio
</label>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-6">
<div class="form-group clearfix">
<div class="icheck-danger d-inline">
<input type="checkbox" checked id="checkboxDanger1">
<label for="checkboxDanger1">
</label>
</div>
<div class="icheck-danger d-inline">
<input type="checkbox" id="checkboxDanger2">
<label for="checkboxDanger2">
</label>
</div>
<div class="icheck-danger d-inline">
<input type="checkbox" disabled id="checkboxDanger3">
<label for="checkboxDanger3">
Danger checkbox
</label>
</div>
</div>
</div>
<div class="col-sm-6">
<div class="form-group clearfix">
<div class="icheck-danger d-inline">
<input type="radio" name="r2" checked id="radioDanger1">
<label for="radioDanger1">
</label>
</div>
<div class="icheck-danger d-inline">
<input type="radio" name="r2" id="radioDanger2">
<label for="radioDanger2">
</label>
</div>
<div class="icheck-danger d-inline">
<input type="radio" name="r2" disabled id="radioDanger3">
<label for="radioDanger3">
Danger radio
</label>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-6">
<div class="form-group clearfix">
<div class="icheck-success d-inline">
<input type="checkbox" checked id="checkboxSuccess1">
<label for="checkboxSuccess1">
</label>
</div>
<div class="icheck-success d-inline">
<input type="checkbox" id="checkboxSuccess2">
<label for="checkboxSuccess2">
</label>
</div>
<div class="icheck-success d-inline">
<input type="checkbox" disabled id="checkboxSuccess3">
<label for="checkboxSuccess3">
Success checkbox
</label>
</div>
</div>
</div>
<div class="col-sm-6">
<div class="form-group clearfix">
<div class="icheck-success d-inline">
<input type="radio" name="r3" checked id="radioSuccess1">
<label for="radioSuccess1">
</label>
</div>
<div class="icheck-success d-inline">
<input type="radio" name="r3" id="radioSuccess2">
<label for="radioSuccess2">
</label>
</div>
<div class="icheck-success d-inline">
<input type="radio" name="r3" disabled id="radioSuccess3">
<label for="radioSuccess3">
Success radio
</label>
</div>
</div>
</div>
</div>
@slot('footer')
<div class="text-right small text-muted">
<a href="https://bantikyan.github.io/icheck-bootstrap/">iCheck Bootstrap</a>
</div>
@endslot
@endcomponent

View File

@@ -0,0 +1,23 @@
@component('boilerplate::card', ['color' => 'danger', 'title' => 'Toastr / Growl'])
Usage :
<pre>
&lt;button class="btn btn-primary" onclick="growl('Example')">growl&lt;/button>
</pre>
<p><button class="btn btn-primary" onclick="growl('Example')">growl</button></p>
<pre class="prettyprint">growl('Example')</pre>
<p>
<button class="btn btn-info" onclick="growl('Example', 'info')">growl info</button>
<button class="btn btn-success" onclick="growl('Example', 'success')">growl success</button>
<button class="btn btn-warning" onclick="growl('Example', 'warning')">growl warning</button>
<button class="btn btn-danger" onclick="growl('Example', 'error')">growl error</button>
</p>
<pre class="prettyprint">growl('Example', 'success')</pre>
@slot('footer')
<div class="small text-muted text-right">
<a href="https://codeseven.github.io/toastr/">Toastr</a>
</div>
@endslot
@endcomponent

View File

@@ -0,0 +1,81 @@
@include('boilerplate::load.select2')
@push('js')
<script>
$(function() {
$(".select2").select2();
});
</script>
@endpush
@component('boilerplate::card', ['color' => 'primary', 'title' => 'Select 2'])
<div class="row">
<div class="col-12">
Usage :
<pre>
&commat;include('boilerplate::load.select2')
&commat;push('js')
&lt;script>
$('.select2').select2();
&lt;/script>
&commat;endpush</pre>
</div>
<div class="col-md-6">
<div class="form-group">
<label>Minimal</label>
<select class="form-control select2" style="width: 100%;">
<option selected="selected">Alabama</option>
<option>Alaska</option>
<option>California</option>
<option>Delaware</option>
<option>Tennessee</option>
<option>Texas</option>
<option>Washington</option>
</select>
</div>
<div class="form-group">
<label>Disabled</label>
<select class="form-control select2" disabled="disabled" style="width: 100%;">
<option selected="selected">Alabama</option>
<option>Alaska</option>
<option>California</option>
<option>Delaware</option>
<option>Tennessee</option>
<option>Texas</option>
<option>Washington</option>
</select>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label>Multiple</label>
<select class="form-control select2" multiple="multiple" data-placeholder="Multiple select" style="width: 100%;">
<option>Alabama</option>
<option>Alaska</option>
<option>California</option>
<option selected>Delaware</option>
<option>Tennessee</option>
<option selected>Texas</option>
<option>Washington</option>
</select>
</div>
<div class="form-group">
<label>Disabled Result</label>
<select class="form-control select2" style="width: 100%;">
<option selected="selected">Alabama</option>
<option>Alaska</option>
<option disabled="disabled">California (disabled)</option>
<option>Delaware</option>
<option>Tennessee</option>
<option>Texas</option>
<option>Washington</option>
</select>
</div>
</div>
</div>
@slot('footer')
<div class="small text-muted text-right">
<a href="https://select2.github.io/">select2</a>
</div>
@endslot
@endcomponent

View File

@@ -0,0 +1,26 @@
@component('boilerplate::card', ['tabs' => true])
@slot('header')
<ul class="nav nav-tabs" id="custom-tabs-two-tab" role="tablist">
<li class="nav-item">
<a class="nav-link active" id="tab1-tab" data-toggle="pill" href="#tab1" role="tab" aria-controls="custom-tabs-two-home" aria-selected="true">Tab 1</a>
</li>
<li class="nav-item">
<a class="nav-link" id="tab2-tab" data-toggle="pill" href="#tab2" role="tab" aria-controls="custom-tabs-two-profile" aria-selected="false">Tab 2</a>
</li>
<li class="nav-item">
<a class="nav-link" id="tab3-tab" data-toggle="pill" href="#tab3" role="tab" aria-controls="custom-tabs-two-messages" aria-selected="false">Tab 3</a>
</li>
</ul>
@endslot
<div class="tab-content" id="custom-tabs-two-tabContent">
<div class="tab-pane fade show active" id="tab1" role="tabpanel" aria-labelledby="tab1-tab">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin malesuada lacus ullamcorper dui molestie, sit amet congue quam finibus. Etiam ultricies nunc non magna feugiat commodo. Etiam odio magna, mollis auctor felis vitae, ullamcorper ornare ligula. Proin pellentesque tincidunt nisi, vitae ullamcorper felis aliquam id. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Proin id orci eu lectus blandit suscipit. Phasellus porta, ante et varius ornare, sem enim sollicitudin eros, at commodo leo est vitae lacus. Etiam ut porta sem. Proin porttitor porta nisl, id tempor risus rhoncus quis. In in quam a nibh cursus pulvinar non consequat neque. Mauris lacus elit, condimentum ac condimentum at, semper vitae lectus. Cras lacinia erat eget sapien porta consectetur.
</div>
<div class="tab-pane fade" id="tab2" role="tabpanel" aria-labelledby="tab2-tab">
Mauris tincidunt mi at erat gravida, eget tristique urna bibendum. Mauris pharetra purus ut ligula tempor, et vulputate metus facilisis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas sollicitudin, nisi a luctus interdum, nisl ligula placerat mi, quis posuere purus ligula eu lectus. Donec nunc tellus, elementum sit amet ultricies at, posuere nec nunc. Nunc euismod pellentesque diam.
</div>
<div class="tab-pane fade" id="tab3" role="tabpanel" aria-labelledby="tab3-tab">
Morbi turpis dolor, vulputate vitae felis non, tincidunt congue mauris. Phasellus volutpat augue id mi placerat mollis. Vivamus faucibus eu massa eget condimentum. Fusce nec hendrerit sem, ac tristique nulla. Integer vestibulum orci odio. Cras nec augue ipsum. Suspendisse ut velit condimentum, mattis urna a, malesuada nunc. Curabitur eleifend facilisis velit finibus tristique. Nam vulputate, eros non luctus efficitur, ipsum odio volutpat massa, sit amet sollicitudin est libero sed ipsum. Nulla lacinia, ex vitae gravida fermentum, lectus ipsum gravida arcu, id fermentum metus arcu vel metus. Curabitur eget sem eu risus tincidunt eleifend ac ornare magna.
</div>
</div>
@endcomponent

View File

@@ -0,0 +1,16 @@
@component('boilerplate::card', ['color' => 'info', 'title' => 'TinyMCE'])
Usage :
<pre>
&commat;include('boilerplate::load.tinymce')
&commat;push('js')
&lt;script>
$('#tiny').tinymce({});
&lt;/script>
&commat;endpush</pre>
@component('boilerplate::tinymce') @endcomponent
@slot('footer')
<div class="text-muted small text-right">
<a href="https://www.tiny.cloud/docs/" target="_blank">tinyMCE</a>
</div>
@endslot
@endcomponent

View File

@@ -0,0 +1,63 @@
@extends('boilerplate::layout.index', [
'title' => __('boilerplate::role.title'),
'subtitle' => __('boilerplate::role.create.title'),
'breadcrumb' => [
__('boilerplate::role.title') => 'boilerplate.roles.index',
__('boilerplate::role.create.title')
]
])
@section('content')
{{ Form::open(['route' => 'boilerplate.roles.store', 'autocomplete' => 'off']) }}
<div class="row">
<div class="col-12 mb-3">
<a href="{{ route("boilerplate.roles.index") }}" class="btn btn-default" data-toggle="tooltip" title="@lang('boilerplate::role.list.title')">
<span class="far fa-arrow-alt-circle-left text-muted"></span>
</a>
<span class="btn-group float-right">
<button type="submit" class="btn btn-primary">
@lang('boilerplate::role.savebutton')
</button>
</span>
</div>
</div>
<div class="row">
<div class="col-md-5">
@component('boilerplate::card', ['title' => 'boilerplate::role.parameters'])
@component('boilerplate::input', ['name' => 'display_name', 'label' => 'boilerplate::role.label', 'autofocus' => true])@endcomponent
@component('boilerplate::input', ['name' => 'description', 'label' => 'boilerplate::role.description'])@endcomponent
@endcomponent
</div>
@if(count($permissions_categories) > 0)
<div class="col-md-7">
@component('boilerplate::card', ['color' => 'teal', 'title' => 'boilerplate::role.permissions'])
@foreach($permissions_categories as $category)
<div class="permission_category">
<div class="h6">{{ $category->name }}</div>
<table class="table table-hover table-sm">
<tbody>
@foreach($category->permissions as $permission)
<tr>
<td style="width:25px;">
<div class="icheck-primary">
{{ Form::checkbox('permission['.$permission->id.']', 1, old('permission.'.$permission->id), ['id' => 'permission_'.$permission->id,]) }}
<label for="{{ 'permission_'.$permission->id }}"></label>
</div>
</td>
<td>
{{ Form::label('permission_'.$permission->id, __($permission->display_name), ['class' => 'mb-0', 'data-toggle' => 'tooltip', 'data-title' => $permission->name]) }}
<br/>
<small class="text-muted">{{ __($permission->description) }}</small>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
@endforeach
@endcomponent
</div>
@endif
</div>
{{ Form::close() }}
@endsection

View File

@@ -0,0 +1,68 @@
@extends('boilerplate::layout.index', [
'title' => __('boilerplate::role.title'),
'subtitle' => __('boilerplate::role.edit.title'),
'breadcrumb' => [
__('boilerplate::role.title') => 'boilerplate.roles.index',
__('boilerplate::role.edit.title')
]
])
@section('content')
{{ Form::open(['route' => ['boilerplate.roles.update', $role->id], 'method' => 'put', 'autocomplete' => 'off']) }}
<div class="row">
<div class="col-12 mb-3">
<a href="{{ route("boilerplate.roles.index") }}" class="btn btn-default" title="@lang('boilerplate::role.list.title')">
<span class="far fa-arrow-alt-circle-left text-muted"></span>
</a>
<span class="btn-group float-right">
<button type="submit" class="btn btn-primary">
@lang('boilerplate::role.savebutton')
</button>
</span>
</div>
</div>
<div class="row">
<div class="col-md-5">
@component('boilerplate::card', ['title' => __('boilerplate::role.parameters')])
{!! $errors->first('name','<p class="text-danger"><strong>:message</strong></p>') !!}
@component('boilerplate::input', ['name' => 'display_name', 'label' => 'boilerplate::role.label', 'value' => $role->display_name])@endcomponent
@component('boilerplate::input', ['name' => 'description', 'label' => 'boilerplate::role.description', 'value' => $role->description])@endcomponent
@endcomponent
</div>
@if(count($permissions_categories) > 0)
<div class="col-md-7">
@component('boilerplate::card', ['color' => 'teal', 'title' => __('boilerplate::role.permissions')])
@foreach($permissions_categories as $category)
<div class="permission_category">
<div class="h6">
{{ $category->name }}
</div>
<table class="table table-hover table-sm">
<tbody>
@foreach($category->permissions as $permission)
<tr>
<td style="width:25px;">
<div class="icheck-primary">
@if($role->id == 1)
<input type="checkbox" checked disabled class="icheck"/>
@else
{{ Form::checkbox('permission['.$permission->id.']', 1, old('permission.'.$permission->id, $role->permissions()->where(['id' => $permission->id])->count()), ['id' => 'permission_'.$permission->id, 'class' => 'icheck']) }}
@endif
<label for="{{ 'permission_'.$permission->id }}"></label>
</div>
</td>
<td>
{{ Form::label('permission_'.$permission->id, $permission->display_name, ['class' => 'mb-0', 'data-toggle' => 'tooltip', 'data-title' => $permission->name]) }}<br />
<small class="text-muted">{{ $permission->description }}</small>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
@endforeach
@endcomponent
</div>
@endif
{{ Form::close() }}
@endsection

View File

@@ -0,0 +1,94 @@
@extends('boilerplate::layout.index', [
'title' => __('boilerplate::role.title'),
'subtitle' => __('boilerplate::role.list.title'),
'breadcrumb' => [__('boilerplate::role.title')]
])
@section('content')
<div class="row">
<div class="col-sm-12 mb-3">
<span class="float-right">
<a href="{{ route("boilerplate.roles.create") }}" class="btn btn-primary">{{ __('boilerplate::role.create.title') }}</a>
</span>
</div>
</div>
@component('boilerplate::card')
<div class="table-responsive">
<table class="table table-striped table-hover va-middle" id="roles-table" style="width:100%">
<thead>
<tr>
<th>{{ __('boilerplate::role.label') }}</th>
<th>{{ __('boilerplate::role.description') }}</th>
<th>{{ __('boilerplate::role.permissions') }}</th>
<th>{{ __('boilerplate::role.list.nbusers') }}</th>
<th>{{-- buttons --}}</th>
</tr>
</thead>
<tbody>
@foreach($roles as $role)
<tr>
<td>
<strong data-toggle="tooltip" data-title="{{ $role->name }}">{{ $role->display_name }}</strong>
</td>
<td>
{{ $role->description }}<br />
</td>
<td>
{!! $role->permissions->implode('display_name', ', ') !!}
</td>
<td>
{{ $role->getNbUsers() }}
</td>
<td class="visible-on-hover" style="width:80px">
<a href="{{ route('boilerplate.roles.edit', $role->id) }}" class="btn btn-sm btn-primary">
<span class="fa fa-fw fa-pencil-alt"></span>
</a>
@if($role->name !== 'admin' &&
!(config('boilerplate.auth.register') && $role->name === config('boilerplate.auth.register_role')) &&
$role->getNbUsers() === 0)
<a href="{{ route('boilerplate.roles.destroy', $role->id) }}" class="btn btn-sm btn-danger destroy">
<span class="fa fa-fw fa-trash"></span>
</a>
@endif
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
@endcomponent
@endsection
@include('boilerplate::load.datatables')
@push('js')
<script>
$(function () {
$('#roles-table').dataTable({
ordering: false
});
$('#roles-table').on('click', '.destroy', function (e) {
e.preventDefault();
var href = $(this).attr('href');
var line = $(this).closest('tr');
bootbox.confirm("{{ __('boilerplate::role.list.confirmdelete') }}", function (result) {
if (result === false) return;
$.ajax({
url: href,
method: 'delete',
headers: {'X-CSRF-TOKEN': '{{ csrf_token() }}'},
success: function(){
line.remove();
growl("{{ __('boilerplate::role.list.deletesuccess') }}", 'success');
}
});
});
});
});
</script>
@endpush

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,12 +1,12 @@
(function(window,$){
$(function(){
window.{{ config('datatables-html.namespace', 'LaravelDataTables') }} = window.{{ config('datatables-html.namespace', 'LaravelDataTables') }} || {};
$.ajaxSetup({headers: {'X-CSRF-TOKEN': '{{csrf_token()}}'}});
window.LaravelDataTables = window.LaravelDataTables || {};
@foreach($editors as $editor)
var {{$editor->instance}} = window.LaravelDataTables["%1$s-{{$editor->instance}}"] = new $.fn.dataTable.Editor({!! $editor->toJson() !!});
var {{$editor->instance}} = window.{{ config('datatables-html.namespace', 'LaravelDataTables') }}["%1$s-{{$editor->instance}}"] = new $.fn.dataTable.Editor({!! $editor->toJson() !!});
{!! $editor->scripts !!}
@foreach ((array) $editor->events as $event)
{{$editor->instance}}.on('{!! $event['event'] !!}', {!! $event['script'] !!});
@endforeach
@endforeach
window.LaravelDataTables["%1$s"] = $("#%1$s").DataTable(%2$s);
})(window,jQuery);
window.{{ config('datatables-html.namespace', 'LaravelDataTables') }}["%1$s"] = $("#%1$s").DataTable(%2$s);
});

View File

@@ -0,0 +1,14 @@
window.dtx = window.dtx || {};
window.dtx["%1$s"] = function(opts) {
window.{{ config('datatables-html.namespace', 'LaravelDataTables') }} = window.{{ config('datatables-html.namespace', 'LaravelDataTables') }} || {};
@if(isset($editors))
@foreach($editors as $editor)
var {{$editor->instance}} = window.{{ config('datatables-html.namespace', 'LaravelDataTables') }}["%1$s-{{$editor->instance}}"] = new $.fn.dataTable.Editor({!! $editor->toJson() !!});
{!! $editor->scripts !!}
@foreach ((array) $editor->events as $event)
{{$editor->instance}}.on('{!! $event['event'] !!}', {!! $event['script'] !!});
@endforeach
@endforeach
@endif
return window.{{ config('datatables-html.namespace', 'LaravelDataTables') }}["%1$s"] = $("#%1$s").DataTable($.extend(%2$s, opts));
}

View File

@@ -1,6 +1,6 @@
window.LaravelDataTables = window.LaravelDataTables || {};
window.LaravelDataTables.options = %2$s
window.LaravelDataTables.editors = [];
window.{{ config('datatables-html.namespace', 'LaravelDataTables') }} = window.{{ config('datatables-html.namespace', 'LaravelDataTables') }} || {};
window.{{ config('datatables-html.namespace', 'LaravelDataTables') }}.options = %2$s
window.{{ config('datatables-html.namespace', 'LaravelDataTables') }}.editors = [];
@foreach($editors as $editor)
window.LaravelDataTables.editors["{{$editor->instance}}"] = {!! $editor->toJson() !!}
window.{{ config('datatables-html.namespace', 'LaravelDataTables') }}.editors["{{$editor->instance}}"] = {!! $editor->toJson() !!}
@endforeach

View File

@@ -15,7 +15,7 @@
<body>
<table class="table table-bordered table-condensed table-striped">
@foreach($data as $row)
@if ($row == reset($data))
@if ($loop->first)
<tr>
@foreach($row as $key => $value)
<th>{!! $key !!}</th>

View File

@@ -1 +1 @@
(function(window,$){window.LaravelDataTables=window.LaravelDataTables||{};window.LaravelDataTables["%1$s"]=$("#%1$s").DataTable(%2$s);})(window,jQuery);
$(function(){window.{{ config('datatables-html.namespace', 'LaravelDataTables') }}=window.{{ config('datatables-html.namespace', 'LaravelDataTables') }}||{};window.{{ config('datatables-html.namespace', 'LaravelDataTables') }}["%1$s"]=$("#%1$s").DataTable(%2$s);});

Some files were not shown because too many files have changed in this diff Show More