Skip to content

Commit

Permalink
feat(friendshipper): add version selection to modal
Browse files Browse the repository at this point in the history
  • Loading branch information
cynful committed May 29, 2024
1 parent 34123a2 commit 5bbf7fa
Show file tree
Hide file tree
Showing 9 changed files with 400 additions and 264 deletions.
52 changes: 27 additions & 25 deletions core/src/clients/kube.rs
Original file line number Diff line number Diff line change
Expand Up @@ -235,30 +235,28 @@ impl KubeClient {
}

match api.list(&lp).await {
Ok(res) => {
Ok(res
.items
.iter()
.map(|i| {
let (ip, port, netimgui_port) = match &i.status {
Some(v) => (v.ip.clone(), v.port, v.netimgui_port),
None => (Some("Missing".to_string()), 0, 0),
};

GameServerResults {
name: i.metadata.name.clone().unwrap(),
display_name: match i.spec.display_name.clone(){
Some(name) => name,
None => i.metadata.name.clone().unwrap(),
},
ip,
port,
netimgui_port,
version: i.spec.version.clone(),
}
})
.collect::<Vec<GameServerResults>>())
}
Ok(res) => Ok(res
.items
.iter()
.map(|i| {
let (ip, port, netimgui_port) = match &i.status {
Some(v) => (v.ip.clone(), v.port, v.netimgui_port),
None => (Some("Missing".to_string()), 0, 0),
};

GameServerResults {
name: i.metadata.name.clone().unwrap(),
display_name: match i.spec.display_name.clone() {
Some(name) => name,
None => i.metadata.name.clone().unwrap(),
},
ip,
port,
netimgui_port,
version: i.spec.version.clone(),
}
})
.collect::<Vec<GameServerResults>>()),
Err(e) => Err(CoreError::from(self.handle_kube_error(e).await)),
}
}
Expand Down Expand Up @@ -294,7 +292,11 @@ impl KubeClient {
}),
..Default::default()
},
spec: GameServerSpec {display_name: Some(display_name.to_string()), version: tag, map },
spec: GameServerSpec {
display_name: Some(display_name.to_string()),
version: tag,
map,
},
status: None,
};

