Merged feature/CE-878-make-the-operations-dashboard into dev

This commit is contained in:
2024-02-29 09:20:30 -06:00
74 changed files with 4822 additions and 108 deletions

View File

@ -25,13 +25,17 @@ package com.kingsrook.qqq.backend.core.actions.permissions;
import java.util.List;
import java.util.Set;
import com.kingsrook.qqq.backend.core.BaseTest;
import com.kingsrook.qqq.backend.core.actions.dashboard.widgets.AbstractWidgetRenderer;
import com.kingsrook.qqq.backend.core.actions.processes.RunProcessTest;
import com.kingsrook.qqq.backend.core.context.QContext;
import com.kingsrook.qqq.backend.core.exceptions.QException;
import com.kingsrook.qqq.backend.core.exceptions.QPermissionDeniedException;
import com.kingsrook.qqq.backend.core.instances.QInstanceEnricher;
import com.kingsrook.qqq.backend.core.model.actions.AbstractActionInput;
import com.kingsrook.qqq.backend.core.model.actions.AbstractTableActionInput;
import com.kingsrook.qqq.backend.core.model.actions.tables.insert.InsertInput;
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.metadata.QBackendMetaData;
import com.kingsrook.qqq.backend.core.model.metadata.QInstance;
import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeReference;
@ -541,13 +545,32 @@ class PermissionsHelperTest extends BaseTest
.withView(new QReportView().withType(ReportType.TABLE).withColumn(new QReportField("id"))));
qInstance.addWidget(new QWidgetMetaData()
.withName(WIDGET_NAME));
.withName(WIDGET_NAME)
.withCodeReference(new QCodeReference(WidgetRenderer.class))
);
return (qInstance);
}
/*******************************************************************************
**
*******************************************************************************/
public static class WidgetRenderer extends AbstractWidgetRenderer
{
/*******************************************************************************
**
*******************************************************************************/
@Override
public RenderWidgetOutput render(RenderWidgetInput input) throws QException
{
return null;
}
}
/*******************************************************************************
**
*******************************************************************************/

View File

@ -25,6 +25,7 @@ package com.kingsrook.qqq.backend.core.instances;
import java.util.List;
import java.util.Set;
import com.kingsrook.qqq.backend.core.BaseTest;
import com.kingsrook.qqq.backend.core.actions.dashboard.PersonsByCreateDateBarChart;
import com.kingsrook.qqq.backend.core.actions.tables.DeleteAction;
import com.kingsrook.qqq.backend.core.actions.tables.InsertAction;
import com.kingsrook.qqq.backend.core.actions.tables.UpdateAction;
@ -37,13 +38,16 @@ import com.kingsrook.qqq.backend.core.model.helpcontent.HelpContent;
import com.kingsrook.qqq.backend.core.model.helpcontent.HelpContentMetaDataProvider;
import com.kingsrook.qqq.backend.core.model.helpcontent.HelpContentRole;
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.help.HelpRole;
import com.kingsrook.qqq.backend.core.model.metadata.help.QHelpContent;
import com.kingsrook.qqq.backend.core.model.metadata.help.QHelpRole;
import com.kingsrook.qqq.backend.core.utils.CollectionUtils;
import com.kingsrook.qqq.backend.core.utils.TestUtils;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
/*******************************************************************************
@ -183,6 +187,40 @@ class QInstanceHelpContentManagerTest extends BaseTest
/*******************************************************************************
**
*******************************************************************************/
@Test
void testWidget() throws QException
{
/////////////////////////////////////
// get the instance from base test //
/////////////////////////////////////
QInstance qInstance = QContext.getQInstance();
new HelpContentMetaDataProvider().defineAll(qInstance, TestUtils.MEMORY_BACKEND_NAME, null);
//////////////////////////////////////////////////////////
// first, assert there's no help content on the section //
//////////////////////////////////////////////////////////
QWidgetMetaDataInterface widget = qInstance.getWidget(PersonsByCreateDateBarChart.class.getSimpleName());
assertTrue(CollectionUtils.nullSafeIsEmpty(widget.getHelpContent()));
HelpContent recordEntity = new HelpContent()
.withId(1)
.withKey("widget:" + widget.getName() + ";slot:label")
.withContent("i need somebody")
.withRole(HelpContentRole.ALL_SCREENS.getId());
new InsertAction().execute(new InsertInput(HelpContent.TABLE_NAME).withRecordEntity(recordEntity));
///////////////////////////////////////////////////////////////////////////////////////////////
// now - post-insert customizer should have automatically added help content to the instance //
///////////////////////////////////////////////////////////////////////////////////////////////
assertTrue(widget.getHelpContent().containsKey("label"));
assertEquals("i need somebody", widget.getHelpContent().get("label").getContent());
}
/*******************************************************************************
**
*******************************************************************************/

View File

