From 88f7ec338e82f7c7e91754d2f36b25edf23ad0bd Mon Sep 17 00:00:00 2001 From: William Nolin Date: Wed, 29 Jan 2020 20:48:25 -0500 Subject: [PATCH] =?UTF-8?q?#=20v1.2.0=20(Imprimante=20P-touch)=20###=20Cor?= =?UTF-8?q?rections=20*=20Correction=20d'un=20bug=20qui=20emp=C3=AAchait?= =?UTF-8?q?=20la=20suppression=20des=20m=C3=A9langes.=20*=20Correction=20d?= =?UTF-8?q?'un=20bug=20qui=20emp=C3=AAche=20les=20boutons=20supprimer=20de?= =?UTF-8?q?=20fonctionner.=20*=20Correction=20d'un=20bug=20qui=20permettai?= =?UTF-8?q?t=20d'envoyer=20les=20formulaires=20demandant=20des=20mots=20de?= =?UTF-8?q?=20passe=20sans=20donner=20un=20mot=20de=20passe=20valide.=20*?= =?UTF-8?q?=20Correction=20d'une=20d=C3=A9synchronisation=20entre=20le=20n?= =?UTF-8?q?om=20des=20m=C3=A9langes=20et=20leur=20produit=20interne.=20*?= =?UTF-8?q?=20Am=C3=A9lioration=20du=20style.=20*=20Am=C3=A9lioration=20de?= =?UTF-8?q?=20la=20fluidit=C3=A9=20de=20la=20navigation.=20*=20Transition?= =?UTF-8?q?=20compl=C3=A8te=20des=20mod=C3=A8les=20vers=20Lombok.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### Ajouts * Ajout du support pour l'imprimante P-touch de Brother. * L'extension b-Pac doit être installée sur le navigateur des clients. * [Firefox](https://cre.fyloz.dev/bpac.xpi) * [Chrome](https://chrome.google.com/webstore/detail/brother-b-pac-extension/ilpghlfadkjifilabejhhijpfphfcfhb) * Le logiciel b-Pac doit être installé sur l'ordinateur des clients. * [Windows](https://download.brother.com/welcome/dlfp100614/bcciw32031.msi) * Ajout de la possibilité d'imprimer les mélanges avec P-Touch * Ajout de la possibilité d'imprimer les étiquettes de kit de retouche avec P-Touch * Ajout des boîtes de confirmation. * Ajout d'un type de produit aux mélanges. * Ajout du changement d'ordre des produits d'un mélange. * Les produits dans l'inventaire sont maintenant ordonnés alphabétiquement. ### Dépendances * Ajout de jQuery, début de la transition. * Migration vers Java 11 --- pom.xml | 25 +- .../core/configuration/InitialDataLoader.java | 2 +- .../core/io/response/ResponseCode.java | 7 + .../core/model/Material.java | 2 +- .../core/model/MaterialType.java | 2 +- .../core/model/Recipe.java | 32 +- .../core/services/InventoryService.java | 4 +- .../core/services/model/MaterialService.java | 3 +- .../services/model/MaterialTypeService.java | 4 +- .../core/services/model/MixService.java | 30 +- .../core/services/model/RecipeService.java | 3 +- .../services/model/TouchUpKitService.java | 32 + .../core/utils/PdfBuilder.java | 101 ++ .../{PagesPaths.java => WebsitePaths.java} | 10 +- .../web/controller/CREErrorController.java | 2 +- .../web/controller/IndexController.java | 23 +- .../web/controller/InventoryController.java | 21 +- .../web/controller/OthersController.java | 84 +- .../controller/RecipeExplorerController.java | 10 +- .../creators/CompanyCreatorController.java | 12 +- .../creators/MaterialCreatorController.java | 4 +- .../MaterialTypeCreatorController.java | 16 +- .../creators/MixCreatorController.java | 21 +- .../creators/RecipeCreatorController.java | 8 +- .../editors/MaterialEditorController.java | 9 +- .../editors/MaterialTypeEditorController.java | 52 +- .../editors/MixEditorController.java | 34 +- .../editors/RecipeEditorController.java | 8 +- .../{ => files}/ImageFilesController.java | 16 +- .../{ => files}/SIMDUTFilesController.java | 10 +- .../files/TouchUpKitController.java | 53 + .../files/XlsExporterController.java | 89 ++ .../removers/CompanyRemoverController.java | 8 +- .../removers/MaterialRemoverController.java | 12 +- .../MaterialTypeRemoverController.java | 12 +- .../removers/RecipeRemoverController.java | 8 +- src/main/resources/application.yml | 2 + src/main/resources/fonts/arialbd.ttf | Bin 0 -> 352224 bytes .../resources/lang/messages_en.properties | 207 +-- .../resources/lang/messages_fr.properties | 206 +-- .../resources/lang/responses_en.properties | 19 +- .../resources/lang/responses_fr.properties | 11 +- src/main/resources/static/bpac.xpi | Bin 0 -> 18204 bytes src/main/resources/static/css/main.css | 118 +- src/main/resources/static/css/menu.css | 48 +- src/main/resources/static/icons/confirm.svg | 7 + src/main/resources/static/icons/error.svg | 2 +- src/main/resources/static/icons/printer.svg | 6 + .../resources/static/icons/printerError.svg | 6 + src/main/resources/static/js/bpac.js | 1182 +++++++++++++++++ src/main/resources/static/js/main.js | 300 +++-- src/main/resources/static/js/mix.js | 212 +-- src/main/resources/static/js/ptouchPrint.js | 47 + src/main/resources/static/js/recipeList.js | 8 + .../resources/static/js/recipeResearch.js | 18 +- src/main/resources/static/lbx/Couleur.lbx | Bin 0 -> 2236 bytes src/main/resources/static/lbx/Templates.zip | Bin 0 -> 4130 bytes src/main/resources/static/lbx/Touchup.lbx | Bin 0 -> 1996 bytes src/main/resources/static/pdf/touchup.old.pdf | Bin 0 -> 15545 bytes src/main/resources/static/pdf/touchup.pdf | Bin 15545 -> 16909 bytes .../resources/templates/company/creator.html | 2 +- .../resources/templates/company/remover.html | 2 +- src/main/resources/templates/error.html | 2 +- src/main/resources/templates/fragments.html | 128 +- src/main/resources/templates/images/add.html | 2 +- src/main/resources/templates/index.html | 22 +- src/main/resources/templates/inventory.html | 12 +- .../resources/templates/material/created.html | 2 +- .../resources/templates/material/creator.html | 5 +- .../resources/templates/material/edit.html | 11 +- .../resources/templates/material/editor.html | 7 +- .../resources/templates/material/remover.html | 4 +- .../resources/templates/material/simdut.html | 2 +- .../templates/materialType/creator.html | 2 +- .../templates/materialType/edit.html | 4 +- .../templates/materialType/editor.html | 7 +- .../templates/materialType/remover.html | 2 +- src/main/resources/templates/mix/creator.html | 2 +- src/main/resources/templates/mix/editor.html | 6 +- .../resources/templates/mix/selector.html | 3 +- src/main/resources/templates/recipe/bak.html | 155 --- .../resources/templates/recipe/created.html | 4 +- .../resources/templates/recipe/creator.html | 2 +- src/main/resources/templates/recipe/edit.html | 58 +- .../resources/templates/recipe/editor.html | 23 +- .../resources/templates/recipe/explore.html | 415 +++--- .../resources/templates/recipe/remover.html | 9 +- src/main/resources/templates/touchup.html | 69 + .../resources/templates/touchupPtouch.html | 52 + src/main/resources/templates/updates.html | 5 +- src/main/resources/updates.md | 24 +- 91 files changed, 2936 insertions(+), 1275 deletions(-) create mode 100644 src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/services/model/TouchUpKitService.java create mode 100644 src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/utils/PdfBuilder.java rename src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/{PagesPaths.java => WebsitePaths.java} (92%) rename src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/{ => files}/ImageFilesController.java (93%) rename src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/{ => files}/SIMDUTFilesController.java (87%) create mode 100644 src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/files/TouchUpKitController.java create mode 100644 src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/files/XlsExporterController.java create mode 100644 src/main/resources/fonts/arialbd.ttf create mode 100644 src/main/resources/static/bpac.xpi create mode 100644 src/main/resources/static/icons/confirm.svg create mode 100644 src/main/resources/static/icons/printer.svg create mode 100644 src/main/resources/static/icons/printerError.svg create mode 100644 src/main/resources/static/js/bpac.js create mode 100644 src/main/resources/static/js/ptouchPrint.js create mode 100644 src/main/resources/static/js/recipeList.js create mode 100644 src/main/resources/static/lbx/Couleur.lbx create mode 100644 src/main/resources/static/lbx/Templates.zip create mode 100644 src/main/resources/static/lbx/Touchup.lbx create mode 100644 src/main/resources/static/pdf/touchup.old.pdf delete mode 100644 src/main/resources/templates/recipe/bak.html create mode 100644 src/main/resources/templates/touchup.html create mode 100644 src/main/resources/templates/touchupPtouch.html diff --git a/pom.xml b/pom.xml index 0fe8ad5..35c9b13 100644 --- a/pom.xml +++ b/pom.xml @@ -10,12 +10,12 @@ dev.fyloz.trial.colorrecipesexplorer ColorRecipesExplorer - 1.1.3 + 1.2.0 Color Recipes Explorer UTF-8 - 1.8 + 11 @@ -41,11 +41,6 @@ spring-boot-starter-test test - - org.xhtmlrenderer - flying-saucer-pdf - 9.1.18 - org.apache.poi poi-ooxml @@ -56,16 +51,6 @@ h2 runtime - - commons-codec - commons-codec - 1.11 - - - com.itextpdf - itextpdf - 5.5.10 - org.apache.pdfbox pdfbox @@ -95,6 +80,12 @@ commonmark 0.13.1 + + commons-io + commons-io + 2.6 + + diff --git a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/configuration/InitialDataLoader.java b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/configuration/InitialDataLoader.java index 2c2be3f..3947342 100644 --- a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/configuration/InitialDataLoader.java +++ b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/configuration/InitialDataLoader.java @@ -35,7 +35,7 @@ public class InitialDataLoader implements ApplicationListener optionalSavedMaterialType = materialTypeService.save(defaultMaterialType); - if (!optionalSavedMaterialType.isPresent()) { + if (optionalSavedMaterialType.isEmpty()) { ColorRecipesExplorerApplication.LOGGER.warn(String.format("Échec de la création du type de produit par défaut '%s'.", name)); } } diff --git a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/io/response/ResponseCode.java b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/io/response/ResponseCode.java index 702eea5..d0f3855 100644 --- a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/io/response/ResponseCode.java +++ b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/io/response/ResponseCode.java @@ -28,6 +28,13 @@ public enum ResponseCode { RECIPE_NOT_FOUND_NO_PARAMS(25, ResponseCodeType.ERROR, 0), MATERIAL_NOT_FOUND_BY_NAME(26, ResponseCodeType.ERROR, 1), SUCCESS_DELETING_COMPANY(27, ResponseCodeType.SUCCESS, 1), + SUCCESS_SAVING_MATERIAL(28, ResponseCodeType.SUCCESS, 1), + SUCCESS_SAVING_MATERIAL_TYPE(29, ResponseCodeType.SUCCESS, 1), + SUCCESS_SAVING_RECIPE(30, ResponseCodeType.SUCCESS, 1), + SUCCESS_DELETING_MATERIAL(31, ResponseCodeType.SUCCESS, 1), + SUCCESS_SAVING_COMPANY(32, ResponseCodeType.SUCCESS, 1), + SUCCESS_DELETING_RECIPE(33, ResponseCodeType.SUCCESS, 1), + SUCCESS_DELETING_MATERIAL_TYPE(34, ResponseCodeType.SUCCESS, 1), // HTTP Errors _500(100, ResponseCodeType.ERROR, 0), diff --git a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/model/Material.java b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/model/Material.java index 2289522..54f123b 100644 --- a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/model/Material.java +++ b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/model/Material.java @@ -11,9 +11,9 @@ import java.io.Serializable; @Entity @Table(name = "materials") @Data +@EqualsAndHashCode(callSuper = false) @RequiredArgsConstructor @NoArgsConstructor -@EqualsAndHashCode(callSuper = false) public class Material extends BeanModel implements Serializable { @Id diff --git a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/model/MaterialType.java b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/model/MaterialType.java index 8377236..8f913b9 100644 --- a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/model/MaterialType.java +++ b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/model/MaterialType.java @@ -20,7 +20,7 @@ public class MaterialType extends BeanModel implements Serializable { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) - private Integer materialTypeID; + private Integer materialTypeID = 0; @NonNull @NotNull diff --git a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/model/Recipe.java b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/model/Recipe.java index eed7c52..34a68ec 100644 --- a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/model/Recipe.java +++ b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/model/Recipe.java @@ -57,27 +57,13 @@ public class Recipe extends BeanModel implements Serializable { return recipeID; } - public Material getBase() { - if (recipeMixes.isEmpty() || recipeMixes.stream().allMatch(m -> m.getMixQuantities().isEmpty())) return null; - - Material base = recipeMixes - .stream() - .map(mix -> mix - .getMixQuantities() - .stream() - .filter(mq -> mq.getMaterial().getMaterialType().getMaterialTypeName().equals(MaterialType.BASE_MATERIAL_TYPE_NAME)) - .findFirst().get() - ) - .findFirst().orElse(recipeMixes - .stream() - .filter(m -> !m.getMixQuantities().isEmpty()) - .findFirst() - .get() - .getMixQuantities() - .stream() - .findFirst() - .get()).getMaterial(); - - return base; - } +// public Material getBase() { +// for (Mix mix : recipeMixes) { +// for(MixQuantity mq : mix.getMixQuantities()) { +// if(mq.getMaterial().getMaterialType().getMaterialTypeName().equals(MaterialType.BASE_MATERIAL_TYPE_NAME)) return mq.getMaterial(); +// } +// } +// +// return null; +// } } diff --git a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/services/InventoryService.java b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/services/InventoryService.java index 6f4b3c5..ff66b00 100644 --- a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/services/InventoryService.java +++ b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/services/InventoryService.java @@ -32,13 +32,13 @@ public class InventoryService { return null; } - public boolean useMix(Mix mix, Map quantities) { + public boolean useMix(Map quantities) { for (Map.Entry entry : quantities.entrySet()) { Material material = entry.getKey(); if (!material.isMixType()) { material.setInventoryQuantity(material.getInventoryQuantity() - entry.getValue()); - if (!materialService.update(material).isPresent()) return false; + if (materialService.update(material).isEmpty()) return false; } } diff --git a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/services/model/MaterialService.java b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/services/model/MaterialService.java index 1085485..d547356 100644 --- a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/services/model/MaterialService.java +++ b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/services/model/MaterialService.java @@ -72,9 +72,10 @@ public class MaterialService extends GenericService { if (material == null) return false; Optional materialByCode = dao.findByMaterialCode(material.getMaterialCode()); - return super.isValidForUpdate(material) && (!materialByCode.isPresent() || material.getMaterialID().equals(materialByCode.get().getMaterialID())); + return super.isValidForUpdate(material) && (materialByCode.isEmpty() || material.getMaterialID().equals(materialByCode.get().getMaterialID())); } + @Deprecated(since = "1.2.0") public List getAllBySearchString(String searchString) { return dao.findAllByMaterialCodeContainingIgnoreCase(searchString).stream().filter(m -> !m.isMixType()).collect(Collectors.toList()); } diff --git a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/services/model/MaterialTypeService.java b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/services/model/MaterialTypeService.java index 99aa914..359c964 100644 --- a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/services/model/MaterialTypeService.java +++ b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/services/model/MaterialTypeService.java @@ -46,13 +46,13 @@ public class MaterialTypeService extends GenericService materialTypeByName = dao.findByMaterialTypeName(materialType.getMaterialTypeName()); - return !materialTypeByName.isPresent() || materialType.getMaterialTypeID().equals(materialTypeByName.get().getMaterialTypeID()); + return materialTypeByName.isEmpty() || materialType.getMaterialTypeID().equals(materialTypeByName.get().getMaterialTypeID()); } public boolean isValidForUpdatePrefix(MaterialType materialType) { Optional materialTypeByPrefix = dao.findByPrefix(materialType.getPrefix()); - return !materialTypeByPrefix.isPresent() || materialType.getMaterialTypeID().equals(materialTypeByPrefix.get().getMaterialTypeID()); + return materialTypeByPrefix.isEmpty() || materialType.getMaterialTypeID().equals(materialTypeByPrefix.get().getMaterialTypeID()); } public Optional getByName(String name) { diff --git a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/services/model/MixService.java b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/services/model/MixService.java index 09e05f6..d1ed7e2 100644 --- a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/services/model/MixService.java +++ b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/services/model/MixService.java @@ -11,9 +11,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.validation.constraints.NotNull; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; +import java.util.*; +import java.util.stream.Collectors; @Service public class MixService extends GenericService { @@ -32,6 +31,25 @@ public class MixService extends GenericService { this.recipeService = recipeService; } + public Collection getAvailableMaterialsForNewMix(Recipe recipe) { + Collection recipeMixTypes = recipeService.getAssociatedMixesTypes(recipe); + + return materialService + .getAll() + .stream() + .filter(m -> !m.isMixType() || recipeMixTypes.contains(mixTypeService.getByMaterial(m).get())) + .sorted(Comparator.comparing(Material::getMaterialCode)) + .sorted(Comparator.comparing(m -> m.getMaterialType().getMaterialTypeName())) + .collect(Collectors.toList()); + } + + public Collection getAvailableMaterialsForMix(Recipe recipe, Mix mix) { + return getAvailableMaterialsForNewMix(recipe) + .stream() + .filter(m -> !m.equals(mix.getMixType().getMaterial())) + .collect(Collectors.toList()); + } + @Transactional public ModelResponseBuilder create(MixCreationFormDto formDto, @NotNull Recipe recipe) { ModelResponseBuilder modelResponseBuilder = new ModelResponseBuilder(); @@ -39,7 +57,7 @@ public class MixService extends GenericService { List materials = new ArrayList<>(); for (String materialCode : formDto.getMaterials()) { Optional found = materialService.getByMaterialCode(materialCode); - if (!found.isPresent()) { + if (found.isEmpty()) { return modelResponseBuilder.addResponseCode(ResponseCode.MATERIAL_NOT_FOUND_BY_NAME, materialCode); } @@ -47,7 +65,7 @@ public class MixService extends GenericService { } Optional optionalMixType = mixTypeService.createByName(formDto.getMixTypeName(), formDto.getMaterialType()); - if (!optionalMixType.isPresent()) return modelResponseBuilder.addResponseCode(ResponseCode.ERROR_SAVING); + if (optionalMixType.isEmpty()) return modelResponseBuilder.addResponseCode(ResponseCode.ERROR_SAVING); MixType mixType = optionalMixType.get(); if (recipeService.hasMixType(recipe, mixType)) @@ -80,7 +98,7 @@ public class MixService extends GenericService { List materials = new ArrayList<>(); for (String materialCode : formDto.getMaterials()) { Optional found = materialService.getByMaterialCode(materialCode); - if (!found.isPresent()) { + if (found.isEmpty()) { return modelResponseBuilder.addResponseCode(ResponseCode.MATERIAL_NOT_FOUND_BY_NAME, materialCode); } diff --git a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/services/model/RecipeService.java b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/services/model/RecipeService.java index 37aaa80..d9dc400 100644 --- a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/services/model/RecipeService.java +++ b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/services/model/RecipeService.java @@ -68,7 +68,7 @@ public class RecipeService extends GenericService { storedRecipe.setNote(newRecipe.getNote()); Optional optionalRecipe = convertAndCreateSteps(storedRecipe, form); - if (!optionalRecipe.isPresent()) { + if (optionalRecipe.isEmpty()) { return Optional.empty(); } @@ -126,6 +126,7 @@ public class RecipeService extends GenericService { .contains(mixType); } + @Deprecated(since = "1.2.0") public Map> getRecipesForSearchString(String searchString) { List recipes = dao.findAllByRecipeDescriptionContainsOrRecipeCodeContains(searchString.toUpperCase()); diff --git a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/services/model/TouchUpKitService.java b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/services/model/TouchUpKitService.java new file mode 100644 index 0000000..92eafed --- /dev/null +++ b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/services/model/TouchUpKitService.java @@ -0,0 +1,32 @@ +package dev.fyloz.trial.colorrecipesexplorer.core.services.model; + +import dev.fyloz.trial.colorrecipesexplorer.core.utils.PdfBuilder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.ResourceLoader; +import org.springframework.stereotype.Service; + +import java.io.IOException; + +@Service +public class TouchUpKitService { + + private static final String TOUCH_UP_FR = "KIT DE RETOUCHE"; + private static final String TOUCH_UP_EN = "TOUCH UP KIT"; + public static final int FONT_SIZE = 42; + + private ResourceLoader resourceLoader; + + @Autowired + public TouchUpKitService(ResourceLoader resourceLoader) { + this.resourceLoader = resourceLoader; + } + + public byte[] getPdfForJobNumber(String jobNumber) throws IOException { + return new PdfBuilder(resourceLoader, true, FONT_SIZE) + .addLine(TOUCH_UP_FR, true, 0) + .addLine(TOUCH_UP_EN, true, 0) + .addLine(jobNumber, false, 10) + .build(); + } + +} diff --git a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/utils/PdfBuilder.java b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/utils/PdfBuilder.java new file mode 100644 index 0000000..42050a4 --- /dev/null +++ b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/core/utils/PdfBuilder.java @@ -0,0 +1,101 @@ +package dev.fyloz.trial.colorrecipesexplorer.core.utils; + +import dev.fyloz.trial.colorrecipesexplorer.web.WebsitePaths; +import lombok.AllArgsConstructor; +import lombok.Data; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.PDPage; +import org.apache.pdfbox.pdmodel.PDPageContentStream; +import org.apache.pdfbox.pdmodel.font.PDFont; +import org.apache.pdfbox.pdmodel.font.PDType0Font; +import org.springframework.core.io.ResourceLoader; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; + +public class PdfBuilder { + + private PDFont font; + private PDDocument document = new PDDocument(); + private PDPage page = new PDPage(); + private Collection lines = new ArrayList<>(); + private boolean duplicated; + private int fontSize; + private int fontSizeBold; + private int lineSpacing; + + public PdfBuilder(ResourceLoader resourceLoader, boolean duplicated, int fontSize) throws IOException { + this.duplicated = duplicated; + this.fontSize = fontSize; + this.fontSizeBold = this.fontSize + 12; + this.lineSpacing = (int) (this.fontSize * 1.5f); + + document.addPage(page); + font = PDType0Font.load(document, resourceLoader.getResource(WebsitePaths.FONT_ARIAL_BOLD).getFile()); + } + + public PdfBuilder addLine(String text, boolean bold, int marginTop) { + lines.add(new PdfLine(text, bold, marginTop)); + + return this; + } + + public byte[] build() throws IOException { + writeContent(); + + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + document.save(outputStream); + document.close(); + + return outputStream.toByteArray(); + } + + private void writeContent() throws IOException { + PDPageContentStream contentStream = new PDPageContentStream(document, page); + contentStream.beginText(); + + int marginTop = 30; + for (PdfLine line : lines) { + writeCenteredText(contentStream, line, marginTop); + marginTop += lineSpacing; + } + + if (duplicated) { + marginTop = (int) page.getMediaBox().getHeight() / 2; + for (PdfLine line : lines) { + writeCenteredText(contentStream, line, marginTop); + marginTop += lineSpacing; + } + } + + contentStream.endText(); + contentStream.close(); + } + + private void writeCenteredText(PDPageContentStream contentStream, PdfLine line, int marginTop) throws IOException { + float textWidth = font.getStringWidth(line.getText()) / 1000 * (line.isBold() ? fontSizeBold : fontSize); + float textHeight = font.getFontDescriptor().getFontBoundingBox().getHeight() / 1000 * (line.isBold() ? fontSizeBold : fontSize); + float textX = (page.getMediaBox().getWidth() - textWidth) / 2f; + float textY = (page.getMediaBox().getHeight() - (marginTop + line.getMarginTop()) - textHeight); + + if (line.isBold()) contentStream.setFont(font, fontSizeBold); + else contentStream.setFont(font, fontSize); + + contentStream.newLineAtOffset(textX, textY); + contentStream.showText(line.getText()); + contentStream.newLineAtOffset(-textX, -textY); // Réinitialise la position pour la prochaine ligne + } + + @Data + @AllArgsConstructor + public static class PdfLine { + + private String text; + private boolean bold; + private int marginTop; + + } + +} diff --git a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/PagesPaths.java b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/WebsitePaths.java similarity index 92% rename from src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/PagesPaths.java rename to src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/WebsitePaths.java index 6000b93..1565f0b 100644 --- a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/PagesPaths.java +++ b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/WebsitePaths.java @@ -1,19 +1,19 @@ package dev.fyloz.trial.colorrecipesexplorer.web; -public class PagesPaths { +public class WebsitePaths { // Autres public static final String INDEX = "index"; public static final String SEARCH = "search"; public static final String SEARCH_INVENTORY = "inventory/search"; public static final String SIMDUT_FILES = "simdut/{materialID}"; public static final String PASSWORD_VALIDATION = "password/valid"; - public static final String TOUCHUP = "touchup"; public static final String RECIPE_XLS = "recipe/xls/{recipeID}"; public static final String ALL_RECIPES_XLS = "recipe/xls"; public static final String ERROR = "error"; public static final String CLOSE_TAB = "closeTab"; public static final String UPDATES = "updates"; public static final String UPDATES_GET = "updates/get"; + public static final String FONT_ARIAL_BOLD = "classpath:fonts/arialbd.ttf"; // Images public static final String IMAGES_FILES = "images/{image}"; @@ -21,6 +21,12 @@ public class PagesPaths { public static final String ADD_IMAGE_SPECIFIC = "images/add/{recipeID}"; public static final String DELETE_IMAGE = "images/delete"; + // Touch up kits + public static final String TOUCHUP = "touchup"; + public static final String TOUCHUP_PDF = "touchup/pdf"; + public static final String TOUCHUP_PTOUCH = "touchup/ptouch"; + public static final String TOUCHUP_PTOUCH_PAGE = "touchupPtouch"; + // Inventaire public static final String INVENTORY = "inventory"; public static final String USE_INVENTORY = "inventory/use"; diff --git a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/CREErrorController.java b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/CREErrorController.java index 51716fb..b9ce072 100644 --- a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/CREErrorController.java +++ b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/CREErrorController.java @@ -10,7 +10,7 @@ import org.springframework.web.servlet.ModelAndView; import javax.servlet.RequestDispatcher; import javax.servlet.http.HttpServletRequest; -import static dev.fyloz.trial.colorrecipesexplorer.web.PagesPaths.ERROR; +import static dev.fyloz.trial.colorrecipesexplorer.web.WebsitePaths.ERROR; @Controller public class CREErrorController implements ErrorController { diff --git a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/IndexController.java b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/IndexController.java index cc51792..69a061f 100644 --- a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/IndexController.java +++ b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/IndexController.java @@ -6,7 +6,6 @@ import dev.fyloz.trial.colorrecipesexplorer.core.io.response.ResponseDataType; import dev.fyloz.trial.colorrecipesexplorer.core.model.Company; import dev.fyloz.trial.colorrecipesexplorer.core.model.Recipe; import dev.fyloz.trial.colorrecipesexplorer.core.services.PasswordService; -import dev.fyloz.trial.colorrecipesexplorer.core.services.model.CompanyService; import dev.fyloz.trial.colorrecipesexplorer.core.services.model.RecipeService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; @@ -19,17 +18,16 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import static dev.fyloz.trial.colorrecipesexplorer.web.PagesPaths.*; +import static dev.fyloz.trial.colorrecipesexplorer.web.WebsitePaths.INDEX; +import static dev.fyloz.trial.colorrecipesexplorer.web.WebsitePaths.PASSWORD_VALIDATION; @Controller public class IndexController { - private CompanyService companyService; private RecipeService recipeService; @Autowired - public IndexController(CompanyService companyService, RecipeService recipeService) { - this.companyService = companyService; + public IndexController(RecipeService recipeService) { this.recipeService = recipeService; } @@ -39,21 +37,14 @@ public class IndexController { * @return La page à afficher. */ @GetMapping({INDEX, "/"}) - public ModelAndView showPage() { - List companies = companyService.getAll(); - Map> recipes = new HashMap<>(); - - for (Company company : companies) { - recipes.put(company, recipeService.getByCompany(company)); - } - + public ModelAndView getPage() { return new ModelResponseBuilder(INDEX) - .addResponseData(ResponseDataType.RECIPE_MAP, recipes) + .addResponseData(ResponseDataType.RECIPE_MAP, recipeService.getRecipesByCompany()) .build(); } - @GetMapping(value = SEARCH, produces = MediaType.APPLICATION_JSON_VALUE) - @ResponseBody + // @GetMapping(value = SEARCH, produces = MediaType.APPLICATION_JSON_VALUE) +// @ResponseBody public Map searchWord(@RequestParam String searchString) { Map> searchResult = recipeService.getRecipesForSearchString(searchString); Map> outputResult = new HashMap<>(); diff --git a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/InventoryController.java b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/InventoryController.java index 154be15..8980f8a 100644 --- a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/InventoryController.java +++ b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/InventoryController.java @@ -21,8 +21,9 @@ import org.springframework.web.servlet.ModelAndView; import java.util.*; import java.util.stream.Collectors; -import static dev.fyloz.trial.colorrecipesexplorer.web.PagesPaths.*; import static dev.fyloz.trial.colorrecipesexplorer.web.StringBank.RESPONSE_REASON; +import static dev.fyloz.trial.colorrecipesexplorer.web.WebsitePaths.INVENTORY; +import static dev.fyloz.trial.colorrecipesexplorer.web.WebsitePaths.USE_INVENTORY; @Controller public class InventoryController { @@ -41,7 +42,7 @@ public class InventoryController { } @GetMapping(INVENTORY) - public ModelAndView getInventory(ModelAndView model) { + public ModelAndView getPage(ModelAndView model) { return new ModelResponseBuilder(model) .withView(INVENTORY) .addResponseData(ResponseDataType.MATERIALS, materialService.getAllOrdered().stream().filter(m -> !m.isMixType()).collect(Collectors.toList())) @@ -77,7 +78,8 @@ public class InventoryController { @ResponseBody @Transactional // TODO vers DTO - public Map consumeMaterials(@RequestBody Map form) { + // TODO + vers service + public Map consumeMaterials(@RequestBody Map> form) { JSONResponseBuilder responseBuilder = new JSONResponseBuilder(); List mixes = new ArrayList<>(); @@ -87,7 +89,7 @@ public class InventoryController { int mixID = Integer.parseInt(mixIDStr); Optional optionalMix = mixService.getByID(mixID); - if (!optionalMix.isPresent()) { + if (optionalMix.isEmpty()) { return responseBuilder .addResponseCode(ResponseCode.MIX_NOT_FOUND, mixID) .build(); @@ -96,14 +98,15 @@ public class InventoryController { Mix mix = optionalMix.get(); mixes.add(mix); - Map formMaterials = (Map) form.get(mixIDStr); + Map formMaterials = form.get(mixIDStr); Map mixQuantities = new HashMap<>(); for (Material material : mix.getMixQuantities().stream().map(MixQuantity::getMaterial).collect(Collectors.toList())) { String materialIDAsString = String.valueOf(material.getMaterialID()); if (formMaterials.containsKey(materialIDAsString)) { - mixQuantities.put(material, Float.parseFloat(formMaterials.get(materialIDAsString))); + Float quantityAsString = formMaterials.get(materialIDAsString); + mixQuantities.put(material, quantityAsString); } } @@ -123,7 +126,7 @@ public class InventoryController { } for (Mix mix : mixes) { - if (!inventoryService.useMix(mix, quantities.get(mix))) { + if (!inventoryService.useMix(quantities.get(mix))) { return responseBuilder .addResponseCode(ResponseCode.ERROR_SAVING) .build(); @@ -135,8 +138,8 @@ public class InventoryController { .build(); } - @GetMapping(value = SEARCH_INVENTORY, produces = MediaType.APPLICATION_JSON_VALUE) - @ResponseBody + // @GetMapping(value = SEARCH_INVENTORY, produces = MediaType.APPLICATION_JSON_VALUE) + // @ResponseBody public Map searchWordInventory(@RequestParam String searchString) { List searchResult = materialService.getAllBySearchString(searchString); List outputResult = searchResult.stream().map(Material::getMaterialID).collect(Collectors.toList()); diff --git a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/OthersController.java b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/OthersController.java index e675c88..3d4228a 100644 --- a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/OthersController.java +++ b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/OthersController.java @@ -1,23 +1,19 @@ package dev.fyloz.trial.colorrecipesexplorer.web.controller; -import dev.fyloz.trial.colorrecipesexplorer.ColorRecipesExplorerApplication; import dev.fyloz.trial.colorrecipesexplorer.core.io.response.ModelResponseBuilder; import dev.fyloz.trial.colorrecipesexplorer.core.model.Material; import dev.fyloz.trial.colorrecipesexplorer.core.model.Mix; -import dev.fyloz.trial.colorrecipesexplorer.core.model.MixType; import dev.fyloz.trial.colorrecipesexplorer.core.model.Recipe; import dev.fyloz.trial.colorrecipesexplorer.core.services.model.MaterialService; import dev.fyloz.trial.colorrecipesexplorer.core.services.model.MixService; import dev.fyloz.trial.colorrecipesexplorer.core.services.model.MixTypeService; import dev.fyloz.trial.colorrecipesexplorer.core.services.model.RecipeService; import dev.fyloz.trial.colorrecipesexplorer.core.utils.FileUtils; -import dev.fyloz.trial.colorrecipesexplorer.xlsx.XlsxExporter; import org.commonmark.node.Node; import org.commonmark.parser.Parser; import org.commonmark.renderer.html.HtmlRenderer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.ResourceLoader; -import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -27,19 +23,11 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; -import javax.servlet.http.HttpServletRequest; -import java.io.ByteArrayOutputStream; -import java.io.IOException; import java.util.Collection; -import java.util.Comparator; -import java.util.List; import java.util.Optional; -import java.util.stream.Collectors; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; -import static dev.fyloz.trial.colorrecipesexplorer.web.PagesPaths.*; import static dev.fyloz.trial.colorrecipesexplorer.web.StringBank.MATERIALS; +import static dev.fyloz.trial.colorrecipesexplorer.web.WebsitePaths.*; @Controller public class OthersController { @@ -69,7 +57,7 @@ public class OthersController { ModelResponseBuilder modelResponseBuilder = new ModelResponseBuilder(MATERIAL_SELECTOR_FRAGMENT); Optional optionalRecipe = recipeService.getByID(recipeID); - if (!optionalRecipe.isPresent()) { + if (optionalRecipe.isEmpty()) { return modelResponseBuilder .withView("") .build(); @@ -78,77 +66,13 @@ public class OthersController { Optional optionalMix = mixService.getByID(mixID); boolean mixExist = optionalMix.isPresent(); - List associatedMixTypes = recipeService.getAssociatedMixesTypes(optionalRecipe.get()); - // Récupère seulement les produits qui ne sont pas des types de mélange OU que ce type existe dans la recette - List materials = materialService - .getAll() - .stream() - .filter(m -> !m.isMixType() || (!mixExist || !m.equals(optionalMix.get().getMixType().getMaterial())) && associatedMixTypes.contains(mixTypeService.getByMaterial(m).get())) - .sorted(Comparator.comparing(Material::getMaterialCode)) - .sorted(Comparator.comparing(m -> m.getMaterialType().getMaterialTypeName())) - .collect(Collectors.toList()); + Collection materials = mixExist ? mixService.getAvailableMaterialsForMix(optionalRecipe.get(), optionalMix.get()) : mixService.getAvailableMaterialsForNewMix(optionalRecipe.get()); return modelResponseBuilder .addAttribute(MATERIALS, materials) .build(); } - @GetMapping(TOUCHUP) - public ModelAndView getTouchUpPdf() { - return new ModelResponseBuilder().withRedirect("pdf/touchup.pdf").build(); - } - - @GetMapping(RECIPE_XLS) - public ResponseEntity getXlsForRecipe(HttpServletRequest request, @PathVariable int recipeID) { - HttpHeaders headers = new HttpHeaders(); - - Optional optionalRecipe = recipeService.getByID(recipeID); - if (!optionalRecipe.isPresent()) { - headers.add(HttpHeaders.LOCATION, request.getHeader("referer")); - return new ResponseEntity<>(headers, HttpStatus.FOUND); - } - - byte[] recipeXLS = new XlsxExporter().generate(optionalRecipe.get()); - if (recipeXLS.length <= 0) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); - - return ResponseEntity.ok() - .headers(headers) - .contentLength(recipeXLS.length) - .contentType(MediaType.parseMediaType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")) - .body(recipeXLS); - } - - @GetMapping(value = ALL_RECIPES_XLS, produces = "application/zip") - public ResponseEntity getAllXls() throws IOException { - HttpHeaders headers = new HttpHeaders(); - - ColorRecipesExplorerApplication.LOGGER.info("Exportation de toutes les couleurs en XLS"); - - ByteArrayOutputStream byteOS = new ByteArrayOutputStream(); - ZipOutputStream out = new ZipOutputStream(byteOS); - - Collection recipes = recipeService.getAll(); - for (Recipe recipe : recipes) { - byte[] recipeXLS = new XlsxExporter().generate(recipe); - if (recipeXLS.length <= 0) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); - - out.putNextEntry(new ZipEntry(String.format("%s_%s.xlsx", recipe.getCompany().getCompanyName(), recipe.getRecipeCode()))); - out.write(recipeXLS, 0, recipeXLS.length); - out.closeEntry(); - } - - out.close(); - - byte[] zipContent = byteOS.toByteArray(); - byteOS.close(); - - return ResponseEntity.ok() - .headers(headers) - .contentLength(zipContent.length) - .contentType(MediaType.parseMediaType("application/zip")) - .body(zipContent); - } - @GetMapping(value = UPDATES) public ModelAndView showUpdates() { return new ModelResponseBuilder(UPDATES).build(); @@ -156,7 +80,7 @@ public class OthersController { @GetMapping(value = UPDATES_GET, produces = MediaType.TEXT_HTML_VALUE) @ResponseBody - public ResponseEntity getUpdates() throws IOException { + public ResponseEntity getUpdates() { String fileContent = FileUtils.readClasspathFile(resourceLoader, "classpath:updates.md"); if (fileContent == null) return ResponseEntity.status(HttpStatus.NOT_FOUND).build(); diff --git a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/RecipeExplorerController.java b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/RecipeExplorerController.java index 5902c18..7f13b81 100644 --- a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/RecipeExplorerController.java +++ b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/RecipeExplorerController.java @@ -16,7 +16,7 @@ import org.springframework.web.servlet.ModelAndView; import java.util.*; -import static dev.fyloz.trial.colorrecipesexplorer.web.PagesPaths.*; +import static dev.fyloz.trial.colorrecipesexplorer.web.WebsitePaths.*; @Controller public class RecipeExplorerController { @@ -44,11 +44,11 @@ public class RecipeExplorerController { * @return La page à afficher. */ @GetMapping(EXPLORER_RECIPE_SPECIFIC) - public ModelAndView showRecipe(@PathVariable int recipeID) { + public ModelAndView getPage(@PathVariable int recipeID) { ModelResponseBuilder modelResponseBuilder = new ModelResponseBuilder(EXPLORER_RECIPE); Optional optionalRecipe = recipeService.getByID(recipeID); - if (!optionalRecipe.isPresent()) { + if (optionalRecipe.isEmpty()) { return modelResponseBuilder .withView(INDEX) .addResponseCode(ResponseCode.RECIPE_NOT_FOUND, recipeID) @@ -78,7 +78,7 @@ public class RecipeExplorerController { String note = form.get("note").toString(); Optional optionalRecipe = recipeService.getByID(recipeID); - if (!optionalRecipe.isPresent()) { + if (optionalRecipe.isEmpty()) { responseBuilder.addResponseCode(ResponseCode.RECIPE_NOT_FOUND, recipeID); } else { Recipe recipe = optionalRecipe.get(); @@ -91,7 +91,7 @@ public class RecipeExplorerController { int mixID = Integer.parseInt(mixIDStr); Optional optionalMix = mixService.getByID(mixID); - if (!optionalMix.isPresent()) { + if (optionalMix.isEmpty()) { responseBuilder.addResponseCode(ResponseCode.MIX_NOT_FOUND, mixID); } else { Mix mix = optionalMix.get(); diff --git a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/creators/CompanyCreatorController.java b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/creators/CompanyCreatorController.java index 15a29ca..73351ea 100644 --- a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/creators/CompanyCreatorController.java +++ b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/creators/CompanyCreatorController.java @@ -16,8 +16,8 @@ import org.springframework.web.servlet.ModelAndView; import javax.validation.Valid; import java.util.Optional; -import static dev.fyloz.trial.colorrecipesexplorer.web.PagesPaths.CREATOR_COMPANY; -import static dev.fyloz.trial.colorrecipesexplorer.web.PagesPaths.INDEX; +import static dev.fyloz.trial.colorrecipesexplorer.web.WebsitePaths.CREATOR_COMPANY; +import static dev.fyloz.trial.colorrecipesexplorer.web.WebsitePaths.INDEX; @Controller public class CompanyCreatorController { @@ -33,7 +33,7 @@ public class CompanyCreatorController { public ModelAndView showCreationPage(ModelAndView model, Company company) { return new ModelResponseBuilder(model) .withView(CREATOR_COMPANY) - .addResponseData(ResponseDataType.COMPANY, company) + .addResponseData(ResponseDataType.COMPANY, company == null ? new Company() : company) .build(); } @@ -62,9 +62,9 @@ public class CompanyCreatorController { Optional savedCompany = companyService.save(company); if (savedCompany.isPresent()) { - return modelResponseBuilder - .addResponseData(ResponseDataType.COMPANY_NAME, savedCompany.get().getCompanyName()) - .build(); + return showCreationPage(modelResponseBuilder + .addResponseCode(ResponseCode.SUCCESS_SAVING_COMPANY, savedCompany.get().getCompanyName()) + .build(), null); } else { modelResponseBuilder.addResponseCode(ResponseCode.ERROR_SAVING); } diff --git a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/creators/MaterialCreatorController.java b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/creators/MaterialCreatorController.java index 556ed6d..58edc21 100644 --- a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/creators/MaterialCreatorController.java +++ b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/creators/MaterialCreatorController.java @@ -17,7 +17,7 @@ import org.springframework.web.servlet.ModelAndView; import javax.validation.Valid; import java.util.Optional; -import static dev.fyloz.trial.colorrecipesexplorer.web.PagesPaths.CREATOR_MATERIAL; +import static dev.fyloz.trial.colorrecipesexplorer.web.WebsitePaths.CREATOR_MATERIAL; @Controller public class MaterialCreatorController { @@ -68,7 +68,7 @@ public class MaterialCreatorController { if (savedMaterial.isPresent()) { material = savedMaterial.get(); - modelResponseBuilder.addResponseData(ResponseDataType.MATERIAL_CODE, material.getMaterialCode()); + modelResponseBuilder.addResponseCode(ResponseCode.SUCCESS_SAVING_MATERIAL, material.getMaterialCode()); if (simdut.getSize() > 0 && !materialService.addSimdut(simdut, material)) { modelResponseBuilder.addResponseCode(ResponseCode.ERROR_SAVING_SIMDUT); diff --git a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/creators/MaterialTypeCreatorController.java b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/creators/MaterialTypeCreatorController.java index 3ffa255..cf43e65 100644 --- a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/creators/MaterialTypeCreatorController.java +++ b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/creators/MaterialTypeCreatorController.java @@ -13,9 +13,10 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.servlet.ModelAndView; import javax.validation.Valid; +import java.util.Optional; -import static dev.fyloz.trial.colorrecipesexplorer.web.PagesPaths.CREATOR_MATERIAL_TYPE; -import static dev.fyloz.trial.colorrecipesexplorer.web.PagesPaths.INDEX; +import static dev.fyloz.trial.colorrecipesexplorer.web.WebsitePaths.CREATOR_MATERIAL_TYPE; +import static dev.fyloz.trial.colorrecipesexplorer.web.WebsitePaths.INDEX; @Controller public class MaterialTypeCreatorController { @@ -28,7 +29,7 @@ public class MaterialTypeCreatorController { } @GetMapping(CREATOR_MATERIAL_TYPE) - public ModelAndView showPage(ModelAndView model, MaterialType materialType) { + public ModelAndView getPage(ModelAndView model, MaterialType materialType) { return new ModelResponseBuilder(model) .withView(CREATOR_MATERIAL_TYPE) .addResponseData(ResponseDataType.MATERIAL_TYPE, materialType == null ? new MaterialType() : materialType) @@ -40,8 +41,11 @@ public class MaterialTypeCreatorController { ModelResponseBuilder modelResponseBuilder = new ModelResponseBuilder(ControllerUtils.redirect(INDEX)); if (materialTypeService.isValidForCreation(materialType)) { - if (materialTypeService.save(materialType) != null) { - return modelResponseBuilder.build(); + Optional optionalMaterialType = materialTypeService.save(materialType); + if (optionalMaterialType.isPresent()) { + return getPage(modelResponseBuilder + .addResponseCode(ResponseCode.SUCCESS_SAVING_MATERIAL_TYPE, optionalMaterialType.get().getMaterialTypeName()) + .build(), null); } else { modelResponseBuilder.addResponseCode(ResponseCode.ERROR_SAVING); } @@ -49,6 +53,6 @@ public class MaterialTypeCreatorController { modelResponseBuilder.addResponseCode(ResponseCode.MATERIAL_TYPE_ALREADY_EXIST, materialType.getMaterialTypeName()); } - return showPage(modelResponseBuilder.build(), materialType); + return getPage(modelResponseBuilder.build(), materialType); } } diff --git a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/creators/MixCreatorController.java b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/creators/MixCreatorController.java index b62498a..061e2e2 100644 --- a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/creators/MixCreatorController.java +++ b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/creators/MixCreatorController.java @@ -3,8 +3,6 @@ package dev.fyloz.trial.colorrecipesexplorer.web.controller.creators; import dev.fyloz.trial.colorrecipesexplorer.core.io.response.ModelResponseBuilder; import dev.fyloz.trial.colorrecipesexplorer.core.io.response.ResponseCode; import dev.fyloz.trial.colorrecipesexplorer.core.io.response.ResponseDataType; -import dev.fyloz.trial.colorrecipesexplorer.core.model.Material; -import dev.fyloz.trial.colorrecipesexplorer.core.model.MixType; import dev.fyloz.trial.colorrecipesexplorer.core.model.Recipe; import dev.fyloz.trial.colorrecipesexplorer.core.model.dto.MixCreationFormDto; import dev.fyloz.trial.colorrecipesexplorer.core.services.model.*; @@ -19,12 +17,9 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.servlet.ModelAndView; import javax.validation.Valid; -import java.util.Comparator; -import java.util.List; import java.util.Optional; -import java.util.stream.Collectors; -import static dev.fyloz.trial.colorrecipesexplorer.web.PagesPaths.*; +import static dev.fyloz.trial.colorrecipesexplorer.web.WebsitePaths.*; @Controller public class MixCreatorController { @@ -58,7 +53,7 @@ public class MixCreatorController { .withView(CREATOR_MIX); Optional optionalRecipe = recipeService.getByID(recipeID); - if (!optionalRecipe.isPresent()) { + if (optionalRecipe.isEmpty()) { return modelResponseBuilder .withView(ControllerUtils.redirect(EDITOR_RECIPE)) .build(); @@ -66,20 +61,10 @@ public class MixCreatorController { Recipe recipe = optionalRecipe.get(); - List associatedMixTypes = recipeService.getAssociatedMixesTypes(recipe); - // Récupère seulement les produits qui ne sont pas des types de mélange OU que ce type existe dans la recette - List materials = materialService - .getAll() - .stream() - .filter(m -> !m.isMixType() || associatedMixTypes.contains(mixTypeService.getByMaterial(m).get())) - .sorted(Comparator.comparing(Material::getMaterialCode)) - .sorted(Comparator.comparing(m -> m.getMaterialType().getMaterialTypeName())) - .collect(Collectors.toList()); - ModelResponseBuilder responseBuilder = modelResponseBuilder .addResponseData(ResponseDataType.RECIPE, recipe) .addResponseData(ResponseDataType.MATERIAL_TYPES, materialTypeService.getAll()) - .addAttribute("materialsJson", materialService.asJson(materials)); + .addAttribute("materialsJson", materialService.asJson(mixService.getAvailableMaterialsForNewMix(recipe))); if (materialService.getAll().isEmpty()) { responseBuilder.addResponseCode(ResponseCode.NO_MATERIAL) diff --git a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/creators/RecipeCreatorController.java b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/creators/RecipeCreatorController.java index 750a237..6ac4184 100644 --- a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/creators/RecipeCreatorController.java +++ b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/creators/RecipeCreatorController.java @@ -15,8 +15,8 @@ import org.springframework.web.servlet.ModelAndView; import javax.validation.Valid; import java.util.Optional; -import static dev.fyloz.trial.colorrecipesexplorer.web.PagesPaths.CREATOR_RECIPE; -import static dev.fyloz.trial.colorrecipesexplorer.web.PagesPaths.CREATOR_RECIPE_SUCCESS; +import static dev.fyloz.trial.colorrecipesexplorer.web.WebsitePaths.CREATOR_RECIPE; +import static dev.fyloz.trial.colorrecipesexplorer.web.WebsitePaths.EDITOR_RECIPE_SPECIFIC; @Controller public class RecipeCreatorController { @@ -62,12 +62,12 @@ public class RecipeCreatorController { */ @PostMapping(value = CREATOR_RECIPE) public ModelAndView createRecipe(@Valid Recipe recipe) { - ModelResponseBuilder modelResponseBuilder = new ModelResponseBuilder(CREATOR_RECIPE_SUCCESS); + ModelResponseBuilder modelResponseBuilder = new ModelResponseBuilder(); Optional savedRecipe = recipeService.save(recipe); if (savedRecipe.isPresent()) { return modelResponseBuilder - .addResponseData(ResponseDataType.RECIPE, savedRecipe.get()) + .withRedirect(EDITOR_RECIPE_SPECIFIC, savedRecipe.get().getRecipeID()) .build(); } modelResponseBuilder.addResponseCode(ResponseCode.ERROR_SAVING); diff --git a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/editors/MaterialEditorController.java b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/editors/MaterialEditorController.java index 17ca51f..cc0d8d5 100644 --- a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/editors/MaterialEditorController.java +++ b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/editors/MaterialEditorController.java @@ -19,7 +19,7 @@ import org.springframework.web.servlet.ModelAndView; import java.util.Optional; import java.util.stream.Collectors; -import static dev.fyloz.trial.colorrecipesexplorer.web.PagesPaths.*; +import static dev.fyloz.trial.colorrecipesexplorer.web.WebsitePaths.*; @Controller public class MaterialEditorController { @@ -58,7 +58,7 @@ public class MaterialEditorController { if (material.getMaterialCode() == null) { Optional optionalMaterial = materialService.getByID(materialID); - if (!optionalMaterial.isPresent()) { + if (optionalMaterial.isEmpty()) { return listMaterials( responseBuilder .addResponseCode(ResponseCode.MATERIAL_NOT_FOUND, materialID) @@ -110,7 +110,8 @@ public class MaterialEditorController { } else { Optional updatedMaterial = materialService.update(material); if (updatedMaterial.isPresent()) { - responseBuilder.addResponseData(ResponseDataType.MATERIAL_CODE, updatedMaterial.get().getMaterialCode()); + responseBuilder.addResponseCode(ResponseCode.SUCCESS_SAVING_MATERIAL, updatedMaterial.get().getMaterialCode()); +// responseBuilder.addResponseData(ResponseDataType.MATERIAL_CODE, updatedMaterial.get().getMaterialCode()); } else { return showEditPage( responseBuilder @@ -159,7 +160,7 @@ public class MaterialEditorController { ModelResponseBuilder modelResponseBuilder = new ModelResponseBuilder(ControllerUtils.redirect("material/editor/" + materialID)); Optional optionalMaterial = materialService.getByID(materialID); - if (!optionalMaterial.isPresent()) { + if (optionalMaterial.isEmpty()) { return chooseSIMDUTFile(modelResponseBuilder .addResponseCode(ResponseCode.MATERIAL_NOT_FOUND, materialID) .build(), diff --git a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/editors/MaterialTypeEditorController.java b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/editors/MaterialTypeEditorController.java index 60e572d..7de1750 100644 --- a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/editors/MaterialTypeEditorController.java +++ b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/editors/MaterialTypeEditorController.java @@ -15,7 +15,7 @@ import org.springframework.web.servlet.ModelAndView; import java.util.Optional; -import static dev.fyloz.trial.colorrecipesexplorer.web.PagesPaths.*; +import static dev.fyloz.trial.colorrecipesexplorer.web.WebsitePaths.*; @Controller public class MaterialTypeEditorController { @@ -43,7 +43,7 @@ public class MaterialTypeEditorController { if (materialType.getMaterialTypeName() == null) { Optional optionalMaterialType = materialTypeService.getByID(materialTypeID); - if (!optionalMaterialType.isPresent()) { + if (optionalMaterialType.isEmpty()) { return listMaterialTypes( responseBuilder .addResponseCode(ResponseCode.MATERIAL_TYPE_NOT_FOUND, materialTypeID) @@ -62,32 +62,38 @@ public class MaterialTypeEditorController { @PostMapping(value = EDITOR_MATERIAL_TYPE, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) public ModelAndView saveEditedMaterialType(MaterialType materialType) { ModelResponseBuilder responseBuilder = new ModelResponseBuilder(""); - int materialTypeID = materialType.getMaterialTypeID(); - if (!materialTypeService.getByID(materialTypeID).isPresent()) { - responseBuilder.addResponseCode(ResponseCode.MATERIAL_TYPE_NOT_FOUND, materialTypeID); - } else if (!materialTypeService.isValidForUpdateName(materialType)) { - return showEditPage( - responseBuilder - .addResponseCode(ResponseCode.MATERIAL_TYPE_ALREADY_EXIST, materialType.getMaterialTypeName()) - .build(), - materialTypeID, materialType); - } else if (!materialTypeService.isValidForUpdatePrefix(materialType)) { - return showEditPage( - responseBuilder - .addResponseCode(ResponseCode.MATERIAL_TYPE_ALREADY_EXIST_PREFIX, materialType.getPrefix()) - .build(), - materialTypeID, materialType); + // L'ID est 0 lors de la désérialisation, il faut utiliser le nom unique + String materialTypeName = materialType.getMaterialTypeName(); + Optional optionalMaterialType = materialTypeService.getByName(materialTypeName); + + if (optionalMaterialType.isEmpty()) { + responseBuilder.addResponseCode(ResponseCode.MATERIAL_TYPE_NOT_FOUND, materialTypeName); } else { - Optional updatedMaterialType = materialTypeService.update(materialType); - if (updatedMaterialType.isPresent()) { - responseBuilder.addResponseData(ResponseDataType.MATERIAL_TYPE_NAME, updatedMaterialType.get().getMaterialTypeName()); - } else { + materialType = optionalMaterialType.get(); + if (!materialTypeService.isValidForUpdateName(materialType)) { return showEditPage( responseBuilder - .addResponseCode(ResponseCode.ERROR_SAVING) + .addResponseCode(ResponseCode.MATERIAL_TYPE_ALREADY_EXIST, materialType.getMaterialTypeName()) .build(), - materialTypeID, null); + materialType.getMaterialTypeID(), materialType); + } else if (!materialTypeService.isValidForUpdatePrefix(materialType)) { + return showEditPage( + responseBuilder + .addResponseCode(ResponseCode.MATERIAL_TYPE_ALREADY_EXIST_PREFIX, materialType.getPrefix()) + .build(), + materialType.getMaterialTypeID(), materialType); + } else { + Optional updatedMaterialType = materialTypeService.update(materialType); + if (updatedMaterialType.isPresent()) { + responseBuilder.addResponseCode(ResponseCode.SUCCESS_SAVING_MATERIAL_TYPE, updatedMaterialType.get().getMaterialTypeName()); + } else { + return showEditPage( + responseBuilder + .addResponseCode(ResponseCode.ERROR_SAVING) + .build(), + materialType.getMaterialTypeID(), materialType); + } } } diff --git a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/editors/MixEditorController.java b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/editors/MixEditorController.java index ce347a2..cfdd9d5 100644 --- a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/editors/MixEditorController.java +++ b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/editors/MixEditorController.java @@ -3,9 +3,7 @@ package dev.fyloz.trial.colorrecipesexplorer.web.controller.editors; import dev.fyloz.trial.colorrecipesexplorer.core.io.response.ModelResponseBuilder; import dev.fyloz.trial.colorrecipesexplorer.core.io.response.ResponseCode; import dev.fyloz.trial.colorrecipesexplorer.core.io.response.ResponseDataType; -import dev.fyloz.trial.colorrecipesexplorer.core.model.Material; import dev.fyloz.trial.colorrecipesexplorer.core.model.Mix; -import dev.fyloz.trial.colorrecipesexplorer.core.model.MixType; import dev.fyloz.trial.colorrecipesexplorer.core.model.dto.MixCreationFormDto; import dev.fyloz.trial.colorrecipesexplorer.core.services.model.*; import dev.fyloz.trial.colorrecipesexplorer.core.utils.ControllerUtils; @@ -19,13 +17,10 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.servlet.ModelAndView; import javax.validation.Valid; -import java.util.Comparator; -import java.util.List; import java.util.Optional; -import java.util.stream.Collectors; -import static dev.fyloz.trial.colorrecipesexplorer.web.PagesPaths.*; import static dev.fyloz.trial.colorrecipesexplorer.web.StringBank.*; +import static dev.fyloz.trial.colorrecipesexplorer.web.WebsitePaths.*; @Controller public class MixEditorController { @@ -54,27 +49,18 @@ public class MixEditorController { * @return La page à afficher. */ @GetMapping(EDITOR_MIX_SPECIFIC) - public ModelAndView showPage(ModelAndView model, @PathVariable int mixID) { + public ModelAndView getPage(ModelAndView model, @PathVariable int mixID) { ModelResponseBuilder modelResponseBuilder = new ModelResponseBuilder(model) .withView(EDITOR_MIX_SPECIFIC.replaceAll("/\\{" + MIX_ID + "}", "")); Optional optionalMix = mixService.getByID(mixID); - if (!optionalMix.isPresent()) { + if (optionalMix.isEmpty()) { return modelResponseBuilder .withView(ControllerUtils.redirect(EDITOR_RECIPE)) .build(); } Mix mix = optionalMix.get(); - List associatedMixTypes = recipeService.getAssociatedMixesTypes(mix.getRecipe()); - // Récupère seulement les produits qui ne sont pas des types de mélange OU que ce type existe dans la recette - List materials = materialService - .getAll() - .stream() - .filter(m -> !m.isMixType() || (!m.equals(mix.getMixType().getMaterial()) && associatedMixTypes.contains(mixTypeService.getByMaterial(m).get()))) - .sorted(Comparator.comparing(Material::getMaterialCode)) - .sorted(Comparator.comparing(m -> m.getMaterialType().getMaterialTypeName())) - .collect(Collectors.toList()); return modelResponseBuilder .addResponseData(ResponseDataType.MIX, mix) @@ -82,7 +68,7 @@ public class MixEditorController { .addAttribute(MATERIAL_TYPE, mix.getMixType().getMaterial().getMaterialType()) .addAttribute(MATERIAL_TYPES, materialTypeService.getAll()) .addAttribute("mixJson", materialService.asJson(mix)) - .addAttribute("materialsJson", materialService.asJson(materials)) + .addAttribute("materialsJson", mixService.asJson(mixService.getAvailableMaterialsForMix(mix.getRecipe(), mix))) .build(); } @@ -108,10 +94,10 @@ public class MixEditorController { ModelResponseBuilder modelResponseBuilder = new ModelResponseBuilder(); Optional optionalMix = mixService.getByID(mixID); - if (!optionalMix.isPresent()) { + if (optionalMix.isEmpty()) { modelResponseBuilder.addResponseCode(ResponseCode.MIX_NOT_FOUND, mixID); - return showPage(modelResponseBuilder.build(), mixID); + return getPage(modelResponseBuilder.build(), mixID); } Mix mix = optionalMix.get(); @@ -119,7 +105,7 @@ public class MixEditorController { ModelResponseBuilder editResult = mixService.edit(mix, formDto); if (editResult != null) { - return showPage( + return getPage( modelResponseBuilder .addResponseCode(ResponseCode.ERROR_SAVING) .build(), @@ -134,8 +120,8 @@ public class MixEditorController { ModelResponseBuilder modelResponseBuilder = new ModelResponseBuilder(""); Optional optionalMix = mixService.getByID(mixID); - if (!optionalMix.isPresent()) { - return showPage(modelResponseBuilder + if (optionalMix.isEmpty()) { + return getPage(modelResponseBuilder .addResponseCode(ResponseCode.MIX_NOT_FOUND, mixID) .build(), mixID); @@ -147,7 +133,7 @@ public class MixEditorController { if (!mixService.deleteMix(mix)) { modelResponseBuilder.addResponseCode(ResponseCode.ERROR_SAVING); - return showPage(modelResponseBuilder.build(), mixID); + return getPage(modelResponseBuilder.build(), mixID); } return modelResponseBuilder.build(); diff --git a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/editors/RecipeEditorController.java b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/editors/RecipeEditorController.java index d26afc9..07ae314 100644 --- a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/editors/RecipeEditorController.java +++ b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/editors/RecipeEditorController.java @@ -20,7 +20,7 @@ import org.springframework.web.servlet.ModelAndView; import java.util.ArrayList; import java.util.Optional; -import static dev.fyloz.trial.colorrecipesexplorer.web.PagesPaths.*; +import static dev.fyloz.trial.colorrecipesexplorer.web.WebsitePaths.*; @Controller public class RecipeEditorController { @@ -59,7 +59,7 @@ public class RecipeEditorController { if (recipe.getRecipeCode() == null || recipe.getCompany() == null) { Optional optionalRecipe = recipeService.getByID(recipeID); - if (!optionalRecipe.isPresent()) { + if (optionalRecipe.isEmpty()) { return listRecipes( modelResponseBuilder .addResponseCode(ResponseCode.RECIPE_NOT_FOUND, recipeID) @@ -104,7 +104,7 @@ public class RecipeEditorController { int recipeID = recipe.getRecipeID(); Optional optionalStoredRecipe = recipeService.getByID(recipeID); - if (!optionalStoredRecipe.isPresent()) { + if (optionalStoredRecipe.isEmpty()) { return listRecipes( modelResponseBuilder .addResponseCode(ResponseCode.RECIPE_NOT_FOUND, recipeID) @@ -113,7 +113,7 @@ public class RecipeEditorController { Optional optionalRecipe = recipeService.updateRecipe(recipe, optionalStoredRecipe.get(), form); if (optionalRecipe.isPresent()) { - modelResponseBuilder.addResponseData(ResponseDataType.RECIPE_CODE, optionalRecipe.get().getRecipeCode()); + modelResponseBuilder.addResponseCode(ResponseCode.SUCCESS_SAVING_RECIPE, optionalRecipe.get().getRecipeCode()); return listRecipes(modelResponseBuilder.build()); } diff --git a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/ImageFilesController.java b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/files/ImageFilesController.java similarity index 93% rename from src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/ImageFilesController.java rename to src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/files/ImageFilesController.java index 9cef050..c6be16a 100644 --- a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/ImageFilesController.java +++ b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/files/ImageFilesController.java @@ -1,4 +1,4 @@ -package dev.fyloz.trial.colorrecipesexplorer.web.controller; +package dev.fyloz.trial.colorrecipesexplorer.web.controller.files; import dev.fyloz.trial.colorrecipesexplorer.ColorRecipesExplorerApplication; import dev.fyloz.trial.colorrecipesexplorer.core.io.file.ImageHandler; @@ -25,7 +25,7 @@ import java.io.IOException; import java.util.Map; import java.util.Optional; -import static dev.fyloz.trial.colorrecipesexplorer.web.PagesPaths.*; +import static dev.fyloz.trial.colorrecipesexplorer.web.WebsitePaths.*; @Controller public class ImageFilesController { @@ -67,7 +67,7 @@ public class ImageFilesController { * @return La page à afficher. */ @GetMapping(ADD_IMAGE_SPECIFIC) - public ModelAndView showPage(ModelAndView model, @PathVariable int recipeID) { + public ModelAndView getPage(ModelAndView model, @PathVariable int recipeID) { return new ModelResponseBuilder(model) .withView(ADD_IMAGE) .addResponseData(ResponseDataType.RECIPE_ID, recipeID) @@ -100,14 +100,14 @@ public class ImageFilesController { // Vérifie que le fichier est bien une image if (ImageIO.read(image.getInputStream()) == null) { - return showPage(modelResponseBuilder + return getPage(modelResponseBuilder .addResponseCode(ResponseCode.FILE_NOT_IMAGE) .build(), recipeID); } Optional optionalRecipe = recipeService.getByID(recipeID); - if (!optionalRecipe.isPresent()) { - return showPage(modelResponseBuilder + if (optionalRecipe.isEmpty()) { + return getPage(modelResponseBuilder .addResponseCode(ResponseCode.RECIPE_NOT_FOUND, recipeID) .build(), recipeID); } @@ -115,7 +115,7 @@ public class ImageFilesController { Recipe recipe = optionalRecipe.get(); ImageHandler imageHandler = new ImageHandler(recipe, recipeService); if (!imageHandler.createFile()) { - return showPage(modelResponseBuilder + return getPage(modelResponseBuilder .addResponseCode(ResponseCode.ERROR_SAVING_IMAGE) .build(), recipeID); } @@ -133,7 +133,7 @@ public class ImageFilesController { ColorRecipesExplorerApplication.LOGGER.error("Erreur inconnue lors de la création d'une image", e); modelResponseBuilder.addResponseCode(ResponseCode.ERROR_SAVING_IMAGE); - return showPage(modelResponseBuilder.build(), recipeID); + return getPage(modelResponseBuilder.build(), recipeID); } } diff --git a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/SIMDUTFilesController.java b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/files/SIMDUTFilesController.java similarity index 87% rename from src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/SIMDUTFilesController.java rename to src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/files/SIMDUTFilesController.java index 0c2f046..f458681 100644 --- a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/SIMDUTFilesController.java +++ b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/files/SIMDUTFilesController.java @@ -1,4 +1,4 @@ -package dev.fyloz.trial.colorrecipesexplorer.web.controller; +package dev.fyloz.trial.colorrecipesexplorer.web.controller.files; import dev.fyloz.trial.colorrecipesexplorer.core.io.file.FileHandler; import dev.fyloz.trial.colorrecipesexplorer.core.model.Material; @@ -16,8 +16,8 @@ import org.springframework.web.bind.annotation.PostMapping; import javax.servlet.http.HttpServletRequest; import java.util.Optional; -import static dev.fyloz.trial.colorrecipesexplorer.web.PagesPaths.CLOSE_TAB; -import static dev.fyloz.trial.colorrecipesexplorer.web.PagesPaths.SIMDUT_FILES; +import static dev.fyloz.trial.colorrecipesexplorer.web.WebsitePaths.CLOSE_TAB; +import static dev.fyloz.trial.colorrecipesexplorer.web.WebsitePaths.SIMDUT_FILES; @Controller public class SIMDUTFilesController { @@ -34,7 +34,7 @@ public class SIMDUTFilesController { Optional optionalMaterial = materialService.getByID(materialID); HttpHeaders headers = new HttpHeaders(); - if (!optionalMaterial.isPresent()) { + if (optionalMaterial.isEmpty()) { headers.add("Location", request.getHeader("referer")); return new ResponseEntity<>(headers, HttpStatus.FOUND); } @@ -53,7 +53,7 @@ public class SIMDUTFilesController { @PostMapping(SIMDUT_FILES) public ResponseEntity getFile(@PathVariable int materialID) { Optional optionalMaterial = materialService.getByID(materialID); - if (!optionalMaterial.isPresent()) return ResponseEntity.status(HttpStatus.BAD_REQUEST).build(); + if (optionalMaterial.isEmpty()) return ResponseEntity.status(HttpStatus.BAD_REQUEST).build(); FileHandler fileHandler = new FileHandler(String.format("%s_%s", materialID, optionalMaterial.get().getMaterialCode()), FileHandler.FileContext.SIMDUT, FileHandler.FileExtension.PDF); if (!fileHandler.isValid()) return ResponseEntity.status(HttpStatus.NOT_FOUND).build(); diff --git a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/files/TouchUpKitController.java b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/files/TouchUpKitController.java new file mode 100644 index 0000000..581dd90 --- /dev/null +++ b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/files/TouchUpKitController.java @@ -0,0 +1,53 @@ +package dev.fyloz.trial.colorrecipesexplorer.web.controller.files; + +import dev.fyloz.trial.colorrecipesexplorer.core.io.response.ModelResponseBuilder; +import dev.fyloz.trial.colorrecipesexplorer.core.io.response.ResponseDataType; +import dev.fyloz.trial.colorrecipesexplorer.core.services.model.RecipeService; +import dev.fyloz.trial.colorrecipesexplorer.core.services.model.TouchUpKitService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.servlet.ModelAndView; + +import java.io.IOException; + +import static dev.fyloz.trial.colorrecipesexplorer.web.WebsitePaths.*; + +@Controller +public class TouchUpKitController { + + private TouchUpKitService touchUpKitService; + private RecipeService recipeService; + + @Autowired + public TouchUpKitController(TouchUpKitService touchUpKitService, RecipeService recipeService) { + this.touchUpKitService = touchUpKitService; + this.recipeService = recipeService; + } + + @GetMapping(TOUCHUP) + public ModelAndView getPage(ModelAndView model) { + return new ModelResponseBuilder(model) + .withView(TOUCHUP) + .addResponseData(ResponseDataType.RECIPE_MAP, recipeService.getRecipesByCompany()) + .build(); + } + + @PostMapping(value = TOUCHUP_PDF, produces = MediaType.APPLICATION_PDF_VALUE) + public ResponseEntity getTouchUpKitPdf(@RequestBody String jobNumber) throws IOException { + return new ResponseEntity<>(touchUpKitService.getPdfForJobNumber(jobNumber.replace("jobNumber=", "")), HttpStatus.FOUND); + } + + @PostMapping(value = TOUCHUP_PTOUCH) + public ModelAndView getTouchUpKitPtouch(@RequestBody String jobNumber) { + return new ModelResponseBuilder(TOUCHUP_PTOUCH_PAGE) + .addAttribute("jobNumber", jobNumber.replace("jobNumber=", "")) + .build(); + } + +} diff --git a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/files/XlsExporterController.java b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/files/XlsExporterController.java new file mode 100644 index 0000000..dabe9c9 --- /dev/null +++ b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/files/XlsExporterController.java @@ -0,0 +1,89 @@ +package dev.fyloz.trial.colorrecipesexplorer.web.controller.files; + +import dev.fyloz.trial.colorrecipesexplorer.ColorRecipesExplorerApplication; +import dev.fyloz.trial.colorrecipesexplorer.core.model.Recipe; +import dev.fyloz.trial.colorrecipesexplorer.core.services.model.RecipeService; +import dev.fyloz.trial.colorrecipesexplorer.xlsx.XlsxExporter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; + +import javax.servlet.http.HttpServletRequest; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Collection; +import java.util.Optional; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +import static dev.fyloz.trial.colorrecipesexplorer.web.WebsitePaths.ALL_RECIPES_XLS; +import static dev.fyloz.trial.colorrecipesexplorer.web.WebsitePaths.RECIPE_XLS; + +// TODO Une grande partie du code de ce controlleur devrait se trouver dans un service +@Controller +public class XlsExporterController { + + private RecipeService recipeService; + + @Autowired + public XlsExporterController(RecipeService recipeService) { + this.recipeService = recipeService; + } + + @GetMapping(RECIPE_XLS) + public ResponseEntity getXlsForRecipe(HttpServletRequest request, @PathVariable int recipeID) { + HttpHeaders headers = new HttpHeaders(); + + Optional optionalRecipe = recipeService.getByID(recipeID); + if (optionalRecipe.isEmpty()) { + headers.add(HttpHeaders.LOCATION, request.getHeader("referer")); + return new ResponseEntity<>(headers, HttpStatus.FOUND); + } + + byte[] recipeXLS = new XlsxExporter().generate(optionalRecipe.get()); + if (recipeXLS.length <= 0) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); + + return ResponseEntity.ok() + .headers(headers) + .contentLength(recipeXLS.length) + .contentType(MediaType.parseMediaType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")) + .body(recipeXLS); + } + + @GetMapping(value = ALL_RECIPES_XLS, produces = "application/zip") + public ResponseEntity getAllXls() throws IOException { + HttpHeaders headers = new HttpHeaders(); + + ColorRecipesExplorerApplication.LOGGER.info("Exportation de toutes les couleurs en XLS"); + + ByteArrayOutputStream byteOS = new ByteArrayOutputStream(); + ZipOutputStream out = new ZipOutputStream(byteOS); + + Collection recipes = recipeService.getAll(); + for (Recipe recipe : recipes) { + byte[] recipeXLS = new XlsxExporter().generate(recipe); + if (recipeXLS.length <= 0) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); + + out.putNextEntry(new ZipEntry(String.format("%s_%s.xlsx", recipe.getCompany().getCompanyName(), recipe.getRecipeCode()))); + out.write(recipeXLS, 0, recipeXLS.length); + out.closeEntry(); + } + + out.close(); + + byte[] zipContent = byteOS.toByteArray(); + byteOS.close(); + + return ResponseEntity.ok() + .headers(headers) + .contentLength(zipContent.length) + .contentType(MediaType.parseMediaType("application/zip")) + .body(zipContent); + } + +} diff --git a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/removers/CompanyRemoverController.java b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/removers/CompanyRemoverController.java index 09bef80..e8f01ba 100644 --- a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/removers/CompanyRemoverController.java +++ b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/removers/CompanyRemoverController.java @@ -14,8 +14,8 @@ import org.springframework.web.servlet.ModelAndView; import java.util.Optional; -import static dev.fyloz.trial.colorrecipesexplorer.web.PagesPaths.REMOVER_COMPANY; -import static dev.fyloz.trial.colorrecipesexplorer.web.PagesPaths.REMOVER_COMPANY_SPECIFIC; +import static dev.fyloz.trial.colorrecipesexplorer.web.WebsitePaths.REMOVER_COMPANY; +import static dev.fyloz.trial.colorrecipesexplorer.web.WebsitePaths.REMOVER_COMPANY_SPECIFIC; @Controller public class CompanyRemoverController { @@ -37,7 +37,7 @@ public class CompanyRemoverController { * @return La page à afficher */ @GetMapping(REMOVER_COMPANY) - public ModelAndView showPage(ModelAndView model) { + public ModelAndView getPage(ModelAndView model) { return new ModelResponseBuilder(model) .withView(REMOVER_COMPANY) .addResponseData(ResponseDataType.COMPANIES, companyService.getAll()) @@ -78,6 +78,6 @@ public class CompanyRemoverController { modelResponseBuilder.addResponseCode(ResponseCode.COMPANY_NOT_FOUND, companyID); } - return showPage(modelResponseBuilder.build()); + return getPage(modelResponseBuilder.build()); } } diff --git a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/removers/MaterialRemoverController.java b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/removers/MaterialRemoverController.java index 8e8f581..0541b0e 100644 --- a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/removers/MaterialRemoverController.java +++ b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/removers/MaterialRemoverController.java @@ -15,8 +15,8 @@ import org.springframework.web.servlet.ModelAndView; import java.util.Optional; import java.util.stream.Collectors; -import static dev.fyloz.trial.colorrecipesexplorer.web.PagesPaths.REMOVER_MATERIAL; -import static dev.fyloz.trial.colorrecipesexplorer.web.PagesPaths.REMOVER_MATERIAL_SPECIFIC; +import static dev.fyloz.trial.colorrecipesexplorer.web.WebsitePaths.REMOVER_MATERIAL; +import static dev.fyloz.trial.colorrecipesexplorer.web.WebsitePaths.REMOVER_MATERIAL_SPECIFIC; @Controller public class MaterialRemoverController { @@ -35,7 +35,7 @@ public class MaterialRemoverController { * @return La page à afficher. */ @GetMapping(REMOVER_MATERIAL) - public ModelAndView showPage(ModelAndView model) { + public ModelAndView getPage(ModelAndView model) { return new ModelResponseBuilder(model) .withView(REMOVER_MATERIAL) .addResponseData(ResponseDataType.MATERIALS, materialService.getAll().stream().filter(m -> !m.isMixType()).collect(Collectors.toList())) @@ -65,13 +65,13 @@ public class MaterialRemoverController { ModelResponseBuilder responseBuilder = new ModelResponseBuilder(""); Optional optionalMaterial = materialService.getByID(materialID); - if (!optionalMaterial.isPresent()) { + if (optionalMaterial.isEmpty()) { responseBuilder.addResponseCode(ResponseCode.MATERIAL_NOT_FOUND, materialID); } else { Material material = optionalMaterial.get(); if (materialService.deleteIfNotLinked(material)) { - responseBuilder.addResponseData(ResponseDataType.MATERIAL_CODE, material.getMaterialCode()); + responseBuilder.addResponseCode(ResponseCode.SUCCESS_DELETING_MATERIAL, material.getMaterialCode()); if (!materialService.removeSimdut(material)) { responseBuilder.addResponseCode(ResponseCode.ERROR_SAVING_SIMDUT); @@ -81,6 +81,6 @@ public class MaterialRemoverController { } } - return showPage(responseBuilder.build()); + return getPage(responseBuilder.build()); } } diff --git a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/removers/MaterialTypeRemoverController.java b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/removers/MaterialTypeRemoverController.java index facf9eb..720bfbc 100644 --- a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/removers/MaterialTypeRemoverController.java +++ b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/removers/MaterialTypeRemoverController.java @@ -14,8 +14,8 @@ import org.springframework.web.servlet.ModelAndView; import java.util.Optional; -import static dev.fyloz.trial.colorrecipesexplorer.web.PagesPaths.REMOVER_MATERIAL_TYPE; -import static dev.fyloz.trial.colorrecipesexplorer.web.PagesPaths.REMOVER_MATERIAL_TYPE_SPECIFIC; +import static dev.fyloz.trial.colorrecipesexplorer.web.WebsitePaths.REMOVER_MATERIAL_TYPE; +import static dev.fyloz.trial.colorrecipesexplorer.web.WebsitePaths.REMOVER_MATERIAL_TYPE_SPECIFIC; @Controller public class MaterialTypeRemoverController { @@ -29,7 +29,7 @@ public class MaterialTypeRemoverController { } @GetMapping(REMOVER_MATERIAL_TYPE) - public ModelAndView showPage(ModelAndView model) { + public ModelAndView getPage(ModelAndView model) { return new ModelResponseBuilder(model) .withView(REMOVER_MATERIAL_TYPE) .addResponseData(ResponseDataType.MATERIAL_TYPES, materialTypeService.getAll()) @@ -41,18 +41,18 @@ public class MaterialTypeRemoverController { ModelResponseBuilder responseBuilder = new ModelResponseBuilder(""); Optional optionalMaterialType = materialTypeService.getByID(materialTypeID); - if (!optionalMaterialType.isPresent()) { + if (optionalMaterialType.isEmpty()) { responseBuilder.addResponseCode(ResponseCode.MATERIAL_TYPE_NOT_FOUND, materialTypeID); } else { MaterialType materialType = optionalMaterialType.get(); if (materialTypeService.deleteIfNotLinked(materialType)) { - responseBuilder.addResponseData(ResponseDataType.MATERIAL_TYPE_NAME, materialType.getMaterialTypeName()); + responseBuilder.addResponseCode(ResponseCode.SUCCESS_DELETING_MATERIAL_TYPE, materialType.getMaterialTypeName()); } else { responseBuilder.addResponseCode(ResponseCode.MATERIAL_TYPE_LINKED, materialType.getMaterialTypeName()); } } - return showPage(responseBuilder.build()); + return getPage(responseBuilder.build()); } } diff --git a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/removers/RecipeRemoverController.java b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/removers/RecipeRemoverController.java index 2bbc64c..91f020c 100644 --- a/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/removers/RecipeRemoverController.java +++ b/src/main/java/dev/fyloz/trial/colorrecipesexplorer/web/controller/removers/RecipeRemoverController.java @@ -13,8 +13,8 @@ import org.springframework.web.servlet.ModelAndView; import java.util.Optional; -import static dev.fyloz.trial.colorrecipesexplorer.web.PagesPaths.REMOVER_RECIPE; -import static dev.fyloz.trial.colorrecipesexplorer.web.PagesPaths.REMOVER_RECIPE_SPECIFIC; +import static dev.fyloz.trial.colorrecipesexplorer.web.WebsitePaths.REMOVER_RECIPE; +import static dev.fyloz.trial.colorrecipesexplorer.web.WebsitePaths.REMOVER_RECIPE_SPECIFIC; @Controller public class RecipeRemoverController { @@ -62,7 +62,7 @@ public class RecipeRemoverController { ModelResponseBuilder modelResponseBuilder = new ModelResponseBuilder(""); Optional optionalRecipe = recipeService.getByID(recipeID); - if (!optionalRecipe.isPresent()) { + if (optionalRecipe.isEmpty()) { return listRecipes( modelResponseBuilder .addResponseCode(ResponseCode.RECIPE_NOT_FOUND, recipeID) @@ -77,7 +77,7 @@ public class RecipeRemoverController { .build()); } - modelResponseBuilder.addResponseData(ResponseDataType.RECIPE_CODE, recipe.getRecipeCode()); + modelResponseBuilder.addResponseCode(ResponseCode.SUCCESS_DELETING_RECIPE, recipe.getRecipeCode()); return listRecipes(modelResponseBuilder.build()); } } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 05c2ad6..f7385a0 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -24,6 +24,8 @@ spring: web-allow-others: true server: port: 9090 + http2: + enabled: true error: whitelabel: enabled: false diff --git a/src/main/resources/fonts/arialbd.ttf b/src/main/resources/fonts/arialbd.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d0d857e2d29cea7e0c9e10311e4aca71150a9dd7 GIT binary patch literal 352224 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/lang/messages_en.properties b/src/main/resources/lang/messages_en.properties index 5aa7c36..7e6c412 100644 --- a/src/main/resources/lang/messages_en.properties +++ b/src/main/resources/lang/messages_en.properties @@ -1,105 +1,118 @@ -company.form.companyName=Banner name -menu.explore=Explore -menu.add=Add -menu.edit=Edit -menu.delete=Delete -menu.inventory=Inventory -menu.others=Others -recipe.color=Color -recipe.description=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=Material type -material.simdutFile=SIMDUT File -units.milliliters=Milliliters -units.liters=Liters -units.gallons=Gallons -inventory.lowQuantity=Low quantity -inventory.hideOthers=Hide other materials -inventory.showOnly=Show only -material.error.anyFound=No materials 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. -keyword.see=See -company.error.anyFound=No banners were found. -recipe.warning.notApproved=This recipe is not approved +company.add.title=Add a banner company.delete.title=Delete banners +company.error.anyFound=No banners were found. +company.form.companyName=Banner name +company.success.created=The banner {0} has been saved. company.success.deleted=The banner {0} has been deleted. -keyword.delete=Delete -material.add.title=Adding a material -material.success.created=The material {0} has been saved. -material.editing.title=Editing {0} -material.delete.title=Delete materials -material.success.deleted=The material {0} has been deleted. -material.success.saved=The material {0} has been saved. -material.edit.title=Edit materials -material.simdut.choose=Choose material's SIMDUT file -materialType.add.title=Add a material type -materialType.name=Name -materialType.prefix=Prefix -keyword.characters=characters -materialType.usePercents=Use percentages -image.add.title=Add an image -mix.add.title=Adding a banner -mix.add.subtitle=Adding a mix for the recipe {0} -mix.mixType=Mix type -keyword.remove=Remove -mix.edit.title=Editing a mix -mix.edit.subtitle=Editing a mix for the recipe {0} ({1}) -password.ask=What is your password? -password.notValid=Your password is not valid error.serverError=An error occurred while sending data to the server. -recipe.add.title=Add a recipe -recipe.sucess.saved=The recipe {0} has been saved. You can now add ingredients. -keyword.continue=Continue -recipe.editing.title=Editing {0} -recipe.edit.addMix=Add a mix -recipe.edit.addImage=Add an image -recipe.success.edit=The recipe {0} has been saved. -recipe.edit.title=Edit a recipe -recipe.explore.title={0} color -recipe.warning.notApproved.short=Not approved -recipe.image.corrupted=Image deleted or corrupted -recipe.delete.title=Delete recipes -recipe.success.deleted=The recipe {0} has been deleted. -keyword.search=Search -materialType.editor.title=Edit material types -materialType.editing.title=Editing {0} -keyword.id=ID -materialType.success.saved=The material type {0} has been saved. -materialType.delete.title=Delete material types -materialType.success.deleted=The material type {0} has been deleted. -materialType.error.anyFound=Any material type has been found. -keyword.calculation=Calculation -recipe.error.anyFound=No recipes were found. -recipe.exportAllXLS=Export all colors (XLSX) -recipe.xlsVersion=XLSX version -keyword.updates=Updates history -material.simdutFile.notFound=No SIMDUT file found -recipe.warning.changesNotSaved=Changes are not saved -recipe.warning.exportAll=Do you really want to export all the colors? This can take some times and slow down the application. -warning.noResult=Nothing corresponding the the research was found +footer.lang=Voir en français +image.add.title=Add an image inventory.askUseMix=Do you really want to deduct this mix from the inventory? inventory.askUseRecipe=Do you really want to deduct this recipe from the inventory? +inventory.hideOthers=Hide other materials +inventory.lowQuantity=Low quantity +inventory.showOnly=Show only +keyword.back=Back +keyword.calculation=Calculation +keyword.cancel=Cancel +keyword.characters=characters +keyword.company=Banner +keyword.continue=Continue +keyword.delete=Delete +keyword.edit=Edit +keyword.id=ID keyword.images=Images -warning.askChangePage=Are you sure you want to continue? Unsaved changes will be lost. +keyword.material=Material +keyword.pdf=PDF keyword.print=Print +keyword.ptouch=P-touch +keyword.ptouchTemplate=P-touch templates +keyword.quantity=Quantity +keyword.recipe=Recipe +keyword.remove=Remove +keyword.save=Save +keyword.search=Search +keyword.see=See +keyword.type=Type +keyword.units=Units +keyword.updates=Updates history +keyword.use=Use +material.add.title=Add a material +material.code=Code +material.delete.title=Delete materials +material.edit.title=Edit materials +material.editing.title=Editing {0} +material.error.anyFound=No materials were found. +material.inventoryQuantity=Inventory quantity +material.simdut.choose=Choose material's SIMDUT file +material.simdut.error.notFound=No SIMDUT file found +material.simdut=SIMDUT File +material.success.created=The material {0} has been saved. +material.success.deleted=The material {0} has been deleted. +material.success.saved=The material {0} has been saved. +material.type=Material type +materialType.add.title=Add a material type +materialType.delete.title=Delete material types +materialType.editing.title=Editing {0} +materialType.editor.title=Edit material types +materialType.error.anyFound=Any material type has been found. +materialType.name=Name +materialType.prefix=Prefix +materialType.success.deleted=The material type {0} has been deleted. +materialType.success.saved=The material type {0} has been saved. +materialType.usePercents=Use percentages +menu.add=Add +menu.delete=Delete +menu.edit=Edit +menu.explore=Explore +menu.inventory=Inventory +menu.others=Others +mix.add.subtitle=Add a mix for the recipe {0} +mix.add.title=Add a banner +mix.edit.subtitle=Editing a mix for the recipe {0} ({1}) +mix.edit.title=Editing a mix +mix.location=Location +mix.mixType=Mix type +password.ask=What is your password? +password.notValid=Your password is not valid +recipe.add.title=Add a recipe +recipe.approbationDate=Approbation date +recipe.color=Color +recipe.delete.title=Delete recipes +recipe.description=Description +recipe.edit.addImage=Add an image +recipe.edit.addMix=Add a mix +recipe.edit.title=Edit a recipe +recipe.editing.title=Editing {0} +recipe.error.anyFound=No recipes were found. +recipe.explore.title={0} color +recipe.exportAllXLS=Export all colors (XLSX) +recipe.image.corrupted=Image deleted or corrupted +recipe.notice=Notice +recipe.print.confirm=Are you sure you want to print this mix? +recipe.print.error.bpacNotInstalled=BPac is not installed +recipe.print.error.noBase=There is no base in this mix +recipe.print.error=An error occurred while printing +recipe.print.printing=Printing in progress. This may take a few seconds. +recipe.print.status.error=The b-Pac extension is not installed +recipe.print.status.ok=The b-Pac extension is installed +recipe.remark=Remark +recipe.sample=Sample +recipe.steps=Steps +recipe.success.deleted=The recipe {0} has been deleted. +recipe.success.edit=The recipe {0} has been saved. +recipe.sucess.saved=The recipe {0} has been saved. You can now add ingredients. +recipe.touchup.title=Touch-up kit labels +recipe.touchup=Touch-up kit labels +recipe.warning.changesNotSaved=Changes are not saved +recipe.warning.exportAll=Do you really want to export all the colors? This can take some times and slow down the application. +recipe.warning.notApproved.short=Not approved +recipe.warning.notApproved=This recipe is not approved +recipe.xlsVersion=XLSX version +units.gallons=Gallons +units.liters=Liters +units.milliliters=Milliliters +warning.askChangePage=Are you sure you want to continue? Unsaved changes will be lost. +warning.noResult=Search returned no results +keyword.jobNumber=Job number diff --git a/src/main/resources/lang/messages_fr.properties b/src/main/resources/lang/messages_fr.properties index 57f87e0..48680ef 100644 --- a/src/main/resources/lang/messages_fr.properties +++ b/src/main/resources/lang/messages_fr.properties @@ -1,106 +1,118 @@ -menu.explore=Explorer -menu.add=Ajouter -menu.edit=Modifier -menu.delete=Supprimer -menu.inventory=Inventaire -menu.others=Autres -recipe.color=Couleur -recipe.description=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 -keyword.delete=Supprimer -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 -material.error.anyFound=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 -keyword.see=Voir -company.error.anyFound=Aucune bannière n'a été trouvée. -recipe.warning.notApproved=Cette recette n'est pas approuvée company.delete.title=Supprimer des bannières +company.error.anyFound=Aucune bannière n'a été trouvée. +company.form.companyName=Nom de la bannière +company.success.created=La bannière {0} à été enregistrée. company.success.deleted=La bannière {0} a bien été supprimée. -material.add.title=Ajout d'un produit -material.success.created=Le produit {0} a été enregistré. -material.editing.title=Modification de {0} -material.delete.title=Supprimer des produits -material.success.deleted=Le produit {0} a bien été supprimée. -material.success.saved=Le produit {0} a bien été sauvegardé. -material.edit.title=Modifer des produits -material.simdut.choose=Choisissez le fichier SIMDUT du produit -materialType.add.title=Ajout d'un type de produit -materialType.name=Nom -materialType.prefix=Préfix -keyword.characters=caractères -materialType.usePercents=Utiliser les pourcentages -image.add.title=Ajout une image -mix.add.title=Ajout d'un mélange -mix.add.subtitle=Ajout d''un mélange pour la recette {0} -mix.mixType=Type de mélange -keyword.remove=Retirer -mix.edit.title=Modifier un mélange -mix.edit.subtitle=Modifier un mélange pour la recette {0} ({1}) -password.ask=Quel est votre mot de passe? -password.notValid=Votre mot de passe n'est pas valide error.serverError=Une erreur est survenue lors de l'envoie des informations vers le serveur. -recipe.add.title=Ajout d'une recette -recipe.sucess.saved=La recette {0} à été enregistrée. Vous pouvez maintenant ajouter les ingrédients. -keyword.continue=Continuer -recipe.editing.title=Modification de {0} -recipe.edit.addMix=Ajouter un mélange -recipe.edit.addImage=Ajouter une image -recipe.success.edit=La recette {0} a bien été sauvegardée. -recipe.edit.title=Modifier une recette -recipe.explore.title=Couleur {0} -recipe.warning.notApproved.short=Non approuvée -recipe.image.corrupted=Image supprimée ou corrompue -recipe.delete.title=Supprimer des recettes -recipe.success.deleted=La recette {0} a bien été supprimée. -keyword.search=Rechercher -materialType.editor.title=Modifier un type de produit -materialType.editing.title=Modification de {0} -keyword.id=Identifiant -materialType.success.saved=Le type de produit {0} a bien été sauvegardé. -materialType.delete.title=Supprimer des types de produit -materialType.success.deleted=Le type de produit {0} a bien été supprimé. -materialType.error.anyFound=Aucun type de produit n'a été trouvé. -keyword.calculation=Calcul -recipe.error.anyFound=Aucune recette n'a été trouvée. -recipe.exportAllXLS=Exporter toutes les couleurs (XLSX) -recipe.xlsVersion=Version XLSX -keyword.updates=Historique des mises à jour -material.simdutFile.notFound=Aucun fichier SIMDUT trouvé -recipe.warning.changesNotSaved=Des modifications ne sont pas sauvegardées -recipe.warning.exportAll=Voulez-vous vraiment exporter toutes les couleurs? Cela peut prendre un certain temps et ralentir l'application. -warning.noResult=Rien correspondant à la recherche n'a été trouvé +footer.lang=See in english +image.add.title=Ajout une image inventory.askUseMix=Êtes-vous certain de vouloir déduire ce mélange de l'inventaire? inventory.askUseRecipe=Êtes-vous certain de vouloir déduire cette recette de l'inventaire? +inventory.hideOthers=Cacher les autres produits +inventory.lowQuantity=Quantité faible +inventory.showOnly=Voir seulement +keyword.back=Retour +keyword.calculation=Calcul +keyword.cancel=Annuler +keyword.characters=caractères +keyword.company=Bannière +keyword.continue=Continuer +keyword.delete=Supprimer +keyword.edit=Modifier +keyword.id=Identifiant keyword.images=Images -warning.askChangePage=Êtes-vous sûr de vouloir continuer? Les modifications non enregistrées seront perdues. +keyword.material=Produit +keyword.pdf=PDF keyword.print=Imprimer - +keyword.ptouch=P-touch +keyword.ptouchTemplate=Modèles P-touch +keyword.quantity=Quantité +keyword.recipe=Recette +keyword.remove=Retirer +keyword.save=Enregistrer +keyword.search=Rechercher +keyword.see=Voir +keyword.type=Type +keyword.units=Unités +keyword.updates=Historique des mises à jour +keyword.use=Utiliser +material.add.title=Ajout d'un produit +material.code=Code +material.delete.title=Supprimer des produits +material.edit.title=Modifer des produits +material.editing.title=Modification de {0} +material.error.anyFound=Aucun produit n'a été trouvé. +material.inventoryQuantity=Quantité en inventaire +material.simdut.choose=Choisissez le fichier SIMDUT du produit +material.simdut.error.notFound=Aucun fichier SIMDUT trouvé +material.simdut=Fichier SIMDUT +material.success.created=Le produit {0} a été enregistré. +material.success.deleted=Le produit {0} a bien été supprimée. +material.success.saved=Le produit {0} a bien été sauvegardé. +material.type=Type de produit +materialType.add.title=Ajout d'un type de produit +materialType.delete.title=Supprimer des types de produit +materialType.editing.title=Modification de {0} +materialType.editor.title=Modifier un type de produit +materialType.error.anyFound=Aucun type de produit n'a été trouvé. +materialType.name=Nom +materialType.prefix=Préfix +materialType.success.deleted=Le type de produit {0} a bien été supprimé. +materialType.success.saved=Le type de produit {0} a bien été sauvegardé. +materialType.usePercents=Utiliser les pourcentages +menu.add=Ajouter +menu.delete=Supprimer +menu.edit=Modifier +menu.explore=Explorer +menu.inventory=Inventaire +menu.others=Autres +mix.add.subtitle=Ajout d''un mélange pour la recette {0} +mix.add.title=Ajout d'un mélange +mix.edit.subtitle=Modifier un mélange pour la recette {0} ({1}) +mix.edit.title=Modifier un mélange +mix.location=Position +mix.mixType=Type de mélange +password.ask=Quel est votre mot de passe? +password.notValid=Votre mot de passe n'est pas valide +recipe.add.title=Ajout d'une recette +recipe.approbationDate=Date d'approbation +recipe.color=Couleur +recipe.delete.title=Supprimer des recettes +recipe.description=Description +recipe.edit.addImage=Ajouter une image +recipe.edit.addMix=Ajouter un mélange +recipe.edit.title=Modifier une recette +recipe.editing.title=Modification de {0} +recipe.error.anyFound=Aucune recette n'a été trouvée. +recipe.explore.title=Couleur {0} +recipe.exportAllXLS=Exporter toutes les couleurs (XLSX) +recipe.image.corrupted=Image supprimée ou corrompue +recipe.notice=Note +recipe.print.confirm=Voulez-vous vraiment imprimer ce mélange? +recipe.print.error.bpacNotInstalled=BPac n'est pas installé +recipe.print.error.noBase=Il n'y a pas de base dans ce mélange +recipe.print.error=Une erreur est survenue pendant l'impression +recipe.print.printing=Impression en cours. Cette opération peut prendre quelques secondes. +recipe.print.status.error=L'extension b-Pac n'est pas installée +recipe.print.status.ok=L'extension b-Pac est installée +recipe.remark=Remarque +recipe.sample=Échantillon +recipe.steps=Étapes +recipe.success.deleted=La recette {0} a bien été supprimée. +recipe.success.edit=La recette {0} a bien été sauvegardée. +recipe.sucess.saved=La recette {0} à été enregistrée. Vous pouvez maintenant ajouter les ingrédients. +recipe.touchup.title=Étiquettes de kit de retouche +recipe.touchup=Étiquettes de kit de retouche +recipe.warning.changesNotSaved=Des modifications ne sont pas sauvegardées +recipe.warning.exportAll=Voulez-vous vraiment exporter toutes les couleurs? Cela peut prendre un certain temps et ralentir l'application. +recipe.warning.notApproved.short=Non approuvée +recipe.warning.notApproved=Cette recette n'est pas approuvée +recipe.xlsVersion=Version XLSX +units.gallons=Gallons +units.liters=Litres +units.milliliters=Millilitres +warning.askChangePage=Êtes-vous sûr de vouloir continuer? Les modifications non enregistrées seront perdues. +warning.noResult=La recherche n'a donné aucun résultat +keyword.jobNumber=Numéro de job diff --git a/src/main/resources/lang/responses_en.properties b/src/main/resources/lang/responses_en.properties index a3188aa..41f63b1 100644 --- a/src/main/resources/lang/responses_en.properties +++ b/src/main/resources/lang/responses_en.properties @@ -1,22 +1,22 @@ -response.1=The quantities of each material used have been deducted from the inventory +response.1=The quantities of used materials have been deducted from the inventory response.10=There is already a material with the code {0} response.11=There is already a material type named {0} -response.12=Any banner with the ID {0} has been found +response.12=No banner with the ID {0} has been found response.13=There is already a banner named {0} response.14=The material {0} is linked to one or more recipes, edit them first response.15=The banner {0} is linked to one or more recipes, delete them first response.16=The mix with the ID {0} is not linked to the recipe with the ID {1} response.17=There is not enough {0} in inventory for this recipe response.18=This recipe already contains a mix of the type {0} -response.19=Any material type with the ID {0} has been found +response.19=No material type with the name {0} has been found response.2=The recipe's informations have been saved response.3=An error has occurred while saving response.4=An error has occurred while saving the image response.5=An error has occurred while saving the SIMDUT file response.6=Your password is not valid -response.7=Any recipe with the ID {0} has been found -response.8=Any mix with the ID {0} has been found -response.9=Any material with the ID {0} has been found +response.7=No recipe with the ID {0} has been found +response.8=No mix with the ID {0} has been found +response.9=No material with the ID {0} has been found response.20=There is already a material type with the prefix {0} response.21=The material type {0} is linked to one or more materials, delete them first. response.101=The requested page could not be found @@ -28,3 +28,10 @@ response.24=This file need to be an image response.25=The recipe was not found response.26=The material with the code {0} was not found response.27=The banner {0} has been delete +response.28=The material {0} has been saved +response.29=The material type {0} has been saved +response.30=The recipe for the color {0} has been saved +response.31=The material {0} has been deleted +response.32=The banner {0} has been saved +response.33=The recipe {0} has been deleted +response.34=The material type {0} has been deleted diff --git a/src/main/resources/lang/responses_fr.properties b/src/main/resources/lang/responses_fr.properties index dfa5e68..e0e061f 100644 --- a/src/main/resources/lang/responses_fr.properties +++ b/src/main/resources/lang/responses_fr.properties @@ -1,4 +1,4 @@ -response.1=Les quantités de chaque produits utilisés ont été déduites de l'inventaire +response.1=Les quantités des produits utilisés ont été déduites de l'inventaire response.10=Il y a déjà un produit ayant le code {0} response.11=Il y a déjà un type de produit s''appellant {0} response.12=Aucune bannière ayant l''identifiant {0} n''a été trouvée @@ -8,7 +8,7 @@ response.15=La bannière {0} est liée à une ou plusieurs recettes, veuillez le response.16=Le mélange ayant l''identifiant {0} n''est pas associé à la recette ayant l''identifiant {1} response.17=Il n''y a pas assez de {0} en inventaire pour cette recette response.18=Cette recette contient déjà un mélange du type {0} -response.19=Aucun type de produit ayant l''identifiant {0} n''a été trouvée +response.19=Aucun type de produit ayant le nom {0} n''a été trouvée response.2=Les informations de la recette ont été sauvegardées response.3=Une erreur est survenue lors de l''enregistrement response.4=Une erreur est survenue lors de l'enregistrement de l'image @@ -28,3 +28,10 @@ response.24=Ce fichier doit être une image response.25=La recette n'a pas été trouvée response.26=Le produit ayant le code {0} n''a pas été trouvé response.27=La bannière {0} a bien été supprimée +response.28=Le produit {0} a bien été sauvegardé +response.29=Le type de produit {0} a bien été sauvegardé +response.30=La recette pour la couleur {0} a bien été sauvegardée +response.31=Le produit {0} a bien été supprimée +response.32=La bannière {0} a bien été sauvegardée +response.33=La recette {0} a bien été supprimée +response.34=Le type de produit {0} a bien été supprimé diff --git a/src/main/resources/static/bpac.xpi b/src/main/resources/static/bpac.xpi new file mode 100644 index 0000000000000000000000000000000000000000..1941857590165d8df079cae510fda7a3aaa018cc GIT binary patch literal 18204 zcma*P19)Z4vOm0IV`4j*WWtGU+Y{TiZF{1LZQHh;iEZ0o-g~}tU;OVq&#j%#etNIn z)vK$!R#*MHYRgK1fT92(KVSbO_|FgcY;45zt*x{fS!ryni~-%?+)tsh(jsusSkRwW z;lxA*(pZ|XVKLvljf!gznDMEgd2c$s=008bHCdj8~;ya(LDXD&dJK%j$ z?b+4sL6#R$1R6*toc9u9b0k=kFIMmL^EYn^z?W3uXN{Ap$q(h?**vM^IK!OGTx(EJBi)|B=s(U{AY=l*X_Ox!bx#jtCuQWL}20OR7h)-Qu zB;Eth369h1a&T(xDXbG_bh*}8-A9wxG25eA_NW{bP$-j$r>vv|1`jY})3*)-Qc`kn z*SZ*PXlNkYgwk;Mo@~t6)wi5G$ryMKV$R*kxT6>A(-0B;td^UI+@8#pwj<=|Za1n|g!2IV< z6&D4MZR9vU1+#Fszl-{0O7n94I{LG>L;eKzT=?D_FmMA@px9#g4RXI?E&)hI^%L=# z_Q%yrB(BW;`s*US%*Q5m#YcNnco5SD&(wm4_A8oSwq6P0^--Pk>YBmg-YmDdPv+|K&jChMh70Pmo5NE;K#wQssj33epW|OOrjyvfZ)pp8VO#5CV z83~zr;Sg0zr*jS5en#Z4`wz9Q;WFK#Z&CqIuemTL=IfET!WP1Z`isdg#Tv2nSdSwQ zTq~NiSoc^(rgvQ3>h*`xHT z4WkhznV=syU`1!czbk;`{C;cWJsqJw;-RZ4o8-=n?&#na?zqt`agLs0VjNH0ui)?T zo}I6;`CZmM=My{EsVRDE(d6-D*R9GjpJy(U%EiKj7%A+GK2`c!LB+k1=86=b;>S`)I!80q7TDIn7~{+ppdWzn%M1MC

