From 9f4cb027640086b435ae0b13ecfa38b64e07d03a Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Mon, 29 Apr 2024 12:12:55 -0500 Subject: [PATCH] CE-1068 - Add scheduling --- .../SavedReportsMetaDataProvider.java | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/savedreports/SavedReportsMetaDataProvider.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/savedreports/SavedReportsMetaDataProvider.java index b82e648f..594d6792 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/savedreports/SavedReportsMetaDataProvider.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/savedreports/SavedReportsMetaDataProvider.java @@ -25,6 +25,7 @@ package com.kingsrook.qqq.backend.core.model.savedreports; import java.util.List; import java.util.function.Consumer; import com.kingsrook.qqq.backend.core.actions.customizers.TableCustomizers; +import com.kingsrook.qqq.backend.core.actions.dashboard.widgets.ChildRecordListRenderer; import com.kingsrook.qqq.backend.core.actions.dashboard.widgets.DefaultWidgetRenderer; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.model.actions.reporting.ReportFormatPossibleValueEnum; @@ -39,6 +40,9 @@ 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; import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldType; +import com.kingsrook.qqq.backend.core.model.metadata.joins.JoinOn; +import com.kingsrook.qqq.backend.core.model.metadata.joins.JoinType; +import com.kingsrook.qqq.backend.core.model.metadata.joins.QJoinMetaData; import com.kingsrook.qqq.backend.core.model.metadata.layout.QIcon; import com.kingsrook.qqq.backend.core.model.metadata.possiblevalues.QPossibleValueSource; import com.kingsrook.qqq.backend.core.model.metadata.processes.QProcessMetaData; @@ -56,6 +60,8 @@ public class SavedReportsMetaDataProvider { public static final String REPORT_STORAGE_TABLE_NAME = "reportStorage"; + public static final String SAVED_REPORT_JOIN_SCHEDULED_REPORT = "scheduledReportJoinSavedReport"; + /******************************************************************************* @@ -65,6 +71,7 @@ public class SavedReportsMetaDataProvider { instance.addTable(defineSavedReportTable(recordTablesBackendName, backendDetailEnricher)); instance.addTable(defineRenderedReportTable(recordTablesBackendName, backendDetailEnricher)); + instance.addPossibleValueSource(QPossibleValueSource.newForTable(SavedReport.TABLE_NAME)); instance.addPossibleValueSource(QPossibleValueSource.newForEnum(ReportFormatPossibleValueEnum.NAME, ReportFormatPossibleValueEnum.values())); instance.addPossibleValueSource(QPossibleValueSource.newForEnum(RenderedReportStatus.NAME, RenderedReportStatus.values())); @@ -80,6 +87,44 @@ public class SavedReportsMetaDataProvider instance.addWidget(defineReportSetupWidget()); instance.addWidget(definePivotTableSetupWidget()); + + //////////////////////////////////////// + // todo - param to enable scheduling? // + //////////////////////////////////////// + instance.addTable(defineScheduledReportTable(recordTablesBackendName, backendDetailEnricher)); + QJoinMetaData join = defineSavedReportJoinScheduledReport(); + instance.addJoin(join); + instance.addWidget(defineScheduledReportJoinSavedReportWidget(join)); + QProcessMetaData scheduledReportSyncToScheduledJobProcess = new ScheduledReportSyncToScheduledJobProcess().produce(instance); + instance.addProcess(scheduledReportSyncToScheduledJobProcess); + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + private QJoinMetaData defineSavedReportJoinScheduledReport() + { + return (new QJoinMetaData() + .withName(SAVED_REPORT_JOIN_SCHEDULED_REPORT) + .withLeftTable(SavedReport.TABLE_NAME) + .withRightTable(ScheduledReport.TABLE_NAME) + .withType(JoinType.ONE_TO_MANY) + .withJoinOn(new JoinOn("id", "savedReportId"))); + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + private QWidgetMetaDataInterface defineScheduledReportJoinSavedReportWidget(QJoinMetaData join) + { + return ChildRecordListRenderer.widgetMetaDataBuilder(join) + .withLabel("Schedules") + .withCanAddChildRecord(true) + .getWidgetMetaData(); } @@ -154,6 +199,7 @@ public class SavedReportsMetaDataProvider .withSection(new QFieldSection("identity", new QIcon().withName("badge"), Tier.T1, List.of("id", "label", "tableName"))) .withSection(new QFieldSection("filtersAndColumns", new QIcon().withName("table_chart"), Tier.T2).withLabel("Filters and Columns").withWidgetName("reportSetupWidget")) .withSection(new QFieldSection("pivotTable", new QIcon().withName("pivot_table_chart"), Tier.T2).withLabel("Pivot Table").withWidgetName("pivotTableSetupWidget")) + .withSection(new QFieldSection("schedule", new QIcon().withName("schedule"), Tier.T2).withWidgetName(SAVED_REPORT_JOIN_SCHEDULED_REPORT)) .withSection(new QFieldSection("data", new QIcon().withName("text_snippet"), Tier.T2, List.of("queryFilterJson", "columnsJson", "pivotTableJson")).withIsHidden(true)) .withSection(new QFieldSection("hidden", new QIcon().withName("text_snippet"), Tier.T2, List.of("inputFieldsJson", "userId")).withIsHidden(true)) .withSection(new QFieldSection("dates", new QIcon().withName("calendar_month"), Tier.T3, List.of("createDate", "modifyDate"))); @@ -207,4 +253,39 @@ public class SavedReportsMetaDataProvider return (table); } + + + /******************************************************************************* + ** + *******************************************************************************/ + private QTableMetaData defineScheduledReportTable(String backendName, Consumer backendDetailEnricher) throws QException + { + QTableMetaData table = new QTableMetaData() + .withName(ScheduledReport.TABLE_NAME) + .withIcon(new QIcon().withName("schedule_send")) + .withRecordLabelFormat("%s (Schedule %s)") + .withRecordLabelFields("savedReportId", "id") + .withBackendName(backendName) + .withPrimaryKeyField("id") + .withFieldsFromEntity(ScheduledReport.class) + .withSection(new QFieldSection("identity", new QIcon().withName("badge"), Tier.T1, List.of("id", "savedReportId"))) + .withSection(new QFieldSection("settings", new QIcon().withName("settings"), Tier.T2, List.of("cronExpression", "cronTimeZoneId", "isActive", "format"))) + .withSection(new QFieldSection("recipient", new QIcon().withName("email"), Tier.T2, List.of("toAddresses", "subject"))) + .withSection(new QFieldSection("variableValues", new QIcon().withName("data_object"), Tier.T2, List.of("inputValues"))) + .withSection(new QFieldSection("dates", new QIcon().withName("calendar_month"), Tier.T3, List.of("createDate", "modifyDate"))); + + if(backendDetailEnricher != null) + { + backendDetailEnricher.accept(table); + } + + table.withCustomizer(TableCustomizers.PRE_INSERT_RECORD, new QCodeReference(ScheduledReportTableCustomizer.class)); + table.withCustomizer(TableCustomizers.PRE_UPDATE_RECORD, new QCodeReference(ScheduledReportTableCustomizer.class)); + table.withCustomizer(TableCustomizers.POST_INSERT_RECORD, new QCodeReference(ScheduledReportTableCustomizer.class)); + table.withCustomizer(TableCustomizers.POST_UPDATE_RECORD, new QCodeReference(ScheduledReportTableCustomizer.class)); + table.withCustomizer(TableCustomizers.POST_DELETE_RECORD, new QCodeReference(ScheduledReportTableCustomizer.class)); + + return (table); + } + }