diff --git a/web/static/js/project.js b/web/static/js/project.js new file mode 100644 index 0000000..4b18901 --- /dev/null +++ b/web/static/js/project.js @@ -0,0 +1,197 @@ +// Project / customer context — localStorage CRUD + switcher modal + +import { escHtml, uuid, formatDate } from './utils.js'; + +const STORAGE_KEY = 'migrator_projects'; + +// ── Data model ───────────────────────────────────────────────────────────── +// localStorage schema: +// { active: string|null, projects: Array<{ id, name, createdAt }> } + +function load() { + try { + return JSON.parse(localStorage.getItem(STORAGE_KEY)) || { active: null, projects: [] }; + } catch { + return { active: null, projects: [] }; + } +} + +function save(data) { + localStorage.setItem(STORAGE_KEY, JSON.stringify(data)); +} + +export function listProjects() { + return load().projects; +} + +export function getActive() { + const data = load(); + return data.projects.find(p => p.id === data.active) || null; +} + +export function createProject(name) { + const data = load(); + const project = { id: uuid(), name: name.trim(), createdAt: new Date().toISOString() }; + data.projects.push(project); + if (!data.active) data.active = project.id; + save(data); + return project; +} + +export function deleteProject(id) { + const data = load(); + data.projects = data.projects.filter(p => p.id !== id); + if (data.active === id) { + data.active = data.projects[0]?.id || null; + } + save(data); +} + +export function setActive(id) { + const data = load(); + if (data.projects.find(p => p.id === id)) { + data.active = id; + save(data); + } +} + +// ── Init: called on app startup ───────────────────────────────────────────── +// onUpdate callback is called whenever the active project changes + +let _onUpdate = null; + +export function initProject(onUpdate) { + _onUpdate = onUpdate; + onUpdate(); + // Show project modal on first run if no projects exist + if (listProjects().length === 0) { + showProjectModal(onUpdate); + } +} + +// ── Project switcher modal ───────────────────────────────────────────────── + +export function showProjectModal(onUpdate) { + if (onUpdate) _onUpdate = onUpdate; + + const existing = document.getElementById('project-modal'); + if (existing) existing.remove(); + + const wrapper = document.createElement('div'); + wrapper.id = 'project-modal'; + wrapper.innerHTML = ` +
++ No projects yet. Create one below to get started. +
`; + return; + } + + list.innerHTML = projects.map(p => ` +