mirror of
https://github.com/bitinflow/expose.git
synced 2026-03-13 13:35:54 +00:00
182 lines
7.8 KiB
Twig
182 lines
7.8 KiB
Twig
<html>
|
|
<head>
|
|
<title>Expose</title>
|
|
<meta charset="UTF-8">
|
|
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
|
|
<script src="https://unpkg.com/tailwindcss-jit-cdn"></script>
|
|
<script type="tailwind-config">
|
|
{
|
|
"darkMode": "class",
|
|
"theme": {
|
|
"extend": {
|
|
"colors": {
|
|
"dark-blue-800": "#ff9900"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
<style type="postcss">
|
|
::selection {
|
|
@apply bg-pink-500 bg-opacity-50;
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="min-h-screen bg-white">
|
|
<nav class="bg-white border-b border-gray-200">
|
|
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
|
<div class="flex justify-between h-16">
|
|
<div class="flex items-center">
|
|
<div class="flex-shrink-0 flex items-center font-bold">
|
|
<a href="https://expose.beyondco.de" target="_blank" class="inline-flex items-center self-start">
|
|
<img src="https://beyondco.de/apps/icons/expose.png" class="h-12">
|
|
<p class="ml-4 font-headline text-lg">Expose</p>
|
|
</a>
|
|
</div>
|
|
<div class="hidden sm:-my-px sm:ml-6 sm:flex">
|
|
<a href="/users"
|
|
class="
|
|
{% if request.is('users*') %} border-indigo-500 focus:border-indigo-700 text-gray-900 {% else %} border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300 focus:text-gray-700 focus:border-gray-300{% endif %}
|
|
inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium leading-5 focus:outline-none transition duration-150 ease-in-out">
|
|
Users
|
|
</a>
|
|
<a href="/sites"
|
|
class="
|
|
{% if request.is('sites') %} border-indigo-500 focus:border-indigo-700 text-gray-900 {% else %} border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300 focus:text-gray-700 focus:border-gray-300{% endif %}
|
|
ml-8 inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium leading-5 focus:outline-none transition duration-150 ease-in-out">
|
|
Shared sites
|
|
</a>
|
|
<a href="/tcp"
|
|
class="
|
|
{% if request.is('tcp') %} border-indigo-500 focus:border-indigo-700 text-gray-900 {% else %} border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300 focus:text-gray-700 focus:border-gray-300{% endif %}
|
|
ml-8 inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium leading-5 focus:outline-none transition duration-150 ease-in-out">
|
|
TCP connections
|
|
</a>
|
|
<a href="/settings"
|
|
class="
|
|
{% if request.is('settings') %} border-indigo-500 focus:border-indigo-700 text-gray-900 {% else %} border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300 focus:text-gray-700 focus:border-gray-300{% endif %}
|
|
ml-8 inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium leading-5 focus:outline-none transition duration-150 ease-in-out">
|
|
Settings
|
|
</a>
|
|
</div>
|
|
</div>
|
|
<div class="-mr-2 flex items-center sm:hidden">
|
|
<!-- Mobile menu button -->
|
|
<button
|
|
class="inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-gray-500 hover:bg-gray-100 focus:outline-none focus:bg-gray-100 focus:text-gray-500 transition duration-150 ease-in-out">
|
|
<!-- Menu open: "hidden", Menu closed: "block" -->
|
|
<svg class="block h-6 w-6" stroke="currentColor" fill="none" viewBox="0 0 24 24">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
|
d="M4 6h16M4 12h16M4 18h16"/>
|
|
</svg>
|
|
<!-- Menu open: "block", Menu closed: "hidden" -->
|
|
<svg class="hidden h-6 w-6" stroke="currentColor" fill="none" viewBox="0 0 24 24">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
|
d="M6 18L18 6M6 6l12 12"/>
|
|
</svg>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</nav>
|
|
<div class="max-w-7xl mx-auto sm:px-6 lg:px-8" id="stats">
|
|
<div class="py-8">
|
|
<dl class="mt-5 grid grid-cols-1 gap-5 sm:grid-cols-3">
|
|
<div class="px-4 py-5 bg-white shadow rounded-lg overflow-hidden sm:p-6">
|
|
<dt class="text-sm font-medium text-gray-500 truncate">
|
|
Total Users
|
|
</dt>
|
|
<dd class="mt-1 text-3xl font-semibold text-gray-900">
|
|
@{ users.total }
|
|
</dd>
|
|
</div>
|
|
|
|
<div class="px-4 py-5 bg-white shadow rounded-lg overflow-hidden sm:p-6">
|
|
<dt class="text-sm font-medium text-gray-500 truncate">
|
|
Shared Sites
|
|
</dt>
|
|
<dd class="mt-1 text-3xl font-semibold text-gray-900">
|
|
@{ sites.length }
|
|
</dd>
|
|
</div>
|
|
|
|
<div class="px-4 py-5 bg-white shadow rounded-lg overflow-hidden sm:p-6">
|
|
<dt class="text-sm font-medium text-gray-500 truncate">
|
|
Shared TCP connections
|
|
</dt>
|
|
<dd class="mt-1 text-3xl font-semibold text-gray-900">
|
|
@{ tcp_connections.length }
|
|
</dd>
|
|
</div>
|
|
</dl>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="py-10">
|
|
<header>
|
|
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
|
<h1 class="text-3xl font-bold leading-tight text-gray-900">
|
|
{% block title %}{% endblock %}
|
|
</h1>
|
|
</div>
|
|
</header>
|
|
<main>
|
|
<div class="max-w-7xl mx-auto sm:px-6 lg:px-8" id="app">
|
|
{% block content %}{% endblock %}
|
|
</div>
|
|
</main>
|
|
</div>
|
|
</div>
|
|
{% block scripts %}{% endblock %}
|
|
<script>
|
|
new Vue({
|
|
el: '#stats',
|
|
|
|
delimiters: ['@{', '}'],
|
|
|
|
data: {
|
|
users: [],
|
|
sites: [],
|
|
tcp_connections: [],
|
|
},
|
|
|
|
methods: {
|
|
getUsers(page) {
|
|
fetch('/api/users')
|
|
.then((response) => {
|
|
return response.json();
|
|
}).then((data) => {
|
|
this.users = data.paginated;
|
|
});
|
|
},
|
|
|
|
getConnections() {
|
|
fetch('/api/tcp')
|
|
.then((response) => {
|
|
return response.json();
|
|
}).then((data) => {
|
|
this.tcp_connections = data.tcp_connections;
|
|
});
|
|
},
|
|
|
|
getSites() {
|
|
fetch('/api/sites')
|
|
.then((response) => {
|
|
return response.json();
|
|
}).then((data) => {
|
|
this.sites = data.sites;
|
|
});
|
|
},
|
|
},
|
|
|
|
mounted() {
|
|
this.getUsers();
|
|
this.getConnections();
|
|
this.getSites();
|
|
}
|
|
})
|
|
</script>
|
|
</body>
|
|
</html>
|