mxhMUZP!5`d-tM7OVILVX``p}9NMBB1 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 USONe5;qx{42}AJ+{89V=09fIfDgXcg literal 0 HcmV?d00001 diff --git a/src/main/resources/static/css/main.css b/src/main/resources/static/css/main.css index 3b6f84c..049e1a7 100644 --- a/src/main/resources/static/css/main.css +++ b/src/main/resources/static/css/main.css @@ -4,6 +4,10 @@ body { overflow-x: hidden; } +* { + transition: all .1s; +} + h1 { text-decoration: underline; } @@ -73,18 +77,6 @@ textarea { padding: 10px; } -/*.error {*/ -/* color: red;*/ -/*}*/ - -/*.success {*/ -/* color: green;*/ -/*}*/ - -/*.error, .success {*/ -/* font-weight: bold;*/ -/*}*/ - table { border-collapse: collapse; } @@ -129,49 +121,82 @@ table:not(.noStyle) tr:nth-child(odd) { width: 150px; } -.errorBox { - background-color: #ef9a9a; - color: #e53935; - font-weight: bold; -} - -.successBox { - background-color: #a5d6a7; - color: #4caf50; - font-weight: bold; -} - -.warningBox { - background-color: #fff59d; - color: #fdd835; - font-weight: bold; -} - .messageBox { - display: inline-block; - margin: 20px auto auto; + display: none; + position: fixed; + top: -20px; + left: 50%; + transform: translateX(-50%); } .messageBox .messageBoxContainer { display: inline-block; - height: 24px; padding: 16px; - text-align: left; } -.messageBox .messageBoxInnerBox { - display: inline-block; - height: 24px; +.messageBox .messageBoxMessageContainer { + display: flex; + flex-direction: row; + position: relative; + vertical-align: center; + align-items: center; + text-align: center; } .messageBox img { - float: left; + width: 24px; + height: 24px; } .messageBox p { - display: inline-block; - margin: 0 0 0 16px; - line-height: 24px; + font-weight: bold; + margin: 0 0 0 20px; + width: 100%; +} + +#errorBox { + background-color: #ef9a9a; + color: #e53935; +} + +#successBox { + background-color: #a5d6a7; + color: #4caf50; +} + +#warningBox { + background-color: #fff59d; + color: #fdd835; +} + +#confirmBox, #promptBox { + background-color: #90caf9; + color: #1e88e5; + height: 75px; + z-index: 60; +} + +#promptBox { + height: 110px; +} + +.confirmButtonsContainer button { + margin: 0 60px; +} + +.confirmButtonsContainer { + display: flex; + flex-direction: row; + margin: 5px 0; + justify-content: center; +} + +.confirmInputContainer input { + width: 90%; + background-color: white; + padding: 2px 0; + margin: 10px 5% 2px; + text-align: left !important; } .subtitle { @@ -205,3 +230,14 @@ table:not(.noStyle) tr:nth-child(odd) { .submitButton { float: right; } + +#filter { + display: none; + background-color: black; + width: 100%; + height: 100%; + position: fixed; + top: 0; + opacity: 0; + z-index: 50; +} diff --git a/src/main/resources/static/css/menu.css b/src/main/resources/static/css/menu.css index c330a6d..6845286 100644 --- a/src/main/resources/static/css/menu.css +++ b/src/main/resources/static/css/menu.css @@ -4,24 +4,46 @@ header, footer { text-align: center; width: 100%; color: white; + position: fixed; + z-index: 99; +} + +header { + top: 0; + display: flex; + background-color: black; +} + +header .spacer { + width: 100%; +} + +header a:hover, .dropdown:hover .dropbtn { + background-color: #0d0d0d; +} + +header .header-right { + display: flex; + flex-direction: row; +} + +header #printStatusIcon { + margin-right: 20px; +} + +nav { + display: flex; + flex-direction: row; } footer { - position: fixed; height: 5%; bottom: 0; padding-top: 10px; } -nav img { - margin-left: auto; -} - -nav { - display: flex; - flex-wrap: wrap; - overflow: visible; - background-color: inherit; +section { + margin-top: 100px; } nav a { @@ -50,10 +72,6 @@ nav a { margin: 0; } -nav a:hover, .dropdown:hover .dropbtn { - background-color: #0d0d0d; -} - .dropdown-content { display: none; position: absolute; @@ -81,7 +99,7 @@ nav a:hover, .dropdown:hover .dropbtn { } @media only screen and (max-width: 702px) { - nav img { + header img { display: none; } } diff --git a/src/main/resources/static/icons/confirm.svg b/src/main/resources/static/icons/confirm.svg new file mode 100644 index 0000000..4afca3c --- /dev/null +++ b/src/main/resources/static/icons/confirm.svg @@ -0,0 +1,7 @@ + + + + + diff --git a/src/main/resources/static/icons/error.svg b/src/main/resources/static/icons/error.svg index 3eaebfb..2047e73 100644 --- a/src/main/resources/static/icons/error.svg +++ b/src/main/resources/static/icons/error.svg @@ -2,5 +2,5 @@ + d="M12,2C17.53,2 22,6.47 22,12C22,17.53 17.53,22 12,22C6.47,22 2,17.53 2,12C2,6.47 6.47,2 12,2M15.59,7L12,10.59L8.41,7L7,8.41L10.59,12L7,15.59L8.41,17L12,13.41L15.59,17L17,15.59L13.41,12L17,8.41L15.59,7Z"/> diff --git a/src/main/resources/static/icons/printer.svg b/src/main/resources/static/icons/printer.svg new file mode 100644 index 0000000..438787e --- /dev/null +++ b/src/main/resources/static/icons/printer.svg @@ -0,0 +1,6 @@ + + + + + diff --git a/src/main/resources/static/icons/printerError.svg b/src/main/resources/static/icons/printerError.svg new file mode 100644 index 0000000..3d4c025 --- /dev/null +++ b/src/main/resources/static/icons/printerError.svg @@ -0,0 +1,6 @@ + + + + + diff --git a/src/main/resources/static/js/bpac.js b/src/main/resources/static/js/bpac.js new file mode 100644 index 0000000..8d2cbd7 --- /dev/null +++ b/src/main/resources/static/js/bpac.js @@ -0,0 +1,1182 @@ +var n = n || {}; +n.appendMessage = n => { + const t = new CustomEvent("bpac_send", {detail: n}); + document.dispatchEvent(t) +}; +const t = "Can't connect to b-PAC"; + +export class IObject { + constructor(n) { + this.p_ = n + } + + GetAttribute(i) { + const r = "IObject::GetAttribute", u = {method: r, p: this.p_, kind: i}, f = new Promise((n, i) => { + const u = f => { + document.removeEventListener(r, u), f.detail.connect == !1 ? i(t) : f.detail.ret == !1 ? n() : n(f.detail.attribute) + }; + document.addEventListener(r, u) + }); + return n.appendMessage(u), f + } + + GetData(i) { + const r = "IObject::GetData", u = {method: r, p: this.p_, kind: i}, f = new Promise((n, i) => { + const u = f => { + document.removeEventListener(r, u), f.detail.connect == !1 ? i(t) : f.detail.ret == !1 ? n() : n(f.detail.data) + }; + document.addEventListener(r, u) + }); + return n.appendMessage(u), f + } + + GetFontBold() { + const i = "IObject::GetFontBold", r = {method: i, p: this.p_}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.connect == !1 ? r(t) : n(f.detail.ret) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + GetFontEffect() { + const i = "IObject::GetFontEffect", r = {method: i, p: this.p_}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.effect) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + GetFontItalics() { + const i = "IObject::GetFontItalics", r = {method: i, p: this.p_}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.connect == !1 ? r(t) : n(f.detail.ret) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + GetFontMaxPoint() { + const i = "IObject::GetFontMaxPoint", r = {method: i, p: this.p_}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.point) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + GetFontName() { + const i = "IObject::GetFontName", r = {method: i, p: this.p_}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.name) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + GetFontStrikeout() { + const i = "IObject::GetFontStrikeout", r = {method: i, p: this.p_}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.connect == !1 ? r(t) : n(f.detail.ret) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + GetFontUnderline() { + const i = "IObject::GetFontUnderline", r = {method: i, p: this.p_}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.connect == !1 ? r(t) : n(f.detail.ret) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + SetAlign(i, r) { + const u = "IObject::SetAlign", f = {method: u, p: this.p_, horizontal: i, vertical: r}, + e = new Promise((n, i) => { + const r = f => { + document.removeEventListener(u, r), f.detail.connect == !1 ? i(t) : n(f.detail.ret) + }; + document.addEventListener(u, r) + }); + return n.appendMessage(f), e + } + + SetAttribute(i, r) { + const u = "IObject::SetAttribute", f = {method: u, p: this.p_, kind: i, attribute: r}, + e = new Promise((n, i) => { + const r = f => { + document.removeEventListener(u, r), f.detail.connect == !1 ? i(t) : n(f.detail.ret) + }; + document.addEventListener(u, r) + }); + return n.appendMessage(f), e + } + + SetData(i, r, u) { + let e; + const o = Object.prototype.toString.call(r).slice(8, -1); + e = o === "Date" ? r.getTime() / 1e3 : r; + const f = "IObject::SetData", s = {method: f, p: this.p_, kind: i, data: e, param: u}, + h = new Promise((n, i) => { + const r = u => { + document.removeEventListener(f, r), u.detail.connect == !1 ? i(t) : n(u.detail.ret) + }; + document.addEventListener(f, r) + }); + return n.appendMessage(s), h + } + + SetFontBold(i) { + const r = "IObject::SetFontBold", u = {method: r, p: this.p_, bold: i}, f = new Promise((n, i) => { + const u = f => { + document.removeEventListener(r, u), f.detail.connect == !1 ? i(t) : n(f.detail.ret) + }; + document.addEventListener(r, u) + }); + return n.appendMessage(u), f + } + + SetFontEffect(i) { + const r = "IObject::SetFontEffect", u = {method: r, p: this.p_, effect: i}, f = new Promise((n, i) => { + const u = f => { + document.removeEventListener(r, u), f.detail.connect == !1 ? i(t) : n(f.detail.ret) + }; + document.addEventListener(r, u) + }); + return n.appendMessage(u), f + } + + SetFontItalics(i) { + const r = "IObject::SetFontItalics", u = {method: r, p: this.p_, italics: i}, f = new Promise((n, i) => { + const u = f => { + document.removeEventListener(r, u), f.detail.connect == !1 ? i(t) : n(f.detail.ret) + }; + document.addEventListener(r, u) + }); + return n.appendMessage(u), f + } + + SetFontMaxPoint(i) { + const r = "IObject::SetFontMaxPoint", u = {method: r, p: this.p_, point: i}, f = new Promise((n, i) => { + const u = f => { + document.removeEventListener(r, u), f.detail.connect == !1 ? i(t) : n(f.detail.ret) + }; + document.addEventListener(r, u) + }); + return n.appendMessage(u), f + } + + SetFontName(i) { + const r = "IObject::SetFontName", u = {method: r, p: this.p_, name: i}, f = new Promise((n, i) => { + const u = f => { + document.removeEventListener(r, u), f.detail.connect == !1 ? i(t) : n(f.detail.ret) + }; + document.addEventListener(r, u) + }); + return n.appendMessage(u), f + } + + SetFontStrikeout(i) { + const r = "IObject::SetFontStrikeout", u = {method: r, p: this.p_, strikeout: i}, f = new Promise((n, i) => { + const u = f => { + document.removeEventListener(r, u), f.detail.connect == !1 ? i(t) : n(f.detail.ret) + }; + document.addEventListener(r, u) + }); + return n.appendMessage(u), f + } + + SetFontUnderline(i) { + const r = "IObject::SetFontUnderline", u = {method: r, p: this.p_, underline: i}, f = new Promise((n, i) => { + const u = f => { + document.removeEventListener(r, u), f.detail.connect == !1 ? i(t) : n(f.detail.ret) + }; + document.addEventListener(r, u) + }); + return n.appendMessage(u), f + } + + SetPosition(i, r, u, f) { + const e = "IObject::SetPosition", o = {method: e, p: this.p_, x: i, y: r, width: u, height: f}, + s = new Promise((n, i) => { + const r = u => { + document.removeEventListener(e, r), u.detail.connect == !1 ? i(t) : n(u.detail.ret) + }; + document.addEventListener(e, r) + }); + return n.appendMessage(o), s + } + + SetSelection(i, r) { + const u = "IObject::SetPosition", f = {method: u, p: this.p_, start: i, end: r}, e = new Promise((n, i) => { + const r = f => { + document.removeEventListener(u, r), f.detail.connect == !1 ? i(t) : n(f.detail.ret) + }; + document.addEventListener(u, r) + }); + return n.appendMessage(f), e + } + + get Height() { + const i = "IObject::GetHeight", r = {method: i, p: this.p_}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.height) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + set Height(t) { + const i = {method: "IObject::SetHeight", p: this.p_, height: t}; + n.appendMessage(i) + } + + get HorizontalAlign() { + const i = "IObject::GetHorizontalAlign", r = {method: i, p: this.p_}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.align) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + set HorizontalAlign(t) { + const i = {method: "IObject::SetHorizontalAlign", p: this.p_, align: t}; + n.appendMessage(i) + } + + get Name() { + const i = "IObject::GetName", r = {method: i, p: this.p_}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.name) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + set Name(t) { + const i = {method: "IObject::SetName", p: this.p_, name: t}; + n.appendMessage(i) + } + + get Orientation() { + const i = "IObject::GetOrientation", r = {method: i, p: this.p_}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.orientation) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + set Orientation(t) { + const i = {method: "IObject::SetOrientation", p: this.p_, orientation: t}; + n.appendMessage(i) + } + + get SelectionEnd() { + const i = "IObject::GetSelectionEnd", r = {method: i, p: this.p_}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.selection) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + set SelectionEnd(t) { + const i = {method: "IObject::SetSelectionEnd", p: this.p_, selection: t}; + n.appendMessage(i) + } + + get SelectionStart() { + const i = "IObject::GetSelectionStart", r = {method: i, p: this.p_}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.selection) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + set SelectionStart(t) { + const i = {method: "IObject::SetSelectionStart", p: this.p_, selection: t}; + n.appendMessage(i) + } + + get Text() { + const i = "IObject::GetText", r = {method: i, p: this.p_}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.text) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + set Text(t) { + const i = {method: "IObject::SetText", p: this.p_, text: t}; + n.appendMessage(i) + } + + get Type() { + const i = "IObject::GetType", r = {method: i, p: this.p_}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.type) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + get VerticalAlign() { + const i = "IObject::GetVerticalAlign", r = {method: i, p: this.p_}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.align) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + set VerticalAlign(t) { + const i = {method: "IObject::SetVerticalAlign", p: this.p_, align: t}; + n.appendMessage(i) + } + + get Width() { + const i = "IObject::GetWidth", r = {method: i, p: this.p_}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.width) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + set Width(t) { + const i = {method: "IObject::SetWidth", p: this.p_, width: t}; + n.appendMessage(i) + } + + get X() { + const i = "IObject::GetX", r = {method: i, p: this.p_}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.X) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + set X(t) { + const i = {method: "IObject::SetX", p: this.p_, X: t}; + n.appendMessage(i) + } + + get Y() { + const i = "IObject::GetY", r = {method: i, p: this.p_}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.Y) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + set Y(t) { + const i = {method: "IObject::SetY", p: this.p_, Y: t}; + n.appendMessage(i) + } +} + +export class IObjects { + constructor(n) { + this.p_ = n + } + + GetItem(i) { + const r = "IObjects::GetItem", u = {method: r, p: this.p_, index: i}, f = new Promise((n, i) => { + const u = f => { + if (document.removeEventListener(r, u), f.detail.connect == !1) i(t); else if (f.detail.ret == !1) n(); else if (f.detail.p >= 0) { + const t = new IObject(f.detail.p); + n(t) + } else i() + }; + document.addEventListener(r, u) + }); + return n.appendMessage(u), f + } + + GetCount() { + const i = "IObjects::GetCount", r = {method: i, p: this.p_}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.count) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + GetIndex(i) { + const r = "IObjects::GetIndex", u = {method: r, p: this.p_, obj: i.p_}, f = new Promise((n, i) => { + const u = f => { + document.removeEventListener(r, u), f.detail.connect == !1 ? i(t) : f.detail.ret == !1 ? n() : n(f.detail.index) + }; + document.addEventListener(r, u) + }); + return n.appendMessage(u), f + } + + GetIndexByName(i, r) { + const u = "IObjects::GetIndexByName", f = {method: u, p: this.p_, name: i, indexBgn: r}, + e = new Promise((n, i) => { + const r = f => { + document.removeEventListener(u, r), f.detail.connect == !1 ? i(t) : f.detail.ret == !1 ? n() : n(f.detail.index) + }; + document.addEventListener(u, r) + }); + return n.appendMessage(f), e + } + + Insert(i, r, u, f, e, o, s) { + const h = "IObjects::Insert", + c = {method: h, p: this.p_, index: i, type: r, X: u, Y: f, width: e, height: o, option: s}, + l = new Promise((n, i) => { + const r = u => { + if (document.removeEventListener(h, r), u.detail.connect == !1) i(t); else if (u.detail.ret == !1) n(); else if (u.detail.p >= 0) { + const t = new IObject(u.detail.p); + n(t) + } else i() + }; + document.addEventListener(h, r) + }); + return n.appendMessage(c), l + } + + Remove(i) { + const r = "IObjects::Remove", u = {method: r, p: this.p_, index: i}, f = new Promise((n, i) => { + const u = f => { + document.removeEventListener(r, u), f.detail.connect == !1 ? i(t) : n(f.detail.ret) + }; + document.addEventListener(r, u) + }); + return n.appendMessage(u), f + } + + get Count() { + return this.GetCount() + } +} + +export class IPrinter { + constructor(n) { + this.p_ = n + } + + GetInstalledPrinters() { + const i = "IPrinter::GetInstalledPrinters", r = {method: i, p: this.p_}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.printers) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + GetMediaId() { + const i = "IPrinter::GetMediaId", r = {method: i, p: this.p_}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.id) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + GetMediaName() { + const i = "IPrinter::GetMediaName", r = {method: i, p: this.p_}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.name) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + GetPrintedTapeLength() { + const i = "IPrinter::GetPrintedTapeLength", r = {method: i, p: this.p_}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.length) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + GetSupportedMediaIds() { + const i = "IPrinter::GetSupportedMediaIds", r = {method: i, p: this.p_}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.mediaIds) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + GetSupportedMediaNames() { + const i = "IPrinter::GetSupportedMediaNames", r = {method: i, p: this.p_}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.mediaNames) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + IsMediaIdSupported(i) { + const r = "IPrinter::IsMediaIdSupported", u = {method: r, p: this.p_, id: i}, f = new Promise((n, i) => { + const u = f => { + document.removeEventListener(r, u), f.detail.connect == !1 ? i(t) : n(f.detail.ret) + }; + document.addEventListener(r, u) + }); + return n.appendMessage(u), f + } + + IsMediaNameSupported(i) { + const r = "IPrinter::IsMediaNameSupported", u = {method: r, p: this.p_, name: i}, f = new Promise((n, i) => { + const u = f => { + document.removeEventListener(r, u), f.detail.connect == !1 ? i(t) : n(f.detail.ret) + }; + document.addEventListener(r, u) + }); + return n.appendMessage(u), f + } + + IsPrinterOnline(i) { + const r = "IPrinter::IsPrinterOnline", u = {method: r, p: this.p_, name: i}, f = new Promise((n, i) => { + const u = f => { + document.removeEventListener(r, u), f.detail.connect == !1 ? i(t) : n(f.detail.ret) + }; + document.addEventListener(r, u) + }); + return n.appendMessage(u), f + } + + IsPrinterSupported(i) { + const r = "IPrinter::IsPrinterSupported", u = {method: r, p: this.p_, name: i}, f = new Promise((n, i) => { + const u = f => { + document.removeEventListener(r, u), f.detail.connect == !1 ? i(t) : n(f.detail.ret) + }; + document.addEventListener(r, u) + }); + return n.appendMessage(u), f + } + + get ErrorCode() { + const i = "IPrinter::GetErrorCode", r = {method: i, p: this.p_}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.errorCode) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + get ErrorString() { + const i = "IPrinter::GetErrorString", r = {method: i, p: this.p_}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.errorString) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + get Name() { + const i = "IPrinter::GetName", r = {method: i, p: this.p_}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.name) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + get PortName() { + const i = "IPrinter::GetPortName", r = {method: i, p: this.p_}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.port) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } +} + +export class IDocument { + static get Width() { + return IDocument.GetWidth() + } + + static get Length() { + return IDocument.GetLength() + } + + static set Length(n) { + IDocument.SetLength(n) + } + + static get CurrentSheet() { + return IDocument.GetCurrentSheet() + } + + static set CurrentSheet(n) { + IDocument.SetCurrentSheet(n) + } + + static get CutLineCount() { + return IDocument.GetCutLineCount() + } + + static get CutLines() { + return IDocument.GetCutLines() + } + + static get ErrorCode() { + return IDocument.GetErrorCode() + } + + static get MarginBottom() { + return IDocument.GetMarginBottom() + } + + static set MarginBottom(n) { + return IDocument.SetMarginBottom(n) + } + + static get MarginLeft() { + return IDocument.GetMarginLeft() + } + + static set MarginLeft(n) { + return IDocument.SetMarginLeft(n) + } + + static get MarginRight() { + return IDocument.GetMarginRight() + } + + static set MarginRight(n) { + return IDocument.SetMarginRight(n) + } + + static get MarginTop() { + return IDocument.GetMarginTop() + } + + static set MarginTop(n) { + return IDocument.SetMarginTop(n) + } + + static get Objects() { + return IDocument.GetObjects() + } + + static get Orientation() { + return IDocument.GetOrientation() + } + + static get Printer() { + return IDocument.GetPrinter() + } + + static get SheetNames() { + return IDocument.GetSheetNames() + } + + static Open(i) { + const r = "IDocument::Open", u = {method: r, filePath: i}, f = new Promise((n, i) => { + const u = f => { + document.removeEventListener(r, u), f.detail.connect == !1 ? i(t) : n(f.detail.ret) + }; + document.addEventListener(r, u) + }); + return n.appendMessage(u), f + } + + static DoPrint(i, r) { + const u = "IDocument::DoPrint", f = {method: u, dwOption: i, szOption: r}, e = new Promise((n, i) => { + const r = f => { + document.removeEventListener(u, r), f.detail.connect == !1 ? i(t) : n(f.detail.ret) + }; + document.addEventListener(u, r) + }); + return n.appendMessage(f), e + } + + static StartPrint(i, r) { + const u = "IDocument::StartPrint", f = {method: u, docName: i, option: r}, e = new Promise((n, i) => { + const r = f => { + document.removeEventListener(u, r), f.detail.connect == !1 ? i(t) : n(f.detail.ret) + }; + document.addEventListener(u, r) + }); + return n.appendMessage(f), e + } + + static PrintOut(i, r) { + const u = "IDocument::PrintOut", f = {method: u, copyCount: i, option: r}, e = new Promise((n, i) => { + const r = f => { + document.removeEventListener(u, r), f.detail.connect == !1 ? i(t) : n(f.detail.ret) + }; + document.addEventListener(u, r) + }); + return n.appendMessage(f), e + } + + static EndPrint() { + const i = "IDocument::EndPrint", r = {method: i}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.connect == !1 ? r(t) : n(f.detail.ret) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + static GetImageData(i, r, u) { + const f = "IDocument::GetImageData", e = {method: f, type: i, width: r, height: u}, o = new Promise((n, i) => { + const r = u => { + document.removeEventListener(f, r), u.detail.ret == !0 && u.detail.connect == !0 ? n(u.detail.image) : i(t) + }; + document.addEventListener(f, r) + }); + return n.appendMessage(e), o + } + + static GetObjectsCount() { + const i = "IDocument::GetObjectsCount", r = {method: i}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !0 && f.detail.connect == !0 ? n(f.detail.count) : r(t) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + static GetIndexByName(i, r) { + const u = "IDocument::GetIndexByName", f = {method: u, name: i, indexBgn: r}, e = new Promise((n, i) => { + const r = f => { + document.removeEventListener(u, r), f.detail.connect == !1 ? i(t) : f.detail.ret == !0 ? n(f.detail.index) : n() + }; + document.addEventListener(u, r) + }); + return n.appendMessage(f), e + } + + static GetObject(i) { + const r = "IDocument::GetObject", u = {method: r, name: i}, f = new Promise((n, i) => { + const u = f => { + if (document.removeEventListener(r, u), f.detail.connect == !1) i(t); else if (f.detail.ret == !1) n(); else if (f.detail.p >= 0) { + const t = new IObject(f.detail.p); + n(t) + } else i() + }; + document.addEventListener(r, u) + }); + return n.appendMessage(u), f + } + + static GetObjects(i) { + const r = "IDocument::GetObjects", u = {method: r, name: i}, f = new Promise((n, i) => { + const u = f => { + if (document.removeEventListener(r, u), f.detail.ret == !1 || f.detail.connect == !1) i(t); else if (f.detail.p >= 0) { + const t = new IObjects(f.detail.p); + n(t) + } else i() + }; + document.addEventListener(r, u) + }); + return n.appendMessage(u), f + } + + static GetBarcodeIndex(i) { + const r = "IDocument::GetBarcodeIndex", u = {method: r, name: i}, f = new Promise((n, i) => { + const u = f => { + document.removeEventListener(r, u), f.detail.connect == !1 ? i(t) : f.detail.ret == !1 ? n() : n(f.detail.index) + }; + document.addEventListener(r, u) + }); + return n.appendMessage(u), f + } + + static GetMediaId() { + const i = "IDocument::GetMediaId", r = {method: i}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.id) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + static GetMediaName() { + const i = "IDocument::GetMediaName", r = {method: i}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.name) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + static GetPrinterName() { + const i = "IDocument::GetPrinterName", r = {method: i}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.name) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + static GetText(i) { + const r = "IDocument::GetText", u = {method: r, index: i}, f = new Promise((n, i) => { + const u = f => { + document.removeEventListener(r, u), f.detail.ret == !1 || f.detail.connect == !1 ? i(t) : n(f.detail.text) + }; + document.addEventListener(r, u) + }); + return n.appendMessage(u), f + } + + static GetTextCount() { + const i = "IDocument::GetTextCount", r = {method: i}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.count) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + static GetTextIndex(i) { + const r = "IDocument::GetTextIndex", u = {method: r, name: i}, f = new Promise((n, i) => { + const u = f => { + document.removeEventListener(r, u), f.detail.connect == !1 ? i(t) : f.detail.ret == !1 ? n() : n(f.detail.index) + }; + document.addEventListener(r, u) + }); + return n.appendMessage(u), f + } + + static GetPrinter() { + const i = "IDocument::GetPrinter", r = {method: i}, u = new Promise((n, r) => { + const u = f => { + if (document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1) r(t); else if (f.detail.p >= 0) { + const t = new IPrinter(f.detail.p); + n(t) + } else r() + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + static SetText(i, r) { + const u = "IDocument::SetText", f = {method: u, index: i, text: r}, e = new Promise((n, i) => { + const r = f => { + document.removeEventListener(u, r), f.detail.connect == !1 ? i(t) : n(f.detail.ret) + }; + document.addEventListener(u, r) + }); + return n.appendMessage(f), e + } + + static SetBarcodeData(i, r) { + const u = "IDocument::SetBarcodeData", f = {method: u, index: i, text: r}, e = new Promise((n, i) => { + const r = f => { + document.removeEventListener(u, r), f.detail.connect == !1 ? i(t) : n(f.detail.ret) + }; + document.addEventListener(u, r) + }); + return n.appendMessage(f), e + } + + static SetMarginLeftRight(i, r) { + const u = "IDocument::SetMarginLeftRight", f = {method: u, left: i, right: r}, e = new Promise((n, i) => { + const r = f => { + document.removeEventListener(u, r), f.detail.connect == !1 ? i(t) : n(f.detail.ret) + }; + document.addEventListener(u, r) + }); + return n.appendMessage(f), e + } + + static SetMediaById(i, r) { + const u = "IDocument::SetMediaById", f = {method: u, id: i, fit: r}, e = new Promise((n, i) => { + const r = f => { + document.removeEventListener(u, r), f.detail.connect == !1 ? i(t) : n(f.detail.ret) + }; + document.addEventListener(u, r) + }); + return n.appendMessage(f), e + } + + static SetMediaByName(i, r) { + const u = "IDocument::SetMediaByName", f = {method: u, name: i, fit: r}, e = new Promise((n, i) => { + const r = f => { + document.removeEventListener(u, r), f.detail.connect == !1 ? i(t) : n(f.detail.ret) + }; + document.addEventListener(u, r) + }); + return n.appendMessage(f), e + } + + static SetPrinter(i, r) { + const u = "IDocument::SetPrinter", f = {method: u, name: i, fit: r}, e = new Promise((n, i) => { + const r = f => { + document.removeEventListener(u, r), f.detail.connect == !1 ? i(t) : n(f.detail.ret) + }; + document.addEventListener(u, r) + }); + return n.appendMessage(f), e + } + + static GetCurrentSheet() { + const i = "IDocument::GetCurrentSheet", r = {method: i}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.name) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + static SetCurrentSheet(i) { + const r = "IDocument::SetCurrentSheet", u = {method: r, name: i}, f = new Promise((n, i) => { + const u = f => { + document.removeEventListener(r, u), f.detail.connect == !1 ? i(t) : n(f.detail.ret) + }; + document.addEventListener(r, u) + }); + return n.appendMessage(u), f + } + + static GetCutLineCount() { + const i = "IDocument::GetCutLineCount", r = {method: i}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.count) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + static GetCutLines() { + const i = "IDocument::GetCutLines", r = {method: i}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.connect == !1 ? r(t) : f.detail.ret == !1 ? n() : n(f.detail.cutlines) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + static GetErrorCode() { + const i = "IDocument::GetErrorCode", r = {method: i}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.errorCode) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + static GetMarginBottom() { + const i = "IDocument::GetMarginBottom", r = {method: i}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.margin) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + static SetMarginBottom(i) { + const r = "IDocument::SetMarginBottom", u = {method: r, margin: i}, f = new Promise((n, i) => { + const u = f => { + document.removeEventListener(r, u), f.detail.connect == !1 ? i(t) : n(f.detail.ret) + }; + document.addEventListener(r, u) + }); + return n.appendMessage(u), f + } + + static GetMarginLeft() { + const i = "IDocument::GetMarginLeft", r = {method: i}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.margin) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + static SetMarginLeft(i) { + const r = "IDocument::SetMarginLeft", u = {method: r, margin: i}, f = new Promise((n, i) => { + const u = f => { + document.removeEventListener(r, u), f.detail.connect == !1 ? i(t) : n(f.detail.ret) + }; + document.addEventListener(r, u) + }); + return n.appendMessage(u), f + } + + static GetMarginRight() { + const i = "IDocument::GetMarginRight", r = {method: i}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.margin) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + static SetMarginRight(i) { + const r = "IDocument::SetMarginRight", u = {method: r, margin: i}, f = new Promise((n, i) => { + const u = f => { + document.removeEventListener(r, u), f.detail.connect == !1 ? i(t) : n(f.detail.ret) + }; + document.addEventListener(r, u) + }); + return n.appendMessage(u), f + } + + static GetMarginTop() { + const i = "IDocument::GetMarginTop", r = {method: i}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.margin) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + static SetMarginTop(i) { + const r = "IDocument::SetMarginTop", u = {method: r, margin: i}, f = new Promise((n, i) => { + const u = f => { + document.removeEventListener(r, u), f.detail.connect == !1 || f.detail.connect == !1 ? i(t) : n(f.detail.ret) + }; + document.addEventListener(r, u) + }); + return n.appendMessage(u), f + } + + static GetOrientation() { + const i = "IDocument::GetOrientation", r = {method: i}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.orientation) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + static GetSheetNames() { + const i = "IDocument::GetSheetNames", r = {method: i}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.names) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + static GetWidth() { + const i = "IDocument::GetWidth", r = {method: i}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.width) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + static GetLength() { + const i = "IDocument::GetLength", r = {method: i}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.ret == !1 || f.detail.connect == !1 ? r(t) : n(f.detail.length) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + static SetLength(i) { + const r = "IDocument::SetLength", u = {method: r, length: i}, f = new Promise((n, i) => { + const u = f => { + document.removeEventListener(r, u), f.detail.connect == !1 ? i(t) : n(f.detail.ret) + }; + document.addEventListener(r, u) + }); + return n.appendMessage(u), f + } + + static Save() { + const i = "IDocument::Save", r = {method: i}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.connect == !1 ? r(t) : n(f.detail.ret) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } + + static SaveAs(i, r) { + const u = "IDocument::SaveAs", f = {method: u, type: i, filePath: r}, e = new Promise((n, i) => { + const r = f => { + document.removeEventListener(u, r), f.detail.connect == !1 ? i(t) : n(f.detail.ret) + }; + document.addEventListener(u, r) + }); + return n.appendMessage(f), e + } + + static Export(i, r, u) { + const f = "IDocument::Export", e = {method: f, type: i, filePath: r, dpi: u}, o = new Promise((n, i) => { + const r = u => { + document.removeEventListener(f, r), u.detail.connect == !1 ? i(t) : n(u.detail.ret) + }; + document.addEventListener(f, r) + }); + return n.appendMessage(e), o + } + + static Close() { + const i = "IDocument::Close", r = {method: i}, u = new Promise((n, r) => { + const u = f => { + document.removeEventListener(i, u), f.detail.connect == !1 ? r(t) : n(f.detail.ret) + }; + document.addEventListener(i, u) + }); + return n.appendMessage(r), u + } +} + +export const IsExtensionInstalled = () => document.body.classList.contains("bpac-extension-installed") ? !0 : !1 diff --git a/src/main/resources/static/js/main.js b/src/main/resources/static/js/main.js index 990feeb..2dd8cde 100644 --- a/src/main/resources/static/js/main.js +++ b/src/main/resources/static/js/main.js @@ -1,16 +1,19 @@ -const body = document.querySelector("body"); -const errorMsgBox = document.querySelector(".errorBox"); -const errorMsgBoxText = errorMsgBox.querySelector("p"); -const warningMsgBox = document.querySelector(".warningBox"); -const warningMsgBoxText = warningMsgBox.querySelector("p"); -const successMsgBox = document.querySelector(".successBox"); -const successMsgBoxText = successMsgBox.querySelector("p"); +const body = $("body"); +const errorMsg = $("#errorBox"); +const warningMsg = $("#warningBox"); +const successMsg = $("#successBox"); +const confirmMsg = $("#confirmBox"); +const promptMsg = $("#promptBox"); + +const messageBoxesAnimationTime = 200; +const messageBoxesFunctionsDelay = 300; $(() => { $('.materialCode').each(function () { const row = $(this); const materialID = row.data("materialid"); + // SIMDUT axios.post(`/simdut/${materialID}`) .catch(function (err) { if (err.response.status === 404) { @@ -19,127 +22,203 @@ $(() => { } }); }); - $(".messageBox").each(function () { checkMessageBoxesDisplay($(this)[0]) }); -}); - -window.addEventListener("load", () => { - - document.querySelectorAll(".returnButton").forEach((e) => { - e.addEventListener("click", () => { - document.location.href = referer; - }); + $(".toSave").on({ + keyup: function () { + showMessage(warningMsg, changesNotSavedText, false); + } + }); + $(".returnButton").on({click: () => window.location.href = referer}); + $(".materialCode").on({ + click: function () { + window.open(`/simdut/${$(this).data("materialid")}`, "_blank"); + } + }); + $("img").on({ + click: function () { + if ($(this).attr("id") === "logo") return; + window.open($(this).attr("src"), "_blank"); + } + }); + $('input[type="text"], input[type="number"], input[type="date"], textarea').each(function () { + $(this).addClass("rawInput"); + }); + $(".rawInput:not(.noPlaceholder)").each(function () { + $(this).attr({placeholder: "N/A"}); }); - document.querySelectorAll(".materialCode").forEach((e) => { - const materialID = e.getAttribute("data-materialID"); - e.addEventListener("click", () => { - window.open("/simdut/" + materialID, "_blank"); - }); + // Formulaires protégés + $(".requireAuth").on({ + submit: function () { + return checkPassword(this); + } }); - - document.querySelectorAll("img").forEach((e) => { - if (e.id !== "logo") { - e.addEventListener("click", () => { - window.open(e.src, "_blank"); + const removerForm = $(".requireAuth-remover"); + removerForm.find(".remover").on({ + click: function () { + console.log($(this)); + removerForm.attr({ + action: removerForm.attr("action") + $(this).data("entityid") }); + + checkPassword(removerForm); } }); - document.querySelectorAll(".requireAuth").forEach((e) => { - e.onsubmit = () => { - return checkPassword(e); - }; + // Favicon + $("head").append($("").attr({ + rel: "icon", + href: "/favicon.png" + })); + + // Imprimante + let src = `${baseUrl}/icons/printerError.svg`; + let title = printErrorTitle; + if ($(".bpac-extension-installed").length) { + src = `${baseUrl}/icons/printer.svg`; + title = printOkTitle; + } + $("#printStatusIcon").attr({ + src: src, + title: title }); - - document.querySelectorAll(".requireAuth-remover").forEach((e) => { - e.querySelectorAll(".remover").forEach(elem => { - elem.addEventListener("click", () => { - e.action += elem.getAttribute("data-entityID"); - checkPassword(e); - }); - }); - }); - - document.querySelectorAll(".companyTabTitle").forEach(e => { - e.addEventListener("click", () => { - const companyName = e.getAttribute("data-companyName"); - const table = document.getElementById("recipes_" + companyName); - - if (table.style.display === "none") { - table.style.display = "table"; - } else { - table.style.display = "none"; - } - }); - }); - - document.querySelectorAll('input[type="text"], input[type="number"], input[type="date"], textarea').forEach(e => e.classList.add("rawInput")) - - document.querySelectorAll(".rawInput").forEach(e => e.placeholder = "N/A"); - - window.addEventListener("keyup", e => { - if (e.target) { - if (e.target.classList.contains("toSave")) { - warningMsgBoxText.innerText = changesNotSavedText; - showElement(warningMsgBox); - } - } - }); - - // Ajoute le favicon - let faviconElement = document.createElement("link"); - faviconElement.rel = "icon"; - faviconElement.href = "/favicon.png"; - document.querySelector("head").appendChild(faviconElement); }); -function askDatabaseExport() { - return confirm(exportAllWarningText); +function confirmDatabaseExport() { + showConfirm(exportAllWarningText, false, () => { + window.location.href = "./recipe/xls"; + }); } -function checkPassword(form, callback) { - hideElement(errorMsgBox); +function checkPassword(form, callback = () => { +}) { + let shouldContinue = false; - const password = prompt(askPasswordText); - if (!password) return false; + promptMsg.find("input").attr({type: "password"}); + showConfirm(askPasswordText, true, async pwd => { + let data = {}; + data.password = pwd; - let data = {}; - data.password = password; + await axios.post("/password/valid", data) + .then(r => { + if (r.data === true) { + if (form != null) form.submit(); + callback(); + shouldContinue = true; + } else { + showMessage(errorMsg, invalidPasswordText); + } + }) + .catch(e => { + showMessage(errorMsg, generalErrorText); + console.log(e); + }); - axios.post("/password/valid", data) - .then(r => { - if (r.data === true) { - if (form != null) form.submit(); - if (callback != null) callback(); - return true; - } else { - errorMsgBoxText.innerText = invalidPasswordText; - showElement(errorMsgBox); - } - }) - .catch(e => { - errorMsgBoxText.innerText = generalErrorText; - showElement(errorMsgBox); - console.log(e); - }); + promptMsg.find("input").attr({type: "text"}); + }, () => promptMsg.find("input").attr({type: "text"})); - return false; + return shouldContinue; } +const messageBoxesY = -20; +const headerY = 70; + function checkMessageBoxesDisplay(element) { - if (!element.querySelector("p").textContent) hideElement(element); - else showElement(element); + const node = $(element); + + if (!node.find("p").text()) hideMessage(element); + else showMessage(element); } -function hideElement(element) { - element.style.display = "none"; +function isMessageVisible(type) { + return $(type).is(":visible"); } -function showElement(element) { - element.style.display = ""; +function showMessage(type, value, autoHide = true, hideTimeout = 2000) { + const node = $(type); + const message = node.find("p"); + + // Cache les autres boîtes de message sauf si une boîte de confirmation est active + if (!$("#filter").is(":visible")) { + $(`.messageBox:not(#${$(type).attr("id")}`).each(function () { + hideMessage(this); + }); + } else { + return; + } + + if (!isMessageVisible(type)) { + message.text(value); + node.show(); + node.animate({top: `${headerY}px`}, messageBoxesAnimationTime); + + if (autoHide) { + setTimeout(() => { + hideMessage(node); + }, hideTimeout); + } + } else { + if (message.text() !== value) hideMessage(type, () => showMessage(type, value, autoHide, hideTimeout)); + } +} + +function hideMessage(type, callback = () => { +}) { + const node = $(type); + + if (isMessageVisible(type)) { + node.animate({top: `${messageBoxesY}px`}, messageBoxesAnimationTime, "swing", () => { + node.hide(); + callback(); + }); + } +} + +function showConfirm(value, prompt = false, continueCallback = () => { +}, cancelCallback = () => { +}) { + const filter = $("#filter"); + const node = prompt ? $(promptMsg) : $(confirmMsg); + + if (prompt) node.find("#confirmInput").val(""); + + showMessage(node, value, false); + filter.show(); + filter.animate({opacity: 0.5}, messageBoxesAnimationTime); + + node.find(".confirmContinue").one({ + click: function () { + hideConfirm(node); + + setTimeout(function () { + if (!prompt) continueCallback(); + else continueCallback(node.find("#confirmInput").val()); + }, messageBoxesFunctionsDelay); + } + }); + node.find(".confirmCancel").one({ + click: function () { + hideConfirm(node); + + setTimeout(function () { + cancelCallback(); + }, messageBoxesFunctionsDelay); + } + }); +} + +function hideConfirm(node) { + hideMessage(node); + + const filter = $("#filter"); + filter.animate({opacity: 0}, messageBoxesAnimationTime + 100, "swing", () => { + filter.hide(); + // Retire les callbacks des anciennes confirmations + $(confirmMsg).find(".confirmContinue").unbind(); + $(confirmMsg).find(".confirmCancel").unbind(); + }); } const lTomL = 1000; @@ -151,15 +230,14 @@ let currentUnit = "mL"; function changeUnits(unitSelect, quantitiesSelector, unitsDisplay) { currentUnit = unitSelect.value; - document.querySelectorAll(unitsDisplay).forEach(e => { - e.innerText = currentUnit; + $(unitsDisplay).each(function () { + $(this).text(currentUnit); - // Modifie la quantitée - const quantityElem = e.parentElement.parentElement.querySelector(quantitiesSelector); + const quantityElem = $(this).parents(".materialRow").find(quantitiesSelector); + console.log(quantityElem); if (quantityElem) { - const originalQuantity = parseInt(quantityElem.dataset.quantityml); - - quantityElem.innerText = convertMlToUnit(originalQuantity); + const originalQuantity = parseInt(quantityElem.data("quantityml")); + quantityElem.text(convertMlToUnit(originalQuantity)); } }); } @@ -187,3 +265,7 @@ function percentageOf(percentage, number) { function searchIn(searchString, str) { return str.toUpperCase().indexOf(searchString.toUpperCase()) > -1; } + +function formatMessage(message) { + return message.replace(/'/g, "'"); +} diff --git a/src/main/resources/static/js/mix.js b/src/main/resources/static/js/mix.js index 8aca781..90fce8d 100644 --- a/src/main/resources/static/js/mix.js +++ b/src/main/resources/static/js/mix.js @@ -8,19 +8,22 @@ let materialSelectorHtml; let recipeID; $(() => { - recipeID = document.querySelector("#recipeID").value; + recipeID = $("#recipeID").val(); - axios.get(`/mix/selector/${recipeID}/-1`) + const mixIDInput = $("#mixID"); + const mixID = mixIDInput ? mixIDInput.val() : -1; + + axios.get(`/mix/selector/${recipeID}/${mixID}`) .then(r => { materialSelectorHtml = r.data; init(); }) .catch(e => { - console.log(e.status); - errorMsgBoxText.innerText = generalErrorText; - showElement(errorMsgBox); + showMessage(errorMsg, generalErrorText); console.log(e); }); + + onRowPositionChanged(); }); $(document).on("click", function () { @@ -32,165 +35,204 @@ $(document).on("click", ".materialSelector", function (event) { showMaterialList($(this)[0]); }); +// $(document).on("click", ".materialList p", function () { +// $(this).parents(".materialSelector").find("input").val($(this).data("materialcode")); +// }); + $(document).on("click", ".removeMaterial", function () { const id = $(this).data("removerow"); if ($(".materialListRow").length > 1) $(`#${id}`).remove(); }); $(document).on("click", ".upRow", function () { - const row = $(this).parent().parent(); + const row = $(this).parents(".materialListRow"); row.insertBefore(row.prev()); + + onRowPositionChanged(); }); $(document).on("click", ".downRow", function () { - const row = $(this).parent().parent(); - row.insertBefore(row.next()); + const row = $(this).parents(".materialListRow"); + row.insertAfter(row.next()); + + onRowPositionChanged() }); -document.querySelector(".mixMaterialListTitle button").addEventListener("click", () => { - addMaterial(null, null); +$(".mixMaterialListTitle button").on({ + click: function () { + addMaterial(null, null); + } }); +function onRowPositionChanged() { + $(".materialListRow").each(function () { + const node = $(this); + const upRow = node.find(".upRow"); + const downRow = node.find(".downRow"); + + let upRowHidden = false; + let downRowHidden = false; + + if (node.is(":first-child")) { + upRowHidden = true; + } else if (node.is(":last-child")) { + downRowHidden = true; + } + + if (upRowHidden) upRow.css({opacity: 0}); + else upRow.css({opacity: 1}); + + if (downRowHidden) downRow.css({opacity: 0}); + else downRow.css({opacity: 1}); + }); +} + function addMaterial(materialCode, quantity) { const row = addRow(materialNbr); - const positionColumn = addColumn("positionButtons", row); - const materialColumn = addColumn("material", row); - const quantityColumn = addColumn("quantity", row); - const unitsColumn = addColumn("units", row); - const removeButtonColumn = addColumn("removeButton", row); + const positionColumn = $(addColumn("positionButtons", row)); + const materialColumn = $(addColumn("material", row)); + const quantityColumn = $(addColumn("quantity", row)); + const unitsColumn = $(addColumn("units", row)); + const removeButtonColumn = $(addColumn("removeButton", row)); addPositionButtons(positionColumn); addQuantityInput(quantity, quantityColumn); addUnits(unitsColumn); addRemoveButton(materialNbr, removeButtonColumn); - materialColumn.innerHTML = materialSelectorHtml; - const materialSelector = materialColumn.querySelector("input"); + materialColumn.html(materialSelectorHtml); + const materialSelector = materialColumn.find("input"); if (materialCode) { - const material = materialColumn.querySelector(`.materialList p[data-materialcode="${materialCode}"]`); + const material = materialColumn.find(`.materialList p[data-materialcode="${materialCode}"]`); if (material) { - materialSelector.value = material.dataset.materialcode; - materialSelector.dataset.usepercentages = material.dataset.usepercentages; + materialSelector.val(material.data("materialcode")); + materialSelector.data({ + usepercentages: material.data("usepercentages") + }); } } - row.appendChild(materialColumn); - row.appendChild(quantityColumn); - row.appendChild(unitsColumn); - row.appendChild(removeButtonColumn); - - document.querySelector(".mixMaterialList").appendChild(row); + $(".mixMaterialList").append(row); checkUnits(materialSelector, row); + onRowPositionChanged(); materialNbr++; } function addRow(index) { - const row = document.createElement("div"); - row.classList.add("materialListRow"); - row.id = `material_${index}`; - return row; + return $("

") + .attr({ + class: "materialListRow", + id: `material_${index}` + }); } function addColumn(type, parent) { - const column = document.createElement("div"); - column.classList.add(type); + const column = $("
") + .attr({class: type}); - parent.appendChild(column); + $(parent).append(column); return column; } function addUnits(parent) { - const units = document.createElement("p"); - units.classList.add("quantityUnits"); - units.textContent = "mL"; + const units = $("

") + .attr({class: "quantityUnits"}) + .text("mL"); - parent.appendChild(units); + $(parent).append(units); return units; } function addRemoveButton(index, parent) { - const button = document.createElement("button"); - button.type = "button"; - button.textContent = removeText; - button.dataset.removerow = `material_${index}`; - button.classList.add("removeMaterial"); + const button = $("") + .attr({ + type: "button", + class: "removeMaterial" + }) + .data({removerow: `material_${index}`}) + .text(removeText); - parent.appendChild(button); + $(parent).append(button); return button; } function addQuantityInput(quantity, parent) { - let input = document.createElement("input"); - if (quantity === undefined || quantity === null) quantity = 1; - input.type = "number"; - input.name = "quantities"; - input.value = quantity; - input.step = 0.001; - input.min = 0.001; - input.required = true; + const input = $("") + .attr({ + type: "number", + name: "quantities", + value: quantity, + step: 0.001, + min: 0.001, + required: true + }); - parent.appendChild(input); + $(parent).append(input); return input; } function addPositionButtons(parent) { - const up = document.createElement("button"); - up.classList.add("upRow"); - up.type = "button"; - up.textContent = "↑"; - parent.appendChild(up); + $(parent).append($("") + .attr({ + class: "upRow", + type: "button" + }) + .text("↑")); - const down = document.createElement("button"); - down.classList.add("downRow"); - down.type = "button"; - down.textContent = "↓"; - parent.appendChild(down); + $(parent).append($("") + .attr({ + class: "downRow", + type: "button" + }) + .text("↓")); } function showMaterialList(input) { hideMaterialList(); - input.parentElement.querySelector(".materialSelector .materialList").classList.add("show"); + $(input).parent().find(".materialSelector .materialList").addClass("show"); } function hideMaterialList() { - const list = document.querySelector(".materialSelector .materialList.show"); - - if (list != null) list.classList.remove("show"); + const list = $(".materialSelector .materialList.show"); + if (list) list.removeClass("show"); } function selectMaterial(material) { - const materialName = material.dataset.materialcode; - const input = material.parentElement.parentElement.querySelector("input"); + const materialName = $(material).data("materialcode"); + const input = $(material).parents(".materialSelector").find("input"); - input.value = materialName; + input.val(materialName); - hideMaterialList(); - checkUnits(material, input.parentElement.parentElement.parentElement) + checkUnits(material, input.parents(".materialListRow")); } function searchMaterial(input) { - let filter, filterUpper, materials; + const filter = input.val(); + const materials = input.parent().find(".materialList p"); - filter = input.value; - materials = input.parentElement.querySelectorAll(".materialList p"); - - materials.forEach(e => { - if (searchIn(filter, e.textContent) || searchIn(filter, e.dataset.materialtype)) e.style.display = ""; - else e.style.display = "none"; + materials.each(function () { + const node = $(this); + if (searchIn(filter, node.text()) || searchIn(filter, node.data("materialtype"))) node.hide(); + else node.show(); }); - const found = input.parentElement.querySelector(`.materialList p[data-materialcode="${filter}"]`); - if (found) input.dataset.usepercentages = found.dataset.usepercentages; + const found = input.parent().find(`.materialList p[data-materialcode="${filter}"]`); + if (found) { + input.data({ + usepercentages: found.data("usepercentages") + }); + } - checkUnits(input, input.parentElement.parentElement.parentElement); + checkUnits(input, input.parents(".materialListRow")); } -function checkUnits(materialSelector, row) { - const quantityUnits = row.querySelector(".quantityUnits"); - if (materialSelector.dataset.usepercentages === "true") quantityUnits.innerText = "%"; - else quantityUnits.innerText = "mL"; +function checkUnits(materialSelector) { + const quantityUnits = $(materialSelector).parents(".materialListRow").find(".quantityUnits"); + console.log($(quantityUnits)); + if ($(materialSelector).data("usepercentages")) quantityUnits.text("%"); + else quantityUnits.text("mL"); } diff --git a/src/main/resources/static/js/ptouchPrint.js b/src/main/resources/static/js/ptouchPrint.js new file mode 100644 index 0000000..f978ac3 --- /dev/null +++ b/src/main/resources/static/js/ptouchPrint.js @@ -0,0 +1,47 @@ +import * as bpac from "/js/bpac.js"; + +export class PtouchPrinter { + constructor(object) { + this.object = object; + this.pdocument = bpac.IDocument; + } + + async print() { + if (!bpac.IsExtensionInstalled()) { + console.error("L'extension b-Pac n'est pas installée"); + return -1; + } + + try { + await this.openDoc(); + await this.fillDoc(); + this.printDoc(); + this.pdocument.Close(); + + return 1; + } catch (e) { + console.log(e); + return 99; + } + }; + + async openDoc() { + const docUrl = `${baseUrl}/lbx/${this.object.template}.lbx`; + console.log("Ouverture du modèle: " + docUrl); + await this.pdocument.Open(docUrl); + } + + async fillDoc() { + for (let i = 0; i < this.object.lines.length; i++) { + const line = this.object.lines[i]; + const label = await this.pdocument.GetObject(line.name); + label.Text = line.value; + } + } + + printDoc() { + this.pdocument.StartPrint("", 0); + this.pdocument.PrintOut(1, 0); + this.pdocument.EndPrint(); + } +} diff --git a/src/main/resources/static/js/recipeList.js b/src/main/resources/static/js/recipeList.js new file mode 100644 index 0000000..d98e0c0 --- /dev/null +++ b/src/main/resources/static/js/recipeList.js @@ -0,0 +1,8 @@ +$(() => { + $(".companyTabTitle").on({ + click: function () { + const companyID = $(this).parent().data("companyid"); + $(`#recipes_${companyID}`).toggle(); + } + }); +}); diff --git a/src/main/resources/static/js/recipeResearch.js b/src/main/resources/static/js/recipeResearch.js index 5bb866b..6d7f11f 100644 --- a/src/main/resources/static/js/recipeResearch.js +++ b/src/main/resources/static/js/recipeResearch.js @@ -33,8 +33,6 @@ function performSearch(searchString) { companyRows.forEach(c => { const recipeRows = c.querySelectorAll(".recipeRow"); - hideElement(warningMsgBox); - if (!searchString || !searchString.replace(/\s/g, '').length) { c.classList.add("researchResult"); @@ -44,7 +42,7 @@ function performSearch(searchString) { found = true; emptySearch = true; - } else if (searchIn(searchString, c.querySelector("h2").dataset.companyname)) { + } else if (searchIn(searchString, c.querySelector("h2").textContent)) { c.classList.add("researchResult"); recipeRows.forEach(r => r.classList.add("researchResult")); found = true; @@ -59,14 +57,12 @@ function performSearch(searchString) { }); }); } - - if (!found) { - warningMsgBoxText.innerText = researchNotFound; - showElement(warningMsgBox); - } - - if (emptySearch) closeTabs(); - else openTabs(); } ); + + if (!found) showMessage(warningMsg, researchNotFound, false); + else hideMessage(warningMsg); + + if (emptySearch) closeTabs(); + else openTabs(); } diff --git a/src/main/resources/static/lbx/Couleur.lbx b/src/main/resources/static/lbx/Couleur.lbx new file mode 100644 index 0000000000000000000000000000000000000000..2eb24686e5af01cd6c8d511ef9a2bb89e4c3357b GIT binary patch literal 2236 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 Wvh_bUV95C*`m>X9_FiE;|NRMx8*&f; literal 0 HcmV?d00001 diff --git a/src/main/resources/static/pdf/touchup.old.pdf b/src/main/resources/static/pdf/touchup.old.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4f47c998c5bb6ccd40694b7dfc2321555bbbb27a GIT binary patch literal 15545 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 z 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/static/pdf/touchup.pdf b/src/main/resources/static/pdf/touchup.pdf index 4f47c998c5bb6ccd40694b7dfc2321555bbbb27a..3a84182026b5329dfc26fb895789437a76142395 100644 GIT binary patch delta 928 zcmaixO=uHA7>3<6_8^4*SWTPKI`l_tWwSH0yED6S8%>+8)?yoDDrhO%-E3$I?v_mo z7SV%C?0gO&T!^+ou~YxxX$zxpyj@#m2;+D)5>X@pnG>pKLnJ* zLJM2w8Y3AXAypC~5%iRhIw1^Z)49=KV5u(GGP6@wpOdz>N23ADPCLeAKx9|BErln+ zp2WE8=>WL=S}fu5hk#T%M5BTZBw_!crg_^0K;@1D0IfkJw#_FngOfPf!;wvYW0As2 zTg$&7#Diow$}af`o2_bK?|g^q)$&^@XT;8$o^F5;+g-JfQ`ubA?Ro?&^1hFPU@`6= z>}DT@&f>i=<=AT&VAsQqtQJ1xMD_-5mdAv6a?QZKR<8q4c}StMClzAU`+iU*)_{iA zmm^^{q`7zoUGsCKRAhI&<0-W0=afR-MiwT(Q#MRmSEG%YuA@8daezd2nuI!V#oOU2 z%Z{1(tYZWG+XNW02ZXfalEtNPJgEuSNl%-W+m(#PK_adLF^q5+v6E^u6X;|JLx?a% z6su4@@>8xDvm)g^J6GsTwMfGVip8T!6X##O{jwHA9wHvo6rvHVMj#uBbp2VJkL>7x z7%R{)5sxzCgcl8i@&-g1K8-ULHC0One01^E`KH5@O<#v_=oSvSFjOsuY(tter1vi-7N1Y_TvfI(ud%Ur{cO# Ua!rO6wAKxTASuw<**~m*1Jxc0Q~&?~ delta 871 zcma))%TE(Q9LL=jA`gp24nQh0f<#{1otb^K3(I1utf`1#t&!N&bm`7&4eXM3G1QoF zP`FSM>Kru27!8S$lZSdSCd31Y1moSSNB;n?Xde&~J?Ld7`ObGf`ObHK>yMcaxec~i z1Q0~Iux&ZSambo_TmDND!wSm+KZVK$tnt`mF|=`1OkPP4qDF) z)`g}^!d1Z2v#u_v#kklKH#wmws>)3RQ~|_#7cD34%n<|ian}G+RS&TYd-k4(r%4w_ zUo!$D6n=HmpG@l^PW&Gn{sSkLa3&+s&n}4x(0y0>RInPrzG0G=y4cJ!+(N z?iQMpP;I3^8bQ9|p7gAS5ev;N^!_lQamh>H44+i0-G@>cTeCCs099z*72UeiODr}V z>fSEIdui{C~E&gmo- z&`Ho_O{_zfHw1y5MSOrw2>~o(0|kjVOV3~Uv<#1`iscpvHxnf$cRl@p0F1b(Z94!} zCn{o@HbB+CiCl~;A|HmbCWUzz9>YkGun-W?ctAs1NDT8DR{!lta5s;~5h%5ppb+{V z2C%AToea_EJq=4QQpse}@FtC!o!z@TyTSEBWWBKUwD6;@JKNg5#&6#4+}t0~9u@Pe zWBJvUy!j+=Zs*O9ZC_RN+&137^c;iyiBLmnY7dzQ1DtjAjI)#>rU!{wls!E?<5Svi Da@PH@ diff --git a/src/main/resources/templates/company/creator.html b/src/main/resources/templates/company/creator.html index 0c0a50f..ca1cfb6 100644 --- a/src/main/resources/templates/company/creator.html +++ b/src/main/resources/templates/company/creator.html @@ -6,7 +6,7 @@ -
+
diff --git a/src/main/resources/templates/company/remover.html b/src/main/resources/templates/company/remover.html index ef05ef3..39957d1 100644 --- a/src/main/resources/templates/company/remover.html +++ b/src/main/resources/templates/company/remover.html @@ -20,7 +20,7 @@ -
+
diff --git a/src/main/resources/templates/error.html b/src/main/resources/templates/error.html index f11a558..d27d3d9 100644 --- a/src/main/resources/templates/error.html +++ b/src/main/resources/templates/error.html @@ -5,7 +5,7 @@ -
+
diff --git a/src/main/resources/templates/fragments.html b/src/main/resources/templates/fragments.html index 0bb89d4..528f483 100644 --- a/src/main/resources/templates/fragments.html +++ b/src/main/resources/templates/fragments.html @@ -11,10 +11,10 @@ -
+
- +
+
+ print status + +
+
+
+
-
+
- error icon -

-

+
+ error icon +

+

+
-
+
- success icon -

-

+
+ success icon +

+

+
-
+
- warning icon -

-

+
+ warning icon +

+

+
+
+
+
+
+ confirm icon +

+

+
+
+ + +
+
+
+
+ +
+
+
+
+ confirm icon +

+

+
+
+ +
+
+ + +
+
+
+
+ +
+
+
+

@@ -116,17 +173,20 @@
@@ -147,5 +207,13 @@
+ + diff --git a/src/main/resources/templates/images/add.html b/src/main/resources/templates/images/add.html index 2819e2b..e1477f3 100644 --- a/src/main/resources/templates/images/add.html +++ b/src/main/resources/templates/images/add.html @@ -6,7 +6,7 @@ -
+
diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html index 40958e0..1ff7122 100644 --- a/src/main/resources/templates/index.html +++ b/src/main/resources/templates/index.html @@ -5,7 +5,7 @@ -
+
@@ -20,10 +20,9 @@
-

+

- @@ -51,16 +50,15 @@
+ diff --git a/src/main/resources/templates/inventory.html b/src/main/resources/templates/inventory.html index 07ca00a..8390bc1 100644 --- a/src/main/resources/templates/inventory.html +++ b/src/main/resources/templates/inventory.html @@ -57,7 +57,7 @@ -
+
{ e.addEventListener("click", () => { - document.location.href = `/material/editor/${e.dataset.materialid}`; + window.location.href = `/material/editor/${e.dataset.materialid}`; }); }); @@ -213,8 +213,6 @@ const materialRows = document.querySelectorAll(".materialRow"); function performSearch(searchString) { - hideElement(warningMsgBox); - let found = false; const recipesContainer = document.querySelector(".materialsContainer:not(.researchEnabled)"); @@ -242,10 +240,8 @@ } }); - if (!found) { - warningMsgBoxText.innerText = researchNotFound; - showElement(warningMsgBox); - } + if (!found) showMessage(warningMsg, researchNotFound, false); + else hideMessage(warningMsg); } /*]]>*/ diff --git a/src/main/resources/templates/material/created.html b/src/main/resources/templates/material/created.html index 03ab0d0..48d4d08 100644 --- a/src/main/resources/templates/material/created.html +++ b/src/main/resources/templates/material/created.html @@ -8,7 +8,7 @@ -
+

