This commit is contained in:
Dennis
2020-10-14 13:19:24 +02:00
parent 65b0a768af
commit 37281b01e4
7 changed files with 628 additions and 273 deletions

View File

@@ -14,8 +14,11 @@ class ServerController extends Controller
{ {
$servers = auth()->user()->servers()->latest()->paginate(); $servers = auth()->user()->servers()->latest()->paginate();
$providers = auth()->user()->package->providers()->pluck('label', 'id');
return inertia('Servers/Index', [ return inertia('Servers/Index', [
'servers' => ServerResource::collection($servers) 'servers' => ServerResource::collection($servers),
'dataProviders' => $providers
]); ]);
} }
@@ -51,4 +54,11 @@ class ServerController extends Controller
return redirect()->route('servers.index')->with('success', __('Your server is deleted')); return redirect()->route('servers.index')->with('success', __('Your server is deleted'));
} }
public function regions(Request $request, $providerId)
{
$provider = $request->user()->package->providers()->findOrFail($providerId);
return $provider->regions()->pluck('label', 'id');
}
} }

View File

@@ -34,12 +34,12 @@ class ServerRequest extends FormRequest
'provider' => [ 'provider' => [
'required', 'required',
'not_in:0', 'not_in:0',
'exists:provider_plans,plan_id' 'exists:provider_plans,id'
], ],
'region' => [ 'region' => [
'required', 'required',
'not_in:0', 'not_in:0',
'exists:provider_regions,region_id' 'exists:provider_regions,id'
] ]
]; ];
} }

88
public/js/52.js vendored
View File

