data) {
return PasswordValidator.isValid((String) data.get("password"));
}
+
+ /**
+ * Donne acc
+ */
}
diff --git a/src/main/java/fyloz/trial/ColorRecipesExplorer/web/controller/creators/CompanyCreatorController.java b/src/main/java/fyloz/trial/ColorRecipesExplorer/web/controller/creators/CompanyCreatorController.java
index 8d49d61..ef2545d 100644
--- a/src/main/java/fyloz/trial/ColorRecipesExplorer/web/controller/creators/CompanyCreatorController.java
+++ b/src/main/java/fyloz/trial/ColorRecipesExplorer/web/controller/creators/CompanyCreatorController.java
@@ -7,6 +7,7 @@ import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import javax.validation.Valid;
@@ -31,7 +32,8 @@ public class CompanyCreatorController {
* @return La page à afficher.
*/
@GetMapping(CREATOR_COMPANY)
- public String showCreationPage() {
+ public String showCreationPage(Model model, Company company) {
+ model.addAttribute("company", company);
return CREATOR_COMPANY;
}
@@ -49,12 +51,11 @@ public class CompanyCreatorController {
*
* REQUIERT UNE AUTORISATION
*
- * @param model Le modèle injecté par Thymeleaf
* @param company La bannière à créer
* @return La page à afficher.
*/
@PostMapping(value = CREATOR_COMPANY, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
- public String createCompany(Model model, @Valid Company company) {
+ public String createCompany(Model model, @ModelAttribute @Valid Company company) {
if (companyService.isValidForCreation(company)) {
if ((company = companyService.save(company)) != null) {
model.addAttribute("companyName", company.getCompanyName());
@@ -66,6 +67,6 @@ public class CompanyCreatorController {
model.addAttribute(RESPONSE_ERROR, String.format(COMPANY_ALREADY_EXIST, company.getCompanyName()));
}
- return showCreationPage();
+ return showCreationPage(model, company);
}
}
diff --git a/src/main/java/fyloz/trial/ColorRecipesExplorer/web/controller/creators/MixCreatorController.java b/src/main/java/fyloz/trial/ColorRecipesExplorer/web/controller/creators/MixCreatorController.java
index 2ee93fb..4771077 100644
--- a/src/main/java/fyloz/trial/ColorRecipesExplorer/web/controller/creators/MixCreatorController.java
+++ b/src/main/java/fyloz/trial/ColorRecipesExplorer/web/controller/creators/MixCreatorController.java
@@ -11,13 +11,14 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
-import org.springframework.util.MultiValueMap;
+import org.springframework.util.LinkedMultiValueMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.ArrayList;
+import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;
@@ -86,18 +87,21 @@ public class MixCreatorController {
* @return La page à afficher.
*/
@PostMapping(value = CREATOR_MIX, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
- public String createMix(Model model, @RequestBody MultiValueMap form) {
- String mixTypeName = form.getFirst(MIX_TYPE);
- int recipeID = Integer.parseInt(form.getFirst(RECIPE_ID));
+ public String createMix(Model model, @RequestBody LinkedMultiValueMap form) {
+ String mixTypeName = form.get(MIX_TYPE).get(0);
+ int recipeID = Integer.parseInt(form.get(RECIPE_ID).get(0));
List materials = new ArrayList<>();
List quantities = new ArrayList<>();
// Trie les valeurs du formulaire de création du mélange
for (String key : form.keySet()) {
- String value = form.getFirst(key);
+ LinkedList value = (LinkedList) form.get(key);
- if (key.startsWith("product")) materials.add(Integer.parseInt(value));
- else if (key.startsWith("quantity") && !value.isEmpty()) quantities.add(Float.parseFloat(value));
+ if (key.equals("product")) {
+ value.forEach(m -> materials.add(Integer.parseInt(m)));
+ } else if (key.equals("inventoryQuantity")) {
+ value.forEach(q -> quantities.add(Float.parseFloat(q)));
+ }
}
Recipe recipe = recipeService.getByID(recipeID);
diff --git a/src/main/java/fyloz/trial/ColorRecipesExplorer/web/controller/editors/MixEditorController.java b/src/main/java/fyloz/trial/ColorRecipesExplorer/web/controller/editors/MixEditorController.java
index 0ccc185..c0912eb 100644
--- a/src/main/java/fyloz/trial/ColorRecipesExplorer/web/controller/editors/MixEditorController.java
+++ b/src/main/java/fyloz/trial/ColorRecipesExplorer/web/controller/editors/MixEditorController.java
@@ -11,13 +11,14 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
-import org.springframework.util.MultiValueMap;
+import org.springframework.util.LinkedMultiValueMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.ArrayList;
+import java.util.LinkedList;
import java.util.List;
import static fyloz.trial.ColorRecipesExplorer.web.PagesPaths.*;
@@ -91,8 +92,8 @@ public class MixEditorController {
* @return La page à afficher.
*/
@PostMapping(value = EDITOR_MIX, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
- public String saveMix(Model model, @RequestBody MultiValueMap form) {
- int mixID = Integer.parseInt(form.getFirst(MIX_ID));
+ public String saveMix(Model model, @RequestBody LinkedMultiValueMap form) {
+ int mixID = Integer.parseInt((String) form.get(MIX_ID).get(0));
Mix mix = mixService.getByID(mixID);
if (mix == null) {
@@ -104,10 +105,14 @@ public class MixEditorController {
List quantities = new ArrayList<>();
for (String key : form.keySet()) {
- String value = form.getFirst(key);
+ LinkedList value = (LinkedList) form.get(key);
+ assert value != null : "Une valeur du formulaire d'édition d'un mélange est nulle.";
- if (key.startsWith("product")) materials.add(Integer.parseInt(value));
- else if (key.startsWith("quantity")) quantities.add(Float.parseFloat(value));
+ if (key.equals("product")) {
+ value.forEach(m -> materials.add(Integer.parseInt(m)));
+ } else if (key.equals("inventoryQuantity")) {
+ value.forEach(q -> quantities.add(Float.parseFloat(q)));
+ }
}
if (!mixService.edit(mix, materials, quantities)) {
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 2aacb8f..a06cf65 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -1,5 +1,5 @@
# Tomcat
-server.port=8080
+server.port=8081
# Favicon
spring.mvc.favicon.enabled=false
# H2
@@ -16,11 +16,18 @@ spring.jpa.properties.hibernate.format_sql=false
spring.thymeleaf.template-loader-path=classpath:/templates
spring.thymeleaf.suffix=.html
spring.thymeleaf.cache=false
+# Messages
+spring.messages.cache-duration=1
+#spring.messages.basename=lang/messages
+#spring.messages.encoding=UTF-8
+#server.tomcat.uri-encoding=UTF-8
+#spring.http.encoding.charset=UTF-8
+#spring.thymeleaf.encoding=UTF-8
# Max file size.
spring.servlet.multipart.max-file-size=10MB
# Max request size.
spring.servlet.multipart.max-request-size=15MB
# DEBUG
logging.level.org.springframework.web=DEBUG
-logging.level.com.zaxxer.hikari=DEBUG
+#logging.level.com.zaxxer.hikari=DEBUG
spring.h2.console.enabled=true
\ No newline at end of file
diff --git a/src/main/resources/lang/messages.properties b/src/main/resources/lang/messages.properties
new file mode 100644
index 0000000..2078aa6
--- /dev/null
+++ b/src/main/resources/lang/messages.properties
@@ -0,0 +1,41 @@
+menu.list=Liste
+menu.add=Ajouter
+menu.edit=Modifier
+menu.delete=Supprimer
+menu.inventory=Inventaire
+menu.others=Autres
+recipe.color=Couleur
+recipe.description=Courte description
+recipe.sample=Échantillon
+recipe.approbationDate=Date d'approbation
+recipe.remark=Remarque
+recipe.notice=Note
+recipe.steps=Étapes
+keyword.company=Bannière
+keyword.material=Produit
+keyword.recipe=Recette
+keyword.touchUpKitPDF=PDF Kits de retouche
+keyword.quantity=Quantité
+keyword.type=Type
+keyword.units=Unités
+keyword.edit=Modifier
+keyword.use=Utiliser
+keyword.save=Enregistrer
+keyword.back=Retour
+mix.location=Position
+material.code=Code
+material.inventoryQuantity=Quantité en inventaire
+material.type=Type de produit
+material.SIMDUTFile=Fichier SIMDUT
+units.milliliters=Millilitres
+units.liters=Litres
+units.gallons=Gallons
+inventory.lowQuantity=Quantité faible
+inventory.hideOthers=Cacher les autres produits
+inventory.showOnly=Voir seulement
+product.error.notFound=Aucun produit n'a été trouvé.
+app.title=Explorateur de recettes de couleur
+footer.lang=See in english
+company.add.title=Ajout d'une bannière
+company.success.created=La bannière {0} à été enregistrée.
+company.form.companyName=Nom de la bannière
diff --git a/src/main/resources/lang/messages_en.properties b/src/main/resources/lang/messages_en.properties
new file mode 100644
index 0000000..68d4778
--- /dev/null
+++ b/src/main/resources/lang/messages_en.properties
@@ -0,0 +1,41 @@
+company.form.companyName=Banner name
+menu.list=List
+menu.add=Add
+menu.edit=Edit
+menu.delete=Delete
+menu.inventory=Inventory
+menu.others=Others
+recipe.color=Color
+recipe.description=Short description
+recipe.sample=Sample
+recipe.approbationDate=Approbation date
+recipe.remark=Remark
+recipe.notice=Notice
+recipe.steps=Steps
+keyword.company=Banner
+keyword.material=Material
+keyword.recipe=Recipe
+keyword.touchUpKitPDF=Touch Up Kit PDF
+keyword.quantity=Quantity
+keyword.type=Type
+keyword.units=Units
+keyword.edit=Edit
+keyword.use=Use
+keyword.save=Save
+keyword.back=Back
+mix.location=Location
+material.code=Code
+material.inventoryQuantity=Inventory quantity
+material.type=Product type
+material.SIMDUTFile=SIMDUT File
+units.milliliters=Milliliters
+units.liters=Liters
+units.gallons=Gallons
+inventory.lowQuantity=Low quantity
+inventory.hideOthers=Hide other products
+inventory.showOnly=Show only
+product.error.notFound=No products were found.
+app.title=Color recipes explorer
+footer.lang=Voir en français
+company.add.title=Adding a banner
+company.success.created=The banner {0} has been saved.
\ No newline at end of file
diff --git a/src/main/resources/static/css/main.css b/src/main/resources/static/css/main.css
index ba028cc..a12f46e 100644
--- a/src/main/resources/static/css/main.css
+++ b/src/main/resources/static/css/main.css
@@ -7,11 +7,18 @@ h1 {
text-decoration: underline;
}
-header {
+header, footer {
background-color: black;
height: 70px;
text-align: center;
width: 100%;
+ color: white;
+}
+
+footer {
+ position: fixed;
+ bottom: 0;
+ padding-top: 10px;
}
header img {
@@ -20,6 +27,7 @@ header img {
section {
text-align: center;
+ margin-bottom: 50px;
}
nav {
@@ -45,8 +53,8 @@ nav a {
.dropdown .dropbtn {
font-size: 16px;
border: none;
- outline: none;
color: white;
+ outline: none;
padding: 14px 16px;
background-color: inherit;
font-family: inherit;
@@ -107,3 +115,6 @@ nav a:hover, .dropdown:hover .dropbtn {
background-color: #ffc299;
}
+.unapproved {
+ background-color: #fff0b3;
+}
diff --git a/src/main/resources/static/header.html b/src/main/resources/static/header.html
deleted file mode 100644
index 26f5b71..0000000
--- a/src/main/resources/static/header.html
+++ /dev/null
@@ -1,51 +0,0 @@
-
diff --git a/src/main/resources/static/js/main.js b/src/main/resources/static/js/main.js
index cc198f2..c5f3be5 100644
--- a/src/main/resources/static/js/main.js
+++ b/src/main/resources/static/js/main.js
@@ -8,18 +8,6 @@
body.appendChild(axiosElement);
axiosElement.onload = () => {
- // Ajoute le header
- axios.get('/header.html')
- .then(r => {
- const header = document.createElement("header");
- header.innerHTML = r.data;
- body.insertBefore(header, document.querySelector("section"));
- })
- .catch(e => {
- console.log(e);
- errorP.innerHTML = "Une erreur est survenue lors de la récupération de l'entête";
- });
-
// Vérifie si les SIMDUTs sont présents
document.querySelectorAll(".materialCode").forEach(e => {
const materialID = e.getAttribute("data-materialID");
diff --git a/src/main/resources/templates/company/created.html b/src/main/resources/templates/company/created.html
index 59c2625..48ff137 100644
--- a/src/main/resources/templates/company/created.html
+++ b/src/main/resources/templates/company/created.html
@@ -1,18 +1,24 @@
-
- Ajout d'une bannière
+
+
+
+
+
- Ajout d'une bannière
-
-
+
+
+
+
+
+
diff --git a/src/main/resources/templates/company/creator.html b/src/main/resources/templates/company/creator.html
index b52b5ff..c6db49c 100644
--- a/src/main/resources/templates/company/creator.html
+++ b/src/main/resources/templates/company/creator.html
@@ -1,37 +1,44 @@
-
- Ajout d'une bannière
+
+
+
+
+
+
+
+
diff --git a/src/main/resources/templates/company/remover.html b/src/main/resources/templates/company/remover.html
index d969527..9198275 100644
--- a/src/main/resources/templates/company/remover.html
+++ b/src/main/resources/templates/company/remover.html
@@ -1,7 +1,7 @@
-
+
Supprimer des bannières
@@ -23,6 +23,9 @@
+
+
+
Aucune bannière n'a été trouvée.
+
+
+
diff --git a/src/main/resources/templates/fragments.html b/src/main/resources/templates/fragments.html
new file mode 100644
index 0000000..d82899a
--- /dev/null
+++ b/src/main/resources/templates/fragments.html
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/templates/images/add.html b/src/main/resources/templates/images/add.html
index 757abed..47650c4 100644
--- a/src/main/resources/templates/images/add.html
+++ b/src/main/resources/templates/images/add.html
@@ -1,13 +1,16 @@
-
+
Ajout une image
+
+
+
+
+
+
diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html
index 60f66e4..94bcabd 100644
--- a/src/main/resources/templates/index.html
+++ b/src/main/resources/templates/index.html
@@ -1,10 +1,7 @@
-
- Explorateur de recettes de couleur
-
-
+
+
+
+
+
+
+
diff --git a/src/main/resources/templates/material/creator.html b/src/main/resources/templates/material/creator.html
index cf23b10..b5c80fb 100644
--- a/src/main/resources/templates/material/creator.html
+++ b/src/main/resources/templates/material/creator.html
@@ -1,7 +1,7 @@
-
+
Ajout d'un produit
@@ -9,6 +9,9 @@
+
+
+
+
+
+
diff --git a/src/main/resources/templates/material/simdut.html b/src/main/resources/templates/material/simdut.html
index 81d4ab2..6703380 100644
--- a/src/main/resources/templates/material/simdut.html
+++ b/src/main/resources/templates/material/simdut.html
@@ -1,7 +1,7 @@
-
+
Ajout d'un produit
@@ -9,6 +9,9 @@
+
+
+
Ajout d'un produit
@@ -25,6 +28,9 @@
+
+
+
diff --git a/src/main/resources/templates/materialType/creator.html b/src/main/resources/templates/materialType/creator.html
index d4a9dc5..3acb9cc 100644
--- a/src/main/resources/templates/materialType/creator.html
+++ b/src/main/resources/templates/materialType/creator.html
@@ -1,7 +1,7 @@
-
+
Ajout d'un type de produit
@@ -9,6 +9,9 @@
+
+
+
Ajout d'un type de produit
@@ -40,6 +43,9 @@
+
+
+
diff --git a/src/main/resources/templates/mix/creator.html b/src/main/resources/templates/mix/creator.html
index 6c2fdaf..5dc8155 100644
--- a/src/main/resources/templates/mix/creator.html
+++ b/src/main/resources/templates/mix/creator.html
@@ -1,7 +1,7 @@
-
+
Ajout d'un mélange
@@ -15,6 +15,9 @@
+
+
+
Ajout d'un mélange pour
la recette
@@ -39,7 +42,7 @@
- |