diff --git a/src/main/resources/templates/material/creator.html b/src/main/resources/templates/material/creator.html index e759a45..707577b 100644 --- a/src/main/resources/templates/material/creator.html +++ b/src/main/resources/templates/material/creator.html @@ -6,10 +6,9 @@ -
+
-

@@ -29,7 +28,7 @@
- +
diff --git a/src/main/resources/templates/material/edit.html b/src/main/resources/templates/material/edit.html index ae04b3b..2197b31 100644 --- a/src/main/resources/templates/material/edit.html +++ b/src/main/resources/templates/material/edit.html @@ -9,7 +9,7 @@ -
+
@@ -34,6 +34,9 @@
+
+ +
@@ -71,6 +74,10 @@ th:value="${mType.materialTypeID}">
+
+ + +
@@ -90,7 +97,7 @@ }); document.querySelector("#editSIMDUT").addEventListener("click", () => { - document.location.href = `/material/simdut/${materialID}`; + window.location.href = `/material/simdut/${materialID}`; }); })(); diff --git a/src/main/resources/templates/material/editor.html b/src/main/resources/templates/material/editor.html index b8678bd..59d2f35 100644 --- a/src/main/resources/templates/material/editor.html +++ b/src/main/resources/templates/material/editor.html @@ -17,13 +17,10 @@ -
+
-

