diff --git a/src/org/april/agirstatool/charts/DateCountList.java b/src/org/april/agirstatool/charts/DateCountList.java index c78ef6e..ee52fd5 100644 --- a/src/org/april/agirstatool/charts/DateCountList.java +++ b/src/org/april/agirstatool/charts/DateCountList.java @@ -39,6 +39,17 @@ public class DateCountList extends ArrayList super(); } + /** + * Instantiates a new date count list. + * + * @param capacity + * the capacity + */ + public DateCountList(final int capacity) + { + super(capacity); + } + /** * Indexof. * diff --git a/src/org/april/agirstatool/core/pages/CreatedConcludedCountChartView.java b/src/org/april/agirstatool/core/pages/CreatedClosedCountChartView.java similarity index 98% rename from src/org/april/agirstatool/core/pages/CreatedConcludedCountChartView.java rename to src/org/april/agirstatool/core/pages/CreatedClosedCountChartView.java index fb311c5..805310d 100644 --- a/src/org/april/agirstatool/core/pages/CreatedConcludedCountChartView.java +++ b/src/org/april/agirstatool/core/pages/CreatedClosedCountChartView.java @@ -37,9 +37,9 @@ import fr.devinsy.xidyn.utils.XidynUtils; /** * The Class projectsRawPageBuilder. */ -public class CreatedConcludedCountChartView +public class CreatedClosedCountChartView { - private static Logger logger = LoggerFactory.getLogger(CreatedConcludedCountChartView.class); + private static Logger logger = LoggerFactory.getLogger(CreatedClosedCountChartView.class); /** * Builds the. diff --git a/src/org/april/agirstatool/core/pages/CreatedClosedDiffChartView.java b/src/org/april/agirstatool/core/pages/CreatedClosedDiffChartView.java new file mode 100644 index 0000000..6ee5346 --- /dev/null +++ b/src/org/april/agirstatool/core/pages/CreatedClosedDiffChartView.java @@ -0,0 +1,274 @@ +/* + * Copyright (C) 2020 Christian Pierre MOMON + * + * This file is part of AgirStatool, simple key value database. + * + * AgirStatool is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * AgirStatool 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with AgirStatool. If not, see . + */ +package org.april.agirstatool.core.pages; + +import java.io.IOException; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + +import org.apache.commons.codec.digest.DigestUtils; +import org.april.agirstatool.charts.DateCount; +import org.april.agirstatool.charts.DateCountList; +import org.april.agirstatool.core.AgirStatool; +import org.april.agirstatool.core.AgirStatoolException; +import org.april.agirstatool.core.AgirStatoolUtils; +import org.april.agirstatool.core.Project; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import fr.devinsy.strings.StringList; +import fr.devinsy.xidyn.utils.XidynUtils; + +/** + * The Class projectsRawPageBuilder. + */ +public class CreatedClosedDiffChartView +{ + private static Logger logger = LoggerFactory.getLogger(CreatedClosedDiffChartView.class); + + /** + * Builds the. + * + * @param title + * the title + * @param project + * the project + * @param start + * the start + * @param end + * the end + * @return the string + * @throws AgirStatoolException + * the agir statool exception + */ + public static String build(final String title, final Project project, final LocalDate start, final LocalDate end) throws AgirStatoolException + { + String result; + + try + { + if (project.hasIssue()) + { + String source = XidynUtils.load(AgirStatool.class.getResource("/org/april/agirstatool/core/pages/chartLineView2.xhtml")); + String code = XidynUtils.extractBodyContent(source); + + code = code.replaceAll("myChart", "myChart_" + DigestUtils.md5Hex(title + "line2Chart")); + + StringList labels = buildWeekLabels(start, end); + code = code.replaceAll("labels: \\[.*\\]", "labels: " + AgirStatoolUtils.toJSonStrings(labels)); + + DateCountList createdDates = project.issueStats().getWeekCreatedIssueCounts(); + DateCountList closedDates = project.issueStats().getWeekConcludedIssueCounts(); + DateCountList dates = new DateCountList(createdDates.size()); + for (int dateIndex = 0; dateIndex < createdDates.size(); dateIndex++) + { + DateCount createdDate = createdDates.get(dateIndex); + DateCount closedDate = closedDates.get(dateIndex); + dates.add(new DateCount(createdDate.getDate(), createdDate.getCount() - closedDate.getCount())); + } + + StringList values = AgirStatoolUtils.normalizedWeekCountList(dates, start, end).toValueList(); + code = code.replaceAll("data: \\[.*\\]", "data: " + AgirStatoolUtils.toJSonNumbers(values)); + + result = code.toString(); + } + else + { + result = "No issue."; + } + } + catch (IOException exception) + { + throw new AgirStatoolException("Error building ProjectsRaw view: " + exception.getMessage(), exception); + } + + // + return result; + } + + /** + * Builds the full. + * + * @param title + * the title + * @param project + * the project + * @return the string + * @throws AgirStatoolException + * the agir statool exception + */ + public static String buildFull(final String title, final Project project) throws AgirStatoolException + { + String result; + + try + { + logger.debug("Building created/concluded chart view…"); + + if (project.hasIssue()) + { + String source = XidynUtils.load(AgirStatool.class.getResource("/org/april/agirstatool/core/pages/chartLineView.xhtml")); + String code = XidynUtils.extractBodyContent(source); + + code = code.replaceAll("myChart", "myChart_" + DigestUtils.md5Hex(title + "lineBar")); + + StringList labels = buildWeekLabels(project.issueStats().getFirstCreate().toLocalDate()); + code = code.replaceAll("labels: \\[.*\\]", "labels: " + AgirStatoolUtils.toJSonStrings(labels)); + + StringList values = project.issueStats().getWeekCreatedIssueCounts().toValueList(); + code = code.replaceAll("data: \\[.*\\]", "data: " + AgirStatoolUtils.toJSonNumbers(values)); + + values = project.issueStats().getWeekConcludedIssueCounts().toValueList(); + code = code.replaceAll("data: \\[.*\\] ", "data: " + AgirStatoolUtils.toJSonNumbers(values)); + + result = code.toString(); + } + else + { + result = "No issue."; + } + } + catch (IOException exception) + { + throw new AgirStatoolException("Error building ProjectsRaw view: " + exception.getMessage(), exception); + } + + // + return result; + } + + /** + * Builds the last months. + * + * @param title + * the title + * @param project + * the project + * @param monthCount + * the month count + * @return the string + * @throws AgirStatoolException + * the agir statool exception + */ + public static String buildLastMonths(final String title, final Project project, final int monthCount) throws AgirStatoolException + { + String result; + + result = build(title, project, LocalDate.now().minusMonths(monthCount), LocalDate.now()); + + // + return result; + } + + /** + * Builds the previous year. + * + * @param title + * the title + * @param project + * the project + * @return the string + * @throws AgirStatoolException + * the agir statool exception + */ + public static String buildPreviousYear(final String title, final Project project) throws AgirStatoolException + { + String result; + + result = buildYear(title, project, LocalDate.now().getYear() - 1); + + // + return result; + } + + /** + * Builds the week labels. + * + * @param start + * the start + * @return the string list + */ + private static StringList buildWeekLabels(final LocalDate start) + { + StringList result; + + result = buildWeekLabels(start, LocalDate.now()); + + // + return result; + } + + /** + * Builds the week labels. + * + * @param start + * the start + * @param end + * the end + * @return the string list + */ + private static StringList buildWeekLabels(final LocalDate start, final LocalDate end) + { + StringList result; + + result = new StringList(); + + if (start != null) + { + LocalDate normalizedEnd = AgirStatoolUtils.normaliseWeekDate(end); + LocalDate date = AgirStatoolUtils.normaliseWeekDate(start); + while (date.isBefore(normalizedEnd) || date.isEqual(normalizedEnd)) + { + String label = date.format(DateTimeFormatter.ofPattern("yyyy-MMM")); + result.add(label); + date = date.plusWeeks(1); + } + } + + // + return result; + } + + /** + * Builds the year. + * + * @param title + * the title + * @param project + * the project + * @param year + * the year + * @return the string + * @throws AgirStatoolException + * the agir statool exception + */ + public static String buildYear(final String title, final Project project, final int year) throws AgirStatoolException + { + String result; + + LocalDate start = LocalDate.of(year, 1, 1).minusDays(7); + LocalDate end = LocalDate.of(year + 1, 1, 1).minusDays(1); + + result = build(title, project, start, end); + + // + return result; + } + +} diff --git a/src/org/april/agirstatool/core/pages/ProjectPage.java b/src/org/april/agirstatool/core/pages/ProjectPage.java index 5500fbf..110626d 100644 --- a/src/org/april/agirstatool/core/pages/ProjectPage.java +++ b/src/org/april/agirstatool/core/pages/ProjectPage.java @@ -58,17 +58,23 @@ public class ProjectPage data.setContent("agirLink", project.getName()); data.setAttribute("agirLink", "href", "https://agir.april.org/projects/" + project.getIdentifier() + "/issues"); - data.setContent("issueCreatedClosed3MonthsChart", CreatedConcludedCountChartView.buildLastMonths("Created/closed 3 months Count", project, 3)); - data.setContent("issueCreatedClosed6MonthsChart", CreatedConcludedCountChartView.buildLastMonths("Created/closed 6 months Count", project, 6)); - data.setContent("issueCreatedClosedPreviousYearChart", CreatedConcludedCountChartView.buildPreviousYear("Created/closed last year Count", project)); - data.setContent("issueCreatedClosedFullChart", CreatedConcludedCountChartView.buildFull("Created/closed Count", project)); + data.setContent("createdClosed3MonthsChart", CreatedClosedCountChartView.buildLastMonths("Created/closed 3 months Count", project, 3)); + data.setContent("created-Closed3MonthsChart", CreatedClosedDiffChartView.buildLastMonths("Created-closed 3 months Count", project, 3)); + data.setContent("createdClosed6MonthsChart", CreatedClosedCountChartView.buildLastMonths("Created/closed 6 months Count", project, 6)); + data.setContent("created-Closed6MonthsChart", CreatedClosedDiffChartView.buildLastMonths("Created-closed 6 months Count", project, 6)); + data.setContent("createdClosedPreviousYearChart", CreatedClosedCountChartView.buildPreviousYear("Created/closed last year Count", project)); + data.setContent("created-ClosedPreviousYearChart", CreatedClosedDiffChartView.buildPreviousYear("Created-closed last year Count", project)); + data.setContent("createdClosedFullChart", CreatedClosedCountChartView.buildFull("Created/closed Count", project)); data.setContent("issueRawChart", IssueStatChartView.build("Issue Raw Count", project)); data.setContent("issueGroupedChart", IssueStatChartView.buildGrouped("Issue Grouped Count", project)); data.setContent("unassignedRawChart", UnassignedPolarChartView.build("Unassigned Raw Count", project)); data.setContent("unassignedGroupedChart", UnassignedPolarChartView.buildGrouped("Unassigned Grouped Count", project)); - data.setContent("issueCreatedClosed6MonthsChartA", CreatedConcludedCountChartView.buildLastMonths("Created/closed 6 months CountA", project, 6)); - data.setContent("issueCreatedClosed6MonthsChartB", CreatedConcludedCountChartView.buildLastMonths("Created/closed 6 months CountB", project, 6)); + data.setContent("createdClosed6MonthsChartA", CreatedClosedCountChartView.buildLastMonths("Created/closed 6 months CountA", project, 6)); + data.setContent("createdClosed6MonthsChartB", CreatedClosedCountChartView.buildLastMonths("Created/closed 6 months CountB", project, 6)); + + data.setContent("created-Closed6MonthsChartA", CreatedClosedDiffChartView.buildLastMonths("Created-closed 6 months CountA", project, 6)); + data.setContent("created-Closed6MonthsChartB", CreatedClosedDiffChartView.buildLastMonths("Created-closed 6 months CountB", project, 6)); String projectsRawView = ProjectsRawView.build(project); data.setContent("projectsRawView", projectsRawView); diff --git a/src/org/april/agirstatool/core/pages/chartLineView2.xhtml b/src/org/april/agirstatool/core/pages/chartLineView2.xhtml new file mode 100644 index 0000000..88ca40f --- /dev/null +++ b/src/org/april/agirstatool/core/pages/chartLineView2.xhtml @@ -0,0 +1,69 @@ + + + + + Agir Statool + + + + + + + +
+ + +
+ + diff --git a/src/org/april/agirstatool/core/pages/project.xhtml b/src/org/april/agirstatool/core/pages/project.xhtml index df930eb..323c9cd 100644 --- a/src/org/april/agirstatool/core/pages/project.xhtml +++ b/src/org/april/agirstatool/core/pages/project.xhtml @@ -26,10 +26,21 @@ Admins Chapril - - - -
CREATED/CLOSED FULL CHART
+ + + +
+
CREATED/CLOSED FULL CHART
+
@@ -43,7 +54,8 @@
ISSUES BAR CHART
-
CREATED/CLOSED 6 MONTHS CHART
+
CREATED/CLOSED 6 MONTHS CHART A
+
CREATED-CLOSED 6 MONTHS CHART A

@@ -54,7 +66,8 @@
ISSUES BAR CHART
-
CREATED/CLOSED 6 MONTHS CHARTB
+
CREATED/CLOSED 6 MONTHS CHARTB
+
CREATED-CLOSED 6 MONTHS CHART B

@@ -65,53 +78,35 @@