Skip to main content
Glama
nextjs-integration.js8.98 kB
/** * Script pour l'interface d'intégration NextJS */ document.addEventListener('DOMContentLoaded', function() { // Éléments du DOM const workflowIdInput = document.getElementById('workflow-id'); const workflowNameInput = document.getElementById('workflow-name'); const apiBasePathInput = document.getElementById('api-base-path'); const generateOpenAPICheckbox = document.getElementById('generate-openapi'); const generateTypesCheckbox = document.getElementById('generate-types'); const includeWebhooksCheckbox = document.getElementById('include-webhooks'); const generateButton = document.getElementById('generate-button'); const integrationsList = document.getElementById('integrations-list'); const alertContainer = document.getElementById('alert-container'); // Charger la liste des intégrations au chargement de la page loadIntegrations(); // Événement de clic sur le bouton de génération generateButton.addEventListener('click', function() { // Récupérer les valeurs des champs const workflowId = workflowIdInput.value.trim(); const workflowName = workflowNameInput.value.trim(); const apiBasePath = apiBasePathInput.value.trim(); const generateOpenAPI = generateOpenAPICheckbox.checked; const generateTypes = generateTypesCheckbox.checked; const includeWebhooks = includeWebhooksCheckbox.checked; // Valider les champs requis if (!workflowId) { showAlert('danger', 'L\'ID du workflow est requis'); return; } if (!workflowName) { showAlert('danger', 'Le nom du workflow est requis'); return; } // Désactiver le bouton pendant la génération generateButton.disabled = true; generateButton.innerHTML = '<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span> Génération en cours...'; // Appeler l'API pour générer l'intégration fetch('/api/nextjs-integration/generate', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ workflowId, workflowName, apiBasePath, generateOpenAPI, generateTypes, includeWebhooks }) }) .then(response => response.json()) .then(data => { // Réactiver le bouton generateButton.disabled = false; generateButton.innerHTML = 'Générer l\'intégration'; if (data.success) { // Afficher un message de succès showAlert('success', `Intégration générée avec succès: ${data.message}`); // Recharger la liste des intégrations loadIntegrations(); } else { // Afficher un message d'erreur showAlert('danger', `Erreur: ${data.message}`); } }) .catch(error => { // Réactiver le bouton generateButton.disabled = false; generateButton.innerHTML = 'Générer l\'intégration'; // Afficher un message d'erreur showAlert('danger', `Erreur: ${error.message}`); }); }); /** * Charge la liste des intégrations depuis l'API */ function loadIntegrations() { // Vider la liste integrationsList.innerHTML = '<div class="d-flex justify-content-center"><div class="spinner-border" role="status"><span class="visually-hidden">Chargement...</span></div></div>'; // Appeler l'API pour récupérer la liste des intégrations fetch('/api/nextjs-integration/list') .then(response => response.json()) .then(data => { // Vider la liste integrationsList.innerHTML = ''; if (!data.success) { integrationsList.innerHTML = `<div class="alert alert-danger">Erreur: ${data.message}</div>`; return; } if (data.integrations.length === 0) { integrationsList.innerHTML = '<div class="alert alert-info">Aucune intégration générée</div>'; return; } // Afficher les intégrations data.integrations.forEach(integration => { const card = document.createElement('div'); card.className = 'card mb-3'; const cardHeader = document.createElement('div'); cardHeader.className = 'card-header d-flex justify-content-between align-items-center'; cardHeader.innerHTML = `<h5 class="mb-0">${integration.name}</h5>`; const cardBody = document.createElement('div'); cardBody.className = 'card-body'; // Ajouter les badges pour les fonctionnalités const features = document.createElement('div'); features.className = 'mb-3'; if (integration.features.openapi) { features.innerHTML += '<span class="badge bg-primary me-2">OpenAPI</span>'; } if (integration.features.types) { features.innerHTML += '<span class="badge bg-success me-2">TypeScript</span>'; } if (integration.features.apiClient) { features.innerHTML += '<span class="badge bg-info me-2">API Client</span>'; } if (integration.features.apiRoutes) { features.innerHTML += '<span class="badge bg-warning me-2">API Routes</span>'; } cardBody.appendChild(features); // Ajouter la date de création const createdAt = document.createElement('p'); createdAt.className = 'card-text text-muted'; createdAt.textContent = `Créée le ${new Date(integration.createdAt).toLocaleString()}`; cardBody.appendChild(createdAt); // Ajouter les boutons d'action const actions = document.createElement('div'); actions.className = 'btn-group'; // Bouton de téléchargement const downloadButton = document.createElement('a'); downloadButton.className = 'btn btn-primary'; downloadButton.href = `/api/nextjs-integration/download/${integration.name}`; downloadButton.innerHTML = '<i class="bi bi-download"></i> Télécharger'; actions.appendChild(downloadButton); // Bouton de documentation Swagger if (integration.features.openapi) { const swaggerButton = document.createElement('a'); swaggerButton.className = 'btn btn-info'; swaggerButton.href = `/api/nextjs-integration/${integration.name}/swagger`; swaggerButton.target = '_blank'; swaggerButton.innerHTML = '<i class="bi bi-file-earmark-text"></i> Swagger'; actions.appendChild(swaggerButton); } // Bouton de suppression const deleteButton = document.createElement('button'); deleteButton.className = 'btn btn-danger'; deleteButton.innerHTML = '<i class="bi bi-trash"></i> Supprimer'; deleteButton.addEventListener('click', function() { if (confirm(`Êtes-vous sûr de vouloir supprimer l'intégration "${integration.name}" ?`)) { deleteIntegration(integration.name); } }); actions.appendChild(deleteButton); cardBody.appendChild(actions); card.appendChild(cardHeader); card.appendChild(cardBody); integrationsList.appendChild(card); }); }) .catch(error => { integrationsList.innerHTML = `<div class="alert alert-danger">Erreur: ${error.message}</div>`; }); } /** * Supprime une intégration * @param {string} name Nom de l'intégration à supprimer */ function deleteIntegration(name) { fetch(`/api/nextjs-integration/${name}`, { method: 'DELETE' }) .then(response => response.json()) .then(data => { if (data.success) { showAlert('success', data.message); loadIntegrations(); } else { showAlert('danger', `Erreur: ${data.message}`); } }) .catch(error => { showAlert('danger', `Erreur: ${error.message}`); }); } /** * Affiche une alerte * @param {string} type Type d'alerte (success, danger, warning, info) * @param {string} message Message à afficher */ function showAlert(type, message) { // Créer l'alerte const alert = document.createElement('div'); alert.className = `alert alert-${type} alert-dismissible fade show`; alert.innerHTML = ` ${message} <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Fermer"></button> `; // Ajouter l'alerte au conteneur alertContainer.appendChild(alert); // Supprimer l'alerte après 5 secondes setTimeout(() => { alert.classList.remove('show'); setTimeout(() => { alert.remove(); }, 150); }, 5000); } });

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/lowprofix/n8n-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server