From 6813617a215a9056d56a9ba58c87b626c5a79081 Mon Sep 17 00:00:00 2001 From: Tim Chamberlain Date: Tue, 29 Nov 2022 14:34:59 -0600 Subject: [PATCH] SPRINT-16: added new widget types, moved some things to a different package, etc. --- .../dashboard/AbstractHTMLWidgetRenderer.java | 1 + .../actions/dashboard/RenderWidgetAction.java | 1 + .../{ => widgets}/AbstractWidgetRenderer.java | 7 +- .../widgets/ChildRecordListRenderer.java | 1 - .../widgets/ParentWidgetRenderer.java | 113 ++++++++++ .../widgets/ProcessWidgetRenderer.java | 68 ++++++ .../QuickSightChartRenderer.java | 2 +- .../dashboard/widgets/ParentWidgetData.java | 203 ++++++++++++++++++ .../dashboard/widgets/ProcessWidgetData.java | 81 +++++++ .../model/dashboard/widgets/WidgetType.java | 7 +- .../dashboard/ParentWidgetMetaData.java | 175 +++++++++++++++ .../processes/QFrontendStepMetaData.java | 59 ++++- .../PersonsByCreateDateBarChart.java | 1 + .../QuickSightChartRendererTest.java | 1 + .../javalin/PersonsByCreateDateBarChart.java | 2 +- .../sampleapp/SampleMetaDataProvider.java | 2 +- .../widgets/PersonsByCreateDateBarChart.java | 2 +- 17 files changed, 708 insertions(+), 18 deletions(-) rename qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/{ => widgets}/AbstractWidgetRenderer.java (81%) create mode 100644 qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/ParentWidgetRenderer.java create mode 100644 qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/ProcessWidgetRenderer.java rename qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/{ => widgets}/QuickSightChartRenderer.java (98%) create mode 100644 qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/ParentWidgetData.java create mode 100644 qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/ProcessWidgetData.java create mode 100644 qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/dashboard/ParentWidgetMetaData.java diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/AbstractHTMLWidgetRenderer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/AbstractHTMLWidgetRenderer.java index 3462bf89..a80c095d 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/AbstractHTMLWidgetRenderer.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/AbstractHTMLWidgetRenderer.java @@ -25,6 +25,7 @@ package com.kingsrook.qqq.backend.core.actions.dashboard; import java.io.Serializable; import java.net.URLEncoder; import java.nio.charset.Charset; +import com.kingsrook.qqq.backend.core.actions.dashboard.widgets.AbstractWidgetRenderer; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.model.actions.AbstractActionInput; import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter; diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/RenderWidgetAction.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/RenderWidgetAction.java index 24f81162..a98416a0 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/RenderWidgetAction.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/RenderWidgetAction.java @@ -26,6 +26,7 @@ import java.io.Serializable; import java.util.Map; import com.kingsrook.qqq.backend.core.actions.ActionHelper; import com.kingsrook.qqq.backend.core.actions.customizers.QCodeLoader; +import com.kingsrook.qqq.backend.core.actions.dashboard.widgets.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.actions.widgets.RenderWidgetOutput; 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/widgets/AbstractWidgetRenderer.java similarity index 81% rename from qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/AbstractWidgetRenderer.java rename to qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/AbstractWidgetRenderer.java index 793c2e9a..628f7acb 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/widgets/AbstractWidgetRenderer.java @@ -19,7 +19,7 @@ * along with this program. If not, see . */ -package com.kingsrook.qqq.backend.core.actions.dashboard; +package com.kingsrook.qqq.backend.core.actions.dashboard.widgets; import java.time.ZoneId; @@ -36,9 +36,8 @@ import com.kingsrook.qqq.backend.core.model.actions.widgets.RenderWidgetOutput; *******************************************************************************/ public abstract class AbstractWidgetRenderer { - 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 static final QValueFormatter valueFormatter = new QValueFormatter(); + public static final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd").withZone(ZoneId.systemDefault()); diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/ChildRecordListRenderer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/ChildRecordListRenderer.java index 6119ddd8..a5507f42 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/ChildRecordListRenderer.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/ChildRecordListRenderer.java @@ -25,7 +25,6 @@ package com.kingsrook.qqq.backend.core.actions.dashboard.widgets; import java.net.URLEncoder; import java.nio.charset.Charset; import java.util.List; -import com.kingsrook.qqq.backend.core.actions.dashboard.AbstractWidgetRenderer; import com.kingsrook.qqq.backend.core.actions.tables.GetAction; import com.kingsrook.qqq.backend.core.actions.tables.QueryAction; import com.kingsrook.qqq.backend.core.exceptions.QException; diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/ParentWidgetRenderer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/ParentWidgetRenderer.java new file mode 100644 index 00000000..65e1805f --- /dev/null +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/ParentWidgetRenderer.java @@ -0,0 +1,113 @@ +/* + * 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.actions.dashboard.widgets; + + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import com.kingsrook.qqq.backend.core.actions.ActionHelper; +import com.kingsrook.qqq.backend.core.actions.values.SearchPossibleValueSourceAction; +import com.kingsrook.qqq.backend.core.exceptions.QException; +import com.kingsrook.qqq.backend.core.model.actions.values.SearchPossibleValueSourceInput; +import com.kingsrook.qqq.backend.core.model.actions.values.SearchPossibleValueSourceOutput; +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.ParentWidgetData; +import com.kingsrook.qqq.backend.core.model.metadata.dashboard.ParentWidgetMetaData; +import com.kingsrook.qqq.backend.core.model.metadata.possiblevalues.QPossibleValue; +import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData; +import com.kingsrook.qqq.backend.core.utils.CollectionUtils; + + +/******************************************************************************* + ** Generic widget for display a parent widget with children of possible values, + ** child widgets, and child actions + *******************************************************************************/ +public class ParentWidgetRenderer extends AbstractWidgetRenderer +{ + + /******************************************************************************* + ** + *******************************************************************************/ + @Override + public RenderWidgetOutput render(RenderWidgetInput input) throws QException + { + ActionHelper.validateSession(input); + + try + { + ParentWidgetMetaData metaData = (ParentWidgetMetaData) input.getWidgetMetaData(); + ParentWidgetData widgetData = new ParentWidgetData(); + + ///////////////////////////////////////////////////////////// + // handle any PVSs creating dropdown data for the frontend // + ///////////////////////////////////////////////////////////// + List>> pvsData = new ArrayList<>(); + List pvsLabels = new ArrayList<>(); + List pvsNames = new ArrayList<>(); + for(String possibleValueSourceName : CollectionUtils.nonNullList(metaData.getPossibleValueNameList())) + { + QTableMetaData tableMetaData = input.getInstance().getTable(input.getInstance().getPossibleValueSource(possibleValueSourceName).getTableName()); + pvsLabels.add(tableMetaData.getLabel()); + pvsNames.add(tableMetaData.getName()); + + SearchPossibleValueSourceInput pvsInput = new SearchPossibleValueSourceInput(input.getInstance()); + pvsInput.setSession(input.getSession()); + pvsInput.setPossibleValueSourceName(possibleValueSourceName); + SearchPossibleValueSourceOutput output = new SearchPossibleValueSourceAction().execute(pvsInput); + + List> dropdownOptionList = new ArrayList<>(); + pvsData.add(dropdownOptionList); + + ////////////////////////////////////////// + // sort results, dedupe, and add to map // + ////////////////////////////////////////// + Set exists = new HashSet<>(); + output.getResults().removeIf(pvs -> !exists.add(pvs.getLabel())); + output.getResults().sort(Comparator.comparing(QPossibleValue::getLabel)); + for(QPossibleValue possibleValue : output.getResults()) + { + dropdownOptionList.add(Map.of( + "id", String.valueOf(possibleValue.getId()), + "label", possibleValue.getLabel() + )); + } + } + + widgetData.setDropdownNameList(pvsNames); + widgetData.setDropdownLabelList(pvsLabels); + widgetData.setDropdownDataList(pvsData); + widgetData.setChildWidgetNameList(metaData.getChildWidgetNameList()); + + return (new RenderWidgetOutput(widgetData)); + } + catch(Exception e) + { + throw (new QException("Error rendering parent widget", e)); + } + } + +} diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/ProcessWidgetRenderer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/ProcessWidgetRenderer.java new file mode 100644 index 00000000..9fb260e5 --- /dev/null +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/ProcessWidgetRenderer.java @@ -0,0 +1,68 @@ +/* + * 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.actions.dashboard.widgets; + + +import com.kingsrook.qqq.backend.core.actions.ActionHelper; +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.ProcessWidgetData; +import com.kingsrook.qqq.backend.core.model.metadata.dashboard.QWidgetMetaData; +import com.kingsrook.qqq.backend.core.model.metadata.processes.QProcessMetaData; + + +/******************************************************************************* + ** Generic widget for displaying a process as a widget + *******************************************************************************/ +public class ProcessWidgetRenderer extends AbstractWidgetRenderer +{ + public static final String WIDGET_PROCESS_NAME = "processName"; + + + + /******************************************************************************* + ** + *******************************************************************************/ + @Override + public RenderWidgetOutput render(RenderWidgetInput input) throws QException + { + ActionHelper.validateSession(input); + + try + { + ProcessWidgetData data = new ProcessWidgetData(); + if(input.getWidgetMetaData() instanceof QWidgetMetaData widgetMetaData) + { + String processName = (String) widgetMetaData.getDefaultValues().get(WIDGET_PROCESS_NAME); + QProcessMetaData processMetaData = input.getInstance().getProcess(processName); + data.setProcessMetaData(processMetaData); + } + return (new RenderWidgetOutput(data)); + } + catch(Exception e) + { + throw (new QException("Error rendering process widget", e)); + } + } + +} 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/widgets/QuickSightChartRenderer.java similarity index 98% rename from qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/QuickSightChartRenderer.java rename to qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/QuickSightChartRenderer.java index 1260ec09..474b603f 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/widgets/QuickSightChartRenderer.java @@ -19,7 +19,7 @@ * along with this program. If not, see . */ -package com.kingsrook.qqq.backend.core.actions.dashboard; +package com.kingsrook.qqq.backend.core.actions.dashboard.widgets; import com.kingsrook.qqq.backend.core.actions.ActionHelper; diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/ParentWidgetData.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/ParentWidgetData.java new file mode 100644 index 00000000..87dd5399 --- /dev/null +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/ParentWidgetData.java @@ -0,0 +1,203 @@ +/* + * 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.dashboard.widgets; + + +import java.util.List; +import java.util.Map; + + +/******************************************************************************* + ** Model containing datastructure expected by frontend stepper widget + ** + *******************************************************************************/ +public class ParentWidgetData implements QWidget +{ + private List dropdownNameList; + private List dropdownLabelList; + + ///////////////////////////////////////////////////////////////////////////////////////// + // this is a list of lists, the outer list corresponds to each dropdown (parallel list // + // with the above dropdownLabelList) - the inner list is the list of actual dropdown // + // options // + ///////////////////////////////////////////////////////////////////////////////////////// + private List>> dropdownDataList; + + private List childWidgetNameList; + + + + /******************************************************************************* + ** + *******************************************************************************/ + public ParentWidgetData() + { + } + + + + /******************************************************************************* + ** Getter for type + ** + *******************************************************************************/ + public String getType() + { + return WidgetType.PARENT_WIDGET.getType(); + } + + + + /******************************************************************************* + ** Getter for dropdownLabelList + ** + *******************************************************************************/ + public List getDropdownLabelList() + { + return dropdownLabelList; + } + + + + /******************************************************************************* + ** Setter for dropdownLabelList + ** + *******************************************************************************/ + public void setDropdownLabelList(List dropdownLabelList) + { + this.dropdownLabelList = dropdownLabelList; + } + + + + /******************************************************************************* + ** Fluent setter for dropdownLabelList + ** + *******************************************************************************/ + public ParentWidgetData withDropdownLabelList(List dropdownLabelList) + { + this.dropdownLabelList = dropdownLabelList; + return (this); + } + + + + /******************************************************************************* + ** Getter for dropdownNameList + ** + *******************************************************************************/ + public List getDropdownNameList() + { + return dropdownNameList; + } + + + + /******************************************************************************* + ** Setter for dropdownNameList + ** + *******************************************************************************/ + public void setDropdownNameList(List dropdownNameList) + { + this.dropdownNameList = dropdownNameList; + } + + + + /******************************************************************************* + ** Fluent setter for dropdownNameList + ** + *******************************************************************************/ + public ParentWidgetData withDropdownNameList(List dropdownNameList) + { + this.dropdownNameList = dropdownNameList; + return (this); + } + + + + /******************************************************************************* + ** Getter for dropdownDataList + ** + *******************************************************************************/ + public List>> getDropdownDataList() + { + return dropdownDataList; + } + + + + /******************************************************************************* + ** Setter for dropdownDataList + ** + *******************************************************************************/ + public void setDropdownDataList(List>> dropdownDataList) + { + this.dropdownDataList = dropdownDataList; + } + + + + /******************************************************************************* + ** Fluent setter for dropdownDataList + ** + *******************************************************************************/ + public ParentWidgetData withDropdownDataList(List>> dropdownDataList) + { + this.dropdownDataList = dropdownDataList; + return (this); + } + + + + /******************************************************************************* + ** Getter for childWidgetNameList + ** + *******************************************************************************/ + public List getChildWidgetNameList() + { + return childWidgetNameList; + } + + + + /******************************************************************************* + ** Setter for childWidgetNameList + ** + *******************************************************************************/ + public void setChildWidgetNameList(List childWidgetNameList) + { + this.childWidgetNameList = childWidgetNameList; + } + + + + /******************************************************************************* + ** Fluent setter for childWidgetNameList + ** + *******************************************************************************/ + public ParentWidgetData withChildWidgetNameList(List childWidgetNameList) + { + this.childWidgetNameList = childWidgetNameList; + return (this); + } + +} diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/ProcessWidgetData.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/ProcessWidgetData.java new file mode 100644 index 00000000..bac2ef26 --- /dev/null +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/ProcessWidgetData.java @@ -0,0 +1,81 @@ +/* + * 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.dashboard.widgets; + + +import com.kingsrook.qqq.backend.core.model.metadata.processes.QProcessMetaData; + + +/******************************************************************************* + ** Model containing datastructure expected by frontend stepper widget + ** + *******************************************************************************/ +public class ProcessWidgetData implements QWidget +{ + private QProcessMetaData processMetaData; + + + + /******************************************************************************* + ** Getter for processMetaData + ** + *******************************************************************************/ + public QProcessMetaData getProcessMetaData() + { + return processMetaData; + } + + + + /******************************************************************************* + ** Getter for type + ** + *******************************************************************************/ + public String getType() + { + return WidgetType.PROCESS.getType(); + } + + + + /******************************************************************************* + ** Setter for processMetaData + ** + *******************************************************************************/ + public void setProcessMetaData(QProcessMetaData processMetaData) + { + this.processMetaData = processMetaData; + } + + + + /******************************************************************************* + ** Fluent setter for processMetaData + ** + *******************************************************************************/ + public ProcessWidgetData withProcessMetaData(QProcessMetaData processMetaData) + { + this.processMetaData = processMetaData; + return (this); + } + +} diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/WidgetType.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/WidgetType.java index 843441f8..f39cb05d 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/WidgetType.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/WidgetType.java @@ -28,15 +28,18 @@ package com.kingsrook.qqq.backend.core.model.dashboard.widgets; public enum WidgetType { CHART("chart"), + CHILD_RECORD_LIST("childRecordList"), + GENERIC("generic"), HTML("html"), LINE_CHART("lineChart"), LOCATION("location"), MULTI_STATISTICS("multiStatistics"), + PARENT_WIDGET("parentWidget"), + PROCESS("process"), QUICK_SIGHT_CHART("quickSightChart"), STATISTICS("statistics"), STEPPER("stepper"), - TABLE("table"), - CHILD_RECORD_LIST("childRecordList"); + TABLE("table"); private final String type; diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/dashboard/ParentWidgetMetaData.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/dashboard/ParentWidgetMetaData.java new file mode 100644 index 00000000..afca25c4 --- /dev/null +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/dashboard/ParentWidgetMetaData.java @@ -0,0 +1,175 @@ +/* + * 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.metadata.dashboard; + + +import java.util.List; + + +/******************************************************************************* + ** Specific meta data for frontend parent widget + ** + *******************************************************************************/ +public class ParentWidgetMetaData extends QWidgetMetaData implements QWidgetMetaDataInterface +{ + private String title; + private List possibleValueNameList; + private List childWidgetNameList; + private List childProcessNameList; + + + + /******************************************************************************* + ** Getter for title + ** + *******************************************************************************/ + public String getTitle() + { + return title; + } + + + + /******************************************************************************* + ** Setter for title + ** + *******************************************************************************/ + public void setTitle(String title) + { + this.title = title; + } + + + + /******************************************************************************* + ** Fluent setter for title + ** + *******************************************************************************/ + public ParentWidgetMetaData withTitle(String title) + { + this.title = title; + return (this); + } + + + + /******************************************************************************* + ** Getter for possibleValueNameList + ** + *******************************************************************************/ + public List getPossibleValueNameList() + { + return possibleValueNameList; + } + + + + /******************************************************************************* + ** Setter for possibleValueNameList + ** + *******************************************************************************/ + public void setPossibleValueNameList(List possibleValueNameList) + { + this.possibleValueNameList = possibleValueNameList; + } + + + + /******************************************************************************* + ** Fluent setter for possibleValueNameList + ** + *******************************************************************************/ + public ParentWidgetMetaData withPossibleValueNameList(List possibleValueNameList) + { + this.possibleValueNameList = possibleValueNameList; + return (this); + } + + + + /******************************************************************************* + ** Getter for childWidgetNameList + ** + *******************************************************************************/ + public List getChildWidgetNameList() + { + return childWidgetNameList; + } + + + + /******************************************************************************* + ** Setter for childWidgetNameList + ** + *******************************************************************************/ + public void setChildWidgetNameList(List childWidgetNameList) + { + this.childWidgetNameList = childWidgetNameList; + } + + + + /******************************************************************************* + ** Fluent setter for childWidgetNameList + ** + *******************************************************************************/ + public ParentWidgetMetaData withChildWidgetNameList(List childWidgetNameList) + { + this.childWidgetNameList = childWidgetNameList; + return (this); + } + + + + /******************************************************************************* + ** Getter for childProcessNameList + ** + *******************************************************************************/ + public List getChildProcessNameList() + { + return childProcessNameList; + } + + + + /******************************************************************************* + ** Setter for childProcessNameList + ** + *******************************************************************************/ + public void setChildProcessNameList(List childProcessNameList) + { + this.childProcessNameList = childProcessNameList; + } + + + + /******************************************************************************* + ** Fluent setter for childProcessNameList + ** + *******************************************************************************/ + public ParentWidgetMetaData withChildProcessNameList(List childProcessNameList) + { + this.childProcessNameList = childProcessNameList; + return (this); + } + +} diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/processes/QFrontendStepMetaData.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/processes/QFrontendStepMetaData.java index 55a9424d..42635626 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/processes/QFrontendStepMetaData.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/processes/QFrontendStepMetaData.java @@ -23,7 +23,9 @@ package com.kingsrook.qqq.backend.core.model.metadata.processes; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldMetaData; @@ -38,6 +40,7 @@ public class QFrontendStepMetaData extends QStepMetaData private List formFields; private List viewFields; private List recordListFields; + private Map formFieldMap; @@ -101,6 +104,22 @@ public class QFrontendStepMetaData extends QStepMetaData + /******************************************************************************* + ** Getter for a single formFields by its name + ** + *******************************************************************************/ + public QFieldMetaData getFormField(String fieldName) + { + if(formFieldMap != null && formFieldMap.containsKey(fieldName)) + { + return (formFieldMap.get(fieldName)); + } + + return (null); + } + + + /******************************************************************************* ** Getter for formFields ** @@ -112,13 +131,43 @@ public class QFrontendStepMetaData extends QStepMetaData + /******************************************************************************* + ** adder for formFields + ** + *******************************************************************************/ + public void addFormField(QFieldMetaData fieldMetaData) + { + if(fieldMetaData != null) + { + if(formFieldMap == null) + { + formFieldMap = new HashMap<>(); + } + if(formFields == null) + { + formFields = new ArrayList<>(); + } + + formFieldMap.put(fieldMetaData.getName(), fieldMetaData); + formFields.add(fieldMetaData); + } + } + + + /******************************************************************************* ** Setter for formFields ** *******************************************************************************/ public void setFormFields(List formFields) { - this.formFields = formFields; + if(formFields != null) + { + for(QFieldMetaData fieldMetaData : formFields) + { + addFormField(fieldMetaData); + } + } } @@ -129,11 +178,7 @@ public class QFrontendStepMetaData extends QStepMetaData *******************************************************************************/ public QFrontendStepMetaData withFormField(QFieldMetaData formField) { - if(this.formFields == null) - { - this.formFields = new ArrayList<>(); - } - this.formFields.add(formField); + addFormField(formField); return (this); } @@ -145,7 +190,7 @@ public class QFrontendStepMetaData extends QStepMetaData *******************************************************************************/ public QFrontendStepMetaData withFormFields(List formFields) { - this.formFields = formFields; + this.setFormFields(formFields); 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 373f98d9..52a6ae45 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 @@ -24,6 +24,7 @@ package com.kingsrook.qqq.backend.core.actions.dashboard; import java.util.ArrayList; import java.util.List; +import com.kingsrook.qqq.backend.core.actions.dashboard.widgets.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.actions.widgets.RenderWidgetOutput; 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 0a46d237..a9ddefc3 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 @@ -23,6 +23,7 @@ package com.kingsrook.qqq.backend.core.actions.dashboard; import java.net.UnknownHostException; +import com.kingsrook.qqq.backend.core.actions.dashboard.widgets.QuickSightChartRenderer; 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.metadata.dashboard.QWidgetMetaData; 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 7b50f790..f591bf0d 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 @@ -24,7 +24,7 @@ package com.kingsrook.qqq.backend.javalin; import java.util.ArrayList; import java.util.List; -import com.kingsrook.qqq.backend.core.actions.dashboard.AbstractWidgetRenderer; +import com.kingsrook.qqq.backend.core.actions.dashboard.widgets.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.actions.widgets.RenderWidgetOutput; diff --git a/qqq-sample-project/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java b/qqq-sample-project/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java index 028262f8..1436b819 100644 --- a/qqq-sample-project/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java +++ b/qqq-sample-project/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java @@ -27,7 +27,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import com.amazonaws.regions.Regions; -import com.kingsrook.qqq.backend.core.actions.dashboard.QuickSightChartRenderer; +import com.kingsrook.qqq.backend.core.actions.dashboard.widgets.QuickSightChartRenderer; import com.kingsrook.qqq.backend.core.actions.processes.BackendStep; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.exceptions.QValueException; 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 e2d76896..426e01e1 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 @@ -24,7 +24,7 @@ package com.kingsrook.sampleapp.dashboard.widgets; import java.util.ArrayList; import java.util.List; -import com.kingsrook.qqq.backend.core.actions.dashboard.AbstractWidgetRenderer; +import com.kingsrook.qqq.backend.core.actions.dashboard.widgets.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.actions.widgets.RenderWidgetOutput;