document.addEventListener('DOMContentLoaded', function() {
// Initialize tabs
const tabButtons = document.querySelectorAll('.tab-btn');
const tabContents = document.querySelectorAll('.tab-content');
tabButtons.forEach(button => {
button.addEventListener('click', () => {
// Remove active class from all buttons and contents
tabButtons.forEach(btn => btn.classList.remove('active', 'text-primary-500'));
tabButtons.forEach(btn => btn.classList.add('text-gray-400'));
tabContents.forEach(content => content.classList.add('hidden'));
// Add active class to clicked button and corresponding content
button.classList.add('active', 'text-primary-500');
button.classList.remove('text-gray-400');
const tabId = button.getAttribute('data-tab');
document.getElementById(tabId).classList.remove('hidden');
});
});
// Add input field
const addInputBtn = document.getElementById('add-input');
const inputContainer = document.getElementById('input-container');
addInputBtn.addEventListener('click', () => {
const inputGroup = document.createElement('div');
inputGroup.className = 'input-group';
inputGroup.innerHTML = `
`;
inputContainer.appendChild(inputGroup);
feather.replace();
// Add event listener to new remove button
const removeBtn = inputGroup.querySelector('.remove-input');
removeBtn.addEventListener('click', () => {
inputGroup.remove();
});
});
// Remove input field
document.addEventListener('click', function(e) {
if (e.target.classList.contains('remove-input') || e.target.closest('.remove-input')) {
const btn = e.target.classList.contains('remove-input') ? e.target : e.target.closest('.remove-input');
btn.parentElement.remove();
}
});
// Download all files
const downloadBtn = document.getElementById('download-btn');
downloadBtn.addEventListener('click', () => {
// First generate the output if not already generated
document.getElementById('generate-btn').click();
// Get all code contents
const className = document.getElementById('class-name').value || 'MyClass';
const entityCode = document.querySelector('#entity textarea').value;
const repositoryCode = document.querySelector('#repository textarea').value;
const serviceCode = document.querySelector('#service textarea').value;
const controllerCode = document.querySelector('#controller textarea').value;
// Function to create and trigger download
function download(filename, text) {
const element = document.createElement('a');
element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
element.setAttribute('download', filename);
element.style.display = 'none';
document.body.appendChild(element);
element.click();
document.body.removeChild(element);
}
// Download all files
download(`${className}.java`, entityCode);
download(`${className}Repository.java`, repositoryCode);
download(`${className}Service.java`, serviceCode);
download(`${className}Controller.java`, controllerCode);
});
// Generate output
const generateBtn = document.getElementById('generate-btn');
const outputTextarea = document.querySelector('#output textarea');
const previewContent = document.querySelector('.preview-content');
const rawContent = document.querySelector('.raw-content');
generateBtn.addEventListener('click', () => {
const className = document.getElementById('class-name').value || 'MyClass';
const inputGroups = Array.from(document.querySelectorAll('.input-group'));
const fields = inputGroups.map(group => {
const inputs = group.querySelectorAll('input');
return {
name: inputs[0].value || 'field',
type: inputs[1].value || 'String'
};
});
// Generate Entity
let entityCode = `package com.example.entity;\n\n`;
entityCode += `import jakarta.persistence.Entity;\n`;
entityCode += `import jakarta.persistence.GeneratedValue;\n`;
entityCode += `import jakarta.persistence.GenerationType;\n`;
entityCode += `import jakarta.persistence.Id;\n\n`;
entityCode += `@Entity\n`;
entityCode += `public class ${className} {\n\n`;
// Add fields with annotations if needed
fields.forEach(field => {
if (field.name.toLowerCase() === 'id') {
entityCode += ` @Id\n`;
entityCode += ` @GeneratedValue(strategy=GenerationType.IDENTITY)\n`;
}
entityCode += ` private ${field.type} ${field.name};\n`;
});
// Add default constructor
entityCode += `\n protected ${className}() {}\n\n`;
// Add parameterized constructor
entityCode += ` public ${className}(`;
entityCode += fields.map(f => `${f.type} ${f.name}`).join(', ');
entityCode += `) {\n`;
fields.forEach(f => {
entityCode += ` this.${f.name} = ${f.name};\n`;
});
entityCode += ` }\n\n`;
// Add toString()
entityCode += ` @Override\n`;
entityCode += ` public String toString() {\n`;
entityCode += ` return String.format(\n`;
entityCode += ` "${className}[`;
entityCode += fields.map(f => `${f.name}=%s`).join(', ');
entityCode += `]",\n`;
entityCode += ` `;
entityCode += fields.map(f => `${f.name}`).join(', ');
entityCode += `);\n`;
entityCode += ` }\n\n`;
// Add getters and setters
fields.forEach(field => {
// Getter
const getterName = field.type === 'boolean' ? `is${field.name.charAt(0).toUpperCase() + field.name.slice(1)}`
: `get${field.name.charAt(0).toUpperCase() + field.name.slice(1)}`;
entityCode += ` public ${field.type} ${getterName}() {\n`;
entityCode += ` return ${field.name};\n`;
entityCode += ` }\n\n`;
// Setter
entityCode += ` public void set${field.name.charAt(0).toUpperCase() + field.name.slice(1)}(${field.type} ${field.name}) {\n`;
entityCode += ` this.${field.name} = ${field.name};\n`;
entityCode += ` }\n\n`;
});
entityCode += `}\n`;
// Generate Repository
let repositoryCode = `package com.example.repository;\n\n`;
repositoryCode += `import com.example.entity.${className};\n`;
repositoryCode += `import org.springframework.data.repository.CrudRepository;\n`;
repositoryCode += `import org.springframework.stereotype.Repository;\n\n`;
// Find ID type (default to Long if not found)
let idType = 'Long';
const idField = fields.find(f => f.name.toLowerCase() === 'id');
if (idField) {
idType = idField.type;
}
repositoryCode += `@Repository\n`;
repositoryCode += `public interface ${className}Repository extends CrudRepository<${className}, ${idType}> {\n\n`;
repositoryCode += `}\n`;
// Generate Service
let serviceCode = `package com.example.service;\n\n`;
serviceCode += `import org.springframework.beans.factory.annotation.Autowired;\n`;
serviceCode += `import org.springframework.stereotype.Service;\n`;
serviceCode += `import java.util.Optional;\n`;
serviceCode += `import java.util.List;\n\n`;
serviceCode += `@Service\n`;
serviceCode += `public class ${className}Service {\n\n`;
serviceCode += ` @Autowired\n`;
serviceCode += ` private ${className}Repository ${className.toLowerCase()}Repository;\n\n`;
serviceCode += ` public List<${className}> findAll() {\n`;
serviceCode += ` return (List<${className}>) ${className.toLowerCase()}Repository.findAll();\n`;
serviceCode += ` }\n\n`;
serviceCode += ` public Optional<${className}> findById(Long id) {\n`;
serviceCode += ` return ${className.toLowerCase()}Repository.findById(id);\n`;
serviceCode += ` }\n\n`;
serviceCode += ` public ${className} save(${className} ${className.toLowerCase()}) {\n`;
serviceCode += ` return ${className.toLowerCase()}Repository.save(${className.toLowerCase()});\n`;
serviceCode += ` }\n\n`;
serviceCode += ` public void delete(${className} ${className.toLowerCase()}) {\n`;
serviceCode += ` ${className.toLowerCase()}Repository.delete(${className.toLowerCase()});\n`;
serviceCode += ` }\n\n`;
serviceCode += ` public void delete(Long id) {\n`;
serviceCode += ` ${className.toLowerCase()}Repository.deleteById(id);\n`;
serviceCode += ` }\n`;
serviceCode += `}\n`;
// Generate Controller
let controllerCode = `package com.example.controller;\n\n`;
controllerCode += `import org.springframework.beans.factory.annotation.Autowired;\n`;
controllerCode += `import org.springframework.web.bind.annotation.*;\n`;
controllerCode += `import java.util.List;\n`;
controllerCode += `import java.util.Optional;\n\n`;
controllerCode += `@RestController\n`;
controllerCode += `@RequestMapping("/api/${className.toLowerCase()}s")\n`;
controllerCode += `public class ${className}Controller {\n\n`;
controllerCode += ` @Autowired\n`;
controllerCode += ` private ${className}Service ${className.toLowerCase()}Service;\n\n`;
controllerCode += ` @GetMapping\n`;
controllerCode += ` public List<${className}> findAll() {\n`;
controllerCode += ` return ${className.toLowerCase()}Service.findAll();\n`;
controllerCode += ` }\n\n`;
controllerCode += ` @GetMapping("/{id}")\n`;
controllerCode += ` public Optional<${className}> findById(@PathVariable Long id) {\n`;
controllerCode += ` return ${className.toLowerCase()}Service.findById(id);\n`;
controllerCode += ` }\n\n`;
controllerCode += ` @PostMapping\n`;
controllerCode += ` public ${className} save(@RequestBody ${className} ${className.toLowerCase()}) {\n`;
controllerCode += ` return ${className.toLowerCase()}Service.save(${className.toLowerCase()});\n`;
controllerCode += ` }\n\n`;
controllerCode += ` @DeleteMapping("/{id}")\n`;
controllerCode += ` public void delete(@PathVariable Long id) {\n`;
controllerCode += ` ${className.toLowerCase()}Service.delete(id);\n`;
controllerCode += ` }\n`;
controllerCode += `}\n`;
// Update tabs
document.querySelector('#entity textarea').value = entityCode;
document.querySelector('#repository textarea').value = repositoryCode;
document.querySelector('#service textarea').value = serviceCode;
document.querySelector('#controller textarea').value = controllerCode;
});
// Set first tab as active by default
if (tabButtons.length > 0) {
tabButtons[0].click();
}
});