-

@@ -55,7 +52,7 @@ e.addEventListener("click", () => { const materialID = e.getAttribute("data-materialID"); - document.location.href = "/material/editor/" + materialID; + window.location.href = "/material/editor/" + materialID; }); }); })(); diff --git a/src/main/resources/templates/material/remover.html b/src/main/resources/templates/material/remover.html index e11ab14..5284282 100644 --- a/src/main/resources/templates/material/remover.html +++ b/src/main/resources/templates/material/remover.html @@ -17,12 +17,10 @@ -
+
-

diff --git a/src/main/resources/templates/material/simdut.html b/src/main/resources/templates/material/simdut.html index 1621bbd..f3658ab 100644 --- a/src/main/resources/templates/material/simdut.html +++ b/src/main/resources/templates/material/simdut.html @@ -6,7 +6,7 @@ -
+
diff --git a/src/main/resources/templates/materialType/creator.html b/src/main/resources/templates/materialType/creator.html index 2bde6e4..6f33095 100644 --- a/src/main/resources/templates/materialType/creator.html +++ b/src/main/resources/templates/materialType/creator.html @@ -8,7 +8,7 @@ -
+
diff --git a/src/main/resources/templates/materialType/edit.html b/src/main/resources/templates/materialType/edit.html index 6b1d404..b952098 100644 --- a/src/main/resources/templates/materialType/edit.html +++ b/src/main/resources/templates/materialType/edit.html @@ -7,7 +7,7 @@ -
+
@@ -19,7 +19,7 @@
- +
diff --git a/src/main/resources/templates/materialType/editor.html b/src/main/resources/templates/materialType/editor.html index 100a225..c9afc10 100644 --- a/src/main/resources/templates/materialType/editor.html +++ b/src/main/resources/templates/materialType/editor.html @@ -17,13 +17,10 @@ -
+
-