@ -31,6 +31,9 @@ import java.util.function.Function;
import com.kingsrook.qqq.backend.core.BaseTest;
import com.kingsrook.qqq.backend.core.actions.customizers.AbstractPostQueryCustomizer;
import com.kingsrook.qqq.backend.core.actions.customizers.TableCustomizers;
import com.kingsrook.qqq.backend.core.actions.dashboard.PersonsByCreateDateBarChart;
import com.kingsrook.qqq.backend.core.actions.dashboard.widgets.AbstractWidgetRenderer;
import com.kingsrook.qqq.backend.core.actions.dashboard.widgets.ParentWidgetRenderer;
import com.kingsrook.qqq.backend.core.actions.processes.BackendStep;
import com.kingsrook.qqq.backend.core.context.QContext;
import com.kingsrook.qqq.backend.core.exceptions.QException;
@ -46,6 +49,7 @@ 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.code.QCodeReference;
import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeType;
import com.kingsrook.qqq.backend.core.model.metadata.dashboard.ParentWidgetMetaData;
import com.kingsrook.qqq.backend.core.model.metadata.fields.AdornmentType;
import com.kingsrook.qqq.backend.core.model.metadata.fields.FieldAdornment;
import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldMetaData;
@ -804,7 +808,7 @@ class QInstanceValidatorTest extends BaseTest
**
*******************************************************************************/
@Test
void testChildNotInAnySections()
void testAppChildNotInAnySections()
{
QTableMetaData table = new QTableMetaData().withName("test")
.withBackendName(TestUtils.DEFAULT_BACKEND_NAME)
@ -823,6 +827,19 @@ class QInstanceValidatorTest extends BaseTest
/*******************************************************************************
**
*******************************************************************************/
@Test
void testAppUnrecognizedWidgetName()
{
QAppMetaData app = new QAppMetaData().withName("test")
.withWidgets(List.of("no-such-widget"));
assertValidationFailureReasons((qInstance) -> qInstance.addApp(app), "not a recognized widget");
}
/*******************************************************************************
**
*******************************************************************************/
@ -1838,6 +1855,65 @@ class QInstanceValidatorTest extends BaseTest
/*******************************************************************************
**
*******************************************************************************/
@Test
void testWidgetNaming()
{
String name = PersonsByCreateDateBarChart.class.getSimpleName();
assertValidationFailureReasons((qInstance) -> qInstance.getWidget(name).withName(null),
"Inconsistent naming for widget");
assertValidationFailureReasons((qInstance) -> qInstance.getWidget(name).withName(""),
"Inconsistent naming for widget");
assertValidationFailureReasons((qInstance) -> qInstance.getWidget(name).withName("wrongName"),
"Inconsistent naming for widget");
}
/*******************************************************************************
**
*******************************************************************************/
@Test
void testWidgetCodeReference()
{
String name = PersonsByCreateDateBarChart.class.getSimpleName();
assertValidationFailureReasons((qInstance) -> qInstance.getWidget(name).withCodeReference(null),
"Missing codeReference for widget");
assertValidationFailureReasons((qInstance) -> qInstance.getWidget(name).withCodeReference(new QCodeReference(ArrayList.class)),
"CodeReference is not of the expected type: class " + AbstractWidgetRenderer.class.getName());
}
/*******************************************************************************
**
*******************************************************************************/
@Test
void testParentWidgets()
{
assertValidationFailureReasons((qInstance) -> qInstance.addWidget(new ParentWidgetMetaData()
.withName("parentWidget")
.withCodeReference(new QCodeReference(ParentWidgetRenderer.class))
),
"Missing child widgets");
assertValidationFailureReasons((qInstance) -> qInstance.addWidget(new ParentWidgetMetaData()
.withChildWidgetNameList(List.of("noSuchWidget"))
.withName("parentWidget")
.withCodeReference(new QCodeReference(ParentWidgetRenderer.class))
),
"Unrecognized child widget name");
}
/*******************************************************************************
**
*******************************************************************************/

View File

@ -22,7 +22,7 @@
package com.kingsrook.qqq.backend.core.model.metadata;
import java.io.IOException;
import com.kingsrook.qqq.backend.core.exceptions.QException;
import com.kingsrook.qqq.backend.core.model.metadata.producers.TestAbstractMetaDataProducer;
import com.kingsrook.qqq.backend.core.model.metadata.producers.TestDisabledMetaDataProducer;
import com.kingsrook.qqq.backend.core.model.metadata.producers.TestImplementsMetaDataProducer;
@ -44,7 +44,7 @@ class MetaDataProducerHelperTest
**
*******************************************************************************/
@Test
void test() throws IOException
void test() throws QException
{
QInstance qInstance = new QInstance();
MetaDataProducerHelper.processAllMetaDataProducersInPackage(qInstance, "com.kingsrook.qqq.backend.core.model.metadata.producers");