mirror of
https://github.com/pterodactyl/panel.git
synced 2024-11-22 09:02:28 +01:00
add location editing
This commit is contained in:
parent
21a95a5d0e
commit
fb5533f107
@ -5,7 +5,11 @@ namespace Pterodactyl\Http\Controllers\Admin;
|
||||
use DB;
|
||||
|
||||
use Pterodactyl\Models;
|
||||
use Pterodactyl\Repositories\LocationRepository;
|
||||
use Pterodactyl\Http\Controllers\Controller;
|
||||
|
||||
use Pterodactyl\Exceptions\DisplayValidationException;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class LocationsController extends Controller
|
||||
@ -51,4 +55,25 @@ class LocationsController extends Controller
|
||||
return response('', 204);
|
||||
}
|
||||
|
||||
public function patchLocation(Request $request, $id)
|
||||
{
|
||||
try {
|
||||
$location = new LocationRepository;
|
||||
$location->edit($id, $request->all());
|
||||
return response('', 204);
|
||||
} catch (DisplayValidationException $ex) {
|
||||
return response()->json([
|
||||
'error' => 'There was a validation error while processing this request. Location descriptions must be between 1 and 255 characters, and the location code must be between 1 and 10 characters with no spaces or special characters.'
|
||||
], 422);
|
||||
} catch (\Exception $ex) {
|
||||
// This gets caught and processed into JSON anyways.
|
||||
throw $ex;
|
||||
}
|
||||
}
|
||||
|
||||
public function postLocation(Request $request)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -219,6 +219,12 @@ class AdminRoutes {
|
||||
$router->delete('/{id}', [
|
||||
'uses' => 'Admin\LocationsController@deleteLocation'
|
||||
]);
|
||||
$router->patch('/{id}', [
|
||||
'uses' => 'Admin\LocationsController@patchLocation'
|
||||
]);
|
||||
$router->post('/', [
|
||||
'uses' => 'Admin\LocationsController@postLocation'
|
||||
]);
|
||||
});
|
||||
|
||||
// API Routes
|
||||
|
44
app/Repositories/LocationRepository.php
Normal file
44
app/Repositories/LocationRepository.php
Normal file
@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
namespace Pterodactyl\Repositories;
|
||||
|
||||
use Validator;
|
||||
|
||||
use Pterodactyl\Models;
|
||||
use Pterodactyl\Exceptions\DisplayException;
|
||||
use Pterodactyl\Exceptions\DisplayValidationException;
|
||||
|
||||
class LocationRepository
|
||||
{
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
public function edit($id, array $data)
|
||||
{
|
||||
$validator = Validator::make($data, [
|
||||
'short' => 'regex:/^[a-z0-9_.-]{1,10}$/i',
|
||||
'long' => 'string|min:1|max:255'
|
||||
]);
|
||||
|
||||
// Run validator, throw catchable and displayable exception if it fails.
|
||||
// Exception includes a JSON result of failed validation rules.
|
||||
if ($validator->fails()) {
|
||||
throw new DisplayValidationException($validator->errors());
|
||||
}
|
||||
|
||||
$location = Models\Location::findOrFail($id);
|
||||
|
||||
if (isset($data['short'])) {
|
||||
$location->short = $data['short'];
|
||||
}
|
||||
|
||||
if (isset($data['long'])) {
|
||||
$location->long = $data['long'];
|
||||
}
|
||||
|
||||
return $location->save();
|
||||
}
|
||||
}
|
@ -29,7 +29,7 @@
|
||||
<td>{{ $location->long }}</td>
|
||||
<td class="text-center">{{ $location->a_nodeCount }}</td>
|
||||
<td class="text-center">{{ $location->a_serverCount }}</td>
|
||||
<td class="text-center"><a href="#edit"><i class="fa fa-wrench" data-action="edit" data-id="{{ $location->id }}" data-short="{{ $location->short }}" data-long="{{ $location->long }}"></i></a></td>
|
||||
<td class="text-center"><a href="#edit"><i class="fa fa-wrench" data-toggle="modal" data-target="#editModal" data-action="edit" data-id="{{ $location->id }}" data-short="{{ $location->short }}" data-long="{{ $location->long }}"></i></a></td>
|
||||
<td class="text-center"><a href="#delete" class="text-danger" data-action="delete" data-id="{{ $location->id }}"><i class="fa fa-trash-o"></i></a></td>
|
||||
</tr>
|
||||
@endforeach
|
||||
@ -46,9 +46,78 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal fade" id="editModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel">
|
||||
<div class="modal-dialog" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
<h4 class="modal-title" id="exampleModalLabel">Editing Location</h4>
|
||||
</div>
|
||||
<form action="{{ route('admin.locations') }}" method="POST" id="editLocationForm">
|
||||
<div class="modal-body">
|
||||
<div class="form-group">
|
||||
<label for="location-short" class="control-label">Location Code:</label>
|
||||
<input type="text" class="form-control" id="location-short">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="location-long" class="control-label">Description:</label>
|
||||
<input type="text" class="form-control" id="location-long">
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<input type="hidden" id="location-id">
|
||||
<button type="button" class="btn btn-sm btn-default" data-dismiss="modal">Close</button>
|
||||
<button type="submit" class="btn btn-sm btn-primary">Edit Location</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
$('#sidebar_links').find("a[href='/admin/locations']").addClass('active');
|
||||
$('#editModal').on('show.bs.modal', function (event) {
|
||||
var button = $(event.relatedTarget);
|
||||
var short = button.data('short');
|
||||
var long = button.data('long');
|
||||
var id = button.data('id');
|
||||
var modal = $(this);
|
||||
|
||||
modal.find('#location-id').val(id);
|
||||
modal.find('#location-short').val(short);
|
||||
modal.find('#location-long').val(long);
|
||||
});
|
||||
$('#editLocationForm').submit(function (event) {
|
||||
event.preventDefault();
|
||||
$.ajax({
|
||||
method: 'PATCH',
|
||||
url: '{{ route('admin.locations') }}/' + $('#location-id').val(),
|
||||
headers: {
|
||||
'X-CSRF-TOKEN': '{{ csrf_token() }}'
|
||||
},
|
||||
data: {
|
||||
short: $('#location-short').val(),
|
||||
long: $('#location-long').val()
|
||||
}
|
||||
}).done(function (data) {
|
||||
swal({
|
||||
type: 'success',
|
||||
title: '',
|
||||
text: 'Successfully updated location information.',
|
||||
closeOnConfirm: false,
|
||||
showLoaderOnConfirm: true
|
||||
}, function () {
|
||||
window.location = '{{ route('admin.locations') }}';
|
||||
});
|
||||
}).fail(function (jqXHR) {
|
||||
console.error(jqXHR);
|
||||
swal({
|
||||
type: 'error',
|
||||
title: 'Whoops!',
|
||||
text: (typeof jqXHR.responseJSON.error !== 'undefined') ? jqXHR.responseJSON.error : 'An error occured while processing this request.'
|
||||
});
|
||||
});
|
||||
});
|
||||
$('[data-action="delete"]').click(function (event) {
|
||||
event.preventDefault();
|
||||
var self = $(this);
|
||||
@ -78,7 +147,7 @@ $(document).ready(function () {
|
||||
swal({
|
||||
type: 'error',
|
||||
title: 'Whoops!',
|
||||
text: (typeof jqXHR.responseJSON !== 'undefined') ? jqXHR.responseJSON.error : 'An error occured while processing this request.'
|
||||
text: (typeof jqXHR.responseJSON.error !== 'undefined') ? jqXHR.responseJSON.error : 'An error occured while processing this request.'
|
||||
});
|
||||
});
|
||||
});
|
||||
|
Loading…
Reference in New Issue
Block a user