-

@@ -53,7 +50,7 @@ e.addEventListener("click", () => { const materialTypeID = e.getAttribute("data-materialTypeID"); - document.location.href = "/materialType/editor/" + materialTypeID; + window.location.href = "/materialType/editor/" + materialTypeID; }); }); })(); diff --git a/src/main/resources/templates/materialType/remover.html b/src/main/resources/templates/materialType/remover.html index 4d00754..2db047c 100644 --- a/src/main/resources/templates/materialType/remover.html +++ b/src/main/resources/templates/materialType/remover.html @@ -17,7 +17,7 @@ -
+
diff --git a/src/main/resources/templates/mix/creator.html b/src/main/resources/templates/mix/creator.html index 65a59bb..2213f23 100644 --- a/src/main/resources/templates/mix/creator.html +++ b/src/main/resources/templates/mix/creator.html @@ -8,7 +8,7 @@ -
+
diff --git a/src/main/resources/templates/mix/editor.html b/src/main/resources/templates/mix/editor.html index 89bcc0e..62fb4ed 100644 --- a/src/main/resources/templates/mix/editor.html +++ b/src/main/resources/templates/mix/editor.html @@ -7,7 +7,7 @@ -
+
@@ -85,9 +85,9 @@ removeText = "[[#{keyword.remove}]]"; document.querySelector("#removeMix").addEventListener("click", () => { - showElement(errorMsgBox); + showMessage(errorMsg); - checkPassword(null, () => document.location.href = `/mix/remover/[[${mix.mixID}]]`); + checkPassword(null, () => window.location.href = `/mix/remover/[[${mix.mixID}]]`); }); })(); diff --git a/src/main/resources/templates/mix/selector.html b/src/main/resources/templates/mix/selector.html index 64b5e19..c59b7a1 100644 --- a/src/main/resources/templates/mix/selector.html +++ b/src/main/resources/templates/mix/selector.html @@ -19,7 +19,8 @@ th:text="${material.materialType.materialTypeName == 'Aucun' ? '' : '[' + material.materialType.prefix + ']'} + ' ' + ${material.materialCode}" th:data-materialcode="${material.materialCode}" th:data-materialtype="${material.materialType.materialTypeName}" - th:data-usepercentages="${material.materialType.usePercentages}">

