Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
ff2balex
Manage
Activity
Members
Labels
Plan
Issues
9
Issue boards
Milestones
Wiki
External wiki
Code
Merge requests
0
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Lex gaMe
ff2balex
Commits
b3918c92
Commit
b3918c92
authored
6 months ago
by
Lucie Bader
Browse files
Options
Downloads
Patches
Plain Diff
Ajout de mot v1
parent
5b0fff98
No related branches found
No related tags found
2 merge requests
!8
Test final
,
!5
Ajout manuel d'un mot dans un ou plusieurs lexique(s)
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
api.js
+48
-4
48 additions, 4 deletions
api.js
barre_latérale/sidebar.js
+88
-2
88 additions, 2 deletions
barre_latérale/sidebar.js
with
136 additions
and
6 deletions
api.js
+
48
−
4
View file @
b3918c92
...
@@ -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
;
This diff is collapsed.
Click to expand it.
barre_latérale/sidebar.js
+
88
−
2
View file @
b3918c92
...
@@ -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
())
{
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment