Merge pull request #12762 from spencerrlongg/feature/sc-20304

Bulk Restore from Deleted
This commit is contained in:
snipe 2023-03-30 12:37:50 -07:00 committed by GitHub
commit 9ca5285781
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 103 additions and 8 deletions

View file

@ -49,6 +49,7 @@ class BulkAssetsController extends Controller
->with('settings', Setting::getSettings())
->with('bulkedit', true)
->with('count', 0);
case 'delete':
$assets = Asset::with('assignedTo', 'location')->find($asset_ids);
$assets->each(function ($asset) {
@ -56,6 +57,15 @@ class BulkAssetsController extends Controller
});
return view('hardware/bulk-delete')->with('assets', $assets);
case 'restore':
$assets = Asset::withTrashed()->find($asset_ids);
$assets->each(function ($asset) {
$this->authorize('delete', $asset);
});
return view('hardware/bulk-restore')->with('assets', $assets);
case 'edit':
return view('hardware/bulk')
->with('assets', $asset_ids)
@ -320,5 +330,18 @@ class BulkAssetsController extends Controller
} catch (ModelNotFoundException $e) {
return redirect()->route('hardware.bulkcheckout.show')->with('error', $e->getErrors());
}
}
public function restore(Request $request) {
$assetIds = $request->get('ids');
if (empty($assetIds)) {
return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.restore.nothing_updated'));
} else {
foreach ($assetIds as $key => $assetId) {
$asset = Asset::withTrashed()->find($assetId);
$asset->restore();
}
return redirect()->route('hardware.index')->with('success', trans('admin/hardware/message.restore.success'));
}
}
}

View file

@ -2,8 +2,11 @@
return [
'bulk_delete' => 'Confirm Bulk Delete Assets',
'bulk_restore' => 'Confirm Bulk Restore Assets',
'bulk_delete_help' => 'Review the assets for bulk deletion below. Once deleted, these assets can be restored, but they will no longer be associated with any users they are currently assigned to.',
'bulk_restore_help' => 'Review the assets for bulk restoration below. Once restored, these assets will not be associated with any users they were previously assigned to.',
'bulk_delete_warn' => 'You are about to delete :asset_count assets.',
'bulk_restore_warn' => 'You are about to restore :asset_count assets.',
'bulk_update' => 'Bulk Update Assets',
'bulk_update_help' => 'This form allows you to update multiple assets at once. Only fill in the fields you need to change. Any fields left blank will remain unchanged. ',
'bulk_update_warn' => 'You are about to edit the properties of a single asset.|You are about to edit the properties of :asset_count assets.',

View file

@ -23,6 +23,8 @@ return [
'restore' => [
'error' => 'Asset was not restored, please try again',
'success' => 'Asset restored successfully.',
'bulk_success' => 'Asset restored successfully.',
'nothing_updated' => 'No assets were selected, so nothing was restored.',
],
'audit' => [

View file

@ -0,0 +1,62 @@
@extends('layouts/default')
{{-- Page title --}}
@section('title')
{{ trans('admin/hardware/form.bulk_restore') }}
@parent
@stop
@section('header_right')
<a href="{{ URL::previous() }}" class="btn btn-primary pull-right">
{{ trans('general.back') }}</a>
@stop
{{-- Page content --}}
@section('content')
<div class="row">
<!-- left column -->
<div class="col-md-12">
<p>{{ trans('admin/hardware/form.bulk_restore_help') }}</p>
<form class="form-horizontal" method="post" action="{{ route('hardware/bulkrestore') }}" autocomplete="off" role="form">
{{csrf_field()}}
<div class="box box-default">
<div class="box-header with-border">
<h2 class="box-title" style="color: red">{{ trans('admin/hardware/form.bulk_restore_warn', ['asset_count' => count($assets)]) }}</h2>
</div>
<div class="box-body">
<table class="table table-striped table-condensed">
<thead>
<tr>
<td></td>
<td>{{ trans('admin/hardware/table.id') }}</td>
<td>{{ trans('admin/hardware/table.name') }}</td>
<td>{{ trans('admin/hardware/table.location')}}</td>
</tr>
</thead>
<tbody>
@foreach ($assets as $asset)
<tr>
<td><input type="checkbox" name="ids[]" value="{{ $asset->id }}" checked="checked"></td>
<td>{{ $asset->id }}</td>
<td>{{ $asset->present()->name() }}</td>
<td>
@if ($asset->location)
{{ $asset->location->name }}
@endif
</td>
</tr>
@endforeach
</tbody>
</table>
</div><!-- /.box-body -->
<div class="box-footer text-right">
<a class="btn btn-link" href="{{ URL::previous() }}" method="post" enctype="multipart/form-data">{{ trans('button.cancel') }}</a>
<button type="submit" class="btn btn-success" id="submit-button"><i class="fas fa-check icon-white" aria-hidden="true"></i> {{ trans('button.restore') }}</button>
</div><!-- /.box-footer -->
</div><!-- /.box -->
</form>
</div> <!-- .col-md-12-->
</div><!--.row-->
@stop

View file

@ -62,15 +62,9 @@
<div class="row">
<div class="col-md-12">
@if (Request::get('status')!='Deleted')
@include('partials.asset-bulk-actions')
@include('partials.asset-bulk-actions', ['status' => Request::get('status')])
@endif
<table
data-advanced-search="true"
data-click-to-select="true"

View file

@ -13,6 +13,11 @@
</span>
</label>
<select name="bulk_actions" class="form-control select2" aria-label="bulk_actions" style="min-width: 350px;">
@if($status ?? '' == 'Deleted')
@can('delete', \App\Models\Asset::class)
<option value="restore">{{trans('button.restore')}}</option>
@endcan
@else
@can('update', \App\Models\Asset::class)
<option value="edit">{{ trans('button.edit') }}</option>
@endcan
@ -20,6 +25,7 @@
<option value="delete">{{ trans('button.delete') }}</option>
@endcan
<option value="labels" accesskey="l">{{ trans_choice('button.generate_labels', 2) }}</option>
@endif
</select>
<button class="btn btn-primary" id="{{ (isset($id_button)) ? $id_button : 'bulkAssetEditButton' }}" disabled>{{ trans('button.go') }}</button>

View file

@ -160,6 +160,11 @@ Route::group(
[BulkAssetsController::class, 'destroy']
)->name('hardware/bulkdelete');
Route::post(
'bulkrestore',
[BulkAssetsController::class, 'restore']
)->name('hardware/bulkrestore');
Route::post(
'bulksave',
[BulkAssetsController::class, 'update']
@ -181,4 +186,4 @@ Route::resource('hardware',
'middleware' => ['auth'],
'parameters' => ['asset' => 'asset_id'
],
]);
]);