Observe-commits
Threads by month
- ----- 2026 -----
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
December 2023
- 1 participants
- 39 discussions
[Git][ultreiaio/ird-observe][feature/issue-2599] 9 commits: [toolkit-api-report] Introduce WithRequest and...
by Tony CHEMIT (@tchemit) 06 Dec '23
by Tony CHEMIT (@tchemit) 06 Dec '23
06 Dec '23
Tony CHEMIT pushed to branch feature/issue-2599 at ultreiaio / ird-observe
Commits:
8735d717 by Tony Chemit at 2023-12-06T14:29:14+01:00
[toolkit-api-report] Introduce WithRequest and ReportRequestExecutorI18nContext to be able to translate anything in hql requests and in some parameters
- - - - -
bd80057f by Tony Chemit at 2023-12-06T14:29:14+01:00
[toolkit-persistence] Adapt DefaultReportRequestExecutor to use new i18n API
- - - - -
51a80bb7 by Tony Chemit at 2023-12-06T14:29:14+01:00
[core-persistence-report] Implements ReportI18nKeysProducer to add default i18n mapping used in embedded reports and adapt reports definition file (using new i18n API)
[core-services-i18n] update then i18n bundle
- - - - -
892a74e7 by Tony Chemit at 2023-12-06T14:29:14+01:00
[core-services-test] Update report fixtures
- - - - -
1a8b3696 by Tony Chemit at 2023-12-06T14:29:14+01:00
[toolkit-api-report] Introduce a way to translate report meta-data (such as name, description, columnsHeader and rowsHeader)
- - - - -
6f106303 by Tony Chemit at 2023-12-06T14:29:14+01:00
[client-datasource-actions] Use new I18n API in Report on ui and export template
- - - - -
74dea2b0 by Tony Chemit at 2023-12-06T14:29:14+01:00
[client-datasource-actions] Use reportDefinition id instead of his name to compute reportRenderers
- - - - -
b3ffff3f by Tony Chemit at 2023-12-06T14:29:14+01:00
[core-persistence-report] Add new properties in report definition file to fill english and spanish translations
- - - - -
28a8c734 by Tony Chemit at 2023-12-06T14:29:14+01:00
[client-datasource-actions] Use now a separated file for report html export css style
- - - - -
21 changed files:
- client/datasource/actions/src/main/i18n/templates/reportHtmlExport_en_GB.ftl
- client/datasource/actions/src/main/i18n/templates/reportHtmlExport_es_ES.ftl
- client/datasource/actions/src/main/i18n/templates/reportHtmlExport_fr_FR.ftl
- client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/HtmlExportModel.java
- client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/ReportModel.java
- client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/ReportUIHandler.java
- client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/ResultTableModel.java
- + client/datasource/actions/src/main/resources/fr/ird/observe/client/datasource/actions/report/HtmlExportModel.css
- client/runner/pom.xml
- + core/persistence/report/.mvn/i18n/parse-java
- + core/persistence/report/src/main/i18n/getters/java.getter
- + core/persistence/report/src/main/java/fr/ird/observe/persistence/report/ReportI18nKeys.java
- core/persistence/report/src/main/resources/observe-reports.properties
- core/services/i18n/pom.xml
- core/services/i18n/src/main/i18n/translations/services_en_GB.properties
- core/services/i18n/src/main/i18n/translations/services_es_ES.properties
- core/services/i18n/src/main/i18n/translations/services_fr_FR.properties
- core/services/local/src/test/java/fr/ird/observe/services/local/service/ReportServiceLocalReadTest.java
- core/services/test/src/main/resources/fixtures/fr/ird/observe/services/service/ReportService-llLanding.properties
- core/services/test/src/main/resources/fixtures/fr/ird/observe/services/service/ReportService-llLogbookActivities.properties
- core/services/test/src/main/resources/fixtures/fr/ird/observe/services/service/ReportService-llLogbookCatches.properties
The diff was not included because it is too large.
View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/51a0a3460b0824fc0c617623…
--
View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/51a0a3460b0824fc0c617623…
You're receiving this email because of your account on gitlab.com.
1
0
[Git][ultreiaio/ird-observe] Pushed new branch feature/issue-2599
by Tony CHEMIT (@tchemit) 05 Dec '23
by Tony CHEMIT (@tchemit) 05 Dec '23
05 Dec '23
Tony CHEMIT pushed new branch feature/issue-2599 at ultreiaio / ird-observe
--
View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/tree/feature/issue-2599
You're receiving this email because of your account on gitlab.com.
1
0
[Git][ultreiaio/ird-observe][develop] Improve report html export - final touch - Closes #2811
by Tony CHEMIT (@tchemit) 05 Dec '23
by Tony CHEMIT (@tchemit) 05 Dec '23
05 Dec '23
Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe
Commits:
cf3e20b0 by Tony Chemit at 2023-12-05T12:37:28+01:00
Improve report html export - final touch - Closes #2811
- - - - -
1 changed file:
- client/datasource/actions/src/main/resources/fr/ird/observe/client/datasource/actions/report/HtmlExportModel.js
Changes:
=====================================
client/datasource/actions/src/main/resources/fr/ird/observe/client/datasource/actions/report/HtmlExportModel.js
=====================================
@@ -46,12 +46,9 @@ class GridHandler {
document.getElementById("rowCount").innerHTML = this.rowCount;
this.resizableOption['checked'] = true;
this.sortOption['checked'] = false;
+ this.paginationOption['checked'] = false;
this.paginationSizeOption.value = 20;
- if (this.rowCount > 200) {
- this.paginationOption['checked'] = true;
- } else {
- this.paginationSizeOption.disabled = true;
- }
+ this.paginationSizeOption.disabled = true;
this.config = {
language: language,
columns: columnsSupplier(json),
View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/cf3e20b00a8104e1dc934e031…
--
View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/cf3e20b00a8104e1dc934e031…
You're receiving this email because of your account on gitlab.com.
1
0
05 Dec '23
Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe
Commits:
568bf70f by Tony Chemit at 2023-12-05T12:04:17+01:00
update pom
- - - - -
14a57d2a by Tony Chemit at 2023-12-05T12:11:45+01:00
Le service init.information de l'API retourne les informations sur la base cible, alors qu'on ne devrait que retourner son nom - Closes #2817
- - - - -
e9eb4688 by Tony Chemit at 2023-12-05T12:22:29+01:00
VesselActivity sur création d'activity par l'importeur AVDTH - Closes #2814
- - - - -
4 changed files:
- core/persistence/avdth/src/main/java/fr/ird/observe/persistence/avdth/data/ImportReferentialContext.java
- core/persistence/avdth/src/main/java/fr/ird/observe/persistence/avdth/data/logbook/ActivityReader.java
- pom.xml
- server/core/src/main/java/fr/ird/observe/server/controller/DataSourceServiceRestApi.java
Changes:
=====================================
core/persistence/avdth/src/main/java/fr/ird/observe/persistence/avdth/data/ImportReferentialContext.java
=====================================
@@ -138,7 +138,7 @@ public class ImportReferentialContext {
private ObservedSystem observedSystem102;
private ObservedSystem observedSystem103;
private ObservedSystem observedSystem110;
- private VesselActivity vesselActivity6;
+ private VesselActivity vesselActivity52;
private VesselActivity vesselActivity101;
private VesselActivity vesselActivity102;
private SchoolType schoolType0;
@@ -192,7 +192,7 @@ public class ImportReferentialContext {
// activity
vesselActivity = Maps.uniqueIndex(referential.getVesselActivity(), VesselActivity::getCode);
- vesselActivity6 = vesselActivity.get("6");
+ vesselActivity52 = vesselActivity.get("52");
vesselActivity101 = vesselActivity.get("101");
vesselActivity102 = vesselActivity.get("102");
schoolType = Maps.uniqueIndex(referential.getSchoolType(), SchoolType::getCode);
@@ -592,8 +592,9 @@ public class ImportReferentialContext {
return Objects.requireNonNull(weightCategory, String.format("Can't find weight category for code: %s", categoryCode));
}
- public VesselActivity getVesselActivity6() {
- return vesselActivity6;
+
+ public VesselActivity getVesselActivity52() {
+ return vesselActivity52;
}
public VesselActivity getVesselActivity101() {
=====================================
core/persistence/avdth/src/main/java/fr/ird/observe/persistence/avdth/data/logbook/ActivityReader.java
=====================================
@@ -322,7 +322,7 @@ public class ActivityReader extends DataReader<Activity> {
Activity entity = newEntity(Activity.SPI);
entity.setNumber(activityNumber);
- entity.setVesselActivity(dataContext.getVesselActivity6());
+ entity.setVesselActivity(dataContext.getVesselActivity52());
entity.setComment("Generated from AVDTH ECH_CALEE record");
entity.setSetCount(1);
loadCoordinate(resultSet, 7, entity);
=====================================
pom.xml
=====================================
@@ -23,7 +23,7 @@
<parent>
<groupId>io.ultreia.maven</groupId>
<artifactId>pom</artifactId>
- <version>2023.54</version>
+ <version>2023.55</version>
</parent>
<groupId>fr.ird.observe</groupId>
<artifactId>ird-observe</artifactId>
=====================================
server/core/src/main/java/fr/ird/observe/server/controller/DataSourceServiceRestApi.java
=====================================
@@ -49,7 +49,7 @@ public class DataSourceServiceRestApi extends GeneratedDataSourceServiceRestApi
Map<String, Object> result = new LinkedHashMap<>();
result.put("url", ObserveDataSourceConfigurationInjector.getUrl(getContext()));
result.put("login", session.getUser().getLogin());
- result.put("database", session.getUserPermission().getDatabase());
+ result.put("database", session.getUserPermission().getDatabase().getName());
result.put("apiAccess", session.getUserPermission().getApiAccess());
result.put("validationMode", session.getUserPermission().getValidationMode());
result.put("authenticationToken", session.getConnection().getAuthenticationToken());
View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/ba11dbb303d01e49b683e6d6…
--
View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/ba11dbb303d01e49b683e6d6…
You're receiving this email because of your account on gitlab.com.
1
0
[Git][ultreiaio/ird-observe][develop] Improve report html export - final touch - Closes #2811
by Tony CHEMIT (@tchemit) 05 Dec '23
by Tony CHEMIT (@tchemit) 05 Dec '23
05 Dec '23
Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe
Commits:
ba11dbb3 by Tony Chemit at 2023-12-05T11:39:23+01:00
Improve report html export - final touch - Closes #2811
Add DataMatrix gson adapter (to reduce format)
introduce ColumnRendererConsumer and ColumnRendererParameters API (add gson adapter) -
- - - - -
22 changed files:
- client/datasource/actions/src/main/i18n/templates/reportHtmlExport_en_GB.ftl
- client/datasource/actions/src/main/i18n/templates/reportHtmlExport_es_ES.ftl
- client/datasource/actions/src/main/i18n/templates/reportHtmlExport_fr_FR.ftl
- client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/HtmlExportModel.java
- + client/datasource/actions/src/main/resources/fr/ird/observe/client/datasource/actions/report/HtmlExportModel.js
- core/persistence/report/src/main/resources/observe-reports.properties
- core/services/test/src/main/java/fr/ird/observe/services/service/ReportServiceFixtures.java
- + src/site/markdown/report/embedded-column-renderers.md
- src/site/markdown/report/syntax.md
- toolkit/api-report/pom.xml
- toolkit/api-report/src/main/java/fr/ird/observe/report/ColumnRendererConsumer.java
- toolkit/api-report/src/main/java/fr/ird/observe/report/ColumnRendererConsumers.java
- toolkit/api-report/src/main/java/fr/ird/observe/report/ReportColumnRenderersParameters.java
- + toolkit/api-report/src/main/java/fr/ird/observe/report/json/ReportColumnRenderersParametersAdapter.java
- toolkit/api-report/src/main/java/fr/ird/observe/report/renderers/HighlightIfAbsoluteDeltaIsPositive.java
- toolkit/api-report/src/main/java/fr/ird/observe/report/renderers/HighlightIfNotI18nReferentialValue.java → toolkit/api-report/src/main/java/fr/ird/observe/report/renderers/HighlightIfEquals18nReferentialValue.java
- toolkit/api-report/src/main/java/fr/ird/observe/report/renderers/HighlightIfNumericalValueIsPositive.java
- toolkit/api-report/src/main/resources/fr/ird/observe/report/renderers/HighlightIfAbsoluteDeltaIsPositive.js
- toolkit/api-report/src/main/resources/fr/ird/observe/report/renderers/HighlightIfNotI18nReferentialValue.js → toolkit/api-report/src/main/resources/fr/ird/observe/report/renderers/HighlightIfEquals18nReferentialValue.js
- toolkit/api-report/src/main/resources/fr/ird/observe/report/renderers/HighlightIfNumericalValueIsPositive.js
- toolkit/api/src/main/java/fr/ird/observe/dto/ObserveUtil.java
- + toolkit/api/src/main/java/fr/ird/observe/spi/json/java4all/DataMatrixAdapter.java
Changes:
=====================================
client/datasource/actions/src/main/i18n/templates/reportHtmlExport_en_GB.ftl
=====================================
@@ -199,95 +199,11 @@
}
</style>
<script type="application/javascript">
-
- function searchValue() {
- return searchOption.checked;
- }
-
- function resizableValue() {
- return resizableOption.checked;
- }
-
- function sortValue() {
- return sortOption.checked;
- }
-
- function paginationValue() {
- return paginationOption.checked ? {limit: paginationSizeOption.value} : false;
- }
-
- function toggleSearch(config, source) {
- let newValue = source.checked;
- // console.info("Toggle search to: " + newValue);
- updateGrid(config);
- }
-
- function toggleResizable(config, source) {
- let newValue = source.checked;
- // console.info("Toggle resizable to: " + newValue);
- updateGrid(config);
- }
-
- function toggleSort(config, source) {
- let newValue = source.checked;
- // console.info("Toggle sort to: " + newValue);
- updateGrid(config);
- }
-
- function togglePagination(config, source) {
- let newValue = source.checked;
- // console.info("Toggle pagination to: " + newValue);
- if (newValue) {
- paginationSizeOption["disabled"] = null;
- } else {
- paginationSizeOption.disabled = true;
- }
- updateGrid(config);
- }
-
- function changePaginationSize(config, source) {
- let newValue = source.value;
- // console.info("Change pagination size to: " + newValue);
- updateGrid(config);
- }
-
- function updateGrid(config) {
- let searchValue1 = searchValue();
- let sortValue1 = sortValue();
- let resizableValue1 = resizableValue();
- // FIXME Need to update config.columns otherwise we will keep previous options (sort, resizable...)
- let newConfig = {
- language: config.language,
- data: config.data,
- columns: config.columns,
- search: searchValue1,
- resizable: resizableValue1,
- sort: sortValue1,
- pagination: paginationValue()
- };
- gridContainerParent.innerHTML = '<div id="wrapper"></div>';
- // console.info(newConfig);
- setTimeout(() => {
- <#--noinspection JSUnresolvedReference-->
- grid = new gridjs.Grid(newConfig).render(document.getElementById("wrapper"));
- }, 50);
- }
+ ${.data_model.script}
<#list .data_model.columnRendererFunctions as key>
-${key}</#list>
-
- function createColumns(json) {
- let result = !!json["columnNames"] ? json["columnNames"] : [];
- if (result.length === 0) {
- return result;
- }
- let renderers = json["columnRendererDefinitions"];
- let i = 0;
- let data = json.data;
- <#list .data_model.columnRendererInitCode as value>
- ${value}</#list>
- return result;
- }
+ ${key}
+ </#list>
</script>
</head>
<body>
@@ -330,11 +246,12 @@ ${key}</#list>
<div class="widget-list" id="tab-result">
<div class="config-panel">
- <label><input id="search" type="checkbox" checked/> Search</label>|
- <label><input id="resizable" type="checkbox" checked/> Resizable columns</label>|
- <label><input id="sort" type="checkbox" checked/> Sort</label>|
+ <label><input id="search" type="checkbox"/> Search</label>|
+ <label><input id="resizable" type="checkbox"/> Resizable columns</label>|
+ <label><input id="sort" type="checkbox"/> Sort</label>|
<label><input id="pagination" type="checkbox"/> Pagination</label>|
- <label>Page size <input id="paginationSize" type="number" disabled value="20"/></label>
+ <label>Page size <input id="paginationSize" type="number"/></label>|
+ <label>Result count: <b><span id="rowCount" style="font-style: italic"></span></b></label>
</div>
<div id="wrapperParent">
<div id="wrapper"></div>
@@ -347,61 +264,20 @@ ${key}</#list>
</div>
<script type="application/javascript">
- const json = ${.data_model.json};
-
- const gridContainerParent = document.getElementById("wrapperParent");
- const searchOption = document.getElementById("search");
- const resizableOption = document.getElementById("resizable");
- const paginationOption = document.getElementById("pagination");
- const paginationSizeOption = document.getElementById("paginationSize");
- const sortOption = document.getElementById("sort");
-
- let grid = new gridjs.Grid({
- search: searchValue(),
- resizable: resizableValue(),
- sort: sortValue(),
- pagination: paginationValue(),
- <#--language: {-->
- <#-- 'search': {-->
- <#-- 'placeholder': '🔍 Recherche...'-->
- <#-- },-->
- <#-- sort: {-->
- <#-- sortAsc: 'Tri ascendant',-->
- <#-- sortDesc: 'Tri descendant',-->
- <#-- },-->
- <#-- pagination: {-->
- <#-- previous: 'Précédent',-->
- <#-- next: 'Suivant',-->
- <#-- navigate: (page, pages) => `Page ${r"${page}"} sur ${r"${pages}"}`,-->
- <#-- page: (page) => `Page ${r"${page}"}`,-->
- <#-- showing: 'Affichage des lignes de',-->
- <#-- of: 'sur',-->
- <#-- to: 'à',-->
- <#-- results: 'lignes.',-->
- <#-- },-->
- <#-- loading: 'Chargement...'-->
- <#--},-->
- columns: createColumns(json),
- data: json.data.data
- });
- updateGrid(grid.config);
-
- searchOption.addEventListener("change", function () {
- toggleSearch(grid.config, this);
- });
- resizableOption.addEventListener("change", function () {
- toggleResizable(grid.config, this);
- });
- sortOption.addEventListener("change", function () {
- toggleSort(grid.config, this);
- });
- paginationOption.addEventListener("change", function () {
- togglePagination(grid.config, this);
- });
-
- paginationSizeOption.addEventListener("change", function () {
- changePaginationSize(grid.config, this);
- });
+ new GridHandler(
+ document,
+ {},
+ function (json) {
+ let result = !!json["columnNames"] ? json["columnNames"] : [];
+ if (result.length === 0) {
+ return result;
+ }
+ let data = json.data;
+ <#list .data_model.columnRendererInitCode as value>
+ ${value}</#list>
+ return result;
+ },
+ ${.data_model.json}).init();
</script>
</body>
</html>
=====================================
client/datasource/actions/src/main/i18n/templates/reportHtmlExport_es_ES.ftl
=====================================
@@ -199,95 +199,11 @@
}
</style>
<script type="application/javascript">
-
- function searchValue() {
- return searchOption.checked;
- }
-
- function resizableValue() {
- return resizableOption.checked;
- }
-
- function sortValue() {
- return sortOption.checked;
- }
-
- function paginationValue() {
- return paginationOption.checked ? {limit: paginationSizeOption.value} : false;
- }
-
- function toggleSearch(config, source) {
- let newValue = source.checked;
- // console.info("Toggle search to: " + newValue);
- updateGrid(config);
- }
-
- function toggleResizable(config, source) {
- let newValue = source.checked;
- // console.info("Toggle resizable to: " + newValue);
- updateGrid(config);
- }
-
- function toggleSort(config, source) {
- let newValue = source.checked;
- // console.info("Toggle sort to: " + newValue);
- updateGrid(config);
- }
-
- function togglePagination(config, source) {
- let newValue = source.checked;
- // console.info("Toggle pagination to: " + newValue);
- if (newValue) {
- paginationSizeOption["disabled"] = null;
- } else {
- paginationSizeOption.disabled = true;
- }
- updateGrid(config);
- }
-
- function changePaginationSize(config, source) {
- let newValue = source.value;
- // console.info("Change pagination size to: " + newValue);
- updateGrid(config);
- }
-
- function updateGrid(config) {
- let searchValue1 = searchValue();
- let sortValue1 = sortValue();
- let resizableValue1 = resizableValue();
- // FIXME Need to update config.columns otherwise we will keep previous options (sort, resizable...)
- let newConfig = {
- language: config.language,
- data: config.data,
- columns: config.columns,
- search: searchValue1,
- resizable: resizableValue1,
- sort: sortValue1,
- pagination: paginationValue()
- };
- gridContainerParent.innerHTML = '<div id="wrapper"></div>';
- // console.info(newConfig);
- setTimeout(() => {
- <#--noinspection JSUnresolvedReference-->
- grid = new gridjs.Grid(newConfig).render(document.getElementById("wrapper"));
- }, 50);
- }
+ ${.data_model.script}
<#list .data_model.columnRendererFunctions as key>
-${key}</#list>
-
- function createColumns(json) {
- let result = !!json["columnNames"] ? json["columnNames"] : [];
- if (result.length === 0) {
- return result;
- }
- let renderers = json["columnRendererDefinitions"];
- let i = 0;
- let data = json.data;
- <#list .data_model.columnRendererInitCode as value>
- ${value}</#list>
- return result;
- }
+ ${key}
+ </#list>
</script>
</head>
<body>
@@ -329,11 +245,12 @@ ${key}</#list>
</div>
<div class="widget-list" id="tab-result">
<div class="config-panel">
- <label><input id="search" type="checkbox" checked/> Search</label>|
- <label><input id="resizable" type="checkbox" checked/> Resizable columns</label>|
- <label><input id="sort" type="checkbox" checked/> Sort</label>|
+ <label><input id="search" type="checkbox"/> Search</label>|
+ <label><input id="resizable" type="checkbox"/> Resizable columns</label>|
+ <label><input id="sort" type="checkbox"/> Sort</label>|
<label><input id="pagination" type="checkbox"/> Pagination</label>|
- <label>Page size <input id="paginationSize" type="number" disabled value="20"/></label>
+ <label>Page size <input id="paginationSize" type="number"/></label>|
+ <label>Result count: <b><span id="rowCount" style="font-style: italic"></span></b></label>
</div>
<div id="wrapperParent">
<div id="wrapper"></div>
@@ -346,61 +263,20 @@ ${key}</#list>
</div>
<script type="application/javascript">
- const json = ${.data_model.json};
-
- const gridContainerParent = document.getElementById("wrapperParent");
- const searchOption = document.getElementById("search");
- const resizableOption = document.getElementById("resizable");
- const paginationOption = document.getElementById("pagination");
- const paginationSizeOption = document.getElementById("paginationSize");
- const sortOption = document.getElementById("sort");
-
- let grid = new gridjs.Grid({
- search: searchValue(),
- resizable: resizableValue(),
- sort: sortValue(),
- pagination: paginationValue(),
- <#--language: {-->
- <#-- 'search': {-->
- <#-- 'placeholder': '🔍 Recherche...'-->
- <#-- },-->
- <#-- sort: {-->
- <#-- sortAsc: 'Tri ascendant',-->
- <#-- sortDesc: 'Tri descendant',-->
- <#-- },-->
- <#-- pagination: {-->
- <#-- previous: 'Précédent',-->
- <#-- next: 'Suivant',-->
- <#-- navigate: (page, pages) => `Page ${r"${page}"} sur ${r"${pages}"}`,-->
- <#-- page: (page) => `Page ${r"${page}"}`,-->
- <#-- showing: 'Affichage des lignes de',-->
- <#-- of: 'sur',-->
- <#-- to: 'à',-->
- <#-- results: 'lignes.',-->
- <#-- },-->
- <#-- loading: 'Chargement...'-->
- <#--},-->
- columns: createColumns(json),
- data: json.data.data
- });
- updateGrid(grid.config);
-
- searchOption.addEventListener("change", function () {
- toggleSearch(grid.config, this);
- });
- resizableOption.addEventListener("change", function () {
- toggleResizable(grid.config, this);
- });
- sortOption.addEventListener("change", function () {
- toggleSort(grid.config, this);
- });
- paginationOption.addEventListener("change", function () {
- togglePagination(grid.config, this);
- });
-
- paginationSizeOption.addEventListener("change", function () {
- changePaginationSize(grid.config, this);
- });
+ new GridHandler(
+ document,
+ {},
+ function (json) {
+ let result = !!json["columnNames"] ? json["columnNames"] : [];
+ if (result.length === 0) {
+ return result;
+ }
+ let data = json.data;
+ <#list .data_model.columnRendererInitCode as value>
+ ${value}</#list>
+ return result;
+ },
+ ${.data_model.json}).init();
</script>
</body>
</html>
=====================================
client/datasource/actions/src/main/i18n/templates/reportHtmlExport_fr_FR.ftl
=====================================
@@ -200,95 +200,11 @@
}
</style>
<script type="application/javascript">
-
- function searchValue() {
- return searchOption.checked;
- }
-
- function resizableValue() {
- return resizableOption.checked;
- }
-
- function sortValue() {
- return sortOption.checked;
- }
-
- function paginationValue() {
- return paginationOption.checked ? {limit: paginationSizeOption.value} : false;
- }
-
- function toggleSearch(config, source) {
- let newValue = source.checked;
- // console.info("Toggle search to: " + newValue);
- updateGrid(config);
- }
-
- function toggleResizable(config, source) {
- let newValue = source.checked;
- // console.info("Toggle resizable to: " + newValue);
- updateGrid(config);
- }
-
- function toggleSort(config, source) {
- let newValue = source.checked;
- // console.info("Toggle sort to: " + newValue);
- updateGrid(config);
- }
-
- function togglePagination(config, source) {
- let newValue = source.checked;
- // console.info("Toggle pagination to: " + newValue);
- if (newValue) {
- paginationSizeOption["disabled"] = null;
- } else {
- paginationSizeOption.disabled = true;
- }
- updateGrid(config);
- }
-
- function changePaginationSize(config, source) {
- let newValue = source.value;
- // console.info("Change pagination size to: " + newValue);
- updateGrid(config);
- }
-
- function updateGrid(config) {
- let searchValue1 = searchValue();
- let sortValue1 = sortValue();
- let resizableValue1 = resizableValue();
- // FIXME Need to update config.columns otherwise we will keep previous options (sort, resizable...)
- let newConfig = {
- language: config.language,
- data: config.data,
- columns: config.columns,
- search: searchValue1,
- resizable: resizableValue1,
- sort: sortValue1,
- pagination: paginationValue()
- };
- gridContainerParent.innerHTML = '<div id="wrapper"></div>';
- // console.info(newConfig);
- setTimeout(() => {
- <#--noinspection JSUnresolvedReference-->
- grid = new gridjs.Grid(newConfig).render(document.getElementById("wrapper"));
- }, 50);
- }
+ ${.data_model.script}
<#list .data_model.columnRendererFunctions as key>
-${key}</#list>
-
- function createColumns(json) {
- let result = !!json["columnNames"] ? json["columnNames"] : [];
- if (result.length === 0) {
- return result;
- }
- let renderers = json["columnRendererDefinitions"];
- let i = 0;
- let data = json.data;
- <#list .data_model.columnRendererInitCode as value>
- ${value}</#list>
- return result;
- }
+ ${key}
+ </#list>
</script>
</head>
<body>
@@ -330,11 +246,13 @@ ${key}</#list>
</div>
<div class="widget-list" id="tab-result">
<div class="config-panel">
- <label><input id="search" type="checkbox" checked/> Recherche</label>|
- <label><input id="resizable" type="checkbox" checked/> Colonnes redimensionnables</label>|
- <label><input id="sort" type="checkbox" checked/> Tri des colonnes</label>|
+ <label><input id="search" type="checkbox"/> Recherche</label>|
+ <label><input id="resizable" type="checkbox"/> Colonnes redimensionnables</label>|
+ <label><input id="sort" type="checkbox"/> Tri des colonnes</label>|
<label><input id="pagination" type="checkbox"/> Pagination</label>|
- <label>Nombre de lignes par page <input id="paginationSize" type="number" disabled value="20"/></label>
+ <label>Nombre de lignes par page <input id="paginationSize" type="number"/></label>|
+ <label>Nombre de résultat(s) : <b><span id="rowCount" style="font-style: italic"></span></b></label>
+
</div>
<div id="wrapperParent">
<div id="wrapper"></div>
@@ -347,21 +265,9 @@ ${key}</#list>
</div>
<script type="application/javascript">
- const json = ${.data_model.json};
-
- const gridContainerParent = document.getElementById("wrapperParent");
- const searchOption = document.getElementById("search");
- const resizableOption = document.getElementById("resizable");
- const paginationOption = document.getElementById("pagination");
- const paginationSizeOption = document.getElementById("paginationSize");
- const sortOption = document.getElementById("sort");
-
- let grid = new gridjs.Grid({
- search: searchValue(),
- resizable: resizableValue(),
- sort: sortValue(),
- pagination: paginationValue(),
- language: {
+ new GridHandler(
+ document,
+ {
'search': {
'placeholder': '🔍 Recherche...'
},
@@ -381,27 +287,17 @@ ${key}</#list>
},
loading: 'Chargement...'
},
- columns: createColumns(json),
- data: json.data.data
- });
- updateGrid(grid.config);
-
- searchOption.addEventListener("change", function () {
- toggleSearch(grid.config, this);
- });
- resizableOption.addEventListener("change", function () {
- toggleResizable(grid.config, this);
- });
- sortOption.addEventListener("change", function () {
- toggleSort(grid.config, this);
- });
- paginationOption.addEventListener("change", function () {
- togglePagination(grid.config, this);
- });
-
- paginationSizeOption.addEventListener("change", function () {
- changePaginationSize(grid.config, this);
- });
+ function (json) {
+ let result = !!json["columnNames"] ? json["columnNames"] : [];
+ if (result.length === 0) {
+ return result;
+ }
+ let data = json.data;
+ <#list .data_model.columnRendererInitCode as value>
+ ${value}</#list>
+ return result;
+ },
+ ${.data_model.json}).init();
</script>
</body>
</html>
=====================================
client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/HtmlExportModel.java
=====================================
@@ -24,14 +24,17 @@ package fr.ird.observe.client.datasource.actions.report;
import com.google.gson.Gson;
import fr.ird.observe.client.datasource.actions.config.SelectDataModel;
+import fr.ird.observe.dto.ObserveUtil;
import fr.ird.observe.report.ColumnRendererConsumers;
import fr.ird.observe.report.Report;
import fr.ird.observe.report.ReportColumnRenderersParameters;
-import fr.ird.observe.report.definition.ColumnRendererDefinition;
import io.ultreia.java4all.application.template.spi.GenerateTemplate;
+import io.ultreia.java4all.util.SingletonSupplier;
import io.ultreia.java4all.util.matrix.DataMatrix;
+import java.net.URL;
import java.util.List;
+import java.util.Objects;
import java.util.Set;
/**
@@ -44,6 +47,7 @@ import java.util.Set;
*/
@GenerateTemplate(template = "reportHtmlExport.ftl")
public class HtmlExportModel {
+ private static SingletonSupplier<String> SCRIPT_CONTENT;
/**
* Selected report.
*/
@@ -52,16 +56,14 @@ public class HtmlExportModel {
* Selected data model.
*/
private final transient SelectDataModel selectDataModel;
-
+ private final transient Set<String> columnRendererFunctions;
+ private final transient List<String> columnRendererInitCode;
private final List<String> columnNames;
private final List<String> rowNames;
private final DataMatrix data;
private final boolean withColumnHeader;
private final boolean withRowHeader;
private final transient String json;
- private final List<Object> columnRendererDefinitions;
- private final transient Set<String> columnRendererFunctions;
- private final transient List<String> columnRendererInitCode;
public HtmlExportModel(Gson gson,
Report selectedReport,
@@ -80,24 +82,26 @@ public class HtmlExportModel {
this.withColumnHeader = withColumnHeader;
this.withRowHeader = withRowHeader;
if (reportColumnRenderersParameters != null) {
- this.columnRendererDefinitions = reportColumnRenderersParameters.consumeColumnRenderersHtml();
- ColumnRendererDefinition[] columnRenderers = selectedReport.definition().getColumnRenderers();
- this.columnRendererFunctions = ColumnRendererConsumers.htmlFunctions(columnRenderers);
- this.columnRendererInitCode = ColumnRendererConsumers.htmlInitCode(columnRenderers);
+ this.columnRendererFunctions = ColumnRendererConsumers.htmlFunctions(reportColumnRenderersParameters);
+ this.columnRendererInitCode = ColumnRendererConsumers.htmlInitCode(reportColumnRenderersParameters);
} else {
- this.columnRendererDefinitions = List.of();
this.columnRendererFunctions = Set.of();
this.columnRendererInitCode = List.of();
}
this.json = gson.toJson(this);
}
- public String getJson() {
- return json;
+ public String getScript() {
+ if (SCRIPT_CONTENT == null) {
+ String resourceName = getClass().getSimpleName() + ".js";
+ URL url = Objects.requireNonNull(getClass().getResource(resourceName), "Could not find resource: " + resourceName);
+ SCRIPT_CONTENT = ObserveUtil.loadResourceContentSupplier(url, ObserveUtil.removeJavaLicense());
+ }
+ return SCRIPT_CONTENT.get();
}
- public List<Object> getColumnRendererDefinitions() {
- return columnRendererDefinitions;
+ public String getJson() {
+ return json;
}
public Set<String> getColumnRendererFunctions() {
=====================================
client/datasource/actions/src/main/resources/fr/ird/observe/client/datasource/actions/report/HtmlExportModel.js
=====================================
@@ -0,0 +1,192 @@
+/*-
+ * #%L
+ * ObServe Client :: DataSource :: Actions
+ * %%
+ * Copyright (C) 2008 - 2023 IRD, Ultreia.io
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/gpl-3.0.html>.
+ * #L%
+ */
+class GridHandler {
+ /**
+ * Where to store configuration of the grid.
+ */
+ config;
+ rowCount;
+ searchOption;
+ resizableOption;
+ paginationOption;
+ paginationSizeOption;
+ sortOption;
+ gridContainerParent;
+
+ constructor(document, language, columnsSupplier, json) {
+ this.gridContainerParent = document.getElementById("wrapperParent");
+ this.searchOption = document.getElementById("search");
+ this.resizableOption = document.getElementById("resizable");
+ this.paginationOption = document.getElementById("pagination");
+ this.paginationSizeOption = document.getElementById("paginationSize");
+ this.sortOption = document.getElementById("sort");
+ json.data.data = this.deserializeJson(json.data);
+
+ this.rowCount = json.data['height'];
+ this.searchOption['checked'] = true;
+ document.getElementById("rowCount").innerHTML = this.rowCount;
+ this.resizableOption['checked'] = true;
+ this.sortOption['checked'] = false;
+ this.paginationSizeOption.value = 20;
+ if (this.rowCount > 200) {
+ this.paginationOption['checked'] = true;
+ } else {
+ this.paginationSizeOption.disabled = true;
+ }
+ this.config = {
+ language: language,
+ columns: columnsSupplier(json),
+ data: json.data.data,
+ search: this.searchValue(),
+ resizable: this.resizableValue(),
+ sort: this.sortValue(),
+ pagination: this.paginationValue()
+ }
+ }
+
+ updateGrid() {
+ this.gridContainerParent.innerHTML = '<div id="wrapper"></div>';
+ setTimeout(() => {
+ // noinspection JSUnresolvedReference
+ new gridjs.Grid(this.toGridConfig()).render(document.getElementById("wrapper"));
+ }, 50);
+ }
+
+ toGridConfig() {
+ return {
+ language: this.config.language,
+ data: this.config.data,
+ columns: this.deepCopyColumns(this.config.columns),
+ search: this.config.search,
+ resizable: this.config.resizable,
+ sort: this.config.sort,
+ pagination: this.config.pagination,
+ }
+ }
+
+ deepCopyColumns(columns) {
+ let result = [];
+ let index = 0;
+ for (const column of columns) {
+ if (column instanceof Object) {
+ let newColumn = {};
+ newColumn['name'] = column['name'];
+ if (!!!column['formatter'] != null) {
+ newColumn['formatter'] = column['formatter'];
+ }
+ if (column['attributes'] != null) {
+ newColumn['attributes'] = column['attributes'];
+ }
+ result[index++] = newColumn;
+ } else {
+ result[index++] = column;
+ }
+ }
+ return result;
+ }
+
+ deserializeJson(json) {
+ let height = json.height;
+ let width = json.width;
+ let data = json.rows;
+ let result = new Array(height);
+ for (let row = 0; row < height; row++) {
+ let cells = data[row].split('||');
+ let realRow = new Array(width);
+ result[row] = realRow;
+ for (let column = 0; column < width; column++) {
+ let rowElement = cells[column];
+ realRow[column] = rowElement === '$' ? null : rowElement;
+ }
+ }
+ return result;
+ }
+
+ searchValue() {
+ return this.searchOption.checked;
+ }
+
+ resizableValue() {
+ return this.resizableOption.checked;
+ }
+
+ sortValue() {
+ return this.sortOption.checked;
+ }
+
+ paginationValue() {
+ return this.paginationOption.checked ? {limit: this.paginationSizeOption.value} : false;
+ }
+
+ toggleSearch(source) {
+ this.config.search = this.searchValue();
+ this.updateGrid();
+ }
+
+ toggleResizable(source) {
+ this.config.resizable = this.resizableValue();
+ this.updateGrid();
+ }
+
+ toggleSort(source) {
+ this.config.sort = this.sortValue();
+ this.updateGrid();
+ }
+
+ togglePagination(source) {
+ let newValue = source.checked;
+ if (newValue) {
+ this.paginationSizeOption["disabled"] = null;
+ } else {
+ this.paginationSizeOption.disabled = true;
+ }
+ this.config.pagination = this.paginationValue();
+ this.updateGrid();
+ }
+
+ changePaginationSize(source) {
+ this.config.pagination = this.paginationValue();
+ this.updateGrid();
+ }
+
+ init() {
+
+ this.updateGrid();
+ let that = this;
+ this.searchOption.addEventListener("change", function () {
+ that.toggleSearch(this);
+ });
+ this.resizableOption.addEventListener("change", function () {
+ that.toggleResizable(this);
+ });
+ this.sortOption.addEventListener("change", function () {
+ that.toggleSort(this);
+ });
+ this.paginationOption.addEventListener("change", function () {
+ that.togglePagination(this);
+ });
+
+ this.paginationSizeOption.addEventListener("change", function () {
+ that.changePaginationSize(this);
+ });
+ }
+}
=====================================
core/persistence/report/src/main/resources/observe-reports.properties
=====================================
@@ -888,8 +888,8 @@ Left Join t.localMarketSurveySamplingAcquisitionStatus localMarketSurveySampling
Left Join t.advancedSamplingAcquisitionStatus advancedSamplingAcquisitionStatus \
Where t.id In :tripId \
Order By vessel.code,t.startDate,t.endDate
-report.psLogbookTrip.columnRenderers.1.type=HighlightIfNotI18nReferentialValue
-report.psLogbookTrip.columnRenderers.1.parameters=14,15,16,17,18,19,20,21|fr.ird.referential.ps.common.AcquisitionStatus#1464000000000#001
+report.psLogbookTrip.columnRenderers.1.type=HighlightIfEquals18nReferentialValue
+report.psLogbookTrip.columnRenderers.1.parameters=14,15,16,17,18,19,20,21|fr.ird.referential.ps.common.AcquisitionStatus#1464000000000#999
report.psLogbookTrip.columnRenderers.2.type=HighlightIfAbsoluteDeltaIsPositive
report.psLogbookTrip.columnRenderers.2.parameters=10|11|0.0001|0.5
report.psLogbookTrip.columnRenderers.3.type=HighlightIfAbsoluteDeltaIsPositive
=====================================
core/services/test/src/main/java/fr/ird/observe/services/service/ReportServiceFixtures.java
=====================================
@@ -127,11 +127,9 @@ public class ReportServiceFixtures extends GeneratedReportServiceFixtures {
if (definition.needInitColumnRendererParameters()) {
ReportColumnRenderersParameters renderersParameters = service.initColumnRendererParameters(definition.definition());
Assert.assertNotNull(renderersParameters);
- List<Object> consumeColumnRenderersHtml = renderersParameters.consumeColumnRenderersHtml();
- Assert.assertNotNull(consumeColumnRenderersHtml);
- Set<String> columnRendererFunctions = ColumnRendererConsumers.htmlFunctions(definition.definition().getColumnRenderers());
+ Set<String> columnRendererFunctions = ColumnRendererConsumers.htmlFunctions(renderersParameters);
Assert.assertNotNull(columnRendererFunctions);
- List<String> columnRendererInitCode = ColumnRendererConsumers.htmlInitCode(definition.definition().getColumnRenderers());
+ List<String> columnRendererInitCode = ColumnRendererConsumers.htmlInitCode(renderersParameters);
Assert.assertNotNull(columnRendererInitCode);
}
Report report = reportFixture.populateVariables(service, definition);
=====================================
src/site/markdown/report/embedded-column-renderers.md
=====================================
@@ -0,0 +1,61 @@
+# Documentation des règles de rendu de colonnes disponibles
+
+Ce document décrit toutes les règles de rendu de colonnes disponibles sur les rapports.
+
+### HighlightIfAbsoluteDeltaIsPositive
+
+Ce rendu permet de vérifier que les valeurs de chaque cellule de deux colonnes sont identiques.
+
+Si deux valeurs ne sont pas égales, on colorise la cellule en orange (avertissement) pour un premier seuil et en rouge
+(erreur) selon un second seuil.
+
+Le rendu nécessite quatre paramètres :
+
+* la première colonne
+* la seconde colonne
+* le seuil pour afficher des avertissements
+* le seuil pour afficher des erreurs
+
+Exemple d'utilisation :
+
+```properties
+report.xxx.columnRenderers.1.type=HighlightIfAbsoluteDeltaIsPositive
+report.ccc.columnRenderers.1.parameters=10|11|0.0001|0.5
+```
+
+### HighlightIfNumericalValueIsPositive
+
+Ce rendu permet de vérifier que les valeurs de chaque celleule d'une colonne n'est pas zéro.
+
+Si la valeur n'est pas zéro, on colorise la cellule en orange (avertissement) pour un premier seuil et en rouge
+(erreur) selon un second seuil.
+
+Le rendu nécessite quatre paramètres :
+
+* la colonne
+* le seuil pour afficher des avertissements
+* le seuil pour afficher des erreurs
+
+Exemple d'utilisation
+
+```properties
+report.xxx.columnRenderers.1.type=HighlightIfNumericalValueIsPositive
+report.xxx.columnRenderers.1.parameters=19|0.0001|0.5
+```
+
+### HighlightIfEquals18nReferentialValue
+
+Ce rendu permet d'afficher de coloriser en rouge toute cellule des colonnes sélectionnées dont la valeur (de type
+référentiel i18n) n'est pas celle spécifié (via son identifiant).
+
+Le rendu nécessite deux paramètres :
+
+* une liste de colonnes sépararées par des virgules
+* l'identifiant du référentiel à mettre en valeur
+
+Exemple d'utilisation :
+
+```properties
+report.xxx.columnRenderers.1.type=HighlightIfEquals18nReferentialValue
+report.xxx.columnRenderers.1.parameters=14,15,16,17,18,19,20,21|fr.ird.referential.ps.common.AcquisitionStatus#1464000000000#999
+```
=====================================
src/site/markdown/report/syntax.md
=====================================
@@ -4,13 +4,14 @@ Ce document décrit comment écrire un rapport.
## Syntaxe d'un rapport
-Comme écrit dans la page de présentation des rapports, ceux-ci sont décrits dans un fichier de type *properties*.
+Comme écrit dans la page de présentation des rapports, ceux-ci sont décrits dans un fichier de type *properties*.
La syntaxe a été uniformisée en version 9.
### Identifiant d'un rapport
-Chaque rapport possède un identifiant unique; celui-ci est utilisé pour identifier toute sa description dans le fichier global.
+Chaque rapport possède un identifiant unique; celui-ci est utilisé pour identifier toute sa description dans le fichier
+global.
Voici un premier exemple de rapport pour mieux comprendre comment cela s'organise :
@@ -114,7 +115,8 @@ Order By sg.code
```
```report.xxx.variable.1.name``` définit l'*alias* de la variable que l'on pourra ensuite utiliser dans le
-reste de la définition du rapport (par exemple dans d'autres variables, variables de répétition, requêtes ou opérations).
+reste de la définition du rapport (par exemple dans d'autres variables, variables de répétition, requêtes ou
+opérations).
```report.xxx.variable.1.type``` définit le type de la variable. Ce type doit être un type de *dto* ou une
*référence de dto*. On ne peut pas ici utiliser un type d'*entité*, puisque l'interface graphique (selon le principe de
@@ -175,9 +177,12 @@ Where t.id In :tripId \
Order By sg.code
```
-Cet exemple est intéressant car il nous permet de voir comment utiliser un type qui ne reflète pas exactement une entité.
+Cet exemple est intéressant car il nous permet de voir comment utiliser un type qui ne reflète pas exactement une
+entité.
+
+Ici **SpeciesFateDiscardModeDto** est un objet que l'on a ajouté dans le code de l'application pour refléter les
+différents modes de captures :
-Ici **SpeciesFateDiscardModeDto** est un objet que l'on a ajouté dans le code de l'application pour refléter les différents modes de captures :
* conservé (sf.discard = ```false```)
* rejeté (sf.discard = ```true```)
* non connu (sf.discard = ```NULL```)
@@ -200,26 +205,33 @@ and g in elements (m.gearUseFeatures) \
Order By g.gear.label2
```
-```report.xxx.repeatVariable.1.name``` définit l'*alias* de la variable de répétition à utiliser dans une requête, autre variable de répétition ou opération
+```report.xxx.repeatVariable.1.name``` définit l'*alias* de la variable de répétition à utiliser dans une requête, autre
+variable de répétition ou opération
```report.xxx.repeatVariable.1.type``` définit le type de la variable de répétition. Contrairement aux variables, les
-variables de répétition sont utilisées en interne pour exécuter le rapport, on peut donc utiliser directement des types d'*entité*,
-ou bien des types *simples* qui correspondent aux types d'une colonne en base (**java.lang.String**, **java.lang.Float**, ...)
+variables de répétition sont utilisées en interne pour exécuter le rapport, on peut donc utiliser directement des types
+d'*entité*,
+ou bien des types *simples* qui correspondent aux types d'une colonne en base (**java.lang.String**, **java.lang.Float
+**, ...)
-**À noter que contrairement aux variables, ici le type de la donnée sera toujours utilisé tel quel dans les autres requêtes :
-si on définit une variable de type *entité*, c'est bien l'entité qui sera injectée dans la requête *hql*, et non pas juste son identifiant technique.**
+**À noter que contrairement aux variables, ici le type de la donnée sera toujours utilisé tel quel dans les autres
+requêtes :
+si on définit une variable de type *entité*, c'est bien l'entité qui sera injectée dans la requête *hql*, et non pas
+juste son identifiant technique.**
-```report.xxx.repeatVariable.1.request``` définit la requête **hql** pour récupérer l'univers des valeurs de la variable de répétition
+```report.xxx.repeatVariable.1.request``` définit la requête **hql** pour récupérer l'univers des valeurs de la variable
+de répétition
Il est possible d'utiliser dans une requête de variable de répétition, un alias sur toute variable du rapport (dont la
variable spéciale **tripId**), ainsi que tout autre alias de variable de répétition.
**À noter que l'outil de rapport utilise uniquement l'ordre induit dans la description du rapport, si par exemple la
-première variable de répétition était dépendante de la seconde, alors le rapport ne pourra jamais être exécuté puisque la
+première variable de répétition était dépendante de la seconde, alors le rapport ne pourra jamais être exécuté puisque
+la
première variable attend que l'univers de la seconde soit calculée...**
-On peut aussi ajouter une ligne supplémentaire pour indiquer que l'on veut rajouter la valeur **nulle** dans
-l'univers de cette variable de répétion, ce qui peut etre utilise (et nous nous en servons), mais que nous ne pouvons
+On peut aussi ajouter une ligne supplémentaire pour indiquer que l'on veut rajouter la valeur **nulle** dans
+l'univers de cette variable de répétion, ce qui peut etre utilise (et nous nous en servons), mais que nous ne pouvons
pas décrire via la requete *hql.
```properties
@@ -237,7 +249,8 @@ report.xxx.repeatVariable.1.comment=Un commentaire optionnel pour documenter la
On distingue deux types de requêtes :
* des requêtes *simples*
-* des requêtes utilisant une variable de répétition (pour celles-ci on doit décrire en plus alors la variable de répétition à utiliser)
+* des requêtes utilisant une variable de répétition (pour celles-ci on doit décrire en plus alors la variable de
+ répétition à utiliser)
Les deux types de requêtes nécessitent les trois lignes, comme décrit dans l'exemple suivant :
@@ -252,14 +265,20 @@ From fr.ird.observe.entities.data.ll.common.GearUseFeaturesImpl g \
Where g.id = :gearUseFeaturesId
```
-```report.xxx.request.1.location``` définit la position dans le résultat final où positionner le résultat de cette requête.
+```report.xxx.request.1.location``` définit la position dans le résultat final où positionner le résultat de cette
+requête.
-```report.xxx.request.1.layout``` définit la disposition à utiliser pour placer le résultat de cette requête dans le résultat final. Deux valeurs sont possibles :
+```report.xxx.request.1.layout``` définit la disposition à utiliser pour placer le résultat de cette requête dans le
+résultat final. Deux valeurs sont possibles :
-* **row** pour signifier que le résultat de la requête sera positionné en ligne à partir de la position précedemment définie. Ce mode correspond exactement au resultat de la requête.
-* **column** pour signifier que le résultat de la requête sera positionné en colonne à partir de la position précedemment définie. Ce mode est une transposition du résultat de la requête : une ligne du résultat de la requête sera une colonne dans le résultat final
+* **row** pour signifier que le résultat de la requête sera positionné en ligne à partir de la position précedemment
+ définie. Ce mode correspond exactement au resultat de la requête.
+* **column** pour signifier que le résultat de la requête sera positionné en colonne à partir de la position
+ précedemment définie. Ce mode est une transposition du résultat de la requête : une ligne du résultat de la requête
+ sera une colonne dans le résultat final
-```report.xxx.request.1.request``` définit le code **hql** qui permet de construire le résultat à placer ensuite dans le résultat final du rapport
+```report.xxx.request.1.request``` définit le code **hql** qui permet de construire le résultat à placer ensuite dans le
+résultat final du rapport
Pour une requête avec variable de répétition, il faut alors ajouter les deux lignes suivantes :
@@ -268,18 +287,24 @@ report.xxx.request.1.repeat.name=gearUseFeaturesId
report.xxx.request.1.repeat.layout=column
```
-```report.xxx.request.1.repeat.name``` définit l'*alias* de la variable de répétition à utiliser. La requête sera exécutée
+```report.xxx.request.1.repeat.name``` définit l'*alias* de la variable de répétition à utiliser. La requête sera
+exécutée
autant de fois qu'il y a de valeurs dans l'univers calculé de la variable de répétition.
-**À noter qu'il faut alors que le corps de cette requête doit utiliser l'alias de cette variable de répétition, même si dans les faits, rien ne l'oblige, mais le résultat sera alors toujours le même...**
+**À noter qu'il faut alors que le corps de cette requête doit utiliser l'alias de cette variable de répétition, même si
+dans les faits, rien ne l'oblige, mais le résultat sera alors toujours le même...**
-```report.xxx.request.1.repeat.layout``` définit la disposition à utiliser pour constuire le résultat final de la requête appliqué à chaque valeur de la variable de répétition. Deux valeurs sont possibles :
+```report.xxx.request.1.repeat.layout``` définit la disposition à utiliser pour constuire le résultat final de la
+requête appliqué à chaque valeur de la variable de répétition. Deux valeurs sont possibles :
-* **row** pour signifier que pour chaque valeur de l'univers de la variable de répétition, le résultat de la requête sera positionné sur la même ligne;
-* **column** pour signifier que pour chaque valeur de l'univers de la variable de répétition, le résultat de la requête sera positionné sur la même colonne.
+* **row** pour signifier que pour chaque valeur de l'univers de la variable de répétition, le résultat de la requête
+ sera positionné sur la même ligne;
+* **column** pour signifier que pour chaque valeur de l'univers de la variable de répétition, le résultat de la requête
+ sera positionné sur la même colonne.
**À noter qu'aucune vérification n'est effectuée sur la cohérence entre la disposition de la requête et la disposition
-de la variable de répétition. On peut alors obtenir un résultat final de la requête incohérent si les dispositions ne sont pas compatibles.**
+de la variable de répétition. On peut alors obtenir un résultat final de la requête incohérent si les dispositions ne
+sont pas compatibles.**
Il est possible de documenter cette requête en utilisant une ligne optionnelle :
@@ -317,7 +342,26 @@ Il est possible de documenter cette opération en utilisant une ligne optionnell
report.xxx.operations.1.comment=Un commentaire optionnel pour documenter l'opération
```
-Les opérations disponibles et leur documentation sont décrites dans le document [suivant](./embedded-operations.html).
+Les opérations disponibles et leur documentation sont décrites dans le document [suivant](./embedded-operations.html).
+
+### Rendu de colonnes
+
+Depuis la version **9.3.0**, il est possible de définir des rendus de colonnes via le fichier de définition,
+ce rendu sera valable dans le client swing ainsi que dans les rapports html.
+
+Un rendu est défini par deux lignes :
+
+1. Une pour définir le type de rendu
+2. Une pour paramétrer ce rendu
+
+```properties
+report.xxx.columnRenderers.1.type=HighlightIfAbsoluteDeltaIsPositive
+report.ccc.columnRenderers.1.parameters=10|11|0.0001|0.5
+```
+
+Il est possible d'ajouter plusieurs rendus sur un même rapport.
+
+Les rendus disponibles et leur documentation sont décrits dans le document [suivant](./embedded-column-renderers.html).
## Pour aller plus loin
=====================================
toolkit/api-report/pom.xml
=====================================
@@ -38,10 +38,6 @@
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
- <dependency>
- <groupId>com.google.guava</groupId>
- <artifactId>guava</artifactId>
- </dependency>
<dependency>
<groupId>io.ultreia.java4all</groupId>
<artifactId>java-lang</artifactId>
=====================================
toolkit/api-report/src/main/java/fr/ird/observe/report/ColumnRendererConsumer.java
=====================================
@@ -22,8 +22,7 @@ package fr.ird.observe.report;
* #L%
*/
-import com.google.common.io.Resources;
-import fr.ird.observe.report.renderers.HighlightIfAbsoluteDeltaIsPositive;
+import fr.ird.observe.dto.ObserveUtil;
import io.ultreia.java4all.util.SingletonSupplier;
import org.jdesktop.swingx.JXTable;
import org.jdesktop.swingx.decorator.ColorHighlighter;
@@ -31,6 +30,8 @@ import org.jdesktop.swingx.decorator.HighlightPredicate;
import java.awt.Color;
import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.Objects;
@@ -53,13 +54,18 @@ public interface ColumnRendererConsumer<P extends ColumnRendererParameters> {
}
static SingletonSupplier<String> htmlFunctions(Class<?> type) {
- return SingletonSupplier.of(() -> {
- try {
- return Resources.toString(Objects.requireNonNull(HighlightIfAbsoluteDeltaIsPositive.class.getResource(type.getSimpleName() + ".js")), StandardCharsets.UTF_8);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- });
+ String resourceName = type.getSimpleName() + ".js";
+ URL url = Objects.requireNonNull(type.getResource(resourceName), "Could not find resource: " + resourceName);
+ return ObserveUtil.loadResourceContentSupplier(url, ObserveUtil.removeJavaLicense());
+ }
+
+ static String loadResourceContent(URL url) {
+ try (InputStream in = url.openStream()) {
+ String content = new String(in.readAllBytes(), StandardCharsets.UTF_8);
+ return content.substring(content.indexOf("*/") + 2).trim();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
}
/**
@@ -90,13 +96,9 @@ public interface ColumnRendererConsumer<P extends ColumnRendererParameters> {
return parseParameters(parameters);
}
- Object consumeHtml(P parameters);
-
void consumeSwing(P parameters, JXTable table);
String htmlFunctions();
- default String htmlInitCode() {
- return String.format("init%s(renderers[i++], result, data);\n", getClass().getSimpleName());
- }
+ String htmlInitCode(P parameters);
}
=====================================
toolkit/api-report/src/main/java/fr/ird/observe/report/ColumnRendererConsumers.java
=====================================
@@ -23,12 +23,10 @@ package fr.ird.observe.report;
*/
import fr.ird.observe.report.definition.ColumnRendererDefinition;
-import io.ultreia.java4all.util.matrix.DataMatrix;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.jdesktop.swingx.JXTable;
-import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@@ -71,25 +69,21 @@ public final class ColumnRendererConsumers {
return get().getConsumer(definition.getName()).createParameters(requestExecutor, definition.getParameters());
}
- public static <P extends ColumnRendererParameters, R extends ColumnRendererConsumer<P>> Object consumeHtml(P parameters) {
- return get().getConsumer(parameters.name()).consumeHtml(parameters);
- }
-
- public static <P extends ColumnRendererParameters, R extends ColumnRendererConsumer<P>> void consumeSwing(P parameters, JXTable table) {
+ public static <P extends ColumnRendererParameters> void consumeSwing(P parameters, JXTable table) {
get().getConsumer(parameters.name()).consumeSwing(parameters, table);
}
- public static Set<String> htmlFunctions(ColumnRendererDefinition[] columnRenderers) {
- return Arrays.stream(columnRenderers).map(columnRenderer -> get().getConsumer(columnRenderer.getName()).htmlFunctions()).collect(Collectors.toCollection(TreeSet::new));
+ public static Set<String> htmlFunctions(ReportColumnRenderersParameters columnRenderers) {
+ return columnRenderers.getColumnRendererParameters().stream().map(columnRenderer -> get().getConsumer(columnRenderer.name()).htmlFunctions()).collect(Collectors.toCollection(TreeSet::new));
}
- public static List<String> htmlInitCode(ColumnRendererDefinition[] columnRenderers) {
- return Arrays.stream(columnRenderers).map(r -> get().getConsumer(r.getName()).htmlInitCode()).collect(Collectors.toList());
+ public static List<String> htmlInitCode(ReportColumnRenderersParameters columnRenderers) {
+ return columnRenderers.getColumnRendererParameters().stream().map(r -> get().getConsumer(r.name()).htmlInitCode(r)).collect(Collectors.toList());
}
@SuppressWarnings("unchecked")
- public <P extends ColumnRendererParameters, R extends ColumnRendererConsumer<P>> R getConsumer(String name) {
- return (R) Objects.requireNonNull(consumers.get(name), "Could not find column renderer with name: " + name);
+ public <P extends ColumnRendererParameters> ColumnRendererConsumer<P> getConsumer(String name) {
+ return (ColumnRendererConsumer<P>) Objects.requireNonNull(consumers.get(name), "Could not find column renderer with name: " + name);
}
}
=====================================
toolkit/api-report/src/main/java/fr/ird/observe/report/ReportColumnRenderersParameters.java
=====================================
@@ -28,7 +28,6 @@ import org.jdesktop.swingx.JXTable;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
-import java.util.stream.Collectors;
/**
* Created at 29/11/2023.
@@ -53,8 +52,4 @@ public class ReportColumnRenderersParameters implements JsonAware {
public void consumeColumnRenderersSwing(JXTable table) {
getColumnRendererParameters().forEach(r -> ColumnRendererConsumers.consumeSwing(r, table));
}
-
- public List<Object> consumeColumnRenderersHtml() {
- return getColumnRendererParameters().stream().map(ColumnRendererConsumers::consumeHtml).collect(Collectors.toList());
- }
}
=====================================
toolkit/api-report/src/main/java/fr/ird/observe/report/json/ReportColumnRenderersParametersAdapter.java
=====================================
@@ -0,0 +1,84 @@
+package fr.ird.observe.report.json;
+
+/*-
+ * #%L
+ * ObServe Toolkit :: API :: Report
+ * %%
+ * Copyright (C) 2008 - 2023 IRD, Ultreia.io
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/gpl-3.0.html>.
+ * #L%
+ */
+
+import com.google.auto.service.AutoService;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
+import com.google.gson.JsonSerializationContext;
+import com.google.gson.JsonSerializer;
+import fr.ird.observe.report.ColumnRendererParameters;
+import fr.ird.observe.report.ReportColumnRenderersParameters;
+import io.ultreia.java4all.lang.Objects2;
+import io.ultreia.java4all.util.json.JsonAdapter;
+
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created at 01/12/2023.
+ *
+ * @author Tony Chemit - dev(a)tchemit.fr
+ * @since 9.3.0
+ */
+(a)AutoService(JsonAdapter.class)
+public class ReportColumnRenderersParametersAdapter implements JsonDeserializer<ReportColumnRenderersParameters>, JsonSerializer<ReportColumnRenderersParameters>, JsonAdapter {
+
+ private static final String TYPE = "type";
+ private static final String VALUE = "value";
+
+ @Override
+ public Class<?> type() {
+ return ReportColumnRenderersParameters.class;
+ }
+
+ @Override
+ public ReportColumnRenderersParameters deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException {
+ JsonArray columnRendererParametersJson = json.getAsJsonArray();
+ List<ColumnRendererParameters> list = new ArrayList<>(columnRendererParametersJson.size());
+ for (JsonElement itemJson : columnRendererParametersJson) {
+ JsonObject asJsonObject = itemJson.getAsJsonObject();
+ String key = context.deserialize(asJsonObject.get(TYPE), String.class);
+ Class<ColumnRendererParameters> itemType = Objects2.forName(key);
+ list.add(context.deserialize(asJsonObject.get(VALUE), itemType));
+ }
+ return new ReportColumnRenderersParameters(list);
+ }
+
+ @Override
+ public JsonElement serialize(ReportColumnRenderersParameters src, Type typeOfSrc, JsonSerializationContext context) {
+ JsonArray result = new JsonArray();
+ for (ColumnRendererParameters columnRendererParameter : src.getColumnRendererParameters()) {
+ JsonObject item = new JsonObject();
+ item.addProperty(TYPE, columnRendererParameter.getClass().getName());
+ item.add(VALUE, context.serialize(columnRendererParameter));
+ result.add(item);
+ }
+ return result;
+ }
+}
=====================================
toolkit/api-report/src/main/java/fr/ird/observe/report/renderers/HighlightIfAbsoluteDeltaIsPositive.java
=====================================
@@ -31,7 +31,6 @@ import org.jdesktop.swingx.decorator.ComponentAdapter;
import org.jdesktop.swingx.decorator.HighlightPredicate;
import java.awt.Component;
-import java.util.Map;
import static fr.ird.observe.report.renderers.HighlightIfAbsoluteDeltaIsPositive.Parameters;
@@ -66,15 +65,6 @@ public class HighlightIfAbsoluteDeltaIsPositive implements ColumnRendererConsume
return new Parameters(column1, column2, warningThreshHold, errorThreshHold);
}
- @Override
- public Object consumeHtml(Parameters parameters) {
- return Map.of("name", name(),
- "column1", parameters.getColumn1(),
- "column2", parameters.getColumn2(),
- "warningThreshHold", parameters.getWarningThreshHold(),
- "errorThreshHold", parameters.getErrorThreshHold());
- }
-
@Override
public void consumeSwing(Parameters parameters, JXTable table) {
ColumnRendererConsumer.addHighLighters(table,
@@ -88,6 +78,11 @@ public class HighlightIfAbsoluteDeltaIsPositive implements ColumnRendererConsume
return HTML_FUNCTION.get();
}
+ @Override
+ public String htmlInitCode(Parameters parameters) {
+ return String.format("init%s(%d, %d, %s, %s, result, data);\n", parameters.name(), parameters.getColumn1(), parameters.getColumn2(), parameters.getWarningThreshHold(), parameters.getErrorThreshHold());
+ }
+
public static final class Parameters implements ColumnRendererParameters {
private final int column1;
private final int column2;
=====================================
toolkit/api-report/src/main/java/fr/ird/observe/report/renderers/HighlightIfNotI18nReferentialValue.java → toolkit/api-report/src/main/java/fr/ird/observe/report/renderers/HighlightIfEquals18nReferentialValue.java
=====================================
@@ -31,23 +31,21 @@ import org.jdesktop.swingx.JXTable;
import org.jdesktop.swingx.decorator.ColorHighlighter;
import java.awt.Color;
-import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.TreeSet;
-import static fr.ird.observe.report.renderers.HighlightIfNotI18nReferentialValue.Parameters;
+import static fr.ird.observe.report.renderers.HighlightIfEquals18nReferentialValue.Parameters;
/**
- * Created at 29/11/2023.
+ * Created at 02/12/2023.
*
* @author Tony Chemit - dev(a)tchemit.fr
* @since 9.3.0
*/
-@SuppressWarnings("rawtypes")
@AutoService(ColumnRendererConsumer.class)
-public class HighlightIfNotI18nReferentialValue implements ColumnRendererConsumer<Parameters> {
- private final static SingletonSupplier<String> HTML_FUNCTION = ColumnRendererConsumer.htmlFunctions(HighlightIfNotI18nReferentialValue.class);
+public class HighlightIfEquals18nReferentialValue implements ColumnRendererConsumer<Parameters> {
+ private final static SingletonSupplier<String> HTML_FUNCTION = ColumnRendererConsumer.htmlFunctions(HighlightIfEquals18nReferentialValue.class);
@Override
public int parametersCount() {
@@ -78,19 +76,12 @@ public class HighlightIfNotI18nReferentialValue implements ColumnRendererConsume
return result.setLabel(label);
}
- @Override
- public Object consumeHtml(Parameters parameters) {
- return Map.of("name", name(),
- "columns", parameters.getColumns(),
- "label", parameters.getLabel());
- }
-
@Override
public void consumeSwing(Parameters parameters, JXTable table) {
table.addHighlighter(new ColorHighlighter((renderer, adapter) -> {
Object value = adapter.getValue();
int column = adapter.convertColumnIndexToModel(adapter.column);
- return parameters.getColumns().contains(column) && !Objects.equals(value, parameters.getLabel());
+ return parameters.getColumns().contains(column) && Objects.equals(value, parameters.getLabel());
}, Color.RED, Color.BLACK));
}
@@ -99,6 +90,11 @@ public class HighlightIfNotI18nReferentialValue implements ColumnRendererConsume
return HTML_FUNCTION.get();
}
+ @Override
+ public String htmlInitCode(Parameters parameters) {
+ return String.format("init%s(%s, '%s', result, data);\n", parameters.name(), parameters.getColumns(), parameters.getLabel());
+ }
+
public static final class Parameters implements ColumnRendererParameters {
private final Set<Integer> columns;
private final String id;
@@ -118,7 +114,7 @@ public class HighlightIfNotI18nReferentialValue implements ColumnRendererConsume
@Override
public String name() {
- return HighlightIfNotI18nReferentialValue.class.getSimpleName();
+ return HighlightIfEquals18nReferentialValue.class.getSimpleName();
}
public Set<Integer> getColumns() {
=====================================
toolkit/api-report/src/main/java/fr/ird/observe/report/renderers/HighlightIfNumericalValueIsPositive.java
=====================================
@@ -31,7 +31,6 @@ import org.jdesktop.swingx.decorator.ComponentAdapter;
import org.jdesktop.swingx.decorator.HighlightPredicate;
import java.awt.Component;
-import java.util.Map;
import static fr.ird.observe.report.renderers.HighlightIfNumericalValueIsPositive.Parameters;
@@ -65,14 +64,6 @@ public class HighlightIfNumericalValueIsPositive implements ColumnRendererConsum
}
- @Override
- public Object consumeHtml(Parameters parameters) {
- return Map.of("name", name(),
- "column", parameters.getColumn(),
- "warningThreshHold", parameters.getWarningThreshHold(),
- "errorThreshHold", parameters.getErrorThreshHold());
- }
-
@Override
public void consumeSwing(Parameters parameters, JXTable table) {
ColumnRendererConsumer.addHighLighters(table,
@@ -86,6 +77,11 @@ public class HighlightIfNumericalValueIsPositive implements ColumnRendererConsum
return HTML_FUNCTION.get();
}
+ @Override
+ public String htmlInitCode(Parameters parameters) {
+ return String.format("init%s(%d, %f, %f, result, data);\n", parameters.name(), parameters.getColumn(), parameters.getWarningThreshHold(), parameters.getErrorThreshHold());
+ }
+
public static final class Parameters implements ColumnRendererParameters {
private final int column;
private final double warningThreshHold;
=====================================
toolkit/api-report/src/main/resources/fr/ird/observe/report/renderers/HighlightIfAbsoluteDeltaIsPositive.js
=====================================
@@ -46,9 +46,7 @@ function HighlightIfAbsoluteDeltaIsPositive(cell, row, column2, warningThreshHol
};
}
-function initHighlightIfAbsoluteDeltaIsPositive(renderer, result, json) {
- let column1 = renderer["column1"];
- let column2 = renderer["column2"];
+function initHighlightIfAbsoluteDeltaIsPositive(column1, column2, warningThreshHold, errorThreshHold, result, json) {
let height = json.height;
let data = json.data;
for (let row = 0; row < height; row++) {
@@ -58,8 +56,6 @@ function initHighlightIfAbsoluteDeltaIsPositive(renderer, result, json) {
}
}
}
- let warningThreshHold = renderer["warningThreshHold"];
- let errorThreshHold = renderer["errorThreshHold"];
result[column1] = {
name: result [column1],
formatter: cell => {
=====================================
toolkit/api-report/src/main/resources/fr/ird/observe/report/renderers/HighlightIfNotI18nReferentialValue.js → toolkit/api-report/src/main/resources/fr/ird/observe/report/renderers/HighlightIfEquals18nReferentialValue.js
=====================================
@@ -19,27 +19,24 @@
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
-function HighlightIfNotI18nReferentialValue(cell, label) {
+function HighlightIfEquals18nReferentialValue(cell, label) {
if (!!!cell) {
return;
}
if (cell === label) {
- return;
+ return {
+ 'data-cell-content': cell,
+ 'class': 'gridjs-td cellError',
+ };
}
- return {
- 'data-cell-content': cell,
- 'class': 'gridjs-td cellError',
- };
}
-function initHighlightIfNotI18nReferentialValue(renderer, result, json) {
- let columns = renderer["columns"];
- let label = renderer["label"];
+function initHighlightIfEquals18nReferentialValue(columns, label, result, json) {
for (let j = 0; j < columns.length; j++) {
let column = columns[j];
result [column] = {
name: result [column],
- attributes: cell => HighlightIfNotI18nReferentialValue(cell, label)
+ attributes: cell => HighlightIfEquals18nReferentialValue(cell, label)
};
}
}
=====================================
toolkit/api-report/src/main/resources/fr/ird/observe/report/renderers/HighlightIfNumericalValueIsPositive.js
=====================================
@@ -39,8 +39,7 @@ function HighlightIfNumericalValueIsPositive(cell, warningThreshHold, errorThres
};
}
-function initHighlightIfNumericalValueIsPositive(renderer, result, json) {
- let column = renderer["column"];
+function initHighlightIfNumericalValueIsPositive(column, warningThreshHold, errorThreshHold, result, json) {
let height = json.height;
let data = json.data;
for (let row = 0; row < height; row++) {
@@ -48,8 +47,6 @@ function initHighlightIfNumericalValueIsPositive(renderer, result, json) {
data[row][column] = "-";
}
}
- let warningThreshHold = renderer["warningThreshHold"];
- let errorThreshHold = renderer["errorThreshHold"];
result[column] = {
name: result [column],
formatter: cell => {
=====================================
toolkit/api/src/main/java/fr/ird/observe/dto/ObserveUtil.java
=====================================
@@ -31,15 +31,21 @@ import fr.ird.observe.spi.module.BusinessSubModule;
import io.ultreia.java4all.config.ApplicationConfig;
import io.ultreia.java4all.config.ConfigResource;
import io.ultreia.java4all.lang.Strings;
+import io.ultreia.java4all.util.SingletonSupplier;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.config.Configurator;
import org.hashids.Hashids;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
+import java.io.IOException;
+import java.io.InputStream;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.net.MalformedURLException;
import java.net.URL;
+import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.text.Collator;
@@ -66,7 +72,6 @@ import java.util.function.Supplier;
public class ObserveUtil {
public static final String SQL_GZ_EXTENSION_PATTERN = "^.+\\.sql\\.gz|.+\\.SQL\\.GZ$";
- public static final String CSV_EXTENSION_PATTERN = "^.+\\.csv|.+\\.CSV$";
public static final String SQL_GZ_EXTENSION = ".sql.gz";
public static final String CSV_EXTENSION = ".csv";
public static final String PROPERTIES_EXTENSION_PATTERN = "^.+\\.properties|.+\\.PROPERTIES$";
@@ -75,38 +80,7 @@ public class ObserveUtil {
public static final String PNG_EXTENSION = ".png";
public static final String JS_ENGINE_NAME = "rhino";
private static final Hashids ID_GENERATOR = new Hashids("ObServeHasSomeSalt", 8, "0123456789#abcdefghijklmnopqrestuvwxyz");
-
- @SuppressWarnings("rawtypes")
- private static class ClassComparator<C extends Class<?>> implements Comparator<C> {
-
- private final Map<Class, String> cache;
- private final Function<Class, String> function;
-
- private final Collator collator;
-
- private ClassComparator(Function<Class, String> function, Locale locale) {
- this.cache = new HashMap<>();
- this.function = function;
- this.collator = Collator.getInstance(locale);
- this.collator.setStrength(Collator.PRIMARY);
- }
-
- @Override
- public int compare(Class o1, Class o2) {
- String s1 = getValue(o1);
- String s2 = getValue(o2);
- return this.collator.compare(s1, s2);
- }
-
- String getValue(Class klass) {
- return cache.computeIfAbsent(klass, k -> function.apply(klass));
- }
-
- public void sort(List<C> list) {
- list.sort(this);
- cache.clear();
- }
- }
+ private static final Logger log = LogManager.getLogger(ObserveUtil.class);
public static String newUUID(Date now) {
return ID_GENERATOR.encode(now.getTime());
@@ -253,15 +227,65 @@ public class ObserveUtil {
}
/**
- *
* @param jsonString the json string in compact mode
* @return the gson in a pretty mode
*/
- public static String toPrettyFormat(String jsonString)
- {
+ public static String toPrettyFormat(String jsonString) {
JsonObject json = JsonParser.parseString(jsonString).getAsJsonObject();
Gson gson = new GsonBuilder().setPrettyPrinting().create();
return gson.toJson(json);
}
+
+ public static SingletonSupplier<String> loadResourceContentSupplier(URL url, Function<String, String> contentTransformer) {
+ return SingletonSupplier.of(() -> {
+ String content = loadResourceContent(url);
+ return contentTransformer == null ? content : contentTransformer.apply(content);
+ });
+ }
+
+ public static String loadResourceContent(URL url) {
+ log.info("Loading resource content: {}", url);
+ try (InputStream in = url.openStream()) {
+ return new String(in.readAllBytes(), StandardCharsets.UTF_8);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public static Function<String, String> removeJavaLicense() {
+ return content -> content.substring(content.indexOf("*/") + 2).trim();
+ }
+
+ @SuppressWarnings("rawtypes")
+ private static class ClassComparator<C extends Class<?>> implements Comparator<C> {
+
+ private final Map<Class, String> cache;
+ private final Function<Class, String> function;
+
+ private final Collator collator;
+
+ private ClassComparator(Function<Class, String> function, Locale locale) {
+ this.cache = new HashMap<>();
+ this.function = function;
+ this.collator = Collator.getInstance(locale);
+ this.collator.setStrength(Collator.PRIMARY);
+ }
+
+ @Override
+ public int compare(Class o1, Class o2) {
+ String s1 = getValue(o1);
+ String s2 = getValue(o2);
+ return this.collator.compare(s1, s2);
+ }
+
+ String getValue(Class klass) {
+ return cache.computeIfAbsent(klass, k -> function.apply(klass));
+ }
+
+ public void sort(List<C> list) {
+ list.sort(this);
+ cache.clear();
+ }
+ }
}
=====================================
toolkit/api/src/main/java/fr/ird/observe/spi/json/java4all/DataMatrixAdapter.java
=====================================
@@ -0,0 +1,103 @@
+package fr.ird.observe.spi.json.java4all;
+
+/*-
+ * #%L
+ * ObServe Toolkit :: API
+ * %%
+ * Copyright (C) 2008 - 2023 IRD, Ultreia.io
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/gpl-3.0.html>.
+ * #L%
+ */
+
+import com.google.auto.service.AutoService;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
+import com.google.gson.JsonPrimitive;
+import com.google.gson.JsonSerializationContext;
+import com.google.gson.JsonSerializer;
+import io.ultreia.java4all.util.json.JsonAdapter;
+import io.ultreia.java4all.util.matrix.DataMatrix;
+
+import java.lang.reflect.Type;
+import java.util.Arrays;
+import java.util.stream.Collectors;
+
+/**
+ * Created at 01/12/2023.
+ *
+ * @author Tony Chemit - dev(a)tchemit.fr
+ * @since 9.3.0
+ */
+(a)AutoService(JsonAdapter.class)
+public class DataMatrixAdapter implements JsonDeserializer<DataMatrix>, JsonSerializer<DataMatrix>, JsonAdapter {
+
+ private static final String WIDTH = "width";
+ private static final String HEIGHT = "height";
+ private static final String X = "x";
+ private static final String Y = "y";
+ private static final String ROWS = "rows";
+
+ @Override
+ public Class<?> type() {
+ return DataMatrix.class;
+ }
+
+ @Override
+ public DataMatrix deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException {
+ JsonObject dataMatrixAsJsonObject = json.getAsJsonObject();
+
+ DataMatrix result = new DataMatrix();
+ result.setWidth(context.deserialize(dataMatrixAsJsonObject.get(WIDTH), int.class));
+ result.setHeight(context.deserialize(dataMatrixAsJsonObject.get(HEIGHT), int.class));
+ result.setX(context.deserialize(dataMatrixAsJsonObject.get(X), int.class));
+ result.setY(context.deserialize(dataMatrixAsJsonObject.get(Y), int.class));
+ JsonArray rows = dataMatrixAsJsonObject.getAsJsonArray(ROWS);
+ Object[][] data = new Object[result.getHeight()][result.getWidth()];
+ int index = 0;
+ for (JsonElement rowElement : rows) {
+ String[] deserialize = rowElement.getAsString().split("\\|\\|");
+ Object[] row = new Object[deserialize.length];
+ for (int i = 0; i < deserialize.length; i++) {
+ String s = deserialize[i];
+ row[i] = s.equals("$") ? null : s;
+ }
+ data[index++] = row;
+ }
+ result.setData(data);
+ return result;
+ }
+
+ @Override
+ public JsonElement serialize(DataMatrix src, Type typeOfSrc, JsonSerializationContext context) {
+ JsonObject result = new JsonObject();
+ result.addProperty(WIDTH, src.getWidth());
+ result.addProperty(HEIGHT, src.getHeight());
+ result.addProperty(X, src.getX());
+ result.addProperty(Y, src.getY());
+ JsonArray rows = new JsonArray(src.getHeight());
+ result.add(ROWS, rows);
+ for (Object[] row : src.getData()) {
+ rows.add(new JsonPrimitive(Arrays.stream(row).map(d -> d == null ? "$" : d.toString()).collect(Collectors.joining("||"))));
+ }
+
+ return result;
+ }
+}
+
View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/ba11dbb303d01e49b683e6d67…
--
View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/ba11dbb303d01e49b683e6d67…
You're receiving this email because of your account on gitlab.com.
1
0
Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe
Commits:
b5febe07 by Tony Chemit at 2023-12-04T18:27:47+01:00
Stash
- - - - -
13 changed files:
- client/datasource/actions/src/main/i18n/templates/reportHtmlExport_en_GB.ftl
- client/datasource/actions/src/main/i18n/templates/reportHtmlExport_es_ES.ftl
- client/datasource/actions/src/main/i18n/templates/reportHtmlExport_fr_FR.ftl
- client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/HtmlExportModel.java
- + client/datasource/actions/src/main/resources/fr/ird/observe/client/datasource/actions/report/HtmlExportModel.js
- core/persistence/report/src/main/resources/observe-reports.properties
- + src/site/markdown/report/embedded-column-renderers.md
- src/site/markdown/report/syntax.md
- toolkit/api-report/pom.xml
- toolkit/api-report/src/main/java/fr/ird/observe/report/ColumnRendererConsumer.java
- + toolkit/api-report/src/main/java/fr/ird/observe/report/renderers/HighlightIfEquals18nReferentialValue.java
- + toolkit/api-report/src/main/resources/fr/ird/observe/report/renderers/HighlightIfEqualsI18nReferentialValue.js
- toolkit/api/src/main/java/fr/ird/observe/dto/ObserveUtil.java
Changes:
=====================================
client/datasource/actions/src/main/i18n/templates/reportHtmlExport_en_GB.ftl
=====================================
@@ -199,112 +199,11 @@
}
</style>
<script type="application/javascript">
-
- function searchValue() {
- return searchOption.checked;
- }
-
- function resizableValue() {
- return resizableOption.checked;
- }
-
- function sortValue() {
- return sortOption.checked;
- }
-
- function paginationValue() {
- return paginationOption.checked ? {limit: paginationSizeOption.value} : false;
- }
-
- function toggleSearch(config, source) {
- let newValue = source.checked;
- // console.info("Toggle search to: " + newValue);
- updateGrid(config);
- }
-
- function toggleResizable(config, source) {
- let newValue = source.checked;
- // console.info("Toggle resizable to: " + newValue);
- updateGrid(config);
- }
-
- function toggleSort(config, source) {
- let newValue = source.checked;
- // console.info("Toggle sort to: " + newValue);
- updateGrid(config);
- }
-
- function togglePagination(config, source) {
- let newValue = source.checked;
- // console.info("Toggle pagination to: " + newValue);
- if (newValue) {
- paginationSizeOption["disabled"] = null;
- } else {
- paginationSizeOption.disabled = true;
- }
- updateGrid(config);
- }
-
- function changePaginationSize(config, source) {
- let newValue = source.value;
- // console.info("Change pagination size to: " + newValue);
- updateGrid(config);
- }
-
- function updateGrid(config) {
- let searchValue1 = searchValue();
- let sortValue1 = sortValue();
- let resizableValue1 = resizableValue();
- // FIXME Need to update config.columns otherwise we will keep previous options (sort, resizable...)
- let newConfig = {
- language: config.language,
- data: config.data,
- columns: config.columns,
- search: searchValue1,
- resizable: resizableValue1,
- sort: sortValue1,
- pagination: paginationValue()
- };
- gridContainerParent.innerHTML = '<div id="wrapper"></div>';
- // console.info(newConfig);
- setTimeout(() => {
- <#--noinspection JSUnresolvedReference-->
- grid = new gridjs.Grid(newConfig).render(document.getElementById("wrapper"));
- }, 50);
- }
-
- function deserializeJson(json) {
- let height = json.height;
- let width = json.width;
- let data = json.rows;
- let result = new Array(height);
- for (let row = 0; row < height; row++) {
- let cells = data[row].split('||');
- let realRow = new Array(width);
- result[row]=realRow;
- for (let column = 0; column < width; column++) {
- let rowElement = cells[column];
- realRow[column] = rowElement ==='$'?null:rowElement;
- }
- }
- return result;
- }
+ ${.data_model.script}
<#list .data_model.columnRendererFunctions as key>
-${key}</#list>
-
- function createColumns(json) {
- let result = !!json["columnNames"] ? json["columnNames"] : [];
- if (result.length === 0) {
- return result;
- }
- let renderers = json["columnRendererDefinitions"];
- let i = 0;
- let data = json.data;
- <#list .data_model.columnRendererInitCode as value>
- ${value}</#list>
- return result;
- }
+ ${key}
+ </#list>
</script>
</head>
<body>
@@ -364,62 +263,22 @@ ${key}</#list>
</div>
<script type="application/javascript">
- const json = ${.data_model.json};
- json.data.data = deserializeJson(json.data);
-
- const gridContainerParent = document.getElementById("wrapperParent");
- const searchOption = document.getElementById("search");
- const resizableOption = document.getElementById("resizable");
- const paginationOption = document.getElementById("pagination");
- const paginationSizeOption = document.getElementById("paginationSize");
- const sortOption = document.getElementById("sort");
-
- let grid = new gridjs.Grid({
- search: searchValue(),
- resizable: resizableValue(),
- sort: sortValue(),
- pagination: paginationValue(),
- <#--language: {-->
- <#-- 'search': {-->
- <#-- 'placeholder': '🔍 Recherche...'-->
- <#-- },-->
- <#-- sort: {-->
- <#-- sortAsc: 'Tri ascendant',-->
- <#-- sortDesc: 'Tri descendant',-->
- <#-- },-->
- <#-- pagination: {-->
- <#-- previous: 'Précédent',-->
- <#-- next: 'Suivant',-->
- <#-- navigate: (page, pages) => `Page ${r"${page}"} sur ${r"${pages}"}`,-->
- <#-- page: (page) => `Page ${r"${page}"}`,-->
- <#-- showing: 'Affichage des lignes de',-->
- <#-- of: 'sur',-->
- <#-- to: 'à',-->
- <#-- results: 'lignes.',-->
- <#-- },-->
- <#-- loading: 'Chargement...'-->
- <#--},-->
- columns: createColumns(json),
- data: json.data.data
- });
- updateGrid(grid.config);
-
- searchOption.addEventListener("change", function () {
- toggleSearch(grid.config, this);
- });
- resizableOption.addEventListener("change", function () {
- toggleResizable(grid.config, this);
- });
- sortOption.addEventListener("change", function () {
- toggleSort(grid.config, this);
- });
- paginationOption.addEventListener("change", function () {
- togglePagination(grid.config, this);
- });
-
- paginationSizeOption.addEventListener("change", function () {
- changePaginationSize(grid.config, this);
- });
+ new GridHandler(
+ document,
+ {},
+ function (json) {
+ let result = !!json["columnNames"] ? json["columnNames"] : [];
+ if (result.length === 0) {
+ return result;
+ }
+ let renderers = json["columnRendererDefinitions"];
+ let i = 0;
+ let data = json.data;
+ <#list .data_model.columnRendererInitCode as value>
+ ${value}</#list>
+ return result;
+ },
+ ${.data_model.json}).init();
</script>
</body>
</html>
=====================================
client/datasource/actions/src/main/i18n/templates/reportHtmlExport_es_ES.ftl
=====================================
@@ -199,112 +199,11 @@
}
</style>
<script type="application/javascript">
-
- function searchValue() {
- return searchOption.checked;
- }
-
- function resizableValue() {
- return resizableOption.checked;
- }
-
- function sortValue() {
- return sortOption.checked;
- }
-
- function paginationValue() {
- return paginationOption.checked ? {limit: paginationSizeOption.value} : false;
- }
-
- function toggleSearch(config, source) {
- let newValue = source.checked;
- // console.info("Toggle search to: " + newValue);
- updateGrid(config);
- }
-
- function toggleResizable(config, source) {
- let newValue = source.checked;
- // console.info("Toggle resizable to: " + newValue);
- updateGrid(config);
- }
-
- function toggleSort(config, source) {
- let newValue = source.checked;
- // console.info("Toggle sort to: " + newValue);
- updateGrid(config);
- }
-
- function togglePagination(config, source) {
- let newValue = source.checked;
- // console.info("Toggle pagination to: " + newValue);
- if (newValue) {
- paginationSizeOption["disabled"] = null;
- } else {
- paginationSizeOption.disabled = true;
- }
- updateGrid(config);
- }
-
- function changePaginationSize(config, source) {
- let newValue = source.value;
- // console.info("Change pagination size to: " + newValue);
- updateGrid(config);
- }
-
- function updateGrid(config) {
- let searchValue1 = searchValue();
- let sortValue1 = sortValue();
- let resizableValue1 = resizableValue();
- // FIXME Need to update config.columns otherwise we will keep previous options (sort, resizable...)
- let newConfig = {
- language: config.language,
- data: config.data,
- columns: config.columns,
- search: searchValue1,
- resizable: resizableValue1,
- sort: sortValue1,
- pagination: paginationValue()
- };
- gridContainerParent.innerHTML = '<div id="wrapper"></div>';
- // console.info(newConfig);
- setTimeout(() => {
- <#--noinspection JSUnresolvedReference-->
- grid = new gridjs.Grid(newConfig).render(document.getElementById("wrapper"));
- }, 50);
- }
-
- function deserializeJson(json) {
- let height = json.height;
- let width = json.width;
- let data = json.rows;
- let result = new Array(height);
- for (let row = 0; row < height; row++) {
- let cells = data[row].split('||');
- let realRow = new Array(width);
- result[row]=realRow;
- for (let column = 0; column < width; column++) {
- let rowElement = cells[column];
- realRow[column] = rowElement ==='$'?null:rowElement;
- }
- }
- return result;
- }
+ ${.data_model.script}
<#list .data_model.columnRendererFunctions as key>
-${key}</#list>
-
- function createColumns(json) {
- let result = !!json["columnNames"] ? json["columnNames"] : [];
- if (result.length === 0) {
- return result;
- }
- let renderers = json["columnRendererDefinitions"];
- let i = 0;
- let data = json.data;
- <#list .data_model.columnRendererInitCode as value>
- ${value}</#list>
- return result;
- }
+ ${key}
+ </#list>
</script>
</head>
<body>
@@ -363,62 +262,22 @@ ${key}</#list>
</div>
<script type="application/javascript">
- const json = ${.data_model.json};
- json.data.data = deserializeJson(json.data);
-
- const gridContainerParent = document.getElementById("wrapperParent");
- const searchOption = document.getElementById("search");
- const resizableOption = document.getElementById("resizable");
- const paginationOption = document.getElementById("pagination");
- const paginationSizeOption = document.getElementById("paginationSize");
- const sortOption = document.getElementById("sort");
-
- let grid = new gridjs.Grid({
- search: searchValue(),
- resizable: resizableValue(),
- sort: sortValue(),
- pagination: paginationValue(),
- <#--language: {-->
- <#-- 'search': {-->
- <#-- 'placeholder': '🔍 Recherche...'-->
- <#-- },-->
- <#-- sort: {-->
- <#-- sortAsc: 'Tri ascendant',-->
- <#-- sortDesc: 'Tri descendant',-->
- <#-- },-->
- <#-- pagination: {-->
- <#-- previous: 'Précédent',-->
- <#-- next: 'Suivant',-->
- <#-- navigate: (page, pages) => `Page ${r"${page}"} sur ${r"${pages}"}`,-->
- <#-- page: (page) => `Page ${r"${page}"}`,-->
- <#-- showing: 'Affichage des lignes de',-->
- <#-- of: 'sur',-->
- <#-- to: 'à',-->
- <#-- results: 'lignes.',-->
- <#-- },-->
- <#-- loading: 'Chargement...'-->
- <#--},-->
- columns: createColumns(json),
- data: json.data.data
- });
- updateGrid(grid.config);
-
- searchOption.addEventListener("change", function () {
- toggleSearch(grid.config, this);
- });
- resizableOption.addEventListener("change", function () {
- toggleResizable(grid.config, this);
- });
- sortOption.addEventListener("change", function () {
- toggleSort(grid.config, this);
- });
- paginationOption.addEventListener("change", function () {
- togglePagination(grid.config, this);
- });
-
- paginationSizeOption.addEventListener("change", function () {
- changePaginationSize(grid.config, this);
- });
+ new GridHandler(
+ document,
+ {},
+ function (json) {
+ let result = !!json["columnNames"] ? json["columnNames"] : [];
+ if (result.length === 0) {
+ return result;
+ }
+ let renderers = json["columnRendererDefinitions"];
+ let i = 0;
+ let data = json.data;
+ <#list .data_model.columnRendererInitCode as value>
+ ${value}</#list>
+ return result;
+ },
+ ${.data_model.json}).init();
</script>
</body>
</html>
=====================================
client/datasource/actions/src/main/i18n/templates/reportHtmlExport_fr_FR.ftl
=====================================
@@ -85,22 +85,22 @@
background-color: rgb(255, 165, 0);
}
-<#-- <#–noinspection CssUnusedSymbol–>-->
-<#-- td:has(span.cellWarning):before {-->
-<#-- padding-right: 8px;-->
-<#-- content: "\26A0";-->
-<#-- }-->
+ <#-- <#–noinspection CssUnusedSymbol–>-->
+ <#-- td:has(span.cellWarning):before {-->
+ <#-- padding-right: 8px;-->
+ <#-- content: "\26A0";-->
+ <#-- }-->
<#--noinspection CssUnusedSymbol-->
td.cellError {
background-color: rgb(255, 0, 0);
}
-<#-- <#–noinspection CssUnusedSymbol–>-->
-<#-- td:has(span.cellError):before {-->
-<#-- padding-right: 8px;-->
-<#-- content: "\26D4";-->
-<#-- }-->
+ <#-- <#–noinspection CssUnusedSymbol–>-->
+ <#-- td:has(span.cellError):before {-->
+ <#-- padding-right: 8px;-->
+ <#-- content: "\26D4";-->
+ <#-- }-->
.widget {
position: relative;
@@ -200,112 +200,11 @@
}
</style>
<script type="application/javascript">
-
- function searchValue() {
- return searchOption.checked;
- }
-
- function resizableValue() {
- return resizableOption.checked;
- }
-
- function sortValue() {
- return sortOption.checked;
- }
-
- function paginationValue() {
- return paginationOption.checked ? {limit: paginationSizeOption.value} : false;
- }
-
- function toggleSearch(config, source) {
- let newValue = source.checked;
- // console.info("Toggle search to: " + newValue);
- updateGrid(config);
- }
-
- function toggleResizable(config, source) {
- let newValue = source.checked;
- // console.info("Toggle resizable to: " + newValue);
- updateGrid(config);
- }
-
- function toggleSort(config, source) {
- let newValue = source.checked;
- // console.info("Toggle sort to: " + newValue);
- updateGrid(config);
- }
-
- function togglePagination(config, source) {
- let newValue = source.checked;
- // console.info("Toggle pagination to: " + newValue);
- if (newValue) {
- paginationSizeOption["disabled"] = null;
- } else {
- paginationSizeOption.disabled = true;
- }
- updateGrid(config);
- }
-
- function changePaginationSize(config, source) {
- let newValue = source.value;
- // console.info("Change pagination size to: " + newValue);
- updateGrid(config);
- }
-
- function updateGrid(config) {
- let searchValue1 = searchValue();
- let sortValue1 = sortValue();
- let resizableValue1 = resizableValue();
- // FIXME Need to update config.columns otherwise we will keep previous options (sort, resizable...)
- let newConfig = {
- language: config.language,
- data: config.data,
- columns: config.columns,
- search: searchValue1,
- resizable: resizableValue1,
- sort: sortValue1,
- pagination: paginationValue()
- };
- gridContainerParent.innerHTML = '<div id="wrapper"></div>';
- // console.info(newConfig);
- setTimeout(() => {
- <#--noinspection JSUnresolvedReference-->
- grid = new gridjs.Grid(newConfig).render(document.getElementById("wrapper"));
- }, 50);
- }
-
- function deserializeJson(json) {
- let height = json.height;
- let width = json.width;
- let data = json.rows;
- let result = new Array(height);
- for (let row = 0; row < height; row++) {
- let cells = data[row].split('||');
- let realRow = new Array(width);
- result[row]=realRow;
- for (let column = 0; column < width; column++) {
- let rowElement = cells[column];
- realRow[column] = rowElement ==='$'?null:rowElement;
- }
- }
- return result;
- }
+ ${.data_model.script}
<#list .data_model.columnRendererFunctions as key>
-${key}</#list>
-
- function createColumns(json) {
- let result = !!json["columnNames"] ? json["columnNames"] : [];
- if (result.length === 0) {
- return result;
- }
- let renderers = json["columnRendererDefinitions"];
- let i = 0;
- let data = json.data;
- <#list .data_model.columnRendererInitCode as value>
- ${value}</#list>
- return result;
- }
+ ${key}
+ </#list>
</script>
</head>
<body>
@@ -364,22 +263,9 @@ ${key}</#list>
</div>
<script type="application/javascript">
- const json = ${.data_model.json};
- json.data.data = deserializeJson(json.data);
-
- const gridContainerParent = document.getElementById("wrapperParent");
- const searchOption = document.getElementById("search");
- const resizableOption = document.getElementById("resizable");
- const paginationOption = document.getElementById("pagination");
- const paginationSizeOption = document.getElementById("paginationSize");
- const sortOption = document.getElementById("sort");
-
- let grid = new gridjs.Grid({
- search: searchValue(),
- resizable: resizableValue(),
- sort: sortValue(),
- pagination: paginationValue(),
- language: {
+ new GridHandler(
+ document,
+ {
'search': {
'placeholder': '🔍 Recherche...'
},
@@ -390,8 +276,8 @@ ${key}</#list>
pagination: {
previous: 'Précédent',
next: 'Suivant',
- navigate: (page, pages) => `Page ${r"${page}"} sur ${r"${pages}"}`,
- page: (page) => `Page ${r"${page}"}`,
+ navigate: (page, pages) => `Page ${page} sur ${pages}`,
+ page: (page) => `Page ${page}`,
showing: 'Affichage des lignes de',
of: 'sur',
to: 'à',
@@ -399,27 +285,19 @@ ${key}</#list>
},
loading: 'Chargement...'
},
- columns: createColumns(json),
- data: json.data.data
- });
- updateGrid(grid.config);
-
- searchOption.addEventListener("change", function () {
- toggleSearch(grid.config, this);
- });
- resizableOption.addEventListener("change", function () {
- toggleResizable(grid.config, this);
- });
- sortOption.addEventListener("change", function () {
- toggleSort(grid.config, this);
- });
- paginationOption.addEventListener("change", function () {
- togglePagination(grid.config, this);
- });
-
- paginationSizeOption.addEventListener("change", function () {
- changePaginationSize(grid.config, this);
- });
+ function (json) {
+ let result = !!json["columnNames"] ? json["columnNames"] : [];
+ if (result.length === 0) {
+ return result;
+ }
+ let renderers = json["columnRendererDefinitions"];
+ let i = 0;
+ let data = json.data;
+ <#list .data_model.columnRendererInitCode as value>
+ ${value}</#list>
+ return result;
+ },
+ ${.data_model.json}).init();
</script>
</body>
</html>
=====================================
client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/HtmlExportModel.java
=====================================
@@ -24,14 +24,18 @@ package fr.ird.observe.client.datasource.actions.report;
import com.google.gson.Gson;
import fr.ird.observe.client.datasource.actions.config.SelectDataModel;
+import fr.ird.observe.dto.ObserveUtil;
import fr.ird.observe.report.ColumnRendererConsumers;
import fr.ird.observe.report.Report;
import fr.ird.observe.report.ReportColumnRenderersParameters;
import fr.ird.observe.report.definition.ColumnRendererDefinition;
import io.ultreia.java4all.application.template.spi.GenerateTemplate;
+import io.ultreia.java4all.util.SingletonSupplier;
import io.ultreia.java4all.util.matrix.DataMatrix;
+import java.net.URL;
import java.util.List;
+import java.util.Objects;
import java.util.Set;
/**
@@ -44,6 +48,7 @@ import java.util.Set;
*/
@GenerateTemplate(template = "reportHtmlExport.ftl")
public class HtmlExportModel {
+ private static SingletonSupplier<String> SCRIPT_CONTENT;
/**
* Selected report.
*/
@@ -52,7 +57,6 @@ public class HtmlExportModel {
* Selected data model.
*/
private final transient SelectDataModel selectDataModel;
-
private final List<String> columnNames;
private final List<String> rowNames;
private final DataMatrix data;
@@ -92,6 +96,15 @@ public class HtmlExportModel {
this.json = gson.toJson(this);
}
+ public String getScript() {
+ if (SCRIPT_CONTENT == null) {
+ String resourceName = getClass().getSimpleName() + ".js";
+ URL url = Objects.requireNonNull(getClass().getResource(resourceName), "Could not find resource: " + resourceName);
+ SCRIPT_CONTENT = ObserveUtil.loadResourceContentSupplier(url, content -> content.substring(content.indexOf("*/") + 2).trim());
+ }
+ return SCRIPT_CONTENT.get();
+ }
+
public String getJson() {
return json;
}
=====================================
client/datasource/actions/src/main/resources/fr/ird/observe/client/datasource/actions/report/HtmlExportModel.js
=====================================
@@ -0,0 +1,176 @@
+/*-
+ * #%L
+ * ObServe Client :: DataSource :: Actions
+ * %%
+ * Copyright (C) 2008 - 2023 IRD, Ultreia.io
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/gpl-3.0.html>.
+ * #L%
+ */
+class GridHandler {
+ language;
+ columns;
+ data;
+ searchOption;
+ resizableOption;
+ paginationOption;
+ paginationSizeOption;
+ sortOption;
+ gridContainerParent;
+ search;
+ sort;
+ resizable;
+ pagination;
+
+ constructor(document, language, createColumns, json) {
+ this.gridContainerParent = document.getElementById("wrapperParent");
+ this.searchOption = document.getElementById("search");
+ this.resizableOption = document.getElementById("resizable");
+ this.paginationOption = document.getElementById("pagination");
+ this.paginationSizeOption = document.getElementById("paginationSize");
+ this.sortOption = document.getElementById("sort");
+ this.language = language;
+ json.data.data = this.deserializeJson(json.data);
+ this.columns = createColumns(json);
+ this.data = json.data.data;
+ this.search = this.searchValue();
+ this.resizable = this.resizableValue();
+ this.sort = this.sortValue();
+ this.pagination = this.paginationValue();
+ }
+
+ updateGrid() {
+ this.gridContainerParent.innerHTML = '<div id="wrapper"></div>';
+ setTimeout(() => {
+ // noinspection JSUnresolvedReference
+ new gridjs.Grid({
+ language: this.language,
+ data: this.data,
+ columns: this.deepCopyColumns(this.columns),
+ search: this.search,
+ resizable: this.resizable,
+ sort: this.sort,
+ pagination: this.pagination,
+ }).render(document.getElementById("wrapper"));
+ }, 50);
+ }
+
+ deepCopyColumns(columns) {
+ let result = [];
+ let index = 0;
+ for (const column of columns) {
+ if (column instanceof Object) {
+ let newColumn = {};
+ newColumn['name'] = column['name'];
+ if (!!!column['formatter'] != null) {
+ newColumn['formatter'] = column['formatter'];
+ }
+ if (column['attributes'] != null) {
+ newColumn['attributes'] = column['attributes'];
+ }
+ result[index++] = newColumn;
+ } else {
+ result[index++] = column;
+ }
+ }
+ return result;
+ }
+
+ deserializeJson(json) {
+ let height = json.height;
+ let width = json.width;
+ let data = json.rows;
+ let result = new Array(height);
+ for (let row = 0; row < height; row++) {
+ let cells = data[row].split('||');
+ let realRow = new Array(width);
+ result[row] = realRow;
+ for (let column = 0; column < width; column++) {
+ let rowElement = cells[column];
+ realRow[column] = rowElement === '$' ? null : rowElement;
+ }
+ }
+ return result;
+ }
+
+ searchValue() {
+ return this.searchOption.checked;
+ }
+
+ resizableValue() {
+ return this.resizableOption.checked;
+ }
+
+ sortValue() {
+ return this.sortOption.checked;
+ }
+
+ paginationValue() {
+ return this.paginationOption.checked ? {limit: this.paginationSizeOption.value} : false;
+ }
+
+ toggleSearch(source) {
+ this.search = this.searchValue();
+ this.updateGrid();
+ }
+
+ toggleResizable(source) {
+ this.resizable = this.resizableValue();
+ this.updateGrid();
+ }
+
+ toggleSort(source) {
+ this.sort = this.sortValue();
+ this.updateGrid();
+ }
+
+ togglePagination(source) {
+ let newValue = source.checked;
+ if (newValue) {
+ this.paginationSizeOption["disabled"] = null;
+ } else {
+ this.paginationSizeOption.disabled = true;
+ }
+ this.pagination = this.paginationValue();
+ this.updateGrid();
+ }
+
+ changePaginationSize(source) {
+ this.pagination = this.paginationValue();
+ this.updateGrid();
+ }
+
+ init() {
+
+ this.updateGrid();
+ let that = this;
+ this.searchOption.addEventListener("change", function () {
+ that.toggleSearch(this);
+ });
+ this.resizableOption.addEventListener("change", function () {
+ that.toggleResizable(this);
+ });
+ this.sortOption.addEventListener("change", function () {
+ that.toggleSort(this);
+ });
+ this.paginationOption.addEventListener("change", function () {
+ that.togglePagination(this);
+ });
+
+ this.paginationSizeOption.addEventListener("change", function () {
+ that.changePaginationSize(this);
+ });
+ }
+}
=====================================
core/persistence/report/src/main/resources/observe-reports.properties
=====================================
@@ -888,8 +888,8 @@ Left Join t.localMarketSurveySamplingAcquisitionStatus localMarketSurveySampling
Left Join t.advancedSamplingAcquisitionStatus advancedSamplingAcquisitionStatus \
Where t.id In :tripId \
Order By vessel.code,t.startDate,t.endDate
-report.psLogbookTrip.columnRenderers.1.type=HighlightIfNotI18nReferentialValue
-report.psLogbookTrip.columnRenderers.1.parameters=14,15,16,17,18,19,20,21|fr.ird.referential.ps.common.AcquisitionStatus#1464000000000#001
+report.psLogbookTrip.columnRenderers.1.type=HighlightIfEquals18nReferentialValue
+report.psLogbookTrip.columnRenderers.1.parameters=14,15,16,17,18,19,20,21|fr.ird.referential.ps.common.AcquisitionStatus#1464000000000#999
report.psLogbookTrip.columnRenderers.2.type=HighlightIfAbsoluteDeltaIsPositive
report.psLogbookTrip.columnRenderers.2.parameters=10|11|0.0001|0.5
report.psLogbookTrip.columnRenderers.3.type=HighlightIfAbsoluteDeltaIsPositive
=====================================
src/site/markdown/report/embedded-column-renderers.md
=====================================
@@ -0,0 +1,60 @@
+# Documentation des règles de rendu de colonnes disponibles
+
+Ce document décrit toutes les règles de rendu de colonnes disponibles sur les rapports.
+
+### HighlightIfAbsoluteDeltaIsPositive
+
+Ce rendu permet de vérifier que les valeurs de chaque cellule de deux colonnes sont identiques.
+
+Si deux valeurs ne sont pas égales, on colorise la cellule en orange (avertissement) pour un premier seuil et en rouge
+(erreur) selon un second seuil.
+
+Le rendu nécessite quatre paramètres :
+
+* la première colonne
+* la seconde colonne
+* le seuil pour afficher des avertissements
+* le seuil pour afficher des erreurs
+
+Exemple d'utilisation :
+
+```properties
+report.xxx.columnRenderers.1.type=HighlightIfAbsoluteDeltaIsPositive
+report.ccc.columnRenderers.1.parameters=10|11|0.0001|0.5
+```
+
+### HighlightIfNumericalValueIsPositive
+
+Ce rendu permet de vérifier que les valeurs de chaque celleule d'une colonne n'est pas zéro.
+
+Si la valeur n'est pas zéro, on colorise la cellule en orange (avertissement) pour un premier seuil et en rouge
+(erreur) selon un second seuil.
+
+Le rendu nécessite quatre paramètres :
+
+* la colonne
+* le seuil pour afficher des avertissements
+* le seuil pour afficher des erreurs
+
+Exemple d'utilisation
+
+```properties
+report.xxx.columnRenderers.1.type=HighlightIfNumericalValueIsPositive
+report.xxx.columnRenderers.1.parameters=19|0.0001|0.5
+```
+
+### HighlightIfEquals18nReferentialValue
+
+Ce rendu permet d'afficher de coloriser en rouge toute cellule des colonnes sélectionnées dont la valeur (de type référentiel i18n) n'est pas celle spécifié (via son identifiant).
+
+Le rendu nécessite deux paramètres :
+
+* une liste de colonnes sépararées par des virgules
+* l'identifiant du référentiel à mettre en valeur
+
+Exemple d'utilisation :
+
+```properties
+report.xxx.columnRenderers.1.type=HighlightIfEquals18nReferentialValue
+report.xxx.columnRenderers.1.parameters=14,15,16,17,18,19,20,21|fr.ird.referential.ps.common.AcquisitionStatus#1464000000000#999
+```
=====================================
src/site/markdown/report/syntax.md
=====================================
@@ -319,6 +319,25 @@ report.xxx.operations.1.comment=Un commentaire optionnel pour documenter l'opér
Les opérations disponibles et leur documentation sont décrites dans le document [suivant](./embedded-operations.html).
+### Rendu de colonnes
+
+Depuis la version **9.3.0**, il est possible de définir des rendus de colonnes via le fichier de définition,
+ce rendu sera valable dans le client swing ainsi que dans les rapports html.
+
+Un rendu est défini par deux lignes :
+
+1. Une pour définir le type de rendu
+2. Une pour paramétrer ce rendu
+
+```properties
+report.xxx.columnRenderers.1.type=HighlightIfAbsoluteDeltaIsPositive
+report.ccc.columnRenderers.1.parameters=10|11|0.0001|0.5
+```
+
+Il est possible d'ajouter plusieurs rendus sur un même rapport.
+
+Les rendus disponibles et leur documentation sont décrits dans le document [suivant](./embedded-column-renderers.html).
+
## Pour aller plus loin
Vous pouvez aussi consulter la [documentation des rapports embarqués par l'application](./embedded-reports.html).
=====================================
toolkit/api-report/pom.xml
=====================================
@@ -38,10 +38,6 @@
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
- <dependency>
- <groupId>com.google.guava</groupId>
- <artifactId>guava</artifactId>
- </dependency>
<dependency>
<groupId>io.ultreia.java4all</groupId>
<artifactId>java-lang</artifactId>
=====================================
toolkit/api-report/src/main/java/fr/ird/observe/report/ColumnRendererConsumer.java
=====================================
@@ -22,7 +22,7 @@ package fr.ird.observe.report;
* #L%
*/
-import com.google.common.io.Resources;
+import fr.ird.observe.dto.ObserveUtil;
import fr.ird.observe.report.renderers.HighlightIfAbsoluteDeltaIsPositive;
import io.ultreia.java4all.util.SingletonSupplier;
import org.jdesktop.swingx.JXTable;
@@ -31,6 +31,8 @@ import org.jdesktop.swingx.decorator.HighlightPredicate;
import java.awt.Color;
import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.Objects;
@@ -53,13 +55,18 @@ public interface ColumnRendererConsumer<P extends ColumnRendererParameters> {
}
static SingletonSupplier<String> htmlFunctions(Class<?> type) {
- return SingletonSupplier.of(() -> {
- try {
- return Resources.toString(Objects.requireNonNull(HighlightIfAbsoluteDeltaIsPositive.class.getResource(type.getSimpleName() + ".js")), StandardCharsets.UTF_8);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- });
+ String resourceName = type.getSimpleName() + ".js";
+ URL url = Objects.requireNonNull(HighlightIfAbsoluteDeltaIsPositive.class.getResource(resourceName), "Could not find resource: " + resourceName);
+ return ObserveUtil.loadResourceContentSupplier(url, content -> content.substring(content.indexOf("*/") + 2));
+ }
+
+ static String loadResourceContent(URL url) {
+ try (InputStream in = url.openStream()) {
+ String content = new String(in.readAllBytes(), StandardCharsets.UTF_8);
+ return content.substring(content.indexOf("*/") + 2).trim();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
}
/**
=====================================
toolkit/api-report/src/main/java/fr/ird/observe/report/renderers/HighlightIfEquals18nReferentialValue.java
=====================================
@@ -0,0 +1,139 @@
+package fr.ird.observe.report.renderers;
+
+/*-
+ * #%L
+ * ObServe Toolkit :: API :: Report
+ * %%
+ * Copyright (C) 2008 - 2023 IRD, Ultreia.io
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/gpl-3.0.html>.
+ * #L%
+ */
+
+import com.google.auto.service.AutoService;
+import fr.ird.observe.report.ColumnRendererConsumer;
+import fr.ird.observe.report.ColumnRendererParameters;
+import fr.ird.observe.report.ReportRequestExecutor;
+import io.ultreia.java4all.util.SingletonSupplier;
+import org.jdesktop.swingx.JXTable;
+import org.jdesktop.swingx.decorator.ColorHighlighter;
+
+import java.awt.Color;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.TreeSet;
+
+import static fr.ird.observe.report.renderers.HighlightIfEquals18nReferentialValue.Parameters;
+
+/**
+ * Created at 02/12/2023.
+ *
+ * @author Tony Chemit - dev(a)tchemit.fr
+ * @since 9.3.0
+ */
+(a)AutoService(ColumnRendererConsumer.class)
+public class HighlightIfEquals18nReferentialValue implements ColumnRendererConsumer<Parameters> {
+ private final static SingletonSupplier<String> HTML_FUNCTION = ColumnRendererConsumer.htmlFunctions(HighlightIfNotI18nReferentialValue.class);
+
+ @Override
+ public int parametersCount() {
+ return 2;
+ }
+
+ @Override
+ public String parametersSyntax() {
+ return "column1,column2,...,columnN|id";
+ }
+
+ @Override
+ public Parameters parseParameters(String parameters) {
+ String[] split = pareParametersSyntax(parameters);
+ String[] split2 = split[0].trim().split("\\s*,\\s*");
+ Set<Integer> columns = new TreeSet<>();
+ for (String s : split2) {
+ columns.add(Integer.parseInt(s));
+ }
+ String id = split[1];
+ return new Parameters(columns, id);
+ }
+
+ @Override
+ public Parameters createParameters(ReportRequestExecutor requestExecutor, String parameters) {
+ Parameters result = ColumnRendererConsumer.super.createParameters(requestExecutor, parameters);
+ String label = requestExecutor.getReferentialLabel(result.getId());
+ return result.setLabel(label);
+ }
+
+ @Override
+ public Object consumeHtml(Parameters parameters) {
+ return Map.of("name", name(),
+ "columns", parameters.getColumns(),
+ "label", parameters.getLabel());
+ }
+
+ @Override
+ public void consumeSwing(Parameters parameters, JXTable table) {
+ table.addHighlighter(new ColorHighlighter((renderer, adapter) -> {
+ Object value = adapter.getValue();
+ int column = adapter.convertColumnIndexToModel(adapter.column);
+ return parameters.getColumns().contains(column) && Objects.equals(value, parameters.getLabel());
+ }, Color.RED, Color.BLACK));
+ }
+
+ @Override
+ public String htmlFunctions() {
+ return HTML_FUNCTION.get();
+ }
+
+ public static final class Parameters implements ColumnRendererParameters {
+ private final Set<Integer> columns;
+ private final String id;
+ private final String label;
+
+ public Parameters(Set<Integer> columns, String id, String label) {
+ this.columns = columns;
+ this.id = id;
+ this.label = label;
+ }
+
+ public Parameters(Set<Integer> columns, String id) {
+ this.columns = columns;
+ this.id = id;
+ this.label = null;
+ }
+
+ @Override
+ public String name() {
+ return HighlightIfEquals18nReferentialValue.class.getSimpleName();
+ }
+
+ public Set<Integer> getColumns() {
+ return columns;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public String getLabel() {
+ return label;
+ }
+
+ public Parameters setLabel(String label) {
+ return new Parameters(columns, id, label);
+ }
+ }
+}
=====================================
toolkit/api-report/src/main/resources/fr/ird/observe/report/renderers/HighlightIfEqualsI18nReferentialValue.js
=====================================
@@ -0,0 +1,44 @@
+/*-
+ * #%L
+ * ObServe Toolkit :: API :: Report
+ * %%
+ * Copyright (C) 2008 - 2023 IRD, Ultreia.io
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/gpl-3.0.html>.
+ * #L%
+ */
+function HighlightIfEqualsI18nReferentialValue(cell, label) {
+ if (!!!cell) {
+ return;
+ }
+ if (cell === label) {
+ return {
+ 'data-cell-content': cell,
+ 'class': 'gridjs-td cellError',
+ };
+ }
+}
+
+function initHighlightIfEqualsI18nReferentialValue(renderer, result, json) {
+ let columns = renderer["columns"];
+ let label = renderer["label"];
+ for (let j = 0; j < columns.length; j++) {
+ let column = columns[j];
+ result [column] = {
+ name: result [column],
+ attributes: cell => HighlightIfEqualsI18nReferentialValue(cell, label)
+ };
+ }
+}
=====================================
toolkit/api/src/main/java/fr/ird/observe/dto/ObserveUtil.java
=====================================
@@ -31,15 +31,21 @@ import fr.ird.observe.spi.module.BusinessSubModule;
import io.ultreia.java4all.config.ApplicationConfig;
import io.ultreia.java4all.config.ConfigResource;
import io.ultreia.java4all.lang.Strings;
+import io.ultreia.java4all.util.SingletonSupplier;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.config.Configurator;
import org.hashids.Hashids;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
+import java.io.IOException;
+import java.io.InputStream;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.net.MalformedURLException;
import java.net.URL;
+import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.text.Collator;
@@ -75,38 +81,7 @@ public class ObserveUtil {
public static final String PNG_EXTENSION = ".png";
public static final String JS_ENGINE_NAME = "rhino";
private static final Hashids ID_GENERATOR = new Hashids("ObServeHasSomeSalt", 8, "0123456789#abcdefghijklmnopqrestuvwxyz");
-
- @SuppressWarnings("rawtypes")
- private static class ClassComparator<C extends Class<?>> implements Comparator<C> {
-
- private final Map<Class, String> cache;
- private final Function<Class, String> function;
-
- private final Collator collator;
-
- private ClassComparator(Function<Class, String> function, Locale locale) {
- this.cache = new HashMap<>();
- this.function = function;
- this.collator = Collator.getInstance(locale);
- this.collator.setStrength(Collator.PRIMARY);
- }
-
- @Override
- public int compare(Class o1, Class o2) {
- String s1 = getValue(o1);
- String s2 = getValue(o2);
- return this.collator.compare(s1, s2);
- }
-
- String getValue(Class klass) {
- return cache.computeIfAbsent(klass, k -> function.apply(klass));
- }
-
- public void sort(List<C> list) {
- list.sort(this);
- cache.clear();
- }
- }
+ private static final Logger log = LogManager.getLogger(ObserveUtil.class);
public static String newUUID(Date now) {
return ID_GENERATOR.encode(now.getTime());
@@ -253,15 +228,62 @@ public class ObserveUtil {
}
/**
- *
* @param jsonString the json string in compact mode
* @return the gson in a pretty mode
*/
- public static String toPrettyFormat(String jsonString)
- {
+ public static String toPrettyFormat(String jsonString) {
JsonObject json = JsonParser.parseString(jsonString).getAsJsonObject();
Gson gson = new GsonBuilder().setPrettyPrinting().create();
return gson.toJson(json);
}
+
+ public static SingletonSupplier<String> loadResourceContentSupplier(URL url, Function<String, String> contentTransformer) {
+ return SingletonSupplier.of(() -> {
+ String content = loadResourceContent(url);
+ return contentTransformer == null ? content : contentTransformer.apply(content);
+ });
+ }
+
+ public static String loadResourceContent(URL url) {
+ log.info("Loading resource content: {}", url);
+ try (InputStream in = url.openStream()) {
+ String content = new String(in.readAllBytes(), StandardCharsets.UTF_8);
+ return content.substring(content.indexOf("*/") + 1);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @SuppressWarnings("rawtypes")
+ private static class ClassComparator<C extends Class<?>> implements Comparator<C> {
+
+ private final Map<Class, String> cache;
+ private final Function<Class, String> function;
+
+ private final Collator collator;
+
+ private ClassComparator(Function<Class, String> function, Locale locale) {
+ this.cache = new HashMap<>();
+ this.function = function;
+ this.collator = Collator.getInstance(locale);
+ this.collator.setStrength(Collator.PRIMARY);
+ }
+
+ @Override
+ public int compare(Class o1, Class o2) {
+ String s1 = getValue(o1);
+ String s2 = getValue(o2);
+ return this.collator.compare(s1, s2);
+ }
+
+ String getValue(Class klass) {
+ return cache.computeIfAbsent(klass, k -> function.apply(klass));
+ }
+
+ public void sort(List<C> list) {
+ list.sort(this);
+ cache.clear();
+ }
+ }
}
View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/b5febe07ec1ccb249e85d8b9f…
--
View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/b5febe07ec1ccb249e85d8b9f…
You're receiving this email because of your account on gitlab.com.
1
0
[Git][ultreiaio/ird-observe][develop] 2 commits: introduce ColumnRendererConsumer and ColumnRendererParameters API (add gson adapter) - See #2811
by Tony CHEMIT (@tchemit) 01 Dec '23
by Tony CHEMIT (@tchemit) 01 Dec '23
01 Dec '23
Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe
Commits:
fa6a51cc by Tony Chemit at 2023-12-01T18:19:29+01:00
introduce ColumnRendererConsumer and ColumnRendererParameters API (add gson adapter) - See #2811
- - - - -
515c32c1 by Tony Chemit at 2023-12-01T18:19:29+01:00
Add DataMatrix gson adapter (to reduce format) - See #2811
- - - - -
5 changed files:
- client/datasource/actions/src/main/i18n/templates/reportHtmlExport_en_GB.ftl
- client/datasource/actions/src/main/i18n/templates/reportHtmlExport_es_ES.ftl
- client/datasource/actions/src/main/i18n/templates/reportHtmlExport_fr_FR.ftl
- + toolkit/api-report/src/main/java/fr/ird/observe/report/json/ReportColumnRenderersParametersAdapter.java
- + toolkit/api/src/main/java/fr/ird/observe/spi/json/java4all/DataMatrixAdapter.java
Changes:
=====================================
client/datasource/actions/src/main/i18n/templates/reportHtmlExport_en_GB.ftl
=====================================
@@ -273,6 +273,23 @@
}, 50);
}
+ function deserializeJson(json) {
+ let height = json.height;
+ let width = json.width;
+ let data = json.rows;
+ let result = new Array(height);
+ for (let row = 0; row < height; row++) {
+ let cells = data[row].split('||');
+ let realRow = new Array(width);
+ result[row]=realRow;
+ for (let column = 0; column < width; column++) {
+ let rowElement = cells[column];
+ realRow[column] = rowElement ==='$'?null:rowElement;
+ }
+ }
+ return result;
+ }
+
<#list .data_model.columnRendererFunctions as key>
${key}</#list>
@@ -348,6 +365,7 @@ ${key}</#list>
<script type="application/javascript">
const json = ${.data_model.json};
+ json.data.data = deserializeJson(json.data);
const gridContainerParent = document.getElementById("wrapperParent");
const searchOption = document.getElementById("search");
=====================================
client/datasource/actions/src/main/i18n/templates/reportHtmlExport_es_ES.ftl
=====================================
@@ -273,6 +273,23 @@
}, 50);
}
+ function deserializeJson(json) {
+ let height = json.height;
+ let width = json.width;
+ let data = json.rows;
+ let result = new Array(height);
+ for (let row = 0; row < height; row++) {
+ let cells = data[row].split('||');
+ let realRow = new Array(width);
+ result[row]=realRow;
+ for (let column = 0; column < width; column++) {
+ let rowElement = cells[column];
+ realRow[column] = rowElement ==='$'?null:rowElement;
+ }
+ }
+ return result;
+ }
+
<#list .data_model.columnRendererFunctions as key>
${key}</#list>
@@ -347,6 +364,7 @@ ${key}</#list>
<script type="application/javascript">
const json = ${.data_model.json};
+ json.data.data = deserializeJson(json.data);
const gridContainerParent = document.getElementById("wrapperParent");
const searchOption = document.getElementById("search");
=====================================
client/datasource/actions/src/main/i18n/templates/reportHtmlExport_fr_FR.ftl
=====================================
@@ -274,6 +274,23 @@
}, 50);
}
+ function deserializeJson(json) {
+ let height = json.height;
+ let width = json.width;
+ let data = json.rows;
+ let result = new Array(height);
+ for (let row = 0; row < height; row++) {
+ let cells = data[row].split('||');
+ let realRow = new Array(width);
+ result[row]=realRow;
+ for (let column = 0; column < width; column++) {
+ let rowElement = cells[column];
+ realRow[column] = rowElement ==='$'?null:rowElement;
+ }
+ }
+ return result;
+ }
+
<#list .data_model.columnRendererFunctions as key>
${key}</#list>
@@ -348,6 +365,7 @@ ${key}</#list>
<script type="application/javascript">
const json = ${.data_model.json};
+ json.data.data = deserializeJson(json.data);
const gridContainerParent = document.getElementById("wrapperParent");
const searchOption = document.getElementById("search");
=====================================
toolkit/api-report/src/main/java/fr/ird/observe/report/json/ReportColumnRenderersParametersAdapter.java
=====================================
@@ -0,0 +1,84 @@
+package fr.ird.observe.report.json;
+
+/*-
+ * #%L
+ * ObServe Toolkit :: API :: Report
+ * %%
+ * Copyright (C) 2008 - 2023 IRD, Ultreia.io
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/gpl-3.0.html>.
+ * #L%
+ */
+
+import com.google.auto.service.AutoService;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
+import com.google.gson.JsonSerializationContext;
+import com.google.gson.JsonSerializer;
+import fr.ird.observe.report.ColumnRendererParameters;
+import fr.ird.observe.report.ReportColumnRenderersParameters;
+import io.ultreia.java4all.lang.Objects2;
+import io.ultreia.java4all.util.json.JsonAdapter;
+
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created at 01/12/2023.
+ *
+ * @author Tony Chemit - dev(a)tchemit.fr
+ * @since 9.3.0
+ */
+(a)AutoService(JsonAdapter.class)
+public class ReportColumnRenderersParametersAdapter implements JsonDeserializer<ReportColumnRenderersParameters>, JsonSerializer<ReportColumnRenderersParameters>, JsonAdapter {
+
+ private static final String TYPE = "type";
+ private static final String VALUE = "value";
+
+ @Override
+ public Class<?> type() {
+ return ReportColumnRenderersParameters.class;
+ }
+
+ @Override
+ public ReportColumnRenderersParameters deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException {
+ JsonArray columnRendererParametersJson = json.getAsJsonArray();
+ List<ColumnRendererParameters> list = new ArrayList<>(columnRendererParametersJson.size());
+ for (JsonElement itemJson : columnRendererParametersJson) {
+ JsonObject asJsonObject = itemJson.getAsJsonObject();
+ String key = context.deserialize(asJsonObject.get(TYPE), String.class);
+ Class<ColumnRendererParameters> itemType = Objects2.forName(key);
+ list.add(context.deserialize(asJsonObject.get(VALUE), itemType));
+ }
+ return new ReportColumnRenderersParameters(list);
+ }
+
+ @Override
+ public JsonElement serialize(ReportColumnRenderersParameters src, Type typeOfSrc, JsonSerializationContext context) {
+ JsonArray result = new JsonArray();
+ for (ColumnRendererParameters columnRendererParameter : src.getColumnRendererParameters()) {
+ JsonObject item = new JsonObject();
+ item.addProperty(TYPE, columnRendererParameter.getClass().getName());
+ item.add(VALUE, context.serialize(columnRendererParameter));
+ result.add(item);
+ }
+ return result;
+ }
+}
=====================================
toolkit/api/src/main/java/fr/ird/observe/spi/json/java4all/DataMatrixAdapter.java
=====================================
@@ -0,0 +1,103 @@
+package fr.ird.observe.spi.json.java4all;
+
+/*-
+ * #%L
+ * ObServe Toolkit :: API
+ * %%
+ * Copyright (C) 2008 - 2023 IRD, Ultreia.io
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/gpl-3.0.html>.
+ * #L%
+ */
+
+import com.google.auto.service.AutoService;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
+import com.google.gson.JsonPrimitive;
+import com.google.gson.JsonSerializationContext;
+import com.google.gson.JsonSerializer;
+import io.ultreia.java4all.util.json.JsonAdapter;
+import io.ultreia.java4all.util.matrix.DataMatrix;
+
+import java.lang.reflect.Type;
+import java.util.Arrays;
+import java.util.stream.Collectors;
+
+/**
+ * Created at 01/12/2023.
+ *
+ * @author Tony Chemit - dev(a)tchemit.fr
+ * @since 9.3.0
+ */
+(a)AutoService(JsonAdapter.class)
+public class DataMatrixAdapter implements JsonDeserializer<DataMatrix>, JsonSerializer<DataMatrix>, JsonAdapter {
+
+ private static final String WIDTH = "width";
+ private static final String HEIGHT = "height";
+ private static final String X = "x";
+ private static final String Y = "y";
+ private static final String ROWS = "rows";
+
+ @Override
+ public Class<?> type() {
+ return DataMatrix.class;
+ }
+
+ @Override
+ public DataMatrix deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException {
+ JsonObject dataMatrixAsJsonObject = json.getAsJsonObject();
+
+ DataMatrix result = new DataMatrix();
+ result.setWidth(context.deserialize(dataMatrixAsJsonObject.get(WIDTH), int.class));
+ result.setHeight(context.deserialize(dataMatrixAsJsonObject.get(HEIGHT), int.class));
+ result.setX(context.deserialize(dataMatrixAsJsonObject.get(X), int.class));
+ result.setY(context.deserialize(dataMatrixAsJsonObject.get(Y), int.class));
+ JsonArray rows = dataMatrixAsJsonObject.getAsJsonArray(ROWS);
+ Object[][] data = new Object[result.getHeight()][result.getWidth()];
+ int index = 0;
+ for (JsonElement rowElement : rows) {
+ String[] deserialize = rowElement.getAsString().split("\\|\\|");
+ Object[] row = new Object[deserialize.length];
+ for (int i = 0; i < deserialize.length; i++) {
+ String s = deserialize[i];
+ row[i] = s.equals("$") ? null : s;
+ }
+ data[index++] = row;
+ }
+ result.setData(data);
+ return result;
+ }
+
+ @Override
+ public JsonElement serialize(DataMatrix src, Type typeOfSrc, JsonSerializationContext context) {
+ JsonObject result = new JsonObject();
+ result.addProperty(WIDTH, src.getWidth());
+ result.addProperty(HEIGHT, src.getHeight());
+ result.addProperty(X, src.getX());
+ result.addProperty(Y, src.getY());
+ JsonArray rows = new JsonArray(src.getHeight());
+ result.add(ROWS, rows);
+ for (Object[] row : src.getData()) {
+ rows.add(new JsonPrimitive(Arrays.stream(row).map(d -> d == null ? "$" : d.toString()).collect(Collectors.joining("||"))));
+ }
+
+ return result;
+ }
+}
+
View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/7e08d2ef3db60c7595a97ff4…
--
View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/7e08d2ef3db60c7595a97ff4…
You're receiving this email because of your account on gitlab.com.
1
0
[Git][ultreiaio/ird-observe][develop] 6 commits: Review SubtractColum to a better null management
by Tony CHEMIT (@tchemit) 01 Dec '23
by Tony CHEMIT (@tchemit) 01 Dec '23
01 Dec '23
Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe
Commits:
d8b081ff by Tony Chemit at 2023-12-01T15:35:26+01:00
Review SubtractColum to a better null management
- - - - -
a88911d9 by Tony Chemit at 2023-12-01T15:54:38+01:00
Review first ColumnRendererConsumer (add null management + improve the code)
- - - - -
44de672d by Tony Chemit at 2023-12-01T15:54:38+01:00
Rename html export configuration tab to metadata
- - - - -
3f0ecbae by Tony Chemit at 2023-12-01T15:55:24+01:00
Improve report html export (now fill the hole cell :))
- - - - -
bbeeac87 by Tony Chemit at 2023-12-01T16:06:32+01:00
Merge branch 'feature/issue-2811' into develop
Définir les règles de mise en forme conditionnelle sur les tableaux de synthèse
- Closes #2811
- - - - -
7e08d2ef by Tony Chemit at 2023-12-01T16:08:17+01:00
Add client configuration option skipConsolidateStepForReport - Closes #281x ?
- - - - -
19 changed files:
- client/configuration/src/main/config/Client.ini
- client/configuration/src/main/i18n/getters/config.getter
- client/core/src/main/java/fr/ird/observe/client/main/body/ClientConfigUI.java
- client/datasource/actions/src/main/i18n/templates/reportHtmlExport_en_GB.ftl
- client/datasource/actions/src/main/i18n/templates/reportHtmlExport_es_ES.ftl
- client/datasource/actions/src/main/i18n/templates/reportHtmlExport_fr_FR.ftl
- client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/consolidate/ConsolidateModel.java
- client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/consolidate/actions/Start.java
- client/runner/src/main/i18n/translations/client-runner_en_GB.properties
- client/runner/src/main/i18n/translations/client-runner_es_ES.properties
- client/runner/src/main/i18n/translations/client-runner_fr_FR.properties
- core/services/test/src/main/resources/fixtures/fr/ird/observe/services/service/ReportService-psLogbookWellPlanCheck.properties
- toolkit/api-report/src/main/java/fr/ird/observe/report/ColumnRendererConsumer.java
- toolkit/api-report/src/main/java/fr/ird/observe/report/operations/SubtractColum.java
- toolkit/api-report/src/main/java/fr/ird/observe/report/renderers/HighlightIfAbsoluteDeltaIsPositive.java
- toolkit/api-report/src/main/java/fr/ird/observe/report/renderers/HighlightIfNumericalValueIsPositive.java
- toolkit/api-report/src/main/resources/fr/ird/observe/report/renderers/HighlightIfAbsoluteDeltaIsPositive.js
- toolkit/api-report/src/main/resources/fr/ird/observe/report/renderers/HighlightIfNotI18nReferentialValue.js
- toolkit/api-report/src/main/resources/fr/ird/observe/report/renderers/HighlightIfNumericalValueIsPositive.js
Changes:
=====================================
client/configuration/src/main/config/Client.ini
=====================================
@@ -1047,6 +1047,12 @@ key = ui.tree.config.node.unsaved.color
type = color
defaultValue = java.awt.Color[r=255,g=0,b=0]
+[option skipConsolidateStepForReport]
+description = observe.config.ui.actions.report.skipConsolidateStep
+key = ui.actions.report.skipConsolidateStep
+type = Boolean
+defaultValue = false
+
[action adminUi]
description = observe.ui.action.commandline.launch.admin.ui
action = fr.ird.observe.client.ObserveCLAction#launchAdminUI
=====================================
client/configuration/src/main/i18n/getters/config.getter
=====================================
@@ -121,6 +121,7 @@ observe.config.swingPreferencesFile.description
observe.config.swingSessionFile.description
observe.config.temperature.format
observe.config.temporaryDirectory.description
+observe.config.ui.actions.report.skipConsolidateStep
observe.config.ui.autoPopupNumberEditor
observe.config.ui.autoSelectText
observe.config.ui.blockStateColor
=====================================
client/core/src/main/java/fr/ird/observe/client/main/body/ClientConfigUI.java
=====================================
@@ -408,6 +408,7 @@ public class ClientConfigUI extends JXTitledPanel implements WithClientUIContext
helper.addOption(ClientConfigOption.SHOW_SQL);
helper.addOption(ClientConfigOption.USE_JVM_KEY_STORE);
+ helper.addOption(ClientConfigOption.SKIP_CONSOLIDATE_STEP_FOR_REPORT);
}
=====================================
client/datasource/actions/src/main/i18n/templates/reportHtmlExport_en_GB.ftl
=====================================
@@ -40,6 +40,7 @@
margin-right: 10px;
}
+ <#--noinspection CssUnusedSymbol-->
td.gridjs-td {
background-color: transparent;
}
@@ -61,28 +62,44 @@
color: #fff;
}
+ tr:hover td[class~="cellNull"] {
+ background-color: rgb(160, 160, 160);
+ }
+
+ tr:hover td[class~="cellWarning"] {
+ background-color: rgb(255, 175, 10);
+ }
+
+ tr:hover td[class~="cellError"] {
+ background-color: rgb(255, 10, 10);
+ }
+
+ <#--noinspection CssUnusedSymbol-->
+ td.cellNull {
+ background-color: rgb(128, 128, 128);
+ }
<#--noinspection CssUnusedSymbol-->
- .cellWarning {
- background-color: orange;
+ td.cellWarning {
+ background-color: rgb(255, 165, 0);
}
- <#-- <#–noinspection CssUnusedSymbol–>-->
- <#-- td:has(span.cellWarning):before {-->
- <#-- padding-right: 8px;-->
- <#-- content: "\26A0";-->
- <#-- }-->
+<#-- <#–noinspection CssUnusedSymbol–>-->
+<#-- td:has(span.cellWarning):before {-->
+<#-- padding-right: 8px;-->
+<#-- content: "\26A0";-->
+<#-- }-->
<#--noinspection CssUnusedSymbol-->
- .cellError {
- background-color: red;
+ td.cellError {
+ background-color: rgb(255, 0, 0);
}
- <#-- <#–noinspection CssUnusedSymbol–>-->
- <#-- td:has(span.cellError):before {-->
- <#-- padding-right: 8px;-->
- <#-- content: "\26D4";-->
- <#-- }-->
+<#-- <#–noinspection CssUnusedSymbol–>-->
+<#-- td:has(span.cellError):before {-->
+<#-- padding-right: 8px;-->
+<#-- content: "\26D4";-->
+<#-- }-->
.widget {
position: relative;
@@ -257,7 +274,7 @@
}
<#list .data_model.columnRendererFunctions as key>
- ${key}</#list>
+${key}</#list>
function createColumns(json) {
let result = !!json["columnNames"] ? json["columnNames"] : [];
@@ -266,6 +283,7 @@
}
let renderers = json["columnRendererDefinitions"];
let i = 0;
+ let data = json.data;
<#list .data_model.columnRendererInitCode as value>
${value}</#list>
return result;
@@ -323,7 +341,7 @@
</div>
</div>
<ul class="widget-tabs">
- <li class="widget-tab"><a href="#tab-configuration" class="widget-tab-link">Configuration</a>
+ <li class="widget-tab"><a href="#tab-configuration" class="widget-tab-link">Metadata</a>
<li class="widget-tab"><a href="#tab-result" class="widget-tab-link">Result</a>
</ul>
</div>
=====================================
client/datasource/actions/src/main/i18n/templates/reportHtmlExport_es_ES.ftl
=====================================
@@ -40,6 +40,7 @@
margin-right: 10px;
}
+ <#--noinspection CssUnusedSymbol-->
td.gridjs-td {
background-color: transparent;
}
@@ -61,28 +62,44 @@
color: #fff;
}
+ tr:hover td[class~="cellNull"] {
+ background-color: rgb(160, 160, 160);
+ }
+
+ tr:hover td[class~="cellWarning"] {
+ background-color: rgb(255, 175, 10);
+ }
+
+ tr:hover td[class~="cellError"] {
+ background-color: rgb(255, 10, 10);
+ }
<#--noinspection CssUnusedSymbol-->
- .cellWarning {
- background-color: orange;
+ td.cellNull {
+ background-color: rgb(128, 128, 128);
}
- <#-- <#–noinspection CssUnusedSymbol–>-->
- <#-- td:has(span.cellWarning):before {-->
- <#-- padding-right: 8px;-->
- <#-- content: "\26A0";-->
- <#-- }-->
+ <#--noinspection CssUnusedSymbol-->
+ td.cellWarning {
+ background-color: rgb(255, 165, 0);
+ }
+
+<#-- <#–noinspection CssUnusedSymbol–>-->
+<#-- td:has(span.cellWarning):before {-->
+<#-- padding-right: 8px;-->
+<#-- content: "\26A0";-->
+<#-- }-->
<#--noinspection CssUnusedSymbol-->
- .cellError {
- background-color: red;
+ td.cellError {
+ background-color: rgb(255, 0, 0);
}
- <#-- <#–noinspection CssUnusedSymbol–>-->
- <#-- td:has(span.cellError):before {-->
- <#-- padding-right: 8px;-->
- <#-- content: "\26D4";-->
- <#-- }-->
+<#-- <#–noinspection CssUnusedSymbol–>-->
+<#-- td:has(span.cellError):before {-->
+<#-- padding-right: 8px;-->
+<#-- content: "\26D4";-->
+<#-- }-->
.widget {
position: relative;
@@ -257,7 +274,7 @@
}
<#list .data_model.columnRendererFunctions as key>
- ${key}</#list>
+${key}</#list>
function createColumns(json) {
let result = !!json["columnNames"] ? json["columnNames"] : [];
@@ -266,6 +283,7 @@
}
let renderers = json["columnRendererDefinitions"];
let i = 0;
+ let data = json.data;
<#list .data_model.columnRendererInitCode as value>
${value}</#list>
return result;
@@ -310,7 +328,6 @@
</ul>
</div>
<div class="widget-list" id="tab-result">
-
<div class="config-panel">
<label><input id="search" type="checkbox" checked/> Search</label>|
<label><input id="resizable" type="checkbox" checked/> Resizable columns</label>|
@@ -323,10 +340,11 @@
</div>
</div>
<ul class="widget-tabs">
- <li class="widget-tab"><a href="#tab-configuration" class="widget-tab-link">Configuration</a>
+ <li class="widget-tab"><a href="#tab-configuration" class="widget-tab-link">Metadata</a>
<li class="widget-tab"><a href="#tab-result" class="widget-tab-link">Result</a>
</ul>
</div>
+
<script type="application/javascript">
const json = ${.data_model.json};
=====================================
client/datasource/actions/src/main/i18n/templates/reportHtmlExport_fr_FR.ftl
=====================================
@@ -63,9 +63,26 @@
color: #fff;
}
+ tr:hover td[class~="cellNull"] {
+ background-color: rgb(160, 160, 160);
+ }
+
+ tr:hover td[class~="cellWarning"] {
+ background-color: rgb(255, 175, 10);
+ }
+
+ tr:hover td[class~="cellError"] {
+ background-color: rgb(255, 10, 10);
+ }
+
+ <#--noinspection CssUnusedSymbol-->
+ td.cellNull {
+ background-color: rgb(128, 128, 128);
+ }
+
<#--noinspection CssUnusedSymbol-->
- .cellWarning {
- background-color: orange;
+ td.cellWarning {
+ background-color: rgb(255, 165, 0);
}
<#-- <#–noinspection CssUnusedSymbol–>-->
@@ -75,8 +92,8 @@
<#-- }-->
<#--noinspection CssUnusedSymbol-->
- .cellError {
- background-color: red;
+ td.cellError {
+ background-color: rgb(255, 0, 0);
}
<#-- <#–noinspection CssUnusedSymbol–>-->
@@ -267,6 +284,7 @@ ${key}</#list>
}
let renderers = json["columnRendererDefinitions"];
let i = 0;
+ let data = json.data;
<#list .data_model.columnRendererInitCode as value>
${value}</#list>
return result;
@@ -323,7 +341,7 @@ ${key}</#list>
</div>
</div>
<ul class="widget-tabs">
- <li class="widget-tab"><a href="#tab-configuration" class="widget-tab-link">Configuration</a>
+ <li class="widget-tab"><a href="#tab-configuration" class="widget-tab-link">Méta-données</a>
<li class="widget-tab"><a href="#tab-result" class="widget-tab-link">Résultat</a>
</ul>
</div>
=====================================
client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/consolidate/ConsolidateModel.java
=====================================
@@ -53,6 +53,7 @@ public class ConsolidateModel extends AdminActionModel {
private boolean consolidationFailIfLengthWeightParameterNotFound;
private boolean consolidationFailIfLengthLengthParameterNotFound;
+ private boolean skipForReport;
public ConsolidateModel() {
super(AdminStep.CONSOLIDATE);
@@ -87,6 +88,7 @@ public class ConsolidateModel extends AdminActionModel {
setConsolidationFailIfLengthWeightParameterNotFound(getClientConfig().isConsolidationFailIfLengthWeightParameterNotFound());
setConsolidationFailIfLengthLengthParameterNotFound(getClientConfig().isConsolidationFailIfLengthLengthParameterNotFound());
+ uiModel.getConsolidateModel().setSkipForReport(getClientConfig().isSkipConsolidateStepForReport());
}
@Override
@@ -121,4 +123,12 @@ public class ConsolidateModel extends AdminActionModel {
this.consolidationFailIfLengthLengthParameterNotFound = consolidationFailIfLengthLengthParameterNotFound;
firePropertyChange("consolidationFailIfLengthLengthParameterNotFound", oldValue, consolidationFailIfLengthLengthParameterNotFound);
}
+
+ public boolean isSkipForReport() {
+ return skipForReport;
+ }
+
+ public void setSkipForReport(boolean skipForReport) {
+ this.skipForReport = skipForReport;
+ }
}
=====================================
client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/consolidate/actions/Start.java
=====================================
@@ -87,7 +87,9 @@ public class Start extends AdminTabUIActionSupport<ConsolidateUI> {
ConsolidateModel stepModel = ui.getStepModel();
AdminUIModel model = ui.getModel();
-
+ if (stepModel.isSkipForReport()) {
+ return WizardState.SUCCESSED;
+ }
stepModel.setSource(model.getConfigModel().getLeftSourceModel().getSafeSource(false));
Set<String> tripIds = model.getSelectDataModel().getSelectionDataModel().getSelectedDataIds();
=====================================
client/runner/src/main/i18n/translations/client-runner_en_GB.properties
=====================================
@@ -138,6 +138,7 @@ observe.config.swingPreferencesFile.description=Swing preferences file.
observe.config.swingSessionFile.description=Swing session file.
observe.config.temperature.format=Default temperature unit
observe.config.temporaryDirectory.description=Default temporary directory used by application and clean at each launch.
+observe.config.ui.actions.report.skipConsolidateStep=To skip consolidate step in action Report
observe.config.ui.autoPopupNumberEditor=To auto popup on number editor when it acquires the focus
observe.config.ui.autoSelectText=To auto select text in widgets when it acquires the focus
observe.config.ui.blockStateColor=Color of block state
=====================================
client/runner/src/main/i18n/translations/client-runner_es_ES.properties
=====================================
@@ -138,6 +138,7 @@ observe.config.swingPreferencesFile.description=Swing preferences file.
observe.config.swingSessionFile.description=Copia de seguridad del estado del UI.
observe.config.temperature.format=Unidad de temperatura
observe.config.temporaryDirectory.description=Directorio temporal por defecto
+observe.config.ui.actions.report.skipConsolidateStep=To skip consolidate step in action Report \#TODO
observe.config.ui.autoPopupNumberEditor=Para mostrar automáticamente el editor numérico durante la edición de un número
observe.config.ui.autoSelectText=To auto select text in widgets when it acquires the focus \#TODO
observe.config.ui.blockStateColor=Color of block state \#TODO
=====================================
client/runner/src/main/i18n/translations/client-runner_fr_FR.properties
=====================================
@@ -138,6 +138,7 @@ observe.config.swingPreferencesFile.description=Fichier de sauvegarde des préf
observe.config.swingSessionFile.description=Fichier de sauvegarde des états des UI.
observe.config.temperature.format=Unité de température
observe.config.temporaryDirectory.description=Le répertoire temporaire par défaut
+observe.config.ui.actions.report.skipConsolidateStep=Pour ne pas exécuter l'étape de consolidation dans l'assistant des rapports
observe.config.ui.autoPopupNumberEditor=Pour afficher automatiquement l'éditeur numérique lors de l'édition d'un nombre
observe.config.ui.autoSelectText=Pour sélectionner le texte sur les éditeurs lorsqu'il acquière le focus
observe.config.ui.blockStateColor=Couleur lorsque l'on bloque une partie de l'application
=====================================
core/services/test/src/main/resources/fixtures/fr/ird/observe/services/service/ReportService-psLogbookWellPlanCheck.properties
=====================================
@@ -29,6 +29,6 @@ syntax.nbRequests=5
result.columns=20
result.rows=4
result.0=483^CAP BOJADOR^30/03/2019^08/04/2019^30/03/2019^1^15:12^0.0^123.0^43.0^0.0^0.0^0.0^0.0^12.0^0.0^0.0^166.0^12.0^154.0
-result.1=483^CAP BOJADOR^30/03/2019^08/04/2019^01/04/2019^1^15:12^null^null^null^null^null^null^null^null^null^null^null^null^-
-result.2=483^CAP BOJADOR^30/03/2019^08/04/2019^01/04/2019^1^15:12^null^null^null^null^null^null^null^null^null^null^null^null^-
-result.3=Total^null^null^null^null^null^-^0.0^123.0^43.0^0.0^0.0^0.0^0.0^12.0^0.0^0.0^166.0^12.0^-
\ No newline at end of file
+result.1=483^CAP BOJADOR^30/03/2019^08/04/2019^01/04/2019^1^15:12^null^null^null^null^null^null^null^null^null^null^null^null^null
+result.2=483^CAP BOJADOR^30/03/2019^08/04/2019^01/04/2019^1^15:12^null^null^null^null^null^null^null^null^null^null^null^null^null
+result.3=Total^null^null^null^null^null^-^0.0^123.0^43.0^0.0^0.0^0.0^0.0^12.0^0.0^0.0^166.0^12.0^154.0
\ No newline at end of file
=====================================
toolkit/api-report/src/main/java/fr/ird/observe/report/ColumnRendererConsumer.java
=====================================
@@ -44,9 +44,12 @@ import java.util.Objects;
*/
public interface ColumnRendererConsumer<P extends ColumnRendererParameters> {
- static void addHighLighters(JXTable table, HighlightPredicate warningDPredicate, HighlightPredicate errorPredicate) {
+ static void addHighLighters(JXTable table, HighlightPredicate nullPredicate, HighlightPredicate warningPredicate, HighlightPredicate errorPredicate) {
+ if (nullPredicate != null) {
+ table.addHighlighter(new ColorHighlighter(nullPredicate, Color.GRAY, Color.BLACK));
+ }
table.addHighlighter(new ColorHighlighter(errorPredicate, Color.RED, Color.BLACK));
- table.addHighlighter(new ColorHighlighter(warningDPredicate, Color.ORANGE, Color.BLACK));
+ table.addHighlighter(new ColorHighlighter(warningPredicate, Color.ORANGE, Color.BLACK));
}
static SingletonSupplier<String> htmlFunctions(Class<?> type) {
@@ -94,6 +97,6 @@ public interface ColumnRendererConsumer<P extends ColumnRendererParameters> {
String htmlFunctions();
default String htmlInitCode() {
- return String.format("init%s(renderers[i++], result);\n", getClass().getSimpleName());
+ return String.format("init%s(renderers[i++], result, data);\n", getClass().getSimpleName());
}
}
=====================================
toolkit/api-report/src/main/java/fr/ird/observe/report/operations/SubtractColum.java
=====================================
@@ -73,22 +73,27 @@ public class SubtractColum implements ReportOperationConsumer {
Double v1 = getValue(row, column1, incoming);
Double v2 = getValue(row, column2, incoming);
- if (v1 == null || v2 == null) {
- return "-";
+ if (v1 == null && v2 == null) {
+ return null;
+ }
+ if (v1 == null) {
+ v1 = 0d;
+ }
+ if (v2 == null) {
+ v2 = 0d;
}
float result = (float) (v1 - v2);
return Numbers.roundFourDigits(result);
}
- protected Double getValue(int x, int y, DataMatrix incoming) {
- Serializable o = incoming.getValue(y, x);
+ protected Double getValue(int row, int column, DataMatrix incoming) {
+ Serializable o = incoming.getValue(column, row);
if (o == null || "null".equals(o)) {
return null;
}
try {
return Double.parseDouble(o.toString());
} catch (NumberFormatException e) {
- // une des données de la colonne n'est pas un count on sort directement
log.debug(String.format("Could not convert %s to number", o), e);
return null;
}
=====================================
toolkit/api-report/src/main/java/fr/ird/observe/report/renderers/HighlightIfAbsoluteDeltaIsPositive.java
=====================================
@@ -78,6 +78,7 @@ public class HighlightIfAbsoluteDeltaIsPositive implements ColumnRendererConsume
@Override
public void consumeSwing(Parameters parameters, JXTable table) {
ColumnRendererConsumer.addHighLighters(table,
+ new ParametersHighlightPredicate(parameters, null),
new ParametersHighlightPredicate(parameters, true),
new ParametersHighlightPredicate(parameters, false));
}
@@ -124,9 +125,9 @@ public class HighlightIfAbsoluteDeltaIsPositive implements ColumnRendererConsume
static class ParametersHighlightPredicate implements HighlightPredicate {
private final Parameters parameters;
- private final boolean warning;
+ private final Boolean warning;
- ParametersHighlightPredicate(Parameters parameters, boolean warning) {
+ ParametersHighlightPredicate(Parameters parameters, Boolean warning) {
this.parameters = parameters;
this.warning = warning;
}
@@ -137,13 +138,16 @@ public class HighlightIfAbsoluteDeltaIsPositive implements ColumnRendererConsume
if (column != parameters.getColumn1() && column != parameters.getColumn2()) {
return false;
}
- Object value1 = adapter.getValue(parameters.getColumn1());
+ Object value1 = adapter.getValue();
if (value1 == null || value1.toString().equals("-")) {
+ return warning == null;
+ }
+ if (warning == null) {
return false;
}
- Object value2 = adapter.getValue(parameters.getColumn2());
+ Object value2 = adapter.getValue(column == parameters.getColumn1() ? parameters.getColumn2() : parameters.getColumn1());
if (value2 == null || value2.toString().equals("-")) {
- return false;
+ return !warning;
}
Double d1 = Double.valueOf(value1.toString());
Double d2 = Double.valueOf(value2.toString());
=====================================
toolkit/api-report/src/main/java/fr/ird/observe/report/renderers/HighlightIfNumericalValueIsPositive.java
=====================================
@@ -76,6 +76,7 @@ public class HighlightIfNumericalValueIsPositive implements ColumnRendererConsum
@Override
public void consumeSwing(Parameters parameters, JXTable table) {
ColumnRendererConsumer.addHighLighters(table,
+ new ParametersHighlightPredicate(parameters, null),
new ParametersHighlightPredicate(parameters, true),
new ParametersHighlightPredicate(parameters, false));
}
@@ -117,9 +118,9 @@ public class HighlightIfNumericalValueIsPositive implements ColumnRendererConsum
static class ParametersHighlightPredicate implements HighlightPredicate {
private final Parameters parameters;
- private final boolean warning;
+ private final Boolean warning;
- ParametersHighlightPredicate(Parameters parameters, boolean warning) {
+ ParametersHighlightPredicate(Parameters parameters, Boolean warning) {
this.parameters = parameters;
this.warning = warning;
}
@@ -130,8 +131,11 @@ public class HighlightIfNumericalValueIsPositive implements ColumnRendererConsum
if (column != parameters.getColumn()) {
return false;
}
- Object value1 = adapter.getValue(parameters.getColumn());
+ Object value1 = adapter.getValue();
if (value1 == null || value1.toString().equals("-")) {
+ return warning == null;
+ }
+ if (warning == null) {
return false;
}
double d1 = Double.parseDouble(value1.toString());
=====================================
toolkit/api-report/src/main/resources/fr/ird/observe/report/renderers/HighlightIfAbsoluteDeltaIsPositive.js
=====================================
@@ -19,38 +19,67 @@
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
-function HighlightIfAbsoluteDeltaIsPositive(row, column1, column2, warningThreshHold, errorThreshHold) {
- let value1 = row.cells[column1].data;
- let value2 = row.cells[column2].data;
- if (!!!value1 || value2 === "-") {
- return value1;
+function HighlightIfAbsoluteDeltaIsPositive(cell, row, column2, warningThreshHold, errorThreshHold) {
+ if (!cell) {
+ return;
+ }
+ if (!!!cell || cell === "-") {
+ return {
+ 'data-cell-content': "",
+ 'class': 'gridjs-td cellNull',
+ };
}
- if (!!!value2 || value2 === "-") {
- return value1;
+ let value2 = row.cells[column2].data;
+ if (!!!value2 || value2 === " ") {
+ return;
}
- if (value1 === value2) {
- return value1;
+ if (cell === value2) {
+ return;
}
- let delta = Math.abs(value1 - value2);
+ let delta = Math.abs(cell - value2);
if (delta < warningThreshHold) {
- return value1;
+ return;
}
- let className = delta < errorThreshHold ? "cellWarning" : "cellError";
- // noinspection JSUnresolvedReference
- return gridjs.html(`<span class="${className}"\>${value1}</span>`);
+ return {
+ 'data-cell-content': cell,
+ 'class': 'gridjs-td ' + (delta < errorThreshHold ? "cellWarning" : "cellError"),
+ };
}
-function initHighlightIfAbsoluteDeltaIsPositive(renderer, result) {
+function initHighlightIfAbsoluteDeltaIsPositive(renderer, result, json) {
let column1 = renderer["column1"];
let column2 = renderer["column2"];
+ let height = json.height;
+ let data = json.data;
+ for (let row = 0; row < height; row++) {
+ for (let column = column1; column <= column2; column++) {
+ if (!!!data[row][column]) {
+ data[row][column] = "-";
+ }
+ }
+ }
let warningThreshHold = renderer["warningThreshHold"];
let errorThreshHold = renderer["errorThreshHold"];
result[column1] = {
name: result [column1],
- formatter: (_, row) => HighlightIfAbsoluteDeltaIsPositive(row, column1, column2, warningThreshHold, errorThreshHold)
+ formatter: cell => {
+ if (!!!cell || cell === "-") {
+ // noinspection JSUnresolvedReference
+ return gridjs.html(" ");
+ }
+ return cell;
+ },
+ attributes: (cell, row) => HighlightIfAbsoluteDeltaIsPositive(cell, row, column2, warningThreshHold, errorThreshHold)
};
result[column2] = {
name: result [column2],
- formatter: (_, row) => HighlightIfAbsoluteDeltaIsPositive(row, column2, column1, warningThreshHold, errorThreshHold)
+ formatter: cell => {
+ if (!!!cell || cell === "-") {
+ // noinspection JSUnresolvedReference
+ return gridjs.html(" ");
+ }
+ return cell;
+ },
+ attributes: (cell, row) => HighlightIfAbsoluteDeltaIsPositive(cell, row, column1, warningThreshHold, errorThreshHold)
};
-}
+}
\ No newline at end of file
=====================================
toolkit/api-report/src/main/resources/fr/ird/observe/report/renderers/HighlightIfNotI18nReferentialValue.js
=====================================
@@ -19,26 +19,27 @@
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
-function HighlightIfNotI18nReferentialValue(row, column, label) {
- let value = row.cells[column].data;
- if (!!!value) {
- return value;
+function HighlightIfNotI18nReferentialValue(cell, label) {
+ if (!!!cell) {
+ return;
}
- if (value === label) {
- return value;
+ if (cell === label) {
+ return;
}
- // noinspection JSUnresolvedReference
- return gridjs.html(`<span class="cellError">${value}</span>`);
+ return {
+ 'data-cell-content': cell,
+ 'class': 'gridjs-td cellError',
+ };
}
-function initHighlightIfNotI18nReferentialValue(renderer, result) {
+function initHighlightIfNotI18nReferentialValue(renderer, result, json) {
let columns = renderer["columns"];
let label = renderer["label"];
for (let j = 0; j < columns.length; j++) {
let column = columns[j];
result [column] = {
name: result [column],
- formatter: (_, row) => HighlightIfNotI18nReferentialValue(row, column, label)
+ attributes: cell => HighlightIfNotI18nReferentialValue(cell, label)
};
}
}
=====================================
toolkit/api-report/src/main/resources/fr/ird/observe/report/renderers/HighlightIfNumericalValueIsPositive.js
=====================================
@@ -19,26 +19,46 @@
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
-function HighlightIfNumericalValueIsPositive(row, column, warningThreshHold, errorThreshHold) {
- let value = row.cells[column].data;
- if (!!!value || value === "-") {
- return value;
+function HighlightIfNumericalValueIsPositive(cell, warningThreshHold, errorThreshHold) {
+ if (!cell) {
+ return;
}
- let delta = Math.abs(value);
+ if (!!!cell || cell === "-") {
+ return {
+ 'data-cell-content': "",
+ 'class': 'gridjs-td cellNull',
+ };
+ }
+ let delta = Math.abs(cell);
if (delta < warningThreshHold) {
- return value;
+ return;
}
- let className = delta < errorThreshHold ? "cellWarning" : "cellError";
- // noinspection JSUnresolvedReference
- return gridjs.html(`<span class="${className}"\>${value}</span>`);
+ return {
+ 'data-cell-content': cell,
+ 'class': 'gridjs-td ' + (delta < errorThreshHold ? "cellWarning" : "cellError"),
+ };
}
-function initHighlightIfNumericalValueIsPositive(renderer, result) {
+function initHighlightIfNumericalValueIsPositive(renderer, result, json) {
let column = renderer["column"];
+ let height = json.height;
+ let data = json.data;
+ for (let row = 0; row < height; row++) {
+ if (!!!data[row][column]) {
+ data[row][column] = "-";
+ }
+ }
let warningThreshHold = renderer["warningThreshHold"];
let errorThreshHold = renderer["errorThreshHold"];
result[column] = {
name: result [column],
- formatter: (_, row) => HighlightIfNumericalValueIsPositive(row, column, warningThreshHold, errorThreshHold)
+ formatter: cell => {
+ if (!!!cell || cell === "-") {
+ // noinspection JSUnresolvedReference
+ return gridjs.html(" ");
+ }
+ return cell;
+ },
+ attributes: cell => HighlightIfNumericalValueIsPositive(cell, warningThreshHold, errorThreshHold)
};
-}
+}
\ No newline at end of file
View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/c2557d282a8e149254598bf0…
--
View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/c2557d282a8e149254598bf0…
You're receiving this email because of your account on gitlab.com.
1
0
[Git][ultreiaio/ird-observe][develop] 8 commits: Move to persistence model 9.3
by Tony CHEMIT (@tchemit) 01 Dec '23
by Tony CHEMIT (@tchemit) 01 Dec '23
01 Dec '23
Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe
Commits:
fb599bfe by Tony Chemit at 2023-12-01T08:48:22+01:00
Move to persistence model 9.3
- - - - -
6124147c by Tony Chemit at 2023-12-01T09:08:13+01:00
add persistence migration code
- - - - -
8f934f33 by Tony Chemit at 2023-12-01T09:33:05+01:00
Do not disable TransmittingBuoy.country
- - - - -
6587e1f5 by Tony Chemit at 2023-12-01T09:33:32+01:00
Rename I18n label TransmittingBuoy.country to flagCountry
- - - - -
125b581f by Tony Chemit at 2023-12-01T10:29:02+01:00
keep protected unknown TransmittingBuoyOwnership id
- - - - -
15552adc by Tony Chemit at 2023-12-01T10:49:53+01:00
add listener on TransmittingBuoyOwnership to enable/disable vessel or country
- - - - -
2e651502 by Tony Chemit at 2023-12-01T10:50:26+01:00
remove commented code (from v7)
- - - - -
c2557d28 by Tony Chemit at 2023-12-01T10:50:48+01:00
Merge branch 'feature/issue-2044' into develop
Peaufinage du form Balise : disponibilité des champs Appartenance, Pays et Navire
- Closes #2044
- - - - -
16 changed files:
- client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/dcp/DcpUIAdapter.java
- client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/dcp/DcpUIModelStates.java
- client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/dcp/FloatingObjectUICommon.jcss
- client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/logbook/FloatingObjectUIHandler.java
- client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/logbook/FloatingObjectUIModelStates.java
- client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/observation/FloatingObjectUIHandler.java
- client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/observation/FloatingObjectUIModelStates.java
- core/api/dto-decoration/src/main/i18n/getters/labels.getter
- core/api/dto/src/main/java/fr/ird/observe/dto/ProtectedIdsPs.java
- core/persistence/migration/src/main/java/fr/ird/observe/spi/migration/v9/DataSourceMigrationForVersion_9_3.java
- + core/persistence/migration/src/main/resources/db/migration/v9/9.3/01_issue-2044-common.sql
- core/services/i18n/src/main/i18n/translations/services_en_GB.properties
- core/services/i18n/src/main/i18n/translations/services_es_ES.properties
- core/services/i18n/src/main/i18n/translations/services_fr_FR.properties
- model/src/main/models/Observe/dto/class/i18nOverrideLabels.properties
- pom.xml
Changes:
=====================================
client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/dcp/DcpUIAdapter.java
=====================================
@@ -151,6 +151,8 @@ public interface DcpUIAdapter<T extends TransmittingBuoyAware> extends JAXXObjec
}
});
states.getBean().addPropertyChangeListener(FloatingObjectDto.PROPERTY_OBJECT_OPERATION, e -> states.updateMaterials(getTable().getTreeTableModel(), (ObjectOperationReference) e.getNewValue()));
+ states.setFirstBuoyOwnershipListener(new DcpUIModelStates.TransmittingBuoyOwnershipListener<>(getTransmittingBuoy1(), getVessel1(), getCountry1()));
+ states.setSecondBuoyOwnershipListener(new DcpUIModelStates.TransmittingBuoyOwnershipListener<>(getTransmittingBuoy2(), getVessel2(), getCountry2()));
}
default void installExtraActions() {
@@ -165,12 +167,14 @@ public interface DcpUIAdapter<T extends TransmittingBuoyAware> extends JAXXObjec
changeTypeTransmittingBuoyOperation(states, typeOperation, false);
}
- default void stopEditUI() {
+ default void stopEditUI(DcpUIModelStates<?, ?> states) {
if (getMainTabbedPane().getSelectedIndex() == 1) {
getTable().editingCanceled(null);
}
getValidatorBuoy1().setBean(null);
getValidatorBuoy2().setBean(null);
+ states.removeFirstBuoyOwnershipListener(getTransmittingBuoy1());
+ states.removeSecondBuoyOwnershipListener(getTransmittingBuoy2());
}
default void changeTypeTransmittingBuoyOperation(ItemEvent event, DcpUIModelStates<?, ?> states) {
@@ -184,8 +188,10 @@ public interface DcpUIAdapter<T extends TransmittingBuoyAware> extends JAXXObjec
FloatingObjectAware bean = states.getBean();
if (bean.getFirstBuoy() != null) {
getValidatorBuoy1().setBean(getTransmittingBuoy1());
+ states.addFirstBuoyOwnershipListener(getTransmittingBuoy1());
if (bean.getSecondBuoy() != null) {
getValidatorBuoy2().setBean(getTransmittingBuoy2());
+ states.addSecondBuoyOwnershipListener(getTransmittingBuoy2());
}
}
states.setModified(states.isCreatingMode());
@@ -219,6 +225,8 @@ public interface DcpUIAdapter<T extends TransmittingBuoyAware> extends JAXXObjec
if (states.isEditing()) {
getValidatorBuoy1().setBean(null);
getValidatorBuoy2().setBean(null);
+ states.removeFirstBuoyOwnershipListener(getTransmittingBuoy1());
+ states.removeSecondBuoyOwnershipListener(getTransmittingBuoy2());
}
String[] transmittingBuoyOperationCodes = typeOperation.getTransmittingBuoyOperationCodes();
@@ -239,6 +247,7 @@ public interface DcpUIAdapter<T extends TransmittingBuoyAware> extends JAXXObjec
editorPanel.add(getTransmittingBuoy1EditorPanel());
if (states.isEditing()) {
getValidatorBuoy1().setBean(getTransmittingBuoy1());
+ states.addFirstBuoyOwnershipListener(getTransmittingBuoy1());
}
focusOwner = getTransmittingBuoyType1();
break;
@@ -256,6 +265,8 @@ public interface DcpUIAdapter<T extends TransmittingBuoyAware> extends JAXXObjec
if (states.isEditing()) {
getValidatorBuoy1().setBean(getTransmittingBuoy1());
getValidatorBuoy2().setBean(getTransmittingBuoy2());
+ states.addFirstBuoyOwnershipListener(getTransmittingBuoy1());
+ states.addSecondBuoyOwnershipListener(getTransmittingBuoy2());
}
focusOwner = getTransmittingBuoyType1();
break;
@@ -273,6 +284,7 @@ public interface DcpUIAdapter<T extends TransmittingBuoyAware> extends JAXXObjec
});
}
+
private void addTransmittingBuoyCoordinate() {
Table transmittingBuoy1Editor = getTransmittingBuoy1Editor();
if (transmittingBuoy1Editor.getComponentCount() != 13) {
@@ -292,4 +304,5 @@ public interface DcpUIAdapter<T extends TransmittingBuoyAware> extends JAXXObjec
transmittingBuoy1Editor.add(getComment1(), new GridBagConstraints(0, 5, 2, 1, 0.0, 1.0, 10, 1, new Insets(3, 3, 3, 3), 0, 0));
}
}
+
}
=====================================
client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/dcp/DcpUIModelStates.java
=====================================
@@ -37,6 +37,8 @@ import fr.ird.observe.dto.data.ps.dcp.FloatingObjectPreset;
import fr.ird.observe.dto.data.ps.dcp.FloatingObjectPresetsManager;
import fr.ird.observe.dto.data.ps.logbook.TransmittingBuoyDto;
import fr.ird.observe.dto.referential.ReferentialLocale;
+import fr.ird.observe.dto.referential.common.CountryReference;
+import fr.ird.observe.dto.referential.common.VesselReference;
import fr.ird.observe.dto.referential.ps.common.ObjectMaterialDto;
import fr.ird.observe.dto.referential.ps.common.ObjectMaterialReference;
import fr.ird.observe.dto.referential.ps.common.ObjectOperationReference;
@@ -44,9 +46,12 @@ import fr.ird.observe.dto.referential.ps.common.TransmittingBuoyOperationReferen
import fr.ird.observe.dto.referential.ps.common.TransmittingBuoyOwnershipReference;
import io.ultreia.java4all.bean.JavaBean;
import io.ultreia.java4all.jaxx.widgets.combobox.BeanEnumEditor;
+import io.ultreia.java4all.jaxx.widgets.combobox.FilterableComboBox;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
import java.util.Collection;
import java.util.Date;
import java.util.LinkedHashMap;
@@ -96,6 +101,14 @@ public interface DcpUIModelStates<D extends DataDto & FloatingObjectAware, P ext
Optional<ToolkitIdModifications> consolidate();
+ TransmittingBuoyOwnershipListener<?> getFirstBuoyOwnershipListener();
+
+ void setFirstBuoyOwnershipListener(TransmittingBuoyOwnershipListener<?> firstBuoyOwnershipListener);
+
+ TransmittingBuoyOwnershipListener<?> getSecondBuoyOwnershipListener();
+
+ void setSecondBuoyOwnershipListener(TransmittingBuoyOwnershipListener<?> secondBuoyOwnershipListener);
+
default void recomputeComputedValues() {
Optional<ToolkitIdModifications> result = consolidate();
result.ifPresent(r -> {
@@ -163,14 +176,16 @@ public interface DcpUIModelStates<D extends DataDto & FloatingObjectAware, P ext
Map<String, ObjectMaterialDto> getReferentialMap();
+ void setReferentialMap(Map<String, ObjectMaterialDto> referentialMap);
+
Map<String, TransmittingBuoyOperationReference> getBuoyOperationMap();
+ void setBuoyOperationMap(Map<String, TransmittingBuoyOperationReference> buoyOperationMap);
+
default TransmittingBuoyOperationReference getBuoyOperation(String code) {
return getBuoyOperationMap().get(code);
}
- void setBuoyOperationMap(Map<String, TransmittingBuoyOperationReference> buoyOperationMap);
-
Map<ObjectMaterialDto, String> getWhenArriving();
Map<ObjectMaterialDto, String> getWhenLeaving();
@@ -181,8 +196,6 @@ public interface DcpUIModelStates<D extends DataDto & FloatingObjectAware, P ext
return all.stream().filter(ObjectMaterialDto::withData).collect(Collectors.toSet());
}
- void setReferentialMap(Map<String, ObjectMaterialDto> referentialMap);
-
void setWhenArriving(String id, String value);
void setWhenLeaving(String id, String value);
@@ -300,10 +313,6 @@ public interface DcpUIModelStates<D extends DataDto & FloatingObjectAware, P ext
FloatingObjectPreset floatingObjectReference = getReference();
- // FIXME See why we have to do this
-// bean.getTransmittingBuoy().clear();
-// bean.getFloatingObjectPart().clear();
-// Form<FloatingObjectDto> form = model.openForm(getModel().getStates().getSelectedId());
List<TransmittingBuoyOperationReference> referentialReferences = referencesCache.getReferentialReferences(TransmittingBuoyDto.PROPERTY_TRANSMITTING_BUOY_OPERATION);
setBuoyOperationMap(Maps.uniqueIndex(referentialReferences, TransmittingBuoyOperationReference::getCode));
@@ -312,8 +321,14 @@ public interface DcpUIModelStates<D extends DataDto & FloatingObjectAware, P ext
openTable.accept(bean.isPersisted() || floatingObjectReference != null);
- Optional.ofNullable(bean.getFirstBuoy()).ifPresent(b -> b.copy(ui1));
- Optional.ofNullable(bean.getSecondBuoy()).ifPresent(b -> b.copy(ui2));
+ Optional.ofNullable(bean.getFirstBuoy()).ifPresent(b -> {
+ b.copy(ui1);
+ getFirstBuoyOwnershipListener().apply();
+ });
+ Optional.ofNullable(bean.getSecondBuoy()).ifPresent(b -> {
+ b.copy(ui2);
+ getSecondBuoyOwnershipListener().apply();
+ });
getBean().setCanValidateMaterials(true);
}
@@ -322,4 +337,79 @@ public interface DcpUIModelStates<D extends DataDto & FloatingObjectAware, P ext
ReferencesCache getReferenceCache();
boolean isCreatingMode();
+
+ default void addFirstBuoyOwnershipListener(TransmittingBuoyAware buoy) {
+ TransmittingBuoyOwnershipListener<?> listener = getFirstBuoyOwnershipListener();
+ buoy.removePropertyChangeListener(TransmittingBuoyDto.PROPERTY_TRANSMITTING_BUOY_OWNERSHIP, listener);
+ buoy.addPropertyChangeListener(TransmittingBuoyDto.PROPERTY_TRANSMITTING_BUOY_OWNERSHIP, listener);
+ listener.apply();
+ }
+
+ default void removeFirstBuoyOwnershipListener(TransmittingBuoyAware buoy) {
+ PropertyChangeListener listener = getFirstBuoyOwnershipListener();
+ buoy.removePropertyChangeListener(TransmittingBuoyDto.PROPERTY_TRANSMITTING_BUOY_OWNERSHIP, listener);
+ }
+
+ default void addSecondBuoyOwnershipListener(TransmittingBuoyAware buoy) {
+ TransmittingBuoyOwnershipListener<?> listener = getSecondBuoyOwnershipListener();
+ buoy.removePropertyChangeListener(TransmittingBuoyDto.PROPERTY_TRANSMITTING_BUOY_OWNERSHIP, listener);
+ buoy.addPropertyChangeListener(TransmittingBuoyDto.PROPERTY_TRANSMITTING_BUOY_OWNERSHIP, listener);
+ listener.apply();
+ }
+
+ default void removeSecondBuoyOwnershipListener(TransmittingBuoyAware buoy) {
+ PropertyChangeListener listener = getSecondBuoyOwnershipListener();
+ buoy.removePropertyChangeListener(TransmittingBuoyDto.PROPERTY_TRANSMITTING_BUOY_OWNERSHIP, listener);
+ }
+
+ class TransmittingBuoyOwnershipListener<T extends TransmittingBuoyAware> implements PropertyChangeListener {
+
+ private final T buoy;
+ private final FilterableComboBox<VesselReference> vessel;
+ private final FilterableComboBox<CountryReference> country;
+
+ public TransmittingBuoyOwnershipListener(T buoy, FilterableComboBox<VesselReference> vessel, FilterableComboBox<CountryReference> country) {
+ this.buoy = buoy;
+ this.vessel = vessel;
+ this.country = country;
+ }
+
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+ TransmittingBuoyOwnershipReference buoyOwnership = (TransmittingBuoyOwnershipReference) evt.getNewValue();
+ apply(buoyOwnership);
+ }
+
+ public void apply() {
+ apply(buoy.getTransmittingBuoyOwnership());
+ }
+
+ private void apply(TransmittingBuoyOwnershipReference buoyOwnership) {
+ boolean enableVessel = true;
+ boolean enableCountry = true;
+ if (buoyOwnership != null) {
+ switch (buoyOwnership.getId()) {
+ case ProtectedIdsPs.PS_COMMON_TRANSMITTING_BUOY_OWNERSHIP_THIS_SHIP_ID:
+ enableVessel = false;
+ enableCountry = false;
+ break;
+ case ProtectedIdsPs.PS_COMMON_TRANSMITTING_BUOY_OWNERSHIP_UNKNOWN_ID:
+ enableVessel = false;
+ break;
+ }
+ }
+ if (enableVessel) {
+ vessel.setEnabled(true);
+ } else {
+ buoy.setVessel(null);
+ vessel.setEnabled(false);
+ }
+ if (enableCountry) {
+ country.setEnabled(true);
+ } else {
+ buoy.setCountry(null);
+ country.setEnabled(false);
+ }
+ }
+ }
}
=====================================
client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/dcp/FloatingObjectUICommon.jcss
=====================================
@@ -108,7 +108,6 @@
#transmittingBuoyOwnership1 {
property:{TransmittingBuoyDto.PROPERTY_TRANSMITTING_BUOY_OWNERSHIP};
- enabled: {!DcpUIModelStates.isBuoyDeployement(transmittingBuoy1.getTransmittingBuoyOperation())}
}
#country1Label {
@@ -161,7 +160,6 @@
#transmittingBuoyOwnership2 {
property:{TransmittingBuoyDto.PROPERTY_TRANSMITTING_BUOY_OWNERSHIP};
- enabled: {!DcpUIModelStates.isBuoyDeployement(transmittingBuoy2.getTransmittingBuoyOperation())}
}
#country2Label {
=====================================
client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/logbook/FloatingObjectUIHandler.java
=====================================
@@ -55,7 +55,7 @@ public class FloatingObjectUIHandler extends GeneratedFloatingObjectUIHandler {
@Override
public void stopEditUI() {
- ui.stopEditUI();
+ ui.stopEditUI(ui.getModel().getStates());
super.stopEditUI();
}
=====================================
client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/logbook/FloatingObjectUIModelStates.java
=====================================
@@ -66,6 +66,8 @@ public class FloatingObjectUIModelStates extends GeneratedFloatingObjectUIModelS
private boolean arriving;
private boolean leaving;
private FloatingObjectConsolidateEngine consolidateEngine;
+ private TransmittingBuoyOwnershipListener<?> firstBuoyOwnershipListener;
+ private TransmittingBuoyOwnershipListener<?> secondBuoyOwnershipListener;
public FloatingObjectUIModelStates(GeneratedFloatingObjectUIModel model) {
super(model);
@@ -78,6 +80,26 @@ public class FloatingObjectUIModelStates extends GeneratedFloatingObjectUIModelS
this.simplifiedObjectTypeSpecializedRulesSupplier = SingletonSupplier.of(model.getClientConfig()::getSimplifiedObjectTypeSpecializedRules);
}
+ @Override
+ public TransmittingBuoyOwnershipListener<?> getFirstBuoyOwnershipListener() {
+ return firstBuoyOwnershipListener;
+ }
+
+ @Override
+ public void setFirstBuoyOwnershipListener(TransmittingBuoyOwnershipListener<?> firstBuoyOwnershipListener) {
+ this.firstBuoyOwnershipListener = firstBuoyOwnershipListener;
+ }
+
+ @Override
+ public TransmittingBuoyOwnershipListener<?> getSecondBuoyOwnershipListener() {
+ return secondBuoyOwnershipListener;
+ }
+
+ @Override
+ public void setSecondBuoyOwnershipListener(TransmittingBuoyOwnershipListener<?> secondBuoyOwnershipListener) {
+ this.secondBuoyOwnershipListener = secondBuoyOwnershipListener;
+ }
+
@Override
public Map<String, TransmittingBuoyOperationReference> getBuoyOperationMap() {
return buoyOperationMap;
@@ -141,11 +163,6 @@ public class FloatingObjectUIModelStates extends GeneratedFloatingObjectUIModelS
return whenLeaving;
}
- @Override
- public void setReferentialMap(Map<String, ObjectMaterialDto> referentialMap) {
- this.referentialMap = referentialMap;
- }
-
@Override
public void setWhenArriving(String id, String value) {
setWhen0(id, value, whenArriving);
@@ -230,6 +247,11 @@ public class FloatingObjectUIModelStates extends GeneratedFloatingObjectUIModelS
return referentialMap;
}
+ @Override
+ public void setReferentialMap(Map<String, ObjectMaterialDto> referentialMap) {
+ this.referentialMap = referentialMap;
+ }
+
@Override
public String getComputedWhenArrivingBiodegradableValue() {
return DcpUIModelStates.super.getComputedWhenArrivingBiodegradableValue();
=====================================
client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/observation/FloatingObjectUIHandler.java
=====================================
@@ -55,7 +55,7 @@ public class FloatingObjectUIHandler extends GeneratedFloatingObjectUIHandler {
@Override
public void stopEditUI() {
- ui.stopEditUI();
+ ui.stopEditUI(ui.getModel().getStates());
super.stopEditUI();
}
=====================================
client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/observation/FloatingObjectUIModelStates.java
=====================================
@@ -70,6 +70,8 @@ public class FloatingObjectUIModelStates extends GeneratedFloatingObjectUIModelS
private boolean arriving;
private boolean leaving;
private FloatingObjectConsolidateEngine consolidateEngine;
+ private TransmittingBuoyOwnershipListener<?> firstBuoyOwnershipListener;
+ private TransmittingBuoyOwnershipListener<?> secondBuoyOwnershipListener;
public FloatingObjectUIModelStates(GeneratedFloatingObjectUIModel model) {
super(model);
@@ -82,6 +84,26 @@ public class FloatingObjectUIModelStates extends GeneratedFloatingObjectUIModelS
this.simplifiedObjectTypeSpecializedRulesSupplier = SingletonSupplier.of(model.getClientConfig()::getSimplifiedObjectTypeSpecializedRules);
}
+ @Override
+ public TransmittingBuoyOwnershipListener<?> getFirstBuoyOwnershipListener() {
+ return firstBuoyOwnershipListener;
+ }
+
+ @Override
+ public void setFirstBuoyOwnershipListener(TransmittingBuoyOwnershipListener<?> firstBuoyOwnershipListener) {
+ this.firstBuoyOwnershipListener = firstBuoyOwnershipListener;
+ }
+
+ @Override
+ public TransmittingBuoyOwnershipListener<?> getSecondBuoyOwnershipListener() {
+ return secondBuoyOwnershipListener;
+ }
+
+ @Override
+ public void setSecondBuoyOwnershipListener(TransmittingBuoyOwnershipListener<?> secondBuoyOwnershipListener) {
+ this.secondBuoyOwnershipListener = secondBuoyOwnershipListener;
+ }
+
@Override
public Map<String, TransmittingBuoyOperationReference> getBuoyOperationMap() {
return buoyOperationMap;
@@ -145,11 +167,6 @@ public class FloatingObjectUIModelStates extends GeneratedFloatingObjectUIModelS
return whenLeaving;
}
- @Override
- public void setReferentialMap(Map<String, ObjectMaterialDto> referentialMap) {
- this.referentialMap = referentialMap;
- }
-
@Override
public void setWhenArriving(String id, String value) {
setWhen0(id, value, whenArriving);
@@ -234,6 +251,11 @@ public class FloatingObjectUIModelStates extends GeneratedFloatingObjectUIModelS
return referentialMap;
}
+ @Override
+ public void setReferentialMap(Map<String, ObjectMaterialDto> referentialMap) {
+ this.referentialMap = referentialMap;
+ }
+
@Override
public String getComputedWhenArrivingBiodegradableValue() {
return DcpUIModelStates.super.getComputedWhenArrivingBiodegradableValue();
=====================================
core/api/dto-decoration/src/main/i18n/getters/labels.getter
=====================================
@@ -1011,6 +1011,7 @@ observe.data.ps.logbook.SampleSpeciesMeasure.count
observe.data.ps.logbook.SampleSpeciesMeasure.count.short
observe.data.ps.logbook.SampleSpeciesMeasure.type
observe.data.ps.logbook.TransmittingBuoy.code
+observe.data.ps.logbook.TransmittingBuoy.country
observe.data.ps.logbook.TransmittingBuoy.type
observe.data.ps.logbook.Well.action.create
observe.data.ps.logbook.Well.action.move
@@ -1233,6 +1234,7 @@ observe.data.ps.observation.SpeciesFateDiscardMode.nullValue
observe.data.ps.observation.SpeciesFateDiscardMode.trueValue
observe.data.ps.observation.SpeciesFateDiscardMode.type
observe.data.ps.observation.TransmittingBuoy.code
+observe.data.ps.observation.TransmittingBuoy.country
observe.data.ps.observation.TransmittingBuoy.type
observe.referential.MinMaxWeight.maxWeight
observe.referential.MinMaxWeight.minMaxWeight
=====================================
core/api/dto/src/main/java/fr/ird/observe/dto/ProtectedIdsPs.java
=====================================
@@ -33,6 +33,7 @@ import java.util.Set;
//FIXME-PROTECTED-ID
public interface ProtectedIdsPs {
String PS_COMMON_TRANSMITTING_BUOY_OWNERSHIP_THIS_SHIP_ID = "fr.ird.referential.ps.common.TransmittingBuoyOwnership#0#3";
+ String PS_COMMON_TRANSMITTING_BUOY_OWNERSHIP_UNKNOWN_ID = "fr.ird.referential.ps.common.TransmittingBuoyOwnership#0#0";
String PS_COMMON_SCHOOL_TYPE_UNDEFINED_ID = "fr.ird.referential.ps.common.SchoolType#0#0";
String PS_COMMON_SCHOOL_TYPE_FREE_ID = "fr.ird.referential.ps.common.SchoolType#0#2";
String PS_COMMON_SCHOOL_TYPE_OBJECT_ID = "fr.ird.referential.ps.common.SchoolType#0#1";
=====================================
core/persistence/migration/src/main/java/fr/ird/observe/spi/migration/v9/DataSourceMigrationForVersion_9_3.java
=====================================
@@ -35,19 +35,21 @@ import org.nuiton.topia.service.migration.resources.MigrationVersionResourceExec
* @author Tony Chemit - dev(a)tchemit.fr
* @since 9.3.0
*/
-//(a)AutoService(MigrationVersionResource.class)
+(a)AutoService(MigrationVersionResource.class)
public class DataSourceMigrationForVersion_9_3 extends ByMajorMigrationVersionResource {
public DataSourceMigrationForVersion_9_3() {
super(Version.valueOf("9.3"), false);
- createResourceScriptVariables(this, "2023-11-15", "2023-09-01 00:00:00.000000");
+ createResourceScriptVariables(this, "2023-12-01", "2023-12-01 00:00:00.000000");
}
-
@Override
public void generateSqlScript(MigrationVersionResourceExecutor executor) {
boolean withIds = executor.findSingleResult(SqlQuery.wrap("SELECT COUNT (*) FROM common.person", r -> r.getInt(1) > 0));
-
+ if (withIds) {
+ // See https://gitlab.com/ultreiaio/ird-observe/-/issues/2044
+ executor.addScript("01", "issue-2044");
+ }
}
}
=====================================
core/persistence/migration/src/main/resources/db/migration/v9/9.3/01_issue-2044-common.sql
=====================================
@@ -0,0 +1,27 @@
+---
+-- #%L
+-- ObServe Core :: Persistence :: Migration
+-- %%
+-- Copyright (C) 2008 - 2023 IRD, Ultreia.io
+-- %%
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as
+-- published by the Free Software Foundation, either version 3 of the
+-- License, or (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public
+-- License along with this program. If not, see
+-- <http://www.gnu.org/licenses/gpl-3.0.html>.
+-- #L%
+---
+-- Unknown vessel → no vessel
+UPDATE ps_observation.TransmittingBuoy SET vessel = NULL WHERE transmittingBuoyOwnership = 'fr.ird.referential.ps.common.TransmittingBuoyOwnership#0#0';
+UPDATE ps_logbook.TransmittingBuoy SET vessel = NULL WHERE transmittingBuoyOwnership = 'fr.ird.referential.ps.common.TransmittingBuoyOwnership#0#0';
+-- This vessel → no country, nor vessel
+UPDATE ps_observation.TransmittingBuoy SET country = NULL, vessel = NULL WHERE transmittingBuoyOwnership = 'fr.ird.referential.ps.common.TransmittingBuoyOwnership#0#3';
+UPDATE ps_logbook.TransmittingBuoy SET country = NULL, vessel = NULL WHERE transmittingBuoyOwnership = 'fr.ird.referential.ps.common.TransmittingBuoyOwnership#0#3';
=====================================
core/services/i18n/src/main/i18n/translations/services_en_GB.properties
=====================================
@@ -1222,6 +1222,7 @@ observe.data.ps.logbook.SampleSpeciesMeasure.count=Count
observe.data.ps.logbook.SampleSpeciesMeasure.count.short=Count
observe.data.ps.logbook.SampleSpeciesMeasure.type=Sample species measure
observe.data.ps.logbook.TransmittingBuoy.code=Code
+observe.data.ps.logbook.TransmittingBuoy.country=Flag country
observe.data.ps.logbook.TransmittingBuoy.type=Transmitting buoy
observe.data.ps.logbook.Well.action.create=Next well
observe.data.ps.logbook.Well.action.move=Change trip
@@ -1496,6 +1497,7 @@ observe.data.ps.observation.SpeciesFateDiscardMode.nullValue=Unknown
observe.data.ps.observation.SpeciesFateDiscardMode.trueValue=Discarded
observe.data.ps.observation.SpeciesFateDiscardMode.type=Species fate discard mode
observe.data.ps.observation.TransmittingBuoy.code=Code
+observe.data.ps.observation.TransmittingBuoy.country=Flag country
observe.data.ps.observation.TransmittingBuoy.type=Transmitting buoy
observe.data.ps.pairing.ActivityPairingResultItem.computedDistance=Distance (km)
observe.data.ps.pairing.ActivityPairingResultItem.computedTime=Time shift (days\:hours\:minutes)
=====================================
core/services/i18n/src/main/i18n/translations/services_es_ES.properties
=====================================
@@ -1222,6 +1222,7 @@ observe.data.ps.logbook.SampleSpeciesMeasure.count=Count \#TODO
observe.data.ps.logbook.SampleSpeciesMeasure.count.short=Count
observe.data.ps.logbook.SampleSpeciesMeasure.type=Sample species measure
observe.data.ps.logbook.TransmittingBuoy.code=Identificación
+observe.data.ps.logbook.TransmittingBuoy.country=Bandera
observe.data.ps.logbook.TransmittingBuoy.type=TransmittingBuoy
observe.data.ps.logbook.Well.action.create=Next well
observe.data.ps.logbook.Well.action.move=Change trip
@@ -1496,6 +1497,7 @@ observe.data.ps.observation.SpeciesFateDiscardMode.nullValue=Unknown
observe.data.ps.observation.SpeciesFateDiscardMode.trueValue=Discarded
observe.data.ps.observation.SpeciesFateDiscardMode.type=Species fate discard mode
observe.data.ps.observation.TransmittingBuoy.code=Identificación
+observe.data.ps.observation.TransmittingBuoy.country=Bandera
observe.data.ps.observation.TransmittingBuoy.type=TransmittingBuoy
observe.data.ps.pairing.ActivityPairingResultItem.computedDistance=Distance (km) \#TODO
observe.data.ps.pairing.ActivityPairingResultItem.computedTime=Time shift (days\:hours\:minutes) \#TODO
=====================================
core/services/i18n/src/main/i18n/translations/services_fr_FR.properties
=====================================
@@ -1222,6 +1222,7 @@ observe.data.ps.logbook.SampleSpeciesMeasure.count=Effectif
observe.data.ps.logbook.SampleSpeciesMeasure.count.short=Effectif
observe.data.ps.logbook.SampleSpeciesMeasure.type=Mesure d'un échantillon espèce
observe.data.ps.logbook.TransmittingBuoy.code=Identifiant
+observe.data.ps.logbook.TransmittingBuoy.country=Pavillon
observe.data.ps.logbook.TransmittingBuoy.type=Balise émettrice
observe.data.ps.logbook.Well.action.create=Cuve suivante
observe.data.ps.logbook.Well.action.move=Changer de marée
@@ -1496,6 +1497,7 @@ observe.data.ps.observation.SpeciesFateDiscardMode.nullValue=Inconnu
observe.data.ps.observation.SpeciesFateDiscardMode.trueValue=Rejeté
observe.data.ps.observation.SpeciesFateDiscardMode.type=Mode de rejet (du devenir)
observe.data.ps.observation.TransmittingBuoy.code=Identifiant
+observe.data.ps.observation.TransmittingBuoy.country=Pavillon
observe.data.ps.observation.TransmittingBuoy.type=Balise émettrice
observe.data.ps.pairing.ActivityPairingResultItem.computedDistance=Distance (km)
observe.data.ps.pairing.ActivityPairingResultItem.computedTime=Écart de temps (jours\:heures\:minutes)
=====================================
model/src/main/models/Observe/dto/class/i18nOverrideLabels.properties
=====================================
@@ -23,8 +23,10 @@ data.ll.common.Trip=species
data.ll.landing.Landing=vessel
data.ps.localmarket.Sample=well
data.ps.logbook.Catch=weightMeasureMethod.validation.required
+data.ps.logbook.TransmittingBuoy=country
data.ps.observation.Catch=minWeight,maxWeight,minMaxWeight,weightMeasureMethod
data.ps.observation.SchoolEstimate=species
data.ps.observation.Set=startTime,haulingStartTimeStamp,haulingEndTimeStamp,endTimeStamp
+data.ps.observation.TransmittingBuoy=country
referential.common.Species=codeAndHomeId
referential.ps.common.AcquisitionStatus=observation,logbook,landing,localMarket
=====================================
pom.xml
=====================================
@@ -93,9 +93,9 @@
<model.persistence.defaultPackage>fr.ird.observe.entities</model.persistence.defaultPackage>
<model.persistence.fullPackagePath>fr.ird.observe</model.persistence.fullPackagePath>
<!--persistence model version-->
- <persistence.model.version>9.2</persistence.model.version>
+ <persistence.model.version>9.3</persistence.model.version>
<!--persistence previous model version used for tck migration-->
- <persistence.previous.model.version>9.1</persistence.previous.model.version>
+ <persistence.previous.model.version>9.2</persistence.previous.model.version>
<tck.filename>tck-v${persistence.model.version}.zip</tck.filename>
<tck.updated.filename>updated-${tck.filename}</tck.updated.filename>
<tck.remote.path>/var/www/html/private/ird-observe/tck</tck.remote.path>
View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/1b79ed665ab5f256cbff50a3…
--
View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/1b79ed665ab5f256cbff50a3…
You're receiving this email because of your account on gitlab.com.
1
0