/** * Project Editor Modal * Handles creation, editing, viewing, and variable management for projects * * @class ProjectEditor */ class ProjectEditor { constructor() { this.mode = 'create'; // 'create', 'edit', 'view', 'variables' this.projectId = null; this.originalProject = null; this.variables = []; } /** * Open editor in create mode */ openCreate() { this.mode = 'create'; this.projectId = null; this.originalProject = null; this.render(); this.attachEventListeners(); } /** * Open editor in edit mode */ async openEdit(projectId) { this.mode = 'edit'; this.projectId = projectId; try { const response = await apiRequest(`/api/admin/projects/${projectId}`); if (!response.success || !response.project) { throw new Error('Failed to load project'); } this.originalProject = response.project; this.variables = response.variables || []; this.render(); this.populateForm(response.project); this.attachEventListeners(); } catch (error) { console.error('Failed to load project:', error); showToast('Failed to load project for editing', 'error'); } } /** * Open editor in view mode (read-only) */ async openView(projectId) { this.mode = 'view'; this.projectId = projectId; try { const response = await apiRequest(`/api/admin/projects/${projectId}`); if (!response.success || !response.project) { throw new Error('Failed to load project'); } this.originalProject = response.project; this.variables = response.variables || []; this.renderViewMode(response.project); } catch (error) { console.error('Failed to load project:', error); showToast('Failed to load project', 'error'); } } /** * Open variables management mode */ async openVariables(projectId) { this.mode = 'variables'; this.projectId = projectId; try { const [projectResponse, variablesResponse] = await Promise.all([ apiRequest(`/api/admin/projects/${projectId}`), apiRequest(`/api/admin/projects/${projectId}/variables`) ]); if (!projectResponse.success || !projectResponse.project) { throw new Error('Failed to load project'); } this.originalProject = projectResponse.project; this.variables = variablesResponse.variables || []; this.renderVariablesMode(); } catch (error) { console.error('Failed to load project variables:', error); showToast('Failed to load variables', 'error'); } } /** * Render the editor modal */ render() { const container = document.getElementById('modal-container'); const title = this.mode === 'create' ? 'Create New Project' : 'Edit Project'; container.innerHTML = `
${escapeHtml(project.id)}
${escapeHtml(project.description)}
| Name | Value | Category |
|---|---|---|
| ${escapeHtml(v.variableName)} | ${escapeHtml(v.value)} | ${escapeHtml(v.category || 'other')} |
No variables defined
'}Created: ${new Date(project.createdAt).toLocaleString()}
Updated: ${new Date(project.updatedAt).toLocaleString()}
${escapeHtml(this.originalProject.name)} (${escapeHtml(this.originalProject.id)})
${this.variables.length} variable${this.variables.length !== 1 ? 's' : ''} defined
No variables defined for this project.
Click "Add Variable" to create one.
${escapeHtml(variable.value)}
${variable.description ? `${escapeHtml(variable.description)}
` : ''}