+ th:data-usepercentages="${material.materialType.usePercentages}" + onclick="selectMaterial(this)">

diff --git a/src/main/resources/templates/recipe/bak.html b/src/main/resources/templates/recipe/bak.html deleted file mode 100644 index e09f147..0000000 --- a/src/main/resources/templates/recipe/bak.html +++ /dev/null @@ -1,155 +0,0 @@ -
- - - -
- - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- -
-
- - - - - - - - - - - -
- -
- -
- - - -
-
- - - - - - - - - - - - -
-

-
-
-
-
- - - - - - -
- Image supprimée ou corrompue - - -
-
- - - - - - - - - - -
-

-
- -
- - -
-
-
- -
- -
diff --git a/src/main/resources/templates/recipe/created.html b/src/main/resources/templates/recipe/created.html index d57f084..1601bbf 100644 --- a/src/main/resources/templates/recipe/created.html +++ b/src/main/resources/templates/recipe/created.html @@ -6,14 +6,14 @@ -
+

-
diff --git a/src/main/resources/templates/recipe/creator.html b/src/main/resources/templates/recipe/creator.html index 63df2a9..9dc29e7 100644 --- a/src/main/resources/templates/recipe/creator.html +++ b/src/main/resources/templates/recipe/creator.html @@ -5,7 +5,7 @@ -
+
diff --git a/src/main/resources/templates/recipe/edit.html b/src/main/resources/templates/recipe/edit.html index 7fa684f..be2ba4f 100644 --- a/src/main/resources/templates/recipe/edit.html +++ b/src/main/resources/templates/recipe/edit.html @@ -6,29 +6,6 @@ -
+
@@ -171,16 +148,13 @@
-
- -
-