Expand Down
3 changes: 2 additions & 1 deletion core/ui/src/lib/components/repo/ModifiedFilesCard.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import {
CloseCircleSolid,
FileOutline,
FolderOpenOutline,
InfoCircleSolid,
PlusOutline
} from 'flowbite-svelte-icons';
Expand Down Expand Up @@ -241,7 +242,7 @@
size="xs"
class="p-1 border-0 focus-within:ring-0 dark:focus-within:ring-0"
on:click={async () => onOpenDirectory(file.path)}
><FolderOpenSolid class="w-4 h-4" /></Button
><FolderOpenOutline class="w-4 h-4" /></Button
>
<Button
outline
Expand Down
30 changes: 14 additions & 16 deletions friendshipper/src-tauri/src/servers/router.rs
Original file line number Diff line number Diff line change
Expand Up @@ -157,22 +157,20 @@ async fn get_server(
info!("Fetching server {}", name);

match kube_client.get_gameserver(&name).await {
Ok(server) => {
match server.status {
Some(status) => Ok(Json(GameServerResults {
display_name: match server.spec.display_name.clone(){
Some(name) => name,
None => server.metadata.name.clone().unwrap(),
},
name: server.metadata.name.unwrap(),
ip: status.ip,
port: status.port,
netimgui_port: status.netimgui_port,
version: server.spec.version.clone(),
})),
None => Err(CoreError::from(anyhow!("Server is not ready yet"))),
}
}
Ok(server) => match server.status {
Some(status) => Ok(Json(GameServerResults {
display_name: match server.spec.display_name.clone() {
Some(name) => name,
None => server.metadata.name.clone().unwrap(),
},
name: server.metadata.name.unwrap(),
ip: status.ip,
port: status.port,
netimgui_port: status.netimgui_port,
version: server.spec.version.clone(),
})),
None => Err(CoreError::from(anyhow!("Server is not ready yet"))),
},
Err(e) => Err(CoreError::from(anyhow!("Error getting server: {:?}", e))),
}
}
Expand Down
57 changes: 52 additions & 5 deletions friendshipper/src/lib/components/servers/ServerModal.svelte
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
<script lang="ts">
import { Button, Helper, Input, Label, Modal, Select, Toggle } from 'flowbite-svelte';
import { emit } from '@tauri-apps/api/event';
import { get } from 'svelte/store';
import { launchServer } from '$lib/gameServers';
import type { ArtifactEntry } from '$lib/types';
import { activeProjectConfig } from '$lib/stores';
import type { ArtifactEntry, Nullable } from '$lib/types';
import { activeProjectConfig, builtCommits, selectedCommit, workflowMap } from '$lib/stores';
export let showModal: boolean;
export let buildEntry: ArtifactEntry;
export let handleServerCreate: () => Promise<void> = async () => {};
export let handleAutoLaunch: (serverName: string) => Promise<void>;
export let initialEntry: Nullable<ArtifactEntry> = null;
let busy = false;
let serverName = '';
Expand All @@ -18,6 +19,9 @@
const maps = $activeProjectConfig?.maps.map((m) => ({ name: m, value: m }));
let selected: Nullable<ArtifactEntry> = get(selectedCommit);
let recentCommits = get(builtCommits);
const validateServerName = (name: string): boolean => {
if (name === '') return true;
Expand All @@ -31,11 +35,15 @@
};
const handleSubmit = async () => {
if (selected === null) {
return;
}
busy = true;
try {
await launchServer({
commit: buildEntry.commit,
commit: selected.commit,
displayName: serverName,
checkForExisting: false,
map
Expand All @@ -56,18 +64,57 @@
autoLaunch = false;
};
const handleCommitChange = (newCommit: Nullable<ArtifactEntry>) => {
if (newCommit === null) {
return;
}
selectedCommit.set(newCommit);
};
$: void handleCommitChange(selected);
$: $builtCommits,
() => {
recentCommits = get(builtCommits);
};
</script>

<Modal
size="xs"
defaultClass="bg-secondary-700 dark:bg-space-900 overflow-y-auto"
defaultClass="bg-secondary-700 dark:bg-space-900 overflow-y-auto overflow-x-hidden"
bodyClass="!border-t-0"
bind:open={showModal}
on:open={() => {
selected = initialEntry !== null ? initialEntry : get(selectedCommit);
console.log(initialEntry);
console.log(selected);
}}
autoclose={false}
outsideclose
>
<form class="flex flex-col space-y-4" action="#" on:submit|preventDefault={handleSubmit}>
<h4 class="text-lg font-semibold text-primary-400">Launch Server</h4>
<Label color={hasError ? 'red' : 'gray'} class="space-y-2 text-xs text-white">
<span>Version</span>
<Select
size="sm"
class="bg-secondary-700 dark:bg-space-900 border-white dark:border-white text-white dark:text-white"
placeholder="Select a commit"
bind:value={selected}
required
>
{#if recentCommits}
{#each recentCommits as commit}
<option value={commit.value}>
{commit.name.substring(0, 8)}
{$workflowMap.get(commit.name)?.message.substring(0, 55) || ''}
</option>
{/each}
{/if}
</Select>
</Label>
<Label color={hasError ? 'red' : 'gray'} class="space-y-2 text-xs text-white">
<span>Name</span>
<Input
Expand Down
48 changes: 31 additions & 17 deletions friendshipper/src/lib/components/servers/ServersListTable.svelte
Original file line number Diff line number Diff line change
@@ -1,24 +1,34 @@
<script lang="ts">
import { Button, Table, TableBody, TableBodyCell, TableBodyRow, Tooltip } from 'flowbite-svelte';
import {
Button,
Table,
TableBody,
TableBodyCell,
TableBodyRow,
TableHead,
TableHeadCell,
Tooltip
} from 'flowbite-svelte';
import { ArchiveArrowDownOutline, CodeOutline, FileCopyOutline } from 'flowbite-svelte-icons';
import { emit } from '@tauri-apps/api/event';
import ServerLogsModal from '$lib/components/servers/ServerLogsModal.svelte';
import { ProgressModal } from '@ethos/core';
import type { GameServerResult, SyncClientRequest } from '$lib/types';
import { builds } from '$lib/stores';
import { syncClient } from '$lib/builds';
import { downloadServerLogs, terminateServer } from '$lib/gameServers';
import { ProgressModal } from '@ethos/core';
import ServerLogsModal from '$lib/components/servers/ServerLogsModal.svelte';
const defaultLogTooltip = 'Download server logs';
export let servers: GameServerResult[] = [];
export let onUpdateServers: () => Promise<void>;
export let showHeader = false;
// Loading states
let syncing = false;
let downloadingLogs = false;
let logTooltip = defaultLogTooltip;
export let servers: GameServerResult[] = [];
export let onUpdateServers: () => Promise<void>;
// logs modal
let showServerLogsModal = false;
let selectedServerName = '';
Expand All @@ -35,7 +45,6 @@
const entry = $builds.entries.find((e) => e.commit === server.version);
if (!entry) {
console.log('NO');
return;
}
Expand Down Expand Up @@ -81,29 +90,34 @@
</script>

<Table color="custom" striped={true} divClass="w-full h-full overflow-x-hidden overflow-y-auto">
{#if showHeader}
<TableHead class="text-center border-b-0 p-2 bg-secondary-800 dark:bg-space-950">
<TableHeadCell class="">Name</TableHeadCell>
<TableHeadCell class="">Version</TableHeadCell>
<TableHeadCell class="" />
</TableHead>
{/if}
<TableBody>
{#if servers.length === 0}
<TableBodyRow class="text-center p-2">
<TableBodyCell class="py-2" colspan="4">
<TableBodyCell class="" colspan="4">
<p class="text-gray-400 dark:text-gray-400">No servers found</p>
</TableBodyCell>
</TableBodyRow>
{:else}
{#each servers as server, index}
<TableBodyRow
class="text-center border-b-0 p-2 {index % 2 === 0
? 'bg-secondary-800 dark:bg-space-950'
: 'bg-secondary-700 dark:bg-space-900'}"
? 'bg-secondary-700 dark:bg-space-900'
: 'bg-secondary-800 dark:bg-space-950'}"
>
<TableBodyCell class="py-2 text-xs"
>{formatServerName(server.displayName || server.name)}</TableBodyCell
>
<TableBodyCell class="py-2 text-xs">{formatServerName(server.name)}</TableBodyCell>
<Tooltip
class="w-auto text-xs text-primary-400 bg-secondary-600 dark:bg-space-800"
placement="top"
>{server.name}
</Tooltip>
<TableBodyCell
class="py-2 w-16 max-w-[4rem] break-normal overflow-ellipsis whitespace-nowrap text-xs"
>{server.version.substring(0, 8)}</TableBodyCell
>
<TableBodyCell class="py-2 flex gap-2 justify-end">
<Button
outline
Expand Down Expand Up @@ -167,5 +181,5 @@
</TableBody>
</Table>

<ProgressModal bind:showModal={syncing} title="Syncing Client" />
<ProgressModal bind:showModal={syncing} />
<ServerLogsModal bind:showModal={showServerLogsModal} serverName={selectedServerName} />
11 changes: 8 additions & 3 deletions friendshipper/src/lib/components/workflows/WorkflowTable.svelte
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
<script lang="ts">
import { Badge, Button, Card, Indicator, Tooltip } from 'flowbite-svelte';
import { ChevronDownOutline, ChevronUpOutline, CloseOutline, CodeOutline } from 'flowbite-svelte-icons';
import {
ChevronDownOutline,
ChevronUpOutline,
CloseOutline,
CodeOutline
} from 'flowbite-svelte-icons';
import { emit } from '@tauri-apps/api/event';
import type { CommitWorkflowInfo, Nullable, Workflow } from '$lib/types';
import { stopWorkflow } from '$lib/builds';
Expand Down Expand Up @@ -155,9 +160,9 @@
selectedCommit === commit.commit ? setSelectedCommit('') : setSelectedCommit(commit.commit)}
>
{#if selectedCommit === commit.commit}
<ChevronDownOutline class="w-4 h-4 text-white" />
<ChevronDownOutline class="w-5 h-5 text-white" />
{:else}
<ChevronUpOutline class="w-4 h-4 text-white" />
<ChevronUpOutline class="w-5 h-5 text-white" />
{/if}
</Button>
</div>
Expand Down
Loading

0 comments on commit 5bbf7fa

Please sign in to comment.