Populate the list

This commit is contained in:
CenTdemeern1 2025-01-14 17:41:14 +01:00 committed by git.gay
parent 6a12b59f87
commit 1e877a5d92
4 changed files with 63 additions and 7 deletions

View file

@ -120,3 +120,12 @@ abbr[title] {
left: 50%;
translate: -50% -50%;
}
.logo {
height: 4em;
}
.inlineIcon {
height: var(--medium);
vertical-align: text-top;
}

View file

@ -20,15 +20,19 @@
<h1>FeDirect</h1>
<p class="margin-auto-top">&ThickSpace;By Nekomata</p>
</div>
<img src="/static/nekomata_small.png" alt="Nekomata Logo" style="height: 4em;" />
<img src="/static/nekomata_small.png" alt="Nekomata Logo" class="logo" />
</header>
<div class="flex-row">
<div class="half-width">
<form>
<input id="radio" type="radio" />
<label for="radio">
Instances and stuff go here!
</label>
<form id="instanceSelectForm">
<div>
<input id="eepy.moe" type="radio" name="instanceSelect" />
<label for="eepy.moe">
Eepy Moe <img src="https://eepy.moe/static-assets/icons/192.png" alt="Eepy Moe icon"
class="inlineIcon" />
<small>(Sharkey)</small>
</label>
</div>
</form>
<br>
<button onclick="showAddInstanceDialog()">Add an instance</button>

View file

@ -1,5 +1,7 @@
import { initializeAddInstanceFlow } from "./add_instance_flow.mjs";
import { findDialogOrFail } from "./dom.mjs";
import { findDialogOrFail, findFormOrFail } from "./dom.mjs";
import knownSoftware from "./known_software.mjs";
import storageManager from "./storage_manager.mjs";
export function getMainDialog(): HTMLDialogElement {
return document.getElementById('mainDialog') as HTMLDialogElement;
@ -7,8 +9,43 @@ export function getMainDialog(): HTMLDialogElement {
const detailsDialog = findDialogOrFail(document.body, "#instanceDetails");
const addDialog = findDialogOrFail(document.body, "#addInstance");
const instanceSelectForm = findFormOrFail(document.body, "#instanceSelectForm");
export const {
showAddInstanceDialog,
hideAddInstanceDialog
} = initializeAddInstanceFlow(detailsDialog, addDialog);
function createInstanceSelectOptions() {
instanceSelectForm.replaceChildren(); // Erase all child nodes
for (const instance of storageManager.storage.instances) {
const div = document.createElement("div");
div.setAttribute("x-option", instance.origin);
const radio = document.createElement("input");
radio.id = instance.origin;
radio.type = "radio";
radio.name = "instanceSelect";
const label = document.createElement("label");
label.htmlFor = instance.origin;
label.innerText = instance.name + " ";
if (instance.iconURL) {
const img = new Image();
img.src = instance.iconURL;
img.alt = `${instance.name} icon`;
img.className = "inlineIcon";
label.append(img, " ");
}
const small = document.createElement("small");
const softwareName = knownSoftware.software[instance.software].name;
small.innerText = `(${softwareName})`;
label.appendChild(small);
div.appendChild(radio);
div.appendChild(label);
instanceSelectForm.appendChild(div);
}
const firstInput = instanceSelectForm.querySelector("input");
if (firstInput) firstInput.checked = true;
}
createInstanceSelectOptions();
storageManager.addSaveCallback(createInstanceSelectOptions);

View file

@ -33,6 +33,7 @@ type LocalStorage = {
export default new class StorageManager {
storage: LocalStorage;
saveCallbacks: (() => void)[] = [];
constructor() {
this.load();
@ -50,5 +51,10 @@ export default new class StorageManager {
save() {
window.localStorage.setItem("storage", JSON.stringify(this.storage));
this.saveCallbacks.forEach(c => c());
}
addSaveCallback(callback: () => void) {
this.saveCallbacks.push(callback);
}
}();