persist selections to Local Storage

This commit is contained in:
Gavin McDonald
2025-05-13 10:10:19 -04:00
parent 0bd39683ff
commit e6b9ed1c5d
2 changed files with 52 additions and 13 deletions

View File

@@ -1,6 +1,5 @@
const Hooks = {}; const Hooks = {
EnterToNewline: {
Hooks.EnterToNewline = {
mounted() { mounted() {
this.el.addEventListener('keydown', (e) => { this.el.addEventListener('keydown', (e) => {
if (e.key === 'Enter' && !e.shiftKey) { if (e.key === 'Enter' && !e.shiftKey) {
@@ -14,6 +13,40 @@ Hooks.EnterToNewline = {
} }
}); });
}, },
},
PersistData: {
mounted() {
const form = this.el;
const key = 'label';
const stored = JSON.parse(localStorage.getItem(key) || '{}');
let updated = false;
for (let [name, value] of Object.entries(stored)) {
const input = form.querySelector(`[name="${name}"]`);
if (input) {
input.value = value;
updated = true;
}
}
if (updated) {
this.pushEvent('update_label', stored);
}
form.addEventListener('input', () => {
const data = {};
for (let el of form.elements) {
if (el.name) data[el.name] = el.value;
}
localStorage.setItem(key, JSON.stringify(data));
});
},
},
}; };
export default Hooks; export default Hooks;

View File

@@ -74,7 +74,7 @@ defmodule LabelmakerWeb.Home do
</div> </div>
<div class="flex flex-row justify-between" style="margin-top: 5px;"> <div class="flex flex-row justify-between" style="margin-top: 5px;">
<p class="text-xs text-gray-600 dark:text-gray-400 m-0 ml-1"> <p class="text-xs text-gray-600 dark:text-gray-400 m-0 ml-1">
Note: not all fonts are available for preview. Note: not all fonts and colors are available for preview.
</p> </p>
<div class="flex flex-row gap-1"> <div class="flex flex-row gap-1">
<div <div
@@ -99,7 +99,13 @@ defmodule LabelmakerWeb.Home do
</div> </div>
</div> </div>
<form phx-change="update_label" phx-submit="make_label" class="space-y-4"> <form
id="labelmaker"
phx-hook="PersistData"
phx-change="update_label"
phx-submit="make_label"
class="space-y-4"
>
<div> <div>
<label for="label" class="block text-sm font-medium">Label</label> <label for="label" class="block text-sm font-medium">Label</label>
<input <input