diff --git a/src/planStorage.ts b/src/planStorage.ts
new file mode 100644
index 0000000..f0bafc6
--- /dev/null
+++ b/src/planStorage.ts
@@ -0,0 +1,74 @@
+// planStorage.ts
+
+/**
+ * Saves a roast plan to local storage.
+ *
+ * @param name The name of the plan.
+ * @param temperatures A comma-separated string of temperature targets.
+ */
+export function savePlan(name: string, temperatures: string): void {
+ if (!name) {
+ throw new Error("Please provide a valid name for the roast plan.");
+ }
+
+ const trimmedTemperatures = temperatures.trim();
+ if (!trimmedTemperatures) {
+ throw new Error("Temperature list is empty.");
+ }
+
+ // Parse and validate temperature input
+ const parsedTemps = trimmedTemperatures.split(',').map(x => x.trim()).map(Number);
+ if (parsedTemps.some(val => isNaN(val))) {
+ throw new Error("Invalid temperature list. Please enter comma-separated numbers.");
+ }
+
+ localStorage.setItem(`roastplan_${name}`, trimmedTemperatures);
+}
+
+/**
+ * Loads a saved roast plan from local storage.
+ *
+ * @param name The name of the plan to load.
+ * @returns A string containing the temperature targets, or null if not found.
+ */
+export function retrievePlan(name: string): string | null {
+ if (!name) return null;
+
+ const stored = localStorage.getItem(`roastplan_${name}`);
+ return stored || null;
+}
+
+/**
+ * Deletes all saved roast plans from local storage.
+ */
+export function clearAllPlans(): void {
+ const keysToRemove: string[] = [];
+
+ for (let i = 0; i < localStorage.length; i++) {
+ const key = localStorage.key(i);
+ if (key && key.startsWith("roastplan_")) {
+ keysToRemove.push(key);
+ }
+ }
+
+ keysToRemove.forEach(key => localStorage.removeItem(key));
+}
+
+/**
+ * Lists all saved roast plan names from local storage.
+ *
+ * @returns An array of strings representing the names of saved plans.
+ */
+export function listSavedPlans(): string[] {
+ const savedPlanNames: string[] = [];
+
+ for (let i = 0; i < localStorage.length; i++) {
+ const key = localStorage.key(i);
+ if (key && key.startsWith("roastplan_")) {
+ const planName = key.replace("roastplan_", "");
+ savedPlanNames.push(planName);
+ }
+ }
+
+ return savedPlanNames;
+}
\ No newline at end of file
diff --git a/src/roast.ts b/src/roast.ts
index 14135ed..0d69ae1 100644
--- a/src/roast.ts
+++ b/src/roast.ts
@@ -1,4 +1,5 @@
import { loadGraph } from './tempgraph.ts';
+import { savePlan, retrievePlan, clearAllPlans, listSavedPlans } from './planStorage.ts';
let timer = 0;
let isRunning = false;
@@ -275,53 +276,61 @@ function saveCurrentPlan(): void {
const planName = nameInput.value.trim();
const rawInput = (document.getElementById("plan-input") as HTMLInputElement).value.trim();
- if (!planName) {
- alert("Please enter a name to save the plan.");
- return;
+ try {
+ savePlan(planName, rawInput);
+ alert(`Plan "${planName}" saved successfully.`);
+ } catch (error) {
+ alert(error.message);
}
- if (!rawInput) {
- alert("Temperature list is empty.");
- return;
- }
-
- const parsed = rawInput.split(',').map(x => x.trim()).map(Number);
- if (parsed.some(val => isNaN(val))) {
- alert("Invalid temperature list. Please enter comma-separated numbers.");
- return;
- }
-
- const tempStr = parsed.join(",");
- localStorage.setItem(`roastplan_${planName}`, tempStr);
nameInput.value = "";
updateSavedPlansDropdown();
}
-
function loadSavedPlan(name: string): void {
- if (!name) return;
- const stored = localStorage.getItem(`roastplan_${name}`);
+ const stored = retrievePlan(name);
if (stored) {
targets = stored.split(",").map(Number);
currentTargetIndex = 0;
document.getElementById("controls")!.classList.remove("hidden");
document.getElementById("create-plan")!.classList.add("hidden");
+
+ // Set the plan in the text box
+ console.log("Set plan: " +stored);
+ const planInput = document.getElementById("plan-input") as HTMLInputElement;
+ const savedName = document.getElementById("save-name") as HTMLInputElement;
+ planInput.value = stored;
+ savedName.value = name;
+
generateTempButtons();
+
+ // Reset the input dropdown to the first (choose prompt) entry
+ updateSavedPlansDropdown();
+ } else {
+ alert(`No plan found with the name "${name}".`);
}
}
function updateSavedPlansDropdown(): void {
const dropdown = document.getElementById("saved-plans") as HTMLSelectElement;
- dropdown.innerHTML = '';
- for (let i = 0; i < localStorage.length; i++) {
- const key = localStorage.key(i);
- if (key && key.startsWith("roastplan_")) {
- const name = key.replace("roastplan_", "");
- const option = document.createElement("option");
- option.value = name;
- option.textContent = name;
- dropdown.appendChild(option);
- }
+
+ // Retrieve saved plans from planStorage.ts
+ const savedPlans = listSavedPlans();
+
+ // Reset to default prompt
+ dropdown.innerHTML = '';
+
+ // Populate the dropdown with saved plans
+ savedPlans.forEach(planName => {
+ const option = document.createElement('option');
+ option.value = planName;
+ option.textContent = planName;
+ dropdown.appendChild(option);
+ });
+
+ // Set the first entry as selected if available
+ if (savedPlans.length > 0) {
+ dropdown.selectedIndex = 0; // Index 1 corresponds to the first actual plan
}
}
@@ -329,16 +338,7 @@ function clearSavedPlans(): void {
const confirmClear = confirm("Are you sure you want to delete all saved roast plans?");
if (!confirmClear) return;
- const keysToRemove: string[] = [];
-
- for (let i = 0; i < localStorage.length; i++) {
- const key = localStorage.key(i);
- if (key && key.startsWith("roastplan_")) {
- keysToRemove.push(key);
- }
- }
-
- keysToRemove.forEach(key => localStorage.removeItem(key));
+ clearAllPlans();
updateSavedPlansDropdown();
alert("All saved roast plans have been deleted.");
}
@@ -364,5 +364,4 @@ if (typeof window !== 'undefined') {
window.clearSavedPlans = clearSavedPlans;
}
-
export {};