QQQ-38 Initial build of app home page widgets

This commit is contained in:
2022-08-22 10:38:02 -05:00
parent 99f724e2c2
commit 937304e7f1
21 changed files with 939 additions and 13 deletions

View File

@ -36,6 +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.metadata.MetaDataAction;
import com.kingsrook.qqq.backend.core.actions.metadata.ProcessMetaDataAction;
import com.kingsrook.qqq.backend.core.actions.metadata.TableMetaDataAction;
@ -278,6 +279,8 @@ public class QJavalinImplementation
});
});
get("/widget/{name}", QJavalinImplementation::widget);
////////////////////
// process routes //
////////////////////
@ -662,6 +665,27 @@ public class QJavalinImplementation
/*******************************************************************************
** Load the data for a widget of a given name.
*******************************************************************************/
private static void widget(Context context)
{
try
{
InsertInput insertInput = new InsertInput(qInstance);
setupSession(context, insertInput);
Object widgetData = new WidgetDataLoader().execute(qInstance, insertInput.getSession(), context.pathParam("name"));
context.result(JsonUtils.toJson(widgetData));
}
catch(Exception e)
{
handleException(context, e);
}
}
/*******************************************************************************
**
*******************************************************************************/

View File

@ -0,0 +1,56 @@
package com.kingsrook.qqq.backend.javalin;
import java.sql.Connection;
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.dashboard.widgets.BarChart;
import com.kingsrook.qqq.backend.core.model.metadata.QInstance;
import com.kingsrook.qqq.backend.core.model.session.QSession;
import com.kingsrook.qqq.backend.module.rdbms.jdbc.ConnectionManager;
/*******************************************************************************
** Sample bar chart widget
*******************************************************************************/
public class PersonsByCreateDateBarChart extends AbstractWidgetRenderer
{
/*******************************************************************************
**
*******************************************************************************/
@Override
public Object render(QInstance qInstance, QSession session) throws QException
{
try
{
ConnectionManager connectionManager = new ConnectionManager();
Connection connection = connectionManager.getConnection(TestUtils.defineBackend());
List<String> labels = new ArrayList<>();
List<Number> data = new ArrayList<>();
labels.add("Jan. 2022");
data.add(17);
labels.add("Feb. 2022");
data.add(42);
labels.add("Mar. 2022");
data.add(47);
labels.add("Apr. 2022");
data.add(0);
labels.add("May 2022");
data.add(64);
return (new BarChart("Persons created per Month", "Person records", labels, data));
}
catch(Exception e)
{
throw (new QException("Error rendering widget", e));
}
}
}

View File

@ -470,4 +470,21 @@ class QJavalinImplementationTest extends QJavalinTestBase
assertThat(response.getBody()).contains("Unsupported report format");
}
/*******************************************************************************
**
*******************************************************************************/
@Test
void testWidget()
{
HttpResponse<String> response = Unirest.get(BASE_URL + "/widget/" + PersonsByCreateDateBarChart.class.getSimpleName()).asString();
assertEquals(200, response.getStatus());
JSONObject jsonObject = JsonUtils.toJSONObject(response.getBody());
assertNotNull(jsonObject);
assertEquals("barChart", jsonObject.getString("type"));
assertNotNull(jsonObject.getString("title"));
assertNotNull(jsonObject.getJSONObject("barChartData"));
}
}

View File

@ -29,6 +29,7 @@ import com.kingsrook.qqq.backend.core.exceptions.QException;
import com.kingsrook.qqq.backend.core.exceptions.QValueException;
import com.kingsrook.qqq.backend.core.actions.processes.BackendStep;
import com.kingsrook.qqq.backend.core.model.metadata.QAuthenticationType;
import com.kingsrook.qqq.backend.core.model.metadata.dashboard.QWidgetMetaData;
import com.kingsrook.qqq.backend.core.processes.implementations.mock.MockBackendStep;
import com.kingsrook.qqq.backend.core.model.actions.processes.RunBackendStepInput;
import com.kingsrook.qqq.backend.core.model.actions.processes.RunBackendStepOutput;
@ -122,11 +123,24 @@ public class TestUtils
qInstance.addProcess(defineProcessSimpleSleep());
qInstance.addProcess(defineProcessScreenThenSleep());
qInstance.addProcess(defineProcessSimpleThrow());
defineWidgets(qInstance);
return (qInstance);
}
/*******************************************************************************
**
*******************************************************************************/
private static void defineWidgets(QInstance qInstance)
{
qInstance.addWidget(new QWidgetMetaData()
.withName(PersonsByCreateDateBarChart.class.getSimpleName())
.withCodeReference(new QCodeReference(PersonsByCreateDateBarChart.class, null)));
}
/*******************************************************************************
** Define the authentication used in standard tests - using 'mock' type.
**