You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
186 lines
7.9 KiB
186 lines
7.9 KiB
<script setup> |
|
import InputError from '@/Components/InputError.vue'; |
|
import TextInput from '@/Components/TextInput.vue'; |
|
import Layout from '@/Layouts/Layout.vue'; |
|
import { Head, useForm } from '@inertiajs/vue3'; |
|
import { ref } from 'vue'; |
|
|
|
const props = defineProps({ |
|
server: { |
|
type: Object, |
|
required: true |
|
} |
|
}); |
|
|
|
const isFocus = ref(false); |
|
const form = useForm(); |
|
const editForm = useForm({ name: props.server.name }); |
|
|
|
const start = (uuid) => { |
|
form.post(route("servers.start", uuid)); |
|
} |
|
|
|
const stop = (uuid) => { |
|
form.post(route("servers.stop", uuid)); |
|
} |
|
|
|
const del = (uuid) => { |
|
if(prompt("Entrer le nom du server en confirmation.") == props.server.name) form.delete(route("servers.destroy", uuid)); |
|
} |
|
|
|
const pub = (uuid) => { |
|
if(props.server.public) form.post(route("servers.public", uuid)); |
|
else if (prompt("Entrer le nom du server en confirmation.") == props.server.name) form.post(route("servers.public", uuid)); |
|
} |
|
|
|
const edit = () => { |
|
console.log(editForm.name); |
|
editForm.post(route("servers.update", props.server.uuid)); |
|
} |
|
|
|
const copie = () => { |
|
navigator.clipboard.writeText('hosting.anulax.ch:' + props.server.ports[0]).then(() => alert("lien de connection copié!")) |
|
} |
|
|
|
</script> |
|
|
|
<template> |
|
<Head title="Spawn" /> |
|
<Layout> |
|
<!-- En-tête --> |
|
<header class="my-10 text-center"> |
|
<h1 class="text-4xl font-bold flex items-center justify-center gap-2 fade-in"> |
|
Dashboard du Serveur |
|
</h1> |
|
<p class="text-gray-300 mt-4 fade-in"> |
|
Gérez et visualisez les informations clés de votre serveur en un coup d'œil. |
|
</p> |
|
</header> |
|
|
|
<!-- Cartes d'information --> |
|
<main class="max-w-6xl mx-auto grid grid-cols-1 md:grid-cols-3 gap-6 mb-6 slide-up"> |
|
<!-- Carte : Informations Générales --> |
|
<div class="bg-gray-800 rounded-lg shadow-lg p-6"> |
|
<h2 class="text-2xl font-semibold border-b border-gray-700 pb-2 mb-4 flex items-center gap-2"> |
|
<img src="/icons/server-icon.svg" alt="Général" class="w-6 h-6 rotate-on-hover invert"> |
|
Informations Générales |
|
</h2> |
|
<div class="space-y-3 text-sm"> |
|
<div class="flex justify-between"> |
|
<span class="font-medium">Nom</span> |
|
<span class="text-green-400 font-bold">{{ props.server.name }}</span> |
|
</div> |
|
<div class="flex justify-between"> |
|
<span class="font-medium">Type de jeu</span> |
|
<span>{{ props.server.service.name }}</span> |
|
</div> |
|
<div class="flex justify-between"> |
|
<span class="font-medium">Public</span> |
|
<span>{{ props.server.public ? "Oui" : "Non" }}</span> |
|
</div> |
|
<div class="flex flex-col gap-2"> |
|
<div class="flex justify-between items-center mb-1"> |
|
<div class="flex items-center gap-2"> |
|
<span class="font-medium">Lien de connection</span> |
|
</div> |
|
<div class="flex items-center gap-2"> |
|
<p class="text-green-400 hover:underline"> |
|
{{ props.server.ports.length && props.server.status.id < 3 ? "hosting.anulax.ch:" + props.server.ports[0] : "Indisponible" }} |
|
</p> |
|
<button v-show="props.server.ports.length && props.server.status.id < 3" @click="copie" class="bg-blue-500 hover:bg-blue-600 text-white font-bold p-1 rounded-lg shadow-lg glow-on-hover flex items-center"> |
|
<img src="/icons/copy-icon.svg" alt="Copier" class="w-5 h-5 invert"> |
|
</button> |
|
</div> |
|
</div> |
|
|
|
</div> |
|
</div> |
|
</div> |
|
|
|
<!-- Carte : Activité --> |
|
<div class="bg-gray-800 rounded-lg shadow-lg p-6"> |
|
<h2 class="text-2xl font-semibold border-b border-gray-700 pb-2 mb-4 flex items-center gap-2"> |
|
<img src="/icons/stats-icon.svg" alt="Activité" class="w-6 h-6 rotate-on-hover invert">Activité |
|
</h2> |
|
<div class="space-y-3 text-sm mb-4"> |
|
<div class="flex justify-between"> |
|
<span class="font-medium">Statut</span> |
|
<span class="text-green-400 font-bold">{{ props.server.status.title }}</span> |
|
</div> |
|
<div class="flex justify-between"> |
|
<span class="font-medium">Dernier lancement</span> |
|
<span class="text-green-400 font-bold">{{ props.server.start ? props.server.start : "Aucun" }}</span> |
|
</div> |
|
<div class="flex justify-between"> |
|
<span class="font-medium">Dernier arrêt </span> |
|
<span class="text-red-400 font-bold">{{ props.server.end ? props.server.end : "Aucun" }}</span> |
|
</div> |
|
</div> |
|
<div class="flex gap-3"> |
|
<div @click="start(props.server.uuid)" v-if="props.server.status.id >= 3" class="bg-green-500 hover:bg-green-600 text-white font-bold p-2 rounded-lg shadow-lg glow-on-hover flex items-center gap-2"> |
|
<img src="/icons/start-icon.svg" alt="Start" class="w-5 h-5 invert"> |
|
</div> |
|
<div @click="stop(props.server.uuid)" v-else class="bg-red-500 hover:bg-red-600 text-white font-bold p-2 rounded-lg shadow-lg glow-on-hover flex items-center gap-2"> |
|
<img src="/icons/stop-icon.svg" alt="Stop" class="w-5 h-5 invert"> |
|
</div> |
|
</div> |
|
</div> |
|
|
|
<!-- Carte : Hardware --> |
|
<div class="bg-gray-800 rounded-lg shadow-lg p-6"> |
|
<h2 class="text-2xl font-semibold border-b border-gray-700 pb-2 mb-4 flex items-center gap-2"> |
|
<img src="/icons/hardware-icon.svg" alt="Hardware" class="w-6 h-6 rotate-on-hover invert"> |
|
Hardware(fake) |
|
</h2> |
|
<div class="space-y-3 text-sm"> |
|
<div class="flex justify-between"> |
|
<span class="font-medium">CPUs</span> |
|
<span>1</span> |
|
</div> |
|
<div class="flex justify-between"> |
|
<span class="font-medium">Memory</span> |
|
<span>4GB</span> |
|
</div> |
|
<div class="flex justify-between"> |
|
<span class="font-medium">Stockage</span> |
|
<span>10GB</span> |
|
</div> |
|
</div> |
|
</div> |
|
</main> |
|
<!-- Section Actions en haut --> |
|
<section class="max-w-6xl mx-auto mb-10 fade-in"> |
|
<div class="flex justify-between items-center bg-gray-800 p-4 rounded-lg shadow-lg"> |
|
<div class="flex gap-3"> |
|
<button class="bg-blue-500 hover:bg-blue-600 text-white font-bold p-2 rounded-lg shadow-lg glow-on-hover flex items-center"> |
|
<img src="/icons/share-icon.svg" alt="Partager" class="w-5 h-5 invert"> |
|
</button> |
|
</div> |
|
<!-- Actions de gestion --> |
|
<div class="flex gap-3 items-center"> |
|
<form v-show="isFocus" @submit.prevent="edit"> |
|
<TextInput |
|
v-model="editForm.name" |
|
type="text" |
|
class="w-full px-3 py-1 rounded bg-gray-700 text-white" |
|
/> |
|
<button type="submit"></button> |
|
<InputError :message="form.errors.name" class="text-left mt-1"></InputError> |
|
</form> |
|
<button @click="isFocus = !isFocus" class="bg-blue-500 hover:bg-blue-600 text-white font-bold p-2 rounded-lg shadow-lg glow-on-hover flex items-center gap-2"> |
|
<img src="/icons/edit-icon.svg" alt="Edit" class="w-5 h-5 invert"> |
|
</button> |
|
<button v-if="props.server.public" @click="pub(props.server.uuid)" class="bg-blue-500 hover:bg-blue-600 text-white font-bold p-2 rounded-lg shadow-lg glow-on-hover flex items-center"> |
|
<img src="/icons/lock.svg" alt="Rendre Privé" class="w-5 h-5 invert"> |
|
</button> |
|
<button v-else @click="pub(props.server.uuid)" class="bg-red-500 hover:bg-red-600 text-white font-bold p-2 rounded-lg shadow-lg glow-on-hover flex items-center"> |
|
<img src="/icons/public-icon.svg" alt="Rendre public" class="w-5 h-5 invert"> |
|
</button> |
|
<button @click="del(props.server.uuid)" class="bg-red-500 hover:bg-red-600 text-white font-bold p-2 rounded-lg shadow-lg glow-on-hover flex items-center gap-2"> |
|
<img src="/icons/delete-icon.svg" alt="Delete" class="w-5 h-5 invert"> |
|
</button> |
|
</div> |
|
</div> |
|
</section> |
|
</Layout> |
|
</template> |