UI: add deploy button, for initial machine deployment

This commit is contained in:
Johannes Kirschbauer
2024-08-13 19:24:08 +02:00
parent 8fe2a40bcc
commit d78c2fc2ac
2 changed files with 68 additions and 8 deletions

View File

@@ -1,7 +1,8 @@
import { Accessor, createEffect, Show } from "solid-js"; import { Accessor, createSignal, Show } from "solid-js";
import { SuccessData } from "../api"; import { callApi, SuccessData } from "../api";
import { Menu } from "./Menu"; import { Menu } from "./Menu";
import { setRoute } from "../App"; import { activeURI, setRoute } from "../App";
import toast from "solid-toast";
type MachineDetails = SuccessData<"list_inventory_machines">["data"][string]; type MachineDetails = SuccessData<"list_inventory_machines">["data"][string];
@@ -14,6 +15,8 @@ interface MachineListItemProps {
export const MachineListItem = (props: MachineListItemProps) => { export const MachineListItem = (props: MachineListItemProps) => {
const { name, info, nixOnly } = props; const { name, info, nixOnly } = props;
const [deploying, setDeploying] = createSignal<boolean>(false);
return ( return (
<li> <li>
<div class="card card-side m-2 bg-base-200"> <div class="card card-side m-2 bg-base-200">
@@ -40,6 +43,16 @@ export const MachineListItem = (props: MachineListItemProps) => {
<div class="text-slate-600"> <div class="text-slate-600">
<Show when={info}>{(d) => d()?.description}</Show> <Show when={info}>{(d) => d()?.description}</Show>
</div> </div>
<div class="text-slate-600">
<Show when={info}>
{(d) => (
<>
<span class="material-icons text-sm">cast_connected</span>
{d()?.deploy.targetHost}
</>
)}
</Show>
</div>
<div class="flex flex-row flex-wrap gap-4 py-2"></div> <div class="flex flex-row flex-wrap gap-4 py-2"></div>
</div> </div>
<div> <div>
@@ -57,8 +70,55 @@ export const MachineListItem = (props: MachineListItemProps) => {
Edit Edit
</a> </a>
</li> </li>
<li> <li
<a>Deploy</a> classList={{
disabled: !info?.deploy.targetHost || deploying(),
}}
onClick={async (e) => {
if (!info?.deploy.targetHost || deploying()) {
return;
}
const active_clan = activeURI();
if (!active_clan) {
toast.error("No active clan selected");
return;
}
if (!info?.deploy.targetHost) {
toast.error(
"Machine does not have a target host. Specify where the machine should be deployed.",
);
return;
}
setDeploying(true);
await toast.promise(
callApi("install_machine", {
opts: {
machine: name,
flake: {
loc: active_clan,
},
no_reboot: true,
target_host: info?.deploy.targetHost,
debug: true,
nix_options: [],
},
password: null,
}),
{
loading: "Deploying...",
success: "Deployed",
error: "Failed to deploy",
},
);
setDeploying(false);
}}
>
<a>
<Show when={info?.deploy.targetHost} fallback={"Deploy"}>
{(d) => `Deploy to ${d()}`}
</Show>
</a>
</li> </li>
</ul> </ul>
</Menu> </Menu>

View File

@@ -308,10 +308,10 @@ export const Flash = () => {
{/* WiFi Networks */} {/* WiFi Networks */}
<div class="mb-4"> <div class="mb-4">
<h3 class="text-lg font-semibold mb-2">WiFi Networks</h3> <h3 class="mb-2 text-lg font-semibold">WiFi Networks</h3>
<For each={wifiNetworks()}> <For each={wifiNetworks()}>
{(network, index) => ( {(network, index) => (
<div class="flex gap-2 mb-2"> <div class="mb-2 flex gap-2">
<Field <Field
name={`wifi.${index()}.ssid`} name={`wifi.${index()}.ssid`}
validate={[required("SSID is required")]} validate={[required("SSID is required")]}
@@ -346,7 +346,7 @@ export const Flash = () => {
/> />
<button <button
type="button" type="button"
class="absolute inset-y-14 right-0 pr-3 flex items-center text-sm leading-5" class="absolute inset-y-14 right-0 flex items-center pr-3 text-sm leading-5"
onClick={() => togglePasswordVisibility(index())} onClick={() => togglePasswordVisibility(index())}
> >
<span class="material-icons"> <span class="material-icons">