From 5efd2da6362b922fd66d89983f300945f58a83f7 Mon Sep 17 00:00:00 2001 From: Tim Chamberlain Date: Fri, 23 Sep 2022 15:55:27 -0500 Subject: [PATCH] SPRINT-12: updated to define widgets at table level, refactoring of some of the widget stuff to match other "Action"s --- .../dashboard/AbstractWidgetRenderer.java | 21 +-- .../dashboard/QuickSightChartRenderer.java | 15 +- ...ataLoader.java => RenderWidgetAction.java} | 15 +- .../actions/widgets/RenderWidgetInput.java | 171 ++++++++++++++++++ .../actions/widgets/RenderWidgetOutput.java | 80 ++++++++ .../model/dashboard/widgets/TableData.java | 36 ++++ .../metadata/dashboard/QWidgetMetaData.java | 35 ++++ .../frontend/QFrontendTableMetaData.java | 19 ++ .../model/metadata/tables/QTableMetaData.java | 36 ++++ .../PersonsByCreateDateBarChart.java | 9 +- .../QuickSightChartRendererTest.java | 17 +- ...rTest.java => RenderWidgetActionTest.java} | 18 +- .../javalin/QJavalinImplementation.java | 26 ++- .../javalin/PersonsByCreateDateBarChart.java | 6 +- .../widgets/PersonsByCreateDateBarChart.java | 6 +- .../PersonsByCreateDateBarChartTest.java | 3 +- 16 files changed, 450 insertions(+), 63 deletions(-) rename qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/{WidgetDataLoader.java => RenderWidgetAction.java} (69%) create mode 100644 qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/widgets/RenderWidgetInput.java create mode 100644 qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/widgets/RenderWidgetOutput.java rename qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/{WidgetDataLoaderTest.java => RenderWidgetActionTest.java} (70%) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/AbstractWidgetRenderer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/AbstractWidgetRenderer.java index f7920eceb..2dd99c16 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/AbstractWidgetRenderer.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/AbstractWidgetRenderer.java @@ -22,10 +22,12 @@ package com.kingsrook.qqq.backend.core.actions.dashboard; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import com.kingsrook.qqq.backend.core.actions.values.QValueFormatter; import com.kingsrook.qqq.backend.core.exceptions.QException; -import com.kingsrook.qqq.backend.core.model.metadata.QInstance; -import com.kingsrook.qqq.backend.core.model.metadata.dashboard.QWidgetMetaDataInterface; -import com.kingsrook.qqq.backend.core.model.session.QSession; +import com.kingsrook.qqq.backend.core.model.actions.widgets.RenderWidgetInput; +import com.kingsrook.qqq.backend.core.model.actions.widgets.RenderWidgetOutput; /******************************************************************************* @@ -34,20 +36,15 @@ import com.kingsrook.qqq.backend.core.model.session.QSession; *******************************************************************************/ public abstract class AbstractWidgetRenderer { - - /******************************************************************************* - ** - *******************************************************************************/ - public abstract Object render(QInstance qInstance, QSession session, QWidgetMetaDataInterface qWidgetMetaData) throws QException; + public static final QValueFormatter valueFormatter = new QValueFormatter(); + public static final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd H:mma").withZone(ZoneId.systemDefault()); + public static final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd").withZone(ZoneId.systemDefault()); /******************************************************************************* ** *******************************************************************************/ - public String getWidgetName() - { - return this.getClass().getSimpleName(); - } + public abstract RenderWidgetOutput render(RenderWidgetInput input) throws QException; } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/QuickSightChartRenderer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/QuickSightChartRenderer.java index 6d8a50db..3defb074 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/QuickSightChartRenderer.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/QuickSightChartRenderer.java @@ -23,11 +23,11 @@ package com.kingsrook.qqq.backend.core.actions.dashboard; import com.kingsrook.qqq.backend.core.exceptions.QException; +import com.kingsrook.qqq.backend.core.model.actions.widgets.RenderWidgetInput; +import com.kingsrook.qqq.backend.core.model.actions.widgets.RenderWidgetOutput; +import com.kingsrook.qqq.backend.core.model.dashboard.widgets.QWidget; import com.kingsrook.qqq.backend.core.model.dashboard.widgets.QuickSightChart; -import com.kingsrook.qqq.backend.core.model.metadata.QInstance; -import com.kingsrook.qqq.backend.core.model.metadata.dashboard.QWidgetMetaDataInterface; import com.kingsrook.qqq.backend.core.model.metadata.dashboard.QuickSightChartMetaData; -import com.kingsrook.qqq.backend.core.model.session.QSession; import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; import software.amazon.awssdk.regions.Region; @@ -49,11 +49,11 @@ public class QuickSightChartRenderer extends AbstractWidgetRenderer ** *******************************************************************************/ @Override - public Object render(QInstance qInstance, QSession session, QWidgetMetaDataInterface metaData) throws QException + public RenderWidgetOutput render(RenderWidgetInput input) throws QException { try { - QuickSightChartMetaData quickSightMetaData = (QuickSightChartMetaData) metaData; + QuickSightChartMetaData quickSightMetaData = (QuickSightChartMetaData) input.getWidgetMetaData(); QuickSightClient quickSightClient = getQuickSightClient(quickSightMetaData); final RegisteredUserEmbeddingExperienceConfiguration experienceConfiguration = RegisteredUserEmbeddingExperienceConfiguration.builder() @@ -71,8 +71,9 @@ public class QuickSightChartRenderer extends AbstractWidgetRenderer final GenerateEmbedUrlForRegisteredUserResponse generateEmbedUrlForRegisteredUserResponse = quickSightClient.generateEmbedUrlForRegisteredUser(generateEmbedUrlForRegisteredUserRequest); - String embedUrl = generateEmbedUrlForRegisteredUserResponse.embedUrl(); - return (new QuickSightChart(metaData.getName(), quickSightMetaData.getLabel(), embedUrl)); + String embedUrl = generateEmbedUrlForRegisteredUserResponse.embedUrl(); + QWidget widget = new QuickSightChart(input.getWidgetMetaData().getName(), quickSightMetaData.getLabel(), embedUrl); + return (new RenderWidgetOutput(widget)); } catch(Exception e) { diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/WidgetDataLoader.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/RenderWidgetAction.java similarity index 69% rename from qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/WidgetDataLoader.java rename to qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/RenderWidgetAction.java index 293df38e..00ba8fca 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/WidgetDataLoader.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/RenderWidgetAction.java @@ -24,26 +24,23 @@ package com.kingsrook.qqq.backend.core.actions.dashboard; import com.kingsrook.qqq.backend.core.actions.customizers.QCodeLoader; import com.kingsrook.qqq.backend.core.exceptions.QException; -import com.kingsrook.qqq.backend.core.model.metadata.QInstance; -import com.kingsrook.qqq.backend.core.model.metadata.dashboard.QWidgetMetaDataInterface; -import com.kingsrook.qqq.backend.core.model.session.QSession; +import com.kingsrook.qqq.backend.core.model.actions.widgets.RenderWidgetInput; +import com.kingsrook.qqq.backend.core.model.actions.widgets.RenderWidgetOutput; /******************************************************************************* ** Class for loading widget implementation code and rendering of widgets ** *******************************************************************************/ -public class WidgetDataLoader +public class RenderWidgetAction { /******************************************************************************* ** *******************************************************************************/ - public Object execute(QInstance qInstance, QSession session, String name) throws QException + public RenderWidgetOutput execute(RenderWidgetInput input) throws QException { - QWidgetMetaDataInterface widget = qInstance.getWidget(name); - AbstractWidgetRenderer widgetRenderer = QCodeLoader.getAdHoc(AbstractWidgetRenderer.class, widget.getCodeReference()); - Object w = widgetRenderer.render(qInstance, session, widget); - return (widgetRenderer.render(qInstance, session, widget)); + AbstractWidgetRenderer widgetRenderer = QCodeLoader.getAdHoc(AbstractWidgetRenderer.class, input.getWidgetMetaData().getCodeReference()); + return (widgetRenderer.render(input)); } } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/widgets/RenderWidgetInput.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/widgets/RenderWidgetInput.java new file mode 100644 index 00000000..a6a868e3 --- /dev/null +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/widgets/RenderWidgetInput.java @@ -0,0 +1,171 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program 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. + * + * 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.kingsrook.qqq.backend.core.model.actions.widgets; + + +import java.util.HashMap; +import java.util.Map; +import com.kingsrook.qqq.backend.core.model.actions.AbstractActionInput; +import com.kingsrook.qqq.backend.core.model.metadata.QInstance; +import com.kingsrook.qqq.backend.core.model.metadata.dashboard.QWidgetMetaDataInterface; +import com.kingsrook.qqq.backend.core.model.session.QSession; + + +/******************************************************************************* + ** Input data container for the RenderWidget action + ** + *******************************************************************************/ +public class RenderWidgetInput extends AbstractActionInput +{ + private QSession session; + private QWidgetMetaDataInterface widgetMetaData; + private Map queryParams; + + + + /******************************************************************************* + ** + *******************************************************************************/ + public RenderWidgetInput(QInstance instance) + { + super(instance); + } + + + + /******************************************************************************* + ** Getter for session + ** + *******************************************************************************/ + public QSession getSession() + { + return session; + } + + + + /******************************************************************************* + ** Setter for session + ** + *******************************************************************************/ + public void setSession(QSession session) + { + this.session = session; + } + + + + /******************************************************************************* + ** Fluent setter for session + ** + *******************************************************************************/ + public RenderWidgetInput withSession(QSession session) + { + this.session = session; + return (this); + } + + + + /******************************************************************************* + ** Getter for widgetMetaData + ** + *******************************************************************************/ + public QWidgetMetaDataInterface getWidgetMetaData() + { + return widgetMetaData; + } + + + + /******************************************************************************* + ** Setter for widgetMetaData + ** + *******************************************************************************/ + public void setWidgetMetaData(QWidgetMetaDataInterface widgetMetaData) + { + this.widgetMetaData = widgetMetaData; + } + + + + /******************************************************************************* + ** Fluent setter for widgetMetaData + ** + *******************************************************************************/ + public RenderWidgetInput withWidgetMetaData(QWidgetMetaDataInterface widgetMetaData) + { + this.widgetMetaData = widgetMetaData; + return (this); + } + + + + /******************************************************************************* + ** Getter for urlParams + ** + *******************************************************************************/ + public Map getQueryParams() + { + return queryParams; + } + + + + /******************************************************************************* + ** Setter for urlParams + ** + *******************************************************************************/ + public void setQueryParams(Map queryParams) + { + this.queryParams = queryParams; + } + + + + /******************************************************************************* + ** Fluent setter for urlParams + ** + *******************************************************************************/ + public RenderWidgetInput withUrlParams(Map urlParams) + { + this.queryParams = urlParams; + return (this); + } + + + + /******************************************************************************* + ** adds a query param value + ** + *******************************************************************************/ + public void addQueryParam(String name, String value) + { + if(this.queryParams == null) + { + this.queryParams = new HashMap<>(); + } + + this.queryParams.put(name, value); + } + +} diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/widgets/RenderWidgetOutput.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/widgets/RenderWidgetOutput.java new file mode 100644 index 00000000..ee9ee257 --- /dev/null +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/widgets/RenderWidgetOutput.java @@ -0,0 +1,80 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program 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. + * + * 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.kingsrook.qqq.backend.core.model.actions.widgets; + + +import java.io.Serializable; + + +/******************************************************************************* + ** Output for an Export action + *******************************************************************************/ +public class RenderWidgetOutput implements Serializable +{ + public Object widgetData; + + + + /******************************************************************************* + ** constructor taking in widget data + ** + *******************************************************************************/ + public RenderWidgetOutput(Object widgetData) + { + this.widgetData = widgetData; + } + + + + /******************************************************************************* + ** Getter for widgetData + ** + *******************************************************************************/ + public Object getWidgetData() + { + return widgetData; + } + + + + /******************************************************************************* + ** Setter for widgetData + ** + *******************************************************************************/ + public void setWidgetData(Object widgetData) + { + this.widgetData = widgetData; + } + + + + /******************************************************************************* + ** Fluent setter for widgetData + ** + *******************************************************************************/ + public RenderWidgetOutput withWidgetData(Object widgetData) + { + this.widgetData = widgetData; + return (this); + } + +} diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/TableData.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/TableData.java index 09a85772..22fe0ad8 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/TableData.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/TableData.java @@ -229,6 +229,7 @@ public class TableData implements QWidget private String accessor; private String width; private String align; + private String verticalAlign; @@ -413,5 +414,40 @@ public class TableData implements QWidget this.type = type; return this; } + + + + /******************************************************************************* + ** Getter for verticalAlign + ** + *******************************************************************************/ + public String getVerticalAlign() + { + return verticalAlign; + } + + + + /******************************************************************************* + ** Setter for verticalAlign + ** + *******************************************************************************/ + public void setVerticalAlign(String verticalAlign) + { + this.verticalAlign = verticalAlign; + } + + + + /******************************************************************************* + ** Fluent setter for verticalAlign + ** + *******************************************************************************/ + public Column withVerticalAlign(String verticalAlign) + { + this.verticalAlign = verticalAlign; + return (this); + } + } } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/dashboard/QWidgetMetaData.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/dashboard/QWidgetMetaData.java index 95a2de76..4c30be63 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/dashboard/QWidgetMetaData.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/dashboard/QWidgetMetaData.java @@ -31,6 +31,7 @@ import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeReference; *******************************************************************************/ public class QWidgetMetaData implements QWidgetMetaDataInterface { + private String id; protected String name; protected QCodeReference codeReference; @@ -102,4 +103,38 @@ public class QWidgetMetaData implements QWidgetMetaDataInterface return (this); } + + + /******************************************************************************* + ** Getter for id + ** + *******************************************************************************/ + public String getId() + { + return id; + } + + + + /******************************************************************************* + ** Setter for id + ** + *******************************************************************************/ + public void setId(String id) + { + this.id = id; + } + + + + /******************************************************************************* + ** Fluent setter for id + ** + *******************************************************************************/ + public QWidgetMetaData withId(String id) + { + this.id = id; + return (this); + } + } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/frontend/QFrontendTableMetaData.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/frontend/QFrontendTableMetaData.java index 3ad7774e..c5c18d7b 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/frontend/QFrontendTableMetaData.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/frontend/QFrontendTableMetaData.java @@ -30,6 +30,7 @@ import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldMetaData; import com.kingsrook.qqq.backend.core.model.metadata.tables.QFieldSection; import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData; +import com.kingsrook.qqq.backend.core.utils.CollectionUtils; /******************************************************************************* @@ -50,6 +51,8 @@ public class QFrontendTableMetaData private Map fields; private List sections; + private List widgets; + ////////////////////////////////////////////////////////////////////////////////// // do not add setters. take values from the source-object in the constructor!! // ////////////////////////////////////////////////////////////////////////////////// @@ -81,6 +84,11 @@ public class QFrontendTableMetaData { this.iconName = tableMetaData.getIcon().getName(); } + + if(CollectionUtils.nullSafeHasContents(tableMetaData.getWidgets())) + { + this.widgets = tableMetaData.getWidgets(); + } } @@ -159,4 +167,15 @@ public class QFrontendTableMetaData { return iconName; } + + + + /******************************************************************************* + ** Getter for widgets + ** + *******************************************************************************/ + public List getWidgets() + { + return widgets; + } } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/tables/QTableMetaData.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/tables/QTableMetaData.java index 318a12bb..bfbf1ed6 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/tables/QTableMetaData.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/tables/QTableMetaData.java @@ -77,6 +77,8 @@ public class QTableMetaData implements QAppChildMetaData, Serializable private List sections; + private List widgets; + /******************************************************************************* @@ -715,4 +717,38 @@ public class QTableMetaData implements QAppChildMetaData, Serializable return (this); } + + + /******************************************************************************* + ** Getter for widgets + ** + *******************************************************************************/ + public List getWidgets() + { + return widgets; + } + + + + /******************************************************************************* + ** Setter for widgets + ** + *******************************************************************************/ + public void setWidgets(List widgets) + { + this.widgets = widgets; + } + + + + /******************************************************************************* + ** Fluent setter for widgets + ** + *******************************************************************************/ + public QTableMetaData withWidgets(List widgets) + { + this.widgets = widgets; + return (this); + } + } diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/PersonsByCreateDateBarChart.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/PersonsByCreateDateBarChart.java index cc84b799..373f98d9 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/PersonsByCreateDateBarChart.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/PersonsByCreateDateBarChart.java @@ -25,10 +25,9 @@ package com.kingsrook.qqq.backend.core.actions.dashboard; import java.util.ArrayList; import java.util.List; import com.kingsrook.qqq.backend.core.exceptions.QException; +import com.kingsrook.qqq.backend.core.model.actions.widgets.RenderWidgetInput; +import com.kingsrook.qqq.backend.core.model.actions.widgets.RenderWidgetOutput; import com.kingsrook.qqq.backend.core.model.dashboard.widgets.ChartData; -import com.kingsrook.qqq.backend.core.model.metadata.QInstance; -import com.kingsrook.qqq.backend.core.model.metadata.dashboard.QWidgetMetaDataInterface; -import com.kingsrook.qqq.backend.core.model.session.QSession; /******************************************************************************* @@ -40,7 +39,7 @@ public class PersonsByCreateDateBarChart extends AbstractWidgetRenderer ** *******************************************************************************/ @Override - public Object render(QInstance qInstance, QSession session, QWidgetMetaDataInterface metaData) throws QException + public RenderWidgetOutput render(RenderWidgetInput input) throws QException { try { @@ -62,7 +61,7 @@ public class PersonsByCreateDateBarChart extends AbstractWidgetRenderer labels.add("May 2022"); data.add(64); - return (new ChartData("Persons created per Month", null, "Person records", labels, data)); + return (new RenderWidgetOutput(new ChartData("Persons created per Month", null, "Person records", labels, data))); } catch(Exception e) { diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/QuickSightChartRendererTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/QuickSightChartRendererTest.java index 34987950..415d849c 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/QuickSightChartRendererTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/QuickSightChartRendererTest.java @@ -24,8 +24,7 @@ package com.kingsrook.qqq.backend.core.actions.dashboard; import java.net.UnknownHostException; import com.kingsrook.qqq.backend.core.exceptions.QException; -import com.kingsrook.qqq.backend.core.model.metadata.dashboard.QWidgetMetaData; -import com.kingsrook.qqq.backend.core.model.metadata.dashboard.QuickSightChartMetaData; +import com.kingsrook.qqq.backend.core.model.actions.widgets.RenderWidgetInput; import com.kingsrook.qqq.backend.core.utils.TestUtils; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -43,7 +42,7 @@ class QuickSightChartRendererTest @Test void testWrongMetaDataClass() throws QException { - assertThatThrownBy(() -> new QuickSightChartRenderer().render(TestUtils.defineInstance(), TestUtils.getMockSession(), new QWidgetMetaData())) + assertThatThrownBy(() -> new QuickSightChartRenderer().render(new RenderWidgetInput(TestUtils.defineInstance()))) .hasRootCauseInstanceOf(ClassCastException.class); } @@ -55,7 +54,7 @@ class QuickSightChartRendererTest @Test void testNoCredentials() throws QException { - assertThatThrownBy(() -> new QuickSightChartRenderer().render(TestUtils.defineInstance(), TestUtils.getMockSession(), new QuickSightChartMetaData())) + assertThatThrownBy(() -> new QuickSightChartRenderer().render(new RenderWidgetInput(TestUtils.defineInstance()))) .hasRootCauseInstanceOf(NullPointerException.class); } @@ -67,14 +66,8 @@ class QuickSightChartRendererTest @Test void testBadCredentials() throws QException { - assertThatThrownBy(() -> new QuickSightChartRenderer().render(TestUtils.defineInstance(), TestUtils.getMockSession(), - new QuickSightChartMetaData() - .withName("test") - .withAccessKey("FAIL") - .withSecretKey("FAIL") - .withRegion("FAIL") - .withAccountId("FAIL") + assertThatThrownBy(() -> new QuickSightChartRenderer().render(new RenderWidgetInput(TestUtils.defineInstance()) )).hasRootCauseInstanceOf(UnknownHostException.class); } -} \ No newline at end of file +} diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/WidgetDataLoaderTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/RenderWidgetActionTest.java similarity index 70% rename from qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/WidgetDataLoaderTest.java rename to qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/RenderWidgetActionTest.java index 73cc29d2..c532be90 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/WidgetDataLoaderTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/RenderWidgetActionTest.java @@ -23,7 +23,10 @@ package com.kingsrook.qqq.backend.core.actions.dashboard; import com.kingsrook.qqq.backend.core.exceptions.QException; +import com.kingsrook.qqq.backend.core.model.actions.widgets.RenderWidgetInput; +import com.kingsrook.qqq.backend.core.model.actions.widgets.RenderWidgetOutput; import com.kingsrook.qqq.backend.core.model.dashboard.widgets.ChartData; +import com.kingsrook.qqq.backend.core.model.metadata.QInstance; import com.kingsrook.qqq.backend.core.utils.TestUtils; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -32,9 +35,9 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; /******************************************************************************* - ** Unit test for WidgetDataLoader + ** Unit test for RenderWidgetAction *******************************************************************************/ -class WidgetDataLoaderTest +class RenderWidgetActionTest { /******************************************************************************* ** @@ -42,9 +45,14 @@ class WidgetDataLoaderTest @Test void test() throws QException { - Object widgetData = new WidgetDataLoader().execute(TestUtils.defineInstance(), TestUtils.getMockSession(), PersonsByCreateDateBarChart.class.getSimpleName()); - assertThat(widgetData).isInstanceOf(ChartData.class); - ChartData chartData = (ChartData) widgetData; + QInstance testQInstance = TestUtils.defineInstance(); + RenderWidgetInput input = new RenderWidgetInput(testQInstance) + .withSession(TestUtils.getMockSession()) + .withWidgetMetaData(testQInstance.getWidget(PersonsByCreateDateBarChart.class.getSimpleName())); + + RenderWidgetOutput output = new RenderWidgetAction().execute(input); + assertThat(output.getWidgetData()).isInstanceOf(ChartData.class); + ChartData chartData = (ChartData) output.getWidgetData(); assertEquals("barChart", chartData.getType()); assertThat(chartData.getTitle()).isNotBlank(); assertNotNull(chartData.getChartData()); diff --git a/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementation.java b/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementation.java index 8e01bb9b..619822ce 100644 --- a/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementation.java +++ b/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementation.java @@ -36,7 +36,7 @@ import java.util.Objects; import java.util.Optional; import java.util.function.Supplier; import com.kingsrook.qqq.backend.core.actions.async.AsyncJobManager; -import com.kingsrook.qqq.backend.core.actions.dashboard.WidgetDataLoader; +import com.kingsrook.qqq.backend.core.actions.dashboard.RenderWidgetAction; import com.kingsrook.qqq.backend.core.actions.metadata.MetaDataAction; import com.kingsrook.qqq.backend.core.actions.metadata.ProcessMetaDataAction; import com.kingsrook.qqq.backend.core.actions.metadata.TableMetaDataAction; @@ -76,6 +76,8 @@ import com.kingsrook.qqq.backend.core.model.actions.tables.query.QueryInput; import com.kingsrook.qqq.backend.core.model.actions.tables.query.QueryOutput; import com.kingsrook.qqq.backend.core.model.actions.tables.update.UpdateInput; import com.kingsrook.qqq.backend.core.model.actions.tables.update.UpdateOutput; +import com.kingsrook.qqq.backend.core.model.actions.widgets.RenderWidgetInput; +import com.kingsrook.qqq.backend.core.model.actions.widgets.RenderWidgetOutput; import com.kingsrook.qqq.backend.core.model.data.QRecord; import com.kingsrook.qqq.backend.core.model.metadata.QInstance; import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData; @@ -83,6 +85,7 @@ import com.kingsrook.qqq.backend.core.model.session.QSession; import com.kingsrook.qqq.backend.core.modules.authentication.Auth0AuthenticationModule; import com.kingsrook.qqq.backend.core.modules.authentication.QAuthenticationModuleDispatcher; import com.kingsrook.qqq.backend.core.modules.authentication.QAuthenticationModuleInterface; +import com.kingsrook.qqq.backend.core.utils.CollectionUtils; import com.kingsrook.qqq.backend.core.utils.ExceptionUtils; import com.kingsrook.qqq.backend.core.utils.JsonUtils; import com.kingsrook.qqq.backend.core.utils.StringUtils; @@ -681,8 +684,25 @@ public class QJavalinImplementation InsertInput insertInput = new InsertInput(qInstance); setupSession(context, insertInput); - Object widgetData = new WidgetDataLoader().execute(qInstance, insertInput.getSession(), context.pathParam("name")); - context.result(JsonUtils.toJson(widgetData)); + RenderWidgetInput input = new RenderWidgetInput(qInstance) + .withSession(insertInput.getSession()) + .withWidgetMetaData(qInstance.getWidget(context.pathParam("name"))); + + ////////////////////////// + // process query string // + ////////////////////////// + for(Map.Entry> queryParam : context.queryParamMap().entrySet()) + { + String fieldName = queryParam.getKey(); + List values = queryParam.getValue(); + if(CollectionUtils.nullSafeHasContents(values)) + { + input.addQueryParam(fieldName, values.get(0)); + } + } + + RenderWidgetOutput output = new RenderWidgetAction().execute(input); + context.result(JsonUtils.toJson(output.getWidgetData())); } catch(Exception e) { diff --git a/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/PersonsByCreateDateBarChart.java b/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/PersonsByCreateDateBarChart.java index 268d5c8b..d300f945 100644 --- a/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/PersonsByCreateDateBarChart.java +++ b/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/PersonsByCreateDateBarChart.java @@ -26,10 +26,8 @@ import java.util.ArrayList; import java.util.List; import com.kingsrook.qqq.backend.core.actions.dashboard.AbstractWidgetRenderer; import com.kingsrook.qqq.backend.core.exceptions.QException; +import com.kingsrook.qqq.backend.core.model.actions.widgets.RenderWidgetInput; import com.kingsrook.qqq.backend.core.model.dashboard.widgets.ChartData; -import com.kingsrook.qqq.backend.core.model.metadata.QInstance; -import com.kingsrook.qqq.backend.core.model.metadata.dashboard.QWidgetMetaDataInterface; -import com.kingsrook.qqq.backend.core.model.session.QSession; /******************************************************************************* @@ -41,7 +39,7 @@ public class PersonsByCreateDateBarChart extends AbstractWidgetRenderer ** *******************************************************************************/ @Override - public Object render(QInstance qInstance, QSession session, QWidgetMetaDataInterface metaData) throws QException + public Object render(RenderWidgetInput input) throws QException { try { diff --git a/qqq-sample-project/src/main/java/com/kingsrook/sampleapp/dashboard/widgets/PersonsByCreateDateBarChart.java b/qqq-sample-project/src/main/java/com/kingsrook/sampleapp/dashboard/widgets/PersonsByCreateDateBarChart.java index b6e38fb2..bdc11f47 100644 --- a/qqq-sample-project/src/main/java/com/kingsrook/sampleapp/dashboard/widgets/PersonsByCreateDateBarChart.java +++ b/qqq-sample-project/src/main/java/com/kingsrook/sampleapp/dashboard/widgets/PersonsByCreateDateBarChart.java @@ -26,10 +26,8 @@ import java.util.ArrayList; import java.util.List; import com.kingsrook.qqq.backend.core.actions.dashboard.AbstractWidgetRenderer; import com.kingsrook.qqq.backend.core.exceptions.QException; +import com.kingsrook.qqq.backend.core.model.actions.widgets.RenderWidgetInput; import com.kingsrook.qqq.backend.core.model.dashboard.widgets.ChartData; -import com.kingsrook.qqq.backend.core.model.metadata.QInstance; -import com.kingsrook.qqq.backend.core.model.metadata.dashboard.QWidgetMetaDataInterface; -import com.kingsrook.qqq.backend.core.model.session.QSession; /******************************************************************************* @@ -41,7 +39,7 @@ public class PersonsByCreateDateBarChart extends AbstractWidgetRenderer ** *******************************************************************************/ @Override - public Object render(QInstance qInstance, QSession session, QWidgetMetaDataInterface metaData) throws QException + public Object render(RenderWidgetInput input) throws QException { try { diff --git a/qqq-sample-project/src/test/java/com/kingsrook/sampleapp/dashboard/widgets/PersonsByCreateDateBarChartTest.java b/qqq-sample-project/src/test/java/com/kingsrook/sampleapp/dashboard/widgets/PersonsByCreateDateBarChartTest.java index e15a96e3..88bce47e 100644 --- a/qqq-sample-project/src/test/java/com/kingsrook/sampleapp/dashboard/widgets/PersonsByCreateDateBarChartTest.java +++ b/qqq-sample-project/src/test/java/com/kingsrook/sampleapp/dashboard/widgets/PersonsByCreateDateBarChartTest.java @@ -24,7 +24,6 @@ package com.kingsrook.sampleapp.dashboard.widgets; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.model.dashboard.widgets.ChartData; -import com.kingsrook.qqq.backend.core.model.session.QSession; import com.kingsrook.sampleapp.SampleMetaDataProvider; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -44,7 +43,7 @@ class PersonsByCreateDateBarChartTest @Test void test() throws QException { - Object widgetData = new PersonsByCreateDateBarChart().render(SampleMetaDataProvider.defineInstance(), new QSession(), null); + Object widgetData = new PersonsByCreateDateBarChart().render(SampleMetaDataProvider.defineInstance()); assertThat(widgetData).isInstanceOf(ChartData.class); ChartData chartData = (ChartData) widgetData; assertEquals("barChart", chartData.getType());