Files
coolify/src/routes/application/[nickname]/logs/index.svelte
Andras Bacsai b4c836afbd v1.0.23 (#68)
# Features 
- Build environment variables for NodeJS builds
- Initial monorepo support (more tests needed!)

# Fixes
- Fix wrong redirects
- Logout fix for the session manager
2021-07-16 23:42:14 +02:00

138 lines
4.2 KiB
Svelte

<script>
import { application, dateOptions } from '$store';
import { fade } from 'svelte/transition';
import { onDestroy, onMount } from 'svelte';
import Loading from '$components/Loading.svelte';
import { request } from '$lib/request';
import { session } from '$app/stores';
import { goto } from '$app/navigation';
let loadDeploymentsInterval = null;
let loadLogsInterval = null;
let deployments = [];
let logs = [];
let page = 1;
onMount(async () => {
loadApplicationLogs();
loadLogsInterval = setInterval(() => {
loadApplicationLogs();
}, 3000);
loadDeploymentsInterval = setInterval(() => {
loadDeploymentLogs();
}, 1000);
});
onDestroy(() => {
clearInterval(loadDeploymentsInterval);
clearInterval(loadLogsInterval);
});
async function loadMoreDeploymentLogs() {
page = page + 1;
await loadDeploymentLogs();
}
async function loadDeploymentLogs() {
deployments = (
await request(
`/api/v1/application/deploy/logs?repoId=${$application.repository.id}&branch=${$application.repository.branch}&page=${page}`,
$session
)
).logs;
}
async function loadApplicationLogs() {
logs = (
await request(`/api/v1/application/logs?name=${$application.build.container.name}`, $session)
).logs;
}
</script>
<div
class="py-5 text-left px-6 text-3xl tracking-tight font-bold flex items-center"
in:fade={{ duration: 100 }}
>
<div>Logs</div>
</div>
{#await loadDeploymentLogs()}
<Loading />
{:then}
<div class="text-center px-6" in:fade={{ duration: 100 }}>
<div class="flex pt-2 space-x-4 w-full">
<div class="w-full">
<div class="font-bold text-left pb-2 text-xl">Application logs</div>
{#if logs.length === 0}
<div class="text-xs font-semibold tracking-tighter">Waiting for the logs...</div>
{:else}
<pre
class="leading-4 text-left text-sm font-semibold tracking-tighter rounded-lg bg-black p-6 whitespace-pre-wrap w-full">
{#each logs as log}
{log + '\n'}
{/each}
</pre>
{/if}
</div>
<div>
<div class="font-bold text-left pb-2 text-xl w-300">Deployment logs</div>
{#if deployments.length > 0}
<div class="space-y-2">
{#each deployments as deployment}
<div
in:fade={{ duration: 100 }}
class="flex space-x-4 text-md py-4 hover:shadow mx-auto cursor-pointer transition-all duration-100 border-l-4 border-transparent rounded hover:bg-warmGray-700"
class:hover:border-green-500={deployment.progress === 'done'}
class:border-yellow-300={deployment.progress !== 'done' &&
deployment.progress !== 'failed'}
class:bg-warmGray-800={deployment.progress !== 'done' &&
deployment.progress !== 'failed'}
class:hover:border-red-500={deployment.progress === 'failed'}
on:click={() => goto(`./logs/${deployment.deployId}`)}
>
<div class="flex space-x-2 px-2">
<div class="font-bold text-sm flex justify-center items-center">
{deployment.branch}
</div>
<div class="font-bold text-xs flex justify-center items-center text-warmGray-500">{deployment.isPr ? 'PR' : ''}</div>
</div>
<div class="flex-1" />
<div class="px-3 w-48">
<div
class="text-xs"
title={new Intl.DateTimeFormat('default', dateOptions).format(
new Date(deployment.createdAt)
)}
>
{deployment.since}
</div>
{#if deployment.progress === 'done'}
<div class="text-xs">
Deployed in <span class="font-bold">{deployment.took}s</span>
</div>
{:else if deployment.progress === 'failed'}
<div class="text-xs text-red-500">Failed</div>
{:else}
<div class="text-xs">Deploying...</div>
{/if}
</div>
</div>
{/each}
</div>
<button
class="text-xs bg-green-600 hover:bg-green-500 p-1 rounded text-white px-2 font-medium my-6"
on:click={loadMoreDeploymentLogs}>Show more</button
>
{:else}
<div class="text-left text-sm tracking-tight">No deployments found</div>
{/if}
</div>
</div>
</div>
{:catch}
<div class="text-center font-bold tracking-tight text-xl">No logs found</div>
{/await}
<style lang="postcss">
.w-300 {
width: 300px !important;
}
</style>