@@ -109,6 +109,11 @@ __webpack_require__.r(__webpack_exports__);
// //
// //
// //
//
//
//
//
//
@@ -175,7 +180,8 @@ __webpack_require__.r(__webpack_exports__);
DropdownListItemButton: _components_DropdownListItemButton__WEBPACK_IMPORTED_MODULE_27__["default"] DropdownListItemButton: _components_DropdownListItemButton__WEBPACK_IMPORTED_MODULE_27__["default"]
}, },
props: { props: {
servers: Object servers: Object,
dataProviders: Object
}, },
computed: { computed: {
shouldBePolling: function shouldBePolling() { shouldBePolling: function shouldBePolling() {
@@ -199,6 +205,13 @@ __webpack_require__.r(__webpack_exports__);
if (!this.pollingInterval) { if (!this.pollingInterval) {
this.startPollingInterval(); this.startPollingInterval();
} }
},
'form.provider': function formProvider(value) {
var _this = this;
window.axios.get(this.route('servers.regions', value)).then(function (response) {
_this.regions = response.data;
});
} }
}, },
data: function data() { data: function data() {
@@ -208,6 +221,8 @@ __webpack_require__.r(__webpack_exports__);
provider: null, provider: null,
region: null region: null
}, },
providers: this.dataProviders,
regions: [],
pollingInterval: null, pollingInterval: null,
modalIsOpen: false, modalIsOpen: false,
breadcrumbs: [{ breadcrumbs: [{
@@ -238,25 +253,26 @@ __webpack_require__.r(__webpack_exports__);
}); });
}, },
submit: function submit() { submit: function submit() {
var _this = this; var _this2 = this;
this.$inertia.post(this.route('servers.store'), this.form, { this.$inertia.post(this.route('servers.store'), this.form, {
only: ['errors', 'flash', 'servers'] only: ['errors', 'flash', 'servers'],
}).then(function (response) { onFinish: function onFinish() {
if (!Object.keys(_this.$page.errors).length) { if (!Object.keys(_this2.$page.errors).length) {
_this.form.domain = null; _this2.form.domain = null;
_this.modalIsOpen = false; _this2.modalIsOpen = false;
}
} }
}); });
}, },
confirmDelete: function confirmDelete(server) { confirmDelete: function confirmDelete(server) {
var _this2 = this; var _this3 = this;
Object(_hooks_confirm_delete__WEBPACK_IMPORTED_MODULE_28__["useConfirmDelete"])({ Object(_hooks_confirm_delete__WEBPACK_IMPORTED_MODULE_28__["useConfirmDelete"])({
title: this.__('Are you sure?'), title: this.__('Are you sure?'),
message: "Your server will be deleted completely, this action is irreversible.", message: "Your server will be deleted completely, this action is irreversible.",
onConfirm: function onConfirm() { onConfirm: function onConfirm() {
return _this2["delete"](server); return _this3["delete"](server);
} }
}); });
}, },
@@ -487,7 +503,15 @@ var render = function() {
"FormSelect", "FormSelect",
{ {
attrs: { attrs: {
errors: _vm.$page.errors.provider,
label: _vm.__("Select provider") label: _vm.__("Select provider")
},
model: {
value: _vm.form.provider,
callback: function($$v) {
_vm.$set(_vm.form, "provider", $$v)
},
expression: "form.provider"
} }
}, },
[ [
@@ -501,14 +525,33 @@ var render = function() {
) )
) )
] ]
) ),
] _vm._v(" "),
_vm._l(_vm.providers, function(name, id) {
return _c(
"option",
{ domProps: { value: id } },
[_vm._v(_vm._s(name))]
)
})
],
2
), ),
_vm._v(" "), _vm._v(" "),
_c( _c(
"FormSelect", "FormSelect",
{ {
attrs: { label: _vm.__("Select region") } attrs: {
errors: _vm.$page.errors.region,
label: _vm.__("Select region")
},
model: {
value: _vm.form.region,
callback: function($$v) {
_vm.$set(_vm.form, "region", $$v)
},
expression: "form.region"
}
}, },
[ [
_c( _c(
@@ -521,8 +564,17 @@ var render = function() {
) )
) )
] ]
) ),
] _vm._v(" "),
_vm._l(_vm.regions, function(name, id) {
return _c(
"option",
{ domProps: { value: id } },
[_vm._v(_vm._s(name))]
)
})
],
2
) )
] ]
}, },
@@ -544,7 +596,7 @@ var render = function() {
], ],
null, null,
false, false,
1527714898 3699054859
) )
}) })
: _vm._e() : _vm._e()
@@ -722,7 +774,11 @@ var render = function() {
} }
} }
}, },
[_vm._v("Delete")] [
_vm._v(
"\n Delete\n "
)
]
) )
], ],
1 1

748
public/js/76.js vendored

File diff suppressed because one or more lines are too long

2
public/js/app.js vendored
View File

