feature/server-mounts initial commit

This commit is contained in:
Matthew Penner 2020-05-20 17:29:03 -06:00
parent 5dbcddc862
commit 59a150148a
5 changed files with 176 additions and 0 deletions

View file

@ -0,0 +1,37 @@
<?php
namespace Pterodactyl\Http\Controllers\Admin\Mounts;
use Pterodactyl\Contracts\Repository\LocationRepositoryInterface;
use Pterodactyl\Http\Controllers\Controller;
class MountController extends Controller
{
/**
* @var \Pterodactyl\Contracts\Repository\LocationRepositoryInterface
*/
protected $repository;
/**
* LocationController constructor.
*
* @param \Pterodactyl\Contracts\Repository\LocationRepositoryInterface $repository
*/
public function __construct(
LocationRepositoryInterface $repository
) {
$this->repository = $repository;
}
/**
* Return the mount overview page.
*
* @return \Illuminate\View\View
*/
public function index()
{
return view('admin.mounts.index', [
'locations' => $this->repository->getAllWithDetails(),
]);
}
}

29
app/Models/Mount.php Normal file
View file

@ -0,0 +1,29 @@
<?php
namespace Pterodactyl\Models;
/**
* @property int $id
*/
class Mount extends Model
{
/**
* The resource name for this model when it is transformed into an
* API representation using fractal.
*/
const RESOURCE_NAME = 'mount';
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'mounts';
/**
* Fields that are not mass assignable.
*
* @var array
*/
protected $guarded = ['id'];
}

View file

@ -0,0 +1,93 @@
{{-- Pterodactyl - Panel --}}
{{-- Copyright (c) 2015 - 2017 Dane Everitt <dane@daneeveritt.com> --}}
{{-- This software is licensed under the terms of the MIT license. --}}
{{-- https://opensource.org/licenses/MIT --}}
@extends('layouts.admin')
@section('title')
Mounts
@endsection
@section('content-header')
<h1>Mounts<small>SoonTM</small></h1>
<ol class="breadcrumb">
<li><a href="{{ route('admin.index') }}">Admin</a></li>
<li class="active">Mounts</li>
</ol>
@endsection
@section('content')
<div class="row">
<div class="col-xs-12">
<div class="box box-primary">
<div class="box-header with-border">
<h3 class="box-title">Mount List</h3>
<div class="box-tools">
<button class="btn btn-sm btn-primary" data-toggle="modal" data-target="#newLocationModal">Create New</button>
</div>
</div>
<div class="box-body table-responsive no-padding">
<table class="table table-hover">
<tbody>
<tr>
<th>ID</th>
<th>Short Code</th>
<th>Description</th>
<th class="text-center">Nodes</th>
<th class="text-center">Servers</th>
</tr>
@foreach ($locations as $location)
<tr>
<td><code>{{ $location->id }}</code></td>
<td><a href="{{ route('admin.locations.view', $location->id) }}">{{ $location->short }}</a></td>
<td>{{ $location->long }}</td>
<td class="text-center">{{ $location->nodes_count }}</td>
<td class="text-center">{{ $location->servers_count }}</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="modal fade" id="newLocationModal" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<form action="{{ route('admin.locations') }}" method="POST">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title">Create Location</h4>
</div>
<div class="modal-body">
<div class="row">
<div class="col-md-12">
<label for="pShortModal" class="form-label">Short Code</label>
<input type="text" name="short" id="pShortModal" class="form-control" />
<p class="text-muted small">A short identifier used to distinguish this location from others. Must be between 1 and 60 characters, for example, <code>us.nyc.lvl3</code>.</p>
</div>
<div class="col-md-12">
<label for="pLongModal" class="form-label">Description</label>
<textarea name="long" id="pLongModal" class="form-control" rows="4"></textarea>
<p class="text-muted small">A longer description of this location. Must be less than 255 characters.</p>
</div>
</div>
</div>
<div class="modal-footer">
{!! csrf_field() !!}
<button type="button" class="btn btn-default btn-sm pull-left" data-dismiss="modal">Cancel</button>
<button type="submit" class="btn btn-success btn-sm">Create</button>
</div>
</form>
</div>
</div>
</div>
@endsection

View file

@ -117,6 +117,11 @@
</a> </a>
</li> </li>
<li class="header">SERVICE MANAGEMENT</li> <li class="header">SERVICE MANAGEMENT</li>
<li class="{{ ! starts_with(Route::currentRouteName(), 'admin.mounts') ?: 'active' }}">
<a href="{{ route('admin.mounts') }}">
<i class="fa fa-magic"></i> <span>Mounts</span>
</a>
</li>
<li class="{{ ! starts_with(Route::currentRouteName(), 'admin.nests') ?: 'active' }}"> <li class="{{ ! starts_with(Route::currentRouteName(), 'admin.nests') ?: 'active' }}">
<a href="{{ route('admin.nests') }}"> <a href="{{ route('admin.nests') }}">
<i class="fa fa-th-large"></i> <span>Nests</span> <i class="fa fa-th-large"></i> <span>Nests</span>

View file

@ -165,6 +165,18 @@ Route::group(['prefix' => 'nodes'], function () {
Route::delete('/view/{node}/allocations', 'NodesController@allocationRemoveMultiple')->name('admin.nodes.view.allocation.removeMultiple'); Route::delete('/view/{node}/allocations', 'NodesController@allocationRemoveMultiple')->name('admin.nodes.view.allocation.removeMultiple');
}); });
/*
|--------------------------------------------------------------------------
| Mount Controller Routes
|--------------------------------------------------------------------------
|
| Endpoint: /admin/mounts
|
*/
Route::group(['prefix' => 'mounts'], function () {
Route::get('/', 'Mounts\MountController@index')->name('admin.mounts');
});
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Nest Controller Routes | Nest Controller Routes