- +

+
@@ -224,50 +198,44 @@ e.addEventListener("click", () => { const mixID = e.getAttribute("data-mixID"); - document.location.href = "/mix/editor/" + mixID; + window.location.href = "/mix/editor/" + mixID; }); }); document.querySelector("#newMix").addEventListener("click", () => { const recipeID = "[[${recipe.recipeID}]]"; - document.location.href = "/mix/creator/" + recipeID; + window.location.href = "/mix/creator/" + recipeID; }); document.querySelectorAll(".deleteImg").forEach(e => { e.addEventListener("click", async () => { - if (confirm(askChangePage)) { + showConfirm(askChangePage, false, () => { checkPassword(null, () => { let data = {}; - data['image'] = e.getAttribute("data-image"); - hideElement(errorMsgBox); axios.post("/images/delete", data) .then(r => { const data = r.data; if (data['error'] !== undefined) { - errorMsgBoxText.innerText = data['error']; - showElement(errorMsgBox); + showMessage(errorMsg, data['error']); } else { - document.location.reload(); + window.location.reload(); } }) .catch(e => { console.log(e); - errorMsgBoxText.innerText = "[[#{error.serverError}]]"; - showElement(errorMsgBox); + showMessage(errorMsg, generalErrorText); }); }); - } + }); }); }); document.querySelector("#addImage").addEventListener("click", () => { - if (confirm(askChangePage)) { - document.location.href = "/images/add/[[${recipe.recipeID}]]"; - } + showConfirm(askChangePage, false, () => window.location.href = "/images/add/[[${recipe.recipeID}]]"); }); const recipeText = "[[${recipeJSON}]]"; @@ -288,7 +256,7 @@ let input = document.createElement("input"); input.type = "text"; input.id = `step_${stepNbr}`; - input.classList.add("step", "rawInput"); + input.classList.add("step", "rawInput", "toSave"); input.name = "step"; input.autocomplete = "off"; if (value != null) input.value = value; diff --git a/src/main/resources/templates/recipe/editor.html b/src/main/resources/templates/recipe/editor.html index c3806cc..19710e5 100644 --- a/src/main/resources/templates/recipe/editor.html +++ b/src/main/resources/templates/recipe/editor.html @@ -6,7 +6,7 @@ -
+
@@ -21,10 +21,8 @@
-

