Skip to content
Snippets Groups Projects
Commit b3918c92 authored by Lucie Bader's avatar Lucie Bader
Browse files

Ajout de mot v1

parent 5b0fff98
No related branches found
No related tags found
2 merge requests!8Test final,!5Ajout manuel d'un mot dans un ou plusieurs lexique(s)
...@@ -17,19 +17,27 @@ document.addEventListener("mouseup", () => { ...@@ -17,19 +17,27 @@ document.addEventListener("mouseup", () => {
// ▌ Fonction utilitaire pour appeler l’API // ▌ Fonction utilitaire pour appeler l’API
// ───────────────────────────────────────────────────────────────────────────── // ─────────────────────────────────────────────────────────────────────────────
/** /**
* Effectue une requête API * Effectue une requête API (GET, POST, etc.) avec ou sans body JSON
* @param {string} url - L'URL de l'API à appeler. * @param {string} url - L'URL de l'API à appeler.
* @param {string|null} authToken - Le token d'authentification. * @param {string|null} authToken - Le token d'authentification.
* @param {string} [method='GET'] - La méthode HTTP. * @param {string} [method='GET'] - La méthode HTTP.
* @param {object|null} [data=null] - Les données à envoyer dans le body (pour POST/PUT...).
* @returns {Promise<any>} - La réponse en JSON. * @returns {Promise<any>} - La réponse en JSON.
* @throws {Error} - En cas d'échec. * @throws {Error} - En cas d'échec.
*/ */
async function callApi(url, authToken = null, method = 'GET') { async function callApi(url, authToken = null, method = 'GET', data = null) {
const headers = { 'Content-Type': 'application/json' }; const headers = { 'Content-Type': 'application/json' };
if (authToken) headers.Authorization = `Bearer ${authToken}`; if (authToken) headers.Authorization = `Bearer ${authToken}`;
const fetchOptions = { method, headers };
if (data) {
// Si on veut envoyer un body JSON
fetchOptions.body = JSON.stringify(data);
}
try { try {
const response = await fetch(url, { method, headers }); const response = await fetch(url, fetchOptions);
if (!response.ok) { if (!response.ok) {
throw new Error(`❌ Erreur API (${response.status}): ${response.statusText}`); throw new Error(`❌ Erreur API (${response.status}): ${response.statusText}`);
} }
...@@ -40,6 +48,7 @@ async function callApi(url, authToken = null, method = 'GET') { ...@@ -40,6 +48,7 @@ async function callApi(url, authToken = null, method = 'GET') {
} }
} }
// ───────────────────────────────────────────────────────────────────────────── // ─────────────────────────────────────────────────────────────────────────────
// ▌ Récupération des lexiques de l'utilisateur // ▌ Récupération des lexiques de l'utilisateur
// ───────────────────────────────────────────────────────────────────────────── // ─────────────────────────────────────────────────────────────────────────────
...@@ -174,6 +183,40 @@ async function getWiktionaryDefinition(word) { ...@@ -174,6 +183,40 @@ async function getWiktionaryDefinition(word) {
} }
} }
// ─────────────────────────────────────────────────────────────────────────────
// ▌ Ajout d'un mot dans un/des lexique(s)
// ─────────────────────────────────────────────────────────────────────────────
/**
* Ajoute un mot (selectedWord) dans un ou plusieurs lexiques (lexiconIds).
* @param {string} authToken - Jeton d'authentification (Bearer).
* @param {string} selectedWord - Le mot à ajouter.
* @param {number[]} lexiconIds - Tableau d'IDs de lexiques cibles.
* @param {boolean} [force=false] - Paramètre optionnel pour l'API.
* @returns {Promise<any>} - La réponse JSON de l'API, ou une exception si échec.
*/
async function AddWord(authToken, selectedWord, lexiconIds, force = false) {
if (!authToken) {
throw new Error("Aucun token d’authentification fourni.");
}
if (!selectedWord) {
throw new Error("Aucun mot n’a été spécifié pour l’ajout.");
}
if (!Array.isArray(lexiconIds) || lexiconIds.length === 0) {
throw new Error("Aucun lexique sélectionné pour l’ajout.");
}
const url = "https://babalex.lezinter.net/api/entry/create";
const body = {
graphy: selectedWord,
force,
target_lex: lexiconIds
};
return callApi(url, authToken, "POST", body);
}
// ───────────────────────────────────────────────────────────────────────────── // ─────────────────────────────────────────────────────────────────────────────
// ▌ Exposition des fonctions pour un usage global // ▌ Exposition des fonctions pour un usage global
// ───────────────────────────────────────────────────────────────────────────── // ─────────────────────────────────────────────────────────────────────────────
...@@ -183,4 +226,5 @@ window.getLexicons = getLexicons; ...@@ -183,4 +226,5 @@ window.getLexicons = getLexicons;
window.getAllCategoriesLexicons = getAllCategoriesLexicons; window.getAllCategoriesLexicons = getAllCategoriesLexicons;
window.getLexiconEntries = getLexiconEntries; window.getLexiconEntries = getLexiconEntries;
window.getAllLexiconWords = getAllLexiconWords; window.getAllLexiconWords = getAllLexiconWords;
window.getWiktionaryDefinition = getWiktionaryDefinition; window.getWiktionaryDefinition = getWiktionaryDefinition;
\ No newline at end of file window.AddWord = AddWord;
...@@ -190,6 +190,11 @@ async function fetchLexicons() { ...@@ -190,6 +190,11 @@ async function fetchLexicons() {
} }
} }
/**
* Affiche la liste des lexiques avec des checkboxes.
* Les checkboxes servent ici à activer/désactiver le surlignage,
* mais on va aussi s’en servir pour déterminer où ajouter le mot.
*/
function displayLexiconsWithCheckbox(lexicons) { function displayLexiconsWithCheckbox(lexicons) {
const lexiquesContainer = document.getElementById("lexiques"); const lexiquesContainer = document.getElementById("lexiques");
if (!lexiquesContainer) { if (!lexiquesContainer) {
...@@ -202,31 +207,41 @@ function displayLexiconsWithCheckbox(lexicons) { ...@@ -202,31 +207,41 @@ function displayLexiconsWithCheckbox(lexicons) {
lexiquesContainer.textContent = "Aucun lexique disponible."; lexiquesContainer.textContent = "Aucun lexique disponible.";
return; return;
} }
lexicons.forEach(({ lexiconName, lexiconId, active }) => { lexicons.forEach(({ lexiconName, lexiconId, active }) => {
const lexiqueDiv = document.createElement("div"); const lexiqueDiv = document.createElement("div");
lexiqueDiv.className = "lexique-item"; lexiqueDiv.className = "lexique-item";
const iconDiv = document.createElement("div"); const iconDiv = document.createElement("div");
iconDiv.className = "lexique-icon"; iconDiv.className = "lexique-icon";
iconDiv.style.backgroundColor = "#ccc"; iconDiv.style.backgroundColor = "#ccc";
const labelSpan = document.createElement("span"); const labelSpan = document.createElement("span");
labelSpan.className = "lexique-label"; labelSpan.className = "lexique-label";
labelSpan.textContent = lexiconName; labelSpan.textContent = lexiconName;
const checkbox = document.createElement("input"); const checkbox = document.createElement("input");
checkbox.type = "checkbox"; checkbox.type = "checkbox";
checkbox.className = "lexique-checkbox"; checkbox.className = "lexique-checkbox";
checkbox.checked = active; checkbox.checked = active;
// On stocke l'ID du lexique dans un attribut data pour le récupérer plus tard
checkbox.dataset.lexiconId = lexiconId;
// Toggle highlight
checkbox.addEventListener("change", async () => { checkbox.addEventListener("change", async () => {
console.log( console.log(
`🔄 Changement de surlignage pour ${lexiconName} (ID: ${lexiconId}): ${ `🔄 Changement de surlignage pour ${lexiconName} (ID: ${lexiconId}): ${
checkbox.checked ? "activé" : "désactivé" checkbox.checked ? "activé" : "désactivé"
}` }`
); );
// On envoie un message au background script pour gérer le highlight
await browser.runtime.sendMessage({ await browser.runtime.sendMessage({
action: "toggleLexiconHighlight", action: "toggleLexiconHighlight",
lexiconId, lexiconId,
isActive: checkbox.checked, isActive: checkbox.checked,
}); });
}); });
lexiqueDiv.appendChild(iconDiv); lexiqueDiv.appendChild(iconDiv);
lexiqueDiv.appendChild(labelSpan); lexiqueDiv.appendChild(labelSpan);
lexiqueDiv.appendChild(checkbox); lexiqueDiv.appendChild(checkbox);
...@@ -266,6 +281,70 @@ async function handleAuthButtonClick() { ...@@ -266,6 +281,70 @@ async function handleAuthButtonClick() {
await refreshSidebarState(); await refreshSidebarState();
} }
// ─────────────────────────────────────────────────────────────────────────────
// ▌ Ajout d'un mot au(x) lexique(s)
// ─────────────────────────────────────────────────────────────────────────────
/**
* Au clic sur le bouton "add-word-button",
* on récupère le mot sélectionné (#motSelectionne)
* et les lexiques cochés, puis on appelle AddWord.
*/
async function handleAddWordClick() {
if (!authToken) {
console.warn("⚠️ Impossible d’ajouter le mot : pas de token d’authentification.");
return;
}
const selectedWordElement = document.getElementById("motSelectionne");
const lexiconResultElement = document.getElementById("lexiconResult");
if (!selectedWordElement) {
console.warn("⚠️ Élément #motSelectionne introuvable.");
return;
}
const selectedWord = selectedWordElement.textContent.trim();
if (!selectedWord || selectedWord === "Aucun mot sélectionné") {
console.warn("⚠️ Aucun mot à ajouter.");
if (lexiconResultElement) {
lexiconResultElement.textContent = "Aucun mot à ajouter.";
}
return;
}
// On récupère toutes les checkboxes cochées dans #lexiques
const checkboxList = document.querySelectorAll("#lexiques .lexique-checkbox:checked");
const selectedLexiconIds = Array.from(checkboxList).map((cb) =>
parseInt(cb.dataset.lexiconId, 10)
);
if (selectedLexiconIds.length === 0) {
console.warn("⚠️ Aucun lexique sélectionné.");
if (lexiconResultElement) {
lexiconResultElement.textContent = "Veuillez cocher au moins un lexique.";
}
return;
}
console.log("📦 Ajout du mot :", selectedWord, "dans lexique(s) :", selectedLexiconIds);
// Appel à la fonction AddWord (définie dans api.js et exposée en window)
try {
const result = await window.AddWord(authToken, selectedWord, selectedLexiconIds, false);
console.log("✅ Réponse d’ajout :", result);
if (lexiconResultElement) {
lexiconResultElement.textContent = "Mot ajouté avec succès !";
// Si l’API renvoie plus d’infos, vous pouvez les afficher ici
}
} catch (error) {
console.error("❌ Erreur lors de l’ajout du mot :", error);
if (lexiconResultElement) {
lexiconResultElement.textContent = "Erreur lors de l’ajout : " + error.message;
}
}
}
// ───────────────────────────────────────────────────────────────────────────── // ─────────────────────────────────────────────────────────────────────────────
// ▌ Réception des messages // ▌ Réception des messages
// ───────────────────────────────────────────────────────────────────────────── // ─────────────────────────────────────────────────────────────────────────────
...@@ -379,9 +458,16 @@ document.addEventListener("DOMContentLoaded", async () => { ...@@ -379,9 +458,16 @@ document.addEventListener("DOMContentLoaded", async () => {
}); });
}); });
} }
});
document.addEventListener("DOMContentLoaded", () => { // Bouton "Ajouter au(x) lexique(s)"
const addWordButton = document.getElementById("add-word-button");
if (addWordButton) {
addWordButton.addEventListener("click", handleAddWordClick);
} else {
console.warn("⚠️ Bouton #add-word-button introuvable dans le DOM.");
}
// Écouteur pour la case à cocher "toggle-definitions"
const toggleButtons = document.querySelectorAll(".toggle-btn"); const toggleButtons = document.querySelectorAll(".toggle-btn");
toggleButtons.forEach((btn) => { toggleButtons.forEach((btn) => {
if (!btn.textContent.trim()) { if (!btn.textContent.trim()) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment