Compare commits

...

12 Commits
0.1.3 ... 0.2.3

Author SHA1 Message Date
Deon George
8aa21663d5 Changed body font size 2018-08-23 16:26:39 +10:00
Deon George
3af5ae6466 Remember sidebar collapse state 2018-08-12 17:01:50 +10:00
Deon George
f8d7432965 Added array_undot() helper 2018-08-11 15:11:34 +10:00
Deon George
98b7b9f6a8 Fix login and password resets forms 2018-08-08 00:14:48 +10:00
Deon George
f1787aaa32 Fixes for printing and page rendering improvements 2018-08-07 22:53:35 +10:00
Deon George
0bd32aab4a Layout updates, switch user updates 2018-08-01 16:29:14 +10:00
Deon George
444c159ab9 Added CompositeKeys Traits for Models with multiple primary keys 2018-07-31 12:56:29 +10:00
Deon George
55cbe4087c More improvements to User Switch 2018-07-17 13:27:25 +10:00
Deon George
ac867a2526 Enhancements to user switch 2018-07-13 14:39:10 +10:00
Deon George
b0fcdaa375 Added artisan command schedule:list 2018-06-15 14:14:04 +10:00
Deon George
55d369df47 Added helpers.php 2018-06-12 16:09:27 +10:00
Deon George
c5413d5b50 Added X-CSRF-TOKEN 2018-06-05 23:39:47 +10:00
17 changed files with 413 additions and 143 deletions

View File

