diff --git a/www-client/src/main/java/fr/agrometinfo/www/client/presenter/LayoutPresenter.java b/www-client/src/main/java/fr/agrometinfo/www/client/presenter/LayoutPresenter.java index d01795f48933c7d2391329d472d992cffbb05615..e395b31494020dd97678d33bccfd16bfddf7e04d 100644 --- a/www-client/src/main/java/fr/agrometinfo/www/client/presenter/LayoutPresenter.java +++ b/www-client/src/main/java/fr/agrometinfo/www/client/presenter/LayoutPresenter.java @@ -118,7 +118,7 @@ public final class LayoutPresenter implements Presenter { } final String regionName = regions.getOrDefault(choice.getFeatureId(), CSTS.metropolitanFrance()); mapPresenter.loadValues(choice, chosenIndicator, periodName, regionName); - rightPanelPresenter.loadValues(choice); + rightPanelPresenter.loadValues(choice, periodName); } /** diff --git a/www-client/src/main/java/fr/agrometinfo/www/client/presenter/RightPanelPresenter.java b/www-client/src/main/java/fr/agrometinfo/www/client/presenter/RightPanelPresenter.java index ebc372ae6358ac0264575460fded235e08962b26..385f1a1ec04137b9a1843c27420f401a8dffd10a 100644 --- a/www-client/src/main/java/fr/agrometinfo/www/client/presenter/RightPanelPresenter.java +++ b/www-client/src/main/java/fr/agrometinfo/www/client/presenter/RightPanelPresenter.java @@ -37,6 +37,11 @@ public final class RightPanelPresenter implements FeatureSelectHandler, Presente */ boolean isVisible(); + /** + * @param periodName name of chosen period + */ + void setPeriodName(String periodName); + /** * Display summary data. * @@ -70,14 +75,22 @@ public final class RightPanelPresenter implements FeatureSelectHandler, Presente */ private DominoElement<HTMLElement> container; + /** + * Name of chosen period. + */ + private String periodName; + /** * Load indicator values on the panel. * - * @param c user choice for the indicator values + * @param c user choice for the indicator values + * @param pName name of chosen period */ - public void loadValues(final ChoiceDTO c) { + public void loadValues(final ChoiceDTO c, final String pName) { GWT.log("RightPanelPresenter.loadValues() " + c); currentChoice = c; + periodName = pName; + view.setPeriodName(pName); IndicatorServiceFactory.INSTANCE .getSummary(c.getIndicator(), c.getPeriod(), c.getLevel(), c.getFeatureId(), c.getYear()) // .onSuccess(view::setSummary)// @@ -101,7 +114,7 @@ public final class RightPanelPresenter implements FeatureSelectHandler, Presente choice.setFeatureId(event.getId()); choice.setLevel(event.getLevel()); choice.setYear(currentChoice.getYear()); - loadValues(choice); + loadValues(choice, periodName); view.show(); } diff --git a/www-client/src/main/java/fr/agrometinfo/www/client/ui/CardDetails.java b/www-client/src/main/java/fr/agrometinfo/www/client/ui/CardDetails.java new file mode 100644 index 0000000000000000000000000000000000000000..158102fdfc5e17de26cfa411aaa481ef0f32f5ba --- /dev/null +++ b/www-client/src/main/java/fr/agrometinfo/www/client/ui/CardDetails.java @@ -0,0 +1,114 @@ +package fr.agrometinfo.www.client.ui; + +import org.dominokit.domino.ui.icons.Icons; +import org.dominokit.domino.ui.utils.BaseDominoElement; +import org.dominokit.domino.ui.utils.DominoElement; +import org.jboss.elemento.Elements; + +import elemental2.dom.HTMLDivElement; +import elemental2.dom.HTMLElement; + +/** + * A component provides a content container. + * + * @author Olivier Maury + */ +public class CardDetails extends BaseDominoElement<HTMLElement, CardDetails> { + /** + * Creates new card instance. + * + * @return new instance with no title and no body + */ + public static CardDetails create() { + return new CardDetails(); + } + + /** + * Container for the main text. + */ + private final DominoElement<HTMLDivElement> body = DominoElement.div(); + + /** + * Root element. + */ + private final DominoElement<HTMLElement> root = DominoElement.of(// + Elements.createElement("details", HTMLElement.class)); + + /** + * Container for the subtitle. + */ + private final DominoElement<HTMLDivElement> subTitle = DominoElement.div().css("subtitle").hide(); + + /** + * Container for the title, in bold. + */ + private final DominoElement<HTMLDivElement> title = DominoElement.div().css("title"); + + /** + * Container for the associated value. + */ + private final DominoElement<HTMLDivElement> value = DominoElement.div().css("value"); + + /** + * Constructor. + */ + public CardDetails() { + final HTMLElement sum = Elements.createElement("summary", HTMLElement.class); + sum.append(Elements.span().addAll(title, subTitle, value).element()); + sum.append(Icons.MDI_ICONS.information_outline_mdi().element()); + root.add(sum); + root.add(body); + root.css("card-details"); + } + + @Override + public final HTMLElement element() { + return root.element(); + } + + /** + * Sets the body of the card. + * + * @param bodyText the body of the card + * @return same instance + */ + public CardDetails setBody(final String bodyText) { + body.textContent(bodyText); + return this; + } + + /** + * Sets the subtitle of the card. + * + * @param subTitleText the subtitle of the header + * @return same instance + */ + public CardDetails setSubTitle(final String subTitleText) { + subTitle.textContent(subTitleText); + subTitle.toggleDisplay(subTitleText != null && !subTitleText.isEmpty()); + return this; + } + + /** + * Sets the title of the card. + * + * @param titleText the title of the header + * @return same instance + */ + public CardDetails setTitle(final String titleText) { + title.textContent(titleText); + return this; + } + + /** + * Sets the value of the card. + * + * @param valueText the value of the header + * @return same instance + */ + public CardDetails setValue(final String valueText) { + value.textContent(valueText); + return this; + } + +} diff --git a/www-client/src/main/java/fr/agrometinfo/www/client/view/RightPanelView.java b/www-client/src/main/java/fr/agrometinfo/www/client/view/RightPanelView.java index b582ae4b0bf566d1e6e1b3f151365de0c867255e..05550f6a87fb43b781eec0c3ff0db6578c5ebf81 100644 --- a/www-client/src/main/java/fr/agrometinfo/www/client/view/RightPanelView.java +++ b/www-client/src/main/java/fr/agrometinfo/www/client/view/RightPanelView.java @@ -9,13 +9,10 @@ import java.util.List; import java.util.Map; import org.dominokit.domino.ui.button.Button; -import org.dominokit.domino.ui.cards.Card; import org.dominokit.domino.ui.grid.Column; import org.dominokit.domino.ui.grid.Row; import org.dominokit.domino.ui.icons.Icons; -import org.dominokit.domino.ui.notifications.Notification; import org.dominokit.domino.ui.utils.DominoElement; -import org.dominokit.domino.ui.utils.TextNode; import org.jboss.elemento.Elements; import org.jboss.elemento.EventType; import org.jboss.elemento.HtmlContentBuilder; @@ -56,6 +53,7 @@ import fr.agrometinfo.www.client.event.FeatureSelectEvent; import fr.agrometinfo.www.client.i18n.AppConstants; import fr.agrometinfo.www.client.i18n.AppMessages; import fr.agrometinfo.www.client.presenter.RightPanelPresenter; +import fr.agrometinfo.www.client.ui.CardDetails; import fr.agrometinfo.www.client.util.ApplicationUtils; import fr.agrometinfo.www.client.util.DateUtils; import fr.agrometinfo.www.shared.dto.IndicatorDTO; @@ -145,7 +143,7 @@ public final class RightPanelView implements RightPanelPresenter.View { /** * Card for the daily average value for the user choice. */ - private final Card averageCard = Card.create(); + private final CardDetails averageCard = CardDetails.create(); /** * Back link. @@ -165,7 +163,7 @@ public final class RightPanelView implements RightPanelPresenter.View { /** * Card for the daily comparison value for the user choice. */ - private final Card comparisonCard = Card.create(); + private final CardDetails comparisonCard = CardDetails.create(); /** * Container for the panel. @@ -196,6 +194,11 @@ public final class RightPanelView implements RightPanelPresenter.View { * Values according to user's choice. */ private SummaryDTO summary; + /** + * Name of chosen period. + */ + private String periodName; + /** * Constructor. * @@ -288,6 +291,23 @@ public final class RightPanelView implements RightPanelPresenter.View { lineChartContainer.appendChild((Node) chart.getChartElement().as()); } + private String getDescription(final boolean comparison) { + final IndicatorDTO indicator = summary.getIndicator(); + String region = summary.getFeatureName(); + if (region == null) { + region = CSTS.metropolitanFrance(); + } + String message; + if (comparison) { + message = MSGS.comparedValue(indicator.getDescription(), summary.getPeriod(), region, + summary.getChoice().getYear()); + } else { + message = MSGS.averageValue(indicator.getDescription(), summary.getPeriod(), region, + summary.getChoice().getYear()); + } + return message; + } + @Override public void hide() { layoutView.hideRightPanel(); @@ -307,9 +327,7 @@ public final class RightPanelView implements RightPanelPresenter.View { container.add(header); - averageCard.addHeaderAction(Icons.ACTION_ICONS.info_outline(), e -> this.showDescription(false)); - comparisonCard.addHeaderAction(Icons.ACTION_ICONS.info_outline(), e -> this.showDescription(true)); - comparisonCard.setDescription(CSTS.comparisonPeriod()); + comparisonCard.setTitle(CSTS.comparisonPeriod()); container.add(Row.create() // .addColumn(Column.span6().add(averageCard)) // @@ -323,6 +341,11 @@ public final class RightPanelView implements RightPanelPresenter.View { return layoutView.isRightPanelVisible(); } + @Override + public void setPeriodName(final String name) { + periodName = name; + } + @Override public void setPresenter(final RightPanelPresenter p) { presenter = p; @@ -373,7 +396,7 @@ public final class RightPanelView implements RightPanelPresenter.View { final NumberFormat nf = NumberFormat.getFormat("0.#"); final DateTimeFormat df = DateTimeFormat.getFormat(PredefinedFormat.DATE_MEDIUM); header.element().innerHTML = ""; - header.add(title); + header.add(title + ", " + periodName); header.add(Elements.br()); header.add(Elements.small(df.format(data.getDate()))); @@ -381,14 +404,14 @@ public final class RightPanelView implements RightPanelPresenter.View { // Average averageCard.setTitle(indicator.getDescription()); - averageCard.getBody().clearElement(); - averageCard.getBody().appendChild(TextNode.of(nf.format(data.getAverageValue()) + " " + indicator.getUnit())); + averageCard.setValue(nf.format(data.getAverageValue()) + " " + indicator.getUnit()); + averageCard.setBody(getDescription(false)); // Comparison comparisonCard.setTitle(CSTS.normalComparison()); - comparisonCard.getBody().clearElement(); - comparisonCard.getBody() - .appendChild(TextNode.of(nf.format(data.getComparedValue()) + " " + indicator.getUnit())); + comparisonCard.setSubTitle(CSTS.comparisonPeriod()); + comparisonCard.setValue(nf.format(data.getComparedValue()) + " " + indicator.getUnit()); + comparisonCard.setBody(getDescription(true)); // Chart createBarChart(data.getMonthlyValues()); @@ -400,21 +423,4 @@ public final class RightPanelView implements RightPanelPresenter.View { layoutView.showRightPanel(); } - private void showDescription(final boolean comparison) { - final IndicatorDTO indicator = summary.getIndicator(); - String region = summary.getFeatureName(); - if (region == null) { - region = CSTS.metropolitanFrance(); - } - String message; - if (comparison) { - message = MSGS.comparedValue(indicator.getDescription(), summary.getPeriod(), region, - summary.getChoice().getYear()); - } else { - message = MSGS.averageValue(indicator.getDescription(), summary.getPeriod(), region, - summary.getChoice().getYear()); - } - Notification.create(message).show(); - } - } diff --git a/www-client/src/main/resources/fr/agrometinfo/www/client/public/style.css b/www-client/src/main/resources/fr/agrometinfo/www/client/public/style.css index 5e9dc11e4bad0e110921ee7cd186c2b58f8db766..5d83a5e317ccef9fdf656fe5d389311d926a2a3d 100644 --- a/www-client/src/main/resources/fr/agrometinfo/www/client/public/style.css +++ b/www-client/src/main/resources/fr/agrometinfo/www/client/public/style.css @@ -119,6 +119,47 @@ select { .comparison-btn { min-width: 10em; } + +/* card-details */ + +details.card-details { + background: #fff; + border-radius: 5px; + box-shadow: 0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12); + margin-bottom: 10px; +} + +details.card-details > div, +details.card-details > summary { + padding: 10px 15px; +} + +details.card-details > summary { + color: #30353b; + list-style: none; + display: flex; + justify-content: space-between; + align-items: center; +} +details.card-details > summary::-webkit-details-marker { + display: none; +} +details.card-details > summary i { + background-size: cover; + cursor: pointer; + transition: 0.2s; +} +details.card-details > summary div.title { + font-weight: bold; +} +details.card-details[open] > summary { + border-bottom: 1px solid rgba(204,204,204,0.35); +} +details.card-details[open] > summary i { + transform: rotate(180deg); +} + + .float-right { float: right; }