Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: a9b945a9 by Tony Chemit at 2023-09-05T13:19:59+02:00 Centralisdation de l'utilisation de formatter pour les dates et horodatage suivant la locale utilisée - - - - - 383d2cc2 by Tony Chemit at 2023-09-05T13:42:15+02:00 Ajout de la configuration dans le rapport de validation - See #2215 - - - - - 9 changed files: - client/datasource/actions/src/main/i18n/templates/validationReport_en_GB.ftl - client/datasource/actions/src/main/i18n/templates/validationReport_es_ES.ftl - client/datasource/actions/src/main/i18n/templates/validationReport_fr_FR.ftl - client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/validate/ValidateConfigUI.jaxx - client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/validate/ValidateModel.java - client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/validate/actions/Start.java - client/runner/src/test/java/fr/ird/observe/client/ObserveTextGeneratorTest.java - toolkit/api-decoration/src/main/java/fr/ird/observe/decoration/ToolkitIdLabelDecoratorRenderer.java - toolkit/api/src/main/java/fr/ird/observe/dto/I18nDecoratorHelper.java Changes: ===================================== client/datasource/actions/src/main/i18n/templates/validationReport_en_GB.ftl ===================================== @@ -60,7 +60,7 @@ <meta charset="UTF-8"> <meta lang="en"> <meta content="text/html"> - <title>Rapport de validation</title> + <title>Validation report</title> <style> #result { list-style-type: none; @@ -79,7 +79,6 @@ .caret::before { content: "\1f5c0"; - /*content: "\25B6";*/ color: #027BFF; display: inline-block; margin-right: 6px; @@ -87,7 +86,6 @@ .caretSymbol::before { content: "\1f5c0"; - /*content: "\25B6";*/ color: #027BFF; display: inline-block; margin-right: 6px; @@ -106,7 +104,6 @@ .caret-down::before { content: "\1f5c1"; color: #027BFF; - /*transform: rotate(90deg);*/ } #result .nested { @@ -122,10 +119,8 @@ } table { - /*font-family: arial, sans-serif;*/ border-collapse: collapse; width: 90%; - /*margin-left: 20px;*/ margin-top: 10px; margin-bottom: 10px; } @@ -171,26 +166,30 @@ </style> </head> <body> -<b>TODO</b> -<h1>Rapport de validation</h1> +<h1>Validation report</h1> <h2>Configuration</h2> <ul> - <li>Rapport de validation généré le ${.data_model.now}</li> - <li>Niveau(x) de validation : + <li>Validation report generated at ${.data_model.now}</li> + <li>Type of data to validate: <#if .data_model.modelMode.name()=="DATA">Business data<#else>Referential</#if></li> + <li>Validation scope(s): <#list .data_model.scopes as scope> <span class="<#if scope.name() == "ERROR">error<#else>warning</#if>">${scope.label}</span> </#list> </li> - <li>Context : ${.data_model.contextName}</li> + <li>Max speed value used in activities speed validation: ${.data_model.validationSpeedMaxValue}</li> + <li>Force validation of activities speed: ${.data_model.validationSpeedEnable?string("yes", "no")}</li> + <li>Force validation of species length max: ${.data_model.validationLengthWeightEnable?string("yes", "no")}</li> + <li>To bypass validation of disabled referential (display them as warnings): ${.data_model.validationUseDisabledReferential?string("yes", "no")}</li> + <li>Dictionary of required observed systems per species on senne set: ...</li> </ul> -<h2>Résultat</h2> +<h2>Results</h2> <h3>Notes</h3> -<div class="information">Pour déplier un nœud, cliquez sur l'icone <span class="caretSymbol"></span> (la combinaison avec la touche <b>Maj</b> effectue l'action sur le sous-arbre constitué de ses fils).</div> -<div class="information">Pour replier un nœud, cliquez sur l'icone <span class="caret-down"></span> (la combinaison avec la touche <b>Maj</b> effectue l'action sur le sous-arbre constitué de ses fils).</div> -<div class="information">Un clic sur un identifiant le sélectionne automatiquement.</div> +<div class="information">To expand a node, click on icon <span class="caretSymbol"></span> (Combination with key <b>Shift</b> will also expand his inner sub-tree).</div> +<div class="information">To collapse a note, click on icon <span class="caret-down"></span> (Combination with key <b>Shift</b> will also collapse his inner sub-tree).</div> +<div class="information">A click on a id will select it automatically.</div> <br/> <#assign rootNode = .data_model.rootNode /> <ul id="result"> @@ -202,7 +201,6 @@ <script> function expand(node) { - // console.info("will expand child " + node.id); node.classList.add("caret-down"); node.parentElement.querySelector(".nested").classList.add("active"); } @@ -224,11 +222,9 @@ for (const caret of document.getElementsByClassName("caret")) { caret.addEventListener("click", function (event) { let expanded = this.classList.contains("caret-down"); - // console.info("do click on " + this.id+", was expanded? "+expanded); toggle(expanded, this); if (event.shiftKey) { - // console.info("SHIFT on " + this.id+" was expanded? "+expanded); for (const child of this.parentElement.querySelector(".nested").getElementsByClassName("caret")) { toggle(expanded, child); } ===================================== client/datasource/actions/src/main/i18n/templates/validationReport_es_ES.ftl ===================================== @@ -60,7 +60,7 @@ <meta charset="UTF-8"> <meta lang="es"> <meta content="text/html"> - <title>Rapport de validation</title> + <title>Validation report</title> <style> #result { list-style-type: none; @@ -79,7 +79,6 @@ .caret::before { content: "\1f5c0"; - /*content: "\25B6";*/ color: #027BFF; display: inline-block; margin-right: 6px; @@ -87,7 +86,6 @@ .caretSymbol::before { content: "\1f5c0"; - /*content: "\25B6";*/ color: #027BFF; display: inline-block; margin-right: 6px; @@ -106,7 +104,6 @@ .caret-down::before { content: "\1f5c1"; color: #027BFF; - /*transform: rotate(90deg);*/ } #result .nested { @@ -122,10 +119,8 @@ } table { - /*font-family: arial, sans-serif;*/ border-collapse: collapse; width: 90%; - /*margin-left: 20px;*/ margin-top: 10px; margin-bottom: 10px; } @@ -171,25 +166,31 @@ </style> </head> <body> -<h1>Rapport de validation</h1> +<b>TODO</b> +<h1>Validation report</h1> <h2>Configuration</h2> <ul> - <li>Rapport de validation généré le ${.data_model.now}</li> - <li>Niveau(x) de validation : + <li>Validation report generated at ${.data_model.now}</li> + <li>Tipo de datos a validar: <#if .data_model.modelMode.name()=="DATA">Datos<#else>Referencial</#if></li> + <li>Validation scope(s): <#list .data_model.scopes as scope> <span class="<#if scope.name() == "ERROR">error<#else>warning</#if>">${scope.label}</span> </#list> </li> - <li>Context : ${.data_model.contextName}</li> + <li>Velocidad máxima autorizada en el control de las velocidades de las actividades: ${.data_model.validationSpeedMaxValue}</li> + <li>Forzar la validación de las velocidades de las actividades: ${.data_model.validationSpeedEnable?string("yes", "no")}</li> + <li>Forzar la validación de la talla de especies min/max: ${.data_model.validationLengthWeightEnable?string("yes", "no")}</li> + <li>Para que la utilización de referenciales obsoletos sea autorizado (se advertirá en los mensajes de validación): ${.data_model.validationUseDisabledReferential?string("yes", "no")}</li> + <li>Diccionario de sistemas observados requeridos por especies en la modalidad de cerco: ...</li> </ul> -<h2>Résultat</h2> +<h2>Results</h2> <h3>Notes</h3> -<div class="information">Pour déplier un nœud, cliquez sur l'icone <span class="caretSymbol"></span> (la combinaison avec la touche <b>Maj</b> effectue l'action sur le sous-arbre constitué de ses fils).</div> -<div class="information">Pour replier un nœud, cliquez sur l'icone <span class="caret-down"></span> (la combinaison avec la touche <b>Maj</b> effectue l'action sur le sous-arbre constitué de ses fils).</div> -<div class="information">Un clic sur un identifiant le sélectionne automatiquement.</div> +<div class="information">To expand a node, click on icon <span class="caretSymbol"></span> (Combination with key <b>Shift</b> will also expand his inner sub-tree).</div> +<div class="information">To collapse a note, click on icon <span class="caret-down"></span> (Combination with key <b>Shift</b> will also collapse his inner sub-tree).</div> +<div class="information">A click on a id will select it automatically.</div> <br/> <#assign rootNode = .data_model.rootNode /> <ul id="result"> @@ -201,7 +202,6 @@ <script> function expand(node) { - // console.info("will expand child " + node.id); node.classList.add("caret-down"); node.parentElement.querySelector(".nested").classList.add("active"); } @@ -223,11 +223,9 @@ for (const caret of document.getElementsByClassName("caret")) { caret.addEventListener("click", function (event) { let expanded = this.classList.contains("caret-down"); - // console.info("do click on " + this.id+", was expanded? "+expanded); toggle(expanded, this); if (event.shiftKey) { - // console.info("SHIFT on " + this.id+" was expanded? "+expanded); for (const child of this.parentElement.querySelector(".nested").getElementsByClassName("caret")) { toggle(expanded, child); } ===================================== client/datasource/actions/src/main/i18n/templates/validationReport_fr_FR.ftl ===================================== @@ -79,7 +79,6 @@ .caret::before { content: "\1f5c0"; - /*content: "\25B6";*/ color: #027BFF; display: inline-block; margin-right: 6px; @@ -87,7 +86,6 @@ .caretSymbol::before { content: "\1f5c0"; - /*content: "\25B6";*/ color: #027BFF; display: inline-block; margin-right: 6px; @@ -106,7 +104,6 @@ .caret-down::before { content: "\1f5c1"; color: #027BFF; - /*transform: rotate(90deg);*/ } #result .nested { @@ -122,7 +119,6 @@ } table { - /*font-family: arial, sans-serif;*/ border-collapse: collapse; width: 90%; margin-left: 20px; @@ -177,12 +173,17 @@ <ul> <li>Rapport de validation généré le ${.data_model.now}</li> + <li>Type de données à valider : <#if .data_model.modelMode.name()=="DATA">Données métiers<#else>Référentiel</#if></li> <li>Niveau(x) de validation : <#list .data_model.scopes as scope> <span class="<#if scope.name() == "ERROR">error<#else>warning</#if>">${scope.label}</span> </#list> </li> - <li>Context : ${.data_model.contextName}</li> + <li>Vitesse maximale autorisée dans le contrôle des vitesses d'activités : ${.data_model.validationSpeedMaxValue}</li> + <li>Forcer la validation des vitesses d'activités : ${.data_model.validationSpeedEnable?string("Oui", "Non")}</li> + <li>Forcer la validation des bornes min/max de taille d'espèce : ${.data_model.validationLengthWeightEnable?string("Oui", "Non")}</li> + <li>Pour autoriser l'utilisation de référentiels obsolètes (les messages de validation passent en avertissement): ${.data_model.validationUseDisabledReferential?string("Oui", "Non")}</li> + <li>Dictionnaire des systèmes observées requis par espèces dans le modèle Seine: ...</li> </ul> <h2>Résultat</h2> ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/validate/ValidateConfigUI.jaxx ===================================== @@ -104,7 +104,6 @@ public void destroy() { <JSeparator orientation='{JSeparator.HORIZONTAL}'/> </cell> </row> - <!-- TODO See https://gitlab.com/ultreiaio/ird-observe/-/issues/2212--> <row> <cell anchor="west"> <JLabel id='validationSpeedMaxValueLabel' styleClass="skipI18n"/> ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/validate/ValidateModel.java ===================================== @@ -30,6 +30,7 @@ import fr.ird.observe.client.datasource.editor.api.wizard.connexion.DataSourceSe import fr.ird.observe.datasource.configuration.ObserveDataSourceInformation; import fr.ird.observe.decoration.DecoratorService; import fr.ird.observe.dto.BusinessDto; +import fr.ird.observe.dto.I18nDecoratorHelper; import fr.ird.observe.dto.ToolkitIdLabel; import fr.ird.observe.dto.referential.ReferentialDto; import fr.ird.observe.dto.validation.DtoValidationContext; @@ -42,6 +43,7 @@ import fr.ird.observe.validation.definition.ValidatorDto; import io.ultreia.java4all.application.template.spi.GenerateTemplate; import io.ultreia.java4all.bean.spi.GenerateJavaBeanDefinition; import io.ultreia.java4all.decoration.Decorator; +import io.ultreia.java4all.i18n.I18n; import io.ultreia.java4all.lang.Strings; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -76,7 +78,10 @@ public class ValidateModel extends AdminActionModel { */ private static final String REPORT_PATTERN = "report-%1$tF--%1$tk-%1$tM-%1$tS.html"; private static final Logger log = LogManager.getLogger(ValidateModel.class); - private static final SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyy HH:mm"); + /** + * Timestamp formatter. + */ + private final SimpleDateFormat timestampFormatter; /** * les scopes a utiliser */ @@ -133,6 +138,7 @@ public class ValidateModel extends AdminActionModel { public ValidateModel() { super(AdminStep.VALIDATE); scopes = EnumSet.noneOf(NuitonValidatorScope.class); + timestampFormatter = I18nDecoratorHelper.newTimestampFormat(I18n.getDefaultLocale()); } @Override @@ -369,7 +375,7 @@ public class ValidateModel extends AdminActionModel { } public String getNow() { - return df.format(new Date()); + return timestampFormatter.format(new Date()); } public boolean withoutMessages() { ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/validate/actions/Start.java ===================================== @@ -168,8 +168,6 @@ public class Start extends ValidateUIActionSupport { ValidationResult result; - //FIXME Ajouter la configuration dans le rapport généré - //FIXME Ajouter la configuration de la base dans le rapport généré ValidationRequestConfiguration configuration = stepModel.toValidationRequestConfiguration(); if (dataModel.getConfig().isLoadReferential()) { ===================================== client/runner/src/test/java/fr/ird/observe/client/ObserveTextGeneratorTest.java ===================================== @@ -66,6 +66,7 @@ public class ObserveTextGeneratorTest extends ClientTestSupport implements WithC request.setScopes(new LinkedHashSet<>(Arrays.asList(NuitonValidatorScope.ERROR, NuitonValidatorScope.WARNING))); request.setValidationContext(DtoValidationContext.UPDATE_VALIDATION_CONTEXT); configuration.setValidationSpeedEnable(true); + configuration.setValidationSpeedMaxValue(30f); configuration.setValidationLengthWeightEnable(true); ValidationResult result = dataSource.getValidateService().validateData(configuration, request); @@ -76,6 +77,7 @@ public class ObserveTextGeneratorTest extends ClientTestSupport implements WithC model.addScope(NuitonValidatorScope.ERROR); model.addScope(NuitonValidatorScope.WARNING); model.setContextName(request.getValidationContext()); + model.setValidationSpeedMaxValue(configuration.getValidationSpeedMaxValue()); model.setModelMode(ValidationModelMode.DATA); model.setValidationResult(result); String content = ValidateModelTemplate.generate(model); ===================================== toolkit/api-decoration/src/main/java/fr/ird/observe/decoration/ToolkitIdLabelDecoratorRenderer.java ===================================== @@ -24,6 +24,7 @@ package fr.ird.observe.decoration; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; +import fr.ird.observe.dto.I18nDecoratorHelper; import fr.ird.observe.dto.ToolkitIdLabel; import io.ultreia.java4all.decoration.DecoratorDefinition; import org.apache.logging.log4j.LogManager; @@ -33,7 +34,6 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.List; import java.util.Locale; -import java.util.Objects; import java.util.Set; /** @@ -44,10 +44,6 @@ import java.util.Set; */ public class ToolkitIdLabelDecoratorRenderer extends JavaBeanDecoratorRenderer<ToolkitIdLabel> { private static final Logger log = LogManager.getLogger(ToolkitIdLabelDecoratorRenderer.class); - public final SimpleDateFormat frenchDateFormat = new SimpleDateFormat("dd/MM/yyyy"); - public final SimpleDateFormat frenchTimestampFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm"); - public final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); - public final SimpleDateFormat timestampFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm"); public ToolkitIdLabelDecoratorRenderer(Set<String> codeProperties) { super(ToolkitIdLabel.class); @@ -63,12 +59,12 @@ public class ToolkitIdLabelDecoratorRenderer extends JavaBeanDecoratorRenderer<T } if (isDate(propertyName)) { // sort on date, can not use toString render to sort (wrong order when using date pattern dd/MM/yyyy) - sortByDate(pos, Objects.equals(locale.getLanguage(), "fr") ? frenchDateFormat : dateFormat, dataList); + sortByDate(pos, I18nDecoratorHelper.newDateFormat(locale), dataList); return; } if (isTimestamp(propertyName)) { // sort on timestamp, can not use toString render to sort (wrong order when using date pattern dd/MM/yyyy HH:mm) - sortByDate(pos, Objects.equals(locale.getLanguage(), "fr") ? frenchTimestampFormat : timestampFormat, dataList); + sortByDate(pos, I18nDecoratorHelper.newTimestampFormat(locale), dataList); return; } // always sort as using natural order from numbers ===================================== toolkit/api/src/main/java/fr/ird/observe/dto/I18nDecoratorHelper.java ===================================== @@ -28,9 +28,11 @@ import io.ultreia.java4all.i18n.spi.bean.BeanPropertyI18nKeyProducerProvider; import io.ultreia.java4all.lang.Numbers; import io.ultreia.java4all.lang.Strings; +import java.text.SimpleDateFormat; import java.util.Date; import java.util.Iterator; import java.util.Locale; +import java.util.Objects; import java.util.ServiceLoader; import static io.ultreia.java4all.i18n.I18n.getDefaultLocale; @@ -77,6 +79,12 @@ public abstract class I18nDecoratorHelper extends BeanPropertyI18nKeyProducerPro return INSTANCE; } + public static SimpleDateFormat newDateFormat(Locale locale) { + return Objects.equals(locale.getLanguage(), "fr") ? new SimpleDateFormat("dd/MM/yyyy") : new SimpleDateFormat("yyyy-MM-dd"); + } + public static SimpleDateFormat newTimestampFormat(Locale locale) { + return Objects.equals(locale.getLanguage(), "fr") ? new SimpleDateFormat("dd/MM/yyyy HH:mm") : new SimpleDateFormat("yyyy-MM-dd HH:mm"); + } public static String getTypeKey(Class<?> key) { return getPropertyI18nKey(key, "type"); View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/d6a58f5b5550a2a739be1a322... -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/d6a58f5b5550a2a739be1a322... You're receiving this email because of your account on gitlab.com.
participants (1)
-
Tony CHEMIT (@tchemit)