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()
+ }
+ if(table.capabilities.has(Capability.TABLE_UPDATE) && table.editPermission)
+ {
+ menuItems.push()
+ }
+ if(table.capabilities.has(Capability.TABLE_DELETE) && table.deletePermission)
+ {
+ menuItems.push()
+ }
+
+ const runRecordScriptProcess = metaData?.processes.get("runRecordScript");
+ if(runRecordScriptProcess)
+ {
+ const process = runRecordScriptProcess;
+ menuItems.push();
+ }
+
+ if(tableProcesses && tableProcesses.length)
+ {
+ pushDividerIfNeeded(menuItems);
+ }
+
+ tableProcesses.map((process) =>
+ {
+ menuItems.push();
+ });
+
+ if(menuItems.length === 0)
+ {
+ menuItems.push()
+ }
+
const renderActionsMenu = (
);
@@ -1326,10 +1347,10 @@ function RecordQuery({table, launchProcess}: Props): JSX.Element
{
- activeModalProcess &&
+ activeModalProcess && tableMetaData &&
closeModalProcess(event, reason)}>
}