- - + @@ -52,16 +50,15 @@
+ diff --git a/src/main/resources/templates/recipe/explore.html b/src/main/resources/templates/recipe/explore.html index 5fa3c79..7882eae 100644 --- a/src/main/resources/templates/recipe/explore.html +++ b/src/main/resources/templates/recipe/explore.html @@ -8,7 +8,7 @@ -
+
@@ -117,6 +117,8 @@
@@ -170,7 +173,7 @@
- +
@@ -207,210 +210,160 @@ + diff --git a/src/main/resources/templates/recipe/remover.html b/src/main/resources/templates/recipe/remover.html index ab4432e..6179519 100644 --- a/src/main/resources/templates/recipe/remover.html +++ b/src/main/resources/templates/recipe/remover.html @@ -6,7 +6,7 @@ -
+
@@ -22,10 +22,8 @@
-

- -
+ @@ -55,5 +53,6 @@
+ diff --git a/src/main/resources/templates/touchup.html b/src/main/resources/templates/touchup.html new file mode 100644 index 0000000..8ecf825 --- /dev/null +++ b/src/main/resources/templates/touchup.html @@ -0,0 +1,69 @@ + + + + + + + + + +
+ +
+
+ +

+ + +
+
+
+ + +
+
+ + +
+
+
+ +
+ +
+ + + + diff --git a/src/main/resources/templates/touchupPtouch.html b/src/main/resources/templates/touchupPtouch.html new file mode 100644 index 0000000..eb8284c --- /dev/null +++ b/src/main/resources/templates/touchupPtouch.html @@ -0,0 +1,52 @@ + + + + + + + +
+ +
+
+
+ +
+ + + + diff --git a/src/main/resources/templates/updates.html b/src/main/resources/templates/updates.html index bb6f0f9..1621aff 100644 --- a/src/main/resources/templates/updates.html +++ b/src/main/resources/templates/updates.html @@ -14,7 +14,7 @@ -
+
@@ -34,8 +34,7 @@ document.querySelector("#markdown").innerHTML = r.data; }) .catch(e => { - errorMsgBoxText.innerText = generalErrorText; - showElement(errorMsgBox); + showMessage(errorMsg, generalErrorText); console.log(e); }); }); diff --git a/src/main/resources/updates.md b/src/main/resources/updates.md index e8625ad..4f71f51 100644 --- a/src/main/resources/updates.md +++ b/src/main/resources/updates.md @@ -3,16 +3,28 @@ * Correction d'un bug qui empêchait la suppression des mélanges. * Correction d'un bug qui empêche les boutons supprimer de fonctionner. * Correction d'un bug qui permettait d'envoyer les formulaires demandant des mots de passe sans donner un mot de passe valide. -* Correction d'une désynchronisation entre le nom des mélanges et leurs produits internes. -* Amélioration du style du site. -* Transition des modèles vers Lombok. +* Correction d'une désynchronisation entre le nom des mélanges et leur produit interne. +* Amélioration du style. +* Amélioration de la fluidité de la navigation. +* Transition complète des modèles vers Lombok. ### Ajouts -* +++ Ajout du support pour l'imprimante P-touch. -* Les produits dans l'inventaire sont maintenant ordonnés alphabétiquement. -* Changement de l'ordre d'un mélange. +* Ajout du support pour l'imprimante P-touch de Brother. + * L'extension b-Pac doit être installée sur le navigateur des clients. + * [Firefox](https://cre.fyloz.dev/bpac.xpi) + * [Chrome](https://chrome.google.com/webstore/detail/brother-b-pac-extension/ilpghlfadkjifilabejhhijpfphfcfhb) + * Le logiciel b-Pac doit être installé sur l'ordinateur des clients. + * [Windows](https://download.brother.com/welcome/dlfp100614/bcciw32031.msi) +* Ajout de la possibilité d'imprimer les mélanges avec P-Touch +* Ajout de la possibilité d'imprimer les étiquettes de kit de retouche avec P-Touch +* Ajout des boîtes de confirmation. * Ajout d'un type de produit aux mélanges. +* Ajout du changement d'ordre des produits d'un mélange. +* Les produits dans l'inventaire sont maintenant ordonnés alphabétiquement. + +### Dépendances * Ajout de jQuery, début de la transition. +* Migration vers Java 11 # v1.1.3 ### Corrections