@@ -43,7 +43,7 @@
/******/ /******/
/******/ // script path function /******/ // script path function
/******/ function jsonpScriptSrc(chunkId) { /******/ function jsonpScriptSrc(chunkId) {
/******/ return __webpack_require__.p + "js/" + ({}[chunkId]||chunkId) + ".js?id=" + {"0":"0dcde053981f92959e59","1":"40f269324eb90e7c5005","2":"d2a49802291d427ca7c8","3":"a0f4c2f49863abbfe7f1","4":"27416beeac7dd90b6c9f","5":"fbfbcf45610d060d921e","6":"73fc0264b5cc06f5bd55","7":"140acb8c38018bb7c822","8":"3b0a87d878c97185a291","9":"3347d79d05ca0ac7a350","10":"47d8d4c4aa7f3eeae6b8","11":"8c5c9f6fa8b7aaec38ee","12":"03ffa63c616af52e9173","13":"1f917f9eb173c1c73c26","14":"d0c922727dbc8b127550","15":"b406efe2b2eb8988be0b","16":"ae392c0d7939c1834713","17":"031677a852ea3f5eb57a","18":"78c595d4f44ed93b16ae","19":"0cefe5adcf3c9c67917d","20":"c3aaa3a8880c1323f5b9","21":"c6824027cf77f1875e86","22":"bb6e0db11ce8cea1ea15","23":"0924f149c1e3f1ccc23b","24":"e0139a753b3037348bd3","25":"523a459f15606706e0f4","26":"78ea723a4d8f6c925287","27":"61b4c089c608f7f27b57","28":"df81cbcdc7dddac9a1cf","29":"205fcb561832fdca3613","30":"34254d5ab54e1b77af57","31":"b24fe053d9586525bd04","32":"d40da2a9d0dfcdfcf40e","33":"4ee1d57db25ce73da07a","34":"a1dc60cf9b240735c524","35":"13384dcc57163b2c15fb","36":"07128eb2197b6a6d9955","37":"8b8ab95aeaa851c57033","38":"d123e29b59d771ee7750","39":"fe834feb15b9160591f0","40":"90e1e3b80ac15780aa45","41":"26e0438c5430defefcb4","42":"f7e025a8a96b2e66d300","43":"c6cbbb84bf085e916af4","44":"837f8f061ed475f2c043","45":"1311d0b2659eb428a007","46":"96963330e5744696f861","47":"b9dd7aafbd529e03b008","48":"303c80c25410a7039819","49":"080bb4762ce606a20938","50":"6a2be057a821819e0f3f","51":"31ee010f65a984f2b422","52":"ef659bf7acfc733ae0e8","53":"327b50ce903b0f348341","54":"cb30fead7b74df252e66","55":"0953446db22303519e08","56":"6bc136b4c9a35e9a1836","57":"3f7b6082e37f0f114055","58":"a1668de9111dbf09572b","59":"b6ab5d03b46b7ae139a7","60":"37d00800b71f79260df7","61":"7799c0088535883cfcdc","62":"5e0875a9e333d029edcb","63":"3fbf8bbeb22bdf1a3538","64":"35e94b96c17d9176fdd1","65":"c40d3bc7ae4294705195","66":"54405ebd171bf0a0be8a","67":"0cf2c9062ba4048c4d16","68":"47e5da1f84b24bfeab25","69":"6258b9920cf545ad6043","70":"cf0dc959ae07c017ed3e","71":"a82af2a3c60b498c6b10","72":"adda6ceb50c78f5aae68","73":"884f5978ac8bcb4fdc45","74":"cf1ca882da11e35bea7c","75":"7e7c004989bdfef01a71"}[chunkId] + "" /******/ return __webpack_require__.p + "js/" + ({}[chunkId]||chunkId) + ".js?id=" + {"0":"0dcde053981f92959e59","1":"40f269324eb90e7c5005","2":"d2a49802291d427ca7c8","3":"a0f4c2f49863abbfe7f1","4":"27416beeac7dd90b6c9f","5":"fbfbcf45610d060d921e","6":"73fc0264b5cc06f5bd55","7":"140acb8c38018bb7c822","8":"3b0a87d878c97185a291","9":"3347d79d05ca0ac7a350","10":"47d8d4c4aa7f3eeae6b8","11":"8c5c9f6fa8b7aaec38ee","12":"03ffa63c616af52e9173","13":"1f917f9eb173c1c73c26","14":"d0c922727dbc8b127550","15":"b406efe2b2eb8988be0b","16":"ae392c0d7939c1834713","17":"031677a852ea3f5eb57a","18":"78c595d4f44ed93b16ae","19":"0cefe5adcf3c9c67917d","20":"c3aaa3a8880c1323f5b9","21":"c6824027cf77f1875e86","22":"bb6e0db11ce8cea1ea15","23":"0924f149c1e3f1ccc23b","24":"e0139a753b3037348bd3","25":"523a459f15606706e0f4","26":"78ea723a4d8f6c925287","27":"61b4c089c608f7f27b57","28":"df81cbcdc7dddac9a1cf","29":"205fcb561832fdca3613","30":"34254d5ab54e1b77af57","31":"b24fe053d9586525bd04","32":"d40da2a9d0dfcdfcf40e","33":"4ee1d57db25ce73da07a","34":"a1dc60cf9b240735c524","35":"13384dcc57163b2c15fb","36":"07128eb2197b6a6d9955","37":"8b8ab95aeaa851c57033","38":"d123e29b59d771ee7750","39":"fe834feb15b9160591f0","40":"90e1e3b80ac15780aa45","41":"26e0438c5430defefcb4","42":"f7e025a8a96b2e66d300","43":"c6cbbb84bf085e916af4","44":"837f8f061ed475f2c043","45":"1311d0b2659eb428a007","46":"96963330e5744696f861","47":"b9dd7aafbd529e03b008","48":"303c80c25410a7039819","49":"080bb4762ce606a20938","50":"6a2be057a821819e0f3f","51":"31ee010f65a984f2b422","52":"8b80af5beb017ef9538e","53":"327b50ce903b0f348341","54":"cb30fead7b74df252e66","55":"0953446db22303519e08","56":"6bc136b4c9a35e9a1836","57":"3f7b6082e37f0f114055","58":"a1668de9111dbf09572b","59":"b6ab5d03b46b7ae139a7","60":"37d00800b71f79260df7","61":"7799c0088535883cfcdc","62":"5e0875a9e333d029edcb","63":"3fbf8bbeb22bdf1a3538","64":"35e94b96c17d9176fdd1","65":"c40d3bc7ae4294705195","66":"54405ebd171bf0a0be8a","67":"0cf2c9062ba4048c4d16","68":"47e5da1f84b24bfeab25","69":"6258b9920cf545ad6043","70":"cf0dc959ae07c017ed3e","71":"a82af2a3c60b498c6b10","72":"adda6ceb50c78f5aae68","73":"884f5978ac8bcb4fdc45","74":"cf1ca882da11e35bea7c","75":"7e7c004989bdfef01a71"}[chunkId] + ""
/******/ } /******/ }
/******/ /******/
/******/ // The require function /******/ // The require function

