Compare commits

...

2 Commits

9 changed files with 70 additions and 71 deletions

View File

@ -13,5 +13,6 @@
</classpathentry> </classpathentry>
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.web.container"/> <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.web.container"/>
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/> <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
<classpathentry excluding="main/java/" kind="src" path="src"/>
<classpathentry kind="output" path="build/classes"/> <classpathentry kind="output" path="build/classes"/>
</classpath> </classpath>

View File

@ -28,4 +28,15 @@
<nature>org.eclipse.jdt.core.javanature</nature> <nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.wst.jsdt.core.jsNature</nature> <nature>org.eclipse.wst.jsdt.core.jsNature</nature>
</natures> </natures>
<filteredResources>
<filter>
<id>1745735846816</id>
<name></name>
<type>30</type>
<matcher>
<id>org.eclipse.core.resources.regexFilterMatcher</id>
<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
</matcher>
</filter>
</filteredResources>
</projectDescription> </projectDescription>

View File

@ -8,8 +8,6 @@ import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.sql.Statement; import java.sql.Statement;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.HashMap;
import java.util.Map;
public class Bloc extends ParamBD { public class Bloc extends ParamBD {
private int id; private int id;
@ -18,7 +16,7 @@ public class Bloc extends ParamBD {
private LocalDate dateCreation; private LocalDate dateCreation;
private LocalDate dateModification; private LocalDate dateModification;
private int ordre; private int ordre;
private Map<String, Object> metadata; private String metadata;
public enum Type { public enum Type {
TEXTE, TEXTE,
@ -32,14 +30,14 @@ public class Bloc extends ParamBD {
} }
public Bloc(int id, Type type, String contenu, int ordre) { public Bloc(int id, Type type, String contenu, int ordre, String metadata) {
this.id = id; this.id = id;
this.type = type; this.type = type;
this.contenu = contenu; this.contenu = contenu;
this.ordre = ordre; this.ordre = ordre;
this.dateCreation = LocalDate.now(); this.dateCreation = LocalDate.now();
this.dateModification = LocalDate.now(); this.dateModification = LocalDate.now();
metadata = new HashMap<>(); this.metadata = metadata;
} }
public int getId() { public int getId() {
@ -90,11 +88,11 @@ public class Bloc extends ParamBD {
this.ordre = ordre; this.ordre = ordre;
} }
public Map<String, Object> getMetadata() { public String getMetadata() {
return metadata; return metadata;
} }
public void setMetadata(Map<String, Object> metadata) { public void setMetadata(String metadata) {
this.metadata = metadata; this.metadata = metadata;
} }
@ -102,7 +100,7 @@ public class Bloc extends ParamBD {
return "Bloc{id=" + id + ", type=" + type + ", contenu='" + contenu + "', dateCreation=" + dateCreation + ", dateModification=" + dateModification + ", ordre=" + ordre + "}"; return "Bloc{id=" + id + ", type=" + type + ", contenu='" + contenu + "', dateCreation=" + dateCreation + ", dateModification=" + dateModification + ", ordre=" + ordre + "}";
} }
protected static int ajouterBloc(int idU, int idP, String contenu, int ordre, Type type, LocalDate dl, Map<String, Object> metadata) { protected static int ajouterBloc(int idU, int idP, String contenu, int ordre, Type type, LocalDate dl, String metadata) {
int idGenere = -1 ; int idGenere = -1 ;
try { try {
Connection connexion = DriverManager.getConnection(bdURL, bdLogin, bdPassword); Connection connexion = DriverManager.getConnection(bdURL, bdLogin, bdPassword);
@ -117,7 +115,7 @@ public class Bloc extends ParamBD {
pst.setInt(5, idP); pst.setInt(5, idP);
pst.setInt(6, ordre); pst.setInt(6, ordre);
pst.setInt(7, idU); pst.setInt(7, idU);
pst.setString(8, metadata.toString()); pst.setString(8, metadata);
pst.executeUpdate(); pst.executeUpdate();
ResultSet rs = pst.getGeneratedKeys(); ResultSet rs = pst.getGeneratedKeys();

View File

@ -9,8 +9,6 @@ import jakarta.servlet.http.HttpSession;
import java.io.IOException; import java.io.IOException;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.HashMap;
import java.util.Map;
@WebServlet("/NouveauBloc") @WebServlet("/NouveauBloc")
public class NouveauBloc extends HttpServlet { public class NouveauBloc extends HttpServlet {
@ -42,13 +40,12 @@ public class NouveauBloc extends HttpServlet {
String typeStr = request.getParameter("type"); String typeStr = request.getParameter("type");
String ordreStr = request.getParameter("ordre"); String ordreStr = request.getParameter("ordre");
String pageIdStr = request.getParameter("pageId"); String pageIdStr = request.getParameter("pageId");
String metadata = request.getParameter("metadata");
int ordre = Integer.parseInt(ordreStr); int ordre = Integer.parseInt(ordreStr);
int pageId = Integer.parseInt(pageIdStr); int pageId = Integer.parseInt(pageIdStr);
Bloc.Type type = Bloc.Type.valueOf(typeStr); Bloc.Type type = Bloc.Type.valueOf(typeStr);
Map<String, Object> metadata = new HashMap<>();
int idGenere = Bloc.ajouterBloc(u.getId(), pageId, contenu, ordre, type, LocalDate.now(), metadata); int idGenere = Bloc.ajouterBloc(u.getId(), pageId, contenu, ordre, type, LocalDate.now(), metadata);
response.setContentType("application/json"); response.setContentType("application/json");
@ -59,5 +56,4 @@ public class NouveauBloc extends HttpServlet {
response.sendRedirect("/Projet/"); response.sendRedirect("/Projet/");
} }
} }
} }

View File

@ -38,7 +38,7 @@ public class NouvellePage extends HttpServlet {
String titre = request.getParameter("titre"); String titre = request.getParameter("titre");
if (titre == null || titre.isEmpty()) { if (titre == null || titre.trim().isEmpty()) {
response.sendRedirect("AfficherPage"); response.sendRedirect("AfficherPage");
} else { } else {
int id = Page.ajouterPage(u.getId(), titre, LocalDate.now()); int id = Page.ajouterPage(u.getId(), titre, LocalDate.now());

View File

@ -172,7 +172,7 @@ public class Page extends ParamBD {
page.id = id; page.id = id;
} }
if(titre != null) { if(titre != null) {
sql = " SELECT id, contenu, type, ordre" sql = " SELECT id, contenu, type, ordre, metadata"
+ " FROM bloc" + " FROM bloc"
+ " WHERE page_id=?" + " WHERE page_id=?"
+ " ORDER BY ordre" + " ORDER BY ordre"
@ -185,10 +185,11 @@ public class Page extends ParamBD {
int idB = rs.getInt("id"); int idB = rs.getInt("id");
String contenu = rs.getString("contenu"); String contenu = rs.getString("contenu");
String type = rs.getString("type"); String type = rs.getString("type");
String metadata = rs.getString("metadata");
Type typeEnum = Type.valueOf(type.toUpperCase()); Type typeEnum = Type.valueOf(type.toUpperCase());
int ordre = rs.getInt("ordre"); int ordre = rs.getInt("ordre");
Bloc bloc = new Bloc(idB, typeEnum, contenu, ordre); Bloc bloc = new Bloc(idB, typeEnum, contenu, ordre, metadata);
page.listeBlocs.add(bloc); page.listeBlocs.add(bloc);
} }
} }

View File

@ -1,6 +1,5 @@
package projet; package projet;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException; import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServlet;

View File

@ -1,6 +1,5 @@
package projet; package projet;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException; import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServlet;

View File

@ -1,6 +1,4 @@
// focus sur le dernier textarea quand la page s'ouvre
window.addEventListener('DOMContentLoaded', () => { window.addEventListener('DOMContentLoaded', () => {
const blocs = document.querySelectorAll('#md [contenteditable="true"]'); const blocs = document.querySelectorAll('#md [contenteditable="true"]');
if (blocs.length > 0) { if (blocs.length > 0) {
@ -33,7 +31,7 @@
ajouterBlocVideSiBesoin(); ajouterBlocVideSiBesoin();
}); });
// Fonction pour ajouter un nouvel événement à chaque textarea // Fonction pour ajouter un nouvel événement à chaque bloc
function addBlocEvent(bloc) { function addBlocEvent(bloc) {
bloc.addEventListener('keydown', function(event) { bloc.addEventListener('keydown', function(event) {
@ -47,7 +45,8 @@
if (texte.startsWith("/")) { if (texte.startsWith("/")) {
// Gérer les commandes // Gérer les commandes
handleSlashCommand(currentBloc, texte); handleSlashCommand(currentBloc, texte);
} else { }
const blocId = currentBloc.getAttribute('data-id'); // Récupère l'ID du bloc const blocId = currentBloc.getAttribute('data-id'); // Récupère l'ID du bloc
const type = currentBloc.getAttribute('data-type'); const type = currentBloc.getAttribute('data-type');
const metadata = currentBloc.getAttribute('metadata'); const metadata = currentBloc.getAttribute('metadata');
@ -78,7 +77,6 @@
ajouterBlocVideSiBesoin(); ajouterBlocVideSiBesoin();
} }
}
}); });
bloc.addEventListener('input', function () { bloc.addEventListener('input', function () {
@ -86,9 +84,9 @@
}); });
} }
function autoResize(textarea) { function autoResize(bloc) {
textarea.style.height = 'auto'; bloc.style.height = 'auto';
textarea.style.height = textarea.scrollHeight + 'px'; bloc.style.height = bloc.scrollHeight + 'px';
} }
document.querySelectorAll('#md [contenteditable="true"]').forEach(bloc => { document.querySelectorAll('#md [contenteditable="true"]').forEach(bloc => {
@ -137,7 +135,7 @@
newBloc.setAttribute('rows', '1'); newBloc.setAttribute('rows', '1');
newBloc.setAttribute('data-type', 'TEXTE'); newBloc.setAttribute('data-type', 'TEXTE');
newBloc.setAttribute('data-id', idGenere); newBloc.setAttribute('data-id', idGenere);
newBloc.setAttribute('metadata', 'TEXTE'); newBloc.setAttribute('metadata', '{}');
control.appendChild(newBloc); control.appendChild(newBloc);
container.appendChild(control); container.appendChild(control);
@ -179,7 +177,7 @@
const bloc = blocContainer.querySelector('[contenteditable="true"]'); const bloc = blocContainer.querySelector('[contenteditable="true"]');
if (bloc.innerText.trim() === "") { if (bloc.innerText.trim() === "") {
return; // Empêche la suppression si le textarea est vide return; // Empêche la suppression si le bloc est vide
} }
if (confirm("Voulez-vous vraiment supprimer ce bloc ?")) { if (confirm("Voulez-vous vraiment supprimer ce bloc ?")) {
@ -285,13 +283,15 @@
bloc.addEventListener('input', (event) => { bloc.addEventListener('input', (event) => {
const blocId = event.target.getAttribute('data-id'); const blocId = event.target.getAttribute('data-id');
const content = event.target.textContent; // Récupère le contenu modifié du bloc const content = event.target.textContent; // Récupère le contenu modifié du bloc
const type = event.target.getAttribute('data-type');
const metadata = event.target.getAttribute('metadata'); // Récupère le metadata du bloc const metadata = event.target.getAttribute('metadata'); // Récupère le metadata du bloc
const modif = { const modif = {
action: "update", action: "update",
blocId: blocId, blocId: blocId,
content: content, content: content,
metadata: metadata metadata: metadata,
type: type
}; };
socketBloc.send(JSON.stringify(modif)); // Envoi de la modification via le WebSocket socketBloc.send(JSON.stringify(modif)); // Envoi de la modification via le WebSocket
@ -360,7 +360,6 @@
// Nettoyage des anciennes classes // Nettoyage des anciennes classes
bloc.classList.remove('is-title', 'is-title-1', 'is-title-2', 'is-title-3'); bloc.classList.remove('is-title', 'is-title-1', 'is-title-2', 'is-title-3');
bloc.classList.remove('is-code-block', 'is-list', 'is-toggle'); bloc.classList.remove('is-code-block', 'is-list', 'is-toggle');
bloc.setAttribute('placeholder', 'Tapez ici...');
bloc.style.whiteSpace = "normal"; // reset si code bloc.style.whiteSpace = "normal"; // reset si code
const type = bloc.dataset.type || 'TEXTE'; const type = bloc.dataset.type || 'TEXTE';
@ -371,31 +370,26 @@
break; break;
case 'TITRE': case 'TITRE':
const level = bloc.dataset.level || '2'; const level = bloc.dataset.level || '1';
bloc.classList.add('is-title', `is-title-${level}`); bloc.classList.add('is-title', `is-title-${level}`);
bloc.setAttribute('placeholder', `Titre niveau ${level}`);
break; break;
case 'LISTE': case 'LISTE':
bloc.classList.add('is-list'); bloc.classList.add('is-list');
bloc.setAttribute('placeholder', '• Élément de liste');
break; break;
case 'CODE': case 'CODE':
bloc.classList.add('is-code-block'); bloc.classList.add('is-code-block');
bloc.style.whiteSpace = "pre"; bloc.style.whiteSpace = "pre";
const lang = bloc.dataset.language || 'plaintext'; bloc.dataset.language || 'plaintext';
bloc.setAttribute('placeholder', `Code (${lang})`);
break; break;
case 'PAGE': case 'PAGE':
bloc.classList.add('is-page-block'); bloc.classList.add('is-page-block');
bloc.setAttribute('placeholder', 'Nouvelle page...');
break; break;
case 'TOGGLE': case 'TOGGLE':
bloc.classList.add('is-toggle'); bloc.classList.add('is-toggle');
bloc.setAttribute('placeholder', 'Cliquez pour développer...');
break; break;
default: default:
@ -421,7 +415,7 @@
case "h2": case "h2":
case "h3": case "h3":
applyBlocType(bloc, "TITRE", { level: parseInt(command[1] || "1") }); applyBlocType(bloc, "TITRE", { level: parseInt(command[1] || "1") });
bloc.textContent = ''; // On vide le bloc après transformation bloc.textContent = param; // On vide le bloc après transformation
autoResize(bloc); autoResize(bloc);
break; break;