From 8c767635de34532d4407c6b8b47fc43d1d907779 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Tue, 7 Mar 2023 15:51:11 -0600 Subject: [PATCH] Adding generic run records process --- src/App.tsx | 19 ++++ src/qqq/pages/processes/ProcessRun.tsx | 26 +++++- src/qqq/pages/records/query/RecordQuery.tsx | 97 +++++++++++++-------- 3 files changed, 100 insertions(+), 42 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 0aa51ff..866925d 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -332,6 +332,25 @@ export default function App() }); }); + const runRecordScriptProcess = metaData.processes.get("runRecordScript") + if(runRecordScriptProcess) + { + const process = runRecordScriptProcess; + routeList.push({ + name: process.label, + key: process.name, + route: `${path}/${process.name}`, + component: , + }); + + routeList.push({ + name: process.label, + key: `${app.name}/${process.name}`, + route: `${path}/:id/${process.name}`, + component: , + }); + } + const reportsForTable = ProcessUtils.getReportsForTable(metaData, table.name, true); reportsForTable.forEach((report) => { diff --git a/src/qqq/pages/processes/ProcessRun.tsx b/src/qqq/pages/processes/ProcessRun.tsx index 506784d..c68e131 100644 --- a/src/qqq/pages/processes/ProcessRun.tsx +++ b/src/qqq/pages/processes/ProcessRun.tsx @@ -27,6 +27,7 @@ import {QFrontendComponent} from "@kingsrook/qqq-frontend-core/lib/model/metaDat import {QFrontendStepMetaData} from "@kingsrook/qqq-frontend-core/lib/model/metaData/QFrontendStepMetaData"; import {QInstance} from "@kingsrook/qqq-frontend-core/lib/model/metaData/QInstance"; import {QProcessMetaData} from "@kingsrook/qqq-frontend-core/lib/model/metaData/QProcessMetaData"; +import {QTableMetaData} from "@kingsrook/qqq-frontend-core/lib/model/metaData/QTableMetaData"; import {QTableSection} from "@kingsrook/qqq-frontend-core/lib/model/metaData/QTableSection"; import {QJobComplete} from "@kingsrook/qqq-frontend-core/lib/model/processes/QJobComplete"; import {QJobError} from "@kingsrook/qqq-frontend-core/lib/model/processes/QJobError"; @@ -68,6 +69,7 @@ import ValueUtils from "qqq/utils/qqq/ValueUtils"; interface Props { process?: QProcessMetaData; + table?: QTableMetaData; defaultProcessValues?: any; isModal?: boolean; isWidget?: boolean; @@ -82,7 +84,7 @@ const INITIAL_RETRY_MILLIS = 1_500; const RETRY_MAX_MILLIS = 12_000; const BACKOFF_AMOUNT = 1.5; -function ProcessRun({process, defaultProcessValues, isModal, isWidget, isReport, recordIds, closeModalHandler, forceReInit, overrideLabel}: Props): JSX.Element +function ProcessRun({process, table, defaultProcessValues, isModal, isWidget, isReport, recordIds, closeModalHandler, forceReInit, overrideLabel}: Props): JSX.Element { const processNameParam = useParams().processName; const processName = process === null ? processNameParam : process.name; @@ -102,7 +104,7 @@ function ProcessRun({process, defaultProcessValues, isModal, isWidget, isReport, const [needInitialLoad, setNeedInitialLoad] = useState(true); const [lastForcedReInit, setLastForcedReInit] = useState(null as number); const [processMetaData, setProcessMetaData] = useState(null); - const [tableMetaData, setTableMetaData] = useState(null); + const [tableMetaData, setTableMetaData] = useState(table); const [tableSections, setTableSections] = useState(null as QTableSection[]); const [qInstance, setQInstance] = useState(null as QInstance); const [processValues, setProcessValues] = useState({} as any); @@ -728,7 +730,17 @@ function ProcessRun({process, defaultProcessValues, isModal, isWidget, isReport, const formData = DynamicFormUtils.getFormData(fullFieldList); const possibleValueDisplayValues = new Map(); - DynamicFormUtils.addPossibleValueProps(formData.dynamicFormFields, fullFieldList, tableMetaData?.name, processName, possibleValueDisplayValues); + + /////////////////////////////////////////////////////////////////////////////////////////////////////////// + // ok - so - the addPossibleValueProps method wants to take either a tableName or a processName // + // param - if it gets a tableName, then it'll point the PVS to the table - which is what we want // + // (at this time, at least) only for the BULK_EDIT process (expected to change in future...) // + // so, only pass a tableName into that method if this looks like a bulk edit (based on that component... // + // else, pass a processName and no table name. // + /////////////////////////////////////////////////////////////////////////////////////////////////////////// + const tableNameForPVProps = doesStepHaveComponent(activeStep, QComponentType.BULK_EDIT_FORM) ? tableMetaData.name : null; + const processNameForPVProps = tableNameForPVProps ? null : processName; + DynamicFormUtils.addPossibleValueProps(formData.dynamicFormFields, fullFieldList, tableNameForPVProps, processNameForPVProps, possibleValueDisplayValues); dynamicFormFields = formData.dynamicFormFields; formValidations = formData.formValidations; @@ -764,6 +776,12 @@ function ProcessRun({process, defaultProcessValues, isModal, isWidget, isReport, formValidations[fieldName] = validation; }; + if(tableMetaData) + { + console.log("Adding table name field... ?", tableMetaData.name); + addField("tableName", {type: "hidden", omitFromQDynamicForm: true}, tableMetaData.name, null); + } + if (doesStepHaveComponent(activeStep, QComponentType.VALIDATION_REVIEW_SCREEN)) { addField("doFullValidation", {type: "radio"}, "true", null); @@ -1072,7 +1090,7 @@ function ProcessRun({process, defaultProcessValues, isModal, isWidget, isReport, const processMetaData = await Client.getInstance().loadProcessMetaData(processName); setProcessMetaData(processMetaData); setSteps(processMetaData.frontendSteps); - if (processMetaData.tableName) + if (processMetaData.tableName && !tableMetaData) { try { diff --git a/src/qqq/pages/records/query/RecordQuery.tsx b/src/qqq/pages/records/query/RecordQuery.tsx index 93ae201..4e5f042 100644 --- a/src/qqq/pages/records/query/RecordQuery.tsx +++ b/src/qqq/pages/records/query/RecordQuery.tsx @@ -202,12 +202,20 @@ function RecordQuery({table, launchProcess}: Props): JSX.Element if (pathParts[pathParts.length - 2] === tableName) { const processName = pathParts[pathParts.length - 1]; - const processList = allTableProcesses.filter(p => p.name.endsWith(processName)); + const processList = allTableProcesses.filter(p => p.name == processName); if (processList.length > 0) { setActiveModalProcess(processList[0]); return; } + else if(metaData?.processes.has(processName)) + { + /////////////////////////////////////////////////////////////////////////////////////// + // check for generic processes - should this be a specific attribute on the process? // + /////////////////////////////////////////////////////////////////////////////////////// + setActiveModalProcess(metaData?.processes.get(processName)); + return; + } else { console.log(`Couldn't find process named ${processName}`); @@ -1127,6 +1135,53 @@ function RecordQuery({table, launchProcess}: Props): JSX.Element ); } + const runRecordScriptProcess = metaData?.processes.get("runRecordScript"); + + const pushDividerIfNeeded = (menuItems: JSX.Element[]) => + { + console.log("Type: " + menuItems[menuItems.length - 1]); + if(menuItems.length > 0) + { + menuItems.push(); + } + } + + const menuItems: JSX.Element[] = []; + if(table.capabilities.has(Capability.TABLE_INSERT) && table.insertPermission) + { + menuItems.push(library_addBulk Load) + } + if(table.capabilities.has(Capability.TABLE_UPDATE) && table.editPermission) + { + menuItems.push(editBulk Edit) + } + if(table.capabilities.has(Capability.TABLE_DELETE) && table.deletePermission) + { + menuItems.push(deleteBulk Delete) + } + + const runRecordScriptProcess = metaData?.processes.get("runRecordScript"); + if(runRecordScriptProcess) + { + const process = runRecordScriptProcess; + menuItems.push( processClicked(process)}>{process.iconName ?? "arrow_forward"}{process.label}); + } + + if(tableProcesses && tableProcesses.length) + { + pushDividerIfNeeded(menuItems); + } + + tableProcesses.map((process) => + { + menuItems.push( processClicked(process)}>{process.iconName ?? "arrow_forward"}{process.label}); + }); + + if(menuItems.length === 0) + { + menuItems.push(blockNo actions available) + } + const renderActionsMenu = ( - { - table.capabilities.has(Capability.TABLE_INSERT) && table.insertPermission && - - library_add - Bulk Load - - } - { - table.capabilities.has(Capability.TABLE_UPDATE) && table.editPermission && - - edit - Bulk Edit - - } - { - table.capabilities.has(Capability.TABLE_DELETE) && table.deletePermission && - - delete - Bulk Delete - - } - {((table.capabilities.has(Capability.TABLE_INSERT) && table.insertPermission) || (table.capabilities.has(Capability.TABLE_UPDATE) && table.editPermission) || (table.capabilities.has(Capability.TABLE_DELETE) && table.deletePermission)) && tableProcesses.length > 0 && } - {tableProcesses.map((process) => ( - processClicked(process)}> - {process.iconName ?? "arrow_forward"} - {process.label} - - ))} - { - tableProcesses.length == 0 && !(table.capabilities.has(Capability.TABLE_INSERT) && table.insertPermission) && !(table.capabilities.has(Capability.TABLE_UPDATE) && table.editPermission) && !(table.capabilities.has(Capability.TABLE_DELETE) && table.deletePermission) && - - block - No actions available - - } + {menuItems} ); @@ -1326,10 +1347,10 @@ function RecordQuery({table, launchProcess}: Props): JSX.Element { - activeModalProcess && + activeModalProcess && tableMetaData && closeModalProcess(event, reason)}>
- +
}