@@ -18,7 +18,10 @@
"autoload": { "autoload": {
"psr-4": { "psr-4": {
"Leenooks\\": "src" "Leenooks\\": "src"
} },
"files": [
"src/helpers.php"
]
}, },
"extra": { "extra": {
"laravel": { "laravel": {

View File

@@ -24,7 +24,7 @@ return [
'conditions' => 'Terms and conditions', 'conditions' => 'Terms and conditions',
'register' => 'Register', 'register' => 'Register',
'login' => 'Login', 'login' => 'Login',
'membreship' => 'I already have a membership', 'membership' => 'I already have a membership',
'passwordclickreset' => 'Click here to reset your password:', 'passwordclickreset' => 'Click here to reset your password:',
'signGithub' => 'Sign in using Github', 'signGithub' => 'Sign in using Github',
'signFacebook' => 'Sign in using Facebook', 'signFacebook' => 'Sign in using Facebook',
@@ -51,35 +51,21 @@ return [
'level' => 'Level', 'level' => 'Level',
'here' => 'Here', 'here' => 'Here',
'recentactivity' => 'Recent Activity', 'recentactivity' => 'Recent Activity',
'descriptionpackage' => 'A Laravel 5 package that switchs default Laravel scaffolding/boilerplate to AdminLTE template',
'createdby' => 'Created by', 'createdby' => 'Created by',
'seecode' => 'See code at', 'seecode' => 'See code at',
'online' => 'Online', 'online' => 'Online',
'home' => 'Home', 'home' => 'Home',
'header' => 'HEADER', 'header' => 'HEADER',
'anotherlink' => 'Another Link',
'multilevel' => 'Multilevel',
'linklevel2' => 'Link in level2',
'birthday' => 'Langdon\'s Birthday',
'birthdaydate' => 'Will be 23 on April 24th',
'progress' => 'Tasks Progress', 'progress' => 'Tasks Progress',
'customtemplate' => 'Custom Template Design',
'statstab' => 'Stats Tab Content', 'statstab' => 'Stats Tab Content',
'generalset' => 'General Settings', 'generalset' => 'General Settings',
'reportpanel' => 'Report panel usage', 'reportpanel' => 'Report panel usage',
'checked' => 'checked', 'checked' => 'checked',
'informationsettings' => 'Some information about this general settings option',
'togglenav' => 'Toggle navigation', 'togglenav' => 'Toggle navigation',
'tabmessages' => 'You have 4 messages',
'supteam' => 'Support Team', 'supteam' => 'Support Team',
'awesometheme' => 'Why not buy a new awesome theme?',
'allmessages' => 'See All Messages', 'allmessages' => 'See All Messages',
'notifications' => 'You have 10 notifications',
'newmembers' => '5 new members joined today',
'viewall' => 'View all', 'viewall' => 'View all',
'tasks' => 'You have 9 tasks',
'alltasks' => 'View all tasks', 'alltasks' => 'View all tasks',
'desbuttons' => 'Design some buttons',
'complete' => 'Complete', 'complete' => 'Complete',
'membersince' => 'Member since', 'membersince' => 'Member since',
'followers' => 'Followers', 'followers' => 'Followers',
@@ -87,26 +73,15 @@ return [
'friends' => 'Friends', 'friends' => 'Friends',
'profile' => 'Profile', 'profile' => 'Profile',
'signout' => 'Sign out', 'signout' => 'Sign out',
'landingdescription' => 'Laravel 5 package that switchs default Laravel scaffolding/boilerplate to AdminLTE template with Bootstrap 3.0 and Pratt Landing page',
'landingdescriptionpratt' => 'Acacha AdminLTE Laravel package template Landing page - Using Pratt',
'description' => 'Description',
'showcase' => 'Showcase', 'showcase' => 'Showcase',
'contact' => 'Contact', 'contact' => 'Contact',
'laravelpackage' => '5 package that switchs default Laravel',
'to' => 'to', 'to' => 'to',
'templatewith' => 'template with',
'and' => 'and', 'and' => 'and',
'gedstarted' => 'Get Started!', 'gedstarted' => 'Get Started!',
'amazing' => 'Amazing admin template',
'basedadminlte' => 'Based on adminlte bootstrap theme',
'awesomepackaged' => 'Awesome packaged...',
'by' => 'by', 'by' => 'by',
'at' => 'at', 'at' => 'at',
'readytouse' => 'ready to use with Laravel!',
'designed' => 'Designed To Excel',
'community' => 'Community', 'community' => 'Community',
'see' => 'See', 'see' => 'See',
'githubproject' => 'Github project',
'post' => 'post', 'post' => 'post',
'issues' => 'issues', 'issues' => 'issues',
'pullrequests' => 'Pull requests', 'pullrequests' => 'Pull requests',
@@ -114,10 +89,6 @@ return [
'monitoring' => 'Monitoring', 'monitoring' => 'Monitoring',
'whatnew' => 'What\'s New?', 'whatnew' => 'What\'s New?',
'features' => 'Some Features', 'features' => 'Some Features',
'design' => 'First Class Design',
'retina' => 'Retina Ready Theme',
'support' => 'Awesome Support',
'responsive' => 'Responsive Design',
'screenshots' => 'Some Screenshots', 'screenshots' => 'Some Screenshots',
'address' => 'Address', 'address' => 'Address',
'dropus' => 'Drop Us A Line', 'dropus' => 'Drop Us A Line',
@@ -136,4 +107,7 @@ return [
'loggedin' => 'Logged in!', 'loggedin' => 'Logged in!',
'entering' => 'Entering...', 'entering' => 'Entering...',
'registered' => 'User Registered!', 'registered' => 'User Registered!',
'switchoff' => 'Switch Back',
'success' => 'Success!',
'resetemaillink' => 'We have e-mailed your password reset link!',
]; ];

View File

@@ -1,53 +1,54 @@
@extends('adminlte::layouts.auth') @extends('adminlte::layouts.auth')
@section('htmlheader_title') @section('htmlheader_title')
Log in Log in
@endsection @endsection
@section('content') @section('content')
<body class="hold-transition login-page"> <body class="hold-transition login-page">
<div id="app" v-cloak> <div id="app" v-cloak>
<div class="login-box"> <div class="login-box">
<div class="login-logo"> <div class="login-logo">
<a href="{{ url('/home') }}">{!! config('app.name_html_long') !!}</a> <a href="{{ url('/home') }}">{!! config('app.name_html_long') !!}</a>
</div><!-- /.login-logo --> </div><!-- /.login-logo -->
@if (count($errors) > 0) @if (count($errors) > 0)
<div class="alert alert-danger"> <div class="alert alert-danger">
<strong>Whoops!</strong> {{ trans('adminlte_lang::message.someproblems') }}<br><br> <strong>Whoops!</strong> {{ trans('adminlte_lang::message.someproblems') }}<br><br>
<ul> <ul>
@foreach ($errors->all() as $error) @foreach ($errors->all() as $error)
<li>{{ $error }}</li> <li>{{ $error }}</li>
@endforeach @endforeach
</ul> </ul>
</div> </div>
@endif @endif
<div class="login-box-body"> <div class="login-box-body">
<p class="login-box-msg"> {{ trans('adminlte_lang::message.siginsession') }} </p> <p class="login-box-msg">{{ trans('adminlte_lang::message.siginsession') }}</p>
<login-form name="{{ config('auth.providers.users.field','email') }}" <login-form name="{{ config('auth.providers.users.field','email') }}"
domain="{{ config('auth.defaults.domain','') }}"></login-form> domain="{{ config('auth.defaults.domain','') }}"></login-form>
<a href="{{ url('/password/reset') }}">{{ trans('adminlte_lang::message.forgotpassword') }}</a><br> <a href="{{ url('/password/reset') }}">{{ trans('adminlte_lang::message.forgotpassword') }}</a><br>
@if(count(config('auth.social',[]))) @if(count(config('auth.social',[])))
@include('adminlte::auth.partials.social_login') @include('adminlte::auth.partials.social_login')
@endif @endif
</div> </div><!-- /.login-box-body -->
</div>
</div>
@include('adminlte::layouts.partials.scripts_auth') </div><!-- /.login-box -->
</div>
<script> @include('adminlte::layouts.partials.scripts_auth')
$(function () {
$('input').iCheck({ <script>
checkboxClass: 'icheckbox_square-blue', $(function () {
radioClass: 'iradio_square-blue', $('input').iCheck({
increaseArea: '20%' // optional checkboxClass: 'icheckbox_square-blue',
}); radioClass: 'iradio_square-blue',
}); increaseArea: '20%' // optional
</script> });
});
</script>
</body> </body>
@endsection @endsection

View File

@@ -1,59 +1,45 @@
@extends('adminlte::layouts.auth') @extends('adminlte::layouts.auth')
@section('htmlheader_title') @section('htmlheader_title')
Password recovery Password recovery
@endsection @endsection
@section('content') @section('content')
<body class="hold-transition login-page">
<div id="app" v-cloak>
<div class="login-box">
<div class="login-logo">
<a href="{{ url('/home') }}">{!! config('app.name_html_long') !!}</a>
</div><!-- /.login-logo -->
<body class="login-page"> @if (session('status'))
<div id="app"> <div class="alert alert-success">
{{ session('status') }}
</div>
@endif
<div class="login-box"> @if (count($errors) > 0)
<div class="login-logo"> <div class="alert alert-danger">
<a href="{{ url('/home') }}"><b>Admin</b>LTE</a> <strong>Whoops!</strong> {{ trans('adminlte_lang::message.someproblems') }}<br><br>
</div><!-- /.login-logo --> <ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
@if (session('status')) <div class="login-box-body">
<div class="alert alert-success"> <p class="login-box-msg">{{ trans('adminlte_lang::message.passwordreset') }}</p>
{{ session('status') }}
</div>
@endif
@if (count($errors) > 0) <email-reset-password-form></email-reset-password-form>
<div class="alert alert-danger">
<strong>Whoops!</strong> {{ trans('adminlte_lang::message.someproblems') }}<br><br>
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<div class="login-box-body"> <a href="{{ url('/login') }}">Log in</a><br>
<p class="login-box-msg">Reset Password</p> </div><!-- /.login-box-body -->
<email-reset-password-form></email-reset-password-form> </div><!-- /.login-box -->
</div>
<a href="{{ url('/login') }}">Log in</a><br> @include('adminlte::layouts.partials.scripts_auth')
</div><!-- /.login-box-body -->
</div><!-- /.login-box -->
</div>
@include('adminlte::layouts.partials.scripts_auth')
<script>
$(function () {
$('input').iCheck({
checkboxClass: 'icheckbox_square-blue',
radioClass: 'iradio_square-blue',
increaseArea: '20%' // optional
});
});
</script>
</body> </body>
@endsection
@endsection

View File

@@ -0,0 +1,46 @@
@extends('adminlte::layouts.auth')
@section('htmlheader_title')
Password reset
@endsection
@section('content')
<body class="hold-transition login-page">
<div id="app" v-cloak>
<div class="login-box">
<div class="login-logo">
<a href="{{ url('/home') }}">{!! config('app.name_html_long') !!}</a>
</div><!-- /.login-logo -->
@if (session('status'))
<div class="alert alert-success">
{{ session('status') }}
</div>
@endif
@if (count($errors) > 0)
<div class="alert alert-danger">
<strong>Whoops!</strong> {{ trans('adminlte_lang::message.someproblems') }}<br><br>
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<div class="login-box-body">
<p class="login-box-msg">{{ trans('adminlte_lang::message.passwordreset') }}</p>
<reset-password-form token="{{ $token }}">></reset-password-form>
<a href="{{ url('/login') }}">Log in</a><br>
<a href="{{ url('/register') }}" class="text-center">{{ trans('adminlte_lang::message.register') }}</a>
</div><!-- /.login-box-body -->
</div><!-- /.login-box -->
</div>
@include('adminlte::layouts.partials.scripts_auth')
</body>
@endsection

View File

@@ -10,7 +10,7 @@
<div id="app" v-cloak> <div id="app" v-cloak>
<div class="register-box"> <div class="register-box">
<div class="register-logo"> <div class="register-logo">
<a href="{{ url('/home') }}"><b>Pipeline</b>Management</a> <a href="{{ url('/home') }}">{!! config('app.name_html_long') !!}</a>
</div> </div>
@if (count($errors) > 0) @if (count($errors) > 0)

View File

@@ -5,8 +5,8 @@
@include('adminlte::layouts.partials.htmlheader') @include('adminlte::layouts.partials.htmlheader')
@show @show
<body class="fixed skin-blue sidebar-mini"> <body class="fixed hold-transition skin-blue sidebar-mini">
<div id="app" v-cloak> <div id="app">
<div class="wrapper"> <div class="wrapper">
@include('adminlte::layouts.partials.mainheader') @include('adminlte::layouts.partials.mainheader')

View File

@@ -1,5 +1,5 @@
<!-- Main Footer --> <!-- Main Footer -->
<footer class="main-footer"> <footer class="main-footer no-print">
<!-- To the right --> <!-- To the right -->
<div class="pull-right hidden-xs"> <div class="pull-right hidden-xs">
<a href="#"></a><b>{{ config('app.name') }}</b></a> <a href="#"></a><b>{{ config('app.name') }}</b></a>

View File

@@ -1,5 +1,6 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>{{ config('app.name') }} - @yield('htmlheader_title', 'Your title here')</title> <title>{{ config('app.name') }} - @yield('htmlheader_title', 'Your title here')</title>
<meta content='width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no' name='viewport'> <meta content='width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no' name='viewport'>
<!-- CSRF Token --> <!-- CSRF Token -->
@@ -14,6 +15,34 @@
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]--> <![endif]-->
<style type="text/css">
@media screen, print {
body {
color: #333;
font-weight: 400;
font-size: 14px;
}
label {
font-weight: bold;
}
}
@media print {
body {
font-size: 12px;
}
tr { page-break-inside:avoid; }
thead { display:table-header-group; }
tfoot { display:table-footer-group; }
.table-responsive {
overflow: visible !important;
}
}
</style>
<script> <script>
//See https://laracasts.com/discuss/channels/vue/use-trans-in-vuejs //See https://laracasts.com/discuss/channels/vue/use-trans-in-vuejs
window.trans = window.trans =
@@ -32,4 +61,4 @@
<!-- STYLESHEETS --> <!-- STYLESHEETS -->
{!! Asset::styles() !!} {!! Asset::styles() !!}
</head> </head>

View File

@@ -45,7 +45,7 @@
<!-- Top Menu Items --> <!-- Top Menu Items -->
@include('adminlte::layouts.partials.topmenu') @include('adminlte::layouts.partials.topmenu')
<li class="dropdown user user-menu" id="user_menu"> <li class="dropdown user user-menu @if($user->switched) bg-red @endif" id="user_menu">
<!-- Menu Toggle Button --> <!-- Menu Toggle Button -->
<a href="#" class="dropdown-toggle" data-toggle="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown">
<!-- The user image in the navbar--> <!-- The user image in the navbar-->
@@ -69,16 +69,22 @@
</div> </div>
<div class="pull-right"> <div class="pull-right">
<a href="{{ url('/logout') }}" class="btn btn-default btn-flat" id="logout" @if ($user->switched)
onclick="event.preventDefault(); <a href="{{ url('/admin/switch/stop') }}" class="btn btn-default btn-flat" id="switch">
document.getElementById('logout-form').submit();"> {{ trans('adminlte_lang::message.switchoff') }}
{{ trans('adminlte_lang::message.signout') }} </a>
</a> @else
<a href="{{ url('/logout') }}" class="btn btn-default btn-flat" id="logout"
onclick="event.preventDefault();
document.getElementById('logout-form').submit();">
{{ trans('adminlte_lang::message.signout') }}
</a>
<form id="logout-form" action="{{ url('/logout') }}" method="POST" style="display: none;"> <form id="logout-form" action="{{ url('/logout') }}" method="POST" style="display: none;">
{{ csrf_field() }} {{ csrf_field() }}
<input type="submit" value="logout" style="display: none;"> <input type="submit" value="logout" style="display: none;">
</form> </form>
@endif
</div> </div>
</li> </li>
</ul> </ul>
@@ -95,4 +101,4 @@
</ul> </ul>
</div> </div>
</nav> </nav>
</header> </header>

View File

@@ -4,9 +4,57 @@
<!-- Laravel App --> <!-- Laravel App -->
<script src="{{ url(mix('/js/app.js')) }}" type="text/javascript"></script> <script src="{{ url(mix('/js/app.js')) }}" type="text/javascript"></script>
<!-- Our our CSRF token to each interaction -->
{{-- @todo Test that we are validating this, also axios should be doing this for us? --}}
<script type="text/javascript">
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
$.AdminLTESidebarTweak = {};
$.AdminLTESidebarTweak.options = {
EnableRemember: true,
//Removes the transition after page reload.
NoTransitionAfterReload: false
};
$(function () {
"use strict";
$("body").on("collapsed.pushMenu", function(){
if($.AdminLTESidebarTweak.options.EnableRemember){
document.cookie = "toggleState=closed";
}
});
$("body").on("expanded.pushMenu", function(){
if($.AdminLTESidebarTweak.options.EnableRemember){
document.cookie = "toggleState=opened";
}
});
if($.AdminLTESidebarTweak.options.EnableRemember){
var re = new RegExp('toggleState' + "=([^;]+)");
var value = re.exec(document.cookie);
var toggleState = (value != null) ? unescape(value[1]) : null;
if(toggleState == 'closed'){
if($.AdminLTESidebarTweak.options.NoTransitionAfterReload){
$("body").addClass('sidebar-collapse hold-transition').delay(100).queue(function(){
$(this).removeClass('hold-transition');
});
}else{
$("body").addClass('sidebar-collapse');
}
}
}
});
</script>
<!-- Optionally, you can add Slimscroll and FastClick plugins. <!-- Optionally, you can add Slimscroll and FastClick plugins.
Both of these plugins are recommended to enhance the Both of these plugins are recommended to enhance the
user experience. Slimscroll is required when using the user experience. Slimscroll is required when using the
fixed layout. --> fixed layout. -->
@js('/site/js/jquery.slimscroll.min.js','jq.slimscroll'); @js('/site/js/jquery.slimscroll.min.js','jq.slimscroll')
@js('/site/js/fastclick.min.js','jq.fastclick'); @js('/site/js/fastclick.min.js','jq.fastclick')

View File

@@ -1,5 +1,5 @@
<ul class="sidebar-menu" data-widget="tree"> <ul class="sidebar-menu" data-widget="tree">
<li class="header">Menu</li> <li class="header"><b>MENU</b></li>
<!-- Optionally, you can add icons to the links --> <!-- Optionally, you can add icons to the links -->
<li @if(Route::current()->getName() == 'home')class="active"@endif><a href="{{ url('home',['date'=>(isset($ido) ? $ido->id : NULL)]) }}"><i class='fa fa-link'></i> <span>{{ trans('adminlte_lang::message.home') }}</span></a></li> <li @if(Route::current()->getName() == 'home')class="active"@endif><a href="{{ url('home',['date'=>(isset($ido) ? $ido->id : NULL)]) }}"><i class='fa fa-link'></i> <span>{{ trans('adminlte_lang::message.home') }}</span></a></li>
</ul> </ul>

View File

@@ -0,0 +1,66 @@
<?php
namespace Leenooks\Commands;
use Illuminate\Console\Command;
use Illuminate\Console\Scheduling\Schedule;
class ScheduleList extends Command
{
protected $signature = 'schedule:list';
protected $description = 'List when scheduled commands are executed.';
/**
* @var Schedule
*/
protected $schedule;
/**
* ScheduleList constructor.
*
* @param Schedule $schedule
*/
public function __construct(Schedule $schedule)
{
parent::__construct();
$this->schedule = $schedule;
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$events = array_map(function ($event) {
return [
'cron' => $event->expression,
'command' => static::fixupCommand($event->command),
];
}, $this->schedule->events());
$this->table(
['Cron', 'Command'],
$events
);
}
/**
* If it's an artisan command, strip off the PHP
*
* @param $command
* @return string
*/
protected static function fixupCommand($command)
{
$parts = explode(' ', $command);
if (count($parts) > 2 && $parts[1] === "'artisan'") {
array_shift($parts);
}
return implode(' ', $parts);
}
}

View File

@@ -2,12 +2,13 @@
namespace Leenooks\Controllers; namespace Leenooks\Controllers;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\User;
use Auth;
use Redirect; use Redirect;
use Session; use Session;
use App\User;
class AdminController extends Controller class AdminController extends Controller
{ {
public function __construct() public function __construct()
@@ -15,12 +16,22 @@ class AdminController extends Controller
$this->middleware('auth'); $this->middleware('auth');
} }
public function switch_authorised($id)
{
return (method_exists(Auth::user(),'isAdmin') && Auth::user()->isAdmin($id)) ? TRUE : FALSE;
}
public function switch_session()
{
return ! Session::get('orig_user');
}
/** /**
* @todo Change the background color (or something) so we know we are switched * @todo Change the background color (or something) so we know we are switched
*/ */
public function user_switch_start($id) public function user_switch_start($id)
{ {
if ($this->switch_authorised()) if ($this->switch_session() AND $this->switch_authorised($id))
{ {
$uo = User::find($id); $uo = User::find($id);
@@ -43,11 +54,4 @@ class AdminController extends Controller
return Redirect::to('/home'); return Redirect::to('/home');
} }
}
public function switch_authorised()
{
// @todo
return TRUE;
}
}

View File

@@ -0,0 +1,57 @@
<?php
namespace Leenooks\Traits;
use Illuminate\Database\Eloquent\Builder;
/**
* Trait CompositeKeys
* Enable Models to have multiple primary keys
*
* Need to add to the Model...
* public $incrementing = false;
* protected $primaryKey = [<ARRAY_OF_KEYS>];
*
* @package Leenooks\Traits
*/
trait CompositeKeys {
/**
* Set the keys for a save update query.
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @return \Illuminate\Database\Eloquent\Builder
*/
protected function setKeysForSaveQuery(Builder $query)
{
$keys = $this->getKeyName();
if (! is_array($keys)) {
return parent::setKeysForSaveQuery($query);
}
foreach($keys as $keyName) {
$query->where($keyName, '=', $this->getKeyForSaveQuery($keyName));
}
return $query;
}
/**
* Get the primary key value for a save query.
*
* @param mixed $keyName
* @return mixed
*/
protected function getKeyForSaveQuery($keyName = null)
{
if (is_null($keyName)) {
$keyName = $this->getKeyName();
}
if (isset($this->original[$keyName])) {
return $this->original[$keyName];
}
return $this->getAttribute($keyName);
}
}

21
src/Traits/UserSwitch.php Normal file
View File

@@ -0,0 +1,21 @@
<?php
/**
* Check if users have been switched
*/
namespace Leenooks\Traits;
use Session;
trait UserSwitch
{
public function getSwitchedAttribute()
{
return Session::get('orig_user');
}
public function isAdmin($id)
{
return isset($this->admin) ? $this->admin : FALSE;
}
}

29
src/helpers.php Normal file
View File

@@ -0,0 +1,29 @@
<?php
// is_json helper
if (! function_exists('is_json')) {
function is_json($string) {
try {
json_decode($string);
} catch (\Exception $e) {
return FALSE;
}
return (json_last_error() == JSON_ERROR_NONE);
}
}
// Inverse of array_dot()
if (! function_exists('array_undot')) {
function array_undot($dotNotationArray)
{
$array = [];
foreach ($dotNotationArray as $key => $value) {
array_set($array, $key, $value);
}
return $array;
}
}