|
@@ -13,7 +13,7 @@
|
|
|
<li class="breadcrumb-item"><a href="{{ route('home') }}">Dashboard</a></li>
|
|
|
<li class="breadcrumb-item"><a href="{{ route('servers.index') }}">Servers</a>
|
|
|
<li class="breadcrumb-item"><a class="text-muted"
|
|
|
- href="{{ route('servers.create') }}">Create</a>
|
|
|
+ href="{{ route('servers.create') }}">Create</a>
|
|
|
</li>
|
|
|
</ol>
|
|
|
</div>
|
|
@@ -27,38 +27,39 @@
|
|
|
<div class="container">
|
|
|
|
|
|
<!-- FORM -->
|
|
|
- <form action="{{route('servers.store')}}" method="post" class="row">
|
|
|
+ <form action="{{ route('servers.store') }}" method="post" class="row">
|
|
|
@csrf
|
|
|
<div class="col-md-8">
|
|
|
<div class="card">
|
|
|
<div class="card-header">
|
|
|
- <div class="card-title"><i class="fas fa-cogs mr-2"></i>{{__('Server configuration')}}</div>
|
|
|
+ <div class="card-title"><i class="fas fa-cogs mr-2"></i>{{ __('Server configuration') }}
|
|
|
+ </div>
|
|
|
</div>
|
|
|
|
|
|
- @if($productCount === 0 || $nodeCount === 0 || count($nests) === 0 || count($eggs) === 0 )
|
|
|
+ @if ($productCount === 0 || $nodeCount === 0 || count($nests) === 0 || count($eggs) === 0)
|
|
|
<div class="alert alert-danger p-2 m-2">
|
|
|
- <h5><i class="icon fas fa-exclamation-circle"></i>{{__('Error!')}}</h5>
|
|
|
+ <h5><i class="icon fas fa-exclamation-circle"></i>{{ __('Error!') }}</h5>
|
|
|
<p class="pl-4">
|
|
|
- @if(Auth::user()->role == 'admin')
|
|
|
- {{__('Make sure to link your products to nodes and eggs.')}} <br>
|
|
|
- {{__('There has to be at least 1 valid product for server creation')}}
|
|
|
+ @if (Auth::user()->role == 'admin')
|
|
|
+ {{ __('Make sure to link your products to nodes and eggs.') }} <br>
|
|
|
+ {{ __('There has to be at least 1 valid product for server creation') }}
|
|
|
@endif
|
|
|
</p>
|
|
|
<ul>
|
|
|
- @if($productCount === 0 )
|
|
|
- <li> {{__('No products available!')}}</li>
|
|
|
+ @if ($productCount === 0)
|
|
|
+ <li> {{ __('No products available!') }}</li>
|
|
|
@endif
|
|
|
|
|
|
- @if($nodeCount === 0 )
|
|
|
- <li>{{__('No nodes have been linked!')}}</li>
|
|
|
+ @if ($nodeCount === 0)
|
|
|
+ <li>{{ __('No nodes have been linked!') }}</li>
|
|
|
@endif
|
|
|
|
|
|
- @if(count($nests) === 0 )
|
|
|
- <li>{{__('No nests available!')}}</li>
|
|
|
+ @if (count($nests) === 0)
|
|
|
+ <li>{{ __('No nests available!') }}</li>
|
|
|
@endif
|
|
|
|
|
|
- @if(count($eggs) === 0 )
|
|
|
- <li>{{__('No eggs have been linked!')}}</li>
|
|
|
+ @if (count($eggs) === 0)
|
|
|
+ <li>{{ __('No eggs have been linked!') }}</li>
|
|
|
@endif
|
|
|
</ul>
|
|
|
</div>
|
|
@@ -68,8 +69,8 @@
|
|
|
<div x-show="loading" class="overlay dark">
|
|
|
<i class="fas fa-2x fa-sync-alt"></i>
|
|
|
</div>
|
|
|
- <div class="card-body">
|
|
|
|
|
|
+ <div class="card-body">
|
|
|
@if ($errors->any())
|
|
|
<div class="alert alert-danger">
|
|
|
<ul class="list-group pl-3">
|
|
@@ -81,29 +82,25 @@
|
|
|
@endif
|
|
|
|
|
|
<div class="form-group">
|
|
|
- <label for="name">{{__('Name')}}</label>
|
|
|
+ <label for="name">{{ __('Name') }}</label>
|
|
|
<input x-model="name" id="name" name="name" type="text" required="required"
|
|
|
- class="form-control @error('name') is-invalid @enderror">
|
|
|
-
|
|
|
+ class="form-control @error('name') is-invalid @enderror">
|
|
|
@error('name')
|
|
|
- <div class="invalid-feedback">
|
|
|
- {{ $message }}
|
|
|
- </div>
|
|
|
+ <div class="invalid-feedback">
|
|
|
+ {{ $message }}
|
|
|
+ </div>
|
|
|
@enderror
|
|
|
</div>
|
|
|
|
|
|
<div class="row">
|
|
|
<div class="col-md-6">
|
|
|
<div class="form-group">
|
|
|
- <label for="nest">{{__('Software / Games')}}</label>
|
|
|
- <select class="custom-select"
|
|
|
- required
|
|
|
- name="nest"
|
|
|
- id="nest"
|
|
|
- x-model="selectedNest"
|
|
|
- @change="setEggs();">
|
|
|
- <option selected disabled hidden
|
|
|
- value="null">{{count($nests) > 0 ? __('Please select software ...') : __('---')}}</option>
|
|
|
+ <label for="nest">{{ __('Software / Games') }}</label>
|
|
|
+ <select class="custom-select" required name="nest" id="nest" x-model="selectedNest"
|
|
|
+ @change="setEggs();">
|
|
|
+ <option selected disabled hidden value="null">
|
|
|
+ {{ count($nests) > 0 ? __('Please select software ...') : __('---') }}
|
|
|
+ </option>
|
|
|
@foreach ($nests as $nest)
|
|
|
<option value="{{ $nest->id }}">{{ $nest->name }}</option>
|
|
|
@endforeach
|
|
@@ -111,21 +108,15 @@
|
|
|
|
|
|
</div>
|
|
|
</div>
|
|
|
-
|
|
|
<div class="col-md-6">
|
|
|
<div class="form-group">
|
|
|
- <label for="egg">{{__('Specification ')}}</label>
|
|
|
+ <label for="egg">{{ __('Specification ') }}</label>
|
|
|
<div>
|
|
|
- <select id="egg"
|
|
|
- required
|
|
|
- name="egg"
|
|
|
- :disabled="eggs.length == 0"
|
|
|
- x-model="selectedEgg"
|
|
|
- @change="fetchLocations();"
|
|
|
- required="required"
|
|
|
- class="custom-select">
|
|
|
- <option x-text="getEggInputText()"
|
|
|
- selected disabled hidden value="null"></option>
|
|
|
+ <select id="egg" required name="egg" :disabled="eggs.length == 0"
|
|
|
+ x-model="selectedEgg" @change="fetchLocations();" required="required"
|
|
|
+ class="custom-select">
|
|
|
+ <option x-text="getEggInputText()" selected disabled hidden value="null">
|
|
|
+ </option>
|
|
|
<template x-for="egg in eggs" :key="egg.id">
|
|
|
<option x-text="egg.name" :value="egg.id"></option>
|
|
|
</template>
|
|
@@ -136,25 +127,17 @@
|
|
|
</div>
|
|
|
|
|
|
<div class="form-group">
|
|
|
- <label for="node">{{__('Node')}}</label>
|
|
|
- <select name="node"
|
|
|
- required
|
|
|
- id="node"
|
|
|
- x-model="selectedNode"
|
|
|
- :disabled="!fetchedLocations"
|
|
|
- @change="fetchProducts();"
|
|
|
- class="custom-select">
|
|
|
- <option
|
|
|
- x-text="getNodeInputText()"
|
|
|
- disabled selected hidden value="null">
|
|
|
+ <label for="node">{{ __('Node') }}</label>
|
|
|
+ <select name="node" required id="node" x-model="selectedNode" :disabled="!fetchedLocations"
|
|
|
+ @change="fetchProducts();" class="custom-select">
|
|
|
+ <option x-text="getNodeInputText()" disabled selected hidden value="null">
|
|
|
</option>
|
|
|
|
|
|
<template x-for="location in locations" :key="location.id">
|
|
|
<optgroup :label="location.name">
|
|
|
|
|
|
<template x-for="node in location.nodes" :key="node.id">
|
|
|
- <option x-text="node.name"
|
|
|
- :value="node.id">
|
|
|
+ <option x-text="node.name" :value="node.id">
|
|
|
|
|
|
</option>
|
|
|
</template>
|
|
@@ -166,27 +149,51 @@
|
|
|
|
|
|
|
|
|
<div class="form-group">
|
|
|
- <label for="product">{{__('Resources')}}</label>
|
|
|
- <select name="product"
|
|
|
- required
|
|
|
- id="product"
|
|
|
- :disabled="!fetchedProducts"
|
|
|
- x-model="selectedProduct"
|
|
|
- @change="updateSelectedObjects()"
|
|
|
- class="custom-select">
|
|
|
- <option
|
|
|
- x-text="getProductInputText()"
|
|
|
- disabled selected hidden value="null"></option>
|
|
|
+ <label for="product">{{ __('Resources') }}</label>
|
|
|
+ <select name="product" required id="product" :disabled="!fetchedProducts"
|
|
|
+ x-model="selectedProduct" @change="updateSelectedObjects()" class="custom-select">
|
|
|
+ <option x-text="getProductInputText()" disabled selected hidden value="null"></option>
|
|
|
<template x-for="product in products" :key="product.id">
|
|
|
<option :disabled="product.minimum_credits > user.credits"
|
|
|
- x-text="getProductOptionText(product)"
|
|
|
- :value="product.id">
|
|
|
+ x-text="getProductOptionText(product)" :value="product.id">
|
|
|
</option>
|
|
|
</template>
|
|
|
</select>
|
|
|
</div>
|
|
|
-
|
|
|
-
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="form-group">
|
|
|
+ <label for="product">{{ __('Resources') }}</label>
|
|
|
+ <div class="container">
|
|
|
+ <div class="row justify-content-around">
|
|
|
+ <template x-for="product in products" :key="product.id">
|
|
|
+ <div class="card col-4">
|
|
|
+ <div class="card-body">
|
|
|
+ <h4 class="card-title" x-text="product.name"></h4>
|
|
|
+ <div class="mt-6">
|
|
|
+ <div>
|
|
|
+ <p class="card-text text-muted">Resource Data:</p>
|
|
|
+ <div class="col">
|
|
|
+ <div class="row">
|
|
|
+ <div class="col">
|
|
|
+ <span>{{ __('CPU') }}</span>
|
|
|
+ </div>
|
|
|
+ <div class="col">
|
|
|
+ <p x-text="product.cpu + ' %'""></p>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class=" mt-4">
|
|
|
+ <span class="card-text text-muted">Description</span>
|
|
|
+ <p class="card-text" x-text="product.description"></p>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
@@ -194,73 +201,73 @@
|
|
|
<div class="card">
|
|
|
<div class="card-header">
|
|
|
<div class="card-title">
|
|
|
- <i class="fas fa-list mr-2"></i>{{__('Server details')}}
|
|
|
+ <i class="fas fa-list mr-2"></i>{{ __('Server details') }}
|
|
|
</div>
|
|
|
</div>
|
|
|
<div class="card-body">
|
|
|
-
|
|
|
<ul class="list-group mb-3">
|
|
|
<li x-show="selectedNestObject.name"
|
|
|
class="list-group-item d-flex justify-content-between lh-condensed">
|
|
|
<div>
|
|
|
- <h6 class="my-0">{{__('Software / Games')}}</h6>
|
|
|
- <small x-text="selectedNestObject?.name ?? '{{__('No selection')}}'"
|
|
|
- class="text-muted"></small>
|
|
|
+ <h6 class="my-0">{{ __('Software / Games') }}</h6>
|
|
|
+ <small x-text="selectedNestObject?.name ?? '{{ __('No selection') }}'"
|
|
|
+ class="text-muted"></small>
|
|
|
</div>
|
|
|
</li>
|
|
|
<li class="list-group-item d-flex justify-content-between lh-condensed">
|
|
|
<div>
|
|
|
- <h6 class="my-0">{{__('Specification')}}</h6>
|
|
|
- <small x-text="selectedEggObject?.name ?? '{{__('No selection')}}'"
|
|
|
- class="text-muted"></small>
|
|
|
+ <h6 class="my-0">{{ __('Specification') }}</h6>
|
|
|
+ <small x-text="selectedEggObject?.name ?? '{{ __('No selection') }}'"
|
|
|
+ class="text-muted"></small>
|
|
|
</div>
|
|
|
</li>
|
|
|
- <li
|
|
|
- class="list-group-item d-flex justify-content-between lh-condensed">
|
|
|
+ <li class="list-group-item d-flex justify-content-between lh-condensed">
|
|
|
<div>
|
|
|
- <h6 class="my-0">{{__('Node')}}</h6>
|
|
|
- <small x-text="selectedNodeObject?.name ?? '{{__('No selection')}}'"
|
|
|
- class="text-muted"></small>
|
|
|
+ <h6 class="my-0">{{ __('Node') }}</h6>
|
|
|
+ <small x-text="selectedNodeObject?.name ?? '{{ __('No selection') }}'"
|
|
|
+ class="text-muted"></small>
|
|
|
</div>
|
|
|
</li>
|
|
|
<li class="list-group-item">
|
|
|
<div>
|
|
|
- <h6 class="my-0">{{__('Resources')}}</h6>
|
|
|
- <small x-text="selectedProductObject?.name ?? '{{__('No selection')}}'"
|
|
|
- class="text-muted"></small>
|
|
|
+ <h6 class="my-0">{{ __('Resources') }}</h6>
|
|
|
+ <small x-text="selectedProductObject?.name ?? '{{ __('No selection') }}'"
|
|
|
+ class="text-muted"></small>
|
|
|
</div>
|
|
|
|
|
|
<template x-if="selectedProductObject?.name">
|
|
|
<ul class="pl-0">
|
|
|
<li class="d-flex justify-content-between">
|
|
|
- <small class="text-muted d-inline-block">{{__('CPU')}}</small>
|
|
|
+ <small class="text-muted d-inline-block">{{ __('CPU') }}</small>
|
|
|
<small class="text-muted d-inline-block"
|
|
|
- x-text="selectedProductObject.cpu + ' %'"></small>
|
|
|
+ x-text="selectedProductObject.cpu + ' %'"></small>
|
|
|
</li>
|
|
|
<div class="d-flex justify-content-between">
|
|
|
- <small class="text-muted d-inline-block">{{__('Memory')}}</small>
|
|
|
+ <small class="text-muted d-inline-block">{{ __('Memory') }}</small>
|
|
|
<small class="text-muted d-inline-block"
|
|
|
- x-text="selectedProductObject.memory + ' {{__('MB')}}'"></small>
|
|
|
+ x-text="selectedProductObject.memory + ' {{ __('MB') }}'"></small>
|
|
|
</div>
|
|
|
<div class="d-flex justify-content-between">
|
|
|
- <small class="text-muted d-inline-block">{{__('Disk')}}</small>
|
|
|
+ <small class="text-muted d-inline-block">{{ __('Disk') }}</small>
|
|
|
<small class="text-muted d-inline-block"
|
|
|
- x-text="selectedProductObject.disk + ' {{__('MB')}}'"></small>
|
|
|
+ x-text="selectedProductObject.disk + ' {{ __('MB') }}'"></small>
|
|
|
</div>
|
|
|
<div class="d-flex justify-content-between">
|
|
|
- <small class="text-muted d-inline-block">{{__('Databases')}}</small>
|
|
|
+ <small class="text-muted d-inline-block">{{ __('Databases') }}</small>
|
|
|
<small class="text-muted d-inline-block"
|
|
|
- x-text="selectedProductObject.databases + ' {{__('MySQL')}}'"></small>
|
|
|
+ x-text="selectedProductObject.databases + ' {{ __('MySQL') }}'"></small>
|
|
|
</div>
|
|
|
<div class="d-flex justify-content-between">
|
|
|
- <small class="text-muted d-inline-block">{{__('Backups')}}</small>
|
|
|
+ <small class="text-muted d-inline-block">{{ __('Backups') }}</small>
|
|
|
<small class="text-muted d-inline-block"
|
|
|
- x-text="selectedProductObject.backups"></small>
|
|
|
+ x-text="selectedProductObject.backups"></small>
|
|
|
</div>
|
|
|
<div class="d-flex justify-content-between">
|
|
|
- <small class="text-muted d-inline-block">{{__('Allocations')}} ({{__('ports')}})</small>
|
|
|
- <small class="text-muted d-inline-block" x-text="selectedProductObject.allocations"></small>
|
|
|
- </div>
|
|
|
+ <small class="text-muted d-inline-block">{{ __('Allocations') }}
|
|
|
+ ({{ __('ports') }})</small>
|
|
|
+ <small class="text-muted d-inline-block"
|
|
|
+ x-text="selectedProductObject.allocations"></small>
|
|
|
+ </div>
|
|
|
</ul>
|
|
|
</template>
|
|
|
|
|
@@ -268,7 +275,7 @@
|
|
|
</ul>
|
|
|
<ul class="list-group mb-3">
|
|
|
<li class="list-group-item d-flex justify-content-between">
|
|
|
- <span>{{CREDITS_DISPLAY_NAME}} {{__('per month')}}</span>
|
|
|
+ <span>{{ CREDITS_DISPLAY_NAME }} {{ __('per month') }}</span>
|
|
|
<strong>
|
|
|
<i x-show="selectedProductObject?.price" class="fas fa-coins"></i>
|
|
|
<span x-text="selectedProductObject?.price ?? ''"></span>
|
|
@@ -276,8 +283,8 @@
|
|
|
</li>
|
|
|
</ul>
|
|
|
<button :disabled="!isFormValid()" :class="isFormValid() ? '' : 'disabled'"
|
|
|
- class="btn btn-primary btn-block">
|
|
|
- {{__('Create server')}}
|
|
|
+ class="btn btn-primary btn-block">
|
|
|
+ {{ __('Create server') }}
|
|
|
</button>
|
|
|
</div>
|
|
|
</div>
|
|
@@ -314,7 +321,7 @@
|
|
|
//values
|
|
|
user: {!! $user !!},
|
|
|
nests: {!! $nests !!},
|
|
|
- eggsSave:{!! $eggs !!}, //store back-end eggs
|
|
|
+ eggsSave: {!! $eggs !!}, //store back-end eggs
|
|
|
eggs: [],
|
|
|
locations: [],
|
|
|
products: [],
|
|
@@ -360,7 +367,7 @@
|
|
|
this.selectedNode = 'null';
|
|
|
this.selectedProduct = 'null';
|
|
|
|
|
|
- let response = await axios.get(`{{route('products.locations.egg')}}/${this.selectedEgg}`)
|
|
|
+ let response = await axios.get(`{{ route('products.locations.egg') }}/${this.selectedEgg}`)
|
|
|
.catch(console.error)
|
|
|
|
|
|
this.fetchedLocations = true;
|
|
@@ -388,7 +395,8 @@
|
|
|
this.products = [];
|
|
|
this.selectedProduct = 'null';
|
|
|
|
|
|
- let response = await axios.get(`{{route('products.products.node')}}/${this.selectedEgg}/${this.selectedNode}`)
|
|
|
+ let response = await axios.get(
|
|
|
+ `{{ route('products.products.node') }}/${this.selectedEgg}/${this.selectedNode}`)
|
|
|
.catch(console.error)
|
|
|
|
|
|
this.fetchedProducts = true;
|
|
@@ -414,7 +422,8 @@
|
|
|
this.selectedNodeObject = {};
|
|
|
this.locations.forEach(location => {
|
|
|
if (!this.selectedNodeObject?.id) {
|
|
|
- this.selectedNodeObject = location.nodes.find(node => node.id == this.selectedNode) ?? {};
|
|
|
+ this.selectedNodeObject = location.nodes.find(node => node.id == this.selectedNode) ??
|
|
|
+ {};
|
|
|
}
|
|
|
})
|
|
|
|
|
@@ -436,35 +445,35 @@
|
|
|
getNodeInputText() {
|
|
|
if (this.fetchedLocations) {
|
|
|
if (this.locations.length > 0) {
|
|
|
- return '{{__('Please select a node ...')}}';
|
|
|
+ return '{{ __('Please select a node ...') }}';
|
|
|
}
|
|
|
- return '{{__('No nodes found matching current configuration')}}'
|
|
|
+ return '{{ __('No nodes found matching current configuration') }}'
|
|
|
}
|
|
|
- return '{{__('---')}}';
|
|
|
+ return '{{ __('---') }}';
|
|
|
},
|
|
|
|
|
|
getProductInputText() {
|
|
|
if (this.fetchedProducts) {
|
|
|
if (this.products.length > 0) {
|
|
|
- return '{{__('Please select a resource ...')}}';
|
|
|
+ return '{{ __('Please select a resource ...') }}';
|
|
|
}
|
|
|
- return '{{__('No resources found matching current configuration')}}'
|
|
|
+ return '{{ __('No resources found matching current configuration') }}'
|
|
|
}
|
|
|
- return '{{__('---')}}';
|
|
|
+ return '{{ __('---') }}';
|
|
|
},
|
|
|
|
|
|
getEggInputText() {
|
|
|
if (this.selectedNest) {
|
|
|
- return '{{__('Please select a configuration ...')}}';
|
|
|
+ return '{{ __('Please select a configuration ...') }}';
|
|
|
}
|
|
|
- return '{{__('---')}}';
|
|
|
+ return '{{ __('---') }}';
|
|
|
},
|
|
|
|
|
|
getProductOptionText(product) {
|
|
|
let text = product.name + ' (' + product.description + ')';
|
|
|
|
|
|
if (product.minimum_credits > this.user.credits) {
|
|
|
- return '{{__('Not enough credits!')}} | ' + text;
|
|
|
+ return '{{ __('Not enough credits!') }} | ' + text;
|
|
|
}
|
|
|
|
|
|
return text;
|