mirror of
https://github.com/snipe/snipe-it.git
synced 2025-01-11 22:07:29 -08:00
Add a manager field to locations.
This is round one of the rethink of checkout-to-everything. A location now has a manager field, and the manager (by default) be responsible for assets checked out to the location.
This commit is contained in:
parent
966a736602
commit
f0d78091d2
|
@ -21,7 +21,7 @@ class LocationsController extends Controller
|
||||||
{
|
{
|
||||||
$this->authorize('view', Location::class);
|
$this->authorize('view', Location::class);
|
||||||
$allowed_columns = ['id','name','address','address2','city','state','country','zip','created_at',
|
$allowed_columns = ['id','name','address','address2','city','state','country','zip','created_at',
|
||||||
'updated_at','parent_id'];
|
'updated_at','parent_id', 'manager_id'];
|
||||||
|
|
||||||
$locations = Location::select([
|
$locations = Location::select([
|
||||||
'locations.id',
|
'locations.id',
|
||||||
|
@ -33,6 +33,7 @@ class LocationsController extends Controller
|
||||||
'locations.zip',
|
'locations.zip',
|
||||||
'locations.country',
|
'locations.country',
|
||||||
'locations.parent_id',
|
'locations.parent_id',
|
||||||
|
'locations.manager_id',
|
||||||
'locations.created_at',
|
'locations.created_at',
|
||||||
'locations.updated_at',
|
'locations.updated_at',
|
||||||
'locations.currency'
|
'locations.currency'
|
||||||
|
|
|
@ -63,7 +63,8 @@ class LocationsController extends Controller
|
||||||
|
|
||||||
return view('locations/edit')
|
return view('locations/edit')
|
||||||
->with('location_options', $location_options)
|
->with('location_options', $location_options)
|
||||||
->with('item', new Location);
|
->with('item', new Location)
|
||||||
|
->with('manager_list', Helper::managerList());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -88,6 +89,7 @@ class LocationsController extends Controller
|
||||||
$location->state = Input::get('state');
|
$location->state = Input::get('state');
|
||||||
$location->country = Input::get('country');
|
$location->country = Input::get('country');
|
||||||
$location->zip = Input::get('zip');
|
$location->zip = Input::get('zip');
|
||||||
|
$location->manager_id = Input::get('manager_id');
|
||||||
$location->user_id = Auth::id();
|
$location->user_id = Auth::id();
|
||||||
|
|
||||||
if ($location->save()) {
|
if ($location->save()) {
|
||||||
|
@ -154,7 +156,10 @@ class LocationsController extends Controller
|
||||||
$location_options = Location::flattenLocationsArray($location_options_array);
|
$location_options = Location::flattenLocationsArray($location_options_array);
|
||||||
$location_options = array('' => 'Top Level') + $location_options;
|
$location_options = array('' => 'Top Level') + $location_options;
|
||||||
|
|
||||||
return view('locations/edit', compact('item'))->with('location_options', $location_options);
|
|
||||||
|
return view('locations/edit', compact('item'))
|
||||||
|
->with('location_options', $location_options)
|
||||||
|
->with('manager_list', Helper::managerList());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -185,6 +190,7 @@ class LocationsController extends Controller
|
||||||
$location->country = Input::get('country');
|
$location->country = Input::get('country');
|
||||||
$location->zip = Input::get('zip');
|
$location->zip = Input::get('zip');
|
||||||
$location->ldap_ou = Input::get('ldap_ou');
|
$location->ldap_ou = Input::get('ldap_ou');
|
||||||
|
$location->manager_id = Input::get('manager_id');
|
||||||
|
|
||||||
// Was the location updated?
|
// Was the location updated?
|
||||||
if ($location->save()) {
|
if ($location->save()) {
|
||||||
|
|
|
@ -376,7 +376,6 @@ class UsersController extends Controller
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($user->licenses()->count() > 0) {
|
if ($user->licenses()->count() > 0) {
|
||||||
|
|
||||||
// Redirect to the user management page
|
// Redirect to the user management page
|
||||||
return redirect()->route('users.index')->with('error', 'This user still has ' . $user->licenses()->count() . ' licenses associated with them.');
|
return redirect()->route('users.index')->with('error', 'This user still has ' . $user->licenses()->count() . ' licenses associated with them.');
|
||||||
}
|
}
|
||||||
|
@ -386,6 +385,11 @@ class UsersController extends Controller
|
||||||
return redirect()->route('users.index')->with('error', 'This user still has ' . $user->accessories()->count() . ' accessories associated with them.');
|
return redirect()->route('users.index')->with('error', 'This user still has ' . $user->accessories()->count() . ' accessories associated with them.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($user->managedLocations()->count() > 0) {
|
||||||
|
// Redirect to the user management page
|
||||||
|
return redirect()->route('users.index')->with('error', 'This user still has ' . $user->managedLocations()->count() . ' locations that they manage.');
|
||||||
|
}
|
||||||
|
|
||||||
// Delete the user
|
// Delete the user
|
||||||
$user->delete();
|
$user->delete();
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ use App\Helpers\Helper;
|
||||||
class LocationsTransformer
|
class LocationsTransformer
|
||||||
{
|
{
|
||||||
|
|
||||||
public function transformLocations (Collection $locations, $total)
|
public function transformLocations(Collection $locations, $total)
|
||||||
{
|
{
|
||||||
$array = array();
|
$array = array();
|
||||||
foreach ($locations as $location) {
|
foreach ($locations as $location) {
|
||||||
|
@ -18,17 +18,16 @@ class LocationsTransformer
|
||||||
return (new DatatablesTransformer)->transformDatatables($array, $total);
|
return (new DatatablesTransformer)->transformDatatables($array, $total);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function transformLocation (Location $location = null)
|
public function transformLocation(Location $location = null)
|
||||||
{
|
{
|
||||||
if ($location) {
|
if ($location) {
|
||||||
|
|
||||||
$assets_arr = [];
|
$assets_arr = [];
|
||||||
foreach($location->assets() as $asset) {
|
foreach ($location->assets() as $asset) {
|
||||||
$assets_arr = ['id' => $asset->id];
|
$assets_arr = ['id' => $asset->id];
|
||||||
}
|
}
|
||||||
|
|
||||||
$children_arr = [];
|
$children_arr = [];
|
||||||
foreach($location->childLocations() as $child) {
|
foreach ($location->childLocations() as $child) {
|
||||||
$children_arr = ['id' => $child->id];
|
$children_arr = ['id' => $child->id];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,6 +44,7 @@ class LocationsTransformer
|
||||||
'created_at' => Helper::getFormattedDateObject($location->created_at, 'datetime'),
|
'created_at' => Helper::getFormattedDateObject($location->created_at, 'datetime'),
|
||||||
'updated_at' => Helper::getFormattedDateObject($location->updated_at, 'datetime'),
|
'updated_at' => Helper::getFormattedDateObject($location->updated_at, 'datetime'),
|
||||||
'parent_id' => e($location->parent_id),
|
'parent_id' => e($location->parent_id),
|
||||||
|
'manager' => ($location->manager) ? (new UsersTransformer)->transformUser($location->manager) : '',
|
||||||
'children' => $children_arr,
|
'children' => $children_arr,
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@ -54,13 +54,7 @@ class LocationsTransformer
|
||||||
];
|
];
|
||||||
|
|
||||||
$array += $permissions_array;
|
$array += $permissions_array;
|
||||||
|
|
||||||
return $array;
|
return $array;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,6 +24,7 @@ class Location extends SnipeModel
|
||||||
'address' => 'max:80|nullable',
|
'address' => 'max:80|nullable',
|
||||||
'address2' => 'max:80|nullable',
|
'address2' => 'max:80|nullable',
|
||||||
'zip' => 'min:3|max:10|nullable',
|
'zip' => 'min:3|max:10|nullable',
|
||||||
|
// 'manager_id' => 'exists:users'
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -66,6 +67,11 @@ class Location extends SnipeModel
|
||||||
return $this->belongsTo('\App\Models\Location', 'parent_id');
|
return $this->belongsTo('\App\Models\Location', 'parent_id');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function manager()
|
||||||
|
{
|
||||||
|
return $this->belongsTo('\App\Models\User', 'manager_id');
|
||||||
|
}
|
||||||
|
|
||||||
public function childLocations()
|
public function childLocations()
|
||||||
{
|
{
|
||||||
return $this->hasMany('\App\Models\Location', 'parent_id');
|
return $this->hasMany('\App\Models\Location', 'parent_id');
|
||||||
|
|
|
@ -193,6 +193,14 @@ class User extends SnipeModel implements AuthenticatableContract, CanResetPasswo
|
||||||
return $this->belongsTo('\App\Models\User', 'manager_id')->withTrashed();
|
return $this->belongsTo('\App\Models\User', 'manager_id')->withTrashed();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get any locations the user manages.
|
||||||
|
**/
|
||||||
|
public function managedLocations()
|
||||||
|
{
|
||||||
|
return $this->hasMany('\App\Models\Location', 'manager_id')->withTrashed();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get user groups
|
* Get user groups
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
|
||||||
|
class AddManagerToLocationsTable extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
Schema::table('locations', function (Blueprint $table) {
|
||||||
|
//
|
||||||
|
$table->integer('manager_id')->nullable()->default(null);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
Schema::table('locations', function (Blueprint $table) {
|
||||||
|
//
|
||||||
|
$table->dropColumn('manager_id');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -19,6 +19,7 @@ return array(
|
||||||
'location' => 'Location',
|
'location' => 'Location',
|
||||||
'lock_passwords' => 'Login details cannot be changed on this installation.',
|
'lock_passwords' => 'Login details cannot be changed on this installation.',
|
||||||
'manager' => 'Manager',
|
'manager' => 'Manager',
|
||||||
|
'managed_locations' => 'Managed Locations',
|
||||||
'name' => 'Name',
|
'name' => 'Name',
|
||||||
'notes' => 'Notes',
|
'notes' => 'Notes',
|
||||||
'password_confirm' => 'Confirm Password',
|
'password_confirm' => 'Confirm Password',
|
||||||
|
|
|
@ -21,6 +21,17 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Manager-->
|
||||||
|
<div class="form-group {{ $errors->has('manager_id') ? ' has-error' : '' }}">
|
||||||
|
<label for="manager_id" class="col-md-3 control-label">
|
||||||
|
{{ trans('admin/users/table.manager') }}
|
||||||
|
</label>
|
||||||
|
<div class="col-md-9{{ (\App\Helpers\Helper::checkIfRequired($item, 'manager_id')) ? ' required' : '' }}">
|
||||||
|
{!! Form::select('manager_id', $manager_list , Input::old('manager_id', $item->manager_id), array('class'=>'select2 parent', 'style'=>'width:350px')) !!}
|
||||||
|
{!! $errors->first('manager_id', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- Currency -->
|
<!-- Currency -->
|
||||||
<div class="form-group {{ $errors->has('currency') ? ' has-error' : '' }}">
|
<div class="form-group {{ $errors->has('currency') ? ' has-error' : '' }}">
|
||||||
<label for="currency" class="col-md-3 control-label">
|
<label for="currency" class="col-md-3 control-label">
|
||||||
|
|
|
@ -37,13 +37,15 @@
|
||||||
<th data-searchable="true" data-sortable="true" data-field="city">{{ trans('admin/locations/table.city') }}
|
<th data-searchable="true" data-sortable="true" data-field="city">{{ trans('admin/locations/table.city') }}
|
||||||
</th>
|
</th>
|
||||||
<th data-searchable="true" data-sortable="true" data-field="state">
|
<th data-searchable="true" data-sortable="true" data-field="state">
|
||||||
{{ trans('admin/locations/table.state') }}
|
{{ trans('admin/locations/table.state') }}
|
||||||
</th>
|
</th>
|
||||||
<th data-searchable="true" data-sortable="true" data-field="zip">
|
<th data-searchable="true" data-sortable="true" data-field="zip">
|
||||||
{{ trans('admin/locations/table.zip') }}
|
{{ trans('admin/locations/table.zip') }}
|
||||||
</th>
|
</th>
|
||||||
<th data-searchable="true" data-sortable="true" data-field="country">
|
<th data-searchable="true" data-sortable="true" data-field="country">
|
||||||
{{ trans('admin/locations/table.country') }}</th>
|
{{ trans('admin/locations/table.country') }}
|
||||||
|
</th>
|
||||||
|
<th data-sortable="true" data-formatter="usersLinkObjFormatter" data-field="manager" data-searchable="true">{{ trans('admin/users/table.manager') }}</th>
|
||||||
<th data-switchable="false" data-formatter="locationsActionsFormatter" data-searchable="false" data-sortable="false" data-field="actions">{{ trans('table.actions') }}</th>
|
<th data-switchable="false" data-formatter="locationsActionsFormatter" data-searchable="false" data-sortable="false" data-field="actions">{{ trans('table.actions') }}</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
|
|
|
@ -73,6 +73,16 @@
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
|
@if ($user->managedLocations()->count() >= 0 )
|
||||||
|
<li>
|
||||||
|
<a href="#managed_tab" data-toggle="tab">
|
||||||
|
<span class="hidden-lg hidden-md">
|
||||||
|
<i class="fa fa-clock-o"></i></span>
|
||||||
|
<span class="hidden-xs hidden-sm">{{ trans('admin/users/table.managed_locations') }}</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
@endif
|
||||||
|
|
||||||
@can('update', $user)
|
@can('update', $user)
|
||||||
<li class="dropdown pull-right">
|
<li class="dropdown pull-right">
|
||||||
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
|
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
|
||||||
|
@ -449,6 +459,27 @@
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div><!-- /.tab-pane -->
|
</div><!-- /.tab-pane -->
|
||||||
|
|
||||||
|
<div class="tab-pane" id="managed_tab">
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table class="display table table-striped">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="col-md-8">{{ trans('general.name') }}</th>
|
||||||
|
<th class="col-md-4">{{ trans('general.date') }}</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
@foreach ($user->managedLocations as $location)
|
||||||
|
<tr>
|
||||||
|
<td>{!! $location->present()->nameUrl() !!}</a></td>
|
||||||
|
<td>{{ $location->created_at }}</td>
|
||||||
|
</tr>
|
||||||
|
@endforeach
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div><!-- /consumables-tab -->
|
||||||
</div><!-- /.tab-content -->
|
</div><!-- /.tab-content -->
|
||||||
</div><!-- nav-tabs-custom -->
|
</div><!-- nav-tabs-custom -->
|
||||||
</div>
|
</div>
|
||||||
|
|
Loading…
Reference in a new issue