// UnitForge Templates JavaScript // Handles the templates browser functionality class TemplatesBrowser { constructor() { this.templates = []; this.filteredTemplates = []; this.currentCategory = "all"; this.currentTemplate = null; this.init(); } init() { this.setupEventListeners(); this.loadTemplates(); } setupEventListeners() { // Search input const searchInput = document.getElementById("searchInput"); if (searchInput) { searchInput.addEventListener( "keyup", this.debounce(this.filterTemplates.bind(this), 300), ); } // Template form changes document.addEventListener("change", (e) => { if ( e.target.matches( "#templateForm input, #templateForm select, #templateForm textarea", ) ) { this.updatePreview(); } }); document.addEventListener("input", (e) => { if (e.target.matches("#templateForm input, #templateForm textarea")) { this.updatePreview(); } }); } async loadTemplates() { const loadingState = document.getElementById("loadingState"); const templatesGrid = document.getElementById("templatesGrid"); try { // Temporarily use static JSON file for testing const response = await fetch("/static/templates.json"); this.templates = await response.json(); this.filteredTemplates = [...this.templates]; if (loadingState) loadingState.classList.add("d-none"); if (templatesGrid) templatesGrid.classList.remove("d-none"); this.renderTemplates(); this.updateCategoryCounts(); } catch (error) { if (loadingState) { loadingState.innerHTML = `
${error.message}
${this.escapeHtml(template.description)}
No parameters required for this template.
'; } return this.currentTemplate.parameters .map((param) => { const isRequired = param.required; const fieldId = `param-${param.name}`; let inputHtml = ""; switch (param.type) { case "boolean": inputHtml = ` `; break; case "choice": const options = param.choices .map( (choice) => ``, ) .join(""); inputHtml = ` `; break; case "integer": inputHtml = ` `; break; default: // string, list inputHtml = ` `; } return `# Please fill in required parameters: ${missingRequired.join(", ")}`;
if (validation) validation.classList.add("d-none");
return;
}
try {
const result = await unitforge.generateFromTemplate(
this.currentTemplate.name,
parameters,
`${parameters.name || "generated"}.${this.currentTemplate.unit_type}`,
);
preview.innerHTML = `${this.escapeHtml(result.content)}`;
// Update filename
const filenameElement = document.getElementById("previewFilename");
if (filenameElement) {
filenameElement.textContent = result.filename;
}
// Show validation results
if (validation && result.validation) {
validation.innerHTML = unitforge.formatValidationResults(
result.validation,
);
validation.classList.remove("d-none");
}
} catch (error) {
preview.innerHTML = `# Error generating preview: ${error.message}`;
if (validation) validation.classList.add("d-none");
}
}
async validateTemplate() {
const parameters = this.getFormParameters();
const validation = document.getElementById("validationResults");
if (!validation) return;
validation.innerHTML = `