View File

@@ -8,12 +8,15 @@
<template #form> <template #form>
<FormInput :label="__('Name')" :errors="$page.errors.name" v-model="form.name"/> <FormInput :label="__('Name')" :errors="$page.errors.name" v-model="form.name"/>
<FormSelect :label="__('Select provider')"> <FormSelect :errors="$page.errors.provider" :label="__('Select provider')"
v-model="form.provider">
<option :value="`${null}`">{{ __('Select random provider') }}</option> <option :value="`${null}`">{{ __('Select random provider') }}</option>
<option v-for="(name, id) in providers" :value="id">{{ name }}</option>
</FormSelect> </FormSelect>
<FormSelect :label="__('Select region')"> <FormSelect :errors="$page.errors.region" :label="__('Select region')" v-model="form.region">
<option :value="`${null}`">{{ __('Select random region') }}</option> <option :value="`${null}`">{{ __('Select random region') }}</option>
<option v-for="(name, id) in regions" :value="id">{{ name }}</option>
</FormSelect> </FormSelect>
</template> </template>
@@ -38,7 +41,7 @@
</PageHeader> </PageHeader>
<PageBody> <PageBody>
<EmptyImage v-if="!servers.meta.total" /> <EmptyImage v-if="!servers.meta.total"/>
<List> <List>
<ListItem v-for="server in servers.data" :key="server.id"> <ListItem v-for="server in servers.data" :key="server.id">
<template #prefix> <template #prefix>
@@ -52,12 +55,14 @@
<template #suffix> <template #suffix>
<Dropdown v-slot="{ isOpen, toggle, position }"> <Dropdown v-slot="{ isOpen, toggle, position }">
<IconButton @click="toggle"> <IconButton @click="toggle">
<IconMore class="w-5 h-5" /> <IconMore class="w-5 h-5"/>
</IconButton> </IconButton>
<DropdownList :position="position" v-if="isOpen"> <DropdownList :position="position" v-if="isOpen">
<DropdownListItem :to="route('servers.show', server.id)">View</DropdownListItem> <DropdownListItem :to="route('servers.show', server.id)">View</DropdownListItem>
<DropdownListItemButton class="text-danger" @click="confirmDelete(server)">Delete</DropdownListItemButton> <DropdownListItemButton class="text-danger" @click="confirmDelete(server)">
Delete
</DropdownListItemButton>
</DropdownList> </DropdownList>
</Dropdown> </Dropdown>
</template> </template>
@@ -141,6 +146,7 @@ export default {
props: { props: {
servers: Object, servers: Object,
dataProviders: Object,
}, },
computed: { computed: {
@@ -151,8 +157,8 @@ export default {
} }
}, },
mounted(){ mounted() {
if(this.shouldBePolling){ if (this.shouldBePolling) {
this.startPollingInterval(); this.startPollingInterval();
} }
}, },
@@ -165,9 +171,16 @@ export default {
return; return;
} }
if(!this.pollingInterval){ if (!this.pollingInterval) {
this.startPollingInterval(); this.startPollingInterval();
} }
},
'form.provider': function(value) {
window.axios.get(this.route('servers.regions', value))
.then(response => {
this.regions = response.data;
})
} }
}, },
@@ -179,6 +192,9 @@ export default {
region: null, region: null,
}, },
providers: this.dataProviders,
regions: [],
pollingInterval: null, pollingInterval: null,
modalIsOpen: false, modalIsOpen: false,
@@ -196,13 +212,13 @@ export default {
}, },
methods: { methods: {
startPollingInterval(){ startPollingInterval() {
this.pollingInterval = setInterval(function () { this.pollingInterval = setInterval(function () {
this.poll(); this.poll();
}.bind(this), 3000); }.bind(this), 3000);
}, },
clearPollingInterval(){ clearPollingInterval() {
clearTimeout(this.pollingInterval); clearTimeout(this.pollingInterval);
this.pollingInterval = null; this.pollingInterval = null;
}, },
@@ -216,14 +232,14 @@ export default {
submit() { submit() {
this.$inertia.post(this.route('servers.store'), this.form, { this.$inertia.post(this.route('servers.store'), this.form, {
only: ['errors', 'flash', 'servers'] only: ['errors', 'flash', 'servers'],
}) onFinish: () => {
.then((response) => {
if (!Object.keys(this.$page.errors).length) { if (!Object.keys(this.$page.errors).length) {
this.form.domain = null; this.form.domain = null;
this.modalIsOpen = false; this.modalIsOpen = false;
} }
}); }
});
}, },
confirmDelete(server) { confirmDelete(server) {
@@ -239,7 +255,7 @@ export default {
} }
}, },
beforeDestroy(){ beforeDestroy() {
this.clearPollingInterval(); this.clearPollingInterval();
} }
} }

View File

@@ -74,6 +74,7 @@ Route::group(['middleware' => ['auth', 'auth.blocked']], function () {
// Server routes // Server routes
Route::group(['prefix' => 'servers', 'as' => 'servers.'], function () { Route::group(['prefix' => 'servers', 'as' => 'servers.'], function () {
Route::get('/', 'ServerController@index')->name('index'); Route::get('/', 'ServerController@index')->name('index');
Route::get('{provider}/regions', 'ServerController@regions')->name('regions');
Route::get('{server}', 'ServerController@show')->name('show'); Route::get('{server}', 'ServerController@show')->name('show');
Route::get('{server}/settings', 'ServerController@show')->name('show'); Route::get('{server}/settings', 'ServerController@show')->name('show');
Route::post('/', 'ServerController@store')->name('store'); Route::post('/', 'ServerController@store')->name('store');